r52827 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r52826‎ | r52827 | r52828 >
Date:03:57, 7 July 2009
Author:rarohde
Status:deferred
Tags:
Comment:
New Extension - DelayedDefinition: Adds tags <define> and <display> that can be used to display a segment of wikicode at a different place in the same page from where it is initially specified.
Modified paths:
  • /trunk/extensions/DelayedDefinition (added) (history)
  • /trunk/extensions/DelayedDefinition/COPYING (added) (history)
  • /trunk/extensions/DelayedDefinition/DelayedDefinition.i18n.php (added) (history)
  • /trunk/extensions/DelayedDefinition/DelayedDefinition.php (added) (history)
  • /trunk/extensions/DelayedDefinition/DelayedDefinition_body.php (added) (history)

Diff [purge]

Index: trunk/extensions/DelayedDefinition/DelayedDefinition_body.php
@@ -0,0 +1,174 @@
 2+<?php
 3+
 4+class ExtDelayedDefinition {
 5+ var $mCache, $mTransTable;
 6+ var $mMarkerHead;
 7+ var $mMarkerTail;
 8+ var $mParser;
 9+
 10+ // Resets state, called when parser clears state.
 11+ function clearState() {
 12+ $this->mCache = array();
 13+ $this->mTransTable = array();
 14+
 15+ $salt = dechex( mt_rand() );
 16+ $this->mMarkerHead = "\x7fDELAY-DEF-" . $salt . "-";
 17+ $this->mMarkerTail = "-DEF-DELAY\x7f";
 18+
 19+ $this->mParser = NULL;
 20+
 21+ return true;
 22+ }
 23+
 24+ // Initialize hooks and tags
 25+ function ExtDelayedDefinition() {
 26+ global $wgParser, $wgHooks;
 27+
 28+ $wgParser->setHook( 'define', array( &$this, 'define' ) );
 29+ $wgParser->setHook( 'display', array( &$this, 'display' ) );
 30+
 31+ $wgHooks['ParserClearState'][] = array( &$this, 'clearState' );
 32+ $wgHooks['ParserAfterTidy'][] = array( &$this, 'replaceMarkers' );
 33+
 34+ $this->clearState();
 35+ }
 36+
 37+ /**
 38+ * Parses the <define> block into HTML
 39+ *
 40+ * THIS IS A GIANT, CRAPPY HACK!
 41+ * FIXME: This function makes a recursive call to Parser::parse.
 42+ *
 43+ * Currently (Mediawiki 1.16), there are no Parser hooks that allow this to work
 44+ * without the ugly hack, and Parser::recursiveTagParse only runs the
 45+ * Parser::internalParse branch of the parser engine. In addition, tag extensions
 46+ * are limited to returning HTML, so partial parsing is not acceptable here.
 47+ *
 48+ * A reasonable fix here would seem to require multiple additions to the current Parser.
 49+ *
 50+ * Please note that since the hack being used here is outside the scope of intended
 51+ * use for Parser::parse, it is unclear if it will work correctly in all cases, and
 52+ * future versions of Mediawiki may break this behavior.
 53+ **/
 54+ function parse( $text ) {
 55+ global $wgParser;
 56+
 57+ $opt =& $wgParser->getOptions();
 58+ $orig = $opt->getIsSectionPreview();
 59+
 60+ // Avoids problems associated with parsing a partial page.
 61+ $opt->setIsSectionPreview( true );
 62+
 63+ // Call parse while duplicating the current parameters and forcing
 64+ // clearState to be false.
 65+ $out = $wgParser->parse( $text, $wgParser->getTitle(), $opt,
 66+ false, false, $wgParser->getRevisionId() )->getText();
 67+
 68+ $opt->setIsSectionPreview( $orig );
 69+
 70+ // Remove extraneous encoding created by the parser.
 71+ $out = preg_replace( "/<!--.*-->/Us", "", $out );
 72+ return trim( $out );
 73+ }
 74+
 75+ // Tag callback for <define>.
 76+ function define( $input, $argv, &$parser ) {
 77+ if ( !array_key_exists( 'name', $argv ) ) {
 78+ // name argument is missing.
 79+ return '<strong class="error">' . wfMsgForContent( "delaydef-error-no-name" ) . '</strong>';
 80+ }
 81+
 82+ $key = $this->findKey( $argv['name'] );
 83+ if ( array_key_exists( $key, $this->mCache ) ) {
 84+ // Attempt to redefine the same name twice.
 85+ return '<strong class="error">' .
 86+ wfMsgForContent( "delaydef-error-redef", $argv['name'] ) .
 87+ '</strong>';
 88+ }
 89+
 90+ $this->mCache[$key] = $this->parse( $input );
 91+
 92+ // Use a blank placeholder, otherwise MW may use consecutive
 93+ // newlines to generate unintended paragraph breaks.
 94+ return $this->mMarkerHead . "blank" . $this->mMarkerTail;
 95+ }
 96+
 97+ // Tag callback for <display>.
 98+ function display( $input, $argv, &$parser ) {
 99+ if ( !array_key_exists( 'name', $argv ) ) {
 100+ // name argument is missing
 101+ return '<strong class="error">' . wfMsgForContent( "delaydef-error-no-name" ) . '</strong>';
 102+ } elseif ( $input !== NULL ) {
 103+ /* if <display name="foo"> BAR </display> is used
 104+ * then treat this as both the definition of "foo"
 105+ * and as a display request.
 106+ */
 107+ $out = $this->define( $input, $argv, $parser );
 108+ if ( $out !== '' ) {
 109+ // Passes errors to user.
 110+ return $out;
 111+ }
 112+ }
 113+
 114+ return $this->getMarker( $argv['name'] );
 115+ }
 116+
 117+ // Generate unique markers for DelayedDefinion, replaced by replaceMarkers
 118+ // after page is fully parsed.
 119+ function getMarker( $name ) {
 120+ $key = $this->findKey( $name );
 121+
 122+ return $this->mMarkerHead . $key . $this->mMarkerTail;
 123+ }
 124+
 125+ // Translate names into unique numeric keys.
 126+ function findKey( $name ) {
 127+ if ( !array_key_exists( $name, $this->mTransTable ) ) {
 128+ $this->mTransTable[$name] = count( $this->mTransTable );
 129+ }
 130+ return $this->mTransTable[$name];
 131+ }
 132+
 133+ // Replace the unique markers with actual content.
 134+ // Called by the hook ParserAfterTidy.
 135+ function replaceMarkers( &$parser, &$text ) {
 136+ // Replace display markers with content.
 137+ foreach ( $this->mCache as $key => $content ) {
 138+ $marker = $this->mMarkerHead . $key . $this->mMarkerTail;
 139+ $text = str_replace( $marker, $content, $text );
 140+ }
 141+
 142+ // Strip the blank marker.
 143+ $marker = $this->mMarkerHead . "blank" . $this->mMarkerTail;
 144+ $text = str_replace( $marker, "", $text );
 145+
 146+
 147+ // On section preview, kill extra markers. Assumed to be defined on the
 148+ // rest of the page.
 149+ if ( $parser->getOptions()->getIsSectionPreview() ) {
 150+ $regex = "/" . $this->mMarkerHead . "\d+" . $this->mMarkerTail . "/";
 151+ $text = preg_replace( $regex, "", $text );
 152+
 153+ return true;
 154+ }
 155+
 156+ // Find display markers with no matching define and replace them with
 157+ // an error message.
 158+
 159+ $regex = "/" . $this->mMarkerHead . "(\d+)" . $this->mMarkerTail . "/";
 160+ $matches = array();
 161+
 162+ preg_match_all( $regex, $text, $matches );
 163+ $rev = array_flip( $this->mTransTable );
 164+
 165+ foreach ( $matches[0] as $k => $v ) {
 166+ $key = $matches[1][$k];
 167+ $missing = '<strong class="error">' .
 168+ wfMsgForContent( 'delaydef-error-missing-def', $rev[intval( $key )] ) .
 169+ '</strong>';
 170+ $text = str_replace( $v, $missing, $text );
 171+ }
 172+
 173+ return true;
 174+ }
 175+}
