Gestouch: multitouch gesture recognition library for Flash (ActionScript) development.
Find a file
Pavel fljot b445a5cbe7 v0.4
Squashed commit of the following:

commit 1eb3dfa9e1
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Aug 7 17:47:43 2012 +0300

    Bumped version to 0.4

commit 3acafd1dfb
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Aug 7 17:46:53 2012 +0300

    Minor fix for Gesture state machine

    to dispatch STATE_CHANGE even when cycling around CHANGED state

commit 2678e12de8
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Aug 7 17:46:12 2012 +0300

    Add protected from a mistyped event listening

commit a3b618e90a
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Aug 7 17:38:10 2012 +0300

    Move native adapters to extensions package

commit 9c817b7472
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Aug 1 19:41:58 2012 +0300

    Implement touch cancelation handling

commit 7bfb1fae36
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 20 14:52:18 2012 +0300

    Minor type fix

commit 7bacbf087b
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 20 14:49:48 2012 +0300

    Minor changes

commit 7278e863d4
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 20 14:48:52 2012 +0300

    Refactor dirty gestures reset

commit eab6cb4a1c
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 20 14:47:52 2012 +0300

    Remove unnecessary casting

commit 4bdefd12bb
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 13 18:27:20 2012 +0300

    Minor cleanup in LongPressGesture

commit c5f91e6de1
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 13 18:08:07 2012 +0300

    Improve internal algorithm for TapGesture

commit ed2efc1954
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jul 13 16:51:06 2012 +0300

    Improve internal algorithm for SwipeGesture

commit c2125a06e1
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Thu Jul 12 12:46:11 2012 +0300

    Remove unnecessary imports

commit 4a8e6feada
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 11 22:47:55 2012 +0300

    Improve internal algorithm for SwipeGesture

    but still under question

commit 850ed9849f
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 11 13:34:50 2012 +0300

    Change rotation values from degrees to radians

commit 7be7c8c40a
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 11 13:28:43 2012 +0300

    Improve internal algorithm for TransformGesture

commit f8149935db
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Jul 10 17:11:46 2012 +0300

    Improve internal algorithm for ZoomGesture

commit fd55468579
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Jul 10 17:11:30 2012 +0300

    Improve internal algorithm for RotateGesture

commit 0555813e25
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Jul 9 16:47:09 2012 +0300

    Hotfix for gesture state machine validation

commit c2d31b743b
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Thu Jul 5 10:17:53 2012 +0300

    Fix Stage + Starling gestures simultaneous recognition

commit 37f6220eb5
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 23:44:16 2012 +0300

    Changed default PanGesture#maxNumTouchesRequired to uint.MAX_VALUE

commit 2e02b13581
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 23:43:01 2012 +0300

    Improved early failing strategy implementation

    as in iOS UIGestureRecognizers. Also fixes bugs with new validating state machine.

commit 6273cc33e6
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 21:55:34 2012 +0300

    Bumped version to 0.4-beta

commit 00040bb2e2
Merge: 62fa492 963c660
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 21:41:26 2012 +0300

    Merge branch 'refs/heads/features/starling' into develop

commit 963c66024e
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 21:40:55 2012 +0300

    Update README

commit 2d52729f7c
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 21:36:55 2012 +0300

    Update "requireGestureToFail" API implementation

commit 60d9cb6744
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Jul 4 21:34:49 2012 +0300

    Fixed potential bug with registering gesture target

    in case when previous gesture target was GC-ed, but gesture instance was reused to set a new target

commit bbfb3fc34c
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Jul 3 23:23:48 2012 +0300

    Minor performance improvement via "use namespace" access

commit 193332b9d0
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Jul 3 23:12:38 2012 +0300

    Change GestureState to "real" enum

commit 039a7d79f4
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Jul 2 22:33:50 2012 +0300

    Fixed and slightly improved gesture reset

commit 09c35a5d97
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Jul 2 18:29:33 2012 +0300

    Minor tabs and spaces cleanup

commit cdd90d7479
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Jul 2 18:28:30 2012 +0300

    Moved IDisplayListAdapter creating and retrieving logic to Gestouch class

commit 32e9ff979c
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Sun Jul 1 12:57:31 2012 +0300

    Update to always include Stage in hierarchy

    so that gestures registered on Stage will always react on touch

commit d072f6e478
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Sun Jul 1 11:48:10 2012 +0300

    Fix for potential RTE related to "contains" logic

commit 33108a1bc7
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jun 1 13:51:15 2012 +0300

    Changed global system gesture slop to variable

