<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>Classes/FileResource.h</filename>
    </added>
    <added>
      <filename>Classes/FileResource.m</filename>
    </added>
    <added>
      <filename>Classes/MovableTableViewIndex.h</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -18,7 +18,6 @@
 @property (readonly) LinkItem *rootItems;
 
 - (id)initWithData:(NSData *)data encodingName:(NSString*)encodingName;
-- (id)initWithTOC:(CHMTableOfContent*)toc filterByPredicate:(NSPredicate*)predicate;
 - (LinkItem *)curItem;
 - (LinkItem *)itemForPath:(NSString*)path withStack:(NSMutableArray*)stack;
 - (int)rootChildrenCount;</diff>
      <filename>Classes/CHMTableOfContent.h</filename>
    </modified>
    <modified>
      <diff>@@ -201,20 +201,6 @@ NULL, /* getParameterEntity */
 	return self;
 }
 
-- (id)initWithTOC:(CHMTableOfContent*)toc filterByPredicate:(NSPredicate*)predicate
-{
-	rootItems = [[LinkItem alloc] initWithName:@&quot;root&quot;	Path:@&quot;/&quot;];
-	NSMutableArray *children = [rootItems children];
-	if (toc)
-	{
-		LinkItem * items = [toc rootItems];
-		NSArray *src_children = [items children];
-		NSArray *results = [src_children filteredArrayUsingPredicate:predicate];
-		[children addObjectsFromArray:results];
-	}
-	return self;
-}
-
 - (void) dealloc
 {
 	[rootItems release];</diff>
      <filename>Classes/CHMTableOfContent.m</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,7 @@
 
 @class AsyncSocket;
 @class HTTPServer;
+@class FileResource;
 @protocol HTTPResponse;
 
 
@@ -18,19 +19,31 @@
 	HTTPServer *server;
 	
 	CFHTTPMessageRef request;
+	NSMutableDictionary *params;
+	int bodyReadCount;
+	int bodyLength;
+	NSData *remainBody;
+	NSFileHandle *tmpUploadFileHandle;
+	
 	int numHeaderLines;
+	NSString *requestBoundry;
 	
 	NSString *nonce;
 	int lastNC;
 	
 	NSObject&lt;HTTPResponse&gt; *httpResponse;
 	
+	FileResource *resource;
+	
 	NSMutableArray *ranges;
 	NSMutableArray *ranges_headers;
 	NSString *ranges_boundry;
 	int rangeIndex;
 }
 
+@property (readonly) NSDictionary* params;
+@property (readonly) CFHTTPMessageRef request;
+
 - (id)initWithAsyncSocket:(AsyncSocket *)newSocket forServer:(HTTPServer *)myServer;
 
 - (BOOL)isSecureServer;
@@ -48,11 +61,14 @@
 
 - (NSObject&lt;HTTPResponse&gt; *)httpResponseForURI:(NSString *)path;
 
+- (void)redirectoTo:(NSString*)path;
+
 - (void)handleVersionNotSupported:(NSString *)version;
 - (void)handleAuthenticationFailed;
 - (void)handleResourceNotFound;
 - (void)handleInvalidRequest:(NSData *)data;
 - (void)handleUnknownMethod:(NSString *)method;
+- (void)handleHTTPRequestBody:(NSData*)data tag:(long)tag;
 
 - (NSData *)preprocessResponse:(CFHTTPMessageRef)response;
 - (NSData *)preprocessErrorResponse:(CFHTTPMessageRef)response;</diff>
      <filename>Classes/HTTPConnection.h</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,9 @@
 #import &quot;DDNumber.h&quot;
 #import &quot;DDRange.h&quot;
 #import &quot;DDData.h&quot;
+#import &quot;RegexKitLite.h&quot;
+
+#import &quot;FileResource.h&quot;
 
 
 // Define chunk size used to read files from disk
@@ -24,8 +27,13 @@
 #define LIMIT_MAX_HEADER_LINE_LENGTH  8190
 #define LIMIT_MAX_HEADER_LINES         100
 
+#define BODY_BUFFER_SIZE 8190
+
 // Define the various tags we'll use to differentiate what it is we're currently doing
 #define HTTP_REQUEST                       15
