cerberus 0.6 → 0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Authors.txt +4 -0
- data/Changelog.txt +11 -0
- data/Copyright.txt +16 -0
- data/Rakefile +16 -25
- data/Readme.markdown +1 -3
- data/bin/cerberus +5 -0
- data/lib/cerberus/builder/bjam.rb +1 -3
- data/lib/cerberus/builder/maven2.rb +0 -1
- data/lib/cerberus/builder/rake.rb +1 -1
- data/lib/cerberus/builder/rspec.rb +0 -1
- data/lib/cerberus/builder/ruby_base.rb +0 -1
- data/lib/cerberus/component_lazy_loader.rb +6 -2
- data/lib/cerberus/config.example.yml +1 -0
- data/lib/cerberus/constants.rb +2 -2
- data/lib/cerberus/manager.rb +7 -1
- data/lib/cerberus/publisher/mail.rb +4 -4
- data/lib/cerberus/publisher/twitter.rb +0 -1
- data/lib/cerberus/scm/base.rb +19 -0
- data/lib/cerberus/scm/bzr.rb +62 -0
- data/lib/cerberus/scm/cvs.rb +2 -7
- data/lib/cerberus/scm/darcs.rb +2 -11
- data/lib/cerberus/scm/git.rb +6 -14
- data/lib/cerberus/scm/perforce.rb +4 -4
- data/lib/cerberus/scm/svn.rb +2 -7
- data/lib/cerberus/utils.rb +5 -0
- data/lib/vendor/irc/README +23 -0
- data/lib/vendor/irc/lib/IRC.rb +164 -0
- data/lib/vendor/irc/lib/IRCChannel.rb +33 -0
- data/lib/vendor/irc/lib/IRCConnection.rb +134 -0
- data/lib/vendor/irc/lib/IRCEvent.rb +91 -0
- data/lib/vendor/irc/lib/IRCUser.rb +23 -0
- data/lib/vendor/irc/lib/IRCUtil.rb +49 -0
- data/lib/vendor/irc/lib/eventmap.yml +247 -0
- data/lib/vendor/twitter/CHANGES +129 -0
- data/lib/vendor/twitter/MIT-LICENSE +20 -0
- data/lib/vendor/twitter/README +37 -0
- data/lib/vendor/twitter/TODO +7 -0
- data/lib/vendor/twitter/lib/twitter.rb +34 -0
- data/lib/vendor/twitter/lib/twitter/client.rb +24 -0
- data/lib/vendor/twitter/lib/twitter/client/account.rb +24 -0
- data/lib/vendor/twitter/lib/twitter/client/auth.rb +27 -0
- data/lib/vendor/twitter/lib/twitter/client/base.rb +93 -0
- data/lib/vendor/twitter/lib/twitter/client/blocks.rb +35 -0
- data/lib/vendor/twitter/lib/twitter/client/favorites.rb +53 -0
- data/lib/vendor/twitter/lib/twitter/client/friendship.rb +35 -0
- data/lib/vendor/twitter/lib/twitter/client/graph.rb +37 -0
- data/lib/vendor/twitter/lib/twitter/client/messaging.rb +79 -0
- data/lib/vendor/twitter/lib/twitter/client/profile.rb +29 -0
- data/lib/vendor/twitter/lib/twitter/client/search.rb +27 -0
- data/lib/vendor/twitter/lib/twitter/client/status.rb +51 -0
- data/lib/vendor/twitter/lib/twitter/client/timeline.rb +72 -0
- data/lib/vendor/twitter/lib/twitter/client/user.rb +65 -0
- data/lib/vendor/twitter/lib/twitter/config.rb +77 -0
- data/lib/vendor/twitter/lib/twitter/console.rb +31 -0
- data/lib/vendor/twitter/lib/twitter/core.rb +137 -0
- data/lib/vendor/twitter/lib/twitter/ext.rb +2 -0
- data/lib/vendor/twitter/lib/twitter/ext/stdlib.rb +52 -0
- data/lib/vendor/twitter/lib/twitter/extras.rb +39 -0
- data/lib/vendor/twitter/lib/twitter/meta.rb +56 -0
- data/lib/vendor/twitter/lib/twitter/model.rb +360 -0
- data/lib/vendor/twitter/lib/twitter/version.rb +19 -0
- data/lib/vendor/twitter/spec/twitter/client/account_spec.rb +28 -0
- data/lib/vendor/twitter/spec/twitter/client/auth_spec.rb +34 -0
- data/lib/vendor/twitter/spec/twitter/client/base_spec.rb +242 -0
- data/lib/vendor/twitter/spec/twitter/client/blocks_spec.rb +76 -0
- data/lib/vendor/twitter/spec/twitter/client/favorites_spec.rb +183 -0
- data/lib/vendor/twitter/spec/twitter/client/friendship_spec.rb +76 -0
- data/lib/vendor/twitter/spec/twitter/client/graph_spec.rb +67 -0
- data/lib/vendor/twitter/spec/twitter/client/messaging_spec.rb +135 -0
- data/lib/vendor/twitter/spec/twitter/client/profile_spec.rb +91 -0
- data/lib/vendor/twitter/spec/twitter/client/search_spec.rb +68 -0
- data/lib/vendor/twitter/spec/twitter/client/status_spec.rb +119 -0
- data/lib/vendor/twitter/spec/twitter/client/timeline_spec.rb +79 -0
- data/lib/vendor/twitter/spec/twitter/client/user_spec.rb +203 -0
- data/lib/vendor/twitter/spec/twitter/client_spec.rb +2 -0
- data/lib/vendor/twitter/spec/twitter/config_spec.rb +86 -0
- data/lib/vendor/twitter/spec/twitter/console_spec.rb +15 -0
- data/lib/vendor/twitter/spec/twitter/core_spec.rb +127 -0
- data/lib/vendor/twitter/spec/twitter/ext/stdlib_spec.rb +59 -0
- data/lib/vendor/twitter/spec/twitter/extras_spec.rb +46 -0
- data/lib/vendor/twitter/spec/twitter/meta_spec.rb +90 -0
- data/lib/vendor/twitter/spec/twitter/model_spec.rb +508 -0
- data/lib/vendor/twitter/spec/twitter/version_spec.rb +19 -0
- data/lib/vendor/xmpp4r/CHANGELOG +83 -0
- data/lib/vendor/xmpp4r/COPYING +340 -0
- data/lib/vendor/xmpp4r/LICENSE +59 -0
- data/lib/vendor/xmpp4r/README.rdoc +110 -0
- data/lib/vendor/xmpp4r/README_ruby19.txt +43 -0
- data/lib/vendor/xmpp4r/Rakefile +262 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/client.rb +70 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/component.rb +11 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/register.rb +42 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r.rb +116 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/base64.rb +32 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams.rb +15 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/target.rb +47 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +73 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +62 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/callbacks.rb +124 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps.rb +1 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps/c.rb +53 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps/helper/generator.rb +160 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps/helper/helper.rb +87 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/client.rb +317 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/command/helper/responder.rb +53 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/command/iq/command.rb +154 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/component.rb +103 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/connection.rb +219 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/dataforms.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/dataforms/x/data.rb +297 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/debuglog.rb +42 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/delay.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/delay/x/delay.rb +99 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery.rb +7 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/helper/responder.rb +165 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/errors.rb +281 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/feature_negotiation.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/framework/base.rb +55 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/framework/bot.rb +148 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/httpbinding.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/httpbinding/client.rb +285 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/idgenerator.rb +37 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/iq.rb +221 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/jid.rb +167 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/message.rb +148 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc.rb +14 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/item.rb +143 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/muc.rb +70 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/presence.rb +232 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub.rb +8 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/event.rb +49 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/item.rb +35 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/items.rb +44 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/publish.rb +24 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/nodebrowser.rb +130 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/servicehelper.rb +417 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/query.rb +15 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rexmladdons.rb +151 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster.rb +7 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster/helper/roster.rb +519 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster/iq/roster.rb +215 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster/x/roster.rb +138 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc.rb +2 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/client.rb +123 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/server.rb +74 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/sasl.rb +237 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/semaphore.rb +38 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/stream.rb +497 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/streamparser.rb +77 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/tune.rb +2 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/tune/helper/helper.rb +58 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/tune/tune.rb +113 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/vcard.rb +6 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version.rb +7 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version/helper/responder.rb +72 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version/iq/version.rb +105 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/x.rb +37 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xhtml.rb +1 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xhtml/html.rb +115 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xmpp4r.rb +18 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xmppelement.rb +168 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xmppstanza.rb +162 -0
- data/lib/vendor/xmpp4r/setup.rb +1586 -0
- data/lib/vendor/xmpp4r/test/bytestreams/tc_ibb.rb +186 -0
- data/lib/vendor/xmpp4r/test/bytestreams/tc_socks5bytestreams.rb +113 -0
- data/lib/vendor/xmpp4r/test/caps/tc_helper.rb +156 -0
- data/lib/vendor/xmpp4r/test/dataforms/tc_data.rb +81 -0
- data/lib/vendor/xmpp4r/test/delay/tc_xdelay.rb +51 -0
- data/lib/vendor/xmpp4r/test/discovery/tc_responder.rb +91 -0
- data/lib/vendor/xmpp4r/test/lib/assert_equal_xml.rb +14 -0
- data/lib/vendor/xmpp4r/test/lib/clienttester.rb +120 -0
- data/lib/vendor/xmpp4r/test/muc/tc_muc_mucclient.rb +830 -0
- data/lib/vendor/xmpp4r/test/muc/tc_muc_simplemucclient.rb +114 -0
- data/lib/vendor/xmpp4r/test/muc/tc_mucowner.rb +50 -0
- data/lib/vendor/xmpp4r/test/pubsub/tc_helper.rb +662 -0
- data/lib/vendor/xmpp4r/test/pubsub/tc_nodeconfig.rb +54 -0
- data/lib/vendor/xmpp4r/test/pubsub/tc_subscriptionconfig.rb +41 -0
- data/lib/vendor/xmpp4r/test/roster/tc_helper.rb +514 -0
- data/lib/vendor/xmpp4r/test/roster/tc_iqqueryroster.rb +173 -0
- data/lib/vendor/xmpp4r/test/roster/tc_xroster.rb +73 -0
- data/lib/vendor/xmpp4r/test/rpc/tc_helper.rb +96 -0
- data/lib/vendor/xmpp4r/test/tc_callbacks.rb +129 -0
- data/lib/vendor/xmpp4r/test/tc_class_names.rb +146 -0
- data/lib/vendor/xmpp4r/test/tc_client.rb +30 -0
- data/lib/vendor/xmpp4r/test/tc_errors.rb +146 -0
- data/lib/vendor/xmpp4r/test/tc_idgenerator.rb +30 -0
- data/lib/vendor/xmpp4r/test/tc_iq.rb +113 -0
- data/lib/vendor/xmpp4r/test/tc_iqquery.rb +31 -0
- data/lib/vendor/xmpp4r/test/tc_jid.rb +204 -0
- data/lib/vendor/xmpp4r/test/tc_message.rb +116 -0
- data/lib/vendor/xmpp4r/test/tc_presence.rb +150 -0
- data/lib/vendor/xmpp4r/test/tc_rexml.rb +139 -0
- data/lib/vendor/xmpp4r/test/tc_stream.rb +229 -0
- data/lib/vendor/xmpp4r/test/tc_streamComponent.rb +95 -0
- data/lib/vendor/xmpp4r/test/tc_streamError.rb +131 -0
- data/lib/vendor/xmpp4r/test/tc_streamSend.rb +59 -0
- data/lib/vendor/xmpp4r/test/tc_streamparser.rb +112 -0
- data/lib/vendor/xmpp4r/test/tc_xmppstanza.rb +135 -0
- data/lib/vendor/xmpp4r/test/ts_xmpp4r.rb +53 -0
- data/lib/vendor/xmpp4r/test/tune/tc_helper_recv.rb +84 -0
- data/lib/vendor/xmpp4r/test/tune/tc_helper_send.rb +74 -0
- data/lib/vendor/xmpp4r/test/tune/tc_tune.rb +79 -0
- data/lib/vendor/xmpp4r/test/vcard/tc_helper.rb +49 -0
- data/lib/vendor/xmpp4r/test/vcard/tc_iqvcard.rb +62 -0
- data/lib/vendor/xmpp4r/test/version/tc_helper.rb +60 -0
- data/lib/vendor/xmpp4r/test/version/tc_iqqueryversion.rb +97 -0
- data/lib/vendor/xmpp4r/test/xhtml/tc_html.rb +41 -0
- data/lib/vendor/xmpp4r/tools/gen_requires.bash +31 -0
- data/lib/vendor/xmpp4r/tools/xmpp4r-gemspec-test.rb +11 -0
- data/lib/vendor/xmpp4r/xmpp4r.gemspec +291 -0
- data/test/jabber_publisher_test.rb +1 -1
- data/test/mail_publisher_test.rb +2 -2
- data/test/mock/twitter.rb +0 -1
- data/test/rspec_builder_test.rb +39 -2
- data/test/rss_publisher_test.rb +1 -1
- data/test/twitter_publisher_test.rb +1 -1
- metadata +268 -53
- data/lib/cerberus/publisher/gmailer.rb +0 -17
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
module Jabber
|
|
6
|
+
module Bytestreams
|
|
7
|
+
NS_BYTESTREAMS = 'http://jabber.org/protocol/bytestreams'
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Class for accessing <query/> elements with
|
|
11
|
+
# xmlns='http://jabber.org/protocol/bytestreams'
|
|
12
|
+
# in <iq/> stanzas.
|
|
13
|
+
class IqQueryBytestreams < IqQuery
|
|
14
|
+
name_xmlns 'query', NS_BYTESTREAMS
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# Initialize such a <query/>
|
|
18
|
+
# sid:: [String] Session-ID
|
|
19
|
+
# mode:: [Symbol] :tcp or :udp
|
|
20
|
+
def initialize(sid=nil, mode=nil)
|
|
21
|
+
super()
|
|
22
|
+
self.sid = sid
|
|
23
|
+
self.mode = mode
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Session-ID
|
|
28
|
+
def sid
|
|
29
|
+
attributes['sid']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# Set Session-ID
|
|
34
|
+
def sid=(s)
|
|
35
|
+
attributes['sid'] = s
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Transfer mode
|
|
40
|
+
# result:: :tcp or :udp
|
|
41
|
+
def mode
|
|
42
|
+
case attributes['mode']
|
|
43
|
+
when 'udp' then :udp
|
|
44
|
+
else :tcp
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# Set the transfer mode
|
|
50
|
+
# m:: :tcp or :udp
|
|
51
|
+
def mode=(m)
|
|
52
|
+
case m
|
|
53
|
+
when :udp then attributes['mode'] = 'udp'
|
|
54
|
+
else attributes['mode'] = 'tcp'
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# Get the <streamhost-used/> child
|
|
60
|
+
# result:: [StreamHostUsed]
|
|
61
|
+
def streamhost_used
|
|
62
|
+
first_element('streamhost-used')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
##
|
|
66
|
+
# Get the text of the <activate/> child
|
|
67
|
+
# result:: [JID] or [nil]
|
|
68
|
+
def activate
|
|
69
|
+
j = first_element_text('activate')
|
|
70
|
+
j ? JID.new(j) : nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# Set the text of the <activate/> child
|
|
75
|
+
# s:: [JID]
|
|
76
|
+
def activate=(s)
|
|
77
|
+
replace_element_text('activate', s ? s.to_s : nil)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# <streamhost/> element, normally appear
|
|
84
|
+
# as children of IqQueryBytestreams
|
|
85
|
+
class StreamHost < XMPPElement
|
|
86
|
+
name_xmlns 'streamhost', NS_BYTESTREAMS
|
|
87
|
+
|
|
88
|
+
##
|
|
89
|
+
# Initialize a <streamhost/> element
|
|
90
|
+
# jid:: [JID]
|
|
91
|
+
# host:: [String] Hostname or IP address
|
|
92
|
+
# port:: [Fixnum] Port number
|
|
93
|
+
def initialize(jid=nil, host=nil, port=nil)
|
|
94
|
+
super()
|
|
95
|
+
self.jid = jid
|
|
96
|
+
self.host = host
|
|
97
|
+
self.port = port
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
##
|
|
101
|
+
# Get the JID of the streamhost
|
|
102
|
+
def jid
|
|
103
|
+
(a = attributes['jid']) ? JID.new(a) : nil
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
##
|
|
107
|
+
# Set the JID of the streamhost
|
|
108
|
+
def jid=(j)
|
|
109
|
+
attributes['jid'] = (j ? j.to_s : nil)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# Get the host address of the streamhost
|
|
114
|
+
def host
|
|
115
|
+
attributes['host']
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Set the host address of the streamhost
|
|
120
|
+
def host=(h)
|
|
121
|
+
attributes['host'] = h
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
##
|
|
125
|
+
# Get the zeroconf attribute of the streamhost
|
|
126
|
+
def zeroconf
|
|
127
|
+
attributes['zeroconf']
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
##
|
|
131
|
+
# Set the zeroconf attribute of the streamhost
|
|
132
|
+
def zeroconf=(s)
|
|
133
|
+
attributes['zeroconf'] = s
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
##
|
|
137
|
+
# Get the port number of the streamhost
|
|
138
|
+
def port
|
|
139
|
+
p = attributes['port'].to_i
|
|
140
|
+
(p == 0 ? nil : p)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
##
|
|
144
|
+
# Set the port number of the streamhost
|
|
145
|
+
def port=(p)
|
|
146
|
+
attributes['port'] = p.to_s
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
##
|
|
151
|
+
# <streamhost-used/> element, normally appears
|
|
152
|
+
# as child of IqQueryBytestreams
|
|
153
|
+
class StreamHostUsed < XMPPElement
|
|
154
|
+
name_xmlns 'streamhost-used', NS_BYTESTREAMS
|
|
155
|
+
|
|
156
|
+
def initialize(jid=nil)
|
|
157
|
+
super()
|
|
158
|
+
self.jid = jid
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def jid
|
|
162
|
+
(a = attributes['jid']) ? JID.new(a) : nil
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def jid=(j)
|
|
166
|
+
attributes['jid'] = (j ? j.to_s : nil)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'time' # For Time#xmlschema
|
|
6
|
+
|
|
7
|
+
require 'xmpp4r/feature_negotiation/iq/feature'
|
|
8
|
+
|
|
9
|
+
module Jabber
|
|
10
|
+
module Bytestreams
|
|
11
|
+
PROFILE_FILETRANSFER = 'http://jabber.org/protocol/si/profile/file-transfer'
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Iq child 'si' for Stream-Initiation
|
|
15
|
+
class IqSi < XMPPElement
|
|
16
|
+
name_xmlns 'si', 'http://jabber.org/protocol/si'
|
|
17
|
+
force_xmlns true
|
|
18
|
+
|
|
19
|
+
def initialize(id=nil, profile=nil, mime_type=nil)
|
|
20
|
+
super()
|
|
21
|
+
|
|
22
|
+
self.id = id
|
|
23
|
+
self.profile = profile
|
|
24
|
+
self.mime_type = mime_type
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# Session ID of this stream
|
|
29
|
+
def id
|
|
30
|
+
attributes['id']
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Set Session ID of this stream
|
|
35
|
+
def id=(s)
|
|
36
|
+
attributes['id'] = s
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
##
|
|
40
|
+
# MIME type of this stream
|
|
41
|
+
def mime_type
|
|
42
|
+
attributes['mime-type']
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
##
|
|
46
|
+
# Set MIME type of this stream
|
|
47
|
+
def mime_type=(s)
|
|
48
|
+
attributes['mime-type'] = s
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
##
|
|
52
|
+
# Stream profile, can indicate file-transfer
|
|
53
|
+
def profile
|
|
54
|
+
attributes['profile']
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Set stream profile
|
|
59
|
+
def profile=(s)
|
|
60
|
+
attributes['profile'] = s
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# <file/> child
|
|
65
|
+
# result:: [IqSiFile]
|
|
66
|
+
def file
|
|
67
|
+
first_element('file')
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# <feature/> child
|
|
72
|
+
# result:: [IqFeature]
|
|
73
|
+
def feature
|
|
74
|
+
first_element('feature')
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
# File-transfer meta-information,
|
|
81
|
+
# may appear as <file/> in IqSi
|
|
82
|
+
class IqSiFile < XMPPElement
|
|
83
|
+
name_xmlns 'file', PROFILE_FILETRANSFER
|
|
84
|
+
|
|
85
|
+
def initialize(fname=nil, size=nil)
|
|
86
|
+
super()
|
|
87
|
+
self.fname = fname
|
|
88
|
+
self.size = size
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# Get filename (attribute 'name')
|
|
93
|
+
def fname
|
|
94
|
+
attributes['name']
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
##
|
|
98
|
+
# Set filename (attribute 'name')
|
|
99
|
+
def fname=(s)
|
|
100
|
+
attributes['name'] = s
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
# Get MD5 hash
|
|
105
|
+
def hash
|
|
106
|
+
attributes['hash']
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
##
|
|
110
|
+
# Set MD5 hash
|
|
111
|
+
def hash=(s)
|
|
112
|
+
attributes['hash'] = s
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
##
|
|
116
|
+
# Get file date
|
|
117
|
+
# result:: [Time] or nil
|
|
118
|
+
def date
|
|
119
|
+
begin
|
|
120
|
+
Time.xmlschema(attributes['date'])
|
|
121
|
+
rescue ArgumentError
|
|
122
|
+
nil
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
##
|
|
127
|
+
# Set file date
|
|
128
|
+
# d:: [Time] or nil
|
|
129
|
+
def date=(d)
|
|
130
|
+
attributes['date'] = (d ? d.xmlschema : nil)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
##
|
|
134
|
+
# File size in bytes
|
|
135
|
+
# result:: [Fixnum]
|
|
136
|
+
def size
|
|
137
|
+
(attributes['size'] =~ /^\d+$/) ? attributes['size'].to_i : nil
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
##
|
|
141
|
+
# Set file size
|
|
142
|
+
def size=(s)
|
|
143
|
+
attributes['size'] = s ? s.to_s : nil
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
##
|
|
147
|
+
# File description
|
|
148
|
+
def description
|
|
149
|
+
first_element_text('desc')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
##
|
|
153
|
+
# Set file description
|
|
154
|
+
def description=(s)
|
|
155
|
+
replace_element_text('desc', s)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
##
|
|
159
|
+
# <range/> child
|
|
160
|
+
#
|
|
161
|
+
# A file-transfer offer may contain this with
|
|
162
|
+
# no attributes set, indicating the ability to
|
|
163
|
+
# do ranged transfers.
|
|
164
|
+
# result:: [IqSiFileRange]
|
|
165
|
+
def range
|
|
166
|
+
first_element('range')
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
##
|
|
171
|
+
# Information for ranged transfers
|
|
172
|
+
class IqSiFileRange < XMPPElement
|
|
173
|
+
name_xmlns 'range', PROFILE_FILETRANSFER
|
|
174
|
+
def initialize(offset=nil, length=nil)
|
|
175
|
+
super()
|
|
176
|
+
|
|
177
|
+
self.offset = offset
|
|
178
|
+
self.length = length
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
##
|
|
182
|
+
# File offset (for continuing an interrupted transfer)
|
|
183
|
+
def offset
|
|
184
|
+
(attributes['offset'] =~ /^\d+$/) ? attributes['offset'].to_i : nil
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
##
|
|
188
|
+
# Set file offset
|
|
189
|
+
def offset=(o)
|
|
190
|
+
attributes['offset'] = (o ? o.to_s : nil)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
##
|
|
194
|
+
# File length (if not to transfer whole file)
|
|
195
|
+
def length
|
|
196
|
+
(attributes['length'] =~ /^\d+$/) ? attributes['length'].to_i : nil
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
##
|
|
200
|
+
# Set file length
|
|
201
|
+
def length=(o)
|
|
202
|
+
attributes['length'] = (o ? o.to_s : nil)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
module Jabber
|
|
6
|
+
##
|
|
7
|
+
# This class manages a list of callbacks.
|
|
8
|
+
#
|
|
9
|
+
# ==Callbacks management and priority
|
|
10
|
+
#
|
|
11
|
+
# Callbacks are managed by the class CallbackList. When they are added, a
|
|
12
|
+
# priority (just a number or anything Comparable with other priorities) is
|
|
13
|
+
# specified. The biggest the priority is, the earliest the callback will be
|
|
14
|
+
# considered.
|
|
15
|
+
#
|
|
16
|
+
# Callbacks are processed for a given set of objects as long as they return
|
|
17
|
+
# false. If you want to stop processing, you must return true. Example :
|
|
18
|
+
# cbl = CallbackList.new
|
|
19
|
+
# c1 = false
|
|
20
|
+
# c2 = false
|
|
21
|
+
# c3 = false
|
|
22
|
+
# cbl.add(10) { c1 = true; 1 }
|
|
23
|
+
# cbl.add(5) { c2 = true; true }
|
|
24
|
+
# cbl.add(0) { c3 = true }
|
|
25
|
+
# cbl.process('aa')
|
|
26
|
+
# puts "#{c1} #{c2} #{c3}"
|
|
27
|
+
# This example would display "true true false" as callbacks processing was
|
|
28
|
+
# stopped after the second callback returned true.
|
|
29
|
+
#
|
|
30
|
+
# In XMPP4R, callbacks' priorities are quite normalized since we want to be
|
|
31
|
+
# able to "cascade" callbacks in a clean way. Here are values your code should
|
|
32
|
+
# take into account :
|
|
33
|
+
#
|
|
34
|
+
# >= 200:: logging & debugging callbacks. Those callbacks should not consume
|
|
35
|
+
# elements.
|
|
36
|
+
# 100-199:: Where Helpers register their callbacks. The normal value is 100,
|
|
37
|
+
# and Helpers shouldn't register something else unless there's a
|
|
38
|
+
# very good reason to.
|
|
39
|
+
# < 100:: all those numbers are normally available for your application.
|
|
40
|
+
# That's enough, don't you think ?
|
|
41
|
+
class CallbackList
|
|
42
|
+
|
|
43
|
+
# Create a new list of callbacks
|
|
44
|
+
def initialize
|
|
45
|
+
@list = []
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# Add a callback to the list
|
|
50
|
+
#
|
|
51
|
+
# List will be sorted afterwards
|
|
52
|
+
#
|
|
53
|
+
# prio:: [Integer] the callback's priority, the higher, the sooner.
|
|
54
|
+
# ref:: [String] the callback's reference
|
|
55
|
+
# block:: [Block] a block to execute
|
|
56
|
+
# return:: [Jabber::CallbackList] The list, for chaining
|
|
57
|
+
def add(prio = 0, ref = nil, proc = nil, &block)
|
|
58
|
+
block = proc if proc
|
|
59
|
+
@list.push(Callback.new(prio, ref, block))
|
|
60
|
+
@list.sort! { |a, b| b.priority <=> a.priority }
|
|
61
|
+
self
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# Delete a callback by reference
|
|
66
|
+
# ref:: [String] the reference of the callback to delete
|
|
67
|
+
# return:: [CallBackList] The list, for chaining
|
|
68
|
+
def delete(ref)
|
|
69
|
+
@list.delete_if { |item| item.ref == ref }
|
|
70
|
+
self
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# Number of elements in the list
|
|
75
|
+
# return:: [Integer] The number of elements
|
|
76
|
+
def length
|
|
77
|
+
@list.length
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
# Process an element through all my callbacks. returns e.consumed?
|
|
82
|
+
# e:: [Object] The elements to pass to the callback. You can pass
|
|
83
|
+
# several, but of course, you block must know how to handle them.
|
|
84
|
+
# return:: [Boolean] true if the element has been consumed
|
|
85
|
+
def process(*e)
|
|
86
|
+
# If somebody adds a new callback the list will get modified
|
|
87
|
+
# and sorted(!) while still iterating through it. So we use a
|
|
88
|
+
# local copy of @list. Any freshly added callback will receive
|
|
89
|
+
# the next stanzas, not the current.
|
|
90
|
+
list = @list.dup
|
|
91
|
+
|
|
92
|
+
# process through callbacks
|
|
93
|
+
list.each do |item|
|
|
94
|
+
return true if item.block.call(*e) == true
|
|
95
|
+
end
|
|
96
|
+
false
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# This class is used to store callbacks inside CallbackList. See the
|
|
101
|
+
# CallbackList class for more detailed explanations.
|
|
102
|
+
class Callback
|
|
103
|
+
|
|
104
|
+
# The Callback's priority
|
|
105
|
+
attr_reader :priority
|
|
106
|
+
|
|
107
|
+
# The Callback's reference, using for deleting purposes
|
|
108
|
+
attr_reader :ref
|
|
109
|
+
|
|
110
|
+
# The Callback's block to execute
|
|
111
|
+
attr_reader :block
|
|
112
|
+
|
|
113
|
+
##
|
|
114
|
+
# Create a new callback
|
|
115
|
+
# priority:: [Integer] the callback's priority. The higher, the sooner it
|
|
116
|
+
# will be executed
|
|
117
|
+
# ref:: [String] The callback's reference
|
|
118
|
+
def initialize(priority = 0, ref = nil, block = Proc.new {})
|
|
119
|
+
@priority = priority
|
|
120
|
+
@ref = ref
|
|
121
|
+
@block = block
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|