Property changes on: trunk/extensions/DelayedDefinition/DelayedDefinition_body.php
___________________________________________________________________
Name: svn:eol-style
1176 + native
Index: trunk/extensions/DelayedDefinition/DelayedDefinition.i18n.php
@@ -0,0 +1,21 @@
 2+<?php
 3+/**
 4+ * Internationalisation file for extension DelayedDefinition.
 5+ *
 6+ * @addtogroup Extensions
 7+**/
 8+
 9+$messages = array();
 10+
 11+$messages['en'] = array(
 12+ 'delaydef_desc' => 'Adds &lt;define&gt; and &lt;display&gt; to allow for code to be repositioned',
 13+ 'delaydef-error-missing-def' => 'Error: Definition needed for &lt;display name="$1"&gt; not found.',
 14+ 'delaydef-error-no-name' => 'Error: No name parameter specified.',
 15+ 'delaydef-error-redef' => 'Error: Attempted redefinition of $1.',
 16+);
 17+
 18+/** Message documentation (Message documentation)
 19+ */
 20+$messages['qqq'] = array(
 21+ 'delaydef_desc' => 'Short description of the DelayedDefinition extension, shown on [[Special:Version]].',
 22+);
Property changes on: trunk/extensions/DelayedDefinition/DelayedDefinition.i18n.php
___________________________________________________________________
Name: svn:eol-style
123 + native
Index: trunk/extensions/DelayedDefinition/DelayedDefinition.php
@@ -0,0 +1,37 @@
 2+<?php
 3+
 4+if ( !defined( 'MEDIAWIKI' ) ) {
 5+ die( 'This file is a MediaWiki extension, it is not a valid entry point' );
 6+}
 7+
 8+/**
 9+ * This tag extension creates <define> and <display> tags that can be used to display
 10+ * wikicode somewhere in the same page other than where it is initially defined.
 11+ *
 12+ * See http://www.mediawiki.org/wiki/Extension:DelayedDefinition for details.
 13+**/
 14+
 15+if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {
 16+ $wgHooks['ParserFirstCallInit'][] = 'wfDelayedDefinition';
 17+} else {
 18+ $wgExtensionFunctions[] = 'wfDelayedDefinition';
 19+}
 20+
 21+$wgExtensionCredits['parserhook'][] = array(
 22+ 'path' => __FILE__,
 23+ 'name' => 'DelayedDefinition',
 24+ 'version' => '0.5.0',
 25+ 'url' => 'http://www.mediawiki.org/wiki/Extension:DelayedDefinition',
 26+ 'author' => 'Robert Rohde',
 27+ 'description' => 'Allow for wikicode to be defined separately from where it is displayed',
 28+ 'descriptionmsg' => 'delaydef_desc',
 29+);
 30+
 31+$wgAutoloadClasses['ExtDelayedDefinition'] = dirname( __FILE__ ) . '/DelayedDefinition_body.php';
 32+$wgExtensionMessagesFiles['DelayedDefinition'] = dirname( __FILE__ ) . '/DelayedDefinition.i18n.php';
 33+
 34+// Load the classes, which then attaches the parser hooks, etc.
 35+function wfDelayedDefinition() {
 36+ new ExtDelayedDefinition;
 37+ return true;
 38+}
