diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..749bfe9 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,16 @@ +Doxyfile +LICENSE +Makefile +README.pod +examples/Makefile +examples/glib-datatypes.c +examples/glib-datatypes.h +json_samples.tgz +jsonsl.c +jsonsl.h +perf/bench.c +srcutil/genchartables.pl +tests/Makefile +tests/jpr_test.c +tests/json_test.c +tests/unescape.c diff --git a/Makefile b/Makefile index 2a44a83..1bf2897 100644 --- a/Makefile +++ b/Makefile @@ -24,12 +24,8 @@ json_examples_tarball: check: libjsonsl.so share JSONSL_QUIET_TESTS=1 $(MAKE) -C tests -perf/bench: perf/bench.c jsonsl.c - $(CC) $(CFLAGS) -o $@ $^ - -bench: perf/bench - @echo "Running benchmark" - time -p ./perf/bench share/auction 100 +bench: + $(MAKE) -C perf run-benchmarks libjsonsl.so: jsonsl.c $(CC) $(CFLAGS) -shared -fPIC -o $@ $^ @@ -46,9 +42,13 @@ clean: rm -f *.o *.so rm -f -r share rm -f -r *.dSYM - rm -f perf/bench $(MAKE) -C examples clean $(MAKE) -C tests clean + $(MAKE) -C perf clean distclean: clean rm -rf share doc *.out + +dist: + -rm -f jsonsl.tar.gz + xargs < MANIFEST tar czf jsonsl.tar.gz diff --git a/json_samples.tgz b/json_samples.tgz index 164b1a6..3340da0 100644 Binary files a/json_samples.tgz and b/json_samples.tgz differ diff --git a/jsonsl.c b/jsonsl.c index 239e032..34ca28a 100644 --- a/jsonsl.c +++ b/jsonsl.c @@ -3,6 +3,78 @@ #include #include +#ifdef JSONSL_USE_METRICS +#define XMETRICS \ + X(STRINGY_INSIGNIFICANT) \ + X(STRINGY_SLOWPATH) \ + X(ALLOWED_WHITESPACE) \ + X(QUOTE_FASTPATH) \ + X(SPECIAL_FASTPATH) \ + X(SPECIAL_WSPOP) \ + X(SPECIAL_SLOWPATH) \ + X(GENERIC) \ + X(STRUCTURAL_TOKEN) \ + X(SPECIAL_SWITCHFIRST) \ + X(STRINGY_CATCH) \ + X(ESCAPES) \ + X(TOTAL) \ + +struct jsonsl_metrics_st { +#define X(m) \ + unsigned long metric_##m; + XMETRICS +#undef X +}; + +static struct jsonsl_metrics_st GlobalMetrics = { 0 }; + +static unsigned long GenericCounter[0x100] = { 0 }; +static unsigned long StringyCatchCounter[0x100] = { 0 }; + +#define INCR_METRIC(m) \ + GlobalMetrics.metric_##m++; + +#define INCR_GENERIC(c) \ + INCR_METRIC(GENERIC); \ + GenericCounter[c]++; \ + +#define INCR_STRINGY_CATCH(c) \ + INCR_METRIC(STRINGY_CATCH); \ + StringyCatchCounter[c]++; + +JSONSL_API +void jsonsl_dump_global_metrics(void) +{ + int ii; + printf("JSONSL Metrics:\n"); +#define X(m) \ + printf("\t%-30s %20lu (%0.2f%%)\n", #m, GlobalMetrics.metric_##m, \ + (float)((float)(GlobalMetrics.metric_##m/(float)GlobalMetrics.metric_TOTAL)) * 100); + XMETRICS +#undef X + printf("Generic Characters:\n"); + for (ii = 0; ii < 0xff; ii++) { + if (GenericCounter[ii]) { + printf("\t[ %c ] %lu\n", ii, GenericCounter[ii]); + } + } + printf("Weird string loop\n"); + for (ii = 0; ii < 0xff; ii++) { + if (StringyCatchCounter[ii]) { + printf("\t[ %c ] %lu\n", ii, StringyCatchCounter[ii]); + } + } +} + +#else +#define INCR_METRIC(m) +#define INCR_GENERIC(c) +#define INCR_STRINGY_CATCH(c) +JSONSL_API +void jsonsl_dump_global_metrics(void) { } +#endif /* JSONSL_USE_METRICS */ + + /** * This table (predeclared) contains characters which are recognized * non-string values. @@ -25,7 +97,7 @@ static int *Special_Endings; */ static int *Allowed_Whitespace; #define is_allowed_whitespace(c) \ - Allowed_Whitespace[(unsigned int)c & 0xff] + (c == ' ' || Allowed_Whitespace[(unsigned int)c & 0xff]) /** @@ -61,8 +133,9 @@ void jsonsl_reset(jsonsl_t jsn) jsn->in_escape = 0; jsn->expecting = 0; + memset(jsn->stack, 0, (jsn->levels_max * sizeof (struct jsonsl_state_st))); + for (ii = 0; ii < jsn->levels_max; ii++) { - memset(jsn->stack + ii, 0, sizeof(struct jsonsl_state_st)); jsn->stack[ii].level = ii; } } @@ -119,11 +192,7 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) jsn->expecting = 0; \ jsn->tok_last = 0; \ -#define SPECIAL_MAYBE_POP \ - if (state->type == JSONSL_T_SPECIAL) { \ - SPECIAL_POP; \ - } - +#define CUR_CHAR (*(jsonsl_uchar_t*)c) #define CALLBACK(T, action) \ if (jsn->call_##T && \ @@ -148,15 +217,17 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) const jsonsl_uchar_t *c = (jsonsl_uchar_t*)bytes; size_t levels_max = jsn->levels_max; struct jsonsl_state_st *state = jsn->stack + jsn->level; + static int chrt_string_nopass[0x100] = { JSONSL_CHARTABLE_string_nopass }; jsn->base = bytes; for (; nbytes; nbytes--, jsn->pos++, c++) { + INCR_METRIC(TOTAL); /* Special escape handling for some stuff */ if (jsn->in_escape) { jsn->in_escape = 0; - if (!is_allowed_escape(*c)) { + if (!is_allowed_escape(CUR_CHAR)) { INVOKE_ERROR(ESCAPE_INVALID); - } else if (*c == 'u') { + } else if (CUR_CHAR == 'u') { CALLBACK(UESCAPE, UESCAPE); if (jsn->return_UESCAPE) { return; @@ -164,53 +235,60 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) } goto GT_NEXT; } - GT_AGAIN: /** * Several fast-tracks for common cases: */ if (state->type & JSONSL_Tf_STRINGY) { - /** - * For a string we don't care about anything above 0x23 (0x22 == '"') - * and the backslash (0x5c). - * XXX: for some reason GCC does not optimize the (*c >= 0x5d) condition - * very well? + /* check if our character cannot ever change our current string state + * or throw an error */ - if ( ((*c >= 0x23 && *c != '\\') || (*c == 0x20)) && *c ) { + if (!chrt_string_nopass[CUR_CHAR]) { + INCR_METRIC(STRINGY_INSIGNIFICANT); goto GT_NEXT; - } else if (*c == '"') { - /* terminator */ + } else if (CUR_CHAR == '"') { goto GT_QUOTE; - } else if (*c < 0x20) { - /* unescaped whitespace */ + } else if (CUR_CHAR == '\\') { + goto GT_ESCAPE; + } else { INVOKE_ERROR(WEIRD_WHITESPACE); } + INCR_METRIC(STRINGY_SLOWPATH); + } else if (state->type == JSONSL_T_SPECIAL) { - if ( (*c < 0x3a && *c > 0x2f) || is_special_end(*c) == 0) { + if (!is_special_end(CUR_CHAR)) { + INCR_METRIC(SPECIAL_FASTPATH); /* Most common case. Inside a number */ goto GT_NEXT; - } else if (is_allowed_whitespace(*c)) { - /** - * Note how we only check for the whitespace-subset of - * special terminators. This because a 'special terminator' - * can also have dual-purpose (except for whitespace, which - * serves no other function). - */ - SPECIAL_POP; - jsn->expecting = ','; + } + + SPECIAL_POP; + jsn->expecting = ','; + if (is_allowed_whitespace(CUR_CHAR)) { goto GT_NEXT; } /** - * TODO: check for NUL (0x0) etc. + * This works because we have a non-whitespace token + * which is not a special token. If this is a structural + * character then it will be gracefully handled by the + * switch statement. Otherwise it will default to the 'special' + * state again, */ - } else if (is_allowed_whitespace(*c)) { + goto GT_STRUCTURAL_TOKEN; + } else if (is_allowed_whitespace(CUR_CHAR)) { + INCR_METRIC(ALLOWED_WHITESPACE); /* So we're not special. Harmless insignificant whitespace * passthrough */ goto GT_NEXT; + } else if (extract_special(CUR_CHAR)) { + /* not a string, whitespace, or structural token. must be special */ + goto GT_SPECIAL_BEGIN; } - if (*c == '"') { + INCR_GENERIC(CUR_CHAR); + + if (CUR_CHAR == '"') { GT_QUOTE: jsn->can_insert = 0; switch (state->type) { @@ -268,7 +346,9 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) INVOKE_ERROR(STRING_OUTSIDE_CONTAINER); break; } /* switch(state->type) */ - } else if (*c == '\\') { + } else if (CUR_CHAR == '\\') { + GT_ESCAPE: + INCR_METRIC(ESCAPES); /* Escape */ if ( (state->type & JSONSL_Tf_STRINGY) == 0 ) { INVOKE_ERROR(ESCAPE_OUTSIDE_STRING); @@ -278,14 +358,11 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) goto GT_NEXT; } /* " or \ */ - /* ignore string content */ - if (state->type & JSONSL_Tf_STRINGY) { - goto GT_NEXT; - } - - switch (*c) { + GT_STRUCTURAL_TOKEN: + switch (CUR_CHAR) { case ':': - if (jsn->expecting != *c) { + INCR_METRIC(STRUCTURAL_TOKEN); + if (jsn->expecting != CUR_CHAR) { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = ':'; @@ -294,16 +371,14 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) goto GT_NEXT; case ',': + INCR_METRIC(STRUCTURAL_TOKEN); /** * The comma is one of the more generic tokens. * In the context of an OBJECT, the can_insert flag * should never be set, and no other action is * necessary. */ - if (state->type == JSONSL_T_SPECIAL) { - SPECIAL_POP; - jsn->expecting = ','; - } else if (jsn->expecting != *c) { + if (jsn->expecting != CUR_CHAR) { /* make this branch execute only when we haven't manually * just placed the ',' in the expecting register. */ @@ -322,8 +397,10 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) goto GT_NEXT; /* new list or object */ - case '[': + /* hashes are more common */ case '{': + case '[': + INCR_METRIC(STRUCTURAL_TOKEN); if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } @@ -333,14 +410,14 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) STACK_PUSH; /* because the constants match the opening delimiters, we can do this: */ - state->type = *c; + state->type = CUR_CHAR; state->nelem = 0; jsn->can_insert = 1; - if (*c == '{') { + if (CUR_CHAR == '{') { /* If we're a hash, we expect a key first, which is quouted */ jsn->expecting = '"'; } - if (*c == JSONSL_T_OBJECT) { + if (CUR_CHAR == JSONSL_T_OBJECT) { CALLBACK(OBJECT, PUSH); } else { CALLBACK(LIST, PUSH); @@ -351,7 +428,7 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) /* closing of list or object */ case '}': case ']': - SPECIAL_MAYBE_POP; + INCR_METRIC(STRUCTURAL_TOKEN); if (jsn->tok_last == ',' && jsn->options.allow_trailing_comma == 0) { INVOKE_ERROR(TRAILING_COMMA); } @@ -360,7 +437,7 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) jsn->level--; jsn->expecting = ','; jsn->tok_last = 0; - if (*c == ']') { + if (CUR_CHAR == ']') { if (state->type != '[') { INVOKE_ERROR(BRACKET_MISMATCH); } @@ -376,6 +453,7 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) goto GT_NEXT; default: + GT_SPECIAL_BEGIN: /** * Not a string, not a structural token, and not benign whitespace. * Technically we should iterate over the character always, but since @@ -383,15 +461,15 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) * we only check upon entry. */ if (state->type != JSONSL_T_SPECIAL) { - int special_flags = extract_special(*c); + int special_flags = extract_special(CUR_CHAR); if (!special_flags) { /** * Try to do some heuristics here anyway to figure out what kind of * error this is. The 'special' case is a fallback scenario anyway. */ - if (*c == '\0') { + if (CUR_CHAR == '\0') { INVOKE_ERROR(FOUND_NULL_BYTE); - } else if (*c < 0x20) { + } else if (CUR_CHAR < 0x20) { INVOKE_ERROR(WEIRD_WHITESPACE); } else { INVOKE_ERROR(SPECIAL_EXPECTED); diff --git a/jsonsl.h b/jsonsl.h index 77a0d9d..40fb1e3 100644 --- a/jsonsl.h +++ b/jsonsl.h @@ -52,7 +52,7 @@ typedef struct jsonsl_jpr_st* jsonsl_jpr_t; * This flag is true when AND'd against a type whose value * must be in "quoutes" i.e. T_HKEY and T_STRING */ -#define JSONSL_Tf_STRINGY 0x80 +#define JSONSL_Tf_STRINGY 0xffff00 /** * Constant representing the special JSON types. @@ -505,6 +505,13 @@ const char* jsonsl_strerror(jsonsl_error_t err); JSONSL_API const char* jsonsl_strtype(jsonsl_type_t jt); +/** + * Dumps global metrics to the screen. This is a noop unless + * jsonsl was compiled with JSONSL_USE_METRICS + */ +JSONSL_API +void jsonsl_dump_global_metrics(void); + /* This macro just here for editors to do code folding */ #ifndef JSONSL_NO_JPR @@ -747,6 +754,44 @@ size_t jsonsl_util_unescape_ex(const char *in, #endif /* JSONSL_NO_JPR */ +/** + * HERE BE CHARACTER TABLES! + */ +#define JSONSL_CHARTABLE_string_nopass \ +/* 0x00 */ 1 /* */, /* 0x00 */ \ +/* 0x01 */ 1 /* */, /* 0x01 */ \ +/* 0x02 */ 1 /* */, /* 0x02 */ \ +/* 0x03 */ 1 /* */, /* 0x03 */ \ +/* 0x04 */ 1 /* */, /* 0x04 */ \ +/* 0x05 */ 1 /* */, /* 0x05 */ \ +/* 0x06 */ 1 /* */, /* 0x06 */ \ +/* 0x07 */ 1 /* */, /* 0x07 */ \ +/* 0x08 */ 1 /* */, /* 0x08 */ \ +/* 0x09 */ 1 /* */, /* 0x09 */ \ +/* 0x0a */ 1 /* */, /* 0x0a */ \ +/* 0x0b */ 1 /* */, /* 0x0b */ \ +/* 0x0c */ 1 /* */, /* 0x0c */ \ +/* 0x0d */ 1 /* */, /* 0x0d */ \ +/* 0x0e */ 1 /* */, /* 0x0e */ \ +/* 0x0f */ 1 /* */, /* 0x0f */ \ +/* 0x10 */ 1 /* */, /* 0x10 */ \ +/* 0x11 */ 1 /* */, /* 0x11 */ \ +/* 0x12 */ 1 /* */, /* 0x12 */ \ +/* 0x13 */ 1 /* */, /* 0x13 */ \ +/* 0x14 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x21 */ \ +/* 0x22 */ 1 /* <"> */, /* 0x22 */ \ +/* 0x23 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x42 */ \ +/* 0x43 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5b */ \ +/* 0x5c */ 1 /* <\> */, /* 0x5c */ \ +/* 0x5d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x7c */ \ +/* 0x7d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x9c */ \ +/* 0x9d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xbc */ \ +/* 0xbd */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xdc */ \ +/* 0xdd */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xfc */ \ +/* 0xfd */ 0,0 /* 0xfe */ \ + + + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/perf/Makefile b/perf/Makefile new file mode 100644 index 0000000..ccb092b --- /dev/null +++ b/perf/Makefile @@ -0,0 +1,22 @@ +all: bench yajl-perftest + +CFLAGS+= -Wno-overlength-strings -fvisibility=hidden -DNDEBUG -mtune=native +#CFLAGS+=-DJSONSL_USE_METRICS +BENCH_LFLAGS= + +bench: bench.c ../jsonsl.c + $(CC) -o $@ $(CFLAGS) $^ $(BENCH_LFLAGS) + +yajl-perftest: documents.c perftest.c ../jsonsl.c + $(CC) $(CFLAGS) $^ -o $@ $(BENCH_LFLAGS) + +.PHONY: run-benchmarks + +run-benchmarks: bench yajl-perftest + @echo "Running against single file" + ./bench ../share/auction 100 + @echo "Running yajl tests on JSONSL" + ./yajl-perftest + +clean: + -rm -f bench yajl-perftest diff --git a/perf/bench.c b/perf/bench.c index 415747f..967f290 100644 --- a/perf/bench.c +++ b/perf/bench.c @@ -33,5 +33,6 @@ int main(int argc, char **argv) jsonsl_reset(jsn); jsonsl_feed(jsn, buf, sb.st_size); } + jsonsl_dump_global_metrics(); return 0; } diff --git a/perf/documents.c b/perf/documents.c new file mode 100644 index 0000000..3f33f87 --- /dev/null +++ b/perf/documents.c @@ -0,0 +1,1418 @@ +/* + * Copyright (c) 2007-2011, Lloyd Hilaiel + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "documents.h" + +#include +#include + +/* latest twitter tweets from easter day */ +const char * doc1[] = + { +"[{\"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:48 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143455073280000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Good morning! Happy Easter! Hopefully c u later!\",\n" +" \"id\": 62143455073280000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"David\",\n" +" \"profile_sidebar_border_color\": \"C0DEED\",\n" +" \"profile_background_tile\": false,\n" +" \"profile_sidebar_fill_color\": \"DDEEF6\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1313918274\\/image_normal.jpg\",\n" +" \"created_at\": \"Sat Apr 16 12:10:50 +0000 2011\",\n" +" \"location\": null,\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"0084B4\",\n" +" \"id_str\": \"283022296\",\n" +" \"url\": null,\n" +" \"default_profile\": true,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 0,\n" +" \"utc_offset\": null,\n" +" \"id\": 283022296,\n" +" \"listed_count\": 0,\n" +" \"profile_use_background_image\": true,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 7,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"C0DEED\",\n" +" \"geo_enabled\": false,\n" +" \"time_zone\": null,\n" +" \"notifications\": null,\n" +" \"description\": null,\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/a\\/1302724321\\/images\\/themes\\/theme1\\/bg.png\",\n", +" \"statuses_count\": 46,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 28,\n" +" \"show_all_inline_media\": false,\n" +" \"screen_name\": \"djstump440\",\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twitter.com\\/\\\" rel=\\\"nofollow\\\"\\u003ETwitter for iPhone\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:48 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143454767104000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"haloo hihihi -_-\",\n" +" \"id\": 62143454767104000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Riva \\u01aa(\\u02c7\\u25bc\\u02c7)\\u00ac\",\n" +" \"profile_sidebar_border_color\": \"eeeeee\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"efefef\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1323509905\\/cats_normal.jpg\",\n" +" \"created_at\": \"Sat Oct 16 05:07:18 +0000 2010\",\n" +" \"location\": \"\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"009999\",\n" +" \"id_str\": \"203398982\",\n" +" \"url\": null,\n" +" \"default_profile\": false,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 0,\n" +" \"utc_offset\": -28800,\n" +" \"id\": 203398982,\n" +" \"listed_count\": 0,\n", +" \"profile_use_background_image\": true,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 16,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"131516\",\n" +" \"geo_enabled\": false,\n" +" \"time_zone\": \"Pacific Time (US & Canada)\",\n" +" \"notifications\": null,\n" +" \"description\": \"I'm single\\u01aa(\\u02c7\\u25bc\\u02c7)\\u00ac, pin: 26B49EFA , keep follow me\\u01aa(\\u02c7\\u25bc\\u02c7)\\u00ac\\u01aa(\\u02c7\\u25bc\\u02c7)\\u00ac follback? just mention, thanks\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a2.twimg.com\\/profile_background_images\\/238078679\\/5496743274_fb1f9c9bea_z_large.jpg\",\n" +" \"statuses_count\": 899,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 14,\n" +" \"show_all_inline_media\": false,\n" +" \"screen_name\": \"IntaaanRvall\",\n" +" \"following\": null\n" +" },\n" +" \"source\": \"web\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:48 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143452560896000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"\\u3042\\u3042\\u3042\\u3042\\u3042\\u3042\\u3042\\u3001\\u4eca\\u65e5\\u306e\\u30d7\\u30ea\\u30ad\\u30e5\\u30a2\\u30de\\u30b8\\u6700\\u9ad8\\u3060\\u3063\\u305f\\u3002\\u3082\\u3046\\u30c6\\u30f3\\u30b7\\u30e7\\u30f3\\u4e0b\\u304c\\u3089\\u306d\\u30fc\\u3088\\u3002\\u8272\\u3005\\u8a9e\\u308a\\u305f\\u3044\\u3051\\u3069\\u30c4\\u30a4\\u30c3\\u30bf\\u30fc\\u3058\\u3083\\u4f55\\u56de\\u30c4\\u30a4\\u30fc\\u30c8\\u3057\\u305f\\u3089\\u3044\\u3044\\u306e\\uff1f\\u3063\\u3066\\u611f\\u3058\\u3068\\u308a\\u3042\\u3048\\u305a\\u98a8\\u5442\\u5165\\u3063\\u3066\\u982d\\u6574\\u7406\\u3057\\u3066\\u30d0\\u30ec\\u30b9\\u30ec\\uff06\\u30b3\\u30df\\u30e5\\u898b\\u3066\\u305d\\u308c\\u304b\\u3089\\u65e5\\u8a18\\u66f8\\u304f\",\n" +" \"id\": 62143452560896000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n", +" \"name\": \"\\u5929\\u5bae\\u3000\\u5948\\u6f84\",\n" +" \"profile_sidebar_border_color\": \"db5ecc\",\n" +" \"profile_background_tile\": false,\n" +" \"profile_sidebar_fill_color\": \"ffcced\",\n" +" \"profile_image_url\": \"http:\\/\\/a1.twimg.com\\/profile_images\\/1260667542\\/kanon2_normal.jpg\",\n" +" \"created_at\": \"Tue Dec 29 11:35:38 +0000 2009\",\n" +" \"location\": \"\\u8679\\u306e\\u5712\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"5109eb\",\n" +" \"id_str\": \"100203655\",\n" +" \"url\": \"http:\\/\\/pudding-tension.cocolog-nifty.com\\/blog\\/\",\n" +" \"default_profile\": false,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 0,\n" +" \"utc_offset\": 32400,\n" +" \"id\": 100203655,\n" +" \"listed_count\": 3,\n" +" \"profile_use_background_image\": true,\n" +" \"lang\": \"ja\",\n" +" \"protected\": false,\n" +" \"followers_count\": 32,\n" +" \"profile_text_color\": \"372c47\",\n" +" \"profile_background_color\": \"a18eed\",\n" +" \"geo_enabled\": false,\n" +" \"time_zone\": \"Tokyo\",\n" +" \"notifications\": null,\n" +" \"description\": \"\\u73fe\\u5728\\u8133\\u5185\\u306f\\u305d\\u306e\\u6b86\\u3069\\u304c\\u300c\\u30d7\\u30ea\\u30ad\\u30e5\\u30a2\\u300d\\u3068\\u300c\\u3046\\u307f\\u306d\\u3053\\u306e\\u306a\\u304f\\u9803\\u306b\\u300d\\u3068\\u300c\\u795e\\u306e\\u307f\\u305e\\u77e5\\u308b\\u30bb\\u30ab\\u30a4\\u300d\\u3067\\u69cb\\u6210\\u3055\\u308c\\u3066\\u307e\\u3059\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_background_images\\/183152065\\/haikei.png\",\n" +" \"statuses_count\": 4404,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 26,\n" +" \"show_all_inline_media\": false,\n" +" \"screen_name\": \"amamiya_nasumi\",\n" +" \"following\": null\n" +" },\n" +" \"source\": \"web\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:48 +0000 2011\",\n" +" \"favorited\": false,\n", +" \"truncated\": false,\n" +" \"id_str\": \"62143451512320000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"\\/\\/BRB..shower time!! :)\",\n" +" \"id\": 62143451512320000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"narcissa malfoy\",\n" +" \"profile_sidebar_border_color\": \"eb1d57\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"ff70d2\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1240524583\\/8156217_normal.gif\",\n" +" \"created_at\": \"Thu Feb 10 18:25:02 +0000 2011\",\n" +" \"location\": \"~*Malfoy Manor*~\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"b30098\",\n" +" \"id_str\": \"250247515\",\n" +" \"url\": \"http:\\/\\/www.harrypottercookbook-amanda.blogspot.com\\/\",\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 167,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": null,\n" +" \"id\": 250247515,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 10,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 219,\n" +" \"profile_text_color\": \"8f178f\",\n" +" \"profile_background_color\": \"f70f5c\",\n" +" \"time_zone\": null,\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"Spoiled pureblood fanatic, wife of Lucius Malfoy, mother of Draco,eve, lisa,&chasity. Pregnant and in love with yaxley_death (muilti-rp 18+) Life is good!\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_background_images\\/203844238\\/aslongasyourmine.jpg\",\n" +" \"statuses_count\": 4128,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 100,\n" +" \"screen_name\": \"Mrs_N_Malfoy\",\n" +" \"show_all_inline_media\": false,\n", +" \"following\": null\n" +" },\n" +" \"source\": \"web\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:47 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143451097088000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"\\u3066\\u304b\\u3001\\u4eca\\u65e5\\u306e\\u85e4\\u5d0e\\u53f0\\u30b4\\u30df\\u7f6e\\u3044\\u3066\\u304f\\u4eba\\u591a\\u3059\\u304e( *\\uff40\\u03c9\\u00b4) \\u30d3\\u30cb\\u30fc\\u30eb\\u30b7\\u30fc\\u30c8\\u3068\\u304b\\u3001\\u304a\\u5f01\\u5f53\\u3068\\u304b\\uff01\\uff01\\u81ea\\u5206\\u3067\\u51fa\\u3057\\u305f\\u30b4\\u30df\\u3050\\u3089\\u3044\\u81ea\\u5206\\u3067\\u6368\\u3066\\u3093\\u304b\\u3044( *\\uff40\\u03c9\\u00b4) ( *\\uff40\\u03c9\\u00b4) \\u6368\\u3066\\u3089\\u308c\\u3093\\u306e\\u306a\\u3089\\u3001\\u4f55\\u3082\\u6301\\u3063\\u3066\\u304f\\u3093\\u306a\\u3057\\uff01\\uff01\",\n" +" \"id\": 62143451097088000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"misa62@\\u30d1\\u30f3\\u796d\\u308a\\u30c0\\uff01\\uff01\",\n" +" \"profile_sidebar_border_color\": \"5ED4DC\",\n" +" \"profile_background_tile\": false,\n" +" \"profile_sidebar_fill_color\": \"95E8EC\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1270879463\\/3264b67a-f15f-499e-9c0c-0fb3bbbac7e1_normal.png\",\n" +" \"created_at\": \"Mon May 03 15:36:08 +0000 2010\",\n" +" \"location\": \"\\u798f\\u5ca1\\u770c\\u798f\\u5ca1\\u5e02\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"0099B9\",\n" +" \"id_str\": \"139753239\",\n" +" \"url\": null,\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 56,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": -36000,\n" +" \"id\": 139753239,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 44,\n" +" \"lang\": \"ja\",\n", +" \"protected\": false,\n" +" \"followers_count\": 260,\n" +" \"profile_text_color\": \"3C3940\",\n" +" \"profile_background_color\": \"0099B9\",\n" +" \"time_zone\": \"Hawaii\",\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"\\u9e7f\\u5150\\u5cf6\\u770c\\u85a9\\u6469\\u5ddd\\u5185\\u5e02\\u51fa\\u8eab\\u3002\\n\\u73fe\\u5728\\u798f\\u5ca1\\u5e02\\u535a\\u591a\\u533a\\u5728\\u4f4f\\u3002\\n\\u91ce\\u7403\\u306f\\u9df9\\u515a(\\u5fdc\\u63f4\\u306f\\u58f0\\u51fa\\u3057\\u6d3e)\\u3002\\n\\u97f3\\u697d\\u306f\\u3086\\u305a(\\u6ce3\\u304d\\u307c\\u304f\\u308d\\u6d3e)\\u3002\\n\\u30ea\\u30a2\\u30eb\\u30a2\\u30e9\\u30b5\\u30fc(\\u672c\\u6c17\\u3067\\u30ea\\u30a2\\u30eb)\\u3002\\n\\u53cc\\u5b50(\\u591a\\u5206\\u4e8c\\u5375\\u6027)\\u3002\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/a\\/1302646548\\/images\\/themes\\/theme4\\/bg.gif\",\n" +" \"statuses_count\": 10218,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 189,\n" +" \"screen_name\": \"umeimouto\",\n" +" \"show_all_inline_media\": false,\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twipple.jp\\/\\\" rel=\\\"nofollow\\\"\\u003E\\u3064\\u3044\\u3063\\u3077\\u308b for iPhone\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:47 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143450660864000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Good luck buat semua angkatan 2011,semoga lulus 100% amin!\",\n" +" \"id\": 62143450660864000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Rifqi Agata Fadillah\",\n" +" \"profile_sidebar_border_color\": \"C0DEED\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"DDEEF6\",\n" +" \"profile_image_url\": \"http:\\/\\/a2.twimg.com\\/profile_images\\/1318083009\\/286099563_normal.jpg\",\n", +" \"created_at\": \"Sat Nov 27 07:42:50 +0000 2010\",\n" +" \"location\": \"\\u00dcT: -6.201772,106.766764\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"0084B4\",\n" +" \"id_str\": \"220266344\",\n" +" \"url\": null,\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 32,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": -28800,\n" +" \"id\": 220266344,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 0,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 145,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"C0DEED\",\n" +" \"time_zone\": \"Pacific Time (US & Canada)\",\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"SQZ 75 2011| WANTED family| @JumpToHigh - bassist|F5BF\\r|S.O.W|\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_background_images\\/228932382\\/asasasasas.jpg\",\n" +" \"statuses_count\": 2906,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 139,\n" +" \"screen_name\": \"rifqifadilah\",\n" +" \"show_all_inline_media\": false,\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/www.snaptu.com\\\" rel=\\\"nofollow\\\"\\u003ESnaptu\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:47 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143449721344000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Sip insyaaloh yam haha RT @IyamSitiPurnama: @ayusucia yu besok bareng yaaah!! Jam 8an aja. Plgnya kita main. Okay?\",\n" +" \"id\": 62143449721344000,\n", +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Ayu Sucianti Pratiwi\",\n" +" \"profile_sidebar_border_color\": \"000000\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"33c7cc\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1261651576\\/Photo005_normal.jpg\",\n" +" \"created_at\": \"Fri Aug 28 11:31:34 +0000 2009\",\n" +" \"location\": \"Bandung, Indonesia\",\n" +" \"profile_link_color\": \"ae2ccf\",\n" +" \"is_translator\": false,\n" +" \"id_str\": \"69565800\",\n" +" \"follow_request_sent\": null,\n" +" \"url\": null,\n" +" \"contributors_enabled\": false,\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 0,\n" +" \"utc_offset\": -25200,\n" +" \"id\": 69565800,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 1,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 141,\n" +" \"profile_text_color\": \"143d42\",\n" +" \"profile_background_color\": \"352726\",\n" +" \"geo_enabled\": true,\n" +" \"time_zone\": \"Mountain Time (US & Canada)\",\n" +" \"notifications\": null,\n" +" \"description\": \"SMAN 1 BANDUNG '11\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_background_images\\/228896383\\/Face_In_The_Crowd_by_smashmethod.jpg\",\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 82,\n" +" \"statuses_count\": 1885,\n" +" \"show_all_inline_media\": false,\n" +" \"screen_name\": \"ayusucia\",\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/www.snaptu.com\\\" rel=\\\"nofollow\\\"\\u003ESnaptu\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" }, ", +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:46 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143443954176000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Fuck youuuuuu very much.\",\n" +" \"id\": 62143443954176000,\n" +" \"in_reply_to_status_id_str\": null,\n", +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"MayJ Tumulak\",\n" +" \"profile_sidebar_border_color\": \"FFFFFF\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"a1908f\",\n" +" \"profile_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_images\\/1248744054\\/182023_1696887156113_1655881256_1550554_2790545_n_normal.jpg\",\n" +" \"created_at\": \"Wed Mar 31 15:20:30 +0000 2010\",\n" +" \"location\": \"Cebu, Philippines.\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"e8dc33\",\n" +" \"id_str\": \"128247577\",\n" +" \"url\": \"http:\\/\\/mayjornerd.tumblr.com\\/\",\n" +" \"default_profile\": false,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 23,\n" +" \"utc_offset\": 28800,\n" +" \"id\": 128247577,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 5,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 200,\n" +" \"profile_text_color\": \"db048c\",\n" +" \"profile_background_color\": \"000000\",\n" +" \"time_zone\": \"Hong Kong\",\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"Josh Duhamel, Emmanuelle Vaugier, Eddie Cahill, Paget Brewster and Thomas Gibson. Stana Katic. I LOVE THEM. \\u2665\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a2.twimg.com\\/profile_background_images\\/124406615\\/AAB1408.jpg\",\n" +" \"statuses_count\": 4811,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 275,\n" +" \"screen_name\": \"MayJT17\",\n" +" \"show_all_inline_media\": false,\n" +" \"following\": null\n" +" },\n" +" \"source\": \"web\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n", +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:45 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143439344640000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Menurutmuuuuuu emememRT @ariesgbgn: Masak di makanin..ckck RT @rindagustina: Emg makan sendiriRT @ariesgbgn: Makan aja sendiri..haha R\",\n" +" \"id\": 62143439344640000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Rinda Citra Avanti\",\n" +" \"profile_sidebar_border_color\": \"f20938\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"d3dee8\",\n" +" \"profile_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_images\\/1318218525\\/phpJYyKtG_normal\",\n" +" \"created_at\": \"Tue Nov 23 12:19:01 +0000 2010\",\n" +" \"location\": \"Pasadena, Semarang \",\n" +" \"profile_link_color\": \"090a09\",\n" +" \"is_translator\": false,\n" +" \"id_str\": \"218856519\",\n" +" \"follow_request_sent\": null,\n" +" \"url\": \"http:\\/\\/m.facebook.com\\/profile.php?id=1850197456&refid=17\",\n" +" \"contributors_enabled\": false,\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 122,\n" +" \"utc_offset\": -28800,\n" +" \"id\": 218856519,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 1,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 301,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"f03046\",\n" +" \"geo_enabled\": false,\n" +" \"time_zone\": \"Pacific Time (US & Canada)\",\n" +" \"notifications\": null,\n" +" \"description\": \"Low profile | Simple | o2 December 2o1o \\u2665\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_background_images\\/199969730\\/76456_105694036168812_100001846488330_42447_4503930_n.jpg\",\n", +" \"default_profile_image\": false,\n" +" \"friends_count\": 202,\n" +" \"statuses_count\": 11353,\n" +" \"show_all_inline_media\": false,\n" +" \"screen_name\": \"rindagustina\",\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/ubersocial.com\\\" rel=\\\"nofollow\\\"\\u003E\\u00dcberSocial\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:45 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143439235584000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Hate wearing dresses, now I gotta sit with my legs shut.\",\n" +" \"id\": 62143439235584000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Alexis Sparrow\",\n" +" \"profile_sidebar_border_color\": \"eb157d\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"ff8ae4\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1285784046\\/110324-160733_normal.jpg\",\n" +" \"created_at\": \"Thu Feb 10 03:34:07 +0000 2011\",\n" +" \"location\": \"four one two.\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"6b1f58\",\n" +" \"id_str\": \"249956435\",\n" +" \"url\": null,\n" +" \"contributors_enabled\": false,\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 0,\n" +" \"utc_offset\": -21600,\n" +" \"id\": 249956435,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 0,\n", +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 52,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"f099c5\",\n" +" \"geo_enabled\": false,\n" +" \"time_zone\": \"Central Time (US & Canada)\",\n" +" \"notifications\": null,\n" +" \"description\": \"#iup #teamblackberry #sixburgh (:\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a1.twimg.com\\/profile_background_images\\/236015295\\/pink.gif\",\n" +" \"statuses_count\": 971,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 56,\n" +" \"screen_name\": \"alexis_sparrow\",\n" +" \"show_all_inline_media\": false,\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twitter.com\\/devices\\\" rel=\\\"nofollow\\\"\\u003Etxt\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:44 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143437247488000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Net ppas wakker:o ZONDE!!\",\n" +" \"id\": 62143437247488000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Rohit\",\n" +" \"profile_sidebar_border_color\": \"C0DEED\",\n" +" \"profile_background_tile\": false,\n" +" \"profile_sidebar_fill_color\": \"DDEEF6\",\n" +" \"profile_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_images\\/1305531627\\/IMG-20110404-00125_normal.jpg\",\n" +" \"created_at\": \"Sun Feb 06 16:34:11 +0000 2011\",\n" +" \"location\": \"The Hague\",\n", +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"0084B4\",\n" +" \"id_str\": \"248263091\",\n" +" \"is_translator\": false,\n" +" \"url\": \"http:\\/\\/www.roo11.hyves.nl\",\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 0,\n" +" \"default_profile\": true,\n" +" \"utc_offset\": null,\n" +" \"id\": 248263091,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 0,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 17,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"C0DEED\",\n" +" \"geo_enabled\": false,\n" +" \"time_zone\": null,\n" +" \"notifications\": null,\n" +" \"description\": \"Bb ping, just ask! X\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/a\\/1302724321\\/images\\/themes\\/theme1\\/bg.png\",\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 102,\n" +" \"statuses_count\": 257,\n" +" \"show_all_inline_media\": false,\n" +" \"screen_name\": \"prince__ro\",\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/blackberry.com\\/twitter\\\" rel=\\\"nofollow\\\"\\u003ETwitter for BlackBerry\\u00ae\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:44 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143434932224000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"HaPpY eAsTeR pEePs!!!\",\n" +" \"id\": 62143434932224000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n", +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Chris Curzon\",\n" +" \"profile_sidebar_border_color\": \"65B0DA\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"7AC3EE\",\n" +" \"profile_image_url\": \"http:\\/\\/a2.twimg.com\\/profile_images\\/1239641260\\/image_normal.jpg\",\n" +" \"created_at\": \"Wed Jun 17 15:35:33 +0000 2009\",\n" +" \"location\": \"Wilmslow, Cheshire, U.K\",\n" +" \"is_translator\": false,\n" +" \"profile_link_color\": \"FF0000\",\n" +" \"follow_request_sent\": null,\n" +" \"id_str\": \"47998574\",\n" +" \"url\": \"http:\\/\\/www.chriscurzon.co.uk\",\n" +" \"default_profile\": false,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 2,\n" +" \"utc_offset\": 0,\n" +" \"id\": 47998574,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 0,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 16,\n" +" \"profile_text_color\": \"3D1957\",\n" +" \"profile_background_color\": \"642D8B\",\n" +" \"time_zone\": \"London\",\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a2.twimg.com\\/a\\/1302214109\\/images\\/themes\\/theme10\\/bg.gif\",\n" +" \"statuses_count\": 186,\n" +" \"friends_count\": 72,\n" +" \"default_profile_image\": false,\n" +" \"screen_name\": \"ChrisCurzon\",\n" +" \"show_all_inline_media\": false,\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twitter.com\\/\\\" rel=\\\"nofollow\\\"\\u003ETwitter for iPhone\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n", +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:43 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143434101760000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"sadaaaapp...jawaban yg bijak *salut* hahahaha RT @ade_agus_rahman: Biar waktu yg menjawabna hahahahaRT @CSuhendra:... http:\\/\\/mtw.tl\\/lqdn3si\",\n" +" \"id\": 62143434101760000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"christian suhendra\",\n" +" \"profile_sidebar_border_color\": \"ffef0f\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"efefef\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1306502119\\/172657_1754759681733_1621188498_1678640_1734292_o_normal.jpg\",\n" +" \"created_at\": \"Tue Jul 14 14:02:20 +0000 2009\",\n" +" \"location\": \"\",\n" +" \"is_translator\": false,\n" +" \"profile_link_color\": \"ba7309\",\n" +" \"follow_request_sent\": null,\n" +" \"id_str\": \"56700895\",\n" +" \"url\": \"http:\\/\\/www.facebook.com\\/?ref=home#!\\/christian.suhendra\",\n" +" \"default_profile\": false,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 0,\n" +" \"utc_offset\": -36000,\n" +" \"id\": 56700895,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 9,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 225,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"131516\",\n" +" \"time_zone\": \"Hawaii\",\n" +" \"geo_enabled\": true,\n" +" \"notifications\": null,\n" +" \"description\": \"it's not about me , it's all about style..HAHA\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a1.twimg.com\\/profile_background_images\\/166923240\\/maryPraying1024.jpg\",\n" +" \"statuses_count\": 5705,\n", +" \"friends_count\": 256,\n" +" \"default_profile_image\": false,\n" +" \"screen_name\": \"CSuhendra\",\n" +" \"show_all_inline_media\": false,\n" +" \"following\": null\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/m.tweete.net\\\" rel=\\\"nofollow\\\"\\u003Em.tweete.net\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:43 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143433577472000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Feliz ressurrei\\u00e7\\u00e3o de Jesus Cristo. http:\\/\\/tumblr.com\\/xye28y8fgp\",\n" +" \"id\": 62143433577472000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Elisa\",\n" +" \"profile_sidebar_border_color\": \"ffffff\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"ffffff\",\n" +" \"profile_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_images\\/1245238667\\/DSC03818_normal.JPG\",\n" +" \"created_at\": \"Sat Apr 03 20:55:57 +0000 2010\",\n" +" \"location\": \"\",\n" +" \"follow_request_sent\": null,\n" +" \"profile_link_color\": \"ff5c82\",\n" +" \"id_str\": \"129297077\",\n" +" \"is_translator\": false,\n" +" \"url\": null,\n" +" \"contributors_enabled\": false,\n" +" \"favourites_count\": 0,\n" +" \"default_profile\": false,\n" +" \"utc_offset\": -10800,\n" +" \"id\": 129297077,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 1,\n", +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 61,\n" +" \"profile_text_color\": \"ff4c76\",\n" +" \"profile_background_color\": \"ffffff\",\n" +" \"time_zone\": \"Brasilia\",\n" +" \"notifications\": null,\n" +" \"description\": \"eu fa\\u00e7o da dificuldade a minha motiva\\u00e7\\u00e3o.\",\n" +" \"geo_enabled\": false,\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a1.twimg.com\\/profile_background_images\\/230245704\\/tumblr_lj97wofglY1qb67gho1_500_large.jpg\",\n" +" \"statuses_count\": 1287,\n" +" \"default_profile_image\": false,\n" +" \"friends_count\": 175,\n" +" \"screen_name\": \"eliisarocha\",\n" +" \"following\": null,\n" +" \"show_all_inline_media\": false\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/www.tumblr.com\\/\\\" rel=\\\"nofollow\\\"\\u003ETumblr\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:43 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143432310784000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"\\u3053\\u308c\\u3067\\u30e9\\u30b9\\u67a0\\u304b\\u306a\\uff5e\",\n" +" \"id\": 62143432310784000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"\\u30b7\\u30ab\\u30c8\\uff20Mr.\\u5668\\u7528\\u8ca7\\u4e4f\",\n" +" \"profile_sidebar_border_color\": \"C0DEED\",\n" +" \"profile_background_tile\": false,\n" +" \"profile_sidebar_fill_color\": \"DDEEF6\",\n" +" \"profile_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_images\\/1204747446\\/100819_1913_010001_normal.jpg\",\n" +" \"created_at\": \"Sat Nov 13 02:55:41 +0000 2010\",\n" +" \"location\": \"\\u30b7\\u30ab\\u30c8\\u306e\\u306a\\u3093\\u3068\\u306a\\u304f\\u30cb\\u30b3\\u751f(\\u6c5a)\",\n", +" \"profile_link_color\": \"0084B4\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"id_str\": \"215139533\",\n" +" \"url\": \"http:\\/\\/com.nicovideo.jp\\/community\\/co568211\",\n" +" \"default_profile\": true,\n" +" \"favourites_count\": 0,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": 32400,\n" +" \"id\": 215139533,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 1,\n" +" \"lang\": \"ja\",\n" +" \"protected\": false,\n" +" \"followers_count\": 17,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"C0DEED\",\n" +" \"time_zone\": \"Tokyo\",\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"\\u4e00\\u822c\\u5927\\u5b66\\u751f\\u517c\\u3001\\u30a2\\u30cb\\u30b2\\u30fc\\u30fb\\u30e1\\u30bf\\u30eb\\u30d0\\u30f3\\u30c9\\u30c9\\u30e9\\u30de\\u30fc\\u517cAO\\u52e2\\u3084\\u3063\\u3066\\u307e\\u3059\\u2605 \\u30b3\\u30df\\u30e5\\u3067\\u306fAO\\u52e2\\u6d3e\\u751f\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u3068\\u3057\\u3066\\u3001\\u79c1\\u3092\\u542b\\u3081\\u30e1\\u30f3\\u30d0\\u30fc\\u306e\\u65b9\\u3005\\u304c\\u751f\\u653e\\u9001\\u3092\\u884c\\u3063\\u3066\\u304a\\u308a\\u307e\\u3059\\u266a \\u79c1\\u306e\\u653e\\u9001\\u3067\\u306f\\u3001\\u30e9\\u30b8\\u30aa\\u7684\\u30ea\\u30b9\\u30ca\\u30fc\\u53c2\\u52a0\\u578b\\u306e\\u30b9\\u30bf\\u30a4\\u30eb\\u3067\\u653e\\u9001\\u4e2d\\u3067\\u3059\\u2605 \\u8a71\\u984c\\u306b\\u95a2\\u3057\\u3066\\u306f\\u30b8\\u30e3\\u30f3\\u30eb\\u554f\\u308f\\u305a\\u3001\\u5668\\u7528\\u8ca7\\u4e4f\\u3092\\u767a\\u63ee\\u3057\\u3066\\u307e\\u3059\\u266a\\u266a\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/a\\/1303316982\\/images\\/themes\\/theme1\\/bg.png\",\n" +" \"default_profile_image\": false,\n" +" \"statuses_count\": 526,\n" +" \"friends_count\": 10,\n" +" \"screen_name\": \"Shikato_Drs_AO\",\n" +" \"following\": null,\n" +" \"show_all_inline_media\": false\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twtr.jp\\\" rel=\\\"nofollow\\\"\\u003EKeitai Web\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:43 +0000 2011\",\n" +" \"favorited\": false,\n", +" \"truncated\": false,\n" +" \"id_str\": \"62143431262208000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"casa da v\\u00f3, vo fika vo cel\",\n" +" \"id\": 62143431262208000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Lucas Murbach Pierin\",\n" +" \"profile_sidebar_border_color\": \"eeeeee\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"efefef\",\n" +" \"profile_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_images\\/1321857197\\/Twitter_normal.jpg\",\n" +" \"created_at\": \"Tue Oct 12 02:14:40 +0000 2010\",\n" +" \"location\": \"Lapa\\/Ctba\",\n" +" \"profile_link_color\": \"009999\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"id_str\": \"201538116\",\n" +" \"url\": \"http:\\/\\/xenedapuc.tumblr.com\",\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 8,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": -10800,\n" +" \"id\": 201538116,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 22,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 68,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"131516\",\n" +" \"time_zone\": \"Brasilia\",\n" +" \"geo_enabled\": true,\n" +" \"notifications\": null,\n" +" \"description\": \"So um Pi\\u00e1 bm gnt boa, de gosto musical ecl\\u00e9tico + prefiro um bom Rock n' Roll, Curto anda de Bike e joga um futeba d veiz incuando e Atleticano com orgulho. =D \",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/profile_background_images\\/206676494\\/twitter_pattern_background_by_ainon.jpg\",\n" +" \"default_profile_image\": false,\n" +" \"statuses_count\": 5470,\n" +" \"friends_count\": 145,\n", +" \"screen_name\": \"Xeneral\",\n" +" \"following\": null,\n" +" \"show_all_inline_media\": false\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/www.tweetdeck.com\\\" rel=\\\"nofollow\\\"\\u003ETweetDeck\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:43 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143430956032000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"ATSUSHI\\u75e9\\u305b\\u305f\\uff1f\",\n" +" \"id\": 62143430956032000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"yui\",\n" +" \"profile_sidebar_border_color\": \"CC3366\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"E5507E\",\n" +" \"profile_image_url\": \"http:\\/\\/a0.twimg.com\\/profile_images\\/1210885986\\/image_normal.jpg\",\n" +" \"created_at\": \"Tue Oct 20 04:16:52 +0000 2009\",\n" +" \"location\": \"MEGURO TOKYO\",\n" +" \"profile_link_color\": \"B40B43\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"id_str\": \"83766274\",\n" +" \"url\": \"http:\\/\\/ameblo.jp\\/yuikame61\\/\",\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 16,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": -36000,\n" +" \"id\": 83766274,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 6,\n" +" \"lang\": \"ja\",\n" +" \"protected\": false,\n" +" \"followers_count\": 175,\n", +" \"profile_text_color\": \"362720\",\n" +" \"profile_background_color\": \"FF6699\",\n" +" \"time_zone\": \"Hawaii\",\n" +" \"geo_enabled\": false,\n" +" \"notifications\": null,\n" +" \"description\": \"I'm stylist's assistant^^ \\/ I love fashion,japanese reggae and hiphop\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/a\\/1302724321\\/images\\/themes\\/theme11\\/bg.gif\",\n" +" \"default_profile_image\": false,\n" +" \"statuses_count\": 4048,\n" +" \"friends_count\": 184,\n" +" \"screen_name\": \"kamewada\",\n" +" \"following\": null,\n" +" \"show_all_inline_media\": false\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twitter.com\\/\\\" rel=\\\"nofollow\\\"\\u003ETwitter for iPhone\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:43 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143430540800000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"Well that's the last time I eat chocolate because of #EASTER\",\n" +" \"id\": 62143430540800000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n" +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"TheRabbitsToldMe\",\n" +" \"profile_sidebar_border_color\": \"C0DEED\",\n" +" \"profile_background_tile\": false,\n" +" \"profile_sidebar_fill_color\": \"DDEEF6\",\n" +" \"profile_image_url\": \"http:\\/\\/a1.twimg.com\\/profile_images\\/1314186122\\/image_normal.jpg\",\n" +" \"created_at\": \"Fri Mar 18 23:27:45 +0000 2011\",\n" +" \"location\": \"Bat Country bitch!!!! :D\",\n" +" \"profile_link_color\": \"0084B4\",\n" +" \"is_translator\": false,\n", +" \"follow_request_sent\": null,\n" +" \"id_str\": \"268522712\",\n" +" \"url\": null,\n" +" \"default_profile\": true,\n" +" \"favourites_count\": 0,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": null,\n" +" \"id\": 268522712,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 0,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 33,\n" +" \"profile_text_color\": \"333333\",\n" +" \"profile_background_color\": \"C0DEED\",\n" +" \"time_zone\": null,\n" +" \"geo_enabled\": true,\n" +" \"notifications\": null,\n" +" \"description\": \"Sup! I am the back up singer and electric guitarist in the band Your Broken Innocence. U jealous? ps. i luv Short Stack!\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a3.twimg.com\\/a\\/1303425044\\/images\\/themes\\/theme1\\/bg.png\",\n" +" \"default_profile_image\": false,\n" +" \"statuses_count\": 115,\n" +" \"friends_count\": 57,\n" +" \"screen_name\": \"GraceShortStack\",\n" +" \"following\": null,\n" +" \"show_all_inline_media\": false\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/twitter.com\\/\\\" rel=\\\"nofollow\\\"\\u003ETwitter for iPhone\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" },\n" +" {\n" +" \n" +" \"coordinates\": null,\n" +" \"created_at\": \"Sun Apr 24 13:18:42 +0000 2011\",\n" +" \"favorited\": false,\n" +" \"truncated\": false,\n" +" \"id_str\": \"62143429689344000\",\n" +" \"in_reply_to_user_id_str\": null,\n" +" \"contributors\": null,\n" +" \"text\": \"RT @eireen37: Abis makan sop+sate kambing di kedai Ahmad Dani,recomended :q\",\n" +" \"id\": 62143429689344000,\n" +" \"in_reply_to_status_id_str\": null,\n" +" \"retweet_count\": 0,\n" +" \"geo\": null,\n", +" \"retweeted\": false,\n" +" \"in_reply_to_user_id\": null,\n" +" \"place\": null,\n" +" \"user\": {\n" +" \"name\": \"Yuki Endah\",\n" +" \"profile_sidebar_border_color\": \"ffadff\",\n" +" \"profile_background_tile\": true,\n" +" \"profile_sidebar_fill_color\": \"e645db\",\n" +" \"profile_image_url\": \"http:\\/\\/a2.twimg.com\\/profile_images\\/1308637078\\/Copy_of_Copy_of_DSC01894_normal.jpg\",\n" +" \"created_at\": \"Wed Jul 15 04:39:42 +0000 2009\",\n" +" \"location\": \"Samarinda, Indonesia\",\n" +" \"profile_link_color\": \"94039c\",\n" +" \"is_translator\": false,\n" +" \"follow_request_sent\": null,\n" +" \"id_str\": \"56926527\",\n" +" \"url\": \"http:\\/\\/id-id.facebook.com\\/people\\/Yuki-Endah\\/1646561051\",\n" +" \"default_profile\": false,\n" +" \"favourites_count\": 39,\n" +" \"contributors_enabled\": false,\n" +" \"utc_offset\": 28800,\n" +" \"id\": 56926527,\n" +" \"profile_use_background_image\": true,\n" +" \"listed_count\": 2,\n" +" \"lang\": \"en\",\n" +" \"protected\": false,\n" +" \"followers_count\": 377,\n" +" \"profile_text_color\": \"a30c64\",\n" +" \"profile_background_color\": \"fafafa\",\n" +" \"time_zone\": \"Kuala Lumpur\",\n" +" \"geo_enabled\": true,\n" +" \"notifications\": null,\n" +" \"description\": \"I LOVE MUSIC. Anytime I want, I will take my time & I will take my earphone to listening my favourite songs..\\r\\n\",\n" +" \"verified\": false,\n" +" \"profile_background_image_url\": \"http:\\/\\/a1.twimg.com\\/profile_background_images\\/175641717\\/Sakura_1.jpg\",\n" +" \"default_profile_image\": false,\n" +" \"statuses_count\": 5731,\n" +" \"friends_count\": 197,\n" +" \"screen_name\": \"yuki_endah\",\n" +" \"following\": null,\n" +" \"show_all_inline_media\": true\n" +" },\n" +" \"source\": \"\\u003Ca href=\\\"http:\\/\\/www.snaptu.com\\\" rel=\\\"nofollow\\\"\\u003ESnaptu\\u003C\\/a\\u003E\",\n" +" \"in_reply_to_screen_name\": null,\n" +" \"in_reply_to_status_id\": null\n" +" }\n" +"]\n", +NULL +}; + +/* recent flickr photos on monday morning */ +const char * doc2[] = { +"{\n" +" \"title\": \"Uploads from everyone\",\n" +" \"link\": \"http://www.flickr.com/photos/\",\n" +" \"description\": \"\",\n" +" \"modified\": \"2011-04-25T11:41:03Z\",\n" +" \"generator\": \"http://www.flickr.com/\",\n" +" \"items\": [\n" +" {\n" +" \"title\": \"sylhet 963\",\n" +" \"link\": \"http://www.flickr.com/photos/saifmanna/5652906125/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5268/5652906125_c113213248_m.jpg\"},\n" +" \"date_taken\": \"2011-04-09T04:31:45-08:00\",\n" +" \"description\": \"