+#define HTTP_REQUEST_BODY				   16
+#define HTTP_REQUEST_BODY_MULTIPART_HEAD   17
+#define HTTP_REQUEST_BODY_MULTIPART		   18
 #define HTTP_PARTIAL_RESPONSE              24
 #define HTTP_PARTIAL_RESPONSE_HEADER       25
 #define HTTP_PARTIAL_RESPONSE_BODY         26
@@ -47,6 +55,9 @@
 @interface HTTPConnection (PrivateAPI)
 - (CFHTTPMessageRef)prepareUniRangeResponse:(UInt64)contentLength;
 - (CFHTTPMessageRef)prepareMultiRangeResponse:(UInt64)contentLength;
+
+- (void)handleMultipartHeader:(NSData*)body;
+- (void)handleMultipartBody:(NSData*)body;
 @end
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -55,6 +66,9 @@
 
 @implementation HTTPConnection
 
+@synthesize params;
+@synthesize request;
+
 static NSMutableArray *recentNonces;
 
 /**
@@ -113,6 +127,15 @@ static NSMutableArray *recentNonces;
 		
 		numHeaderLines = 0;
 		
+		bodyReadCount = 0;
+		bodyLength = 0;
+		remainBody = nil;
+		tmpUploadFileHandle = nil;
+		requestBoundry = nil;
+
+		resource = nil;
+		params = [[NSMutableDictionary alloc] init];
+		
 		// And now that we own the socket, and we have our CFHTTPMessage object (for requests) ready,
 		// we can start reading the HTTP requests...
 		[asyncSocket readDataToData:[AsyncSocket CRLFData]
@@ -133,11 +156,15 @@ static NSMutableArray *recentNonces;
 	[asyncSocket release];
 	
 	if(request) CFRelease(request);
+	if(requestBoundry) [requestBoundry release];
 	
 	[nonce release];
 	
 	[httpResponse release];
 	
+	[resource release];
+	[params release];
+	
 	[ranges release];
 	[ranges_headers release];
 	[ranges_boundry release];
@@ -598,6 +625,14 @@ static NSMutableArray *recentNonces;
 		return;
 	}
 	
+	//Check Resources
+	if ([FileResource canHandle:request])
+	{
+		resource = [[FileResource alloc] initWithConnection:self];
+		[resource handleRequest];
+		return;
+	}
+	
 	// Check HTTP method
 	NSString *method = [(NSString *)CFHTTPMessageCopyRequestMethod(request) autorelease];
     if(![method isEqualToString:@&quot;GET&quot;] &amp;&amp; ![method isEqualToString:@&quot;HEAD&quot;])
@@ -1000,6 +1035,184 @@ static NSMutableArray *recentNonces;
 	CFRelease(response);
 }
 
+/* handle redirection */
+- (void)redirectoTo:(NSString*)path
+{
+	CFHTTPMessageRef response = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 302, NULL, kCFHTTPVersion1_1);
+	NSString *content = [NSString stringWithFormat:@&quot;&lt;html&gt;&lt;body&gt;You are being &lt;a href=\&quot;%@\&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;&quot;, path];
+	NSString *length = [NSString stringWithFormat:@&quot;%d&quot;, [content length]];
+	CFHTTPMessageSetHeaderFieldValue(response, CFSTR(&quot;Content-Length&quot;), (CFStringRef)length);
+	CFHTTPMessageSetHeaderFieldValue(response, CFSTR(&quot;Content-Type&quot;), CFSTR(&quot;text/html; charset=utf-8&quot;));
+	CFHTTPMessageSetHeaderFieldValue(response, CFSTR(&quot;Location&quot;), (CFStringRef)path);	
+	NSData *responseData = (NSData *)CFHTTPMessageCopySerializedMessage(response);
+	[asyncSocket writeData:responseData withTimeout:WRITE_ERROR_TIMEOUT tag:HTTP_FINAL_RESPONSE];
+	
+	CFRelease(response);
+	
+	// Close connection as soon as the error message is sent
+	[asyncSocket disconnectAfterWriting];
+	
+}
+
+/* handle request body */
+- (void)handleHTTPRequestBody:(NSData*)data tag:(long)tag
+{
+	long newTag = HTTP_REQUEST_BODY;
+	
+	if (nil == data)
+	{
+		// init body info
+		NSDictionary* header = (NSDictionary*)CFHTTPMessageCopyAllHeaderFields(request);
+		NSString* contentType = [header objectForKey:@&quot;Content-Type&quot;];
+		if (nil != contentType)
+		{
+			// checkout boundary
+			NSError *error;
+			NSRange searchRange = NSMakeRange(0, [contentType length]);
+			NSRange matchedRange = NSMakeRange(NSNotFound, 0);
+			matchedRange = [contentType rangeOfRegex:@&quot;\\Amultipart/form-data.*boundary=\&quot;?([^\&quot;;,]+)\&quot;?&quot;
+											 options: RKLCaseless
+											 inRange:searchRange
+											 capture:1
+											   error:&amp;error];
+			if (matchedRange.location != NSNotFound)
+			{
+				requestBoundry = [NSString stringWithFormat:@&quot;%@%@&quot;, @&quot;--&quot;, [contentType substringWithRange:matchedRange]];
+				[requestBoundry retain];
+				newTag = HTTP_REQUEST_BODY_MULTIPART_HEAD;
+			}
+		}
+		[header release];
+	}
+	else
+	{
+		switch (tag) {
+			case HTTP_REQUEST_BODY_MULTIPART_HEAD:
+				[self handleMultipartHeader:data];
+				newTag = HTTP_REQUEST_BODY_MULTIPART;
+				break;
+			case HTTP_REQUEST_BODY_MULTIPART:
+				[self handleMultipartBody:data];
+				newTag = HTTP_REQUEST_BODY_MULTIPART;
+			default:
+				break;
+		}
+		bodyReadCount += [data length];
+	}
+	
+	int readLength = BODY_BUFFER_SIZE;
+	int remain = bodyLength - bodyReadCount;
+	if (readLength &gt; remain)
+		readLength = remain;
+	
+	if (readLength &gt; 0)
+		[asyncSocket readDataToLength:readLength withTimeout:READ_TIMEOUT tag:newTag];
+	else
+		[self replyToHTTPRequest];
+}
+
+/* parsing head info for multipart body */
+- (void)handleMultipartHeader:(NSData*)body
+{
+	NSString * EOL = @&quot;\015\012&quot;;
+	// check boundary
+	NSRange range = NSMakeRange(0, [requestBoundry length] + [EOL length]);
+	NSString *bHead = [NSString stringWithUTF8String:(const char *)[[body subdataWithRange:range] bytes]];
+	if (![bHead isEqualToString:[NSString stringWithFormat:@&quot;%@%@&quot;, requestBoundry, EOL]])
+	{
+		NSLog(@&quot;bad content body&quot;);
+		return;
+	}
+	
+	// read head
+	range = NSMakeRange([requestBoundry length] + [EOL length], [body length]- [requestBoundry length] - [EOL length]);
+	const char* bytes = [[body subdataWithRange:range] bytes];
+	int length = range.length;
+	const char* deol = &quot;\015\012\015\012&quot;;
+	const char *headEnd = strstr(bytes, deol);
+	NSString *bodyHeader = [[NSString alloc] initWithBytes:bytes length:(headEnd - bytes) encoding:NSASCIIStringEncoding];
+	NSRange matchedRange = NSMakeRange(NSNotFound, 0);
+	NSRange searchRange = NSMakeRange(0, [bodyHeader length]);
+	NSError *error;
+	matchedRange = [bodyHeader rangeOfRegex:@&quot;Content-Disposition:.* filename=(?:\&quot;((?:\\\\.|[^\\\&quot;])*)\&quot;|([^;]*))&quot;
+									options: RKLCaseless
+									inRange:searchRange
+									capture:1
+									  error:&amp;error];
+	
+	NSString *filename = [bodyHeader substringWithRange:matchedRange];
+	
+	matchedRange = [bodyHeader rangeOfRegex:@&quot;Content-Disposition:.* name=\&quot;?([^\\\&quot;;]*)\&quot;?&quot;
+									options: RKLCaseless
+									inRange:searchRange
+									capture:1
+									  error:&amp;error];
+	NSString *key = [bodyHeader substringWithRange:matchedRange];
+	
+	[params setObject:filename forKey:key];
+	CFUUIDRef theUUID = CFUUIDCreate(NULL);
+	NSString *tmpName = [NSString stringWithFormat:@&quot;%@/%@&quot;, NSTemporaryDirectory(), (NSString *)CFUUIDCreateString(NULL, theUUID)];
+	NSFileManager *fm = [NSFileManager defaultManager];
+	[fm createFileAtPath:tmpName contents:[NSData data] attributes:nil];
+	tmpUploadFileHandle = [NSFileHandle fileHandleForWritingAtPath:tmpName];
+	[tmpUploadFileHandle retain];
+	CFRelease(theUUID);
+	[params setObject:tmpName forKey:@&quot;tmpfilename&quot;];
+	[bodyHeader release];
+	
+	length = length - (headEnd - bytes + strlen(deol));
+	bytes = headEnd + strlen(deol);
+	NSData *fileContent = [NSData dataWithBytesNoCopy:(void*)bytes length:length];
+
+	[self handleMultipartBody:fileContent];
+}
+
+- (void)handleMultipartBody:(NSData*)body
+{
+	if (nil == tmpUploadFileHandle)
+		return;
+	
+	static NSString* deol = @&quot;\015\012&quot;;
+	NSString *terminator = [NSString stringWithFormat:@&quot;%@%@&quot;, deol, requestBoundry];
+	NSMutableData *data = [[NSMutableData alloc] init];
+	if (remainBody)
+		[data appendData:remainBody];
+	[data appendData:body];
+	
+	const char* bytes = [data bytes];
+	const char* cterminator = [terminator UTF8String];
+	const char* candidate = memchr(bytes, '\015', [data length]);
+	const char* contentEnd = NULL;
+	int taillen = [data length] + bytes - candidate;
+	while (candidate &amp;&amp; taillen &gt;= [terminator length]) {
+		contentEnd = strnstr(candidate, cterminator, [terminator length]);
+		if (contentEnd)
+			break;
+		candidate = memchr(candidate+1, '\015', taillen - 1);
+		taillen = [data length] + bytes - candidate;
+	}
+	if (NULL != contentEnd)
+	{
+		NSRange range = NSMakeRange(0, contentEnd - bytes);
+		NSData* content = [data subdataWithRange:range];
+		[tmpUploadFileHandle writeData:content];
+		[tmpUploadFileHandle release];
+		tmpUploadFileHandle = nil;
+	}
+	else
+	{
+		NSRange range = NSMakeRange(0, [data length] - [terminator length]);
+		NSData* content = [data subdataWithRange:range];
+		range = NSMakeRange([data length] - [terminator length], [terminator length]);
+		if (remainBody)
+			[remainBody release];
+		remainBody = [data subdataWithRange:range];
+		[remainBody retain];
+		
+		[tmpUploadFileHandle writeData:content];
+	}	
+}
+
 /**
  * This method is called immediately prior to sending the response headers.
  * This method adds standard header fields, and then converts the response to an NSData object.
@@ -1106,37 +1319,48 @@ static NSMutableArray *recentNonces;
 **/
 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag
 {
-	// Append the header line to the http message
-	BOOL result = CFHTTPMessageAppendBytes(request, [data bytes], [data length]);
-	if(!result)
-	{
-		// We have a received a malformed request
-		[self handleInvalidRequest:data];
-	}
-	else if(!CFHTTPMessageIsHeaderComplete(request))
+	if (!CFHTTPMessageIsHeaderComplete(request))
 	{
-		// We don't have a complete header yet
-		// That is, we haven't yet received a CRLF on a line by itself, indicating the end of the header
-		if(++numHeaderLines &gt; LIMIT_MAX_HEADER_LINES)
+		// Append the header line to the http message
+		BOOL result = CFHTTPMessageAppendBytes(request, [data bytes], [data length]);
+		if(!result)
 		{
-			// Reached the maximum amount of header lines in a single HTTP request
-			// This could be an attempted DOS attack
-			[asyncSocket disconnect];
+			// We have a received a malformed request
+			[self handleInvalidRequest:data];
+		}
+		else if(!CFHTTPMessageIsHeaderComplete(request))
+		{
+			// We don't have a complete header yet
+			// That is, we haven't yet received a CRLF on a line by itself, indicating the end of the header
+			if(++numHeaderLines &gt; LIMIT_MAX_HEADER_LINES)
+			{
+				// Reached the maximum amount of header lines in a single HTTP request
+				// This could be an attempted DOS attack
+				[asyncSocket disconnect];
+			}
+			else
+			{
+				[asyncSocket readDataToData:[AsyncSocket CRLFData]
+								withTimeout:READ_TIMEOUT
+								  maxLength:LIMIT_MAX_HEADER_LINE_LENGTH
+										tag:HTTP_REQUEST];
+			}
 		}
 		else
 		{
-			[asyncSocket readDataToData:[AsyncSocket CRLFData]
-							withTimeout:READ_TIMEOUT
-							  maxLength:LIMIT_MAX_HEADER_LINE_LENGTH
-									tag:HTTP_REQUEST];
+			NSDictionary* header = (NSDictionary*)CFHTTPMessageCopyAllHeaderFields(request);
+			NSString* lenstr = (NSString*)[header objectForKey:@&quot;Content-Length&quot;];
+			if (nil != lenstr)
+			{
+				bodyLength = [lenstr intValue];
+				bodyReadCount = 0;
+			}
+			[self handleHTTPRequestBody:nil tag:tag];
+			[header release];
 		}
 	}
-	else
-	{
-		// We have an entire HTTP request from the client
-		// Now we need to reply to it
-		[self replyToHTTPRequest];
-	}
+	else // handle request body
+		[self handleHTTPRequestBody:data tag:tag];
 }
 
 /**</diff>
      <filename>Classes/HTTPConnection.m</filename>
    </modified>
    <modified>
      <diff>@@ -9,6 +9,28 @@
 #import &quot;IndexController.h&quot;
 #import &quot;CHMBrowserController.h&quot;
 #import &quot;CHMTableOfContent.h&quot;
+#import &quot;MovableTableViewIndex.h&quot;
+
+#pragma mark hack for UITableViewIndex
+static BOOL tableViewIndexMoveIn(id self, SEL _cmd) {
+	UIView *index = (UIView *)self;
+	
+	[UIView beginAnimations:nil context:nil];
+	index.center = CGPointMake(index.center.x - 30, index.center.y);
+	[UIView commitAnimations];
+	
+    return YES;
+}
+
+static BOOL tableViewIndexMoveOut(id self, SEL _cmd) {
+	UIView *index = (UIView *)self;
+	
+	[UIView beginAnimations:nil context:nil];
+	index.center = CGPointMake(index.center.x + 30, index.center.y);
+	[UIView commitAnimations];
+	
+    return YES;
+}
 
 @interface IndexController (Private)
 - (void) moveOutIndexView;
@@ -136,22 +158,18 @@
 - (void) moveOutIndexView
 {
 	for (UIView *view in self.tableView.subviews) {
-		if ( [view isKindOfClass:[UITableViewIndex class]] )
-		{
-			[UIView beginAnimations:nil context:nil];
-			view.center = CGPointMake(view.center.x + 30, view.center.y);
-			[UIView commitAnimations];
+		if ( [view respondsToSelector:@selector(moveIndexOut)] ) {
+			MovableTableViewIndex *index = (MovableTableViewIndex *)view;
+			[index moveIndexOut];
 		}
 	}	
 }
 - (void) moveInIndexView
 {
 	for (UIView *view in self.tableView.subviews) {
-		if ( [view isKindOfClass:[UITableViewIndex class]] )
-		{
-			[UIView beginAnimations:nil context:nil];
-			view.center = CGPointMake(view.center.x - 30, view.center.y);
-			[UIView commitAnimations];
+		if ( [view respondsToSelector:@selector(moveIndexIn)] ) {
+			MovableTableViewIndex *index = (MovableTableViewIndex *)view;
+			[index moveIndexIn];
 		}
 	}
 }</diff>
      <filename>Classes/IndexController.m</filename>
    </modified>
    <modified>
      <diff>@@ -576,7 +576,11 @@ static NSArray *rkl_splitArray(RKLCacheSlot *cacheSlot, id *exception, int32_t *
   id          *splitStrings     = NULL;
 
   if((stackUsed + splitStringsSize) &lt; RKL_STACK_LIMIT) { if((splitStrings = alloca(splitStringsSize)) == NULL) { goto exitNow; } stackUsed += splitStringsSize; }
+#ifdef TARGET_OS_IPHONE
+  else { if((splitStrings = rkl_realloc(&amp;scratchBuffer[1], splitStringsSize, 1)) == NULL) { goto exitNow; } }
+#elif
   else { if((splitStrings = rkl_realloc(&amp;scratchBuffer[1], splitStringsSize, (NSUInteger)NSScannedOption)) == NULL) { goto exitNow; } }
+#endif	
 
 #ifdef __OBJC_GC__ 
   if(rkl_collectingEnabled() == YES) { // I just don't trust the GC system with the faster CF way of doing things...  It never seems to work quite the way you expect it to.</diff>
      <filename>Classes/RegexKitLite.m</filename>
    </modified>
    <modified>
      <diff>@@ -153,7 +153,7 @@ typedef unsigned __int64        UInt64;
 /* Sparc        */
 /* MIPS         */
 /* PPC          */