commit 8d870f4e93
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Jun 1 13:49:29 2012 +0300

    Improved event handling autocompletion (for FD)

commit 54cc5d42bd
Merge: e9132fe 62fa492
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed May 30 20:54:47 2012 +0300

    Merge branch 'refs/heads/develop' into features/starling

commit e9132fec9b
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue May 29 17:03:16 2012 +0300

    Massive refactoring of input layer

commit e0a892654d
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue May 29 17:01:54 2012 +0300

    Untyped globalToLocal call fix

commit 0adfac4c5d
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri May 4 14:54:25 2012 +0300

    Fixed touch/mouse event handling condition in StarlingInputAdapter

commit 62fa492d66
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Apr 2 17:17:48 2012 +0300

    Fixed initial offset calculation for PanGesture

commit 696b6367f2
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Apr 2 17:16:48 2012 +0300

    Fixed location for TapGesture

commit 86439e7627
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Sun Mar 18 12:19:43 2012 +0200

    README update for simplified API

commit d1150b2a35
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Sun Mar 18 12:17:01 2012 +0200

    Simplified API for Gesture target

commit 63a5df8761
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Mar 16 01:04:50 2012 +0200

    Bumped version to 0.4-alpha

commit c983ebe32a
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Mar 16 01:03:40 2012 +0200

    Readme quick update for Starling

commit 13dbd61014
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 13 14:05:50 2012 +0200

    starling initial commit

commit e15c7e7318
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 14 18:36:05 2012 +0200

    Bumped version to 0.3.1

    Releasing bunch of fixes

commit ffb8ce1ec3
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 14 18:00:38 2012 +0200

    Proper state changing on calling Gesture#reset()

commit 13231a4708
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 14 17:49:49 2012 +0200

    Fix for LongPressGesture to work correctly with minPressDuration of zero (and the new IDLE state)

commit a449965e39
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 14 17:34:24 2012 +0200

    Fix to output GestureStateEvent#toString() propely

commit bcb3dfb61f
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 14 16:58:39 2012 +0200

    Removed some redundant code

commit 82742a8465
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 14 15:32:51 2012 +0200

    Made Gesture weak-referencing target

commit e14bbd11bb
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Thu Mar 8 13:40:04 2012 +0200

    Input adapters fix to catch events on empty stage

commit 97486ba2fe
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 7 01:12:50 2012 +0200

    Bumped version to 0.3

commit 764ca1522f
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Mar 7 01:05:04 2012 +0200

    Readme updates

commit 2efa95b85c
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 23:28:12 2012 +0200

    Experimental requireGestureToFail API implemented

commit 4e02d4ae63
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 23:27:39 2012 +0200

    Reformat condition

commit 7cdec34be4
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 23:17:23 2012 +0200

    Swipe gesture algorithm rewritten for better recognition and failing

commit 9edcd04878
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 12:00:38 2012 +0200

    Tiny cleanup

commit b922057845
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 01:22:42 2012 +0200

    New gesture for free transformation

    more precise and performant then combination of 3

commit 5f28227c75
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 01:12:46 2012 +0200

    Using custom GestureEvent and TransformGestureEvent from now on

commit 06df91ce04
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 00:52:50 2012 +0200

    Custom GestureEvent and TransformGestureEvent

    because native one have useless phase and stupid constants

commit 398e41f610
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 00:51:25 2012 +0200

    TouchesManager should not clone touches

    because they must persist during touch session. also good for performance.

commit 49b1139b4f
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Mar 6 00:50:34 2012 +0200

    Touch properties update

commit 242966790a
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Sat Mar 3 17:41:29 2012 +0200

    New gesture state

commit 4d5bef0252
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Mar 2 20:33:16 2012 +0200

    Touch properties updates (and corresponding gestures fixes)

commit b56107e059
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Thu Mar 1 23:56:45 2012 +0200

    Minor cleanup for Gesture class

commit 51e8435b2d
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Thu Mar 1 18:12:35 2012 +0200

    Input adapters initialization and disposing

commit 895e662bd5
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Feb 29 22:20:09 2012 +0200

    Minor performance fix for SwipeGesture

commit 3dcc78c267
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Wed Feb 29 13:54:59 2012 +0200

    Added direction for PanGesture

commit 09dc1ddfc4
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Feb 21 20:14:13 2012 +0200

    Touch#time fix (affects SwipeGesture)

commit 0532f4bfbb
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Mon Feb 20 17:43:43 2012 +0200

    Moved some IGesturesManager methods under gestouch_internal namespace

commit 3ba8a3df86
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Feb 17 17:53:15 2012 +0200

    Put back automatic input adapter initialization