saifmanna<\\/a> posted a photo:<\\/p>

\\\"sylhet<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:03Z\",\n" +" \"author\": \"nobody@flickr.com (saifmanna)\",\n" +" \"author_id\": \"9712792@N05\",\n" +" \"tags\": \"sylhet\"\n" +" },\n" +" {\n" +" \"title\": \"DSCN7238\",\n" +" \"link\": \"http://www.flickr.com/photos/54062330@N03/5652906139/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5182/5652906139_550aa6702f_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T12:26:17-08:00\",\n" +" \"description\": \"

acvаrelium<\\/a> posted a photo:<\\/p>

\\\"DSCN7238\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:03Z\",\n" +" \"author\": \"nobody@flickr.com (acvаrelium)\",\n" +" \"author_id\": \"54062330@N03\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"Siena-014\",\n" +" \"link\": \"http://www.flickr.com/photos/katharinaegarter/5652906201/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5062/5652906201_c7307b23e1_m.jpg\"},\n" +" \"date_taken\": \"2011-04-22T12:51:58-08:00\",\n" +" \"description\": \"

Katharina Egarter<\\/a> posted a photo:<\\/p>

\\\"Siena-014\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:05Z\",\n" +" \"author\": \"nobody@flickr.com (Katharina Egarter)\",\n", +" \"author_id\": \"51712997@N04\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"avd-1.jpg\",\n" +" \"link\": \"http://www.flickr.com/photos/arjanvandam/5652906213/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5066/5652906213_9ed963d069_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T13:41:06-08:00\",\n" +" \"description\": \"