-#elif __i386__ || __sun || __sgi || __ppc__
+#elif __i386__ || __sun || __sgi || __ppc__ || __arm__
 typedef unsigned char           UChar;
 typedef short                   Int16;
 typedef unsigned short          UInt16;</diff>
      <filename>Classes/chm_lib.c</filename>
    </modified>
    <modified>
      <diff>@@ -25,3 +25,6 @@
 - (void) setPreference:(id)pref ForFile:(NSString*)filename;
 @end
 
+// for moving around the UITableViewIndex
+static BOOL tableViewIndexMoveIn(id self, SEL _cmd);
+static BOOL tableViewIndexMoveOut(id self, SEL _cmd);</diff>
      <filename>Classes/iChmAppDelegate.h</filename>
    </modified>
    <modified>
      <diff>@@ -10,6 +10,8 @@
 #import &quot;ITSSProtocol.h&quot;
 #import &quot;RootViewController.h&quot;
 
+#import &lt;objc/runtime.h&gt;
+
 @interface iChmAppDelegate (Private)
 - (void)setupFileList;
 - (void)setupFilePreferences;
@@ -57,6 +59,20 @@ static NSString *filePreferencesIdentity = @&quot;FilePreferences&quot;;
 }
 
 - (void)applicationDidFinishLaunching:(UIApplication *)application {
+	// dynamically add a method to UITableViewIndex that lets us move around the index
+	Class tvi = NSClassFromString(@&quot;UITableViewIndex&quot;);
+	if ( class_addMethod(tvi, @selector(moveIndexIn), (IMP)tableViewIndexMoveIn, &quot;v@:&quot;) ) {
+		NSLog(@&quot;Added method moveIndexIn to UITableViewIndex&quot;);
+	} else {
+		NSLog(@&quot;Error adding method moveIndexIn to UITableViewIndex&quot;);
+	}
+	if ( class_addMethod(tvi, @selector(moveIndexOut), (IMP)tableViewIndexMoveOut, &quot;v@:&quot;) ) {
+		NSLog(@&quot;Added method moveIndexIn to UITableViewIndex&quot;);
+	} else {
+		NSLog(@&quot;Error adding method moveIndexIn to UITableViewIndex&quot;);
+	}
+	
+	//setup protocol
 	[NSURLProtocol registerClass:[ITSSProtocol class]];
 	[self setupFileList];
 	[self setupFilePreferences];
@@ -85,3 +101,25 @@ static NSString *filePreferencesIdentity = @&quot;FilePreferences&quot;;
 }
 
 @end