commit 6d8b733d51
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Feb 3 15:57:11 2012 +0200

    Moved input logic out to separate classes

commit ad767a4937
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Thu Feb 2 16:57:16 2012 +0200

    Bugfix for mouse/finger release out of stage

commit 47f2f848e4
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Dec 30 18:26:16 2011 +0200

    Optimized event dispatching

commit 3e1b5948b2
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Dec 30 16:47:52 2011 +0200

    Small optimization for PanGesture

commit d950550d16
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Fri Dec 30 03:19:56 2011 +0200

    Catch all the Touch/Mouse events in capture phase

    GesturesManager now captures TOUCH_BEGIN or MOUSE_DOWN from the stage in capture phase to be able to prevent their propagation at the target without affecting the gesture regoznition.

commit 9d9fcd20ba
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Nov 22 10:40:42 2011 +0200

    Fix central point calculation for more precise transformations

commit a036db1aef
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Nov 22 02:54:11 2011 +0200

    Initial commit for the new architecture

commit 9144538e46
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Nov 1 14:10:05 2011 +0200

    Added Gesture#enabled property

commit d3ddb825b5
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Oct 25 15:19:05 2011 +0300

    Fix condition for dispatching GestureTrackingEvent.GESTURE_TRACKING_END

commit fbc4ab7422
Merge: dc489ba e508862
Author: Pavel fljot <pavel.fljot@gmail.com>
Date:   Tue Oct 25 13:47:51 2011 +0300

    Merge branch 'refs/heads/master' into develop
2012-08-07 20:51:17 +03:00
.settings v0.4 2012-08-07 20:51:17 +03:00
libs v0.4 2012-08-07 20:51:17 +03:00
src/org/gestouch v0.4 2012-08-07 20:51:17 +03:00
.gitignore Initial commit 2011-04-29 18:55:49 +03:00
.project Initial commit 2011-04-29 18:55:49 +03:00
build.template.properties Initial commit 2011-04-29 18:55:49 +03:00
build.xml v0.4 2012-08-07 20:51:17 +03:00
LICENSE Initial commit 2011-04-29 18:55:49 +03:00
README.textile v0.4 2012-08-07 20:51:17 +03:00
version.properties v0.4 2012-08-07 20:51:17 +03:00

h1. Gestouch: multitouch gesture recognition library for Flash (ActionScript) development.

Gestouch is a ActionScript (AS3) library that helps you to deal with single- and multitouch gestures for building better NUI (Natural User Interface).


h3. Why? There's already gesture support in Flash/AIR!

Yes, last versions of Flash Player and AIR runtimes have built-in touch and multitouch support, but the gestures support is very poor: only small set of gestures are supported, they depend on OS, they are not customizable in any way, only one can be processed at the same time and, finally, you are forced to use either raw TouchEvents, or gestures (@see http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/ui/Multitouch.html#inputMode).
_Upd:_ With "native way" you also won't get anything out of Stage3D and of custom input like TUIO protocol. 



h3. What Gestouch does in short?

Well basically there's 3 distinctive tasks to solve.
# To provide various input. It can be native MouseEvents, TouchEvents or more complex things like custom input via TUIO protocol for your hand-made installation. So what we get here is Touches (touch points).
# To recognize gesture analyzing touches. Each type of Gesture has it's own inner algorithms that ... 
# To manage gestures conflicts. As multiple gestures may be recognized simultaneously, we need to be able to control whether it's allowed or some of them should not be recognized (fail).

Gestouch solves these 3 tasks.
I was hardly inspired by Apple team, how they solved this (quite recently to my big surprise! I thought they had it right from the beginning) in they Cocoa-touch UIKit framework. Gestouch is very similar in many ways. But I wouldn't call it "direct port" because 1) the whole architecture was implemented based just on conference videos and user documentation 2) flash platform is a different platform with own specialization, needs, etc.
So I want Gestouch to go far beyond that.

Features:
* Pretty neat architecture! Very similar to Apple's UIGestureRecognizers (Cocoa-Touch UIKit)
* Works with any display list hierarchy structures: native DisplayList (pure AS3/Flex/your UI framework), Starling or ND2D (Stage3D) and 3D libs...
* Doesn't require any additional software (may use runtime's build-in touch support)
* Works across all platforms (where Flash Player or AIR run of course) in exactly same way
* Extendable. You can write your own application-specific gestures
* Open-source and free



h3. Current state of the project