Arjan van Dam<\\/a> posted a photo:<\\/p>

\\\"avd-1.jpg\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:06Z\",\n" +" \"author\": \"nobody@flickr.com (Arjan van Dam)\",\n" +" \"author_id\": \"44451778@N06\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"IMG_4146\",\n" +" \"link\": \"http://www.flickr.com/photos/14414603@N08/5652906245/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5148/5652906245_8e9717e8c3_m.jpg\"},\n" +" \"date_taken\": \"2011-04-13T03:53:52-08:00\",\n" +" \"description\": \"

A :-)<\\/a> posted a photo:<\\/p>

\\\"IMG_4146\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:06Z\",\n" +" \"author\": \"nobody@flickr.com (A :-))\",\n" +" \"author_id\": \"14414603@N08\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"550907i20020624_13\",\n" +" \"link\": \"http://www.flickr.com/photos/ltppims/5652906275/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5022/5652906275_467d6f36ed_m.jpg\"},\n" +" \"date_taken\": \"2003-02-06T09:14:11-08:00\",\n" +" \"description\": \"

ltppims<\\/a> posted a photo:<\\/p>

\\\"550907i20020624_13\\\"<\\/a><\\/p>

550907i20020624_13<\\/p>\",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n" +" \"author\": \"nobody@flickr.com (ltppims)\",\n" +" \"author_id\": \"61401047@N03\",\n" +" \"tags\": \"550907i2002062413\"\n" +" },\n" +" {\n" +" \"title\": \"P4193424\",\n" +" \"link\": \"http://www.flickr.com/photos/aifromla/5652906305/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5266/5652906305_a72c1050c4_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T04:41:08-08:00\",\n", +" \"description\": \"