+
+#pragma mark UITableViewIndex Added Methods
+
+static BOOL tableViewIndexMoveIn(id self, SEL _cmd) {
+	UIView *index = (UIView *)self;
+	
+	[UIView beginAnimations:nil context:nil];
+	index.center = CGPointMake(index.center.x - 30, index.center.y);
+	[UIView commitAnimations];
+	
+    return YES;
+}
+
+static BOOL tableViewIndexMoveOut(id self, SEL _cmd) {
+	UIView *index = (UIView *)self;
+	
+	[UIView beginAnimations:nil context:nil];
+	index.center = CGPointMake(index.center.x + 30, index.center.y);
+	[UIView commitAnimations];
+	
+    return YES;
+}
\ No newline at end of file</diff>
      <filename>Classes/iChmAppDelegate.m</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@
 	&lt;/head&gt;
 
 	&lt;body&gt;
-		&lt;form action=&quot;/file&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
+		&lt;form action=&quot;/files&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
 			&lt;input id=&quot;newfile&quot; name=&quot;newfile&quot; size=&quot;30&quot; type=&quot;file&quot; /&gt;
 			&lt;input name=&quot;commit&quot; type=&quot;submit&quot; value=&quot;&#19978;&#20256;&quot; /&gt;
 		&lt;/form&gt;</diff>
      <filename>English.lproj/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@
 	&lt;key&gt;CFBundleIconFile&lt;/key&gt;
 	&lt;string&gt;&lt;/string&gt;
 	&lt;key&gt;CFBundleIdentifier&lt;/key&gt;