Property changes on: trunk/extensions/DelayedDefinition/DelayedDefinition.php
___________________________________________________________________
Name: svn:eol-style
139 + native
Index: trunk/extensions/DelayedDefinition/COPYING
@@ -0,0 +1,284 @@
 2+The DelayedDefinition extension may be copied and redistributed under the GNU
 3+General Public License.
 4+
 5+-------------------------------------------------------------------------------
 6+
 7+ GNU GENERAL PUBLIC LICENSE
 8+ Version 2, June 1991
 9+
 10+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 11+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 12+ Everyone is permitted to copy and distribute verbatim copies
 13+ of this license document, but changing it is not allowed.
 14+
 15+ Preamble
 16+
 17+ The licenses for most software are designed to take away your
 18+freedom to share and change it. By contrast, the GNU General Public
 19+License is intended to guarantee your freedom to share and change free
 20+software--to make sure the software is free for all its users. This
 21+General Public License applies to most of the Free Software
 22+Foundation's software and to any other program whose authors commit to
 23+using it. (Some other Free Software Foundation software is covered by
 24+the GNU Lesser General Public License instead.) You can apply it to
 25+your programs, too.
 26+
 27+ When we speak of free software, we are referring to freedom, not
 28+price. Our General Public Licenses are designed to make sure that you
 29+have the freedom to distribute copies of free software (and charge for
 30+this service if you wish), that you receive source code or can get it
 31+if you want it, that you can change the software or use pieces of it
 32+in new free programs; and that you know you can do these things.
 33+
 34+ To protect your rights, we need to make restrictions that forbid
 35+anyone to deny you these rights or to ask you to surrender the rights.
 36+These restrictions translate to certain responsibilities for you if you
 37+distribute copies of the software, or if you modify it.
 38+
 39+ For example, if you distribute copies of such a program, whether
 40+gratis or for a fee, you must give the recipients all the rights that
 41+you have. You must make sure that they, too, receive or can get the
 42+source code. And you must show them these terms so they know their
 43+rights.
 44+
 45+ We protect your rights with two steps: (1) copyright the software, and
 46+(2) offer you this license which gives you legal permission to copy,
 47+distribute and/or modify the software.
 48+
 49+ Also, for each author's protection and ours, we want to make certain
 50+that everyone understands that there is no warranty for this free
 51+software. If the software is modified by someone else and passed on, we
 52+want its recipients to know that what they have is not the original, so
 53+that any problems introduced by others will not reflect on the original
 54+authors' reputations.
 55+
 56+ Finally, any free program is threatened constantly by software
 57+patents. We wish to avoid the danger that redistributors of a free
 58+program will individually obtain patent licenses, in effect making the
 59+program proprietary. To prevent this, we have made it clear that any
 60+patent must be licensed for everyone's free use or not licensed at all.
 61+
 62+ The precise terms and conditions for copying, distribution and
 63+modification follow.
 64+
 65+ GNU GENERAL PUBLIC LICENSE
 66+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 67+
 68+ 0. This License applies to any program or other work which contains
 69+a notice placed by the copyright holder saying it may be distributed
 70+under the terms of this General Public License. The "Program", below,
 71+refers to any such program or work, and a "work based on the Program"
 72+means either the Program or any derivative work under copyright law:
 73+that is to say, a work containing the Program or a portion of it,
 74+either verbatim or with modifications and/or translated into another
 75+language. (Hereinafter, translation is included without limitation in
 76+the term "modification".) Each licensee is addressed as "you".
 77+
 78+Activities other than copying, distribution and modification are not
 79+covered by this License; they are outside its scope. The act of
 80+running the Program is not restricted, and the output from the Program
 81+is covered only if its contents constitute a work based on the
 82+Program (independent of having been made by running the Program).
 83+Whether that is true depends on what the Program does.
 84+
 85+ 1. You may copy and distribute verbatim copies of the Program's
 86+source code as you receive it, in any medium, provided that you
 87+conspicuously and appropriately publish on each copy an appropriate
 88+copyright notice and disclaimer of warranty; keep intact all the
 89+notices that refer to this License and to the absence of any warranty;
 90+and give any other recipients of the Program a copy of this License
 91+along with the Program.
 92+
 93+You may charge a fee for the physical act of transferring a copy, and
 94+you may at your option offer warranty protection in exchange for a fee.
 95+
 96+ 2. You may modify your copy or copies of the Program or any portion
 97+of it, thus forming a work based on the Program, and copy and
 98+distribute such modifications or work under the terms of Section 1
 99+above, provided that you also meet all of these conditions:
 100+
 101+ a) You must cause the modified files to carry prominent notices
 102+ stating that you changed the files and the date of any change.
 103+
 104+ b) You must cause any work that you distribute or publish, that in
 105+ whole or in part contains or is derived from the Program or any
 106+ part thereof, to be licensed as a whole at no charge to all third
 107+ parties under the terms of this License.
 108+
 109+ c) If the modified program normally reads commands interactively
 110+ when run, you must cause it, when started running for such
 111+ interactive use in the most ordinary way, to print or display an
 112+ announcement including an appropriate copyright notice and a
 113+ notice that there is no warranty (or else, saying that you provide
 114+ a warranty) and that users may redistribute the program under
 115+ these conditions, and telling the user how to view a copy of this
 116+ License. (Exception: if the Program itself is interactive but
 117+ does not normally print such an announcement, your work based on
 118+ the Program is not required to print an announcement.)
 119+
 120+These requirements apply to the modified work as a whole. If
 121+identifiable sections of that work are not derived from the Program,
 122+and can be reasonably considered independent and separate works in
 123+themselves, then this License, and its terms, do not apply to those
 124+sections when you distribute them as separate works. But when you
 125+distribute the same sections as part of a whole which is a work based
 126+on the Program, the distribution of the whole must be on the terms of
 127+this License, whose permissions for other licensees extend to the
 128+entire whole, and thus to each and every part regardless of who wrote it.
 129+
 130+Thus, it is not the intent of this section to claim rights or contest
 131+your rights to work written entirely by you; rather, the intent is to
 132+exercise the right to control the distribution of derivative or
 133+collective works based on the Program.
 134+
 135+In addition, mere aggregation of another work not based on the Program
 136+with the Program (or with a work based on the Program) on a volume of
 137+a storage or distribution medium does not bring the other work under
 138+the scope of this License.
 139+
 140+ 3. You may copy and distribute the Program (or a work based on it,
 141+under Section 2) in object code or executable form under the terms of
 142+Sections 1 and 2 above provided that you also do one of the following:
 143+
 144+ a) Accompany it with the complete corresponding machine-readable
 145+ source code, which must be distributed under the terms of Sections
 146+ 1 and 2 above on a medium customarily used for software interchange; or,
 147+
 148+ b) Accompany it with a written offer, valid for at least three
 149+ years, to give any third party, for a charge no more than your
 150+ cost of physically performing source distribution, a complete
 151+ machine-readable copy of the corresponding source code, to be
 152+ distributed under the terms of Sections 1 and 2 above on a medium
 153+ customarily used for software interchange; or,
 154+
 155+ c) Accompany it with the information you received as to the offer
 156+ to distribute corresponding source code. (This alternative is
 157+ allowed only for noncommercial distribution and only if you
 158+ received the program in object code or executable form with such
 159+ an offer, in accord with Subsection b above.)
 160+
 161+The source code for a work means the preferred form of the work for
 162+making modifications to it. For an executable work, complete source
 163+code means all the source code for all modules it contains, plus any
 164+associated interface definition files, plus the scripts used to
 165+control compilation and installation of the executable. However, as a
 166+special exception, the source code distributed need not include
 167+anything that is normally distributed (in either source or binary
 168+form) with the major components (compiler, kernel, and so on) of the
 169+operating system on which the executable runs, unless that component
 170+itself accompanies the executable.
 171+
 172+If distribution of executable or object code is made by offering
 173+access to copy from a designated place, then offering equivalent
 174+access to copy the source code from the same place counts as
 175+distribution of the source code, even though third parties are not
 176+compelled to copy the source along with the object code.
 177+
 178+ 4. You may not copy, modify, sublicense, or distribute the Program
 179+except as expressly provided under this License. Any attempt
 180+otherwise to copy, modify, sublicense or distribute the Program is
 181+void, and will automatically terminate your rights under this License.
 182+However, parties who have received copies, or rights, from you under
 183+this License will not have their licenses terminated so long as such
 184+parties remain in full compliance.
 185+
 186+ 5. You are not required to accept this License, since you have not
 187+signed it. However, nothing else grants you permission to modify or
 188+distribute the Program or its derivative works. These actions are
 189+prohibited by law if you do not accept this License. Therefore, by
 190+modifying or distributing the Program (or any work based on the
 191+Program), you indicate your acceptance of this License to do so, and
 192+all its terms and conditions for copying, distributing or modifying
 193+the Program or works based on it.
 194+
 195+ 6. Each time you redistribute the Program (or any work based on the
 196+Program), the recipient automatically receives a license from the
 197+original licensor to copy, distribute or modify the Program subject to
 198+these terms and conditions. You may not impose any further
 199+restrictions on the recipients' exercise of the rights granted herein.
 200+You are not responsible for enforcing compliance by third parties to
 201+this License.
 202+
 203+ 7. If, as a consequence of a court judgment or allegation of patent
 204+infringement or for any other reason (not limited to patent issues),
 205+conditions are imposed on you (whether by court order, agreement or
 206+otherwise) that contradict the conditions of this License, they do not
 207+excuse you from the conditions of this License. If you cannot
 208+distribute so as to satisfy simultaneously your obligations under this
 209+License and any other pertinent obligations, then as a consequence you
 210+may not distribute the Program at all. For example, if a patent
 211+license would not permit royalty-free redistribution of the Program by
 212+all those who receive copies directly or indirectly through you, then
 213+the only way you could satisfy both it and this License would be to
 214+refrain entirely from distribution of the Program.
 215+
 216+If any portion of this section is held invalid or unenforceable under
 217+any particular circumstance, the balance of the section is intended to
 218+apply and the section as a whole is intended to apply in other
 219+circumstances.
 220+
 221+It is not the purpose of this section to induce you to infringe any
 222+patents or other property right claims or to contest validity of any
 223+such claims; this section has the sole purpose of protecting the
 224+integrity of the free software distribution system, which is
 225+implemented by public license practices. Many people have made
 226+generous contributions to the wide range of software distributed
 227+through that system in reliance on consistent application of that
 228+system; it is up to the author/donor to decide if he or she is willing
 229+to distribute software through any other system and a licensee cannot
 230+impose that choice.
 231+
 232+This section is intended to make thoroughly clear what is believed to
 233+be a consequence of the rest of this License.
 234+
 235+ 8. If the distribution and/or use of the Program is restricted in
 236+certain countries either by patents or by copyrighted interfaces, the
 237+original copyright holder who places the Program under this License
 238+may add an explicit geographical distribution limitation excluding
 239+those countries, so that distribution is permitted only in or among
 240+countries not thus excluded. In such case, this License incorporates
 241+the limitation as if written in the body of this License.
 242+
 243+ 9. The Free Software Foundation may publish revised and/or new versions
 244+of the General Public License from time to time. Such new versions will
 245+be similar in spirit to the present version, but may differ in detail to
 246+address new problems or concerns.
 247+
 248+Each version is given a distinguishing version number. If the Program
 249+specifies a version number of this License which applies to it and "any
 250+later version", you have the option of following the terms and conditions
 251+either of that version or of any later version published by the Free
 252+Software Foundation. If the Program does not specify a version number of
 253+this License, you may choose any version ever published by the Free Software
 254+Foundation.
 255+
 256+ 10. If you wish to incorporate parts of the Program into other free
 257+programs whose distribution conditions are different, write to the author
 258+to ask for permission. For software which is copyrighted by the Free
 259+Software Foundation, write to the Free Software Foundation; we sometimes
 260+make exceptions for this. Our decision will be guided by the two goals
 261+of preserving the free status of all derivatives of our free software and
 262+of promoting the sharing and reuse of software generally.
 263+
 264+ NO WARRANTY
 265+
 266+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 267+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
 268+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 269+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 270+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 271+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
 272+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
 273+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 274+REPAIR OR CORRECTION.
 275+
 276+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 277+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 278+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 279+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 280+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 281+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 282+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 283+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 284+POSSIBILITY OF SUCH DAMAGES.
 285+

Status & tagging log