愛 from LA<\\/a> posted a photo:<\\/p>

\\\"P4193424\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n" +" \"author\": \"nobody@flickr.com (愛 from LA)\",\n" +" \"author_id\": \"60647869@N06\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"In need of a wash but not on the last day Midland Red D9 on the last day of service 31,Dec,1979, in Leicester photo lifted from a super 8 film\",\n" +" \"link\": \"http://www.flickr.com/photos/transport_photos/5652906307/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5189/5652906307_e5da6d2d29_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T12:41:08-08:00\",\n" +" \"description\": \"

Horsencart<\\/a> posted a photo:<\\/p>

\\\"In<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n" +" \"author\": \"nobody@flickr.com (Horsencart)\",\n" +" \"author_id\": \"36803579@N07\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"11182862509\",\n" +" \"link\": \"http://www.flickr.com/photos/58240971@N06/5652906329/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5188/5652906329_0cebae6d65_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T04:41:09-08:00\",\n" +" \"description\": \"

caciousclei<\\/a> posted a photo:<\\/p>

\\\"11182862509\\\"<\\/a><\\/p>

ღneslyluka ni kennethocuteღ<\\/p>\",\n" +" \"published\": \"2011-04-25T11:41:09Z\",\n" +" \"author\": \"nobody@flickr.com (caciousclei)\",\n" +" \"author_id\": \"58240971@N06\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"Resting in the woods\",\n" +" \"link\": \"http://www.flickr.com/photos/benrobson2999/5653475856/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5301/5653475856_550aa6702f_m.jpg\"},\n" +" \"date_taken\": \"2011-04-24T14:23:43-08:00\",\n" +" \"description\": \"