-	&lt;string&gt;com.robinlu.${PRODUCT_NAME:identifier}&lt;/string&gt;
+	&lt;string&gt;com.robinlu.ichm&lt;/string&gt;
 	&lt;key&gt;CFBundleInfoDictionaryVersion&lt;/key&gt;
 	&lt;string&gt;6.0&lt;/string&gt;
 	&lt;key&gt;CFBundleName&lt;/key&gt;</diff>
      <filename>Info.plist</filename>
    </modified>
    <modified>
      <diff>@@ -43,6 +43,7 @@
 		C3EAB82E0E9DDA8300268541 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C3EAB82D0E9DDA8300268541 /* Localizable.strings */; };
 		C3EAB9AE0E9E2F0D00268541 /* IndexController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C3EAB9AD0E9E2F0D00268541 /* IndexController.xib */; };
 		C3EAB9B20E9E2F3300268541 /* IndexController.m in Sources */ = {isa = PBXBuildFile; fileRef = C3EAB9B10E9E2F3300268541 /* IndexController.m */; };
+		C3F11F440EA86E14004B4B46 /* FileResource.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F11F430EA86E14004B4B46 /* FileResource.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -72,6 +73,7 @@
 		28C286E00D94DF7D0034E888 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = &quot;&lt;group&gt;&quot;; };
 		29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = &quot;&lt;group&gt;&quot;; };
 		8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = &quot;&lt;group&gt;&quot;; };
+		C3065E140EADBF5B007A08A6 /* MovableTableViewIndex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MovableTableViewIndex.h; sourceTree = &quot;&lt;group&gt;&quot;; };
 		C3230A8A0E9BB1410011C900 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/TableOfContent.xib; sourceTree = &quot;&lt;group&gt;&quot;; };
 		C3230A8D0E9BB1820011C900 /* TableOfContentController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableOfContentController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
 		C3230A8E0E9BB1820011C900 /* TableOfContentController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableOfContentController.m; sourceTree = &quot;&lt;group&gt;&quot;; };
@@ -119,6 +121,8 @@
 		C3EAB9AB0E9E2F0400268541 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/IndexController.xib; sourceTree = &quot;&lt;group&gt;&quot;; };
 		C3EAB9B00E9E2F3300268541 /* IndexController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IndexController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
 		C3EAB9B10E9E2F3300268541 /* IndexController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IndexController.m; sourceTree = &quot;&lt;group&gt;&quot;; };
+		C3F11F420EA86E14004B4B46 /* FileResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileResource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+		C3F11F430EA86E14004B4B46 /* FileResource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileResource.m; sourceTree = &quot;&lt;group&gt;&quot;; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -149,6 +153,7 @@
 				1D3623250D0F684500981E51 /* iChmAppDelegate.m */,
 				C32D584A0EA39532002D02DC /* FileManagerController.h */,
 				C32D584B0EA39532002D02DC /* FileManagerController.m */,