v0.3 introduces "new architecture". I'm planning to develop everything in develop branch and merge to master only release versions. Release versions suppose to be pretty stable. As much as I test them on the examples project.
Current plan is to fix possible bugs in v0.3.#, and I really want to introduce Stage3D support in v0.4. So watch both branches.
And I hope people to become giving some real feedback at least.



h3. Getting Started

Like so:
<pre><code>var doubleTap:TapGesture = new TapGesture(myButton);
doubleTap.numTapsRequired = 2;
doubleTap.addEventListener(TapGestureEvent.GESTURE_TAP, onDoubleTap);
...
private function onDoubleTap(event:TapGestureEvent):void
{
	// handle double tap!
}
</code></pre>
or
<pre><code>var freeTransform:TransformGesture = new TransformGesture(myImage);
freeTransform.addEventListener(TransformGestureEvent.GESTURE_TRANSFORM, onFreeTransform);
...
private function onFreeTransform(event:TransformGestureEvent):void
{
	// move, rotate, scale — all at once for better performance!
}
</code></pre>

* Check the "Gestouch Examples":http://github.com/fljot/GestouchExamples project for a quick jump-in
* *+Highly recommended+* to watch videos from Apple WWDC conferences as they explain all the concepts and show more or less real-life examples. @see links below
* "Introduction video":http://www.youtube.com/watch?v=NjkmB8rfQjY - my first video, currently outdated
* TODO: wiki



h3. Advanced usage: Starling, ...

Recent changes made it possible to work with "Starling":http://www.starling-framework.org display list objects as well as any other display list hierarchical structures, e.g. other Stage3D frameworks that have display objects hierarchy like "ND2D":https://github.com/nulldesign/nd2d or even 3D libraries.
In order to use Gestouch with Starling do the following:
<pre><code>starling = new Starling(MyStarlingRootClass, stage);
/* setup & start your Starling instance here */

// Gestouch initialization step 1 of 3:
// Initialize native (default) input adapter. Needed for non-DisplayList usage.
Gestouch.inputAdapter ||= new NativeInputAdapter(stage);

// Gestouch initialization step 2 of 3:
// Register instance of StarlingDisplayListAdapter to be used for objects of type starling.display.DisplayObject.
// What it does: helps to build hierarchy (chain of parents) for any Starling display object and
// acts as a adapter for gesture target to provide strong-typed access to methods like globalToLocal() and contains().
Gestouch.addDisplayListAdapter(starling.display.DisplayObject, new StarlingDisplayListAdapter());

// Gestouch initialization step 3 of 3:
// Initialize and register StarlingTouchHitTester.
// What it does: finds appropriate target for the new touches (uses Starling Stage#hitTest() method)
// What does "-1" mean: priority for this hit-tester. Since Stage3D layer sits behind native DisplayList
// we give it lower priority in the sense of interactivity.
Gestouch.addTouchHitTester(new StarlingTouchHitTester(starling), -1);
// NB! Use Gestouch#removeTouchHitTester() method if you manage multiple Starling instances during
// your application lifetime.
</code></pre>

Now you can register gesture in familiar, exactly same way:
<pre><code>var tap:TapGesture = new TapGesture(starlingSprite);</code></pre>



h3. Roadmap, TODOs

* "Massive gestures" & Clusters. For bigger form-factor multitouch usage, when gestures must be a bit less about separate fingers but rather touch clusters (massive multitouch) 
* -Simulator (for testing multitouch gestures without special devices)- With new architecture it must be relatively easy to create SimulatorInputAdapter
* Chained gestures concept? To transfer touches from one gesture to another. Example: press/hold for circular menu, then drag it around.
* 3-fingers (3D) gestures (two fingers still, one moving)



h3. News

* "Follow me on Twitter":http://twitter.com/fljot for latest updates
* Don't forget about "issues":https://github.com/fljot/Gestouch/issues section as good platform for discussions.



h3. Contribution, Donations

Contribute, share. Found it useful, nothing to add? Hire me for some project.



h3. Links

* "Gestouch Examples":http://github.com/fljot/GestouchExamples

* "Apple WWDC 2011: Making the Most of Multi-Touch on iOS":https://developer.apple.com/videos/wwdc/2011/?id=118
* "Apple WWDC 2010: Simplifying Touch Event Handling with Gesture Recognizers":https://developer.apple.com/videos/wwdc/2010/?id=120
* "Apple WWDC 2010: Advanced Gesture Recognition":https://developer.apple.com/videos/wwdc/2010/?id=121
* "Event Handling Guide for iOS":https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/
* "UIGestureRecognizer Class Reference":https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/

* "TUIO":http://www.tuio.org


h2. License

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.