benrobson2999<\\/a> posted a photo:<\\/p>

\\\"Resting<\\/a><\\/p> \",\n", +" \"published\": \"2011-04-25T11:41:03Z\",\n" +" \"author\": \"nobody@flickr.com (benrobson2999)\",\n" +" \"author_id\": \"59245229@N04\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"IMG_4696\",\n" +" \"link\": \"http://www.flickr.com/photos/feltedpleasure/5653475918/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5188/5653475918_a06fd2400c_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T08:05:11-08:00\",\n" +" \"description\": \"

FeltedPleasure<\\/a> posted a photo:<\\/p>

\\\"IMG_4696\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:04Z\",\n" +" \"author\": \"nobody@flickr.com (FeltedPleasure)\",\n" +" \"author_id\": \"41967161@N03\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"DSC04271\",\n" +" \"link\": \"http://www.flickr.com/photos/ze_ero/5653475956/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5144/5653475956_31da27478a_m.jpg\"},\n" +" \"date_taken\": \"2011-04-17T09:45:21-08:00\",\n" +" \"description\": \"

ze_ero<\\/a> posted a photo:<\\/p>

\\\"DSC04271\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:05Z\",\n" +" \"author\": \"nobody@flickr.com (ze_ero)\",\n" +" \"author_id\": \"49631749@N06\",\n" +" \"tags\": \"japan kyoto arashiyama 京都 日本 嵐山 kansai 関西\"\n" +" },\n" +" {\n" +" \"title\": \"DSC07923\",\n" +" \"link\": \"http://www.flickr.com/photos/lamolda/5653475962/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5063/5653475962_8fc2b9f460_m.jpg\"},\n" +" \"date_taken\": \"2011-04-24T22:44:50-08:00\",\n" +" \"description\": \"