+				C3065E140EADBF5B007A08A6 /* MovableTableViewIndex.h */,
 			);
 			path = Classes;
 			sourceTree = &quot;&lt;group&gt;&quot;;
@@ -226,6 +231,7 @@
 		C32D57EE0EA38F57002D02DC /* httpserver */ = {
 			isa = PBXGroup;
 			children = (
+				C3F11F8B0EA8872A004B4B46 /* resources */,
 				C32D57EF0EA38F82002D02DC /* AsyncSocket.h */,
 				C32D57F00EA38F82002D02DC /* AsyncSocket.m */,
 				C32D57F10EA38F82002D02DC /* DDData.h */,
@@ -292,6 +298,15 @@
 			name = chm;
 			sourceTree = &quot;&lt;group&gt;&quot;;
 		};
+		C3F11F8B0EA8872A004B4B46 /* resources */ = {
+			isa = PBXGroup;
+			children = (
+				C3F11F420EA86E14004B4B46 /* FileResource.h */,
+				C3F11F430EA86E14004B4B46 /* FileResource.m */,
+			);
+			name = resources;
+			sourceTree = &quot;&lt;group&gt;&quot;;
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -382,6 +397,7 @@
 				C32D58060EA38F83002D02DC /* HTTPServer.m in Sources */,
 				C32D584C0EA39532002D02DC /* FileManagerController.m in Sources */,
 				C3E8820A0EA43DBE00DE82FB /* RegexKitLite.m in Sources */,
+				C3F11F440EA86E14004B4B46 /* FileResource.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -459,6 +475,8 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CODE_SIGN_ENTITLEMENTS = &quot;&quot;;
+				&quot;CODE_SIGN_IDENTITY[sdk=iphoneos*]&quot; = &quot;iPhone Developer: Robin Lu&quot;;
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_OPTIMIZATION_LEVEL = 0;
@@ -467,6 +485,7 @@
 				INFOPLIST_FILE = Info.plist;
 				OTHER_LDFLAGS = &quot;-licucore&quot;;
 				PRODUCT_NAME = iChm;
+				&quot;PROVISIONING_PROFILE[sdk=iphoneos*]&quot; = &quot;B29628F0-B56B-45EB-9E2F-962DBEB3EFFA&quot;;
 			};
 			name = Debug;
 		};
@@ -474,12 +493,15 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CODE_SIGN_ENTITLEMENTS = &quot;&quot;;
+				&quot;CODE_SIGN_IDENTITY[sdk=iphoneos*]&quot; = &quot;iPhone Developer: Robin Lu&quot;;
 				COPY_PHASE_STRIP = YES;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = iChm_Prefix.pch;
 				INFOPLIST_FILE = Info.plist;
 				OTHER_LDFLAGS = &quot;-licucore&quot;;
 				PRODUCT_NAME = iChm;
+				&quot;PROVISIONING_PROFILE[sdk=iphoneos*]&quot; = &quot;B29628F0-B56B-45EB-9E2F-962DBEB3EFFA&quot;;
 			};
 			name = Release;
 		};</diff>
      <filename>iChm.xcodeproj/project.pbxproj</filename>
    </modified>
    <modified>
      <diff>@@ -5,4 +5,4 @@
 #ifdef __OBJC__
     #import &lt;Foundation/Foundation.h&gt;
     #import &lt;UIKit/UIKit.h&gt;
-#endif
+#endif
\ No newline at end of file</diff>
      <filename>iChm_Prefix.pch</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>47bb3305abcfb7482e1cfb92f6e73234502d0f43</id>
    </parent>
  </parents>
  <author>
    <name>Robin Lu</name>
    <email>iamawalrus@gmail.com</email>
  </author>
  <url>http://github.com/robin/ichm-m/commit/ae794150fc1c93d40e94fe88470bbf812aef5635</url>
  <id>ae794150fc1c93d40e94fe88470bbf812aef5635</id>
  <committed-date>2008-10-24T01:01:47-07:00</committed-date>
  <authored-date>2008-10-24T01:01:47-07:00</authored-date>
  <message>support file upload</message>
  <tree>81ff8fde908dcd552ee75069f35ff507175ddd91</tree>
  <committer>
    <name>Robin Lu</name>
    <email>iamawalrus@gmail.com</email>
  </committer>
</commit>