lamolda<\\/a> posted a photo:<\\/p>

\\\"DSC07923\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:05Z\",\n" +" \"author\": \"nobody@flickr.com (lamolda)\",\n" +" \"author_id\": \"60466736@N02\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"DSC00773\",\n", +" \"link\": \"http://www.flickr.com/photos/zhanghao/5653475998/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5141/5653475998_ef1ee0de1e_m.jpg\"},\n" +" \"date_taken\": \"2006-12-23T15:36:57-08:00\",\n" +" \"description\": \"

贰月<\\/a> posted a photo:<\\/p>

\\\"DSC00773\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:06Z\",\n" +" \"author\": \"nobody@flickr.com (贰月)\",\n" +" \"author_id\": \"32806588@N00\",\n" +" \"tags\": \"日本 新宿御苑 東京 出差\"\n" +" },\n" +" {\n" +" \"title\": \"DSCF3051\",\n" +" \"link\": \"http://www.flickr.com/photos/30045765@N07/5653476064/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5305/5653476064_c55cd687a1_m.jpg\"},\n" +" \"date_taken\": \"2011-04-25T23:58:27-08:00\",\n" +" \"description\": \"

jamerco<\\/a> posted a photo:<\\/p>

\\\"DSCF3051\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n" +" \"author\": \"nobody@flickr.com (jamerco)\",\n" +" \"author_id\": \"30045765@N07\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"DSC_0440\",\n" +" \"link\": \"http://www.flickr.com/photos/carolineteselle/5653476082/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5023/5653476082_3884a09f91_m.jpg\"},\n" +" \"date_taken\": \"2011-04-20T19:29:33-08:00\",\n" +" \"description\": \"

ecteselle<\\/a> posted a photo:<\\/p>

\\\"DSC_0440\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n" +" \"author\": \"nobody@flickr.com (ecteselle)\",\n" +" \"author_id\": \"57944678@N08\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"IMG_2301\",\n" +" \"link\": \"http://www.flickr.com/photos/marcolympics/5653476084/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5307/5653476084_00abc74e08_m.jpg\"},\n" +" \"date_taken\": \"2010-12-14T11:52:23-08:00\",\n" +" \"description\": \"

mbk28<\\/a> posted a photo:<\\/p>

\\\"IMG_2301\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n", +" \"author\": \"nobody@flickr.com (mbk28)\",\n" +" \"author_id\": \"16181899@N00\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"shot_1303650234358\",\n" +" \"link\": \"http://www.flickr.com/photos/mirtedevries/5653476086/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5145/5653476086_cb998056eb_m.jpg\"},\n" +" \"date_taken\": \"2011-04-24T15:03:54-08:00\",\n" +" \"description\": \"

Krullenbol1987<\\/a> posted a photo:<\\/p>

\\\"shot_1303650234358\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:08Z\",\n" +" \"author\": \"nobody@flickr.com (Krullenbol1987)\",\n" +" \"author_id\": \"61985194@N03\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"GWP Rochefort 2011 De Leerboom (602) (Small)\",\n" +" \"link\": \"http://www.flickr.com/photos/26703364@N05/5653476088/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5307/5653476088_3fc497eea8_m.jpg\"},\n" +" \"date_taken\": \"2011-03-28T09:05:21-08:00\",\n" +" \"description\": \"

bertrand.demiddeleer<\\/a> posted a photo:<\\/p>

\\\"GWP<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:09Z\",\n" +" \"author\": \"nobody@flickr.com (bertrand.demiddeleer)\",\n" +" \"author_id\": \"26703364@N05\",\n" +" \"tags\": \"\"\n" +" },\n" +" {\n" +" \"title\": \"IMG_3650\",\n" +" \"link\": \"http://www.flickr.com/photos/fatpoppadaddys/5653476104/\",\n" +" \"media\": {\"m\":\"http://farm6.static.flickr.com/5183/5653476104_462f44a3e5_m.jpg\"},\n" +" \"date_taken\": \"2011-04-22T00:26:40-08:00\",\n" +" \"description\": \"

fatpoppadaddys<\\/a> posted a photo:<\\/p>

\\\"IMG_3650\\\"<\\/a><\\/p> \",\n" +" \"published\": \"2011-04-25T11:41:09Z\",\n" +" \"author\": \"nobody@flickr.com (fatpoppadaddys)\",\n" +" \"author_id\": \"28382183@N04\",\n" +" \"tags\": \"efs1855mmf3556\"\n" +" }\n" +" ]\n" +"}\n", +NULL +}; + +/* commits on the yajl 2.x branch */ +const char * doc3[] = { +"{\"commits\":[{\"parents\":[{\"id\":\"1b9995a0a341096afdf3e13a70f2185e438c4452\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/0d5000f0ad0ef9d94bd2bbcf2188b813a60d452a\",\"id\":\"0d5000f0ad0ef9d94bd2bbcf2188b813a60d452a\",\"committed_date\":\"2011-04-24T11:48:34-07:00\",\"authored_date\":\"2011-04-24T11:48:34-07:00\",\"message\":\"update docs for perf gains with yajl_dont_validate_strings\",\"tree\":\"af70481aad00b4ce9e2f23cdd23e58d735c50072\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"453aa706cc86425bea35195e454f80941a7fbc4a\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/1b9995a0a341096afdf3e13a70f2185e438c4452\",\"id\":\"1b9995a0a341096afdf3e13a70f2185e438c4452\",\"committed_date\":\"2011-04-24T07:10:58-07:00\",\"authored_date\":\"2011-04-24T07:10:58-07:00\",\"message\":\"first pass at a little in-tree perf test for a stable way to quantify optimization efforts\",\"tree\":\"39884f09d59312dbeea4a7ab7d46a56320cb986c\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"25133e5508b979fdf6814832d4355f46bd26db43\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/453aa706cc86425bea35195e454f80941a7fbc4a\",\"id\":\"453aa706cc86425bea35195e454f80941a7fbc4a\",\"committed_date\":\"2011-04-24T07:06:14-07:00\",\"authored_date\":\"2011-04-24T07:06:14-07:00\",\"message\":\"fix debug compile error\",\"tree\":\"e10ab42ec2577bc19163222f445532958fe51f3b\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"b36a8bd294cbeeaab7149402f369fdd9be95aec1\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/25133e5508b979fdf6814832d4355f46bd26db43\",\"id\":\"25133e5508b979fdf6814832d4355f46bd26db43\",\"committed_date\":\"2011-04-23T12:42:19-07:00\",\"authored_date\":\"2011-04-23T12:42:19-07:00\",\"message\":\"documentation updates\",\"tree\":\"e49e7296c1f82f78f359636ce6aa600e7c3ef73a\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"9bf2ad882bb98710949b1e3262bddff67845bb87\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/b36a8bd294cbeeaab7149402f369fdd9be95aec1\",\"id\":\"b36a8bd294cbeeaab7149402f369fdd9be95aec1\",\"committed_date\":\"2011-04-23T10:17:35-07:00\",\"authored_date\":\"2011-04-23T10:17:35-07:00\",\"message\":\"update documentation and tighten API for yajl_tree.h, inline several structures so a reader can grok the structure in hopefully one pass without jumping all over the file.\",\"tree\":\"7e2ab759926148ad03d1931c8a768abe5301bff9\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"69a9c263b5e3c2019dc258d3e75c95ad7267ea16\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/9bf2ad882bb98710949b1e3262bddff67845bb87\",\"id\":\"9bf2ad882bb98710949b1e3262bddff67845bb87\",\"committed_date\":\"2011-04-22T18:21:52-07:00\",\"authored_date\":\"2011-04-22T18:21:52-07:00\",\"message\":\"move unnec. includes out of public api, more yajl_type propogation\",\"tree\":\"f30c2f4962abb020a64d0bc4773db1b704053b1d\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"d24690ee5cc09ea2cf6bbd152f2627e8ee1986e7\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/69a9c263b5e3c2019dc258d3e75c95ad7267ea16\",\"id\":\"69a9c263b5e3c2019dc258d3e75c95ad7267ea16\",\"committed_date\":\"2011-04-22T18:17:44-07:00\",\"authored_date\":\"2011", +"-04-22T18:17:44-07:00\",\"message\":\"change types from preprocessor macros to an enum, add yajl_t_any for use with yajl_tree_get()\",\"tree\":\"46f88aa049c3016e68a93463ff265fcdd38d879a\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"8e5d0b15415c6422365f6ececff5190499b43bd5\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/d24690ee5cc09ea2cf6bbd152f2627e8ee1986e7\",\"id\":\"d24690ee5cc09ea2cf6bbd152f2627e8ee1986e7\",\"committed_date\":\"2011-04-22T18:11:55-07:00\",\"authored_date\":\"2011-04-22T18:11:55-07:00\",\"message\":\"reduce output noise during testing\",\"tree\":\"c92162f0875998309e33af415510db3ecd592559\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"dd18f6182e58bb81368b30d33262e58fca7a532c\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/8e5d0b15415c6422365f6ececff5190499b43bd5\",\"id\":\"8e5d0b15415c6422365f6ececff5190499b43bd5\",\"committed_date\":\"2011-04-22T16:05:38-07:00\",\"authored_date\":\"2011-04-22T16:05:38-07:00\",\"message\":\"fix compiler warning. he's right.\",\"tree\":\"b7350153b2d9ba99e83540a0caaca73b6ac8367f\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"aedaa9e449e03af866c0e594014cd7e78dc7c98b\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/dd18f6182e58bb81368b30d33262e58fca7a532c\",\"id\":\"dd18f6182e58bb81368b30d33262e58fca7a532c\",\"committed_date\":\"2011-04-22T15:52:23-07:00\",\"authored_date\":\"2011-04-22T15:52:23-07:00\",\"message\":\"add a couple convenience routines for dealing with numbers, more copious yajl_tree reformatting\",\"tree\":\"e7767ad0ded6924ee6d9af4b59842148f9409cd6\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"baf9c39797fce24b89398a3e94ff27ae4074867a\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/aedaa9e449e03af866c0e594014cd7e78dc7c98b\",\"id\":\"aedaa9e449e03af866c0e594014cd7e78dc7c98b\",\"committed_date\":\"2011-04-22T15:38:55-07:00\",\"authored_date\":\"2011-04-22T15:38:55-07:00\",\"message\":\"object keys should just be bare strings, the indirection is useless\",\"tree\":\"73dc7fb46872a78d6516fadb2197519d8d6ac3f0\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"742a1cd7c66d64d45e25a016e506d555834f087b\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/baf9c39797fce24b89398a3e94ff27ae4074867a\",\"id\":\"baf9c39797fce24b89398a3e94ff27ae4074867a\",\"committed_date\":\"2011-04-22T15:32:59-07:00\",\"authored_date\":\"2011-04-22T15:32:59-07:00\",\"message\":\"be terse & piss all over that tree.\",\"tree\":\"6103a99867b21a5d844bb84eb49e84c4f393d1ec\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"86f5093024d434eb989c4d6c7ad657a31f5f4bf1\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/742a1cd7c66d64d45e25a016e506d555834f087b\",\"id\":\"742a1cd7c66d64d45e25a016e506d555834f087b\",\"committed_date\":\"2011-04-22T14:53:32-07:00\",\"authored_date\":\"2011-04-22T14:53:32-07:00\",\"message\":\"cosmetic, indention and code formatting for yajl_tree\",\"tree\":\"0c883d58cfd69bfaba84a54be4912dd2edb86095\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"b53a6cb3ee91d2a7765bff88e41089ce17ec7b4a\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/86f509302", +"4d434eb989c4d6c7ad657a31f5f4bf1\",\"id\":\"86f5093024d434eb989c4d6c7ad657a31f5f4bf1\",\"committed_date\":\"2011-04-22T14:47:44-07:00\",\"authored_date\":\"2011-04-22T14:47:44-07:00\",\"message\":\"remove a useless level of indirection for strings\",\"tree\":\"f734163b55a78c41ca157cc90096fe0db3152737\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"e976b21748c5fd8b6ca4d28470d8a70f69890ecd\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/b53a6cb3ee91d2a7765bff88e41089ce17ec7b4a\",\"id\":\"b53a6cb3ee91d2a7765bff88e41089ce17ec7b4a\",\"committed_date\":\"2011-04-22T14:43:29-07:00\",\"authored_date\":\"2011-04-22T14:43:29-07:00\",\"message\":\"ISC license the configuration file parser example\",\"tree\":\"fe9bea332cf4a1ea8c3843035abddf64ba2a501d\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"a03bd0c9c61092f664c97a51b1b0262f8499e21b\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/e976b21748c5fd8b6ca4d28470d8a70f69890ecd\",\"id\":\"e976b21748c5fd8b6ca4d28470d8a70f69890ecd\",\"committed_date\":\"2011-04-22T14:43:13-07:00\",\"authored_date\":\"2011-04-22T14:43:13-07:00\",\"message\":\"relicense florian's contribution ISC, (still pending his approval, but I'm an optimist)\",\"tree\":\"1b4fbbf98af3ee641692e6f0ba045e8343ac2386\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"668e787b1cdba118d73efc233e8a48306c2033d6\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/a03bd0c9c61092f664c97a51b1b0262f8499e21b\",\"id\":\"a03bd0c9c61092f664c97a51b1b0262f8499e21b\",\"committed_date\":\"2011-04-22T14:40:45-07:00\",\"authored_date\":\"2011-04-22T14:40:45-07:00\",\"message\":\"talk a little bit more about this yajl_tree.h example\",\"tree\":\"e297fd14812d926f005919a1d3a28d8ad427521c\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"d2ec58b70b429b908d9f395ef378443b6101153b\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/668e787b1cdba118d73efc233e8a48306c2033d6\",\"id\":\"668e787b1cdba118d73efc233e8a48306c2033d6\",\"committed_date\":\"2011-04-22T14:39:40-07:00\",\"authored_date\":\"2011-04-22T14:39:40-07:00\",\"message\":\"initial merge/port of Florian Forster's yajl_tree implementation, along with a new utility routine yajl_tree_get() and an example\",\"tree\":\"38488d9afe9d58c47e1c6ed5c6f7ad1cbed5cd45\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"9538bda17bef60642f2ed3ff2f6bfd29785c36df\"},{\"id\":\"a7ab7633a603c6c3e31bb54a45da2afbb54a98c9\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/d2ec58b70b429b908d9f395ef378443b6101153b\",\"id\":\"d2ec58b70b429b908d9f395ef378443b6101153b\",\"committed_date\":\"2011-04-22T13:11:24-07:00\",\"authored_date\":\"2011-04-22T13:11:24-07:00\",\"message\":\"Merge branch 'parsetree' of https://github.com/octo/yajl into parsetree\",\"tree\":\"207162f20d8d97eafe0c9e899d9ffad32c36c0c2\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"bb21bcdb4ced287e7aea8285904ad3540560558a\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/9538bda17bef60642f2ed3ff2f6bfd29785c36df\",\"id\":\"9538bda17bef60642f2ed3ff2f6bfd29785c36df\",\"committed_date\":\"2011-04-22T12:17:29-07:00\",\"authored_date\":\"2011-04-22T12:17:29-07:00\",\"message\":\"Add a generator feature to validate UTF8 strings as they are written to output. closes #25\",\"tree\":\"24ebb57", +"3fadebcf0387f73b3feb9a83ac2bf080d\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"9813127163116b7f928c383f14bb8618675a9694\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/bb21bcdb4ced287e7aea8285904ad3540560558a\",\"id\":\"bb21bcdb4ced287e7aea8285904ad3540560558a\",\"committed_date\":\"2011-04-22T11:37:04-07:00\",\"authored_date\":\"2011-04-22T11:37:04-07:00\",\"message\":\"use new configuration features to simplify the json verifier\",\"tree\":\"9450c43b683056391b936c05ec88dad1333fa628\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"0858bb341280956947df1cfae33eb5ac6ecfe6f7\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/9813127163116b7f928c383f14bb8618675a9694\",\"id\":\"9813127163116b7f928c383f14bb8618675a9694\",\"committed_date\":\"2011-04-21T12:58:28-07:00\",\"authored_date\":\"2011-04-21T09:56:51-07:00\",\"message\":\"rename yajl_parse_complete to yajl_complete_parse. the latter is correctly an imperative, while the former might be confused for a question.\",\"tree\":\"66fbf6ebf56d9bbe75095f5b97bab7fc22b2115e\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"6aefdaab38d81f33c46e33353c5a156884ea022d\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/0858bb341280956947df1cfae33eb5ac6ecfe6f7\",\"id\":\"0858bb341280956947df1cfae33eb5ac6ecfe6f7\",\"committed_date\":\"2011-04-21T12:55:45-07:00\",\"authored_date\":\"2011-04-21T08:36:26-07:00\",\"message\":\"rework programmatic configuration of yajl. both generator and parser now have a yajl_XXX_config() function that accepts varargs so that configuration is simple, and new config options can be added in the future that preserve backwards binary compatibility. closes #23.\",\"tree\":\"2f61e004f7a892f00f6f34d38a8a194618400b59\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"b6b44127f23d70231156a8d20fa7d437cac1588f\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/6aefdaab38d81f33c46e33353c5a156884ea022d\",\"id\":\"6aefdaab38d81f33c46e33353c5a156884ea022d\",\"committed_date\":\"2011-04-20T15:25:43-07:00\",\"authored_date\":\"2011-04-20T15:25:43-07:00\",\"message\":\"oh, ok. osx ld doesn't like more than two digits in shared lib version numbers. weenies.\",\"tree\":\"8b13d0a2e7870253be11fe6ba20e73dc64f2586e\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"f542280579e0a98a172e38631e972acbd6dc1195\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/b6b44127f23d70231156a8d20fa7d437cac1588f\",\"id\":\"b6b44127f23d70231156a8d20fa7d437cac1588f\",\"committed_date\":\"2011-04-20T15:23:09-07:00\",\"authored_date\":\"2011-04-20T15:23:09-07:00\",\"message\":\"add tests cases for partial value config\",\"tree\":\"52392b3b62a212d17b9e6b4fa865620d3603d7b6\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"de81b1fcd22b29b152f921f23faab759c79da7e1\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/f542280579e0a98a172e38631e972acbd6dc1195\",\"id\":\"f542280579e0a98a172e38631e972acbd6dc1195\",\"committed_date\":\"2011-04-20T14:57:42-07:00\",\"authored_date\":\"2011-04-20T14:57:42-07:00\",\"message\":\"cosmetic, indentation and whitespace\",\"tree\":\"736c631155d85e83b0cbede9223d4ea1a98d43fa\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"7852c0a19", +"70b67c22b7b7bfeb29095bcc21ca12f\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/de81b1fcd22b29b152f921f23faab759c79da7e1\",\"id\":\"de81b1fcd22b29b152f921f23faab759c79da7e1\",\"committed_date\":\"2011-04-20T14:48:36-07:00\",\"authored_date\":\"2011-04-20T14:48:36-07:00\",\"message\":\"yajl 2 will be relicensed under the ISC license. same idea, fewer bytes.\",\"tree\":\"4cc7e0c2d9bde7f1c739fda71bec6491b381b6d2\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"986516e15b7b331a19fe317e2c828c5352d5b72e\"}],\"author\":{\"name\":\"Greg Olszewski\",\"login\":\"gno\",\"email\":\"gno@gropeep.org\"},\"url\":\"/lloyd/yajl/commit/7852c0a1970b67c22b7b7bfeb29095bcc21ca12f\",\"id\":\"7852c0a1970b67c22b7b7bfeb29095bcc21ca12f\",\"committed_date\":\"2011-04-20T14:24:19-07:00\",\"authored_date\":\"2010-10-17T17:05:01-07:00\",\"message\":\"o closes #5 - replace strtol with own implementation, uses pascal strings.\\no issue #6 - check a few malloc error cases.\\n\\nSigned-off-by: Lloyd Hilaiel \",\"tree\":\"6c5ee341a57ddc31ea920eae720083d50b55436c\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"9b88b94429985a8579161ea99754cfa5e66a54bb\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/986516e15b7b331a19fe317e2c828c5352d5b72e\",\"id\":\"986516e15b7b331a19fe317e2c828c5352d5b72e\",\"committed_date\":\"2011-04-20T11:22:50-07:00\",\"authored_date\":\"2011-04-20T11:22:50-07:00\",\"message\":\"add a test case which demonstrates how new parsing configuration in yajl 2.x closes #7\",\"tree\":\"274bf0c359ff4a30cc913c8614beed0b68ef615e\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"888d390f4e3642f2bafff7e5489810cc695843d1\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/9b88b94429985a8579161ea99754cfa5e66a54bb\",\"id\":\"9b88b94429985a8579161ea99754cfa5e66a54bb\",\"committed_date\":\"2011-04-20T11:20:45-07:00\",\"authored_date\":\"2011-04-20T11:20:45-07:00\",\"message\":\"fixes to testing system. allowGarbage is misnamed, it actually means *forbid* garbage\",\"tree\":\"6a165f8af10271b6b3605ef9a78bc6d88a73184a\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"ecd8008a32677f4d03f8c9231ece27732a248404\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/888d390f4e3642f2bafff7e5489810cc695843d1\",\"id\":\"888d390f4e3642f2bafff7e5489810cc695843d1\",\"committed_date\":\"2011-04-20T11:08:15-07:00\",\"authored_date\":\"2011-04-20T11:08:15-07:00\",\"message\":\"add a missing test case - multiple integers in a stream\",\"tree\":\"206438ff65252b1a77e4301688ce025cabf13c70\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"b9e91a37f7132bf7f5b91de895b766db06ae3072\"}],\"author\":{\"name\":\"Conrad Irwin\",\"login\":\"ConradIrwin\",\"email\":\"conrad.irwin@gmail.com\"},\"url\":\"/lloyd/yajl/commit/ecd8008a32677f4d03f8c9231ece27732a248404\",\"id\":\"ecd8008a32677f4d03f8c9231ece27732a248404\",\"committed_date\":\"2011-04-20T10:17:40-07:00\",\"authored_date\":\"2011-03-19T18:32:21-07:00\",\"message\":\"Parse null bytes correctly.\\n\\nSigned-off-by: Lloyd Hilaiel \",\"tree\":\"f88244c16383ca4377e9cbadc4e5a7fb0ab1324a\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"dc206cf75b8489b4cdcc8ff0cdbe94cbcc61a551\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/b9e91a37f7132bf7f5b91de895b766db06ae3072\",\"id\":\"b9e91a37f7132bf7f5b91de895b76", +"6db06ae3072\",\"committed_date\":\"2011-04-20T09:41:14-07:00\",\"authored_date\":\"2011-04-20T09:41:14-07:00\",\"message\":\"o rework yajl api\\n - remove yajl_status_parse_incomplete, replace with three\\n flag settings\\n - yajl_allow_multiple_values\\n - yajl_forbid_trailing_garbage\\n - yajl_forbid_partial_values\\n\\n In the new model, callers must consistently call yajl_parse_complete\\n and check it's return. Two new parse errors have been introduced:\\n \\\"premature EOF\\\" and \\\"trailing garbage\\\".\\n\\n yajl_test.c demonstrates the simplifying effect on calling code.\\n\\n adds 3 flags to yajl_test\\n -g forbids trailing garbage\\n -p forbids partial values\\n -m allows multiple values to be parsed.\\n\\n and complementary tests.\\n\\nlth: Addresses the majority of issue #24. gno is awesomesauce.\\n\\nSigned-off-by: Lloyd Hilaiel \",\"tree\":\"a2f006d686e40502ebc74be858992db52ba2204b\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"1ecfbc0b3458420feba033cd2c25a4f5e9bac0b4\"},{\"id\":\"49116c941312b78ca6768b916fd0d247147f1f47\"}],\"author\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"},\"url\":\"/lloyd/yajl/commit/dc206cf75b8489b4cdcc8ff0cdbe94cbcc61a551\",\"id\":\"dc206cf75b8489b4cdcc8ff0cdbe94cbcc61a551\",\"committed_date\":\"2011-04-20T09:27:46-07:00\",\"authored_date\":\"2011-04-20T09:27:46-07:00\",\"message\":\"Merge branch 'master' into 2.x\",\"tree\":\"e9d6f3873dfe530e11009bbf0fa1e858f27d968b\",\"committer\":{\"name\":\"Lloyd Hilaiel\",\"login\":\"lloyd\",\"email\":\"lloyd@hilaiel.com\"}},{\"parents\":[{\"id\":\"0d9e3589bc8d59ce963937587f634c8c9cc61643\"}],\"author\":{\"name\":\"Mirek Rusin\",\"login\":\"mirek\",\"email\":\"mirek@me.com\"},\"url\":\"/lloyd/yajl/commit/49116c941312b78ca6768b916fd0d247147f1f47\",\"id\":\"49116c941312b78ca6768b916fd0d247147f1f47\",\"committed_date\":\"2011-04-19T04:46:52-07:00\",\"authored_date\":\"2011-04-19T04:46:52-07:00\",\"message\":\"LLVM warnings\",\"tree\":\"57eac7400e476299277490f9253e059e4d00085b\",\"committer\":{\"name\":\"Mirek Rusin\",\"login\":\"mirek\",\"email\":\"mirek@me.com\"}}]}", +NULL +}; + +const char ** g_documents[] = { + doc1, + doc2, + doc3, + NULL +}; + +int num_docs(void) +{ + int i = 0; + for (i=0;g_documents[i];i++); + return i; +} + +const char ** get_doc(int i) +{ + return g_documents[i]; +} + +unsigned int doc_size(int i) +{ + int sz = 0; + const char ** p = get_doc(i); + do { sz += strlen(*p); } while(*(++p)); + return sz; +} diff --git a/perf/documents.h b/perf/documents.h new file mode 100644 index 0000000..1e08f85 --- /dev/null +++ b/perf/documents.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2007-2011, Lloyd Hilaiel + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef __DOCUMENTS_H__ +#define __DOCUMENTS_H__ + +/* a header that provides access to several json documents broken into chunks of + * less than 4k, cause C99 says that's what we should do and YAJL likes streams */ + +extern const char ** g_documents[]; +int num_docs(void); +const char ** get_doc(int i); +unsigned int doc_size(int i); + +#endif diff --git a/perf/perftest.c b/perf/perftest.c new file mode 100644 index 0000000..ff0ccdb --- /dev/null +++ b/perf/perftest.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2007-2011, Lloyd Hilaiel + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include "documents.h" + +/* a platform specific defn' of a function to get a high res time in a + * portable format */ +#ifndef WIN32 +#include +static double mygettime(void) { + struct timeval now; + gettimeofday(&now, NULL); + return now.tv_sec + (now.tv_usec / 1000000.0); +} +#else +#define _WIN32 1 +#include +static double mygettime(void) { + long long tval; + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + tval = ft.dwHighDateTime; + tval <<=32; + tval |= ft.dwLowDateTime; + return tval / 10000000.00; +} +#endif + +#define PARSE_TIME_SECS 3 + +static int +error_callback(jsonsl_t jsn, jsonsl_error_t err, struct jsonsl_state_st *state, + char *at) +{ + fprintf(stderr, "Got error %s at pos %lu (remaining: %s)\n", + jsonsl_strerror(err), jsn->pos, at); + abort(); +} + +static int +run(int validate_utf8) +{ + long long times = 0; + double starttime; + + starttime = mygettime(); + jsonsl_t jsn = jsonsl_new(512); + jsn->error_callback = error_callback; + + /* allocate a parser */ + for (;;) { + int i; + { + double now = mygettime(); + if (now - starttime >= PARSE_TIME_SECS) break; + } + for (i = 0; i < 100; i++) { + const char ** d; + jsonsl_reset(jsn); + for (d = get_doc(times % num_docs()); *d; d++) { + jsonsl_feed(jsn, (char *) *d, strlen(*d)); + } + times++; + } + } + jsonsl_destroy(jsn); + + /* parsed doc 'times' times */ + { + double throughput; + double now; + const char * all_units[] = { "B/s", "KB/s", "MB/s", (char *) 0 }; + const char ** units = all_units; + int i, avg_doc_size = 0; + + now = mygettime(); + + for (i = 0; i < num_docs(); i++) avg_doc_size += doc_size(i); + avg_doc_size /= num_docs(); + + throughput = (times * avg_doc_size) / (now - starttime); + + while (*(units + 1) && throughput > 1024) { + throughput /= 1024; + units++; + } + + printf("Parsing speed: %g %s\n", throughput, *units); + } + + return 0; +} + +int +main(void) +{ + int rv = 0; + + printf("-- speed tests determine parsing throughput given %d different sample documents --\n", + num_docs()); + + printf("Without UTF8 validation:\n"); + rv = run(0); + jsonsl_dump_global_metrics(); + return rv; +} + diff --git a/srcutil/genchartables.pl b/srcutil/genchartables.pl index a4bf157..80feb17 100755 --- a/srcutil/genchartables.pl +++ b/srcutil/genchartables.pl @@ -60,6 +60,9 @@ ('"', '\\', '/', 'b', 'f', 'n', 'r', 't', 'u'); } +my @string_passthrough; +$string_passthrough[ord($_)] = 1 for ('\\','"'); +$string_passthrough[$_] = 1 for (0..19); ################################################################################ ################################################################################ @@ -74,7 +77,8 @@ special_body => [undef, \@special_body ], whitespace => [ undef, \@wstable ], unescapes => [undef, \@unescapes], - allowed_escapes => [ undef, \@allowed_escapes] + allowed_escapes => [ undef, \@allowed_escapes], + string_passthrough => [ undef, \@string_passthrough ] ); my $Table; @@ -82,7 +86,7 @@ while (my ($optname,$optarry) = each %HMap) { $opthash{$optname} = \$optarry->[0]; } -GetOptions(%opthash); +GetOptions(%opthash, escape_newlines => \my $EscapeNewlines); while (my ($k,$v) = each %HMap) { if ($v->[0]) { @@ -284,7 +288,11 @@ sub add_special { foreach my $line (@lines) { my $items = $line->{items}; if (@$items) { - printf("/* 0x%02x */ %s, /* 0x%02x */\n", + printf("/* 0x%02x */ %s, /* 0x%02x */", $line->{begin}, join(",", @$items), $line->{end}); + if ($EscapeNewlines) { + print " \\"; + } + print "\n"; } } diff --git a/tests/Makefile b/tests/Makefile index ecd0db8..7564c93 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -7,6 +7,8 @@ all: $(TESTMODS) ./json_test ../share/jsc/pass*.json JSONSL_FAIL_TESTS=1 ./json_test ../share/jsc/fail*.json @echo "All Tests OK" + @echo "These files were skipped. See tests/jsc/nyi_fail for more info" + @ls ../share/jsc/nyi_fail/ %: %.c $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)