rjson/0000755000176000001440000000000012207040627011435 5ustar ripleyusersrjson/inst/0000755000176000001440000000000012207035610012406 5ustar ripleyusersrjson/inst/rpc_server/0000755000176000001440000000000012207035602014561 5ustar ripleyusersrjson/inst/rpc_server/start_server0000744000176000001440000000043312207035602017230 0ustar ripleyusers#!/bin/bash #R reads in R_PROFILE first - which will start up the server.r script, which then sources in anything from R_SERVER_SOURCE #R_SERVER_SOURCE is a colon delimited list of user source files to read in export R_PROFILE=server.r export R_SERVER_SOURCE=$1 r --slave --silent rjson/inst/rpc_server/server.r0000744000176000001440000000464612207035602016265 0ustar ripleyusers#!/usr/bin/r --slave library( "rjson" ) library( "utils" ) #load in any extra sources source_files <- Sys.getenv( "R_SERVER_SOURCE" ) if( source_files != "" ) { source_files <- strsplit( source_files, ":" )[[1]] for( s in source_files ) source( s ) } #rpc is an R object corresponding to the parsed JSON-RPC call #returns: a JSON string with the results or error do.rpc <- function( rpc ) { rpc$params <- as.list( rpc$params ) result <- try( do.call( rpc$method, rpc$params ), silent = TRUE ) if( class( result ) == "try-error" ) { #TODO JSON-RPC defines several erorrs (call not found, invalid params, and server error) #if a call exists but fails, I am sending a procedure not found - when really it was found #but had an internal error. the data contains the actual error from R rpc_result <- list( jsonrpc = "2.0", error = list( code = -32601, message = "Procedure not found.", data = as.character( result ) ), id = rpc$id ) } else { #RPC call suceeded rpc_result <- list( jsonrpc = "2.0", result = result, id = rpc$id ) } #return the JSON string ret <- toJSON( rpc_result ) ret <- paste( ret, "\n", sep="" ) return( ret ) } #requires R 2.5.0 process_stdin <- file("stdin", blocking = T, open = "rb" ) json_parser <- newJSONParser() while( TRUE ) { #TODO read in data in larger chunks #when n > 1, readBin sometimes waits until a complete block of n chars is read - piping a flush doesn't always work when n > 1 s <- readBin( process_stdin, what = raw(), n = 1 ) #catch an OEF if( length( s ) == 0 ) break s <- rawToChar( s ) #add input to parser buffer json_parser$addData( s ) #Optimization: JSON RPC objects MUST terminate with a `}' - no need to check if the object can be parsed otherwise (since it can't) while( s == "}" ) { #try to extract any JSON objects rpc <- try( json_parser$getObject(), silent = TRUE ) if( class( rpc ) == "try-error" ) { #an error occured cat( '{"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}' ) #reset JSON parser json_parser <- newJSONParser() #clear anything on the input seek( process_stdin, where = 0, origin = "end" ) } else { #not enough data is in the buffer to extract a complete JSON object if( is.null( rpc ) ) break #a valid JSON object was extracted ret <- do.rpc( rpc ) cat( ret ) } } } #must quit here - otherwise, we get dropped into an R shell q() rjson/inst/rpc_server/start_server.bat0000744000176000001440000000046312207035602020000 0ustar ripleyusers#R reads in R_PROFILE first - which will start up the server.r script, which then sources in anything from R_SERVER_SOURCE #R_SERVER_SOURCE is a colon delimited list of user source files to read in set R_PROFILE=server.r set R_SERVER_SOURCE=%1 set Path=.;C:\Program Files\R\R-2.9.0\bin\ r --slave --silent rjson/inst/rpc_server/some_script.r0000744000176000001440000000030712207035602017274 0ustar ripleyusersrequire( "stats", quietly = TRUE ) user_func <- function( times ) { rep( "I am made of sugar", times ) } fib <- function( n ) { if( n < 2 ) return( 1 ) return( fib( n - 1 ) + fib( n - 2 ) ) } rjson/inst/unittests/0000755000176000001440000000000012207035602014451 5ustar ripleyusersrjson/inst/unittests/test.number.r0000744000176000001440000000167612207035602017115 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.number <- function() { json <- "0" x <- fromJSON( json ) checkIdentical( x, 0 ) json <- "-0" x <- fromJSON( json ) checkIdentical( x, 0 ) json <- "15.05" x <- fromJSON( json ) checkIdentical( x, 15.05 ) json <- "-10.3" x <- fromJSON( json ) checkIdentical( x, -10.3 ) json <- "-0.3" x <- fromJSON( json ) checkIdentical( x, -0.3 ) #TODO this is actually invalid JSON json <- "-.3" x <- fromJSON( json ) checkIdentical( x, -0.3 ) json <- "0.3e3" x <- fromJSON( json ) checkIdentical( x, 300 ) json <- "0.2e+4" x <- fromJSON( json ) checkIdentical( x, 2000 ) json <- "0.1e-4" x <- fromJSON( json ) checkIdentical( x, 0.00001 ) #TODO this should fail json <- "0.1e-4.5" x <- fromJSON( json ) checkIdentical( x, 0 ) #TODO this should fail json <- "0.1e" x <- fromJSON( json ) checkIdentical( x, 0 ) } rjson/inst/unittests/test.tojson.r0000744000176000001440000000435512207035602017136 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.tojson <- function() { x <- 15433 j <- toJSON( x, "C" ) checkIdentical( j, "15433" ) x <- 15.543 j <- toJSON( x, "C" ) checkIdentical( j, "15.543" ) x <- TRUE j <- toJSON( x, "C" ) checkIdentical( j, "true" ) x <- FALSE j <- toJSON( x, "C" ) checkIdentical( j, "false" ) x <- NULL j <- toJSON( x, "C" ) checkIdentical( j, "null" ) #Test strings x <- "hello" j <- toJSON( x, "C" ) checkIdentical( j, "\"hello\"" ) x <- "hel\"lo" j <- toJSON( x, "C" ) checkIdentical( j, "\"hel\\\"lo\"" ) x <- "hel\n" j <- toJSON( x, "C" ) checkIdentical( j, "\"hel\\n\"" ) x <- "\n\r\t" j <- toJSON( x, "C" ) checkIdentical( j, "\"\\n\\r\\t\"" ) x <- "" j <- toJSON( x, "C" ) checkIdentical( j, "\"\"" ) x <- "\u0041\u006c\u0065\u0078\u002B" j <- toJSON( x, "C" ) checkIdentical( j, "\"Alex+\"" ) x <- "\u018E" j <- toJSON( x, "C" ) checkIdentical( j, "\"\\u018e\"" ) x <- "\u3020" j <- toJSON( x, "C" ) checkIdentical( j, "\"\\u3020\"" ) #test arrays x <- c(10, 50, 30) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,30]" ) x <- list(10, 50, 30) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,30]" ) x <- list(10, 50, TRUE) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,true]" ) x <- list(10, 50, list()) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,[]]" ) x <- list(10, 50, NULL) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,null]" ) x <- list() j <- toJSON( x, "C" ) checkIdentical( j, "[]" ) x <- c(T,T,F,F,T,F) j <- toJSON( x, "C" ) checkIdentical( j, "[true,true,false,false,true,false]" ) #test dicts x <- list(key="value") j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":\"value\"}" ) x <- c(key="value") j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":\"value\"}" ) x <- c(key=TRUE, car=FALSE) j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":true,\"car\":false}" ) x <- list(key=TRUE, car=FALSE, apple=c(10.5, 28)) j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":true,\"car\":false,\"apple\":[10.5,28]}" ) x <- c(a=T,b=F) j <- toJSON( x, "C" ) checkIdentical( j, "{\"a\":true,\"b\":false}" ) } rjson/inst/unittests/test.list.r0000744000176000001440000000203012207035602016561 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.list <- function() { json <- "{}" x <- fromJSON( json ) checkIdentical( x, list() ) failing_json <- c( "{", "{a:5}", "{\"a:5}", "{\"a\":", "{\"a\":5", "{\"a\":}", "{123:false}", "{\"a\":unquoted}" ) for( bad_json in failing_json ) { x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } json <- "{\"a\":5}" x <- fromJSON( json ) checkIdentical( x, list( a = 5 ) ) json <- "{\"a\":5,\"b\":10}" x <- fromJSON( json ) checkIdentical( x, list( a = 5, b = 10 ) ) json <- "{\"a\":5,\"b\":10, \"clap\":[true,false,false]}" x <- fromJSON( json ) correct <- list( a = 5, b = 10, clap = c(TRUE,FALSE,FALSE) ) checkIdentical( x, correct ) checkIdentical( x[["clap"]], correct[["clap"]] ) } test.nestedlist <- function() { json <- "[\"a\", [\"b\", \"c\"] ]" x <- fromJSON( json ) correct <- list( "a", c( "b", "c" ) ) checkIdentical( x, correct ) checkIdentical( x[[2]], correct[[2]] ) } rjson/inst/unittests/test.strings.r0000744000176000001440000000111612207035602017303 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.strings <- function() { json <- "\"\"" x <- fromJSON( json ) checkIdentical( x, "" ) json <- "\"hello world\"" x <- fromJSON( json ) checkIdentical( x, "hello world" ) json <- "\"hello\\ttab\"" x <- fromJSON( json ) checkIdentical( x, "hello\ttab" ) json <- "\"hello\\\"quote\"" x <- fromJSON( json ) checkIdentical( x, "hello\"quote" ) #really long string s <- paste( 1:100000, collapse = "-" ) json <- paste("\"", s, "\"", sep="" ) x <- fromJSON( json ) checkIdentical( x, s ) } rjson/inst/unittests/test.twitter.r0000744000176000001440000002134512207035602017322 0ustar ripleyusers test.twitter <- function() { x <- "{\"results\":[{\"profile_image_url\":\"http://a1.twimg.com/profile_images/904661361/IMG00034-20100515-1550_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:21 +0000\",\"from_user\":\"YOtwittaDADDY\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"#random no basic bitch is safe on twitter! If I dont get you and tear you apart, @heartless_dex or @chefhomeboyjd will\",\"id\":20267740998,\"from_user_id\":108000717,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://mobile.twitter.com" rel="nofollow">Mobile Web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/839850446/n835436_43297164_3982_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:20 +0000\",\"from_user\":\"vmsweet123\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"RT @richard_solo: Giveaway thru: 8/09. Win RichardSolo Noise Canceling Headphones. Follow @Richard_Solo & retweet http://bit.ly/bD8ezA\",\"id\":20267739854,\"from_user_id\":12289632,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/430611695/sm_profile_square_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:20 +0000\",\"from_user\":\"ScottMcLemore\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":85038,\"text\":\"@alevin Thanks also for all the insight tonight! Trying to DM you but it says you're not following me. What's your other twitter name?\",\"id\":20267739573,\"from_user_id\":2032996,\"to_user\":\"alevin\",\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://www.tweetdeck.com/" rel="nofollow">TweetDeck</a>\"},{\"profile_image_url\":\"http://a0.twimg.com/profile_images/1083435260/black_rock_ramona_normal.png\",\"created_at\":\"Wed, 04 Aug 2010 01:45:18 +0000\",\"from_user\":\"zetacoes\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":70577019,\"text\":\"@xjazzy13 http://twitter.com/zetacoes/status/20254842627\",\"id\":20267738141,\"from_user_id\":1876460,\"to_user\":\"xJazzy13\",\"geo\":null,\"source\":\"<a href="http://www.echofon.com/" rel="nofollow">Echofon</a>\"},{\"profile_image_url\":\"http://a1.twimg.com/profile_images/350332457/110542_332748125_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:18 +0000\",\"from_user\":\"pepotan\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"\\u30de\\u30af\\u30c9\\u3082\\u3001twitter\\uff0b\\u30d6\\u30e9\\u30a6\\u30b6\\u30b2\\u30fc\\u3067\\u3001\\u30d7\\u30ed\\u30e2\\u3002 \\u30b3\\u30f3\\u30c6\\u30f3\\u30c4\\u306e\\u5185\\u5bb9\\u306f\\u3044\\u307e\\u3044\\u3061\\u3060\\u3051\\u3069\\u3001\\u5e83\\u544a\\u4ee3\\u7406\\u5e97\\u3068\\u5236\\u4f5c\\u4f1a\\u793e\\u304c\\u5132\\u304b\\u308b\\u4ed5\\u7d44\\u307f\\uff57 http://bit.ly/dtfwgs #McD_ckn\",\"id\":20267737693,\"from_user_id\":7864312,\"geo\":null,\"iso_language_code\":\"ja\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/946831163/113082922_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:18 +0000\",\"from_user\":\"d_davidshi\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"HIT - HOW DO YOU GET 100 FREE TWITTER FOLLOWERS? http://tinyurl.com/32n9eda\",\"id\":20267737116,\"from_user_id\":82204650,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://dev.twitter.com/" rel="nofollow">API</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/387119699/Picture_or_Video_002_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:17 +0000\",\"from_user\":\"aestrap\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Whoa! The twitter site changed on my phone.\",\"id\":20267736765,\"from_user_id\":2258787,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://mobile.twitter.com" rel="nofollow">Mobile Web</a>\"},{\"profile_image_url\":\"http://a1.twimg.com/profile_images/1070967993/J_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:17 +0000\",\"from_user\":\"jinnli\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":2408767,\"text\":\"@chrisoul \\u6628\\u5929\\u4e0a\\u6d77\\u65b9\\u9762\\u6765\\u62a5\\uff0cTwitter.com \\u7684\\u57df\\u540d\\u4e5f\\u89e3\\u5c01\\u4e86\\uff08\\u4f46\\u662f\\u6709\\u5927\\u90e8\\u5206IP\\u6254\\u5728\\u5c01\\uff09\\u3002\",\"id\":20267736571,\"from_user_id\":3150412,\"to_user\":\"chrisoul\",\"geo\":null,\"iso_language_code\":\"zh\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a1.twimg.com/profile_images/1077123381/20100714_000933_140_normal.gif\",\"created_at\":\"Wed, 04 Aug 2010 01:45:16 +0000\",\"from_user\":\"keshasuja\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"RT se Raul Gil acaba de visitar seu twitter - "Twitter is over capacity." - Minha baleia \\u00e9 MACHO (:\",\"id\":20267735081,\"from_user_id\":103469135,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a0.twimg.com/profile_images/1094336724/twitter_icon_from_annie_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"ColtChambers\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":108642403,\"text\":\"@shawnmock132 they dont have twitter\",\"id\":20267732425,\"from_user_id\":34795175,\"to_user\":\"shawnmock132\",\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1078874562/Foto_47_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"Sjoerd\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":16735834,\"text\":\"@Jarlrule @mitsuo @wilbertleering @zapache @ock12 @ehpo @henneaux no 4square!! SMS Twitter en #ichannel... Vanuit een dampend kroatie\",\"id\":20267732273,\"from_user_id\":905717,\"to_user\":\"Jarlrule\",\"geo\":{\"type\":\"Point\",\"coordinates\":[44.1138,15.2333]},\"iso_language_code\":\"nl\",\"source\":\"<a href="http://twitter.com/" rel="nofollow">Twitter for iPhone</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/576571611/Smoked_Tacos_2_jpg_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"creep4ward\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Giveaway thru: 8/09. Win RichardSolo Noise Canceling Headphones. Follow @Richard_Solo & retweet http://bit.ly/bD8ezA\",\"id\":20267732038,\"from_user_id\":85290503,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1005104638/Picture_310re_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"LADiixBANKS\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Ahhhh so matt finally got yu on the waveee! Lol RT @RitzNOCrackers: @myniggaLIP . ----> @LADiixBANKS guess who has a twitter JIMMY LMAO\",\"id\":20267731542,\"from_user_id\":23608569,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://seesmic.com/seesmic_mobile/android/" rel="nofollow">Seesmic for Android</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1093270058/never_let_you_go3_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:11 +0000\",\"from_user\":\"DenverBeliebers\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"getting off twitter!!!\",\"id\":20267729271,\"from_user_id\":80666587,\"geo\":null,\"iso_language_code\":\"no\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1094119234/image_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:10 +0000\",\"from_user\":\"overDRESSed_1\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Omg!!!!!! Twitter for iPhone won't work on my phone!!!!!! Having a meltdown!!!!\",\"id\":20267728785,\"from_user_id\":53192938,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://www.echofon.com/" rel="nofollow">Echofon</a>\"}],\"max_id\":20267740998,\"since_id\":0,\"refresh_url\":\"?since_id=20267740998&q=twitter\",\"next_page\":\"?page=2&max_id=20267740998&q=twitter\",\"results_per_page\":15,\"page\":1,\"completed_in\":0.017069,\"query\":\"twitter\"}" jdata <- fromJSON( x ) checkTrue( is.list( jdata ) ) } rjson/inst/unittests/test.factors.r0000744000176000001440000000033512207035602017255 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.factors <- function() { x <- as.factor(c("abc", "abc", "dog", "abc")) json <- toJSON( x ) checkIdentical( json, "[\"abc\",\"abc\",\"dog\",\"abc\"]" ) } rjson/inst/unittests/runtests.r0000744000176000001440000000035712207035602016531 0ustar ripleyuserslibrary( rjson ) library( RUnit ) path <- system.file( "unittests", package="rjson" ) test.suite <- defineTestSuite( "json unittests", dirs = path, testFileRegexp = "^test\\..*\\.[rR]$" ) runTestSuite( test.suite, verbose = 100 ) rjson/inst/unittests/test.unicode.r0000744000176000001440000000206212207035602017241 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.unicode <- function() { json <- "\"\"" x <- fromJSON( json ) checkIdentical( x, "" ) #test ASCII compatible utf8 json <- "\"\\u0041\\u006c\\u0065\\u0078\\u002B\"" x <- fromJSON( json ) checkIdentical( x, "Alex+", paste( "got:", x ) ) #test 2 byte utf8 unicode json <- "\"\\u018E\"" x <- fromJSON( json ) checkIdentical( x, "\u018E" ) checkTrue( all( charToRaw( x ) == c( 0xc6, 0x8e ) ) ) checkTrue( length( charToRaw( x ) ) == 2 ) #test 2 byte utf8 unicode json <- "\"\\u018E\"" x <- fromJSON( json ) checkIdentical( x, "\u018E" ) checkTrue( all( charToRaw( x ) == c( 0xc6, 0x8e ) ) ) checkTrue( length( charToRaw( x ) ) == 2 ) #test 3 byte utf8 unicode json <- "\"\\u3020\"" x <- fromJSON( json ) checkIdentical( x, "\u3020" ) checkTrue( all( charToRaw( x ) == c( 0xe3, 0x80, 0xa0 ) ) ) checkTrue( length( charToRaw( x ) ) == 3 ) #x = newJSONParser() #x$addData( "\"\\u00" ) #checkTrue( is.null( x$getObject() ) ) #should be incomplete } rjson/inst/unittests/test.big.r0000744000176000001440000022701412207035602016362 0ustar ripleyusers test.big <- function() { x <- "{\"client_crash_date\": \"2011-03-07 05:13:12.0\", \"dump\": \"OS|Windows NT|5.1.2600 Service Pack 3\\nCPU|x86|GenuineIntel family 15 model 4 stepping 9|1\\nCrash|EXCEPTION_BREAKPOINT|0x7d1a39|35\\nModule|mozsqlite3.dll|3.7.4.0|mozsqlite3.pdb|CCD45CF588204B1A8CEF6FECB6B93E792|0x002f0000|0x003adfff|1\\nModule|nspr4.dll|4.8.7.0|nspr4.pdb|FDA5820F749843EC874389EAB4E93BE31|0x003b0000|0x003e0fff|0\\nModule|plc4.dll|4.8.7.0|plc4.pdb|D597300208DE4FC280BF6EE27D65B2CA1|0x003f0000|0x003f6fff|0\\nModule|firefox.exe|2.0.0.4070|firefox.pdb|C4A306AC5FEF4AEC8C1D4B5FB67AC5962|0x00400000|0x004dffff|0\\nModule|mozjs.dll||mozjs.pdb|52A98E4CEEFF4B49B3CCFB5F982EEB502|0x004e0000|0x006a9fff|0\\nModule|smime3.dll|3.12.9.0|smime3.pdb|C4A927FA7F2C40F2A4CE92ECFD85AB8F1|0x006b0000|0x006c7fff|0\\nModule|nss3.dll|3.12.9.0|nss3.pdb|2BA2153B4E9B4E9584B1607C74B49D731|0x006d0000|0x0076cfff|0\\nModule|nssutil3.dll|3.12.9.0|nssutil3.pdb|8AF09479D67149F49A1D6A449114A7151|0x00770000|0x00783fff|0\\nModule|plds4.dll|4.8.7.0|plds4.pdb|E415FC709E07498198C66014653CC5411|0x00790000|0x00796fff|0\\nModule|ssl3.dll|3.12.9.0|ssl3.pdb|24D906A8F8A0487591D3824EED19DFC41|0x007a0000|0x007c0fff|0\\nModule|mozalloc.dll|2.0.0.4070|mozalloc.pdb|584764FC91694A68BFB321843787472E2|0x007d0000|0x007d5fff|0\\nModule|xpcom.dll|2.0.0.4070|xpcom.pdb|8DF06173F9764BA1B96E8137AC7D8B952|0x007e0000|0x007e6fff|0\\nModule|Iminent.WinCore.dll|3.47.0.0|||0x012e0000|0x012edfff|0\\nModule|browsercomps.dll|2.0.0.4070|browsercomps.pdb|ECF64DE0EC534626B0A3463F506FB4172|0x02800000|0x02820fff|0\\nModule|F3HKSTUB.DLL|1.0.0.0|f3hkstub.pdb|4C75A6EB1|0x02920000|0x02925fff|0\\nModule|RadioWMPCore.dll||RadioWMPCore.pdb|165E7A3FF5404CF28E6E55658F2466D51|0x02a30000|0x02a4afff|0\\nModule|softokn3.dll|3.12.9.0|softokn3.pdb|F43E2E3D6CE54276B054B916557C99301|0x03600000|0x03626fff|0\\nModule|nssdbm3.dll|3.12.9.0|nssdbm3.pdb|671501D946A64CF7A375B506033131F01|0x03630000|0x03647fff|0\\nModule|freebl3.dll|3.12.9.0|freebl3.pdb|0716E0E00A644CC09C0070C3966B0F961|0x03650000|0x03693fff|0\\nModule|nssckbi.dll|1.81.0.0|nssckbi.pdb|FF4BEC1F2A1D4069BF727A4088E5FEC71|0x036a0000|0x036f1fff|0\\nModule|xpsp2res.dll|5.1.2600.5512|||0x03900000|0x03bd5fff|0\\nModule|NPMYWEBS.DLL|1.0.0.0|NPMyWebS.pdb|4C75A6D41|0x05b60000|0x05b65fff|0\\nModule|M3PLUGIN.DLL|1.1.0.6|m3Plugin.pdb|4C75A6D81|0x05b70000|0x05b7dfff|0\\nModule|MWSOESTB.DLL|1.2.4.0|mwsoestb.pdb|4B2AF61A1|0x07f50000|0x07f5afff|0\\nModule|normaliz.dll|6.0.5441.0|normaliz.pdb|D0658E322B2D4DDCA57FB9C9715C6CAD1|0x094e0000|0x094e8fff|0\\nModule|xul.dll|2.0.0.4070|xul.pdb|EAD6C11B057D423D976392142725A5382|0x10000000|0x10daefff|0\\nModule|mdnsNSP.dll|1.0.3.1|mdnsNSP.pdb|0AF2F131804446D8BC574BC39DEF79F91|0x16080000|0x16098fff|0\\nModule|netapi32.dll|5.1.2600.5512|netapi32.pdb|FB9EEF3B11C949BA95FBD378260A07B02|0x597f0000|0x59844fff|0\\nModule|uxtheme.dll|6.0.2900.5512|uxtheme.pdb|E99E16308F094767B1F07FB5C3E5E2462|0x5b150000|0x5b187fff|0\\nModule|dbghelp.dll|5.1.2600.5512|dbghelp.pdb|7FA1C63A9BF54470BCA31E35A94F49971|0x5d4b0000|0x5d550fff|0\\nModule|iertutil.dll|7.0.5730.13|iertutil.pdb|EE4D411A91474AA79C2966293E0B73DA2|0x5dca0000|0x5dce4fff|0\\nModule|snxhk.dll|5.1.889.0|snxhk.pdb|6C3E58D898DF46A0BD5CDC2E19CD87DA1|0x64d00000|0x64d30fff|0\\nModule|hnetcfg.dll|5.1.2600.5512|HNetCfg.pdb|87332C2BFF6E42FCB89784A1D24EC2711|0x66740000|0x66798fff|0\\nModule|rsaenh.dll|5.1.2600.5507|rsaenh.pdb|893323FC16E048E8943A01E789A49C9B1|0x68000000|0x68035fff|0\\nModule|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x68040000|0x68300fff|0\\nModule|feclient.dll|5.1.2600.5512|feclient.pdb|D063E98372D14444BE0B1ECEABF191271|0x698d0000|0x698d8fff|0\\nModule|mswsock.dll|5.1.2600.5512|mswsock.pdb|0BC563E52F9E43E49E074DA97D4171712|0x719d0000|0x71a0ffff|0\\nModule|wshtcpip.dll|5.1.2600.5512|wshtcpip.pdb|DE2E52603FFB406D9052C8D884A1AD722|0x71a10000|0x71a17fff|0\\nModule|ws2help.dll|5.1.2600.5512|ws2help.pdb|6049CF5877C54E2AB512ABC1B4B2E7992|0x71a20000|0x71a27fff|0\\nModule|ws2_32.dll|5.1.2600.5512|ws2_32.pdb|A7605F8695A34329B38DDB8421A004CA2|0x71a30000|0x71a46fff|0\\nModule|wsock32.dll|5.1.2600.5512|wsock32.pdb|2B38FE8F84144DACB8A4FD07C05E49FC2|0x71a50000|0x71a59fff|0\\nModule|mpr.dll|5.1.2600.5512|mpr.pdb|A9B542306C364AA2BAF25EFE9F3C2B5A2|0x71aa0000|0x71ab1fff|0\\nModule|samlib.dll|5.1.2600.5512|samlib.pdb|4BB85DE79B104F1595F96DF1ADAC91C82|0x71b90000|0x71ba2fff|0\\nModule|msacm32.drv|5.1.2600.0|msacm32.pdb|3B7D82B51|0x72c90000|0x72c97fff|0\\nModule|wdmaud.drv|5.1.2600.5512|wdmdrv.pdb|CC3EC71E05C44E6595271A6773E15AF21|0x72ca0000|0x72ca8fff|0\\nModule|winspool.drv|5.1.2600.5512|winspool.pdb|5199B63B39904A05A517CEE5158071522|0x72f80000|0x72fa5fff|0\\nModule|vbscript.dll|5.7.0.16599|vbscript.pdb|22EE02E44C844093937E481AF7C079C12|0x73280000|0x732e9fff|0\\nModule|mscms.dll|5.1.2600.5512|mscms.pdb|58640C648DA24D56912927158414FA8C2|0x73ab0000|0x73ac4fff|0\\nModule|t2embed.dll|5.1.2600.5512|t2embed.pdb|731403DF32C24A29AFB4DC3D4825E4411|0x73c60000|0x73c7ffff|0\\nModule|lz32.dll|5.1.2600.0|lz32.pdb|3B7D84BD1|0x73d40000|0x73d42fff|0\\nModule|MSCTF.dll|5.1.2600.5512|msctf.pdb|C52F0B4C00E94556AE999F228B0019662|0x746b0000|0x746fbfff|0\\nModule|usp10.dll|1.420.2600.5512|usp10.pdb|0F289BC0C9A94139BC1C31EDEDBF52311|0x74d20000|0x74d8afff|0\\nModule|MSCTFIME.IME|5.1.2600.5512|msctfime.pdb|602288883AF44453979369233E091E641|0x75160000|0x7518dfff|0\\nModule|msimg32.dll|5.1.2600.5512|msimg32.pdb|D2E18526D8234F4BB5A85DE12E71DE812|0x76330000|0x76334fff|0\\nModule|imm32.dll|5.1.2600.5512|imm32.pdb|F7A5B5DB13324153B57AAF340C77EA512|0x76340000|0x7635cfff|0\\nModule|comdlg32.dll|6.0.2900.5512|comdlg32.pdb|026A6FF770FD4E6186ADBBE96DFFA99C2|0x76360000|0x763a9fff|0\\nModule|userenv.dll|5.1.2600.5512|userenv.pdb|9FEE774E547347799689D6BAF9DAB4102|0x76630000|0x766e4fff|0\\nModule|cryptui.dll|5.131.2600.5512|cryptui.pdb|EBC7B38E15F9461D9BBC9317BBB7E8D42|0x76890000|0x76913fff|0\\nModule|sxs.dll|5.1.2600.5512|sxs.pdb|13300A765A3B4E9BAE52C373053C152F2|0x76980000|0x76a30fff|0\\nModule|winmm.dll|5.1.2600.5512|winmm.pdb|90FC96D5AD8440A2B14855895BD92ED62|0x76b00000|0x76b2dfff|0\\nModule|psapi.dll|5.1.2600.5512|psapi.pdb|B9875A55C874489384EA8FB805322C312|0x76bb0000|0x76bbafff|0\\nModule|wintrust.dll|5.131.2600.5512|wintrust.pdb|91992FC368B7419889AC7597420354F52|0x76bf0000|0x76c1dfff|0\\nModule|imagehlp.dll|5.1.2600.5512|imagehlp.pdb|111D199988C249ACA0335F467A6311412|0x76c50000|0x76c77fff|0\\nModule|iphlpapi.dll|5.1.2600.5512|iphlpapi.pdb|9B09F073003F4CA48F9980B3C091448F2|0x76d20000|0x76d38fff|0\\nModule|dnsapi.dll|5.1.2600.5512|dnsapi.pdb|2602DE4D984348A8A8C36DD43F02E2152|0x76ee0000|0x76f06fff|0\\nModule|wldap32.dll|5.1.2600.5512|wldap32.pdb|AC04BCF6FF294FCEAC8B8D937CBA3A172|0x76f20000|0x76f4cfff|0\\nModule|winrnr.dll|5.1.2600.5512|winrnr.pdb|9FE1A4669B69400FAC821A4367AA9CC52|0x76f70000|0x76f77fff|0\\nModule|rasadhlp.dll|5.1.2600.5512|rasadhlp.pdb|CCA669B1582847D0B330D7ABDB446A472|0x76f80000|0x76f85fff|0\\nModule|clbcatq.dll|2001.12.4414.700|clbcatq.pdb|8AE9C54730824764AAF39EA69F8D87582|0x76f90000|0x7700efff|0\\nModule|comres.dll|2001.12.4414.700|COMRes.pdb|A02453A3EB42413FBFF95326893E977Df|0x77010000|0x770dffff|0\\nModule|oleaut32.dll|5.1.2600.5512|oleaut32.pdb|F2A209009B694EFCAD1A6CE9D992EBC12|0x770f0000|0x7717afff|0\\nModule|wininet.dll|7.0.5730.13|wininet.pdb|9EA644C8A78041C1BB0FC6D6ACFE8E202|0x771b0000|0x7727dfff|0\\nModule|comctl32.dll|6.0.2900.5512|MicrosoftWindowsCommon-Controls-6.0.2600.5512-comctl32.pdb|505057971C40416FB39FED1D39BED0571|0x773a0000|0x774a2fff|0\\nModule|ole32.dll|5.1.2600.5512|ole32.pdb|ED517599D2C14CF19200861833059C142|0x774b0000|0x775ecfff|0\\nModule|ntmarta.dll|5.1.2600.5512|ntmarta.pdb|EB9B3E21F92F4F51AD85D86F4D7741A82|0x77660000|0x77680fff|0\\nModule|setupapi.dll|5.1.2600.5512|setupapi.pdb|9D52182415AA4179960B37F4C694F90D2|0x778f0000|0x779e6fff|0\\nModule|crypt32.dll|5.131.2600.5512|crypt32.pdb|3D2E43BF4FF5446B83957512615FD0942|0x77a50000|0x77ae5fff|0\\nModule|msasn1.dll|5.1.2600.5512|msasn1.pdb|DBFCEAEE0AB647F7BB94623535C531262|0x77af0000|0x77b01fff|0\\nModule|midimap.dll|5.1.2600.5512|midimap.pdb|D9AE872F08744C789E5170943BBBD10D1|0x77ba0000|0x77ba6fff|0\\nModule|msacm32.dll|5.1.2600.5512|msacm32.pdb|8256BD89DE024F3C970B66B9B5E5D8992|0x77bb0000|0x77bc4fff|0\\nModule|version.dll|5.1.2600.5512|version.pdb|EA3D1BD3FE65475C8449C8D8B00722962|0x77bd0000|0x77bd7fff|0\\nModule|msvcrt.dll|7.0.2600.5512|msvcrt.pdb|7BCF30D8C91B4F1B85FA4E55896250111|0x77be0000|0x77c37fff|0\\nModule|advapi32.dll|5.1.2600.5512|advapi32.pdb|5EFB9BF42CC64024AB64802E467394642|0x77da0000|0x77e4bfff|0\\nModule|rpcrt4.dll|5.1.2600.5512|rpcrt4.pdb|CCD4FE9B704E48B6B8A12F31E112AA6F2|0x77e50000|0x77ee1fff|0\\nModule|gdi32.dll|5.1.2600.5512|gdi32.pdb|740F60A99F2A417E96C387400994588D2|0x77ef0000|0x77f38fff|0\\nModule|shlwapi.dll|6.0.2900.5512|shlwapi.pdb|8519E3403447478884CFFE7F1A91BAE02|0x77f40000|0x77fb5fff|0\\nModule|secur32.dll|5.1.2600.5512|secur32.pdb|E8D378740B8E4A46B19CAFCD2D6DDF7D2|0x77fc0000|0x77fd0fff|0\\nModule|mozcrt19.dll|8.0.0.0|MOZCRT19.pdb|14FCEDCA1CE34BD2A90401CBC9260D2D1|0x78130000|0x781defff|0\\nModule|mozcpp19.dll|8.0.0.0|MOZCPP19.pdb|68AC85FFFBB84AA58FCA4B9883BE11D91|0x7c420000|0x7c4cefff|0\\nModule|kernel32.dll|5.1.2600.5512|kernel32.pdb|34560E80F5C54175B208848EF863C5BD2|0x7c800000|0x7c902fff|0\\nModule|ntdll.dll|5.1.2600.5512|ntdll.pdb|1751003260CA42598C0FB326585000ED2|0x7c910000|0x7c9c4fff|0\\nModule|shdocvw.dll|6.0.2900.5512|shdocvw.pdb|709A33A5D8EE48BB8A437827FE342C0C2|0x7e210000|0x7e380fff|0\\nModule|user32.dll|5.1.2600.5512|user32.pdb|D18A41B74E7F458CAAAC1847E2D8BF022|0x7e390000|0x7e420fff|0\\nModule|shell32.dll|6.0.2900.5512|shell32.pdb|69B3829BB6884926A5B97BF04E812C6B2|0x7e6a0000|0x7eec0fff|0\\n\\n35|0|mozalloc.dll|mozalloc_abort(char const * const)|hg:hg.mozilla.org/mozilla-central:memory/mozalloc/mozalloc_abort.cpp:d322a1c8537e|77|0x0\\n35|1|xul.dll|NS_DebugBreak_P|hg:hg.mozilla.org/mozilla-central:xpcom/base/nsDebugImpl.cpp:d322a1c8537e|350|0xc\\n35|2|xul.dll|nsCycleCollectingAutoRefCnt::decr(nsISupports *)|||0x38\\n35|3|xul.dll|nsGlobalChromeWindow::Release()|hg:hg.mozilla.org/mozilla-central:dom/base/nsGlobalWindow.cpp:d322a1c8537e|1336|0x1a\\n35|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4cabd\\n35|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xaca7\\n35|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f3e01\\n35|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xafd7\\n35|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x11258\\n35|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x82298\\n35|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f978a\\n35|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x82537\\n35|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x19ce51\\n35|13|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x20de7f\\n35|14|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x19d6df\\n35|15|ntdll.dll|LdrLoadDll|||0x14a\\n35|16|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x20df3f\\n35|17|kernel32.dll|BaseThreadStart|||0x36\\n35|18|ntdll.dll|LdrLoadDll|||0x14a\\n35|19|kernel32.dll|GetCodePageFileInfo|||0x138\\n0|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n0|1|user32.dll|NtUserWaitMessage|||0xb\\n0|2|xul.dll|nsAppShell::ProcessNextNativeEvent(int)|hg:hg.mozilla.org/mozilla-central:widget/src/windows/nsAppShell.cpp:d322a1c8537e|343|0x5\\n0|3|xul.dll|nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame *,nsPresContext *,nsHTMLReflowState const &,int,int,int,nsIFrame *,unsigned int &,nsOverflowAreas *)|hg:hg.mozilla.org/mozilla-central:layout/generic/nsAbsoluteContainingBlock.cpp:d322a1c8537e|500|0x9\\n1|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n1|1|ntdll.dll|NtCreateSection|||0xb\\n1|2|kernel32.dll|MapViewOfFile|||0x31\\n1|3|ntdll.dll|RtlQueryInformationActivationContext|||0x14e\\n1|4|kernel32.dll|CloseHandle|||0x43\\n2|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n2|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n2|2|kernel32.dll|GetQueuedCompletionStatus|||0x28\\n2|3|xul.dll|base::MessagePumpForIO::GetIOItem(unsigned long,base::MessagePumpForIO::IOItem *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|528|0x24\\n2|4|xul.dll|base::MessagePumpForIO::WaitForIOCompletion(unsigned long,base::MessagePumpForIO::IOHandler *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|499|0xb\\n2|5|xul.dll|base::MessagePumpForIO::WaitForWork()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|492|0xb\\n2|6|xul.dll|base::MessagePumpForIO::DoRunLoop()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|477|0x5\\n2|7|xul.dll|base::MessagePumpWin::RunWithDispatcher(base::MessagePump::Delegate *,base::MessagePumpWin::Dispatcher *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|52|0x6\\n2|8|xul.dll|base::MessagePumpWin::Run(base::MessagePump::Delegate *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.h:d322a1c8537e|78|0xb\\n2|9|xul.dll|MessageLoop::RunInternal()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_loop.cc:d322a1c8537e|219|0x8\\n2|10|xul.dll|MessageLoop::RunHandler()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_loop.cc:d322a1c8537e|202|0x4\\n2|11|xul.dll|base::ThreadLocalPlatform::SetValueInSlot(int &,void *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/thread_local_win.cc:d322a1c8537e|33|0xa\\n2|12|xul.dll|MessageLoop::Run()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_loop.cc:d322a1c8537e|176|0x6\\n2|13|xul.dll|base::Thread::ThreadMain()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/thread.cc:d322a1c8537e|156|0x8\\n2|14|xul.dll|`anonymous namespace'::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/platform_thread_win.cc:d322a1c8537e|26|0x8\\n2|15|kernel32.dll|BaseThreadStart|||0x36\\n3|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n3|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n3|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n3|3|kernel32.dll|WaitForSingleObject|||0x11\\n3|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n3|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n3|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n3|7|xul.dll|nsCycleCollectorRunner::Run()|hg:hg.mozilla.org/mozilla-central:xpcom/base/nsCycleCollector.cpp:d322a1c8537e|3315|0xa\\n3|8|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n3|9|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n3|10|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n3|11|ntdll.dll|_SEH_epilog|||0x19\\n3|12|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n3|13|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n3|14|ntdll.dll|_SEH_epilog|||0x19\\n3|15|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n3|16|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n3|17|ntdll.dll|_SEH_epilog|||0x19\\n4|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n4|1|user32.dll|NtUserPostMessage|||0xb\\n4|2|xul.dll|nsThread::Dispatch(nsIRunnable *,unsigned int)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|433|0x42\\n4|3|xul.dll|nsTimerImpl::PostTimerEvent()|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsTimerImpl.cpp:d322a1c8537e|552|0x18\\n4|4|xul.dll|TimerThread::Run()|hg:hg.mozilla.org/mozilla-central:xpcom/threads/TimerThread.cpp:d322a1c8537e|313|0x6\\n4|5|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n4|6|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n4|7|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n4|8|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n4|9|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n4|10|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n4|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n4|12|kernel32.dll|GetCodePageFileInfo|||0x138\\n5|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n5|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n5|2|kernel32.dll|CreateFileMappingA|||0x85\\n5|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n5|4|xul.dll|nsNotifyAddrListener::Run()|hg:hg.mozilla.org/mozilla-central:netwerk/system/win32/nsNotifyAddrListener.cpp:d322a1c8537e|192|0xf\\n5|5|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n5|6|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n5|7|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n5|8|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n5|9|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n5|10|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n5|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n5|12|mozjs.dll||||0x19006d\\n6|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n6|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n6|2|mswsock.dll|SockAsyncThread|||0x59\\n6|3|kernel32.dll|BaseThreadStart|||0x36\\n7|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n7|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n7|2|mswsock.dll|SockBuildSockaddr|||0x135\\n7|3|mswsock.dll|SockReleaseRwLockExclusive|||0x40\\n7|4|ws2_32.dll|select|||0xa6\\n7|5|nspr4.dll|_PR_MD_PR_POLL|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w32poll.c:d322a1c8537e|279|0xe\\n7|6|nspr4.dll|PR_Poll|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/io/prio.c:d322a1c8537e|173|0x12\\n7|7|xul.dll|nsSocketTransportService::Poll(int,unsigned int *)|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|358|0xc\\n7|8|xul.dll|nsSocketTransportService::DoPollIteration(int)|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|673|0x10\\n7|9|xul.dll|nsSocketTransportService::OnProcessNextEvent(nsIThreadInternal *,int,unsigned int)|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|551|0xc\\n7|10|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|597|0x1\\n7|11|xul.dll|NS_ProcessPendingEvents_P(nsIThread *,unsigned int)|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|200|0xb\\n7|12|xul.dll|NS_ProcessNextEvent_P(nsIThread *,int)|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|250|0xc\\n7|13|xul.dll|nsSocketTransportService::Run()|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|594|0x9\\n7|14|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n7|15|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n7|16|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n7|17|ntdll.dll|RtlpAdjustHeapLookasideDepth|||0x2d3\\n7|18|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n7|19|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n7|20|ntdll.dll|RtlpAdjustHeapLookasideDepth|||0x2d3\\n7|21|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n7|22|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n7|23|ntdll.dll|RtlpAdjustHeapLookasideDepth|||0x2d3\\n8|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n8|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n8|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n8|3|kernel32.dll|WaitForSingleObject|||0x11\\n8|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n8|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n8|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n8|7|mozjs.dll|js::GCHelperThread::threadLoop(JSRuntime *)|hg:hg.mozilla.org/mozilla-central:js/src/jsgc.cpp:d322a1c8537e|2084|0xb\\n8|8|mozjs.dll|js::GCHelperThread::threadMain(void *)|hg:hg.mozilla.org/mozilla-central:js/src/jsgc.cpp:d322a1c8537e|2070|0xe\\n8|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n8|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n8|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n8|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n8|13|kernel32.dll|BaseThreadStart|||0x36\\n9|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n9|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n9|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n9|3|kernel32.dll|WaitForSingleObject|||0x11\\n9|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n9|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n9|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n9|7|xul.dll|XPCJSRuntime::WatchdogMain(void *)|hg:hg.mozilla.org/mozilla-central:js/src/xpconnect/src/xpcjsruntime.cpp:d322a1c8537e|988|0xc\\n9|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n9|9|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n9|10|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n9|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n9|12|kernel32.dll|BaseThreadStart|||0x36\\n10|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n10|1|ntdll.dll|NtReplyWaitReceivePortEx|||0xb\\n10|2|rpcrt4.dll|RpcpPurgeEEInfoFromThreadIfNecessary(THREAD *)|||0x48\\n10|3|rpcrt4.dll|RecvLotsaCallsWrapper(LRPC_ADDRESS *)|||0xc\\n10|4|rpcrt4.dll|BaseCachedThreadRoutine(CACHED_THREAD *)|||0x52\\n10|5|rpcrt4.dll|ThreadStartRoutine(THREAD *)|||0x19\\n10|6|kernel32.dll|BaseThreadStart|||0x36\\n11|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n11|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n11|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n11|3|kernel32.dll|WaitForSingleObject|||0x11\\n11|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n11|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n11|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n11|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n11|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n11|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n11|10|ole32.dll|CheckDownloadRegistrySettings()|||0x59\\n11|11|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n11|12|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n11|13|ole32.dll|CheckDownloadRegistrySettings()|||0x59\\n11|14|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n11|15|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n11|16|kernel32.dll|GetCodePageFileInfo|||0x138\\n12|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n12|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n12|2|kernel32.dll|CreateFileMappingA|||0x85\\n12|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n12|4|wdmaud.drv|MixerCallbackThread|||0x41\\n12|5|kernel32.dll|BaseThreadStart|||0x36\\n13|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n13|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n13|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n13|3|kernel32.dll|WaitForSingleObject|||0x11\\n13|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n13|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n13|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n13|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n13|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n13|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n13|10|nspr4.dll|PR_ExitMonitor|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|132|0x6\\n13|11|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n13|12|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n13|13|nspr4.dll|PR_ExitMonitor|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|132|0x6\\n13|14|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n13|15|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n13|16|kernel32.dll|GetCodePageFileInfo|||0x138\\n14|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n14|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n14|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n14|3|kernel32.dll|WaitForSingleObject|||0x11\\n14|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n14|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n14|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n14|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n14|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n14|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n14|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n14|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n14|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n14|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n14|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n15|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n15|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n15|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n15|3|kernel32.dll|WaitForSingleObject|||0x11\\n15|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n15|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n15|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n15|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n15|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n15|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n15|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n15|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n15|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n15|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n15|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n16|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n16|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n16|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n16|3|kernel32.dll|WaitForSingleObject|||0x11\\n16|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n16|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n16|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n16|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n16|8|xul.dll|nsThreadStartupEvent::Run()|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|207|0xf\\n16|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n16|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n16|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n16|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n16|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n16|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n17|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n17|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n17|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n17|3|kernel32.dll|WaitForSingleObject|||0x11\\n17|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n17|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n17|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n17|7|xul.dll|nsSSLThread::Run()|hg:hg.mozilla.org/mozilla-central:security/manager/ssl/src/nsSSLThread.cpp:d322a1c8537e|980|0xa\\n17|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n17|9|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n17|10|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n17|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n17|12|kernel32.dll|BaseThreadStart|||0x36\\n18|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n18|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n18|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n18|3|kernel32.dll|WaitForSingleObject|||0x11\\n18|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n18|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n18|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n18|7|xul.dll|nsCertVerificationThread::Run()|hg:hg.mozilla.org/mozilla-central:security/manager/ssl/src/nsCertVerificationThread.cpp:d322a1c8537e|138|0xa\\n18|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n18|9|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n18|10|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n18|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n18|12|kernel32.dll|BaseThreadStart|||0x36\\n19|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n19|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n19|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n19|3|kernel32.dll|WaitForSingleObject|||0x11\\n19|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n19|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n19|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n19|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n19|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n19|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n19|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n19|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n19|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n19|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n19|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n20|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n20|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n20|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n20|3|kernel32.dll|WaitForSingleObject|||0x11\\n20|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n20|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n20|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n20|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n20|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n20|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n20|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n20|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n20|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n20|13|kernel32.dll|BaseThreadStart|||0x36\\n21|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n21|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n21|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n21|3|kernel32.dll|WaitForSingleObject|||0x11\\n21|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n21|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n21|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n21|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n21|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n21|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n21|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n21|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n21|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n21|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n21|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n22|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n22|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n22|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n22|3|kernel32.dll|WaitForSingleObject|||0x11\\n22|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n22|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n22|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n22|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n22|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n22|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n22|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n22|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n22|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n22|13|kernel32.dll|BaseThreadStart|||0x36\\n23|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n23|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n23|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n23|3|kernel32.dll|WaitForSingleObject|||0x11\\n23|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n23|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n23|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n23|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n23|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n23|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n23|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n23|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n23|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n23|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n23|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n24|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n24|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n24|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n24|3|kernel32.dll|WaitForSingleObject|||0x11\\n24|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n24|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n24|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n24|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n24|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n24|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n24|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n24|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n24|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n24|13|kernel32.dll|BaseThreadStart|||0x36\\n25|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n25|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n25|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n25|3|kernel32.dll|WaitForSingleObject|||0x11\\n25|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n25|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n25|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n25|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n25|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n25|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n25|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n25|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n25|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n25|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n25|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n26|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n26|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n26|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n26|3|kernel32.dll|WaitForSingleObject|||0x11\\n26|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n26|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n26|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n26|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n26|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n26|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n26|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n26|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n26|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n26|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n26|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n27|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n27|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n27|2|kernel32.dll|CreateFileMappingA|||0x85\\n27|3|advapi32.dll|WmipEventPump|||0x1a6\\n27|4|kernel32.dll|BaseThreadStart|||0x36\\n28|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n28|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n28|2|kernel32.dll|CreateFileMappingA|||0x85\\n28|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n28|4|xul.dll|nsDownloadScannerWatchdog::WatchdogThread(void *)|hg:hg.mozilla.org/mozilla-central:toolkit/components/downloads/src/nsDownloadScanner.cpp:d322a1c8537e|704|0x1b\\n28|5|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n28|6|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n28|7|kernel32.dll|BaseThreadStart|||0x36\\n29|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n29|1|ntdll.dll|NtFlushBuffersFile|||0xb\\n29|2|kernel32.dll|FlushFileBuffers|||0x49\\n29|3|nspr4.dll|FileSync|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/io/prfile.c:d322a1c8537e|222|0x10\\n29|4|xul.dll|nsFileOutputStream::Flush()|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsFileStreams.cpp:d322a1c8537e|610|0x6\\n29|5|xul.dll|nsSafeFileOutputStream::Finish()|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsFileStreams.cpp:d322a1c8537e|715|0x8\\n29|6|xul.dll|nsCOMPtr_base::assign_from_qi(nsQueryInterface,nsID const &)|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsCOMPtr.cpp:d322a1c8537e|98|0x7\\n29|7|nspr4.dll||||0x1b38f\\n30|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n30|1|ntdll.dll|NtReplyWaitReceivePortEx|||0xb\\n30|2|rpcrt4.dll|RpcpPurgeEEInfoFromThreadIfNecessary(THREAD *)|||0x48\\n30|3|rpcrt4.dll|RecvLotsaCallsWrapper(LRPC_ADDRESS *)|||0xc\\n30|4|rpcrt4.dll|BaseCachedThreadRoutine(CACHED_THREAD *)|||0x52\\n30|5|rpcrt4.dll|ThreadStartRoutine(THREAD *)|||0x19\\n30|6|kernel32.dll|BaseThreadStart|||0x36\\n31|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n31|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n31|2|ntdll.dll|RtlpWaitThread|||0x126\\n31|3|kernel32.dll|BaseThreadStart|||0x36\\n32|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n32|1|ntdll.dll|ZwDelayExecution|||0xb\\n32|2|ntdll.dll|RtlpTimerThread|||0x46\\n32|3|kernel32.dll|BaseThreadStart|||0x36\\n33|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n33|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n33|2|ntdll.dll|RtlpWorkerThread|||0x3c\\n33|3|kernel32.dll|BaseThreadStart|||0x36\\n34|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n34|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n34|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n34|3|kernel32.dll|WaitForSingleObject|||0x11\\n34|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n34|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n34|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n34|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n34|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n34|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n34|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n34|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n34|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n34|13|kernel32.dll|BaseThreadStart|||0x36\\n36|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n36|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n36|2|kernel32.dll|CreateFileMappingA|||0x85\\n36|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n36|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4e8b6\\n36|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x506fc\\n36|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5094f\\n36|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5515\\n36|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x3f73b\\n36|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2a07\\n36|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n36|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xbf79\\n36|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x2554bb\\n36|13|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2ee7\\n36|14|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xd1155\\n36|15|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ff6af\\n36|16|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x10fabe\\n36|17|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x2051ca\\n36|18|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x90033\\n36|19|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n36|20|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n36|21|ntdll.dll|MD5Final|||0x2bc\\n36|22|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n36|23|snxhk.dll||||0x28b81\\n36|24|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n36|25|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n36|26|ntdll.dll|LdrLoadDll|||0x14a\\n37|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n37|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n37|2|kernel32.dll|CreateFileMappingA|||0x85\\n37|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n37|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4e8b6\\n37|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x506fc\\n37|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5094f\\n37|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5515\\n37|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n37|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x87c9\\n37|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x255497\\n37|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2c4f\\n37|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x8ff2f\\n37|13|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n37|14|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n37|15|ntdll.dll|MD5Final|||0x2bc\\n37|16|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n37|17|snxhk.dll||||0x28b81\\n37|18|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n37|19|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n37|20|ntdll.dll|LdrLoadDll|||0x14a\\n38|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n38|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n38|2|kernel32.dll|CreateFileMappingA|||0x85\\n38|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n38|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4e8b6\\n38|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x506fc\\n38|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5094f\\n38|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5515\\n38|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n38|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x87c9\\n38|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x255497\\n38|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2c4f\\n38|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x8ff2f\\n38|13|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n38|14|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n38|15|ntdll.dll|MD5Final|||0x2bc\\n38|16|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n38|17|snxhk.dll||||0x28b81\\n38|18|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n38|19|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n38|20|ntdll.dll|LdrLoadDll|||0x14a\\n39|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n39|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n39|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n39|3|kernel32.dll|WaitForSingleObject|||0x11\\n39|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4914e\\n39|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f498a\\n39|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x49500\\n39|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5681\\n39|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x3f90b\\n39|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2a07\\n39|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n39|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xa460\\n39|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x2554cb\\n39|13|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2f17\\n39|14|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x711de\\n39|15|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x6f298\\n39|16|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x71547\\n39|17|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f8890\\n39|18|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x8ff0f\\n39|19|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n39|20|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n39|21|ntdll.dll|MD5Final|||0x2bc\\n39|22|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n39|23|snxhk.dll||||0x28b81\\n39|24|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n39|25|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n39|26|ntdll.dll|LdrLoadDll|||0x14a\\n40|0|kernel32.dll|BaseThreadStartThunk|||0x0\", \"startedDateTime\": \"2011-03-06 21:14:01.327981\", \"product\": \"Firefox\", \"crashedThread\": 35, \"cpu_info\": \"GenuineIntel family 15 model 4 stepping 9 | 1\", \"install_age\": 567924, \"distributor\": null, \"topmost_filenames\": [\"hg:hg.mozilla.org/mozilla-central:memory/mozalloc/mozalloc_abort.cpp:d322a1c8537e\"], \"id\": 227423740, \"user_comments\": null, \"build_date\": \"2011-02-22 21:00:00.0\", \"uptime\": 291, \"uuid\": \"dabea982-548f-4b71-ae4f-b9ebf2110306\", \"flash_version\": \"[blank]\", \"os_version\": \"5.1.2600 Service Pack 3\", \"distributor_version\": null, \"truncated\": false, \"process_type\": null, \"processor_notes\": \"\", \"hangid\": null, \"version\": \"4.0b12\", \"build\": \"20110222210221\", \"addons_checked\": null, \"app_notes\": \"AdapterVendorID: 1106, AdapterDeviceID: 3344, AdapterDriverVersion: 6.14.10.275\\nxpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)\", \"os_name\": \"Windows NT\", \"last_crash\": 299, \"date_processed\": \"2011-03-06 21:13:18.528463\", \"cpu_name\": \"x86\", \"reason\": \"EXCEPTION_BREAKPOINT\", \"address\": \"0x7d1a39\", \"completeddatetime\": \"2011-03-06 21:14:03.975606\", \"signature\": \"mozalloc_abort(char const* const) | NS_DebugBreak_P | nsCycleCollectingAutoRefCnt::decr(nsISupports*)\", \"addons\": [[\"engine@conduit.com\", \"3.2.5.2\"], [\"{ac6fad42-419e-4f3a-abde-1bc6ce916b7d}\", \"3.2.5.2\"], [\"m3ffxtbr@mywebsearch.com\", \"1.1\"], [\"testpilot@labs.mozilla.com\", \"1.0.6\"], [\"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}\", \"1.1.1\"], [\"{c5134213-7204-f204-7748-3faf7674a27f}\", \"4.6.7.8\"], [\"{0974848a-b5bc-49f2-9778-307742b4a55d}\", \"3.2.5.2\"], [\"{972ce4c6-7e08-4474-a285-3208198ce6fd}\", \"4.0b12\"]]}" jdata <- fromJSON( x ) checkTrue( is.list( jdata ) ) } test.big <- function() { x <- "{\"client_crash_date\": \"2011-03-03 02:06:41.0\", \"dump\": \"OS|Windows NT|5.1.2600 Service Pack 3\\nCPU|x86|AuthenticAMD family 16 model 6 stepping 2|1\\nCrash|EXCEPTION_ACCESS_VIOLATION_READ|0x9|0\\nModule|sqlite3.dll|3.6.10.0|sqlite3.pdb|33F22CE2B2B54C128F26B1AEB209DB3E1|0x00280000|0x002ebfff|1\\nModule|js3250.dll|4.0.0.0|js3250.pdb|3D2BE64A2A27418AB874AF1FC37FC28F2|0x002f0000|0x003d2fff|0\\nModule|smime3.dll|3.12.3.0|smime3.pdb|C691873CEC8A45CEBB8D577029D6A05C1|0x003e0000|0x003f7fff|0\\nModule|firefox.exe|1.9.1.3483|firefox.pdb|E820A6C3DA3E4D41B4D4856FBE95A9682|0x00400000|0x004defff|0\\nModule|nspr4.dll|4.8.0.0|nspr4.pdb|90B401B223E44E29B52427A96E5030B61|0x004e0000|0x00508fff|0\\nModule|nss3.dll|3.12.3.0|nss3.pdb|417FBFD301594DDBB3B1B0FDD01AD18D1|0x00510000|0x005a9fff|0\\nModule|nssutil3.dll|3.12.3.0|nssutil3.pdb|271849D3653A4011AFF4DD803713F75E1|0x005b0000|0x005c3fff|0\\nModule|plc4.dll|4.8.0.0|plc4.pdb|0466C3D1BA904897B48B818A47271E3D1|0x005d0000|0x005d6fff|0\\nModule|plds4.dll|4.8.0.0|plds4.pdb|ADE9A225ED1E47189DCC30DFB885B9F31|0x005e0000|0x005e6fff|0\\nModule|ssl3.dll|3.12.3.0|ssl3.pdb|D2CBA6C4FEBA43069A78E69B1434DB131|0x005f0000|0x0060ffff|0\\nModule|xpcom.dll|1.9.1.3483|xpcom.pdb|2CD83B094C064BA4B1936C48EC3FA9E62|0x00610000|0x00616fff|0\\nModule|UnlockerHook.dll||||0x012c0000|0x012c3fff|0\\nModule|PowerMenuHook.dll|1.5.1.0|||0x012d0000|0x012e2fff|0\\nModule|browserdirprovider.dll|1.9.1.3483|browserdirprovider.pdb|C3E953EDEF68402183B21895E689408D2|0x01340000|0x01347fff|0\\nModule|idmmzcc.dll|5.17.3.0|||0x01450000|0x01480fff|0\\nModule|normaliz.dll|6.0.5441.0|normaliz.pdb|D0658E322B2D4DDCA57FB9C9715C6CAD1|0x01490000|0x01498fff|0\\nModule|urlmon.dll|8.0.6001.22867|urlmon.pdb|04FFFD62B65746BD856B698C3822F4652|0x014a0000|0x015d0fff|0\\nModule|GoogleDesktopMozilla.dll||GoogleDesktopMozilla.pdb|AEB53B67E2FF42E8A4ED5107357E98347|0x01950000|0x0196efff|0\\nModule|brwsrcmp.dll|1.9.1.3483|brwsrcmp.pdb|A5B4105204D34EF4BCED190336D634872|0x02200000|0x02223fff|0\\nModule|xpsp2res.dll|5.1.2600.5512|||0x02330000|0x02689fff|0\\nModule|xul.dll|1.9.1.3483|xul.pdb|9FCED407A8D3411DBF5E80A72845BD062|0x10000000|0x10a59fff|0\\nModule|wininet.dll|8.0.6001.22873|wininet.pdb|2ED0AC45A8584A6095BFE16577D154332|0x3d930000|0x3da15fff|0\\nModule|iertutil.dll|8.0.6001.22867|iertutil.pdb|A6E8574FA7054FDCA22D42F9946ADCCC2|0x3dfd0000|0x3e1b7fff|0\\nModule|dbghelp.dll|5.1.2600.5512|dbghelp.pdb|7FA1C63A9BF54470BCA31E35A94F49971|0x59a60000|0x59b00fff|0\\nModule|uxtheme.dll|6.0.2900.5512|uxtheme.pdb|E99E16308F094767B1F07FB5C3E5E2462|0x5ad70000|0x5ada7fff|0\\nModule|GoogleDesktopAPI2.dll||GoogleDesktopAPI2.pdb|16952BAF76A047D7A83483F202EE6A6A8|0x60000000|0x6001dfff|0\\nModule|GoogleDesktopResources_en.dll||GoogleDesktopResources_en.pdb|5158D620219E4E779E02BC472BD772BE2|0x62000000|0x62031fff|0\\nModule|lpk.dll|5.1.2600.5512|lpk.pdb|4B6570DF2CFF45AAB60E416993385EAC1|0x629c0000|0x629c8fff|0\\nModule|hnetcfg.dll|5.1.2600.5589|HNetCfg.pdb|C441D43BD4354A8E9F22229506BCBE591|0x662b0000|0x66307fff|0\\nModule|mswsock.dll|5.1.2600.5649|mswsock.pdb|93FEC2ABF4254F5AA4EBFE33B2DEBAD62|0x71a50000|0x71a8efff|0\\nModule|wshtcpip.dll|5.1.2600.5512|wshtcpip.pdb|DE2E52603FFB406D9052C8D884A1AD722|0x71a90000|0x71a97fff|0\\nModule|ws2help.dll|5.1.2600.5512|ws2help.pdb|6049CF5877C54E2AB512ABC1B4B2E7992|0x71aa0000|0x71aa7fff|0\\nModule|ws2_32.dll|5.1.2600.5512|ws2_32.pdb|A7605F8695A34329B38DDB8421A004CA2|0x71ab0000|0x71ac6fff|0\\nModule|wsock32.dll|5.1.2600.5512|wsock32.pdb|2B38FE8F84144DACB8A4FD07C05E49FC2|0x71ad0000|0x71ad8fff|0\\nModule|winspool.drv|5.1.2600.5512|winspool.pdb|5199B63B39904A05A517CEE5158071522|0x73000000|0x73025fff|0\\nModule|t2embed.dll|5.1.2600.5830|t2embed.pdb|82C3ABFC4D2349E0A74C50B18FC0D8EA1|0x73ce0000|0x73d00fff|0\\nModule|lz32.dll|5.1.2600.0|lz32.pdb|3B7D84BD1|0x73dc0000|0x73dc2fff|0\\nModule|MSCTF.dll|5.1.2600.5655|msctf.pdb|3DB44EF7B1F64554AA80C5F5116A5DFE2|0x74720000|0x7476bfff|0\\nModule|usp10.dll|1.420.2600.5512|usp10.pdb|0F289BC0C9A94139BC1C31EDEDBF52311|0x74d90000|0x74dfafff|0\\nModule|MSCTFIME.IME|5.1.2600.5768|msctfime.pdb|3C615F3A72FC4192A60AA2A1F52449AC1|0x755c0000|0x755edfff|0\\nModule|msimg32.dll|5.1.2600.5512|msimg32.pdb|D2E18526D8234F4BB5A85DE12E71DE812|0x76380000|0x76384fff|0\\nModule|imm32.dll|5.1.2600.5512|imm32.pdb|F7A5B5DB13324153B57AAF340C77EA512|0x76390000|0x763acfff|0\\nModule|comdlg32.dll|6.0.2900.5512|comdlg32.pdb|026A6FF770FD4E6186ADBBE96DFFA99C2|0x763b0000|0x763f8fff|0\\nModule|winmm.dll|5.1.2600.5512|winmm.pdb|90FC96D5AD8440A2B14855895BD92ED62|0x76b40000|0x76b6cfff|0\\nModule|psapi.dll|5.1.2600.5512|psapi.pdb|B9875A55C874489384EA8FB805322C312|0x76bf0000|0x76bfafff|0\\nModule|iphlpapi.dll|5.1.2600.5512|iphlpapi.pdb|9B09F073003F4CA48F9980B3C091448F2|0x76d60000|0x76d78fff|0\\nModule|dnsapi.dll|5.1.2600.5649|dnsapi.pdb|32D68E409B0B4F58968A103CB7CB8CA92|0x76f20000|0x76f46fff|0\\nModule|wldap32.dll|5.1.2600.5512|wldap32.pdb|AC04BCF6FF294FCEAC8B8D937CBA3A172|0x76f60000|0x76f8bfff|0\\nModule|winrnr.dll|5.1.2600.5512|winrnr.pdb|9FE1A4669B69400FAC821A4367AA9CC52|0x76fb0000|0x76fb7fff|0\\nModule|clbcatq.dll|2001.12.4414.700|clbcatq.pdb|8AE9C54730824764AAF39EA69F8D87582|0x76fd0000|0x7704efff|0\\nModule|comres.dll|2001.12.4414.700|COMRes.pdb|A02453A3EB42413FBFF95326893E977Df|0x77050000|0x77114fff|0\\nModule|oleaut32.dll|5.1.2600.5512|oleaut32.pdb|F2A209009B694EFCAD1A6CE9D992EBC12|0x77120000|0x771aafff|0\\nModule|comctl32.dll|6.0.2900.5512|MicrosoftWindowsCommon-Controls-6.0.2600.5512-comctl32.pdb|505057971C40416FB39FED1D39BED0571|0x773d0000|0x774d2fff|0\\nModule|ole32.dll|5.1.2600.5685|ole32.pdb|9A4C05DDE0EC40CBBB843A4AD8FEF3C42|0x774e0000|0x7761dfff|0\\nModule|setupapi.dll|5.1.2600.5603|setupapi.pdb|D4ED459F85A948E7A94E123D65DFCC332|0x77920000|0x77a12fff|0\\nModule|version.dll|5.1.2600.5512|version.pdb|EA3D1BD3FE65475C8449C8D8B00722962|0x77c00000|0x77c07fff|0\\nModule|msvcrt.dll|7.0.2600.5701|msvcrt.pdb|F46BE85D442A476EAADBC8CC2B727C681|0x77c10000|0x77c67fff|0\\nModule|advapi32.dll|5.1.2600.5755|advapi32.pdb|8F800AAE525541239E4110B8821F5ECD2|0x77dd0000|0x77e6afff|0\\nModule|rpcrt4.dll|5.1.2600.5795|rpcrt4.pdb|759EF1C510534614A5537861C559C4282|0x77e70000|0x77f01fff|0\\nModule|gdi32.dll|5.1.2600.5698|gdi32.pdb|005002194FA345B5957493744A01376E2|0x77f10000|0x77f58fff|0\\nModule|shlwapi.dll|6.0.2900.5512|shlwapi.pdb|8519E3403447478884CFFE7F1A91BAE02|0x77f60000|0x77fd5fff|0\\nModule|secur32.dll|5.1.2600.5753|secur32.pdb|F6CC06B49B764C5AA7C4C320ECB139F42|0x77fe0000|0x77ff0fff|0\\nModule|mozcrt19.dll|8.0.0.0|mozcrt19.pdb|06D6AEABD62C4346BF4F11E4D3BF37B61|0x78130000|0x781e0fff|0\\nModule|kernel32.dll|5.1.2600.5781|kernel32.pdb|F3F783A50DA64DD2AA9357ED6DAF9A252|0x7c800000|0x7c8f5fff|0\\nModule|ntdll.dll|5.1.2600.5755|ntdll.pdb|99192024C5EB4830AC602195086637082|0x7c900000|0x7c9b1fff|0\\nModule|shell32.dll|6.0.2900.5672|shell32.pdb|69B3829BB6884926A5B97BF04E812C6B2|0x7c9c0000|0x7e0f5fff|0\\nModule|user32.dll|5.1.2600.5512|user32.pdb|D18A41B74E7F458CAAAC1847E2D8BF022|0x7e410000|0x7e4aefff|0\\n\\n0|0|GoogleDesktopMozilla.dll||||0x5512\\n0|1|GoogleDesktopMozilla.dll||||0x4b7e\\n0|2|xul.dll||||0x30b591\\n0|3|xul.dll|CallPeekFunc|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d|125|0x10\\n0|4|xul.dll|nsPipeInputStream::ReadSegments(unsigned int (*)(nsIInputStream *,void *,char const *,unsigned int,unsigned int,unsigned int *),void *,unsigned int,unsigned int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/io/nsPipe3.cpp:c6f51c76fb5d|799|0x1c\\n0|5|xul.dll|nsFileChannel::QueryInterface(nsID const &,void * *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/protocol/file/src/nsFileChannel.cpp:c6f51c76fb5d|400|0x79\\n0|6|xul.dll|nsBaseChannel::GetStatus(unsigned int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsBaseChannel.cpp:c6f51c76fb5d|323|0xe\\n0|7|xul.dll|nsBaseChannel::OnStartRequest(nsIRequest *,nsISupports *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsBaseChannel.cpp:c6f51c76fb5d|665|0x23\\n0|8|xul.dll|nsInputStreamPump::OnStateStart()|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d|439|0x1c\\n0|9|xul.dll|nsInputStreamPump::OnInputStreamReady(nsIAsyncInputStream *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d|395|0x7\\n0|10|xul.dll|nsInputStreamReadyEvent::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/io/nsStreamUtils.cpp:c6f51c76fb5d|111|0x8\\n0|11|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n0|12|xul.dll|nsBaseAppShell::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:widget/src/xpwidgets/nsBaseAppShell.cpp:c6f51c76fb5d|170|0x23\\n0|13|xul.dll|nsAppStartup::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:toolkit/components/startup/src/nsAppStartup.cpp:c6f51c76fb5d|193|0xc\\n0|14|nspr4.dll||||0xbaff\\n0|15|firefox.exe|wmain|hg:hg.mozilla.org/releases/mozilla-1.9.1:toolkit/xre/nsWindowsWMain.cpp:c6f51c76fb5d|110|0xe5\\n0|16|firefox.exe|__tmainCRTStartup|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/crtexe.c:c6f51c76fb5d|591|0x18\\n0|17|kernel32.dll|BaseProcessStart|||0x22\\n1|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n1|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n1|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n1|3|kernel32.dll|WaitForSingleObject|||0x11\\n1|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95cv.c:c6f51c76fb5d|280|0xd\\n1|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|204|0x27\\n1|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|547|0xc\\n1|7|xul.dll|TimerThread::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/TimerThread.cpp:c6f51c76fb5d|345|0x12\\n1|8|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n1|9|xul.dll|nsThread::ThreadFunc(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|254|0xb\\n1|10|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n1|11|nspr4.dll|pr_root|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95thred.c:c6f51c76fb5d|122|0xc\\n1|12|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|348|0x8\\n1|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n1|14|kernel32.dll|BaseThreadStart|||0x36\\n2|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n2|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n2|2|kernel32.dll|CreateFileMappingA|||0x85\\n2|3|advapi32.dll|WmipEventPump|||0x1a6\\n2|4|kernel32.dll|BaseThreadStart|||0x36\\n3|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n3|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n3|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n3|3|kernel32.dll|WaitForSingleObject|||0x11\\n3|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95cv.c:c6f51c76fb5d|280|0xd\\n3|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|204|0x27\\n3|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|547|0xc\\n3|7|xul.dll|XPCJSRuntime::WatchdogMain(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:js/src/xpconnect/src/xpcjsruntime.cpp:c6f51c76fb5d|823|0x12\\n3|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n3|9|msvcrt.dll|_fptrap|||0xa76e\\n3|10|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n3|11|kernel32.dll|BaseThreadStart|||0x36\\n4|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n4|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n4|2|mswsock.dll|SockAsyncThread|||0x59\\n4|3|kernel32.dll|BaseThreadStart|||0x36\\n5|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n5|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n5|2|mswsock.dll|SockWaitForSingleObject|||0x39\\n5|3|mswsock.dll|SockReleaseRwLockExclusive|||0x40\\n5|4|ws2_32.dll|select|||0xa6\\n5|5|nspr4.dll|_PR_MD_PR_POLL|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w32poll.c:c6f51c76fb5d|279|0xe\\n5|6|nspr4.dll||||0xca1f\\n6|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n6|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n6|2|kernel32.dll|CreateFileMappingA|||0x85\\n6|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n6|4|xul.dll|nsNotifyAddrListener::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/system/win32/nsNotifyAddrListener.cpp:c6f51c76fb5d|185|0xe\\n6|5|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n6|6|xul.dll|nsThread::ThreadFunc(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|254|0xb\\n6|7|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n6|8|nspr4.dll|pr_root|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95thred.c:c6f51c76fb5d|122|0xc\\n6|9|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|348|0x8\\n6|10|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n6|11|kernel32.dll|BaseThreadStart|||0x36\\n7|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n7|1|user32.dll|NtUserGetMessage|||0xb\\n7|2|GoogleDesktopMozilla.dll||||0x5cbe\\n7|3|GoogleDesktopMozilla.dll||||0xb87a\\n7|4|kernel32.dll|BaseThreadStart|||0x36\\n8|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n8|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n8|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n8|3|kernel32.dll|WaitForSingleObject|||0x11\\n8|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95cv.c:c6f51c76fb5d|280|0xd\\n8|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|204|0x27\\n8|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/prmon.c:c6f51c76fb5d|184|0x19\\n8|7|xul.dll|nsAutoMonitor::Wait(unsigned int)|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/dist/include/xpcom/nsAutoLock.h:c6f51c76fb5d|340|0xb\\n8|8|xul.dll|nsThreadPool::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThreadPool.cpp:c6f51c76fb5d|210|0xd\\n8|9|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n8|10|xul.dll|nsThread::ThreadFunc(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|254|0xb\\n8|11|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n8|12|js3250.dll||||0x4a9f\\n8|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n8|14|kernel32.dll|BaseThreadStart|||0x36\\n9|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n9|1|ntdll.dll|NtReplyWaitReceivePortEx|||0xb\\n9|2|rpcrt4.dll|RpcpPurgeEEInfoFromThreadIfNecessary(THREAD *)|||0x48\\n9|3|rpcrt4.dll|RecvLotsaCallsWrapper(LRPC_ADDRESS *)|||0xc\\n9|4|rpcrt4.dll|BaseCachedThreadRoutine(CACHED_THREAD *)|||0x52\\n9|5|rpcrt4.dll|ThreadStartRoutine(THREAD *)|||0x19\\n9|6|kernel32.dll|BaseThreadStart|||0x36\\n10|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n10|1|ntdll.dll|ZwDelayExecution|||0xb\\n10|2|kernel32.dll|SleepEx|||0x50\\n10|3|kernel32.dll|Sleep|||0xe\\n10|4|ole32.dll|CROIDTable::WorkerThreadLoop(void *)|||0x13\\n10|5|ole32.dll|CRpcThread::WorkerLoop()|||0x1d\\n10|6|||||0x774dffff\\n10|7|kernel32.dll|BaseThreadStart|||0x36\", \"startedDateTime\": \"2011-03-02 18:07:40.147016\", \"product\": \"Firefox\", \"crashedThread\": 0, \"cpu_info\": \"AuthenticAMD family 16 model 6 stepping 2 | 1\", \"install_age\": 6246, \"distributor\": null, \"topmost_filenames\": [\"hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d\"], \"id\": 225856774, \"user_comments\": \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n05\\r\\n\\r\\n\\r\\n.\\r\\n+\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\", \"build_date\": \"2009-07-15 09:00:00.0\", \"uptime\": 1, \"uuid\": \"48b5ddb1-6029-4375-84b0-5f8ab2110302\", \"flash_version\": \"[blank]\", \"os_version\": \"5.1.2600 Service Pack 3\", \"distributor_version\": null, \"truncated\": false, \"process_type\": null, \"processor_notes\": \"\", \"hangid\": null, \"version\": \"3.5.1\", \"build\": \"20090715094852\", \"addons_checked\": null, \"app_notes\": null, \"os_name\": \"Windows NT\", \"last_crash\": 1, \"date_processed\": \"2011-03-02 18:07:17.892535\", \"cpu_name\": \"x86\", \"reason\": \"EXCEPTION_ACCESS_VIOLATION_READ\", \"address\": \"0x9\", \"completeddatetime\": \"2011-03-02 18:07:42.889052\", \"signature\": \"GoogleDesktopMozilla.dll@0x5512\", \"addons\": [[\"jqs@sun.com\", \"1.0\"], [\"mozilla_cc@internetdownloadmanager.com\", \"6.4\"], [\"{972ce4c6-7e08-4474-a285-3208198ce6fd}\", \"3.5.1\"]]}" jdata <- fromJSON( x ) checkTrue( is.list( jdata ) ) }rjson/inst/unittests/test.array.r0000744000176000001440000000155712207035602016741 0ustar ripleyusers.setUp <- function() {} .tearDown <- function() {} test.array <- function() { json <- "[]" x <- fromJSON( json ) checkIdentical( x, list() ) failing_json <- c( "[", "[12313", "[132,", "[132,1", "[1,5,4,3,", "[1,3}" ) for( bad_json in failing_json ) { x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } json <- "[1]" x <- fromJSON( json ) checkIdentical( x, 1 ) json <- "[1,5,200]" x <- fromJSON( json ) checkIdentical( x, c(1,5,200) ) #multiple types are saved as a list json <- "[1,5,\"hello\"]" x <- fromJSON( json ) checkIdentical( x, list(1,5,"hello") ) #test arrays with arrays json <- "[[[]],[]]" x <- fromJSON( json ) checkIdentical( x, list( list(list()), list() ) ) json <- "[null,[]]" x <- fromJSON( json ) checkIdentical( x, list( NULL, list() ) ) } rjson/inst/changelog.txt0000744000176000001440000000441512207035602015104 0ustar ripleyusers0.2.12: Jan 14, 2013 Added unexpected.escape to the "C" fromJSON method. This allows users to parse invalid json containing bad escaped data. Defaults to raising an error as the old version did. Also added position to error/warning messages 0.2.11: Nov 29, 2012 Fixed toJSON bug where factors were saved as integers rather than strings 0.2.10: Sep 30, 2012 Fixed precission issue in toJSON's C implementation where doubles only had 6 digits (as the std::iostream default specified). Now it should be the full precission. (Thanks Michael) Fixed issue where toJSON(..., "R") never passed the "R" value on recursive calls (so it ended up calling the (potentially buggy) C version 0.2.9: July 22, 2012 Fixed vector toJSON bug where toJSON(numeric(0)) would return "" instead of "[]" (thanks Diego Forteza) 0.2.8: Mar 18, 2012 Changed ordering of includes in dump.cpp to fix compilation issue on OSX (thanks Rob) 0.2.7: Mar 12, 2012 rewrote toJSON to use a C implementation which is much faster. Thanks to Simon for the reminder. 0.2.6: Oct 17, 2011 bufix: fromJSON('["A",["B","C"]]') incorrectly returned "A" "B" (thanks Brad Friedman for reporting it) bufix: fromJSON('["A", null]', method="R") was using NA rather than NULL (missed case from version 0.1.6) 0.2.4: June 26, 2011 bugfix: too hasty with the previous release, and introduced a bug for characters greater than 512 bytes (was blindly doubling the buffer size when sometimes it needed more) 0.2.4: June 25, 2011 bugfix: memory issue when parsing strings with mostly (or only) escaped characters greater than 256bytes 0.2.3: Dec 12, 2010 bugfix: allow '\r' to b whitespace rather than just use '\n' 0.2.2: Nov 29, 2010 bugfix: protection stack overflow - now uses PROTECT_WITH_INDEX() rather pushing far too many protects on to the stack bugfix: added missing protects to SET_LENGTH calls 0.2.1: unknown (missing entry) 0.2.0: unknown (missing entry) introduced a C based parser for reading JSON 0.1.7: August 28, 2009 fixed toJSON bug: named vectors are now treated as json lists 0.1.6: August 23, 2009 fixed toJSON bug: NA, NaN, Inf, -Inf are not converted to strings fromJSON: null used to be returned as NA, but now is returned as NULL (but will still have the associated key displayed in the list)rjson/inst/doc/0000755000176000001440000000000012207035610013153 5ustar ripleyusersrjson/inst/doc/json_rpc_server.pdf0000744000176000001440000017772612207035610017076 0ustar ripleyusers%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 1712 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ûWðjÆ„ |·™IIjû–ä“”ÅF"UQ¶êß}¤l¶™N{ ,€Åî·OêÝÝÅÕ{“:W‰Nmp·’$QÆäA¦SeÊ$¸«ƒ¯áÇ•o?ÃëÓ*2qÞ|¹æÁÐñð´J²FHÕá†ýA¶®¾ß}¼z¯Ë@kU¦i‚—˜L•FQR¨¢Ô|ÇÛ-œjþ„SI^÷0y„ç(¿d½Ãw ϹV€Qb”ÉSa‚{äÌpdfI“KÇ0Öð–Ë€\V›‘\‘6±²ÀÓ&ª(Jæ©W‘ÖpôœêV†e:ô¨^X?V8k{Z#ŽEPª2K2äƒtZqÁœnš"ƒ'gO m%yX¡zMâüVnKƒB|è[œ¢7_àu Íû&^Àê ¥ª'&m·J ’¼Á=ÑÂÅà ÷õ»n~ììÊeÔw¼å´AB…»6LqÛˆL³Yã­—çÛtîéÎ|»ÝÀ´#‹C¯*M§ K „âüðÁ6hì{2Šw¶#¥Ô*²¦d†‡œ8bèøt;0w‡ŠÄá|‰@"1úEíª~˹k·t?Ñ«”ÕÛ m¿Ù¹4Š×>.ˆ[Y†Ñ¤ðUÅoêÈLÞÚ  û¾žgBðAsæ k7;ZË-ßbmhµ‘Íc]×= æîDÒ!è’%éæv{q[àlmAò±»ÕDÉÃ5& TtÑèf1rÿŽˆ}ŠÈõ¯ùà˜ òb*ÉOÝ0 ML»QÒ½«å`[ÐëÔŠmÐy½MÃc”ô÷Ab Äê^ÂÉžW…%R¾Ç1Éâ™´ìµ8‡Tw$(›ÅhQk²°%dsåèVxì„ôÁóòHÁ 11ñ ro*"ü0Ÿ[b®6ÓßG"Ⱦ`EAÊ©iÉÒ7Èèѧ3(òNPun~Z’%Sù4eâ—i )”„` Fàɺ÷ÎX3¡•]cÙâËm6»]§FÅ6)èv…šÒ ž«Y&IöØç+Ê7B}GÓý*Eä€ûůw\h`:0y®RèˆÀÇU V»‹¯ßã †E°1tsEp¢­»À¨²@)¶ÁíÅoï° <“ÓZ¥yN¬âX¡aæCOãøÂØBeÚ«H¡tðÉâÈÉ[†Ò$¤£;ö7ôD€½PI~îó$/MffBI¥8Cýàݼ慙¾¶E™©Ôœ™‚£€?¾†7I eVcAÄÔüx“ šìÒ«ûîoRª¼ôRK‘'¶’õ%‚0!ä1÷á?ƒ"+T®gú(˜"V˜÷@ÁV@ù9 Š< Šãk@,|¨ÄÉ DN¾:ÖÜ~/R xØßçžös4 ý~Öñ‚_m™¼wÜ{º)›}Øsb@o%×QN·9•Dˉ|˜YjEx…òÊÁ×J  GŸ:m>örÀuLH8¡^ÛÕ3V÷2ÏÓ©Íbµ^—œ»ÙW° ’à©ÖH7¯¹°?p6ŸWŒ…¢'Üz)¯[Ø0ô;=¾œ"™p¢Ü>Ç VÖ>ýV“­†Ñ¼P5JkÏ­ûiüò²üÕ±qG†nÞ›áb%`Ú¾'B?x3RÅæ&ƒºdºÿQŽcïå—Ž¾°Ãe‡VÒùÙŽóõLªéÖ,êªÊ#H~:cÓíÇïfrò%ÖôE±CSj9ÐGP9³Áï¥Tû0j¥6yò\>8½dkn‘ßBч{åÅ„Uè¾èwí¿@I’Œ ÜNãþjÏc®þ@ÜíäIÙ¹4÷*)WKR&âjI_¸KN;õÖÏ(”£¯á©Í³pé´Olƽ¯©ΗžVŽüƒ ÚÄg„‡ûolaGïÅÞ–Ê"-œà|Ûï¹÷> endobj 1 0 obj << /Font << /F32 4 0 R /F19 5 0 R /F39 6 0 R /F8 7 0 R /F46 8 0 R >> /ProcSet [ /PDF /Text ] >> endobj 10 0 obj [306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 11 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8] endobj 12 0 obj [562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625] endobj 13 0 obj [272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8] endobj 14 0 obj [667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7] endobj 15 0 obj << /Length1 1644 /Length2 8581 /Length3 0 /Length 9641 /Filter /FlateDecode >> stream xÚµTTß6 "ÝÝ2”4C—ÒÒÝ9032Ä Cwƒ¨„4*-]ÒÒ!Ò ""RÒÝò¢¿þßZï»îZsï³÷³÷9Ï>{ŸagÖÑç“#l!Ê8ŠO_@   )o"(æÂcg7€¡œ ÙñØ H7.õ/†BÝÚA¨[¢&Psw ŤÅ¥B’H)€"ÈhòÔpˆ»ÂÅ {bº]ç¯O§@PRRœ÷w8@΂„ÙàMÊâ|»¢È  °ƒAPÞÿIÁ)mB¹Hžžžü g7~ò‰ /À†²èAÜ HðK2@ ä ùS?;ÀÀæö‡CEy‚À­Á f»Ý†¸ÃÁ$àvu€¾ª@Ûÿƒ¬ñðgq‚ü‚§û3úW"üw0ÈÎáì‚{ÃàOP˜ ­¬ÁòBñ@pð/"ÈÉ qòÁœ@¶·„ß[”åt […ês³CÂ\Pnün0§_¿ÒÜ–Y V@8;Cà(7¼_ûS„!!v·u÷þy¸Žp„'Ü÷/…ÁÁÐ_2Àî.@C8ÌÕ¢ªø'çÖ„÷í “@\/;{௠¼] ¿‚¿Ì·ü}].è­ ˆ? ¹}áùº< ÒâïûoÇž  ³Cl!O`p¼²ßš!Ð?ðíù#a^sÛöüzþþ²¼í00îäýý÷Í õtÍxþ”ü·S^áðåð ‰ …%â¢ÿÿæù»©ÿmÕÁþÜÀ?UáP@ò·ÕûKˆÇŸÁùçØpþ»‚â¶Ÿ!ÎÚßB@TÀîöGðÿy~‡üÿõþ¯,ÿ×öÿß)»;9ýösþAøÿøAÎ0'ï?·ý쎺 MÄí„Àÿ—j ùc åNàÿõ©¢@·"âôwanÊ0/X†²³ÿ£‰þ:…ÛäN08DáûuáøþÇw;svŽ·—ŠÛíYývAnGê¿K*Áíà_³'$*!‘ o<Ûø Þ)âõ»·@~8u¸ç€"x¿NTLTøeúÄ…@Õ¿‘Ä-ÒÿIÞ2Aÿ IÐîoôkç@ð¿  ùaÿ‚ Ó¿àm*ç àm*ø¿àm*ÄßPä–{{ËþË-ºü Š€ÈA1õ7¼­!剸—ûV’ûoøŸšÚ¹#‘·÷Í﮿-ø_ø÷åxAìð>O#ì„9¼ k>«”£÷ä[~8Á¾bœÊÅçûÙâ~A„ÄUñ*äòD.©¯“dnY‰óøÑ,Óµïfc väû—ºM—~WÖñzc+Mx3£T=#y›rÕqø ­ú]»ú;b4¢·©±g¹ºKéäŸyv«xU(þ21½¢»Z!¦ŽU<Î÷Üð™EpÁ${¶íë),#7ÙžñäñÉYæÈ “Z<žÿÖsá|_³¡çS>_K „ÜÚiÙhÍh1ŽÉÇîûʯ'«Qò-|«óÊh5]/ÓB r©bnû,]<0²8@³a¬PL¼<k§»Ä.߷᤟ÙJC–U-^0~-h‹ç¦ÛºvMåS6ù *ÛãˆÚÖŠLëJpºvÌ)‹Õº¹žüIl†6§çƒdÀ8GMÂMà£ø!Ûl”y‡/È‹p»õŽøÙ¾ÿȈ çù‘é¶ŒÁ(C+¨_О9ó–ÍöãÞžr²Gtú¢çcwÔ«¾©µùÝti½Ù´ •µ’^=Dpgá“«ÁŠ{Ø ¸Ø2ö"ÝAJ­~w@ýò)«~N¥yâæ‡×ò¶d²ƒ¥šè!ˆ°wâ… P^rt]Cä“£‚SF©áš±¢ñ(ü p…<8ÁoLµxt'ü±•g”&qyÉ„UQqWðu‰°ñËÜöhþÁÑÃ65~*±O哌ҩ´š}[,µ2aHNÚR­”o’ –BY3dêÍ:NìsújyR zVÜì/ã]Õ°Å}ï]²X4ÖâWÈç4·ØÕZ]eÈjél&%œ”“=p²&që(ҌЩ?-Æo}á Õ÷.\œn³] 겑tgtyÑs¢³ÔW©åŽœæÒxèn_ôb*d¼WqøsöûÉ«šú&ÌööI¼ï|…Ã>†ÜC_î —®œ,?Î÷¤õYÑ•º3Õ‡ÝÄD4½8ÄŸ8Fiçõ¾˜*׃&¥˜Ž3=„LÚLú©ØLº¨ú—Éôjô Ÿ+R•–lt®ö@¤ié˧RŸ*(úìrÐ©ä ‹²ÅU¦‚¯1§W²Œo3ô, k_Ivcš™e0:ûÙQ#Â"«â‚ûBT-œ#´Ð"ài‰?V¶ N²h,h¯¡È»3Ów“šƒµ»opf¿m¿È(k'FÇx€ÆÙÏ1»ÊœÒ­ %¼æÛ§„*¦~¼¦-”@í¿Ðëá´ . {?Lžs·ûóx[ú›ËùKæQƹCÉêgz€‡âfþE¯æâ,y6} á4FØæiý¸tXε|­Üß–ÛDÞR°}N4R4ã«Hî(O›4žUOv©­ ØÉi¨Ë0p?Íß›ÖÞ¬¤Œ/e>feÜÉ ]Ã|¶17Þö›÷á{žb#ej»Uá•´%?àÛoYcnc95Q®ÉÁqâ¾ÒWjCêO´Ú?N¶Iíe˜§± e‚¥Fav”Ói× —šBßmE‘屇R¹4ß«óz/ÊZ‡~Úe‘}Ò´Á-\ˆ&g†JZËèü¨ðÇQÎ+:)“ÁœYM%OªKÅ^ÁyÙÌ(á¹cˆÃ£F³yNëHJK -Ãû8 Üª¤ÝP¦"€”l>€ë®$u²J&…uÏÈd$VŠÐYsœs:lõ|øµ ²*©hë背YÉÎà¼ìÈ‹!‰%3tçõ8,Vgˆ¢ÎÑXza”Ø{úøÄsÉ·í•Ú­M8{¼ã"´ÎR±9%é Ö¨Á¢ÓÒ9ó&"ŘM¢ä̱{& X•J÷ÔN^”´Ö“XÌLZšdSмO¾WSžqõÙ‰»ar^Ê”¡–O†Á¥Oü$©AãýeÍdz7ª?:Ÿ—>%k§ æ Iƒ/O˜y)>âµÌù?Ï&ÒæÙÖ6ò´&é>wšÞT)¯­["Gc~ÀtÝÛ•gqµdŸp\­&)Pn wÕãÔˆš}jƨCÂ%R æÑv1±ŽBD“ÍcõÌØ¤í³æ=S[˜ö/EtäÈ=ímÛŸ ÔüÃBj͉ó·|N“ô(ÏØ'®0Ì•²D|Éû]|ô€ÆçD|¸MÁ… kUÌÕÚ—Îö/‹!Ў憠5s׌úþ×Ó î †9§Œ[-÷‹W¾ðÊázò±ðˆT³ÍçËŒ7æ¥>d-‡ü<ïÃrëó@kRîKÆ7µ°=fÊsµ!Ø«~×Tg5€z5Ú’åÍ­ŽNä S1óÕ£S/²9¿‹ð&ñ1Ó¥·Ò˜ZÐú¡çš~Âü…[¼Ï]C»yø¡màPÀΕõW5Ük…UYiÑý|L|·‚šmw ›dÍ™ âVñ7ê­ø;§kMß#¾Jxkb|âòü²ñ#ÛX¿ÒVL±6õçDL:&ß|l‰ÞfšEØŸúßos±Sk̨Cµ…ˆ¿–/-8µ&k ã*øj 7-ÈÀÌgîz%ÞÏ ¨dÞs,¼{¼=A0/9—ÈuÞvé^…×îÎCáT>þ.R»ÑàSd§áù’êÌ@ Ë\ ³Ôc˜î*|õ™¬q´ÖYŒ&%÷{ÂJ-LØîŽôª< ,ÅÏELD Zƒ†˜³æ—ä ,}B,Z¨30Kçõ€iH‘¼ÍõM*Í‹Âdª)´ŒOÊž½»QŽ–5fí:C÷\zÑ_|úT÷Y!Û« ë#ÖxÉÁ‡AÿoÄŽ’´8fîTXÅ?ßv#}6;ÞÎÚk%s'vâ³À%ÉŒ´gY_¥MOÍá½)ueGçï¼ØÄ¡˜Xh]œ•øÁvÑÆÊÁ}H6åȈϸ‡†e'Ç>ËÀ/'+ ©!Ðñ¤Wª•,8aÓj ›•ι.¼‰bq0Ál2qøÖDÒÍüPª¨Ùz=¥qŲμŠ¥áÉ`F7”‹Žé¿CÀ++LÖ¾ì%ž¼/ÆJßvb>|ú0j™µ—üò¿/©Ï=Ÿ:Æ6§øò›J[õ+à±Î©E‘…íâòÛ òa+×lð-Ý©ä é ¹¼!ÉÍÏâåüY¢EË4òuËzª€´ê|I 3ùò}F/RÁ'«›¥®©ŽI“#¶žñÌ›#žW4}l¾[žþ]„ñ^ßãÑx.l£ÎsmÜ›õœ~s§s`7‚„Ý­ÿ[@†ä<úlÂ’óÅî,žÔÊHè}žìùÜœoxÖʲJæôœGï¤z²J/>¸V%Ö?·ª¼7z m:R#mΞkÝÌTE—¶iÜyÁ'»slù€ïp“ KÅ_ŸíÈàtAð©ÎÑc×3ƒäº"Å;MùGjؼKWÐ=ŠÆ—ÝþªÜó5Ôò #2Þ²éÚÖ}è˜Í")dWRKIU¶JkYF–a‚uãF{ç¶¼¡,‘êe°mˆîýíÍ`æë’R˃Ջ?‘Ç:G/X e²plƒ¼š–­O›Þht5tgâ{—D¿ ­<%Ó{ô…nê*ìû—€ûÛqz?Ì,#«7˜+0Dš®3Ç⎛žAurõÛAmšÂß]v†ó~sЄ+AU œñ õT+ ï–Õ˜UHt¦Ÿi…SæÞ¼V'y*EoÙ'Ï\üZK6HòéîÇ'9þÇv_iÞÎÙ6 mÎ2»^MpÄ"¼™ù.wèòAz¶$…ÄS¦9-bwkƒ×?Òë˜îïpcBò´¬î¸«úŸ‡ñÜL Õ²àKá£Ç©õ±÷ÊJ:ÅÊ =µY”>]2Žîl>TŽí’îaÊ"3g ÷ @#]¾ÆO;6óõ yÞu4ÏÄFC°-1ð‘£Î ·¦cÈÄþLÐg»¼®n¶³ì†½yO!Ö¦~)¿Ñf±ùìO"Ï+ó'‘ûªahJ/ò&÷Ó=Ê¢+ly;ÍÓ½ŠC‚{ILÃÕ§. 4¨ëÛ9.˜„¤lòåÄbLx¬WS[õXU¾Ëu£,Ÿ*΃ [k˜q§‚–¸ƒÝ¿a~ñ9²ýN]’ZI¿Y‚4Û~ûNëiefûáí´ƒ^:C“ûöCQbq3Ú­k‡ “ÆÃBUV³4gqèD>*ÛW˜VÖøpÉõµ7´ÅZÿ†å³Ì%ÿ›:y1•5¼ëÞMù¤{W½`“¸ZŠã&JþhU¯¶ÃÃW!ÆdMÖë™NNºEäb×X0DaXp‚²tuðdÚ•ÆÏ¯KZìTóºXVžÃ4_Ccº|3î+•=“Êq| ŽÞ ßOg/¬ªWõËOÂË ˜šÍ¨€ªÁ½ò±;>ε ü á‹ÏÕÎÛŽxz¹|ùõËȦÇU›nɳѳWf+¥Åüw-vXRçH3×QÚs ºü2 æ)‹æ"„¿÷›‹ôé!ú`솚^4%ó®ƒÇ"-ÛÄÏS·+&gÚ×é”:%ÐT¦ÌIÆÉ‰ 5Þ‚ÄM̳Hbб7ÀdÆbMjr…—*ÇjÀ]|¶ÆÌ5KþY„ËAw5Õ«ñåêͤN²h[;ããþƒåʺÙóR1úϨ^ÖëØëcS ¯Îz4^§æÂªÑ%JhfwkÄ,­N÷T»šK_†º‡s§ëIw|;XªcÙ•âÇØ N;ù_vñ¹Ö7Mƒ^K²Z%à!h¸” ¼øÑÄYƒwƒ×†Ñ?qƒ”,¶oé]e\Ê…·Œ³ã«HÏ x¥.¹{ƒ´X÷uí¨%FáçlÉæÖoC:ËÞÿôŒˆ64ïЯmo궦ýœ‡ÖDcÖzJ}ýÊ:@tßr]óýƒ îz±øã«%+ÍÎqïKpã±Có;ö{êó. ñ¼éËp—ª{ÆŠ<~ný`c±òwނض%Ø&"˜ê*ùïX»wÄÇÖ„§øT$$ñ",pÂa¹dµÃÏdôXI‹L”øÐcÕ§Ðæ!foGäzÚz6oR…2_…u“:ûÛzèS”šQ»T Ô–xÂ1šS{´2×èª.h4¼¥¹òá³Ç!Ç.ž¬à¯¾ei[î|в(}TµôÞ'6Žþý†ö÷WµÎ$Í£›Â™®œ<ÚŒBø…GÏÂÒ>qmfXR\F»&Lj¦ÞE'æÒ°u N×´2w¢lJï}§j½Ë„•Ûí\ýbBÝçyî´ d‘.÷ÇÄçL¬Ó÷@­&|°2’s.^­°—ïZV4òñYj…÷RLïÖÅKº<é²tÖȺ]Z³–u3®>¤ù†ù`ÛçÕ•xèÒ9í×Ï”F×ø'$EvGO¦rS"wF?Êò嬭 [T¯?¾ÃÇî%]:>ãBcCVÏ83ÝŒHÉ|*›ÌØsƒ$¨¿ Gþ½Yæè*°Ð0îÀÔC9eº¿‡KÛ=H§ß Ú'q@<¢ƒ;ßw¿/"S¹»FúR) Ë #-«—O¾P˽eì=H{Ô:€¿Ñ5Ïâ˜ZŒ+[ØÍ»ûêK’‰Tìêbt'JµÌwML4"ÿlõT‹[±'êP¿g¶Ý’]qô$ÊÓo‹F2âö?×ÿœídÞ¤IžË¨‘Þ_w ?–þr—¹Þ ÒGÀO¾™=‚Ž‘œÔI&‹þŒ¾`ÕÜzC×vú;)÷±mÓÓ‚¨±Wƒ;' ãhË.G1r<Ücä7MßnÅHš5“£Ë$&òÎ äÅlµ§ânTeqÊH¬¯òY/Gõá$ëáº{È„êDûʪÞ+TXoò5Þ7 õÔhΨ WtÚâ˜xœdì+E»‰š'ΩNL,0ÉÈjNýµÊ™1'¹xÔõ¬öy̆øé’Ø(UyãòÅ•¦ÙÂB[Ó3Ž’HÕ.,'o[úÓhZòÓ…˜¢½ QôGæÀéAS4*½“c¬á †2ï¢xŽªlËk ù:´Ü4Ê\œ—ήS ýù”å›0õ·•w‰Æ'Ÿ'Ú¶óµöG¾ÃRl ¬”küÐAd{”–ÆZ¸Ï”éïùHÛ?• Á'û?>,é|äš™¤_ûž*wA«5+—û´<¦äë9è$tÕü˜Y_?¯ª0Üòkèªo.KÏÝœw#yy¤‘gdGØf”BnÝäÕ‹XÖëCbký HÎµì‡ ¿—”ó\¬ W¥ÁµÖ(u3 Onw6^ïÅ6Zµ˜›J1ßáŸæ@áTišîÙTv²6Í;2x©“©\'IÃ%ãê¸×}­Â©ÄjžâJÁ>/Ñ??î‹£EÔw¤õ8ˆQ®e^ß4äóù8‰ß:žölУ¥â ÙVÖ_ð•XD4JÍfÕê]Föa¸¢^H™}¢²·„ì.óÊ£û2_-è·ß¡¢/¯6F— n%Fk7n6ØÙ‹™Ù8õôôo'¶8…·VÒ—’FßAxˆcLaŠçØÏTÃèûRgygjZ¾8u"BÓ.ꥰö¦ XŽYË–scË€óîžìíprÅ5[aS¤ª¦ÁµqË^¹™iî—‹"vqÆÈ>*ŒÃ¼:Âï×É?'û°Pc’MJ-˜Ùì\µüiUC0é°© o¬kùÑ¥€”¸J—tž°±;ÓN"R6ž £Úè㘠Ìu>ÑóüÅ@kÿ=Ú(å/¢¯îùRÊËg'(ä¿;S–÷ ån‘¸–›ÔÞÃ+fÝBÿ‘vìñi¯)Üo¦xz°ÑyOŸúvë Q<ºpßÄÃf½;ŸÀ»?pzâÚãE«l47[¿æýާue³±Áº ”‚ Ùã#GÓŽò½ƒÒ•yª=³tV¹2=qOhúé'.°}•^?Ø¥ìë÷t)á³¢A¨Źy\kpÏ) –œa´®Wy]¤($~ˆn{!–oÛ­x\†“æ‹×».»v©è݉mÊëBý\çlQB1Íýp¾+±'×p¥®8 ZQcƒUÛ6·ºà³cB(>Õ:/ÎÈTu°Ñ Ò0³ –V صèÀ3ǯ¹I Ú¸?ïq7®SܯU*:ˆÒP­XÜ(|;Ž~·’øÍÐ]M¤(K{õéÒõsC¦&´Ê˜¼sâ‡u%ÜÉ;ƒœ!ÄòÛ*‘Mñ4ZÃ#ßš1¬YåâÀ×Õů‡ZF›ZØHöøBY?…¥D¦í½Éts†.9Œwè~+êβ0zH–Z¤®Hªð Fñ|ò ˜J$ ÕéëÆèØ7ÜšT•3VÐR»)o⺑wÉ~R©ÚcÛó™¾0ù<º¬÷ W}ç!ÎX‰ˆcÑñËï Ž§T'Âì|—fæz— J>“v_½2 .âÆh£L«êc:|d=¤QP&;‹aìIÔDZ§z Ïp,äÐ=-ûŸäMÄŒ>¤kNX¾;ì ~ö8×mKËg—þ¤/àtçˆìl8 má´›4ÿÕ3LªÎ€¥Å&¬ì,ñ=vª×ùIò´ßF.k…±ÎfkÛ‰]ö¢Óbª›Ål‰?öl3=x%(¡B`Ó)®$®±Òªý@©‘™âu8š2{°¦±Û˜¿B¢È·áïðž•…ŒÊ³{¾»!êiÍ_îbK@ ˜Yoýx¶ÅÎKöêz{âòŸ‚zFCï}?Ÿõ‰] Ý:'rø1’x˜Ø(QâêÛðY“BZ,­&¤¿ÝãðÀÁ@8k4ñjo@³c+¨0UÿŽé‚™Ö WLYþÁK§ÛIgmýØû[7jäâ‘ÇIÙߊP_æ¾c…ÿ‰ ¬4ýX+so¬úŒãQlç‡Ñúl9ÚXÔS‰¿‘*?öëå&ŠHöq…*Nb<ŽNëÇêrǸZX A:œÎp¢«–ÿäVÝIù®Hˆ,úÎKÝáK¢ª–ië\†~aCÓ¡kýAÛ°tÆo’áÓ°ÐGã»÷ZG(c˾¿^-[‚ÜÓ.THR>õ¤\G²7êš[)&âL0êM*ìÖ4‡1‘Y’ĸšÐ%ž/ù‚/8êæ.ÒßñÊææ4&Å“&d /°±°þÏÖ†nÚœ< )}´›f)Vá‰ÎÄx¨9VÊâcõcÛN¿t`±ænKíÉ­Q*¤)¿‡»·±˜wݶäÏ:pþž z/[¸ßöÍ+Ÿ×°‘V0:ÏþÝßF|ò“îíÔgè1欷»A­2/¿–¡kçj8×ëÒçöEƒvËi‚ËIÂâÔDXÃÒs{œW¤šš`ü%7¦àE²ñâz“@fê‰Vê‰ovâªX%QŠô ôÖöÕB§ëÉ=©~”KùT~nÜ}‰•Juú¤aÍ‹QŒö±M7ýW¬Í=nêqþq6ªß¨ÎɻҖ“‹1Æé¸öÙ6جôþwÔ9úÌ?—ù“SrWµIHÕ¶P•|¦SÑc±d÷u¤}©fÈ>`tÜ{ëd8\ˆqƒ?fÈšO®d#v6Ù1‘’k±ã|~YäeÎôsÜž¿ Ðâãè;Û}î5i–w§v÷áÊÚ ¨üžlj¢%îá…‡Ãl›E­Ö¾l’û«•É)r½’7„Q5—]fËŸ’Þ½‰§œ;ßt¿ WGb“ cøv’ðõ½‰Häb^ìx ‹µ ^ê«zær礃Ûã%Ôqf$ô84’„f[ÄÕÆþ9”p´°bëâü•:żÿæ®íü¾Ùh5 gŸ¢+¯ÞÀ|½Ç…nøgü½/t1öÓtE BeC¿»Ôä=ø†¹ÍBýM»î ޳£¸a'qv¦¨©ôÏY¼~|X>á.¿ô$±¦Ÿ!% Ý…NÛ$–$×^líæ–©¥NõÜç.íb?xbdqødÎê¥ ’(vÁ%…Sa~ÊèôÿDÐË* endstream endobj 16 0 obj << /Type /FontDescriptor /FontName /ZTURQZ+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/C/I/S/a/c/d/e/i/l/m/n/o/one/p/r/t/two/u) /FontFile 15 0 R >> endobj 17 0 obj << /Length1 2084 /Length2 16505 /Length3 0 /Length 17760 /Filter /FlateDecode >> stream xÚŒ÷päëö 'ÛV'Û¶m[Û¶&™L̉mk&¶m›MìÜlœ³÷ù_Õ½ÕUÝ¿gùYïZow“+ªÐ ™ÚÅíí\è˜è¹"rÊLŒFFzFFfX22UKàßbX2u “³¥½÷¿ Dœ€F.2Q#—;9{;€´« €‰ÀÄÎÍÄÁÍÈ`fdäú¡½7@ÔÈÍÒ G¶·:Ã’‰Ø;x:Yš[¸|¤ùÏ#€Ò„ ÀÄÅÅAû§;@Èèdibd3r±Ú~d41²¨Ø›X]<ÿ'%¯…‹‹7ƒ»»;½‘­3½½“9?-ÀÝÒÅ  t:¹MÈÙÿbFKPµ°tþK®boæânä|l,M€vήv¦@'ÀGr€Š”,@Áh÷—±ì_´€¿{`¢gúo¸¿½ÿdi÷§³‘‰‰½­ƒ‘§¥9ÀÌÒP—¥wñp¡Ù™þahdãlÿáoäfdicdüaðgåFq!%€ÑÁ¿é9›8Y:¸8Ó;[ÚüA‘á0]³3±·µÚ¹8ÃþQŸ¨¥Ðä£íž ¬µ½»÷ßÀÌÒÎÔ즮 jv–Ž®@)Ñ¿M>D°ÿÈÌ.6FFF.Ðô0±`ø#¼ª§ðO%Óâ¾Þö³@_K3àǬ·³‘àâä ôõþ·â,ÀÔÒÄ` 4·´ƒý'ú‡höþ8|'K€ãÇì1ÿxý÷Iïc¼Lííl<ÿ1ÿó|¤$µe´dhþbü_°°½À›Ž•@ÇÌÆ`úcÈ8>|ÿ7ÌðòJ,ÿ.î_¥ìÌì\qøhÞx¸ý=”¯ à3ÈÛÌ2@ùÏèë2²1š|¼1ý^€?]þÿÍýQþßFÿÿ$îjcó§šòOýÿÚÈÖÒÆóoƒQvuùX 9ûå°û¿¦À¿VYhjéjûµR.Fë!dgnóß6Z:‹[zM-]L,þš¡ÿœÂGxK; ¢½³å— €îãÀþîcáL¬?.ç³úSüاÿM)fgboúÇâ1³±ŒœœŒ6Ôèñçhèíì]>\ô|föN°œ(;€AèÑ_ˆÀ òâ0ˆþq0ÄÿA,Søb0Hÿƒ>üäÿA\…ÿ"Î(Šÿ fƒò?è#¦Ê?è#¦ê×GeFÿ  Æÿ  &ÿE¬~÷‘í?Öô•Áô_ Àüü(Âìø¡4ûüCiù/ãÍÿ?’Yü“ú£™ž÷è?²û³¬þ?hYÿ ~ð²ùü fû¯Ê>hü+ò•Úÿ“ûÃöã»ç_êÊþQø:|Üÿv6@3—¤LKÿÚÒÿŠ?ŠtøØMûšÆòÞÑÕþc1þÇ’‰é£Nÿ‚lÿ‰óÁÎÙÆÈÙâ_¡ÿíþaáú/øÁßí_ð#©û¿ŽâƒƒÇ¿àGñžÂÿÙW§B.ÞYëòüç÷è4]^°7á ±ª i{¨Âs§ÛŸà›%Û×H¥¢ó^vjw}B„J¢ªÎÚtºJîA^Û£¼\!zõþõ£*üg‚Rë³Ï‹Aœòô~+ìÒæÀdÁ/¡ú~|:UÁŸWGõ@k° Òd9Ž®œˆŠyhî}õýe«ca ûJÕì2p/e3tÑj_u‹çÈr3ç±I ]è ©Q/=ænïfQ³'߉¤ãh`}O£Y ½µ·˜¿=Î{­W¨2;wáâhc€Ý¢ŽM“{ %Kc-z—® ,yüà-$ÊF MY£C¦?bþ^m©e×Ü[ë6¶ÜÁ´—“¡À@ÛK¨-mF7p"QÀ¨n5ˆBs©e±u˜ ¯·Ý©w›Y¥à¯pÍÔ¿æ´,~´t{?78® Ð݇¥ü|nÙíöÕ(èÀ7wg¢³Ð‰\[åþNQæ2þ©K(…ŽL»â–ÄùaÊëô[ø —i§€‘Q›¢t ÿœ-Çç÷7ßÊÆKùŽ­9”EwT½à÷`vùwãΔËË 1ÃŒ0ÊÜïbÝ_r7b(”xê€sÁe —[•˜ô¢¥žD²ñ;lK¿I Y¥$z÷«†#uƒ<­¹òéÏÕ+ÕZcÙò•ˆ÷N£èƇ„ƒCû¸îLvîÊË…õ1ŽíÕ/+Ý#„‡¿m«r„ä~éPÈîrVH“ŠúTt¿;ß cüùLUØØ¶9IC•ïiw¼«èŶLJ”Œ¢pY®_æ˜7ÜgYoI´°§&@óËmss]»Â%|òú7²ŒƒU°ÏíÃÍê¿ßp…ñTTò>{mô.ÎŒïNï’zÛTê³öµxؾ¦ÙÄ‘/î¤_oòQ~|3‹lÙPsjXÁ¯ý>7Ü<þ ÕΈÎ?q* ((¥ÈØ-¤A_HȲÚñÊ|"Šiá«rÖ­Û@¿å -çÓíÒ%݈P;™:xaOÊžñÈU²,ÇKÄÙ³¬&[HÌ"^œ†•eÁªÕÉJG¹Ù-ô§"þjªmr„ ²Ë;O>T“ü[M‘E,—8„Ž»…eëmJQ©šb¹¯NDzDÚ¥ „¼×›2–½ös úTïTׯùÉy¼„ë(†ÒDñEswq¶Ä÷ß*¤>ÕïöJ¼‡)ppÓ†~M¼™„LŒ¥>ÐiMǶ ÍK×9!›•ÇÐ55߆q ®9’aÂŒå@è$u\sz(ò²2Í\ó¹L>H‚¬ !ð°§ýhñu’qe:fyNW°LÇlt©¬›žõ½óÄ&\xó3!$ÓÝt¼Ðýùó€UÕXç»Á½Ôϼš‹úꌓ(\ÆM‚ò+9éG¹l-ÆŠ±7oöMìÄ݇^À'§lÇát¾{°ÄLÕ-ú5ì“aªnZ,‰o£ma‰¬vXBÏUJÄHа^fÆYõ”*v)ERR›çã§Šº¬-.ì_sÀñᨇA\h™±Erf2óDãj¯ð{é1œ4ZW{?¹ æ>l¯ ×ø´œð9vêôVê"„þ„òéw®Î‰’M¾|™DL*ìÑÉûmÝKól—JrÒÝo“}7Ïvª¿ÜÛÚHsLåuEZ¾L¬(Ü-L j0{q:ËšÎTíâÙÿòÛcRgø:$Ì'X{ótFÌß­•kïõHzö8u?@ÖWÙ9=Œá¾½±Í¬g_Ö» ¨2x²Er=ʶ=‡ÄândB„^J6….òd¿êZÙˆ#”„`ËÚ±©\¹“—Òýš­©Î’ðz(á:Á梈ߣ{m“z±jXðÞS@ ¦2ɺ™ÌÛb@X6u‘‘ÈžØö 6k̇UbTÚ®“1.§BP?¦ÿ‚êËMØL`0»íÍ´i'ScÎå&T¢R–e8à-Ã¥»O‹rÏ@ãò“±Ð›¿Œ½œÚÂlŠÊæ~\;‚çžÜÑ;{@yN­~û½‘K´ Ó¯\†LñßD‰M,ž„ŸÓvMää§$úµ_×uÀl+ÞzM~÷‡„Aµ){,'鑿¯‚/© ÇhãûªSÅ‚¯© ­ZâÐæ^n_(£b¶`¶·ŠG‚•µ+fҵ˂Ox<€aèLhªG ` ^ß(åT#¨*¾ßºç<ÂGhãÞVpƒü-žZ\1dž|5¤±ñÆ…¾*Ý/Äša±³àJn*¹M{á¨cÔd£h—3R—í F£VÇÈÑ ;„ñx¯—ÁV*±`©«ó,å¶GÌ"" V)Ð+dmYÒ¶qr–/Ÿö†…šgóéòm ’ˆo=Ɉ?¨æ?§Æu¨~³¡´1¯êÎ\1ž©Œ^'n9*›OžÕÝ~}4bUbªó”sí8ª¶âõ­ÏòœM¿}·CôŠë††ªÌ?,à^À—ÍòÂÑû†rYæY˜Wì&/Ú%'ÁÁE*%kùFž ´dŽ·mgÃî . #®ÐxÅ+³ÿKq¼@á›öˆ[X‚ÿÆŒMùaãƒÖþbÅòˆÆÊÔ~0yWc  à #ÁÆryÆÆ8 ·G–s°ÏKH²p>›Ö“þJ'ÇãÇκ “keY&¼ƒÐ$½k¾Ê³±{" À¥´à\ˆ‹m/:V·×O’FLè·WÎCÃá [àµ#«¿Î&V5¾v”€ŠŸm°ö#Y¢ñ~ûò8€’PÞ¦múœÉpÓ•þÚ•æ|w™ä隟ç’Ößk¸aš Ö¾µz3Çlˆ1Õ9eaUƒIÜcò|î(e`þfÝè¡îyÛ¸‚2I¢÷ÙË;¥ØÁíª!“ ,.ín©¿„ÞI˜ë )†]‹–H¥ÓSŸK™©àçûN)kùð¹(™МYžü®“¹›@ñ'JH¸¥¯òבE <[Û…¦o=Ïg ñ•È/›Ôm‘¼E¹I»ýh!he`Î]E\¼1"b†¡êÇy[íÃ}dJ â…öŠí};Ó(Áþ¤e±í$Ó,,m÷Š\‹\§ÚÑÎ\á †»•„§N+Üò‰…§Cγ·ƒ‰ÍD‚fÁðúë¡ä̬6^p¤sÌhuîë¡§ \Æïùû$ EÙh#ã½Ôâ¨zë E†že_•ja"†u•’zðÄ©ËÖ,U1GéËîL òå ƒ ÂTÈTëåÊpÄTCÓ(§-œê8~ÒºíG;Órú¶Õ.áÃFÝ/i…+>ÝÀNˆƒª‰å^¿}½œ• îšG’üJQ×Ȫ­$8$µ¼åB–¿÷žœÑ¥SBÅÑGÞñ’c1a— _‹s¬E1·jÔÓ¤Úû›BÓÉn3ÁÎÀ. LZ6š2Y¶î0gt*¶²QžÀ[F¼qsõRßú»ñF݉晡lu¾ôªQZ.è~ï—T· Ù͵Ÿy¬ 7L©¤þhN¶BïçÎIè=×WvÚ›`Ôi­|¥÷#η—ößѽã<à ‰EDˆ¢¼±L é5üµ›N/±ìà¶ŒBÍSMIé¦uïª'澓Ëò:t‚£¶ Ù ÁûüðûÞÀyôD?Ü—ÜDc61èåYâL´mP'ìU5žvÃ,à6× ùéäºív1¼WÔ(Ÿ˜g¾À6y5ÛÜ}™ úc_FKÐSEÏïwhö§´ÊG{á…㊢äL7bÆÇ£æHñÄ øõͧóR±M#ˆ ³EÖÉÐ Ÿ(—žU Âtd-4á¶åë—ƒ‡mI]’ÙrȦ䉴36ù®2~féVá×ëFg°óÈ&sÊ›R %ZD~ªÎñ çþ–@n"eR.=vtòˆ'[Ï**ËFœH·ác«ž;’(Ù>ea}ea#›Î_õ9‹Z™ÜulrÅÕà›ç«è‘PhßZ+‘ñüKž¬ B·ú—s‰}7 ω’kà •í-(iþ …”Ü,>Ds‘*¨lƒñš§_ÖÂÿ-¸d‡Qlpsj·ØСð²ë"$A'‹`—•"a°©oºjŽßè—…9ÃmHX3uV"#¾qÉìkê^#ªŽkåO<²éTrˆ Ã-ÏóŸ¥ê kÊ|l,¼bˆæRÁ¡€×ÿq˽ç.]k%x‚îQ^,FÉ(1Â3ñcUÉñÓ·ÒÁDkUŠ—YÈÇ™Â@½¨)/&š.ü|E¦^?Bàð'æq8–réd¹•‘$Êß³¤Ð„?ÃJû ¶òl2 ¯ÀHªÞÕ¥ £HÉäÊ-í³Õ¬®Ñj¾ý}‡½7%èj€iâÑd­¤ÓGâ9P)è9­ý’Ùl²#“B±ê–SÂçï|ÂËcRzx*L÷€Ï׳?Q,Çt”Âd-Ê´èöƒüTœÞ<ØrŠZ¥óS<„\àÑøzà¥ÓXZ ˜Q¡‚lñë›Ó”¸°qüp™½ÁÍâ’VáyÈ»ÎNAkɰô=ü+S ÕÕ¹“Ö)U+6}<äÉÕŸyWÒk®€±TfÓ{â^ß ››òv¥L@U$É“yß!ÚâÏÁnv œh™âAøº»êµe,ý×F•BÄžžm»Ü¿giгLˆó=.!’ƒŒ'åÞ¾l3˜ù²l&ÿ5Z4¸K"QšŒRyHa&ç< 5G¤©¡öêûrרܢÕ×­0·Hf5>H,Ùq¥ ù=<þÈà±)Šç(¼nâÊ?nGºÅ-±.Poí3,é2TÒ*…ˆ…@ [oˆ ö+AëÙhM÷oÁ„JìL˜t£Š†:ô4!“Ȱc{ Ð9Ê«H'æâÏ«†‹SvZÞV«†,>6ŸÜª RHÙä¼úoÕï7¼äÞÎ*öŒœz'æAŠU§^ðM8éÃ.YüR°3Ìl>ÿ¾ëðð_Ééê¹Fêt•¼~ä kækâØKÃÖíéGüº®7Ÿù„÷ÐuЍF[ Úá’Cu`É-y•Ó¡Ú·JYeT<&Wïxsœ‚Ää¯p=Úê£“àŽØþÝçœú]R[—,FíÌm© „aÊkW{kT8Ú“,@^u§¥‰…»Jó×–@›-ºtü&Ý,KÈ=åàZl Ùdð«u‹2ý¯ï·¯nƒ¶ô¨ã*»=¢­cË6ž/DØ ˜yðZ· "õ•ý¶ÇúMÕ®lß¡—™Šž‘\¾ÎÁ½mEí\Ân±~©eª´‹0xå÷u€¤90+3ç² %x*éÕ¼{4\ÒŸù!!sÇÃVYà>ø«|OÊÉñB¨„ÅL(hS ÅÒµ" g}¯÷ª}úâtUË ù˜@ôöŽ;&zÅ”J¹l ä‚ÿ‹®,–jç§QYÁðO‹I.¹b×wh•Cl.™xœ”>U™R#MÒ=wóá„&…`OQxŽƒÁùžàR”ÉïmVÈl²ÅeR]&¾>„]¤q^¢;hj“=±î­ZÑ4í¯Ú܇}“ýLW6þËÀ.¼APC×ÁO¸>à§D kG éú+ìxç YžÓφF—¹¨EC‘:Õ‘Ȇ3cbYù=î¸Ý§F„xð¹^–W²F!X¨¾V#5‡Ã‚Ïù‘û¾ýþHMPiûváÎßRí¨½«m´K½®£’FP£ø[9ψèd§É‡òŸÁ.d ù† %d=†ÉyçëÃÎe?ÝF[ôu_¾PÇc,¼*l—È›…Ò¬¶ul„dÙ“ÀD/«Á´yM_›Ÿ˜í}‹umÏ™NãíEÓ|ò\o)«˜úôDÝöiÈüîU@“Y¯'–µD2}<ïûâUº~÷”£,о.#UíìÚþ¾0>~Šƒÿ”j à:MÒ.6ëÓÏ’J!’coÑ0e^f—W¹þÁ›Gçý¢€gk.)Í›x³üÒŒi°÷É×g´å"M±Óâdä!ú“m⮩^jéUÄ®-Âjhü#ˆ «Uò™e¡#ixšòƒˆÎ­Ð¨+¨|·Éò¹û¤ìnu*¸ªZ(_>¯bWɦ¼³NŸ |™¤¸;½ï}ôÇ2U—] ¥9Ätƨx+ØÒgh)ulè¾µøÚTñø¨MXá"Zê"ÏrDMÿž}$·$ÈoEÅ«aa¸'×Áÿ¾˜7üî· Ü:S•ž÷IùùSÉwºXÄ)rk@uHhèÎ ûõSj~|¢¢/D$Él›ÌÝìç‰8ÕœfDñû'ÝCÜ×{ý¹0\08ž4˜.Ÿe€¨n_‚¤ëû»RÿëT*E¦Ë1Çç–oD,×D*cÜeVÆ(g«d-.ÒqP ü#¹ ïçNê=8z5? Ûø©v.²»õl2ÁØì;us§ÄyiåÉK(Ð,K#uk啺¥®$çÆo¦ˆºT¹Ï—Ä/°åßá T4»×ky+¨Z-¶4 ÛYÍ~ˆ‹6[ĬÒ/Õ«~¢ÒW˜¦# µs÷}¥…‹Ð–oؽ©¾‡Ó‚‹V†6zõÌÝ]²´ÍèÂ6-¹œ½½im³Æ`‰û|÷èŽSËò‰¢ÐŒo ‘DR[@f—‚Ó%J 9\»ãáV7xþ4Ì?_ÄE-Åè‹9Û¨K⽄}Á¢¶â5ð{ØuO<à ll¹ ôVq³d„J,6‚)èE­0ãɪêÒ-rÃqŽ{ËÔêsáê5Œ (ÇA¸ÂŒ6g{º‚ñ°2`1»$•>JSáŸÊžöÚW^Î>¡A¾ù}²ó *h‘…Üfeó¶mÅ=B,1 —*pÌ}|8q :õ¦ÍK /Òºkõ˜„•øW˜&§+Ø/H>£.VLÓß…Þ"1ªº¦«ÞpƤÝzheˆ|@a®B'“Ô7bc3`S_¾+…4è¬mðªukrロ¬ ˜ÐÜ‘mÕœɷ® «°q…=w׃F—e‘ô.ôeÔ›©·­ïé—jôCC®RÖQ“¾ºCV<QaD~MØ ÕG—'vªìÕò*ä- #ÇrJá2•Á3dˆô…¥³€²{éŽÚ\!½FfȰâRÊÐá,®kªì+FW •IP÷aö­=aÕOÍŒ‰]0/MI*rtcUžiíi ÓÕ‰£ŠÉÅ-ê¥ ÙÉ&EÑûÍLÆ«ôã`ÇïÌB›p÷xì´Æ?ðóÊ ·i‘ƒûtˆå“å ‘=4—S¸š·×¨/»ŠÞ5Ÿ¢Áîfà—FU@›’ªƒR¡¼²Nq佂}Á«†{½éÀv%® ñábÊ‘>nÖ¡ \ÕšH3™ËÚØBh+Ä M‹F7‚N Z.á¼õ„¤ðgãYFX"?‰G81žoe„Ciàò)3âm]7{¦öý¢Kž "Í’,Jv;û°c{´cˆ:˜"ä0MýÙ –Ù>oo×Àãg>6 \‘¾ gž4¦0LáC·ZyZ¨< E3’øús&ÍC¶‰Ÿ/xÔÀÜðµ%*·Ûs'*ºŽ¿˜¼¨[AWFª\´àøfÕ)Vû˜Æoô„æž®§$ ¸ŸÄ@ñ–“[ÖQŸvÂGJ2M^)uÊØÊòÄ$/Bx„›Òú?{Ú»ÕpV»&Ü\ÕQŸ5jP;š+A{ƒ‚Ôr&¥FÎL߬14@ 挰“(&€{åªn¼¾%xÌ( %¦&-8Í9°÷ŸqZ½[ïнSepxXrÛ«=¨ù–ý238Ô+-ÎÅNÖÑZª6m&)(Fúry¤GX²8 ÿpjšÖ2nÚßt³Íb©÷üšáV*¯eãnÌ(Ì{],ºOçÁ†B Ýì¸ÂÝíÆieÞRàiêݶ OáöÅGŽrÊ?,pÏ/´Îl}Y—ªQÇóN‰É‰8ÌZÂ`:dbCãÆÐH¨zŒÎÓJþuÒ­­·GB´ÕŒûÒ1ƒ‹X–ïR©ÃœD;&RàÕe¼æl’èaчCó5g®¥%¡»{R ó:þôÙv×´F5¬)wŸ#ù™÷ÍR×WþKb9Ö.žf·n—Í¡N—&’k}û"r%–qÒŠ"Y¤â”¡qcÝjOÄÀFDH´dñq¤Ç£Þ©æ’Äðx‘ƒ0 á]wø-:}Ú|9œâÕ„¨O§º‹¡u—íë{OqÌàözRæÀŠÃ]{3õ¹ªŒ¡†bã)Î.A#ÀŒ ÂZ¡£Þ3õ·RÐn¯*,.¥÷S(üVYÌà°Š£:)Eþ‚S%:§çrk´2åµlJŠŸÝôˆbõÈ•_QÞ~B&שØ1n»FQñ[;᢭åa N=¢ÑÅFåÍAøõjQƒíhÍËn%˜RÚž¾Ž¤Ø%ûÑîôqYò3Ì\õXÐùξÉ5ñEÔšP°e*¹L®î1ê–18Ó þDnnª!ç‰Ò=87™X~÷.üù˜ì:W•b÷9m &~1ÆuðU3JA6(ÚÿA,»i­UùíºhÎ/iµÇŒ9:24ÅZ—µß§åªæ8ÑÆ ´ÚWÉ?lföí;SÛÚ@ØŠtæçˆ˜Ï½¼&zø‡à=âåWSsdÉ%…ewòs Þ¹Pr_‹jfå K 8ZÎ*å6{Éò·>(ñ)Ö)å’*äè1x‡U$ƒ=!N³¨ºRÛýÏ(çgK'‰G¦¦Ži¬ ¬´agÞeEÖbÞ²Lw}#ÝzzÞ…¢ò?„5éêülpÕ¾ù "tVU*AɹDg@ëT$m±üöì¥ø¼¨lsŽ…oñhÒŠàø<ÛìÙ¶JÞÊ ·%v‡š‚‡Ø©µ;ød½ š‹â_V Ö‡”Ô›ˆœnXÖfÌHͬª:šÖKƒ2ÒóP6‘Igd•jpˆØYéj´ù–UjÒñå l)ËM^Ü1(úQ:‹ÊC(öÆ~☒· dŸË¦\ùpúa‚öEjë- n˜š¥Á Ã;ÁèËž¼ìâ©O²Nm|“™$®!íeæO¹*sÇcÈs ë,Ùú¼&*Um4˜*Ö yŸ+Ï,×/¢Y×Ú¢ÐÐßh¾ªÌ²:;Lô›âqcipF>~3ùŽY4xÇaV0ÔÚ<ÿ( zÅÖ'ÈóÌÉÆqžîy* ~|ôb{tYokʦ»â }…«>æ’-~O|Ú9œ· ÂŽ?ŸðkEg f•—é€jc³ÂÌ8´ü"B‘©0£)–Å”/ð;çSb4lr ÛLhhÓ|œÉÙà}Ñ–BÑu.^ÝsˆÝjt=tÊæ½çM[¬X\´ÚóùPax³›ßYÙ’Š9Õ•’p®óhîmþQÍ<1ÄSí—˜Ö䑨ß;б_d†Êm/(aö‚¦ËȧžJ\¥Nö£éíUŽcm׆1D~zÍÝX÷ S>`ä8: àÈq‡Ï‘E U¶ë{âY KfÜu2ÏäÑÅ"Þ¸dhwtŠCœ8à-Aþ&Í÷Ž—çbÂÂ@c¯»Ï±¬|c„ŽSš#¯Ç§À*K{Ñ–¶YÏÍ ÍWy^¨ Úc2Qï„,Åf2Qh..¹ òeåÛ’‹Ð¿¸FÏçÿ)Ò8òUYÞ*x?£hÔíáTn_% ÿâ8ŒÐˆ¶ ™Ä¢ˆ'0!…èsÊŽ¤dÆÙ2Üá  MŸV<:a^÷{ý~ÔÀ:*•ÅY£FIÓGPŒlÃ(Zòâ]+b ãÖí<°ÖénÓTÇ?යpâh²ŽfLI—ÿ¾uÚ]q&£v°b¹@7BÒPþ]}Ì<-‡ê~²j%ñ"w7`b*¼i­6-$ùRq•m›JˆV`ñ@·[œÆ‡?ð¼4@XíqÊf¬ žJ¨¦AéšPº´<‚Ãmžúeå!ÿ Lvh*§JýFÆo–Ïê…Ì÷`“Vg’:*¦´¤Y=kaÚãCXÀëÂöeHÿig¾ÂKŽ|„œ/D%z;GÖ áz£…æ9ùþ‰ð™Fáûéœ]6¹N¯Z”9¦\¸ýÐD9|“°ioÂùŒ“®Ú#UãØá–3Ç’ØqZÜ×–úQ‘üõÀŽw[Næ<,"®Þ¼ËiNçÜó9¨j¤ßÉ¡ÓBÝ"¿x£%Ì3œÊTÚü@”¥w]ûslú½–&2xkÉlü\ Ÿì#«ÁÐq@6íçк_è6¼F57k¤ú»E>"¸ŒïPBå 0Ƕ#•u" C`!>fûß÷ùWêWjšGTˆ ðÓeê½ë§ãŒ\OkÊà:°¯¤Hjluù-ƒl’Ü.2!µž›%@ÉùäªKi8Zïèg.¨Oáe-!i¦N9Nf=MÖæÀê䔘––qð¼‚LÀ5w÷»)°ª&K·uõru<å\äpØÓ¯5cgzÀ‹¨R ‡áŠÄK¥Å(j®·éð~iî÷q.t«T:ì¼vœët®+ ²£­°-DÇó¸+ /)´™–¾““ÆÔˆ›-jÆÐH†‰Ö"IÒù_µ±˜ïˆ¦‚L»VÛF¢5¢'NÑË!,<„eŸOL]à pl¤Âw*lßó¸ˆ ¿†HaNkö9žâ`‰dEl³lß}'ËMikÙWÅYB"ôaV®Gaë’;(JÛFÖ@-o ªˆ¿zqÁ\õŒ¬Ø–±$q˜sÍx ÍíïéÚQµ8§÷!… Жj6-2ËFâK¤ðç·CÄÅwê?Y\K{ž2cƒ)†*ôª  åOòlÕë| %æ*™kÄý(0¿@ìbpT­lb¹—­ÁÜC† J ƒ3ü¶Ž¬Ü£`…JütÓ²×·bàÚ´uô»X!“ä%Öbõ`>¡J77:Æw ó¾¸'ìÄÓqôW™:©ª Ò˜M"#j‘qEyÆI­›zùêñbUNJÒMÁŠ$êõ‹(ý*#B“:Ë.(ÙÎÞ¡‰…íÅz”½@wr½š‘ÖwïÖ@î Ÿ#JÏ­îÛ‰ÉÜ¡“§;%×)ŸÈž¡„ʃp3£üoWÔ©'¨½Ïw±hÕ¬È{HM5|Odn´éµa¹s’&.@,.÷,‡;ÞøSﶯgÝ?p÷-6„EÜøÌ¸õN6§z¨üÝ™`¡½„ø5©<‚-)[Â45HTEuŸËg>=»]Á5hÝ¿ò ¯`A`îÈ1EEîP¬•àâsfö«å l*ˆÊ èD|QÐvõÆpGʺüaXh•ÅÅ8=qA;Uü8µ [ ©v³ü®z¹ c¼’”<#ˆ¾ÃÍÒ+¥Nà…#¨?ÑU†æ)?ïÇ–¡ßn÷¿Iùõ«ʼôbW1á—ÉîÄQi âø'o4Õ&qXuPì0M™-r4É‘iq“ó8‰^,¤B8þžô„„oGŒ¦ëŽ2‘&ÇQ_m3ÍÛd²+BÍ娿7Ÿô~Í‚ÐT«)œÐÁ@ e¡SéMÙh’V’w=Ù‡ cE½ëë2 „X0ºày°ß¶¶œÅj•‹±ÿžøšúˆ¹‰©¦(l3'|ëñS[«xÁ=½þ+kÕu¬"5.Æ´$x_,-síº¡ß$Xñù‘½" æjœc À œ/à\Ù˜êÍñ†ê5A§ÙŸ™ií~àÛÁŒF˜Bµ>•Bü5O±™¨ÚÍ0z@oÇÙ°ì³ï[61É8Íi ÝÙ67Ê…3!3eú}æd7À°ä…0PlÓ«ÃBýÓi÷áU&æUÐn5ŸyðáTŸ½ËÖY¬Î¼ÌcLw4u¨zÇUÅ[²|qVG”K`½õUZlÃ}›àÉO±®—–£äáõ}+E"%ÿN­@çÔ\J2$ÿvѨõ\7¡Õ‹P9:{j‰Ë5Á]¥.kEÊ-dÙõ‹ãµ”Z±mÊu-ûf:SÛ·¿l©µ!±€8žÜ S?Ú¬œb[èb$&i"âj7 mìä !é~)楷ôþM¶ÕO¡ã—ÊÑŒ”˜ðð´ìjÒWpk²@QžOºNa:Nª.c]ºÔr‘OyŸø¡]+Ä2oD…ë2·Û~u Ékµ»©{¾6J#u õ,6¨Ï!‚T¢žÁXÁR*…;`ÕHgNWóc’x"På úÉÈ7ÅÌL4c#ˆËl<ÃÞ &-"@”6RuiP„šð®ä?ûêyÌ×*a~«ù2 ë…s”!·O‰ À«áOñpÖ¥V­ßÍ8eô‚#›Ï!`Õnv~~WSø¼þˆ)hº²AÙ…øYÿ˜ŠŽgœN¡ÉWÞD€wI^û VÆ(zÎ<×Ï‘AúåU²÷6ÞW™Ý—‹¾zzb²»AýÙ›ÇÿE3%¦´jAuÌÚæn±àõSÀæ”u騍(kK¦rHÄgç¸#Ú“<¿OF‚ï÷!®`_‰Qî¤Qtkˆ—ˆ¨¢ö‡<^Ví…Ö#^_C( Ÿ;@7:ðè­C<›LÏ{‰´/”F$uìMì¤JaõÜ¡ò­®ÍP’Óìu:Z¬Òø^dÜtÒÊÛÁ“´š°ÐƒÖýßÕ«[ýI-8[4|´jÎ$4«©TÂÆ^Ñ—†„í®s÷DQ&>þɯÏV¸¥ÈW>,Öfæ¬p/ºi"íwn¿Xr “‘¡»„†û`Õ-I‚¿Å2Þò*’äx)åCwî#ë&­Þá¡y°÷•S~o¿˜ÛÁQá?ŸéÖî1Wr ¢ü¼࿚ Ø+‚ÄC”#ßTaJªOÝ+˵ Ž u’§&  9”µˆæ‚:”%4³Ö7/aFÖ¾­“þt$¸2 |>ú¬Š!*1[±—rm‰²$?Jð(S8ϱ™ ||é Þ!Ž£Ô2DÐuoøPÝphÅšÆ ã×ÚRt Ç«0¥5òÑa¨úÍ@#ë„„ðÍλa”¤¼}¼Á@4ÞÆ|b霌`á'ƒã°¯»á‰‹i$jÑïÜm\_ÃeŒõî·ë+ƒ¥¦!Xá êé@Ùä¹â|ŽÇU^f+Q‰'©“¸ŒÃû`ïÅV~~^ÊèYÝÕœTˆ·û!F‡ ã_†ût‰'#¬$Õ2'ŠWÁ+ï˜÷ûÝoú¾ _ÆŒôדUôàÓʘ]ÏŽÖëx׽ЇéÞ¶ÑÓf¶”™3‘ñŽM“Ë;™Š0ïÑ_…O¨”‡¡û9§QKL‘˜XžcÕ›:GÓ†Â4Ÿgü|º& ±y8œ’ÚÙ zV‰‰rÄOUÕÑÛVx°9½îñ»§œÆA2Ë”s ëd :`~Æ EEàè~À0va¨¦»éužJX@/\ÊSýn×XÅq ß ]jú²ÐÐT×D0˜ôÄ!Çì׿æÒ~?7“SÑ3Ù¹cÊà*ÉgÁ¨dFÅë.FÀ#_WNk¡³ZTcg^àºÁfbbCõÕÆUC7Qè(ú»6 woë ð*’ItÀsèJ޾uŽ—Y#ñæFY£qÆ#ñ ˆוy~+‰ÔC;°gd;‰8¡¢gGIèƒß9ïS†Çï¤Á;R1ém0ôïí…®N4eÊ8Ð"¦/Ÿkµ\V½wÙÖq a“vº5ŽSµOO¼ñ £]ÌŽÕ6¿IJ&ÞužAç”Ùê£!Òßx]L?­%·F–)-ƒö Ɇë7ÚZûà­|GyÆãںݑßI·…ý=¬¿@…@ñó@·vE …w;¸XCŸ´°C”QËf%i7#dz¹bŠUvƼ„â&kÊ–(Ë^è^åbû0â0”˜!(èñhCÇrT¹é÷Æ ¶±—`ã¦é¡+5'G 0»AYm iÍ’®ŒW³ÎÇfV?ÌI%8ðèÎÎÑu€ˆo7²ÔË×åæˆ^äv»õ'~ h¦ ¨ÕÌò „1cF„©¦ë²ÕèòêÙ éSíápùˆ´)j’bÉònØRÏæB˜Ÿ¥±"0[Y½vjŸ´¹Z™8úÑóáºÌÿ\s^r Ñ¥˜ùA'1Âx–ubXX=·¥Ú73ø.ob9#ÅdŠêÎ+…Œ]ùK™}|A&››­î6z<õÈý­?Pg=ê îì‰t$‘š+³™%ô°Þ6zšhÌïÚJ½œÑAóìÈÁ7p£Êµ¥]i­!µ¾±±èŸÂ>Tg6ÝçÅ-Xgµ4~/µX“Ä´#4£K»/{••å&ÚWÜbbÁO°¸Å‚Œú$Ç~³´‘–:™o Z1žç_ÆýY“7b'µŽTtéC|càñÍ¢Ž+H‰-d~޵ '†‚ouš ÐÊz]GŠ¢Ì3óȶG‰O{w9Oí¡=~ÏÞöHz#Ëf.Í ‹­r9$×øžo5pºfpèZ™“¯6Ëaw‘‚>ÜN˜Ôl¢énËø^[÷£éã÷z:ê×–;.•¡_Uˆ²õrîäØYÙ´ k—™ÐÖn·]©­¬Ü®‘–Ý)2~¢b›…‹ý¹õW7rbÄ$+™v̉ÑP På¢Jijgì¿ýÚáÆëÏÆ¶7 ¿0Í­{‘pF³ÜXD4˜ ¦cÓÁ-ó¼¦x¥uª€Ãg£õ¼é٬ŗ·/Ã}yóΕ.t2»¸AT%XÛLMˆ"2ôÞ…ßoÐ…ƒh¾Ï´rû’NÜ=H2çÛÐÇ<1»Þr=µ¡ÙÕ8¬*øÝô‚¯ß7ÌCÁð…íBŸ‚±øaÈhiœcÔ"”8i7èˆÚjbhþä-Ô®y±Aˋ㥠VÍÔ2¨“]—Šx”*ë²%“¥ÞÍ'~›tŽÍ‡õñ#ÃíÃeUIMvƒÅåd:h&ò½žhlTßd}©²ˆ^Ñ:ôºô•Aí~–ë£dÖËí¢-r\ÃA¡¨_½¢aÿZ¤¸ŠóÕýø‰RIÛ™P¾km RÑWÖœÿÌÕü#ã‡}æZZ\®¦ªek+õ¤2´†ÂkhõWX£•B:ÆräÞ@œÜ¡%‰žcÒ¨½Ê¨î^%+Ân¹ºÉmSٺÑñ¥æ~²¼¨¸[PiÈy‰¹ÝÒX,SÓÃåW8²ÊãžO°…ÀQU0þb&éÌBÎ#osFŠ©éV`ô]øp±ë²¹ºö´Ã‹oDV9x …¹^[Ÿ¿9¦['«±hm]ÿa*wpqÜ[´ ^ðÝ0)š®üÀ§ÒtéJxÎ~F”;š”‹"¥¨%a¤pÛ™z( µ‘YP˜kY 5˜–Ý%¹R}){Y3ö6rDÿéÃï3´ jºÆ²°Ÿg¦üB\éD’ãQ¦ €Â,abŠeÁZ¬éò âH'o×FÓ ¨†iêLI:YÐKíàMH8Þ$0``Ü„®»Ø^~I€ŸrŸT­4CagWÝ $¾mGq NȲsÐ_<ôŸßV@wõé´£ÿ¨‚ÙrEf_}»~‘wNÀg¨0ìӠoÏmj¾«ÒÝgú,© ƒî*ÝÝ,¿˜ 3àŽäW´ã§ªOF6“YsS@­ W¼ß Ú\õt$żǑSÞ·â!!Æã/qe8å˜&^;‰¹"ªŽÈÈeÅÁÀŒ©az¹Ði •7@7DÙbä·hà ·9ê;ãhskĺõîË¡ø­c„ýÅŸ|vÇ…éw²Õ‚×ÏÍù]zÎB ?µŠ‚zpW鬨ÁÄ,jÙ´ÙíX©X\Çy t¢ûç GmÌ!c“Dß.ƒ Ÿ)FóæQhÌ3’¤CwT†ä *ŸÎž ^Ötψ€ „Ýg\‡a5øK•à%¹Eˆiö˜Ý»LˆŸ=ž¿Kßé,M׉ñãpcm´ÙÜ=Ó„ž2¼~ºîóÊØ€ÏÅUR_¿¬0HÚz´ ·ÒGë—uQIðö´‡wÕ£´7“ÈJfÔOXgÒ‡®Ñ9Ö’5xO+†ñ®Uä3alOøâ;(Ýß™…a/õTU~ƒTš1UÜÈb:ô˜±´ñw=³¯‘Û¯®Ö¡HÑõ–;4c´N­ªybæ¶WÆ­yû‚›ì Ÿ²\zT´*6yÈ`>ˆ@Dl åfÈLjáßëYoÉPÇu£yn@£c±NÁä|—M‹ìá;¸†iñ´¬cq X‡•±~†0¢M©ðDõÒ8ÐœÃÆÏ»Î² Áƒ•ø B'˜ËˆÆW¿FÙÙq¦™ Ö+jýŽÏ@Bàæ!M éÓž\Ù€n¬wïøÓ¿‹D×ç÷CðUt~—%t·­ïÒ'Shx}žá\lM…ž®ì0è¢9ó^¯¾î:õ%•¤Š²QÀp£||V¼"ѳ‚ïz”ªíê/»¢ †öl#A2Z¯1–+°»å9xäÑ%䬾o于7 ¨½/†ëáô…¨p(ÞÅgJ9o3|OÈ%nEldÝX§Teú߯2 ²öL-¸»5–4Q} Rŧ¢«õè”d¶‰’£€²¹¡x/DÏFDaç·ºúWꑱ&ËMýÁð’’ùĦÜš„¹…•’z“$jX‡I.ZøœîZ‹.7¸º'‡ƒâÞIå{»Šj(Kî'´µó-”_‹¡$ä †íw!Ü™áü=ð"~øÈþ6§F]—0^W5 ±–yÅ<'§w™ëMê‡o;„Ó;ÑÎEú³_è qÔå_± n`”¿½2{Ji›ëDLɳ¯7OGιá—OŒncS™‰}íöæWoýŒD³pàUÚ›Àò¡5 •Ê~Il'Í Q^‰c—r.ûÙÀlí&ÅPÍõ·ñ±ë$y£-¨j£”¶v§î… “¿¾ÐzûNîÃ29Úcù¢€ü¨Hnª!o—w -e]O;†Ú.€ ]7O bÉd¦›j ‚“¶ÌË<`à'µ^ïfþò!# o‘T´Å’ckVXS6ŽÍé+ ê©Mñab$ß76RiÜóN{BÎÝïÇÑÁÏD´eŒ¨Òë'ˆ»0åkE8á¢Û÷T0!"šü„™Ïk®ÖH¡-ý ÔcèNv´ƒÈĽ«',ëŽcÏÎ0Ä mnC= ¹+S *]­rÛY_ŽÐô1vâ *yî¾®¿øÌ7à_é+MäÕþ.²ÉǨ ùÊ—®êf~ab´®Î­÷ 07Ûc0õ„6cÔoà’pu¤¿‹*¼ªW›úu€oo?2fáÐ]b5·õm˜Î¯BüGRîV%5~:krŠAÕælqP§9Ó^v$z"äò¡ÆxödtMtŸ[­Z"lˆWžíÊÎ]`T4¸w Py&Ê·¡ù]æ63ìp¶²©Çv©\èùp:bT¬ýäÀàbdd {Õ™ûyɪüRn>ZŸççâf¸mÆWHµí©p=ø.•Ñ’·O9m¹Éž16†ªºíœ)*ÕíÒÞG¼‡¥x÷º]]\¾Üa‡[Œ/G?‘­H¦Ä”AÝ8‘4¢ÈaM&ÙÛ_ÏóÈ'RU¹€ãÖøK/ךȶDëίu]r¯rñ8ú=âPF`v9¤ÃEÞtÛ©õ[Ïý.±jãB~%G-&›½ ¥.ïýE ]Ÿ|Þ‹Õ³§$ F²÷ =|Öžg*ÕÍ#†§ÌT†-¬â«ÒÝES$@R­w)·¬Ùö \ó8RÞ7ƒ‰tÜ‚îßÒÈÊR—ÈìÕ†‡öb”„mÈ÷ÕðÉ ®ÝÚIÉö¹ âä‡Óø•S:Æá£û…ÀŸ²YÖ×@È¡¥/é¡5€"楓Ôaì[}¥f¯w©#ÝOOØâô¹UƒÓê9L‡ÔT—hØ nÕ{M­,#yÐdJ GËøOâÛ>µ]^ƃ×ï…R°{鎽êÔ"ëÊhBÚ Ë–:-6øgʱ#lvøj.Ï<©Õiôß»fw¡Šø²pu²µÓˆø91`u{s?ƒº¢ Ñy †9 ¿w¹kë0ø·YÊĘî‘$@¿ÖSö)tG»a]±6Û¥x ¢–’Z*‰Å–ÒÂa–ÃÌ꘣Ô-XT%ï=PÂà ¹ÝãZû/¡@°~Y…t&<)Mß™óITwJù ;§Û)¤9B ¡èâ¤ø&}29­‰–Š%ëQÔ¹Pað¢6²œÐÔZÅ‘0éh'ˆoTºæSÓÏ_ºÌìEŽ©¸Ë0¶ $i`WyÒ¶ƒd8õ@]—¯ÞMçiílHålؘ`«~ïC({­(A³(oðÏ0ZÁÌ]I‹A Õ !ZS¹,·ÓnÃ[Ô¿\[hHk™*­Û‚Û™iŠíÃäŸÏ"G¿U¾)½qO®á ÍvÉÔuqe½÷sÑ?½¤o9frÜ */q0 ñŠ.Æî¯.hW$ )üá2 6ê±€wú¨¢yØ«Lä2ÿædü³%Üܲ¢¾ëIt|£oMÛz· j{PBë„õÊæETݺPYRZÖ;‰ý;QÚÖ!çäÀüø½_ÝÝúÆ™X5÷Åq¸¦ðLÅd¹}èy‡öBí»“ ‡,>æb÷»_±%xkgìÞ¯c‡¬•žŒ\ägPâ$Ž÷V!Ý£ƒýA³H«ng]¶–­–˜¸ã cðU‰åÿOæüFþRIÆ¥½½K»‘—ù-çýP£aÐ{‚aýè Üj¯ú`• xñìY|ÛÆeb~i,ü\b ÚçP®ÀÔË7Ýü„ŠRÒÕõc®b÷)ûÀ/ŽPJN¬ª˜ÖZ[˜×uwYŸOøãßZ䘇޼+‚TfqogÕ3¼Í àY72v}ª¶h)ï¬'ßãižê'Yùd—çØ¿ i? ›k>)œ›üã¼(x8E&Þ4¸wøÒ®)­cR[÷¨… =t5×µðò,êi½KT4¹Ë .'D9@ð>4Û·ec¡†Ðå‘g¼Ýg|a¥V¦ãÖˆñZ$ë#úÜžœp’ЋSl탣ÂÝ Qa&8Àûmi/Ä€Hu/ÐÀ Ö¬è)k$Ó º†Ïz<²Ëû>3Zè­éM_k6;Ÿúl·Ì;ön€§¢•"²fSæ™§Á‰P¦ÖS.Qޱ~ð#1_¹†û?¡ÑiQå¨lÒSÊ“&ë©›r¦¾s/ÝàÏRecÂñÍ’åÎoÑK¹O´„[;ÂÞ?z'ÄÊRïÊÙáôkbˆ%R¼äE3¸ óB½aH‰+#3 búOR@Ëç:ºí¥÷Þz*…_×2Ÿ’à轫ø˜ˆD‚jÀ®xϘÛþöÝ|Hg‰Ë’Gšì,¦Vt_R¡3å2K ÁÛÎo5ùég>Ô9êS¹  “|ÀÄ*m"¯ùÔG³Ý|.š a/Å“2šTàâ‡Pçù’RüEêaøic™=4N ;bà¾ùlWÖôÚk‹?>¦lÖZìíCK›[Éò»û®^·ÑÐcºQø¬\ Væ‘NÔ3%ȲY°‚¹¸ÏO~(R½jV¹jµ[MsHó9ªŒÎ:K}Y(M„r¸"õ ía\ùÁaJ¹˜ö@®rÎ.%ë&ÅÞ¨§ýô9·)°²öà­ý¦áÞãy¦Î !ÔX •ìÃXÔT\p±$çY§‚Óâ2<\É,äÒ!uðF®û4¹oú”í\—h0,&6³ƒDÃŽÁ¼xsÒúa—½v/"±ø¨tlËYTŽåÚüAùü;ßÖøo؆Ÿ0„ኦ£ZÐ×ñ¾€z7;_±GÃVÏÙqhgÊGD5¹^ Ó4ŸÀµÈ•9ÿª-P DýR¡ÀŠ‹Æ’Ù‰âîÒå(vÊr­a/#K Ñ`°ŸŒYhÖàÅrHUAòè’•í1ŠTE±4«Lˆ”¸c?ì AuG¿¼6ê}ʧ(SnÕÌC endstream endobj 18 0 obj << /Type /FontDescriptor /FontName /IHZKYK+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/C/D/F/I/J/N/O/P/R/S/T/a/b/c/comma/d/e/f/ff/fi/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/quoteright/r/s/slash/t/u/v/w/x/y) /FontFile 17 0 R >> endobj 19 0 obj << /Length1 1682 /Length2 9166 /Length3 0 /Length 10263 /Filter /FlateDecode >> stream xÚ·P\Û.Œ'¸BînÁÝÝÁ`aÜ5HðàÁÝ!@p‚ œ`!ÜyäœsÏ9÷þÕ{µ«fïîþú[ë[ݽª†ŽZC›MÒÊÉ(熱q±s ¤Uµ¸¸œœ<윜ܘtt: ˜ð/7&êr ÿ šÃ}2æ°Gœª äêàâpñ s sr¸99…þt‚ dÌÝ@VUv€’è‚I'íñ€‚llaËüçÀhÉà`ý# é„‚,ÍÁUs˜-ÐñqEKs€¶“%óø/ F[ "ÌÁáîîÎnîèÂîµcb¸ƒ`¶-  ê´ü P3wþ©Œ“ c rùÓ¯íd s7‡%ìò˜á ¶B‹´Uê øO°ÊŸVÀ_gàbçú›î¯ìßD ðÉæ––NŽs°l°9êr*ì08Œ`¶ú 4wpqzÌ7w39˜[<þع9@NR`þ(ð/y.–PæÂîrø-‘ã7Íã)Ë‚­¤`˜ æïýÉ€ @ËÇc÷àø³²ö`'w°×_†5leý[„•+„C rv*Êüytaþã³Â|œœœB¼ 3·´åøM¯ãþäúí~Tàãq‚¬E}@ÖÀǦ—‹¹ƒº}¼þøo “‹ `²„,€6 0æ?ìn õŸöcñ¡ 8Àˆó±÷¸œ¿Ÿ¿¿ŒÛËÊ ìàñüúrHK«Hkè°ü©øï˜””àÅÆÃ `ãæã ø8>ÿÍò·þÿhÿëaúkoœÿ*‚­BJx<»ÿÈpû«+ÿš&À¯ æôØÊ@ã?ÿ†“Óòñ‡ëÿ¹ÿÿHùÿkûß,ÿ·Îÿß É¹:8üfü#þÿ ›;‚<þk'(æïŠòó8$»þ´øRÿXö·ÅË àxsGó¿=\]Êü—Éà°ùÿÈlë±}¼SþA<ú@ÿ2ÿ˜ÃÂáôO¾Ð£þ=×ã ÿ2¹\þ6ùƒ.côOøQ ìŸð#5Ì ü‡îñ@9`îNÿJxTëúÉýÿ‡Ž÷q§ž@èŸðÿ*€¥+úx1ý1"ÕùýÇ-–˜ó³N–¯‚íjƒÛ/«%)ÜÙ¶ÆD§è¶ôß3±yÍC;\¯qÐ’˜ª2W ç’ICŸð–6dÏ$¨î¼ö[êÑÂZ4Ûn¼oMã´&¶Ú0ç¾ôìKÖõQb;Ÿ"È RŠcÁôùÍSèe¸Ês5ãù­\‡Û¥ëí3C2Jä3‚‘ z/©d%Ò¯^ W #)3$£kމ\;Œž[jZ—ÐÝczºqaÆgdÈDŠo£VZâ‹©ãQy3–”VàŠÇ-.¬êñ u:>-,¡­îëì:Ï4FâZæ0-[â¤:*p_%bv=Nxþ–ÍÀm4éò›ËoÃ߈š…pÌd)[:ü×m2jÝv¿éP-Á§)yN†»ín0;Z¦;õw~u±r|f‚˜D×Ð(ºSÝš”-ƒÅBñ–¤.“Òõ\¨……<úeRFZN OƒÖ€©qíÖ>SzÕN[Ÿ;æexßÞQ©néƒdUEŽ`~†ZlÌURØÚ¨+‰ü—5a™e‚°5¥ð˜{ÆÐ¼ýŠO'£OóÙ8EØKm´¥p±Õ ³Ôß©NåÆðQ˜Õ÷Ý +·2£xÿ”à ~ðê‰,„ù—Îʲ®<˺qnG"ë°ã4Iï'×jöÝ3ôìøí†D´ƒža½zæa8¤qk~²‘‡D"öP3·Ù~Á ­Wè; \Ôµ\j~bÅiÛûÕËÏOÄu†Ûý`$;ù:”8Ýß90yðó*è9…| ­”ïøÁÉ4“öÙÓ«Î2$¥„YR•ÎÌoÏ:é(B6Dܸr\NLÔdÜò£²ð2Øå{ëµÁípÃßñ$žSé7ì™ÚoTO©˜BE†š¢~ºÝiLÙú¿áR|©nºåò­ ­wPîÂÆµºgã€ÄbÕn‘†zùŸ{tó4ÛQ£Œ Îp½KÏÍïe±žµÅ ½¿ÅC‹=¹³ùE©Z6þ¦M ­üç׋q½´“¤ðÉtàOK ¨hX»;w7E`铸æ{z’t^¤^ÃÞi¦”ûòGÍ^B!þµ9EÔ*¡À«°…»ó¿/¾öÑÚ·Øò­ú² Ûuн&ö¤.5fƒŠßˆ3[S­\z¿›9Ÿ`Ì“=•ïîï”@iÃÆÛ§ûzî"ûòÕÏÅz–7”²¢ê$³™²ÆÞ—…õb ¶•¥QêFôˆÞ¡xF“ñCšµ²u/š é8Û[?¾ dHf[M/©$Lš€)>H™Gòiר—l¨´Éüµž—½ÒêÖC8Ð]õÿ!NíP­:_>ÁmC¨¾³ÈN¢Ó+@vÝè>žàÇ$Þ‚\(¾’“¬gA$`²nŸžUr¦ôªÜò)¦ZW"óÉÓùhùç]E«óÞéñÓ=/Âu ,G+Wòvp†>8Lû­%ðOÚ¦ñ£apϯ4|É~÷‚ÊpÕM÷4mÝ¡]ÛŽIo Çñ¨õkY&%(}»9æv9É©RLËû`SÊü‘ÚøT¿yro/­À¼hþÞú¬á©”X;Å r´Ò0ÿÁ÷Ü)äwuæD·ÅtØï%x±$ˆ÷x㟷³‹"þŒR™eMÚ2@Ê'7XàIn£>¡µâoGðågyðe(…SMcr§²ß1Ó·ðþ‚ÌA×áÑ·k|@ä9±&¶¸éö¿´MGb¶¨¤LLPG|Ùœ…$Z'V€Ë5m÷Eh9MޑÐK"¡ bÆÍ,{Á6´ªWI¥  ùM¼)Z dm|+¦üQg·tˆ¿²Ê=÷e^ Š F&,4§Ú‚Dà©ic1¢¦¯@!|÷|«ÖÏ{æÂ‘IL§cܾz }êRýZBÙä:¦oF'NŽ«)Hyê.ÏcCéÿª˪µyÉaØ c”¼…û;Awíä̵‹ý½ôì[:ò¾×:g Z§Qäv“ÙN³\”ª¥`•ûX„£aõû޳ ‰ í©ì©˜-bâ!Þæ˜ú2%Lœ`)ì·#ƒ´e¯Ígªˆ1$ãül8I5Ÿˆ,¿BM¹qó9àG›–Ÿß”€E;„F‰­ ÅBI+èª_œº% ðáªBt(“¬R^¨ôG¤â/ÄGON6NèÆcI»^­qˆ;5å'>aH~¶ÿ…gÉÌžY»‘±²Ä8«—ŸOkŽÍ¨›Q¶â‡¤5‹0 Y2oo)Åð¾tPÖ¥^m"ʱÞòKé/vöÅ+1ì°OáSÇbšaô-ÉðÊ­ý‘Oð{œÎðP{éÕÖÎúlóIwAüÎNhÌï!,ìç6v†9ж0ŠØ1qaîBØü¯yz ¹Tjw‘sgªCœƒê69vÕ)/²’µWi’œàk‹øJq·^Â×jc,J)ýU„}üô9´?ÒoÞ‰`y콄à^ŒW#ƒÉƒNíªÙu6“°ÎÂÈvèËð÷¦³=kú2åÂ…ºF¦iLH+®üµð áaÞ†Ô&}¸ÝeÍ¿Z×Lþj9>dDóòRpXTª=ü` O=GV^üijÕÿëx·& LÝv\Ir 5­®]̤˜@È-{ê3ƒ¢#¬yªRØJíåaJ`~¢ÊÅws-xNuÈ­u‡bbº_xZó¯Ô€ÎM¡ï9¤Ú•}2V„ös=äñ´Õ×z¿BKM`ɼ>¶|À¸eµph¯B…b!«z?Ãjá³µq|‡¼:ªÐtÌà‡P5õ=²…—psŒau,t½-¶6Æ&j¥†&Ã+¨«<¿.I|eoô/¹"Ææ;ˆ@g‹MQ©ç3…Î+líV8ÛWq¼€nâíØŒViÐ%¼…Ê­ö:“»à9Ó’w–û}ï‡[Çsón_[}c fκtж2 ÏË“T½Ö°Ž eÄ…íVÁžÄ¿l(Œèw°¡š~H©ÀÝI¶à³"œ`V—Åà{÷´FWÇöúÙ7·N¡6 S&Ä«ég#´éô´þ}J<–ÆfÕŒ™ö½·ñêÜᘥ´YëLÎ:gzLo­¥ _ùkIÆ>†Ýøp.¥4,&lò*ÂÄ)Ña°¸,$&fÍÜ?/òMÕÕÓgSÞyÊ>ʯs«X¬fÅL,—õÞò÷pÊöÃX1•ƒÎ‘~uªºŠ©l>0~HPŠïžù{p |Ü!AÕ-{ƒ$£ñ Öš¤%R<[üaÒ žï2Çz]*F|™›gÿrµÒ]¼Ò³Vÿ0šÐs·kÈ$¡\ì¢6å´OõZAk½ o­°ã7X&%ŽYæã:"¥q=[ÎÀø^Ov9µ~èVv*ÿŠzÎJ?°°KAUý†¼¿âÝÒæ—<.©ê²q‚—J›µˆ G]'÷=¿š)!¤¤œÄ£"„1ƒ%ü8eCóü¤SëïŠ\ž‹OÛÁz†…9£³äs³ÐP†ø#ž< {ÿT$ˆ%·¶z¸Ì€gÍÙ| ¯÷«jêÜòìQüHý¤¨¿Š”Wë4PƒHF$ó¢êº[¼²‰C|ͦ"¼uÁA\¾P9!4ŸKFÇÞøÂ¿H<Ü4‹CÕëJúE/+‹” Þh‰G†3{I„-½˜2* PËf60Oû¤ªBÕmmrÄ».„Þ¥7j »’߀º×æ%Øj<Ì(Á38Ìl5“â4íDuQlò#щgCä[[)RxÍó§Ý¸H/Âàªï;M0;N+Œh­dtö gñ®°'{ìz›V@ÞêìÛ²BîÚH­.}RhžïÖfÓë©Ò¸mŽ fo‰ø?à­.ŽZ YBßSµ/Æé“sáøIÒ¬€ òF~q5 ¶ñ†€ã”)»Õ¥ÙHÔ$KÖD…HmøDôMà£#Œ(ð€úÞ‡…,Y¿ÕÝ 0AR<µìÓYÅ™áàÄø÷ei…TÔïȆ–QüiŒ}åˆ:ûºâæeu¹µ@"EŸ <æ$œû}Ô/¬×ãvPÚ"µ3èõ‰½ô(f*QMž–â¬ö7p¤¤ê[b<ÝâJ˜ãËöˆ¬£àÀnEÕkݨ*>/né9ÌÄc6‘ó!§z)Ž­Añ=¦ÙŸ õöÐ7™Ü±Ç×î(1#]Îí¹^?€*BùhŽí Ãë¼óþ˜SÃÀÈlÂhʈðYïïBôh}8ËÖPܵFÍv_p@…/B“`ë€Ã(©ã9™QB ¿º–+°˜ôVlK¾w«ÐáºÊNãs«þv@"‰ÖB¥«@½óÓm—vŽ˜¡‘i<ÙÔKGÏ„ ñÁûäÑ Œ]<3×^AêZ>Zò:Ë'®tuSoÕ‡_ùú,~ÀmÆ¿´ Ž$GÆI¾zJeÓú ÑA÷ÖÉ­ð.2›¿ŽF“ÎS´—öƒ.¢«H±¿–|ÊùpýÒH˜›ãòf)ÝÙUO[vÝ$‘q¹¨†´Oðí’)÷ÒÀ´ýÝ!ý~?Öî+`¼À×x”BÅä˨NMënŽÖ¸sŒÈªg+‡éY@jíuo/¯¢g߉ýy„ÏäíÞ…]0ùÚ'¥Ì«2H¾-^Ô“~Þº¢jâsmj¥"åÚÌèþ~°0#¯ÄŒ{8ýQ;šÓ›hGÞïÔYR‹òW–P“xµOôþºªwóÛU÷ruÁ'Ð,4W`%”îy!{ßáûŽLwMÙ+»_Õ’O®+0ÆÌ´µÞ4¾~‚SÃ>é®¶Jz']g¿åAXæ»ìªðr—Qg\M à†»Â¡HúËæÕN§ª5¹×\ü%FBt¶»â#SÃy€v½êq¶in]äÿ!C’G\ö<†] /[ qe+ År\×[ýøK‹.%m=tBt>,â]%øÝ]ý6ŸÙHR>ëêÇô‘ ôŸ8¹ÐðÜ®˜f†ÚWyCZPùÊEFœMJ(DÔ+tÊw0•sZaTŒñs½«~ÇT¡§wºÎHý†ž¢êF•5óJ~0ÿ'b´ËíÊ‘” -¾Q76÷Jæ-UܹØð«“d®@½¼"lP˜øf^ ’”uHγÌ}J­"$4צÂËz^[,ÆÄ ›>ßvLÁl³1_÷B:F‰$.}~¤“ÝF|'ÑÉ@ÕÁRMÉÖ¨¨ 4;„L‡çšyFyÝ3¤g„ñ#‰YÒâ1?“Šü}RK›ïYqPT Ìùæ’Ù#zèÄ­YyBzîWÀ¥4VZÂýµº³DÅ(µ©7Ú…ÙÒæLbÎ×ÑÞÚ탴à·áÂàЧO…t †±&øA#ýÈÅÁ9 HSwcR ¦JY@m¤ëi‰•Ä6“–q÷ƒ­ø‚‘cDüåx~ 'ë÷ïâNžuÇéMKèŠë®jR ¸ ?ëŽbHûôôK‰£¨ ø§im'~>.—£™iŒ‹>B\œ]›.óïÃ{Q/\Q"¾Ÿ’nW» äË?õS@*}¬„Ã@¿Òå¨AGñd#g¤-íÍÉÎî/#Çéòœ|•b‚B%©γsü³t-ß«|ÇþWA1nëL„òU·[dt¸µÖÆt±ê°¿Ø–­ 2ëvI{´õ\±¡Ùìµ*ŸF‰pÓñ¦Ú”’}"úíL(/¯Æ¾úW§EÍÞ°ä’Ò½ãþ2M-‘Êôt{rhöÜXzwÀØ’eÇ?`"ª5¸…9høª¡rK•‚³¥=ô"÷ë›ÑÁ{T§~ªÅ“˜ÇV=ÌÖB£öÔüùYóàC†>hÌÂÇù¦1Q–ö]˜iÃ$+ƒÑ' ¦…“/ÅYPæ)ü5^ýÈWÚ¬çº^”lQ&¥"(NÙQ¡äÎ 9©y˜æfê#ÞÎVïQr—ׯxvÉ‘§zZi×ö8N¼'Uµ®›ØÌ¢(V«°K^ñW½öîËî±ñ=ö¿x p-5ªq8ftjŸ@°!OuÅýážÐÔÜ=Ìâå9µZ¨3p Š•1p¥"ÊË’ÇjyaÁ­Š¬xºÁ üúõr¤µhl‘ÜI‘k$½Ñ"ÎEÍñH‘Zà Hÿ„œú)ˆÂnüVGˆ‹ìP#¡ZÕ8j¬ãÝ;áʙ깪¯©½-Zý.ùLøý*ý¾78ͺÝ;sI%™?+—9g_Ïañælc§ÖMñÛÅ÷!¤&,ä\M‚e‚“LD™šé½“ûK—ä<[±Æ4³¸lóèjF_;:ÊÐæÁ!1\Ìy}‡$•€ q¤Ô̰͆£«¢ó'ßâJè»#m]Ïè;^H"†ÒâEFOÓ]ÇY¾ÑÀ¦‘g¤YÆî[/½º;k]û2ÔÕM”4‰‡àòäyTv M¦?E3ÑBsP©ÞºBdjüÙ³†h.ù…ì xäúkÜö]ÚÑɲ!D—wl=í(Ô²néºÚgaÌ@d!!8ÐÕXkÊËSº9¬UÜC½U{–ý;˪ÎK³[3š9@F¿}\†=·dºØýó “Úo;Ï´<'D­ñ#v“™.mì$¿%0ÀÃ,¤4¬Dª6 M&cX§¨q{rÝf¶ç°”¨ãj˜E*k8´k‘?!‰ªŽùP-jñ¬]Kr³¨YíÓ¬»!ÈñcÈžÅ²ãæŽMª©ÊPPn|Ú¦²%#ŽÊ÷¦"8RÞã›|ËÎǨ¼vM<%Æ‚ÄÂÛæ1#ñx%3æ‹ÔÌO£×TÍí‰gå”lf·øQI‰q¿F㨠‹Ù¼KδôT¡üV´øvÑeî•@òìÖŠèF:v3öóã§°®L3²_ƒ~áY;çõ±`®-[.Øsb¨•¹êÿ|å¸I´¬^t?JæþÉ]Ý•YmàÇn™™ú —?Ý-T®ðÉY°š{¨`ŸçWÞØññW¿™ôÓ¼ öí4T–AR z܎ȸ7½Æ]™ú+¹ÔyjË…yb󞟜ñÖ±í±ßÀmS˜²2ÑØõ´i¨ð¯êJü­éšxODó7âvˆÖG2õ(I½^Ä9JëÎ5½jÒ„ÝSldUF®”àÛõ§Õ{¿FÖä¥ü.-BlŸûIê´¹u-âÎöŒÂ–¾éȦÈP£@¥fÙLg'ð'º°ÒÝdò„˜,ŠQ’z,ø˜È»{s¶üh· Ó@vb`ǵ½«jŒAÙ6yO¼a|þ¨´q  $ZÈ~Q yàèÂßǦýY¿Xg6ìJɆµ·Üo¢ywõfh÷²>wKá» 50“R+>MûDrSNXnpíVtœ4„ó}³;"’ˆh) úØkÑûõŒ£§®Oµ'²ÑÇcoIAwH 7G.DDés|iÉ/ •mòiø8SB¡ðÒDTÙ&ò¿¢&bR³•‘[(£‹# †„|Så‹y½Ä½÷ Ë{¬Ÿå«†WsÛ»7¶®5ÁûƒuZç»8û×Yçͨʕ}éÛÇ9.ß¶#6Õ:âj–g!$K<0ž_ )9*,_ã½¢Þ!#âÒŠ‰Í@ çlg>0$~?_õZ÷-¬ÃE@K=‹ÌðF…¸‡“˜9d›áÍã¿« $…œel¬ Ëg.y;Ô~ÝÛÒçF¯ï¸¦¾€[)ö¾+¬7kV6¾5ÉÔ¢8ƒÜÔ*ñw;Ôx})Š:ëÈ=؆¾Í gwÆÐÖ[ô½ïG&";õ±íß¿9KæûtÃ7ú"j„fCßr7Hëc@‰eTy‡Ú—ºHKôvOTñ–ðgµšHO‚H6~þ4éôÒòÛËÿ‚ôEÉW)—8M§ ΔÊE@!WsÒ÷-w^D—¥wd”ïùöltׂfp¯eËÕ ïŠÛ”!dÚ} Áˆ±à8—8iàæü؃r:0†Poù4ähLÙô£ _­BÞ  „ãØDéuö°`i.MCª{y½™~GM¿ö^2¢Ưø8¯é[»‡.ŠAÔ×Ä—Óõ 5ôÁüH-l†z°£Ã0½§8Ë'² «ÔÜŒoë³vY3dˆýZóQ&Góû™< ·øÜêÔžïtü™2@C",¼à&ÑMG‚‡jÿ×ñó Z#îÅøáÖ¦“Y(5¤°é롉؆‹Âê,+>JâJÎÕß7ußzXë¢ÍR`æeL¦î€æ]®sŒFþ)¨÷ KÉšàyà‹ˆ4XÜÄÃÅŠýw•ïÈ*95ûEË”N4':eSMUîªê‰Câ déGÖÕ¸ž.N: ‡9í ÂÞ謲.rÃõ¥Ìz1‹:zä¸&óÚH:µ­QáTd"‡àV“^Õõî™$MÐ"£ªçŒ×¹D5ò§2ãNMFÚ$6í÷³_æ¾åÔW ¤°=S8Ýg+Øç1¼dš Íf…xŠK³÷LÐGlù÷*I ï3_ùê bKÞš¡%)}ª†”K¹"æN›¥ËÁ¾”-¸t äæÑ±Ò‰+d’˜’j/Û´V ?QHw6îv¹F DS1Å!KSœDû9Ÿ¸žó!¾дtc6ÎÛ(?y^ŒêNº-cáO¨p­-¿ J|à3SÃúŒðºö£%OI…S'z«K±µrÚ[œþ¼·~áq1K2¡ˆ~o"\‚[0n^Á®s}îÊŽ6½‘–ÖÔïg÷ŠögŠ p·,×ÇìÒ ³R oÄ¡3Iò~Ûµªn ´tÏ`ƒSC÷¸›yšqÞê‰þŸEµ[u÷%—bÍoÕ˜bB_…à°›V]$}—•Lj[òOm:^hÄkÓÅ|Ýßg÷ÖG ¤€ËÀAùž¶X,_T¿mH«™ãû“Šå“ë ´³£‹»26‘0ª×àµ8ÒdMkRÞÙH@ãÀ'ßW<&(‡‰¨ËîØÆm.ÔšªA/f–Jg]XŽf½+ëÀ,ä%6ß Ï}{ö2Grî±?Oàê[ÞY—ŒxJX¬ok¾šó}ÎFâœB #ÂMÜq5³U+ÔØ2°Z;feºîŸœp3,¨µ°Úêg8¢òÖ±+? ‚£×6µÊ¹æ‹Ñ _R±ºþDF§ÎÅø֮æM/ZŸ|êŸÖ€¡ @žjÀÇÖzú’µü8Ô×IŽ5_Dé3=5ɶl,ºc „™Íü­¬ÙNÈ{-íÝãü,"f#íê—ü–DEE‡_PUkö|pç|œÂô¢wQ³ªŠ“¨ÕÑr¤ª¿…å.–T|"»î<åB¹Ýäí¢1¾}e Êí¡cYµøvmt†VhRß`o,–•vó¡W¦Hd "óû™GìAUêY¤ñC0M [˜yq0ÇtÙÐSèÙþ‚MŸñ H~ÀżOŽ%eŸmp—в)וTXV@BÎ,áøªºEN ¶B4á|öR‡ü×Zá°µ‹²¨z…â#ö÷ýŸÇ¬&•ÝÃ&ñI^;<Ûš›Ÿéh'nt¤pËâ|rf9Ç̯X`t‰èÒǫՉIÔ™x/&*õÊTDɰËgbxÓ¯\ÑXsßuîŒW~s€,ßx§¬ãoòQSE–‹Å 7Š…þÔž>Sr„oý ùû Íö¼„e.Ÿ”ÞMžýV°©d¥-µh)ùÔFž;sœkóü‡:Þò7åOØ2"õPÊ7N±Q#'.DË,yû2S”7(2ÖnÅQá̬sì&,Ž_§•Í ºK7¦(lw~0¼ÀüñìÒ?¼Ç7+=42.EF +ÎÌОêæuVƒÆ‚‰éî&>x¬u´"{q¸ ÞœqíŽ s•(ÅL\m ¶œÝëkà¼2ü$±°æ@ÿÙžEÂL“éÊê¢,¦užçšA.h.âÜóvÞ4PF¤(yOš×¤Ø¢­ìì¥pâÑ›|¡kÐQPél/6õÇp³6Pál¦ ‘9–e·g䵩“²Ê¡æ• 2Ù«›¶æt¦£‘½³:–tRì»ìRÝPW¾§`=tg®l´Î5(”ãÍõ#ÇIš½$©r~X6ú¯ í(ñ¢ã…½uVBïK§lÇÚú´VÈŒùsµKYª·> #·Ú/KºÎ°áÑ|çȈçjíãMBò»#ú>¹{ZÓ¾@'qhŽ0sÇ<ƒ†¸å³=ÿù\È^nPÉFJ¹ 0b‚ÿòkWT§#—üü/”Û'h!2ºgí)o!;”NܘHAÊ-‹ŸIJ2+®­èØñeÄ %.õùë‹åÿæ4Ç endstream endobj 20 0 obj << /Type /FontDescriptor /FontName /CCLCPT+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/B/C/comma/e/g/hyphen/i/l/o/one/r/s/six/t/three/two/u/x/zero) /FontFile 19 0 R >> endobj 21 0 obj << /Length1 1558 /Length2 8161 /Length3 0 /Length 9182 /Filter /FlateDecode >> stream xÚ·P›]- E ×b¡¸&Xqw(îZ,@ în-R(VÜ­¸»SÜ — ÅåÒ¾þýÿ̽“™äYÛÎYû¬}’ÐÓ¨i²KXÂÌÁ²0¨+;'H ¥¬Áɸ9@ . zz-ˆ«=øO3½ØÙƒ þ+@Êlæú`“6s}ˆS†AŠp{'7€ó¹ 'Ÿ àþ „9 ¤ÍÜ –e€" vÁ —‚9z:C¬m\–ùëÀdÁ ààcûp;C,Ì e3W°ÃÊföM˜ìêùŸLÂ6®®Ž‚@ »»;‡™ƒ ÌÙZ”™ àqµh€]ÀÎn`KÀ/Â3ðÌ80èZ6—?ìš0+Ww3g0àÁ`±C]2àPK°3àaq€¦Â €ª#úGð‹?ØöÀÉÁùw¹?³‚@'›YXÀÍ ž¨5À b¨Ê¾àpõpe˜A-šÙ»ÀòÍÜÌ öfæ¿wn•P˜=ü“ž‹…3ÄÑÕ…Ãbÿ‹"ðW™‡.Ë@-¥``¨« ƯýICœÁm÷þq²vP˜;ÔûO`ZZý"a wjC!Np°‚ôŸ!&ŒlÖ`W/âà€` à¯òZžŽàßNÎ_æ¾ÞŽ0G€Õ °/Ä üðáíbæ¸:ÃÁ¾Þÿvüapr,!®s°5ŠñOõ3ØêüpøÎ€!èA{œÐ¯×ßOÆò²„Aí=ÿ ÿ}¾@E9Ö?ÿí“”„y¼Ù¹¹ì\¼ €/€Gàûß*óÿ‹ûo«šäϽþ)¨µ‚þ ðл¿h¸ý© ¦?'†ðßT`R˜þQ¾ˆdñðÆùÿ¬ÿß)ÿ²ÿUåÿ¦üÿÝ,ÜÞþ·›é·ÿÿã6s€Ø{þð d¸ëÃT(Ãfú¿¡ºà?&Yl ;ü¯WÁÕìa:$ Öö·â" ñ[ªA\-lþÐ_§ðPÞ«Á\ ¿î;'ô?¾‡y³°{¸O\Îê· ü0Nÿ]Rj³ü5w\¼ÏfÎÎfž yqñò¼9Ôìñ[Ù æúx ç °‚9cü:Ñç| Ô/ÓoÄÇó ­?¨òUÿFü PíÄjüƒ¸@Í¿烖àÁ‡X«àÄaÿ‚;pþä]þväöþ§ pgç‡Ëá·L:ôþ}Á` ŒÅy˜…PˆmMHÛU•¹;ûÎ¸È ýŽn 3»÷¢s;ü6Zså» 5ç ‰¤=¸Ë[2LçâKÔwÞß›ëÐÂ[Þ¨·ÞøÜ¾Œ×˜ÚiÅX˜$˜Èÿ.QÛOù˜‚]Kü³Ï“N R3b§"}¶œ[-—àʽOΣ¶¿ôÓhØüŽúçÊçJ˜·¥Ó쯴cŒ‹fésÌ3æHŸ¡º²S¢³àyàÌž_ÌàgMÜS+Ƴbøî½â.ð6Xçz}=çµR®ÅåÒEFGf@J‰tŽ?:Åà-ùõ­"ÉGïâÂhÜ&Ž®Ü;Å ã½HŒE&“€^oÛq¥n4齋õ(pXûÈçË_Tô#/Ù6©:ôèϺ¡úrÝ"-ê°Äxp .:}®æàûŠSEiÄó€'£ ŽÕæ¨×DÎÉ„L‚:™¥q¾lpÍ…üîŽ#ë\™þHç^þzI}<}ìÝ5µ±$¹¥Ül\”Oj©|8+éÝŸ“EM£_¢Ÿ´µ’á¿Âv¾Š™—ÕRÞ¼™Ð)(V–´A»ýqÊÓ@®=Ñâ8†F«Jo#ùÒ×ÚÎI CŸdï qü¹wÅPÂ;âJô*L#tÿšðmÖîÜî9Oà× M›é¶5žðzJ÷·ŽO†„3¥ùçô¹uH¾º¥ N½¿S â¸ ½…M®Dh×+Ëö6°Ý®í¶èvijiÕÎQ›¢›®r kY¡’?ÿÇdùƒBACA\˜¹tþ6ï'[E—f̛ˀ:Ö,k³ñ%ƒgo„ä2˜ý)f6jqž–÷¼”@@#è÷¨”PqÈXïL×|IŽTsù"„ä`]]Ùönà`ÉCF365ñ¬Ë7—Î:NܪYº€¾iVH hfÓïyÇ« D o3é§SØô­ÊÖ~$Ì}ÔvõÙú U»ÚÌe"ºÉ/ð$JīĘºieÎþ4Þhó®àM¼w”ÜÐåpÔ5ŽˆÛ"»è‡'„øƒ·ø~âMhѸ©ÆcÆŠO×HG^·×‰<æÁÈ>^p‡}¤’RtžÆE¬Ònv.ciu•ëBš1'½ŠN€;Áîíi’¤ÞB˜¸å@Cà'‡-㿎%Øþ5Ãç©`—É2ѹ¬×K÷ìá«ñ›Ïëþ·ôÂɱº•²íÆa Ugýä×Ïñ¦¢Ç]Üi&åIñUY”‡§Ÿ=ªÎq“$ˆ9ß¿!ÊlUôjìk9)¹Tûò³šÅ8O o+”ã §P Ñô%Úõ/É%5ÉGlÅ÷æO6£Ÿ(©Tõr‘[Ý %OZèñ–É«¾Q»Ü×Úµ>"gù9°—±ƒ+p/¯C´…v2ìÍLÁ,ÿö Ñ½8S J<®B!µ[éFîôcqWùP”§Ó“®Æ„vÝÚâ™™|VÜŽFÊÒèØ2Ô†÷vA8¥Õìãߥä9ÅÉeUE11Oµ«¦AoG––ê4æ °6_~쎎Ÿ““h¿8ÀƉÏ+øÐšTì^¤«¯Õ³:¼pàJsâ3;n3ÄŠÆÂ6u· €£gãÉ[æoÁM_€g“¶O¾Êg˦ê1Þx¾œ¢hZêPêUWOòe<ÕSÐ.@ˆuô#)~0ŸÔ]r70Ýk½p\ž WÞ tK¼–.Ìí醇[¶9ס°ÏÆ”/‘lâÀ=CÓËýGÞ °Q…Æ+TQTöÈÚ a]jPòÎ/É—5ò‰Û‡!_£]î>ë ØaÉÖ}R‘ÓJ-ì] ‘›9]Öš >LÞ¶»BåûØ;ËžSø³ ég½ªUº$s5’ö””• ?Gí]÷êæ ÜláAhâ×Çõ’Õ—Qc¡’dŽ´6­+¨xØ»›J/×ÂÏ;•Ï.}´¥£VSËæ¢YÆöYúº§Õ<:2«œ©v‰6¢ù'€zÃZdD|í!’@8!–û•Wय़î°Nt5 %ØäÒF²{R×Ý ~G­%Tlø5³ƒjnKB¡C©€@ó¸êy5ȼUçid¢±qX?ðÓ/odt)Fàž–‘Õ¨¨±${ Óq|·<^‘—·¬ ÕÚ ‰/.ÐZN¾"bBŠ)ðõâÌÍR]({޼ð:úN$«´âê¢ùB­¿Ü¬‰*CëRPè‡~ý-‘u¼Û»O<Ñš(ÀŸtLd–#EòB¨ü¸B)J³å¸8¼Ù‘.d“®ðˆë‰Lq[œ´Þ¯ð׌Ôí Û=ë¹²–Ïnµ $p÷jgoºO2bDÊc‰_GÐ!EÐèÜä¾É>7`üG~¥¾×¿v¯Dª\ûÎÃ|4µ½[ ± þ&ÒEKÿÖF!oÝŸÊ!ÔØr¥Gø=!>AÅäyéyl´Èϼæ‹Lx³Þ¸ˆìtÖ´íËjÆ{ë¹§¦t@Q¯s¾ÅÌ;FÛ/ d¨l‘tØWž›©­žŽ¥™Q®|fq݊ʃÄÝŠèd‚,Ž¢òg$| ,ûd[‰ˆ–é°Â ›Çp· Ÿï'o8+M‰q¡óCÎ+*8Õ¶0;d‰ˆ†–úTêi€Ø‡ ák ¯á _úL…å†Qs;¸¨/éÔ{J+{C{ƒKŽyÆdHá µªÓ¹~pÒbŲi(æ•öTšýÓw©|Ï_r)‹è’0(ùÓùL~ddo[,=Ex§Q såÇ{|¡±uDaÝnìä@n®ÎìxªþcÔs¡!Ò«0É[jجí°Çµ]|鼎7ÔKŽ û–ªà¦þ&Ÿ=פþ GsÛ#kµwùå‰ÇžÌ{õ¸$X°"Ä ;¬;é'ß|Š~yXòʲÿTáõ‚ e\ðƥȢýPu'Y¤ßÃÁà^•Œuýýè6‹87í%m¦(Ü7Y`YÀf£D@=?óáÿ†Ž\mòT‚ÙM«gÍ4·ḋOÛív§á¹¸¦&KlU$8Ú>u2ÈŸrÃ…ß¾°î›à$Ky´™…@¯9Çß¾›)!#uû¤®&„´¿L’|ýÓ“c§ûî¬ÕS¼¹§¨MëœEHA¹‹ôTYºñŽøÞ G Ë9:ñ´g¯YúUcAßÁKÅoƒzºU2ÔÉíÖËvÃô²Ðì[.ô=Å2Ö‹G;”Ko ÉÜØ·–L*ÀÓìähHÉbbu:X¯ìËä ŸeŒI Ñuù磖º¢ì1Õ«Oàc$Ló6„­j•vYM\7¥YŒJ‡ (´"K¢Ïä^¥â/mñUÅèhÒaõ•]ÈNÞl?W2íó0=«‰¥'Ý"ZøièZ»r­¸¦£wˆ– Ì=…h@ž ƒºË8M¯pfyq£/ƒ_^ÌÍwlr%‰ŽÞ-á?¯ÍHß>/~„ç= =oÍ0f¨%{›¨âW>>Ý¥o¹L¦"ŸØðØíIŠ›(ÓD…6!}>+Eb÷Naç´tûT›S®!ëæqÔÄP‰ìòŠØîàF 1Ê—H †snO®-ܵ„ƼlÇô" Ö,rÄÔÁD_¡Ñ-¨–¶£» í:qƒÆ@jäA|H"n WKÂþëJÇÖÆFÇúåòÔYÓôxªÅŠï"ÈSJ[M’ø§ PTå¾™Ïi–çûž›ì™êU{ \Ó¾Cœúê‰J^S.£~YS”-UèÍb¯dBðg”\^}Ë0xõN;ÏçrëªÔ›ÇŠ4”|=À,»Ï,ˆBuó6S|1 ×£*$‰>åC¿»Ýå—¢’5üÄ¢ðD ä÷ ¨gHèu¢}sÉD¹Ái~Cí±aRš­Ê]Õ-ç_B–°¿¢ (Ê&M ?•SÕæ±µ¬h«µäÿ M±c¤¶én,ãÞLVkHRÉáK¾|Äe]VÚ_¡QÃ[mïôöi ußyÌaˆØÜìÇÙGÞ°é ªÍŸè‚ÍËá RB'á»ïŸÐ8¾Ëì¶pÓ `{<æg Yͦ..Œ˜'`#¡1>ÖöI=•¬ÆÝ×” v_ ù„Bg{¿ª}Àòü°-Ò›cÿ ÕÖ4ǘ’[ÏC«c´õÒþ¶ñÞ@rA<̤"Â4†èþÎ!†sæÌ¬P¿0®)÷ãÝMzGçÓ}Í}³ùÖSdíl¨=6gîÖÍàŒ*jKäë DÒo8V1ßNõ¦¸6ßìêÖköÀäL–îÕ,bêaeÒMfŒ§›ÝXšO"H@g*P¥Äê›×Uü°™d(£ë-e……”ã7¾žû´aòiÁ‡­Ìu‹£,-¶Šîû£Šö?Eí=QkâHž½¬\‘“Êî#¶ÏKäSof³)ë„ßbDªP‘àá2}¬¿KùAèr@³DÄÚì Vq:ŠbùQº)Vn¤†²œàñé¡6z0J=7¬îµ2V2BÆw&À±ŽÄ³zäÇßOÙhÏæ¢^h¬ ‹Â1lã9VêC~Ìc:ö¦Çz¬mz”i¾rpÇ·Ý/Þbðg›Ãµ©¯‡%ö‰z6Ö\A^à±­ã6”`áŒÙK(÷<®^ìG¾U·Ã Åòx‘üáö³Äë¬Fñ‘ E·s6À­tWí4ÝË9æ×š^Àm:÷þd™W¥Q„úØör߯rS“ý6m^=‹þ’PÓ©ó^)ØpN[[è¼Tí9çã­æ¼(2·/ëÃ<‰hÔŽÏàJLhPï@0îy¹B®éaŽÔ³!рܭ«,ÑŒ·øä[cš§¥¼ŒÅÄãGi€ž:êŒ44îehÊŒ]ÕØ1ºµé™­KÙÁ¸Í69ý Uu×8t2 }Ì‹”OÐú:dŠŒüu8…5ª‘F¢2m½ß&í·þhôGßUöƒò$Kz ž¶¼N3<ë2Ä4]ƒPI.Å_À·ø¢‚©´¨ŠÖb霆d°¦QoØ2™Í…ÌfÏÉHcjø; #Ñ„Ñ-,î¿míÒb8¬’Q/ÛÄ£˜ß¦vÚi~çHßöR@¸мm51söjÈ7Å~Ku÷<»ìy<Å,Tê°o­‹øeOâ+E­È¥FýšI[Ö:nÍigÔGpE¹ùûà߬Dh«lX¬‚ËÝgÑ}xy5ñ’5tDw^MŠxEÅm-#ßÞÕQRT1VÜÎ>Z4d„§äq’³pÊâqYy Åhñ2òÍÜŠÍU5Ü®;‘žŸkÖeîái ˆ%ûºÒ/?î¦L– ]ÂfÁ ÚŽ`Íê—&ˆ\;#ËIó#Z¯L=„Œ}Øñ6­sRw·*v|Û.[ú©éº”–Iñ•8#’ïdÈ$éí1ó~^‡Õ} *æPèyŠcYWœË,˜qX:¨hxô’;d&2P*½rÛs'ZŒz@“{ªñq€¦¾`Lžä{¾¼í„Ϋ~ª¦š“¹ö²áÔ¬=:v‚·cì|iM‰ÝÙBúƒ€’¦B5éW¦Ån"äfŽ©ÛƒE2˜µj!ðÓ¸–lI:½ýè8¿]Z es͉ƒËhYR~Ž«•N ±0Útš¨eIÔ곟›‹Æ$wÇQäø¡?ê¤7¿£Þ*ç”Ϊï)šãާ½7ÑJŸ©Çêµµ:™¯êÓµ3r¼ #ä6¦Û'J”Ö°_ÌDŽefL¡ òȹ!‘ïxʆRÑCÅœßÀ´›e¨®¨PÜ)áP¬5»áš•Np4½‹±v¹eb6Us=æå×>Z•<%«ÖçèÅÉšûáæãããP¶ZsýcÂÆòL|µôBàòÂ4‹©%…Ç‘\"V$ÿ½Á;u+Z¢ UÓA·ösr€1ï³è;g·ÅÚLK6Ç9ïú´ºìµpõZRÛ)#ý’ðHF; •°¦xÚåY‘ -±íûeV:Ѩº:ñ©µvÁ1ÏW<Çv+†l©{ÓA%·³ÞÒ‰¨H‘ï³OX3‚ær üêˆïù=ÕPºÇ~ãÐ9n£`Ú´ ÀóÞÐ@.´gùÒ‚sqí•gWÃåãèšíœ¤«¶12¥ÐÁémÏMžå½’&½–¦ntTÊ'I~ÏެÓn©W=’-FUEÛ?œ4ä{ôÃÆq3åö¨Fó‰w qkâÆ¾©ÀPƒÄõ qò2ZŽñ=t³Ý–Üw4EˆÈ9G ÒôÉüñÄ)Tާ· ÊÏöï4 œHOu«RÞ‰ÓN-Äÿ4õR#”(EGËÚ0n¨ôˆ6A4Ä\°‘vŸÝ{×|?`×Íf¥m’ÁA½t0üHõÊcn,bšþ6LXøȊF^|ßEq¢sLªï¢“º™§àÓÏ7ðœk™Yø¹ÂÕÂüµRØOŒÃ°ýñ„2̰V⑞|ï“„³£®Ÿ¦ªÄ“uúø÷iŸ¹<‹µyÐWüéNýœ‚¿V&Ñ W›~¶ãäbÈ8‘µ|í«*—gØ••^ˆÂ\kZ­B½‰À{/Õ•òhù ì±h’‰Òã³õ>ÍL¥T|a40ZùÒepIá¦ÊGÊå>QÝhu7ܶ¢Ý´ÁA¹rбtü[ ‡ÃY †Ÿ•eF“Ôg™ú5qÒk‘èE1ºߺÞG5ñAgÓ,†8"º®Žmg¾ÄDµt­yîânÝÈ´³ßÉ“Ë&¾ä½0Ãæ¨51‘ïÿ¬Në¨c¢ÙoÊÅäYçG½Ä/ùØOL™¼ -‹¼„1~Ï츖ëUÈœ­Àés8ȳ$^Õö‘üB.êɸ6 @–1$ä{€(omçk ¾ˆýã÷E¡Ì7FpÄA“៯<íü¯O²”Jg5±cxú^k¢O4­ˆ˜T«q9UÊ’,Å⫈\]ÛQú´õS[ î×êRŒYÏ˧æ½ßŒJl?VNÂa!!ÓMœézF‹ :‚~ASxc$ë\Øõ‚¨Éd§S~é°£«÷!ú¨–biíÍo‡< wd#š¶ÕBâˆÄœµE4pÙd—»ñ*C8 ÷8ÙÌ.îÉk£h< /?kûÓ«œh£ä€çïBãÝ ¤ud¦àj7OûÇ£9ùãUŒ.#¨ÈÚ¿=_F\8‘,R F ŽQÉU»" ÔÅ9ù …µê–„T¶^F&ݾ´qcšeNÆ”W@u¨ÉH:†ùîþýÑá‘[xJ“KŸ)PÑ çHÈX˜ë›ÁfmW¤”ÙŠ‹µ·?pÁ„Aaq#üz„u¬gÈÝ*Ù§^0èøÁ룭8ɓŌk‹ülÛ(‡mùF¤Ý],pÑÚ--º1daˆ0Y Ó#–EøÏáR o˜k#˜™Ë°^'`Sd2þ\UJÝŸL:ÉW¸31µÐ Ý“gïrrHdY ÛgBâxÏ8KÏ;ÎB– zÅAû¬+’mé.*.iÕ¨q÷AŒÀ¶ç¸Ý.§%ÈúÓ*Ú$¤ÎÐÒY5~ËJR‡Z”Wòx²ñ1O™?¦…Ck:U’lø¤¦¥mf;%´WÕ¬Z=¢„#¶( #ŽZa)UMIégx:2çK‘|½ì‘ãÂêT¢¬øDc¦üc“’|§ å'àÛÔâ$ߊ©œÍw Fë,ÅÛ,¡QYh8¡…§-¸_UŠ«šÖD=G¹d3©{$÷  Ž%}®^Ÿ¶pÂJWO¢d-ìuMŽ 2Iè¤4×»O,™/”®í]oï$Œã¡³Z¯àG’†+XbÚ‰¹wô*|yDÑ+¸öÚ{½Ç•¹½cE…y^¸âkŒÓ rÌNt§Ä7×&•Å·óDÄŒß=:Â…·®=u'{³wú.Í^zƒ í\?MÕ;U ?Ï.DÔHáKK»¨åÌ*—a‡ð¤Ÿ¬6;¹"52õ=ïbkøÙp ômŸžÆÑ5¸ÍXÛù|Ç;r‰×•ýÞPe¢:¢a÷‰þÔ´kƉiº8ުߘ–[fZVhè<¤N'¿%á*òF ‹[PúZ€ª`¦ê›Oµ”$9*œäê“å‰sDRoxå šIÔ€&[o,|XE ç\½¬¥Àß{ŽxcyÁ³Òk̦*Ò•³Ã¼ÕYþu…­è{é¦OÂ7V‰àc­/S³)ž˜N“B‘ƒÓ!²ÁHÏøe˜ñ‰î])N»iÍVÔÆg¶ WŠº%‘iI§KI}û5*ÝÆtø^q¦›Z´€êŠêëŠÈ y’–ŒxO½lŠrʲ¤lN¯OÍš[´wQãYçqõ®5âZýÙ+%¡æÑÎXcã~ûò3„£»‰jÅ„´F •hþSÁðø¬lÞ°zà8L„•8‘l"nåÓÒóÇLö=5ìȳ=æ³&K¾$gÆ\ÀN²÷©µXèA¡íDz–h‰':ú^®’“‚–ZðÅC$y¢Ü«+R.ÓbxéHaµ„o†¶Ÿ¶nqSàµn ÈÞ/{6Ž˜}’'n‰e3h©›?—åBGÅœÉåÑáC‡îõ„à‘Kˆ}ãö i%>¨ì,¡7°ì^Åm,38 _Fˆ“íq”: H}ôzzÖð‰Ø×ßÐåúµ~Âk–ÀBåÓì)åûÍ~îªÏ¾—ãŸÍ…f󯽹yŪ{#tŠŒØ0¾çA`‡$†Ö—Rþʾ:),_T—j³œ YxˆøtAèšHÅ žòevtåÓÏõϵ*¿°Ó€ÄîÊHúŸŸ39+ž¦—«~JµÀ?AÛ ”܉ëç÷ù¤JV•%~Y¤hÇ6c$ο÷©iñʱ]ƒ/úš¶Üõ'ýs½X²¨ÍÊÔ辤ÆÇ-v¸Ý¦z§«…Ëiþ÷‡ýY÷<Ï~ìÂPOÄ—i(jFq A¹š7)äù«ØŸc«¿u‰‡²NL5°û´{E¼3Vþžmîbs죯i“B.ELM³ ÷}“)-ÎÉ…ŽXÄ­ÿ•£ãìU•ö­¢‡¢Ì€jŽi¢šª›ZC:õ‘oÐHÏNY¡ß4Íp7>^ˆå-wÒxðû¥)¹ýèˆrzi¢¸¯[W÷ðV¥·EÞ¬F“/FJ˜é´WÙ øîÚÃÕIšŠ‚Ôn§vÃK3²/:hRÃJ©Ñ†ÛjúH¦ 3>Ͼ¿À¦mÎÃ&¶¤ƒMÉÞô˜^| {óñÅ®7Ä:âtXK¼ ¥åŒkÌ¢Îɾª[;~d<£ñ óëÚ‘ø³5ƒÅZ¿ÏxcNÛþ£k†¤é¬œØ„…, ØIÄoÑæ|è>[±í½få:!òØfŸî¯ï{¤Ê܆–X ]ÙÞŽãø‰é1qûªõD}*qd¡\ù5.ÖUü® >ÁÒò…ðÞÉ#hIe$mkÖ¸÷Y$ëb %ÜcvLê¨yTŽ Q|K”i¼†ê¯~)jû‚‚š–Ã[ÃݬÅ” ôðOí8‡"}úM×¢×)­;ˆÕ peBÉMxï¡´¿¨½i‰Ö(žá.Š.œ@‹ô¦#4S/–®©‹>Km 'í cLþä”÷Ó¾ë×1½–Â훪 §M—}˜¶ø“xÈe˜+—´ò»pšþâß>¼Ÿsó…–zítå”I„ŽôA„ÈæcÖû¤^¸¸¸“Ø¢Sýy»¤Ìê¥Y²X8iW¥Û7ZóÚ{•zÝ‚½¹·ûµJš\~czõôåµ!ô…N•Þ`‡µm³úÀ²¸WŽèV—´ÌqôbU¿ü-©_÷0@Eæ[A÷}ìÓ1U6FØ!oV…ÊÞŸ<‚Á˜³´&ðí%ÏUIÞ›êf˜d5»G÷ªákýõé´–!‚Ð(ñ¢sgIö‘6Œ.Ùì‚ ŒîÜážø”"(4èốpTSá ŒsTÅå‹ÅoQ÷Ï” †Ì2 ‘FZ߃·]Kœ¼n¸…+ö#.¹‚BÅ^¶=âæDÒ}¦“æ$ýRŒx™HÙ1|Yr˜jä2©È;¹*Í‚g‘ mI^ƒˆsŸŸþ8ð¶Ž´OÛN™Qb/àyÎõŸýuwRdΣ‹J2­ Ÿ-D„ÿ®cÓ` endstream endobj 22 0 obj << /Type /FontDescriptor /FontName /JIVNGN+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/C/J/N/O/P/R/S/e/f/o/r/s/v) /FontFile 21 0 R >> endobj 23 0 obj << /Length1 1643 /Length2 9626 /Length3 0 /Length 10692 /Filter /FlateDecode >> stream xÚ¶P\Û.Œw×Ààƒ»„àî® 0È 28Á A'x°àîî‚ .ÁyäÈ=çÞÿ¯z¯¦jÏþº¿î^½Ö׫6†ös)k˜%X…?çæäH«ê(rs¸¸x9¹¸x0™˜t pGðßvL&=°«ùCÚ ‚?Úd@ðG¢* Prwpó¸D¸E¸¸<\\Âa®"Ä Ê P‚AÁn˜LÒ0goWˆ­ü±Î߯V+6·°° Çá)'°+Ä ¨‚àv`§ÇŠV G€6Ì †{ÿW V1;8ÜYôôôä9¹qÂ\m%Ø8ž¸@ ìvõ[~· P9ÿj“  cqûÓ¡ ³{‚\Á€Gƒ#Ä u{ q‡Zƒ]ÕÚŠ*ug0ôO²ÊŸÀ_›àæäþOº¿¢'‚@ÿYYÁœœAPoÔ`qÔåT8á^pjý›rtƒ=ƃ<@Gå#᥃rRšÐc‡õçfå q†»qºA÷üæq›e¡ÖÒ0''0î†ù{}2W°Õã¾{ÿ:\(Ìêû7²@­m~·aíî Ô…B\ÜÁŠ2qM˜ÿØlÁp?—ì{YÙÐñvÿáäþm~ìÁß׿ °ylì±?þaúº<À¸«;Øß÷ߎÿF˜ÜÜkˆ` ¶…@1ÿÉþhÛü‰Ïßâ0æz”7€ë÷ï?o¦ ³†A½ÿ¡ÿqÄ@#}Y9Euö¿ZþóåK˜À÷9/?à9?€››‡ øøâÿßyþ³wÿ‡Uùkuÿʨµ„ÿlâq÷þnÄã/e°þ56l€ÿ® {Ô3ÀúüM¸ø¹¬ÜÿÏCðGÈÿŸögù¿ÊÿW$çîèø‡ŸõOÂÿÇr‚8zÿÅxÔ³;üq6Taý_ª>øÏV[CÜþ׫=ΈÔöQçϹù8¹øþ´CÜä ^`k ÜÊîO-ý}5!P°Ì òûÞyŒââúßãèY9<Þ-nGö‡ ü8Yÿ]Wj³þ=‚<ü«+ÈóQˆàËý8«Ö`¯?$rBaðÇÀcþ˜+æïƒA¿M"!Ðò$ Zýq?Šþä!ÿ‚ ý¿àc&Çà£ZÐÁÇT°AÐù?ï1“ó£@`Öÿbð€®ÿ‚µÝþ xìÁÍäf÷/Âcø¿àãj<þ<å½ÿ€ÿµ—Vî®®×Í¢Üè¿ñwì¶ÂœŸY‰¾±¯zÓtY!Eåù|s„‡§ç$ò ]C–ÂcK3HZìê”÷SÔœTÛÔ¨«Â=žÂ‡:R.³e¿Ô(Òù/M(6–ë~c„â×{n*îQ'χ—Ÿ¥¸£¤DžH\«kCnüç›*ÎÊ~*•ýãqf:n‰“©yƒiDµÚ§¾³ÜãVƒQÁ®1Ž—ÍO×´‚2£ÑìgÍ—‚Fᕺ¹Mx XLtx‘Ç74{ Az¹Ô~£CòÂl’ä¡` °¡0¸‡Py@ÑÛi}›á>íéÒŒ2—ïšÁìˆÈ¬a{¨Ð;ƒµ¯“žçØnÕ†ùÃOW_øR0'NžgXD(bû-丌Cl&ïÖ©ÃLÞT‹!…“ûÜVþ„<¤%9fé'?„<Õ­²‰Ä*ñÍv‰6³âyñ9Ñ7¼zP ãÕá²d¤’vkUqWµÇ9cBõ¤šžñ¸Jý-fÎÚzóš±’{KÛè<'%ŸyŠÝs G,ü «Ü_}ªjBX£)]ÿ”$|ÞºÙYÉ0¬*^ˆfÃiIx2ÙW²NЈ#O3‰]·Wôsãuö½2í'*Âo׋S ÅTµêg-ÛGšY ûωE»äù(Qñ‰ )¸ŒXGv¦ <(Ÿé¿u‹ÞÓxr?-ð3¸×¥ÌãìÑ ôNð#ù¾BSMõÙRèÁjÕYÅK<·ÏO” $ëºyºúÕ sZÅ®´,ÿFNêÿ<޶NÌܲÅ!¥Q{‰§u~ôSÍ[ (¬ºº>¶µ-mƒ©éEo%ö6þÛò+5»ÒH&®C‹oa2¥›+ìa1.Çߠآ±Àã ƒš¬ÂtU„¯ØžFÖÞý¨Ôô쌬üÓ¸~œ Z¿b,æäKH¼Fç¨U…ݘk{É]˜ÐŸ‰ÏÖž1Åß}ÄC÷‰û¤Ä+'Å´÷â½CVÌíÊé„50©Ä4Óö´ëuÏàEo¾˜ÉMÓr¼ Ã2”fô´¬7KÅÞqE’Åå ×n%¡n2oÈáe|4üÔhÊÔ——S·.Vy9zy)u{þß{»4Yîµdí¿ö"ßÐP7"Béœ>ùC[ß:º(°äÆID"ñ\Ÿã&µ¢W}“RuŒÃS(Ïeˆ¿FÅ6n¤üàÖF ËÁÆ@øz#?¹Ùm(?  HñŸÇoªÎ›Úì7¢Ì;Úœ|z~-7â7è4`IqŸ‡jö$âUyî…Ú$;6‹vfÉ“Öz/±ÑAý¹J>Õõ \ïÜ36H+Ç´ë`o†h,¶lüÄÅ;"&Avx \å›é¼•ӮvˆVÛ_@5¶>ÅeË0ŠÑÆá¦BX9Ÿ?jmÕÊžiœ}9Ö·ûÒ…07Üìc*‡O¢8—Ýê³P½ýCeÄ^Z¶ÂÓÿåôîæ¼2®2^fçS>M÷^åÏæ3v¨ôÔ+Ö‹8 !³:H$TÍãDk‚FaH.tЬpÛ¬j?-'}Ef=ØFÜÛáœ/D•a=ÆŽÝ—h ØwŠDœ÷ÉVã¿ Ç ¤ÌÅÆ8ådäÒï#àŸÚ|ȦebÓb°\š·/Ê @‹£u:$I«qA”Õ|.M‹3ì–¤\7õ óºô¤Æäs¸/Y?ɵµáÂHÌžp£j¸fêH"PoÚºzµ }©ƒýþåÖ"Iù•>s°âñaÐ"µâ¹s†Ôy‘ݳ†"@'‡>JEç6ÕÉ…9^n®C¡>ÏŒ<óf4Ü!ŸÝNOŒ±È\Ƕ@eo®ÖýîÉ™•°ä¡Ù—IïÛJVÑÏÙ<•‹û»gCÏç._ –’u›âŸ¿Þu--`ÖLœå2nI—R5Í´™6ø!YëeJi¸LýqÕ•¸>|³È4PÇ:Þ¦#Kœ:ÌIŒâVyÂùųv ù®PZr¿ó‹A:ú¹…­8%Z™Í¦N|•¬|hÀM8MÑ]–8&)Ge‹5ÉŸÚî&\ûî .]àÙ˜¼¡kgãLöÀáÇS•¶îKâf¡x;‘=û§Œt™M+ê0!jÎËÇýò8äP¥±zÁ»Ê7ßÛ ÃÿI½&.¾I@qššç‘6vZÒ¿¼0,t©ËoÜ`>‰»‹Õ>ζsFwX½y¸«çžŠÆ·¬C‘ɾ#ó”³Cži-åúeµU·ÍÑZ nS¼wþâ Ñ–òáwÇWk[»œ<€Ï ‘8šJz1«¹©0ø-?3Ïññ^iS‘þ(ã}«ª¦ˆÆhÓP›ÉAÛˆgþE#ðÔã…}½øÈʹJâ‹Ð¼_Åžjõ¨oüå­ DÑb"<£zŽ0}©Zufìs¨--i”ÙIÒÒx\¾—ØØhżÁo·@yB Ý&VÁ›…#CY<£·°Ð?›=Ó'ÊIU楇GÀjo"WŸâ&&à9ðP°}a]“³Ï} ùÕb{ÿ)-ëîáÍn ]•íœ@›NI—jÏÆølºrŽÑô ü×93Ê8R‡ÂÛša ‡OÊU·OÔXk4 Úür&nºÄ\„Þ¬ÚŠêP}zg÷Ñ[@‚ÓHË•»pyÝõö¶‚è…t+–YF¼võAËŒ+?4jXNxè;ÝŠgû²ú†~z¹àסŒÍ%Ýʲ¸_T\‘æ,&òºÈíqYŒ£ßb£*?Èê\Wóy O5î“D1 ·e”XtEÃ’Ú»|â£]‡Ù]Lñ>FÑUÇ0êÊ’—ÌpBÿ¬Ò{ð°5{Œê¨áTþš õp¡Øù”Ã; ƒšo†tØ­q@¤ÛK-­&ƒl'XÙÄÃp‰ƒì÷d­½¤ †uU}YÊÛž]ÕhìùJtÉ!÷zêmj£`~g&ª†ë­ ‡\b g£™~€×£r µÑ¦A<#¼2(žúìb{KŸ-aK[úEµ—bá×5¦ŠV®' 9´Ç'änd<(ïisŸ4§l(„k|–ôÛÜ> &ŒZËT  (\¦›X/dÄÙ·°ñz-2AïX-$Êê×åNZÄ&KŠüÎõWüc¶/ ø7Ù)Ç;„ïÖêgëâ¹ú¿T?qz{QÞrQÁë’$Õß¿ˆ$³Ѱçö²Øý¤mÝŽ7æcêü¹¡¯ >/&‰S²c(n¼| ¸è¸hì¸Äœ¾ELI¡õê¾çKºOgq¿n ¦=BìŠüž†¦ D‹UÍ¢ºô½)´gÁ+oÕ(ÈÛQŽøNÒBG—ž-¡v‹ûeüÔxcWa^¿«¸d27V{ô¸û—¸¸Uµrh®UÈ•KjµÈ;ÒQZ/!+”›™’ÞØÞ·{–Á^c6ºd*ïßéhþÊ}ª»ø\  ¼°3ßð•]‘´º'~D§oCáÙsPç$¥6Ô¨²z¶Þ€|g4m8®² ~œŸûË[é³f<u›"2£˜Ao“‹4†:MÅ“1 ÜôÚ‡jR)¨1êx¨H[ì;AÀa®C¢-ôÔ…f/%¼Óî¥Àaµ™}ÃÎ7j¯·“–’AUŠŸãÔCø`ØßÏÖÔ• ~å^TßoE»&OMÊ Gˆ„ö Ñ84ÜóH†‘ë¤>9à¸ÖÌ7ÜÂPl¸ÙySýRvE©…ÙµÉȃt B]»Gtê•‹œ°UÃe~‰•U2Å×™Ôk•Þ\K®ž¤ÁV‚¨ßíºfª´‚‰• zϦ䋱äÞÍS¬ûŠJ³€­ œésa93©Ìk9²NɧPŠ'ÑœZòëÃR¡àªâ7½Ý¹;<©úOý0•E“+ÑŠÆe8È^ï¿ÜÐ]‘äÄôbã`©K§N‰–ÿšëôǵ|XçÅiÉò,¼ wcc3#*\|r¹(Jú•ÎM¢Õ=w`%ïNê)ë¥~[¿MkËG;^Åçlï6ÐBfóS´±|ã›m7‚-›dÊl åHó2¥)—Îâ kz9¨×OÿL-(Ïhª®·?Ù6¡üû3‹/’· ïÑ2ò4B#¥±¤ß4fžœ²©LËÊ|ÃïXœ8¤ÔÖA€QÂÕ-#0ŠM> éˆçoÎnÝúƻϻÛh£.já%’ÒùÕ6rd19AûI¬Òtsˈ2–íçèÔCi¨²E^”óöLûõã†û݇ÊúwqÜ'iÑß“¶²†ð-YœÂü'Wžbš¬çVÚÈ~÷©Aþ<Øåîºæï†¬ »:K)˜ØÐÚOE?‹ìJ;)¤RÔÖðÊ4~ΡêpŠÀe½A™’ñíúVIñšÜla#3€@WarW®Åªë›š ‰ôÑ÷$íŽ[üøÑú›ÚDòªp¤Ñr#B!)„e#U;ª$'Ù_òΙSYëY梔îOÉ€psæV¬¦ª2“õ ä¬ ‰ô‡ò´ø{›bO*KS ?‹‡[êCýrn[ò¿je¾MeønøŒe‘6‰9¿›¦9 à'‡Y™Q:¿m¦]ŒºX«!±WÃ>·°\s~úð¤Ç>2ø˜WÿG›Ù“‰³{Ù,\ËÜ~6_‹ÆÄ‹×¬ŽO2ÑB2G#àÁ/IוkŸ ð`[I—©Ò›ç¾¥¬'“ºvnŠÚ$½¸oõ ƒ7tE(èÍd8:õÕÜAa¬²É&r†5,ÜÎaôÀeÿKïu…BÒ / _’¦$®üøfõ{”˜KÅÔ² %¢žË·xž|Ø c;TúÕ¨ç*{‰’ؤfÄ‚&/‰4ª{i¥ÏHU™›&–8*œ¸é ¥µQ¦žïôÔ'n¥ØÑÉ_hÔ‚$¶·}º‰ýÂП0WL¸zw>ó`˼$Žf:ŒÃéUJº~öÞo^8’ç–¤Tÿ{VÔö+ÞšªÔ¼TÂæ-“õçÙx7]ü'oÆò!"bÑÀÔá.é;6 {_ÜÙLFôtqÎôš€¯d T³÷C[l§FN½ã¡™jOðdÇ“1¢¿â‘˜2–’p|–i¹C7É-dS}m_E3ó¤ÚTÆX›Ù»ó´6­k ޏI¡£?Ú•®•ø©5É™Ûp®yúDøó·Àè[lßl’I¡·S™$Ó8gF5-\1dŸe½7–Ö,5‰è‘iÍÉðR .|ViÙÄÈMÄü<Œê9< ¾MgfÎ…÷ÜzßlÊ#»ÖuÕ­‹T­þÝdgÈh}¯ì£‚û[…¡¡ï2´õàpÍD”…®ËÏ È–`‡_ Ó5<4«ÑY•fÚMõë+ø¶Õ(Á[ ó‘åŸÕëèx=sÕ‰:ÏÍä”t¯/ êå¦g!ˆèkÍ u9™¸¤7ÅÁÌÛŠ@yí[ìí—Ž½š,º}+ä#jN&Z¢Ñ `Õ¦ñï­¹Ç';7úv÷­\yëÜŠW=¨UOøÌïh» GK:ÄEŒBŠ—‘¦6ÒÝg'ªy?‚ ¬˜­Ý ãkN·A”õæNT§m— ªñ,º‚û•û;`¬A1Áþ˜ëÄ+®Dùè¬nsFƒë +ôÜLÙ ¾àfÆÓ¹ír™wGzìnãí±ÍÓø&“¹æ²Ûw7\ ¥·ºŽå+5ý²¬{öûAm4ñ‰Òêfºyn;o{æ"Õ#¼¥TÖŠº %Ǿùm¯R 9tdÎ] ``Vn`Ndbúa8J™åFç Û¤s¥Ø8.W®“É1Ësg õemö×}x¢Š?…zŠl‡-m£h½eagóËŒ*¼Ê~.W›WpÞZêÈÔSš0ì_ðqÎ!ÄÖ˜És9# õ64Ð3è»ýaþÐg_fÔ2(懯0Ú‰ƒé«àަ;.m#+0@Ò7õÎâP·Ð‹’ûƒ zà/rQ.àùLMËLUU阾å=Ž}ìLb{0¹äîj¦DAE©òÂúlO2œ¤“"ÿi5giò…8µ‘‚¦zÓÔÛ²Ì?;5¼OTfÏ\ZæÅ”š£+Mz…Zî]0Õ¯s_|jË“E5ÚîåÃíùÖ©ÄÙ9¨‚q핌“"õQy ¡wÙŸ:]Êù^àZ”·*¿¯Æ>^èfòXšÑÛ½²3¾‘Z­‡–àȇÈcÃh¢_….,˜$Ù/†ǵæóâùôâ3W7ŽÉ"Áš8±Ü%Û¥0Ì<3Ú…’éLEVó(ªÓ¦´Uîø¥–ª[Â×Jc™]…§%‚óÛÑÍÕ|L ÎÁ¶šë R¼œ1(Û*V\i9—wï‰d`8óú¬Êر¿ÖlËÂBß©WMŦX]´%¹ÔE•E4l®’”˜°ï›}J{§"3>¶·<5W_E I.åb×î„Àp-”i™i'jÿ2z·àPA}W½J##W£di¿Ui›¡ñ÷\oˆMX^³üÄp%p6SPiM©Ž É…‰‰%T®*iË`|>õ2<ÕQ‰bÂ3B¹ˆ{}Áû~ÄJ²Æ}áç‹ÅšÛ¨6áç)B*MÕ¬k°tQ‘ÊÍ ]àÁ`.ÝR¼ö¹5TÈ‹¦òB—Å¡Ý_þ8ðÁAz b}œ ¼L=Ò-õd|3  ùÚ“é]¾À<)ýZÌ’–~{ ÌüqzeðƒcÛÙçkç8‘zF½+âÕ®æ¸ùbFgmB£´Y@@“¶dBwøífjÊØ‡”«¯N8¡‹X}@œÐ—L>½ãÂ)S¯„÷S4Å ²'Òò™O¸¦Ðº¯Š}k-”¡›ÑB ÷‰:G”}˜23F6ÒÙ•Nä¶­´|⮎é̲± ÃÔ½R8¾q§EmÔqˆ2µoQÄ~äã³ °Nÿºe ¢É‰Îµ9*‘´«ñ^“C”páVÐ0ï³m€µrä/˜ÓÐáýäÌt}O=9m“nmÙ0#ÿ4ô…”'³ ²ÉçÌvÙ[Oa!Ϊ¤}¶ Í'謼9•y,½ù}U..œiNZM¿‡ÊV†U ³ŸÒÿU^›B÷QÒgiH2>_Le¾7âÖºS ª±m«£ %É)g|É“,mÕÃËSZ±—êaÄÓ) NG2È$•'Ô:WÕD™¤#”.YsÛ×"qœÐd4EÔ×Ò<~e&O|fzë‰xGáù’sæÐx›üS4 SêÃZ‹¸qãšÕù9·|d'ƒ°ø“ÀÏʯâU)ÐÈ´ˆ®?‘¶;xjåü°Uõåå‡'—)QÅyÑtUP‹÷!sÝeåeØH®¥Šò¤êÜ9õÆxõ5¶Êcp3±ÆLàŠgä©ú`¥…f³LïLëêCÈaX7Ñâ4Œú¿ý6h À™PË— W=a¾o=–lŠÌ|Z ,\vJä~©‹<:ŠY°¤²ã»Øå5/ĆåÆÞï Yb1¹M)E·CéÁˆÆúó 9§À¦ª½1‘OÌ‚¢Kg+š´áî¸'™^Ó¯e*ÔjXƒ0g¹¯2å› y{|$üÔ(=·tJHÊxž¸¥§7v¯%}0¡QåöÇâ½€ò¸@¢Xƒ\:ñŽ/JI.åHü³ôê¾¥,˜b{TuÄËAåöMôœ6)ñ…, åæA4ÔwDäHLÆ>AS`³÷™Yû¼æåûaK_?‰¹º©%§±9å®jæÞà|õèà»Ç6º¾ýÂÚ˜6¶‡ÈõáæÉå™Õ†Eë‚  ÖfE>W›ª”mwè+ì$3uÎ"½™$òìyéÔŸ¦m=h-½I ¸ i§|£’0ä×RHUî™y½ô?ÈÏÛ½WÕ,—ö‘ä½Â#7UÔà>,XÊ îÏtÛY/5‡JäÒw( < i¶`G>P‰zÅ·i¯6.¼ÍÂèËg*½'ÝUŒÜbÌ7ñùÏMïÝUL dßXññ)&¾Ûå{>yÊl;˜ÊŒ}å±ó60Öâæ“õäy¯÷{Ìðþ½À8º©c•?Lå…ØFÙãÈžK(`vD¡b`ѧ¡´ò#|ÑC¿ä@Iö–Ÿ«c¤ë­ö@ëHMÈy£¦=?°eï@CÄ@Ò†Óîc½†BRÕ¬ 4…¨÷Q>ýÚJ¦S%£4ÂFEtgý~<i5,K¸û†gY€¶þ‹=‘þ÷ûéUÉ <½¢Uò”(GhÚfÑÇl†ï ͬPœ_i“ñá ·?ÃU®›?ìÞè2Jmêx$`œ+v•â+©¤t< ¦îçW®tçûEûÞ^í@ˆs¢"Íj“½1SÊ;pmÞý`¡٠A3ûö–Ëu‡£-öÂ2>¥ñ‡6ª´OØ eÒó´YW‚ DKæ~tq B w~>w–¹ýÆxùuGg}„U‚„–ÙÆp…|XRŽ`{ï‰t샅üMJ+×l!ô©êû#PHøUÙÂ+ì·mÁ阈 Íßœ¸³"±^y>A)Ò‡€ýŒEÂU/%ıü=—f™IŸø)†ŸoQ‹¾JM'°‰ÀÙ vx¸ƒv;·ÆÈ|inòü(u*–‡Úc"•jiRl[<‘LØm`Yw"Y§&‚ ”Ùf÷¾¦y‰ö¼è—ƒ®ppµžDÏ·:¥ý›™¼ÑO)ÔŸ¼#æ š´îõÿèÿB#¤Ó^f(úú]Fð†ˆï­reû±óR×½9“oϵ$ž6‹8›¤à„3ÑÈ |ü$‹Ôص¡Ri¸—+£Š‘±„ …Á·”zÃk¥ý A>‘Ñ=v »çØ&–l2cq]ã92‚í™ì:†=¬}ØMîÀ\ŽºŠuø9¦fÃB/IH†|„;-µèm6M~È—±×7 ØžúØî¿(rœG8ƒç­"È™8ç”Ú¹D¬rHFjÅ“A¢5Í6$1ÑcõÀ–káÕ'þtï“HKH'7ã½D%åÔÇD[ß— ‰õ™³´¾‚X¹…#äŒ{oÍ–.Ú ÍÆåÚE-sì$ße;0F–\ýŒl¡Çô3fİVÞ†R_’ÏðhS [æWô´Ú~‘…Žk'vd\ ˜Rœ˜ýp/³/Œ)!^ÿÜNþ³*ÁH endstream endobj 24 0 obj << /Type /FontDescriptor /FontName /ZWEFIO+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/a/b/c/e/i/j/l/n/o/p/period/r/s/slash/t/v/y) /FontFile 23 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZTURQZ+CMBX12 /FontDescriptor 16 0 R /FirstChar 49 /LastChar 117 /Widths 12 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IHZKYK+CMR10 /FontDescriptor 18 0 R /FirstChar 11 /LastChar 121 /Widths 11 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CCLCPT+CMR12 /FontDescriptor 20 0 R /FirstChar 44 /LastChar 120 /Widths 13 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JIVNGN+CMR17 /FontDescriptor 22 0 R /FirstChar 67 /LastChar 118 /Widths 14 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZWEFIO+CMTI10 /FontDescriptor 24 0 R /FirstChar 46 /LastChar 121 /Widths 10 0 R >> endobj 9 0 obj << /Type /Pages /Count 1 /Kids [2 0 R] >> endobj 25 0 obj << /Type /Catalog /Pages 9 0 R >> endobj 26 0 obj << /Producer (MiKTeX pdfTeX-1.40.10) /Creator (TeX) /CreationDate (D:20130826223919-07'00') /ModDate (D:20130826223919-07'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.8.3759 (1.40.10)) >> endobj xref 0 27 0000000000 65535 f 0000001910 00000 n 0000001806 00000 n 0000000015 00000 n 0000064189 00000 n 0000064050 00000 n 0000063771 00000 n 0000063911 00000 n 0000064328 00000 n 0000064468 00000 n 0000002021 00000 n 0000002477 00000 n 0000003093 00000 n 0000003499 00000 n 0000003922 00000 n 0000004248 00000 n 0000014008 00000 n 0000014265 00000 n 0000032145 00000 n 0000032500 00000 n 0000042882 00000 n 0000043158 00000 n 0000052459 00000 n 0000052699 00000 n 0000063510 00000 n 0000064525 00000 n 0000064575 00000 n trailer << /Size 27 /Root 25 0 R /Info 26 0 R /ID [<1501BC346394D3F56E0E6BB6CD839DB6> <1501BC346394D3F56E0E6BB6CD839DB6>] >> startxref 64797 %%EOF rjson/inst/doc/json_rpc_server.Rnw0000744000176000001440000000266012207035610017053 0ustar ripleyusers\documentclass[letter]{article} %\VignetteIndexEntry{JSON RPC server for R} %\VignettePackage{rjson} \begin{document} \title{JSON RPC server for R} \author{Alex Couture-Beil} \maketitle \section{Introduction} Remote proceedure calls (RPC) provide inter-process communication which allow programs to call other program's subroutines. JSON-RPC is a RPC protocol built on top of JSON. JSON-RPC provides a nice way to interface different languages. Sample code for creating an JSON-RPC server for R is supplied with the rjson library. For this example, a client wishing to execute R code will first execute a new instance of R, and will communicate over standard IO (stdin/stdout). After the client executes any number of calls, it will terminate the R session with an end of file (ctrl-D). \section{Sample Code} Sample code can be found in the {\it ..../library/rjson/rpc\_server} directory. The server is started with {\it ./start\_server} (unix), or with {\it start\_server.bat} (windows). An optional paramater specifies a user supplied source file to be loaded by the server, thus allowing the client to execute some user supplied functions. Note that this code posses serious security risks if the client accecpts input from anyone. (i.e. the client redirects IO from some tcp port to the R json-rpc interface). If this is the case, you'll likely want to avoid allowing anyone to pass anything to eval. \end{document} rjson/src/0000755000176000001440000000000012207035610012220 5ustar ripleyusersrjson/src/parser.c0000744000176000001440000004504712207035610013673 0ustar ripleyusers#include #include #define DEFAULT_VECTOR_START_SIZE 10 /* allocate vectors this size to start with, then grow them as needed */ #define MAX_NUMBER_BUF 256 #define UNEXPECTED_ESCAPE_ERROR 1 /* issue an error and stop */ #define UNEXPECTED_ESCAPE_SKIP 2 /* skip the unexpected char and move to the next character */ #define UNEXPECTED_ESCAPE_KEEP 3 /* include the unexpected char as a regular char and continue */ /* converts a single string into a list of (key, value) lists i.e. convert "nokey keyname=foo" into the following R list: list(list(value="nokey"), list(key="keyname", value="foo")) args: str - R character string env - R environment for use in calling R code fname - R character string of filename for use in error reporting lineNum - R numeric value for line number for use in error reporting return: R list of 1-element, or 2-element lists. i.e.: "nokey keyname=foo" becomes list(list(value="nokey"), list(key="keyname", value="foo")) */ SEXP parseValue( const char *s, const char **next_ch, const int unexpected_escape_handling ); SEXP parseNull( const char *s, const char **next_ch ); SEXP parseTrue( const char *s, const char **next_ch ); SEXP parseFalse( const char *s, const char **next_ch ); SEXP parseString( const char *s, const char **next_ch, const int unexpected_escape_handling ); SEXP parseNumber( const char *s, const char **next_ch ); SEXP parseArray( const char *s, const char **next_ch, const int unexpected_escape_handling ); SEXP parseList( const char *s, const char **next_ch, const int unexpected_escape_handling ); SEXP mkError( const char* format, ...); int getUnexpectedEscapeHandlingCode( const char *s ); #define TRYERROR_CLASS "try-error" SEXP mkError( const char* format, ...) { SEXP p, classp; char buf[ 256 ]; va_list args; va_start( args, format ); vsnprintf( buf, 256, format, args ); va_end( args ); PROTECT( p = allocVector(STRSXP, 1) ); SET_STRING_ELT( p, 0, mkCharCE( buf, CE_UTF8 ) ); PROTECT( classp = allocVector(STRSXP, 1) ); SET_STRING_ELT( classp, 0, mkChar( TRYERROR_CLASS ) ); SET_CLASS( p, classp ); UNPROTECT( 2 ); return p; } #define INCOMPLETE_CLASS "incomplete" SEXP addClass( SEXP p, const char * class ) { SEXP class_p; PROTECT( class_p = GET_CLASS( p ) ); unsigned int size = GET_LENGTH( class_p ); PROTECT( SET_LENGTH( class_p, size + 1 ) ); SET_STRING_ELT( class_p, size, mkChar( class ) ); SET_CLASS( p, class_p ); UNPROTECT( 2 ); return p; } int hasClass( SEXP p, const char * class ) { int i; SEXP class_p; PROTECT( class_p = GET_CLASS( p ) ); unsigned int size = GET_LENGTH( class_p ); for( i = 0; i < size; i++ ) { const char *s = CHAR(STRING_ELT(class_p, i)); if( strcmp( s, class ) == 0 ) { UNPROTECT( 1 ); return TRUE; } } UNPROTECT( 1 ); return FALSE; } #define MASKBITS 0x3F #define MASKBYTE 0x80 #define MASK2BYTES 0xC0 #define MASK3BYTES 0xE0 int UTF8Encode2BytesUnicode( unsigned short input, char * s ) { // 0xxxxxxx if( input < 0x80 ) { s[ 0 ] = input; return 1; } // 110xxxxx 10xxxxxx else if( input < 0x800 ) { s[ 0 ] = (MASK2BYTES | ( input >> 6 ) ); s[ 1 ] = (MASKBYTE | ( input & MASKBITS ) ); return 2; } // 1110xxxx 10xxxxxx 10xxxxxx else if( input < 0x10000 ) { s[ 0 ] = (MASK3BYTES | ( input >> 12 ) ); s[ 1 ] = (MASKBYTE | ( ( input >> 6 ) & MASKBITS ) ); s[ 2 ] = (MASKBYTE | ( input & MASKBITS ) ); return 3; } } int getUnexpectedEscapeHandlingCode( const char *s ) { if( s != NULL ) { if( strcmp( s, "skip" ) == 0 ) { return UNEXPECTED_ESCAPE_SKIP; } else if( strcmp( s, "keep" ) == 0 ) { return UNEXPECTED_ESCAPE_KEEP; } } /* in all other cases, just use the standard original error */ return UNEXPECTED_ESCAPE_ERROR; } SEXP fromJSON( SEXP str_in, SEXP unexpected_escape_handling_in ) { const char *s = CHAR(STRING_ELT(str_in,0)); const char *next_ch; int unexpected_escape_handling = getUnexpectedEscapeHandlingCode(CHAR(STRING_ELT(unexpected_escape_handling_in,0))); SEXP p, next_i, list; PROTECT( p = parseValue( s, &next_ch, unexpected_escape_handling ) ); PROTECT( list = allocVector( VECSXP, 2 ) ); PROTECT( next_i = allocVector( INTSXP, 1 ) ); //PROTECT( list_names = allocVector( STRSXP, DEFAULT_VECTOR_START_SIZE ) ); //SET_STRING_ELT( list_names, list_i, STRING_ELT(key, 0) ); SET_VECTOR_ELT( list, 0, p ); INTEGER( next_i )[ 0 ] = next_ch - s; SET_VECTOR_ELT( list, 1, next_i ); UNPROTECT( 3 ); return list; } SEXP parseValue( const char *s, const char **next_ch, const int unexpected_escape_handling ) { /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '{' ) { return parseList( s, next_ch, unexpected_escape_handling ); } if( *s == '[' ) { return parseArray( s, next_ch, unexpected_escape_handling ); } if( *s == '\"' ) { return parseString( s, next_ch, unexpected_escape_handling ); } if( ( *s >= '0' && *s <= '9' ) || *s == '-' ) { return parseNumber( s, next_ch ); } if( *s == 't' ) { return parseTrue( s, next_ch ); } if( *s == 'f' ) { return parseFalse( s, next_ch ); } if( *s == 'n' ) { return parseNull( s, next_ch ); } if( *s == '\0' ) { return addClass( mkError( "no data to parse\n" ), INCOMPLETE_CLASS ); } return mkError( "unexpected character '%c'\n", *s ); } SEXP parseNull( const char *s, const char **next_ch ) { if( strncmp( s, "null", 4 ) == 0 ) { *next_ch = s + 4; return R_NilValue; } //TODO should really look at subset of "null" (e.g. "nul", "nu" ), so that "not" fails before reaching 4 digits if( strlen( s ) < 4 ) return addClass( mkError( "parseNull: expected to see 'null' - likely an unquoted string starting with 'n', or truncated null.\n" ), INCOMPLETE_CLASS ); return mkError( "parseNull: expected to see 'null' - likely an unquoted string starting with 'n'.\n" ); } SEXP parseTrue( const char *s, const char **next_ch ) { SEXP p; if( strncmp( s, "true", 4 ) == 0 ) { *next_ch = s + 4; PROTECT( p = NEW_LOGICAL( 1 ) ); LOGICAL( p )[ 0 ] = TRUE; UNPROTECT( 1 ); return p; } if( strlen( s ) < 4 ) return addClass( mkError( "parseTrue: expected to see 'true' - likely an unquoted string starting with 't', or truncated true.\n" ), INCOMPLETE_CLASS ); return mkError( "parseTrue: expected to see 'true' - likely an unquoted string starting with 't'.\n" ); } SEXP parseFalse( const char *s, const char **next_ch ) { SEXP p; if( strncmp( s, "false", 5 ) == 0 ) { *next_ch = s + 5; PROTECT( p = NEW_LOGICAL( 1 ) ); LOGICAL( p )[ 0 ] = FALSE; UNPROTECT( 1 ); return p; } if( strlen( s ) < 5 ) return addClass( mkError( "parseFalse: expected to see 'false' - likely an unquoted string starting with 'f', or truncated false.\n" ), INCOMPLETE_CLASS ); return mkError( "parseFalse: expected to see 'false' - likely an unquoted string starting with 'f'.\n" ); } SEXP parseString( const char *s, const char **next_ch, const int unexpected_escape_handling ) { SEXP p; /*assert( s[ 0 ] == '"' );*/ int i = 1; /*skip the start quote*/ int buf_size = 256; char *buf = (char*) malloc( buf_size ); buf[0] = '\0'; int buf_i = 0; if( buf == NULL ) return mkError( "error allocating memory in parseString" ); if( sizeof( char ) != 1 ) return mkError( "parseString sizeof(char) != 1" ); int copy_start = i; int bytes_to_copy; while( 1 ) { while( s[ i ] != '\\' && s[ i ] != '"' && s[ i ] != '\0' ) i++; if( s[ i ] == '\0' ) { return addClass( mkError( "unclosed string\n" ), INCOMPLETE_CLASS ); } if( s[ i ] == '\\' ) { if( s[ i + 1 ] == '\0' ) { return addClass( mkError( "unclosed string\n" ), INCOMPLETE_CLASS ); } //TODO couldn't this be caught above (where s[ i ] == '\0') if( s[ i + 2 ] == '\0' ) { return addClass( mkError( "unclosed string\n" ), INCOMPLETE_CLASS ); } /* grow memory */ if( buf_size - 1 <= i ) { buf_size = 2 * ( buf_size + i ); buf = realloc( buf, buf_size ); if( buf == NULL ) return mkError( "error allocating memory in parseString" ); } /* save string chunk from copy_start to i-1 */ bytes_to_copy = i - copy_start; if( bytes_to_copy > 0 ) { memcpy( buf + buf_i, s + copy_start, bytes_to_copy ); buf_i += bytes_to_copy; } i++; /* save s[i] */ switch( s[ i ] ) { case '"': case '\\': case '/': buf[ buf_i ] = s[ i ]; break; case 'b': buf[ buf_i ] = '\b'; break; case 'f': buf[ buf_i ] = '\f'; break; case 'n': buf[ buf_i ] = '\n'; break; case 'r': buf[ buf_i ] = '\r'; break; case 't': buf[ buf_i ] = '\t'; break; case 'u': for( int j = 1; j <= 4; j++ ) if( ( ( s[ i + j ] >= 'a' && s[ i + j ] <= 'f' ) || ( s[ i + j ] >= 'A' && s[ i + j ] <= 'F' ) || ( s[ i + j ] >= '0' && s[ i + j ] <= '9' ) ) == FALSE ) { return mkError( "unexpected unicode escaped char '%c'; 4 hex digits should follow the \\u (found %i valid digits)", s[ i + j ], j - 1 ); } unsigned short unicode; char unicode_buf[ 5 ]; /* to hold 4 digit hex (to prevent scanning a 5th digit accidentally */ strncpy( unicode_buf, s + i + 1, 5 ); unicode_buf[ 4 ] = '\0'; sscanf( unicode_buf, "%hx", &unicode); buf_i += UTF8Encode2BytesUnicode( unicode, buf + buf_i ) - 1; /* -1 due to buf_i++ out of loop */ i += 4; /* skip the four digits - actually point to last digit, which is then incremented outside of switch */ break; default: if( unexpected_escape_handling == UNEXPECTED_ESCAPE_SKIP ) { //skip the character (by decreasing the buffer index as it will be increased below. in actuality we dont want it to change). buf_i--; Rf_warning( "unexpected escaped character '\\%c' at pos %i. Skipping value.", s[ i ], i ); } else if( unexpected_escape_handling == UNEXPECTED_ESCAPE_KEEP ) { //treat a "\y" as simply 'y' buf[ buf_i ] = s[ i ]; Rf_warning( "unexpected escaped character '\\%c' at pos %i. Keeping value.", s[ i ], i ); } else { //case of UNEXPECTED_ESCAPE_ERROR, or any other bad enum values return mkError( "unexpected escaped character '\\%c' at pos %i", s[ i ], i ); } break; } i++; /* move to next char */ copy_start = i; buf_i++; } else { /*must be a quote that caused us the exit the loop, first, save remaining string data*/ if( buf_size - 1 <= i ) { /* grow memory */ buf_size = 2 * ( buf_size + i ); buf = realloc( buf, buf_size ); if( buf == NULL ) return mkError( "error allocating memory in parseString" ); } bytes_to_copy = i - copy_start; if( bytes_to_copy > 0 ) { memcpy( buf + buf_i, s + copy_start, bytes_to_copy ); buf_i += bytes_to_copy; } buf[ buf_i ] = '\0'; break; /*exit the loop*/ } } *next_ch = s + i + 1; PROTECT(p=allocVector(STRSXP, 1)); SET_STRING_ELT(p, 0, mkCharCE( buf, CE_UTF8 )); free( buf ); UNPROTECT( 1 ); return p; } void setArrayElement( SEXP array, int unsigned i, SEXP val ) { if( IS_LOGICAL( array ) ) LOGICAL( array )[ i ] = LOGICAL( val )[ 0 ]; else if( IS_INTEGER( array ) ) INTEGER( array )[ i ] = INTEGER( val )[ 0 ]; else if( IS_NUMERIC( array ) ) REAL( array ) [ i ] = REAL( val )[ 0 ]; else if( IS_CHARACTER( array ) ) SET_STRING_ELT( array, i, STRING_ELT(val, 0) ); /*TODO fixme val must be a single char, not vector*/ /* else if( IS_COMPLEX( array ) ) COMPLEX( array [ i ] = COMPLEX( val )[ 0 ]; */ else Rprintf( "unsupported SEXPTYPE: %i\n", TYPEOF( array ) ); } SEXP test( void ) { int i; SEXP p, array; PROTECT( array = allocVector( REALSXP, DEFAULT_VECTOR_START_SIZE ) ); PROTECT( p = allocVector( REALSXP, 1 ) ); REAL( p )[ 0 ] = 4; for( i = 0; i < 1000000; i++ ) { setArrayElement( array, i, p ); } UNPROTECT( 2 ); return array; } SEXP parseArray( const char *s, const char **next_ch, const int unexpected_escape_handling ) { PROTECT_INDEX p_index = -1, array_index = -1; SEXP p = NULL, array = NULL; /*assert( *s == '[' )*/ s++; /*move past '['*/ int objs = 0; int is_list = FALSE; SEXPTYPE p_type = -1; unsigned int array_i = 0; while( 1 ) { /*ignore whitespace*/ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete array\n" ), INCOMPLETE_CLASS ); } if( *s == ']' ) { *next_ch = s + 1; return allocVector(VECSXP, 0); } /* parse element (and protect pointer - ugly) */ if( p == NULL ) { PROTECT_WITH_INDEX( p = parseValue( s, next_ch, unexpected_escape_handling ), &p_index ); objs++; } else { REPROTECT( p = parseValue( s, next_ch, unexpected_escape_handling ), p_index ); } s = *next_ch; /* check p for errors */ if( hasClass( p, TRYERROR_CLASS ) == TRUE ) { UNPROTECT( objs ); return p; } if( array == NULL ) { /*create a vector of type that matches p*/ if( GET_LENGTH( p ) != 1 ) p_type = VECSXP; else p_type = TYPEOF( p ); PROTECT_WITH_INDEX( array = allocVector( p_type, DEFAULT_VECTOR_START_SIZE ), &array_index ); objs++; is_list = ( p_type == VECSXP ); } /*check array type matches*/ if( is_list == FALSE && ( TYPEOF( p ) != TYPEOF( array ) || GET_LENGTH( p ) != 1 ) ) { REPROTECT( array = coerceVector( array, VECSXP ), array_index ); is_list = TRUE; } /*checksize*/ unsigned int array_size = GET_LENGTH( array ); if( array_i >= array_size ) { REPROTECT( SET_LENGTH( array, array_size * 2 ), array_index ); } /*save element*/ if( is_list == TRUE ) SET_VECTOR_ELT( array, array_i, p); else setArrayElement( array, array_i, p ); array_i++; /*ignore whitespace*/ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete array\n" ), INCOMPLETE_CLASS ); } /*end of array*/ if( *s == ']' ) { break; } /*more elements to come*/ if( *s == ',' ) { s++; } else if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete array\n" ), INCOMPLETE_CLASS ); } else { UNPROTECT( objs ); return mkError( "unexpected character: %c\n", *s ); } } /*trim to the correct size - no need to protect here*/ SET_LENGTH( array, array_i ); *next_ch = s + 1; UNPROTECT( objs ); return array; } SEXP parseList( const char *s, const char **next_ch, const int unexpected_escape_handling ) { PROTECT_INDEX key_index, val_index, list_index, list_names_index; SEXP key = NULL, val = NULL, list, list_names; /*assert( *s == '{' )*/ s++; /*move past '{'*/ int objs = 0; unsigned int list_i = 0; PROTECT_WITH_INDEX( list = allocVector( VECSXP, DEFAULT_VECTOR_START_SIZE ), &list_index ); PROTECT_WITH_INDEX( list_names = allocVector( STRSXP, DEFAULT_VECTOR_START_SIZE ), &list_names_index ); objs += 2; while( 1 ) { /*ignore whitespace*/ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete list\n" ), INCOMPLETE_CLASS ); } if( *s == '}' ) { UNPROTECT( objs ); *next_ch = s + 1; return allocVector(VECSXP, 0); } /*get key*/ if( key == NULL ) { PROTECT_WITH_INDEX( key = parseValue( s, next_ch, unexpected_escape_handling ), &key_index ); objs++; } else { REPROTECT( key = parseValue( s, next_ch, unexpected_escape_handling ), key_index ); } s = *next_ch; /* check key for errors */ if( hasClass( key, TRYERROR_CLASS ) == TRUE ) { UNPROTECT( objs ); return key; } if( IS_CHARACTER( key ) == FALSE ) { UNPROTECT( objs ); return mkError( "list keys must be strings\n" ); } /*ignore whitespace*/ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s != ':' ) { UNPROTECT( objs ); if( *s == '\0' ) return addClass( mkError( "incomplete list - missing :\n" ), INCOMPLETE_CLASS ); return mkError( "incomplete list - missing :\n" ); } s++; /*move past ':'*/ /*ignore whitespace*/ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete list\n" ), INCOMPLETE_CLASS ); } /*get value*/ if( val == NULL ) { PROTECT_WITH_INDEX( val = parseValue( s, next_ch, unexpected_escape_handling ), &val_index ); objs++; } else { REPROTECT( val = parseValue( s, next_ch, unexpected_escape_handling ), val_index ); } s = *next_ch; /* check val for errors */ if( hasClass( val, TRYERROR_CLASS ) == TRUE ) { UNPROTECT( objs ); return val; } /*checksize*/ unsigned int list_size = GET_LENGTH( list ); if( list_i >= list_size ) { REPROTECT( SET_LENGTH( list, list_size * 2 ), list_index ); REPROTECT( SET_LENGTH( list_names, list_size * 2 ), list_names_index ); } /*save key and value*/ SET_STRING_ELT( list_names, list_i, STRING_ELT(key, 0) ); SET_VECTOR_ELT( list, list_i, val ); list_i++; /*ignore whitespace*/ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete list\n" ), INCOMPLETE_CLASS ); } /*end of list*/ if( *s == '}' ) { break; } /*more elements to come*/ if( *s == ',' ) { s++; } else { UNPROTECT( objs ); return mkError( "unexpected character: %c\n", *s ); } } /*trim to the correct size*/ REPROTECT( SET_LENGTH( list, list_i ), list_index ); REPROTECT( SET_LENGTH( list_names, list_i ), list_names_index ); /*set names*/ setAttrib( list, R_NamesSymbol, list_names ); *next_ch = s + 1; UNPROTECT( objs ); return list; } SEXP parseNumber( const char *s, const char **next_ch ) { SEXP p; const char *start = s; char buf[ MAX_NUMBER_BUF ]; if( *s == '-' ) s++; if( *s == '\0' ) { return addClass( mkError( "parseNumer error\n", *s ), INCOMPLETE_CLASS ); } if( *s == '0' ) { s++; if( ( *s >= '0' && *s <= '9' ) || *s == 'x' ) { return mkError( "hex or octal is not valid json\n" ); } } while( *s >= '0' && *s <= '9' ) { s++; } if( *s == '.' ) { s++; while( *s >= '0' && *s <= '9' ) s++; } /*exponential*/ if( *s == 'e' || *s == 'E' ) { s++; if( *s == '+' || *s == '-' ) s++; while( *s >= '0' && *s <= '9' ) s++; } unsigned int len = s - start; if( len >= MAX_NUMBER_BUF ) { return mkError( "buffer issue parsing number: increase MAX_NUMBER_BUF (in parser.c) current value is %i\n", MAX_NUMBER_BUF ); } /*copy to buf, which is used with atof*/ strncpy( buf, start, len ); buf[ len ] = '\0'; *next_ch = s; PROTECT( p = allocVector( REALSXP, 1 ) ); REAL(p)[ 0 ] = atof( buf ); UNPROTECT( 1 ); return p; } rjson/src/dump.cpp0000744000176000001440000001106112207035610013671 0ustar ripleyusers#include #include #include #include //must include these after STL files due to length macro in Rinternals being seen by a STL on OSX. #include #include std::string escapeString( const char *s ) { std::ostringstream oss; oss << '"'; while( *s ) { switch( *s ) { case '"': oss << "\\\""; break; case '\\': oss << "\\\\"; break; case '\n': oss << "\\n"; break; case '\r': oss << "\\r"; break; case '\t': oss << "\\t"; break; default: if( static_cast(*s) < 0x80 ) { // 0xxxxxxx oss << *s; } else if( (static_cast(*s) & 0xE0) == 0xC0 && s[1] ) { // 110xxxxx 10xxxxxx unsigned short val = (s[1] & 0x3F) + ((s[0] & 0x1F) << 6); oss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << val << std::dec; s += 1; } else if( (static_cast(*s) & 0xF0) == 0xE0 && s[1] && s[2] ) { // 1110xxxx 10xxxxxx 10xxxxxx unsigned short val = (s[2] & 0x3F) + ((s[1] & 0x3F) << 6) + ((s[0] & 0x0F) << 12); oss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << val << std::dec; s += 2; } else { error("unable to escape string. String is not utf8\n"); } } s++; } oss << '"'; return oss.str(); } #define NO_CONTAINER 0 #define ARRAY_CONTAINER 1 #define OBJECT_CONTAINER 2 std::string toJSON2( SEXP x ) { if( x == R_NilValue ) return "null"; int i = 0; int n = length(x); SEXP names = GET_NAMES(x); //int container = NO_CONTAINER; std::string container_closer; std::ostringstream oss; if( names != NULL_USER_OBJECT ) { oss << "{"; container_closer = "}"; if( length(names) != n ) error("number of names does not match number of elements\n"); } else if( n != 1 || TYPEOF(x) == VECSXP ) { oss << "["; container_closer = "]"; } SEXP levels; PROTECT( levels = GET_LEVELS(x)); switch( TYPEOF(x) ) { case LGLSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) oss << ","; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; if( LOGICAL(x)[i] == NA_INTEGER ) oss << "\"NA\""; else if( ISNAN( LOGICAL(x)[i] ) ) oss << "\"NaN\""; else if( LOGICAL(x)[i] ) oss << "true"; else oss << "false"; } break; case INTSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) oss << ","; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; if( INTEGER(x)[i] == NA_INTEGER ) oss << "\"NA\""; else if( ISNAN( INTEGER(x)[i] ) ) oss << "\"NaN\""; else if( levels != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(levels, INTEGER(x)[i] - 1 ))); else oss << INTEGER(x)[i]; } break; case REALSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) { oss << ","; } if( names != NULL_USER_OBJECT ) { oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; } if( ISNA(REAL(x)[i]) ) { oss << "\"NA\""; } else if( ISNAN(REAL(x)[i]) ) { oss << "\"NaN\""; } else if( R_FINITE(REAL(x)[i]) ) { oss << std::setprecision( std::numeric_limits::digits10 ) << REAL(x)[i]; } else { oss << (REAL(x)[i] > 0 ? "\"Inf\"" : "\"-Inf\""); } } break; case CPLXSXP: { SEXP p, p_names; PROTECT( p = allocVector( REALSXP, 2 ) ); PROTECT( p_names = allocVector( STRSXP, 2 ) ); SET_STRING_ELT( p_names, 0, mkChar("real") ); REAL(p)[0] = COMPLEX(x)[i].r; SET_STRING_ELT( p_names, 1, mkChar("imaginary") ); REAL(p)[1] = COMPLEX(x)[i].i; setAttrib( p, R_NamesSymbol, p_names ); oss << toJSON2(p); UNPROTECT(2); } break; case STRSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) oss << ","; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; if( STRING_ELT(x,i) == NA_STRING ) oss << "\"NA\""; else oss << escapeString(CHAR(STRING_ELT(x,i))); } break; case VECSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) oss << ","; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; oss << toJSON2( VECTOR_ELT(x,i) ); } break; default: error("unable to convert R type %i to JSON\n", TYPEOF(x)); } UNPROTECT(1); oss << container_closer; return oss.str(); } extern "C" { SEXP toJSON( SEXP obj ) { std::string buf = toJSON2( obj ); SEXP p; PROTECT(p=allocVector(STRSXP, 1)); SET_STRING_ELT(p, 0, mkCharCE( buf.c_str(), CE_UTF8 )); UNPROTECT( 1 ); return p; } } rjson/NAMESPACE0000744000176000001440000000004712207035602012653 0ustar ripleyusersexport(toJSON, newJSONParser, fromJSON)rjson/R/0000755000176000001440000000000012207035602011633 5ustar ripleyusersrjson/R/json.R0000744000176000001440000002561512207035602012741 0ustar ripleyuserstoJSON <- function( x, method = "C" ) { if( method == "C" ) { return( .Call("toJSON", x, PACKAGE="rjson")[[ 1 ]] ) } else if( method != "R" ) { stop("bad method - only R or C" ) } #convert factors to characters if( is.factor( x ) == TRUE ) { tmp_names <- names( x ) x = as.character( x ) names( x ) <- tmp_names } if( !is.vector(x) && !is.null(x) && !is.list(x) ) { x <- as.list( x ) warning("JSON only supports vectors and lists - But I'll try anyways") } if( is.null(x) ) return( "null" ) #treat named vectors as lists if( is.null( names( x ) ) == FALSE ) { x <- as.list( x ) } #named lists only if( is.list(x) && !is.null(names(x)) ) { if( any(duplicated(names(x))) ) stop( "A JSON list must have unique names" ); str = "{" first_elem = TRUE for( n in names(x) ) { if( first_elem ) first_elem = FALSE else str = paste(str, ',', sep="") str = paste(str, deparse(n), ":", toJSON(x[[n]], "R"), sep="") } str = paste( str, "}", sep="" ) return( str ) } #treat lists without names as JSON array if( length(x) != 1 || is.list(x) ) { if( !is.null(names(x)) ) return( toJSON(as.list(x), "R") ) #vector with names - treat as JSON list str = "[" first_elem = TRUE for( val in x ) { if( first_elem ) first_elem = FALSE else str = paste(str, ',', sep="") str = paste(str, toJSON(val, "R"), sep="") } str = paste( str, "]", sep="" ) return( str ) } if( is.nan(x) ) return( "\"NaN\"" ) if( is.na(x) ) return( "\"NA\"" ) if( is.infinite(x) ) return( ifelse( x == Inf, "\"Inf\"", "\"-Inf\"" ) ) if( is.logical(x) ) return( ifelse(x, "true", "false") ) if( is.character(x) ) return( gsub("\\/", "\\\\/", deparse(x)) ) if( is.numeric(x) ) return( as.character(x) ) stop( "shouldnt make it here - unhandled type not caught" ) } #create an object, which can be used to parse JSON data spanning multiple buffers #it will be able to pull out multiple objects.. e.g: "[5][2,1]" is two different JSON objects - it can be called twice to get both items newJSONParser <- function( method = "R" ) { if( method == "R" ) { buffer <- c() return( list( "addData" = function( buf ) { chars = strsplit(buf, "")[[1]] for( ch in chars ) buffer[ length(buffer) + 1 ] <<- ch }, "getObject" = function() { tmp <- .parseValue( buffer, 1) if( is.null( tmp$incomplete ) == FALSE ) return( NULL ) if( tmp$size > length(buffer) ) buffer <<- c() else buffer <<- buffer[ tmp$size : length(buffer) ] return( tmp$val ) } ) ) } else if( method == "C" ) { buffer <- "" return( list( "addData" = function( buf ) { buffer <<- paste( buffer, buf, sep="" ) }, "getObject" = function() { tmp <- .Call("fromJSON", buffer, PACKAGE="rjson") if( any( class( tmp[[ 1 ]] ) == "incomplete" ) ) return( NULL ) size <- tmp[[ 2 ]] + 1 buffer <<- substring( buffer, size, nchar( buffer ) ) return( tmp[[ 1 ]] ) } ) ) } stop("bad method - only R or C" ) } fromJSON <- function( json_str, file, method = "C", unexpected.escape = "error" ) { if( missing( json_str ) ) { if( missing( file ) ) stop( "either json_str or file must be supplied to fromJSON") json_str <- paste(readLines( file, warn=FALSE ),collapse="") } else { if( missing( file ) == FALSE ) { stop( "only one of json_str or file must be supplied to fromJSON") } } if( method == "R" ) return( .fromJSON_R( json_str ) ) if( method != "C" ) stop( "only R or C method allowed" ) x <- .Call("fromJSON", json_str, unexpected.escape, PACKAGE="rjson")[[ 1 ]] if( any( class(x) == "try-error" ) ) stop( x ) return( x ) } .fromJSON_R <- function( json_str ) { if( !is.character(json_str) ) stop( "JSON objects must be a character string" ) chars = strsplit(json_str, "")[[1]] tmp <- .parseValue( chars, 1) if( is.null( tmp$incomplete ) ) return( tmp$val ) else return( NULL ) } .parseValue <- function( chars, i ) { if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } ch = chars[i] if( ch == "{" ) { return( .parseObj( chars, i ) ) } if( ch == "[" ) { return( .parseArray( chars, i ) ) } if( ch == "\"" ) { return( .parseString( chars, i ) ) } if( any(grep("[0-9\\-]", ch)) ) { return( .parseNumber( chars, i ) ) } if( ch == "t" ) { return( .parseTrue( chars, i ) ) } if( ch == "f" ) { return( .parseFalse( chars, i ) ) } if( ch == "n" ) { return( .parseNull( chars, i ) ) } #stop("shouldnt reach end of parseValue") err <- paste( "unexpected data:", paste( chars[ i:length(chars)], collapse = "" ) ) stop( err ) } .parseObj <- function( chars, i ) { obj <- list() if( chars[i] != "{" ) stop("error - no openning tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) first_pass <- TRUE while( TRUE ) { #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #look out for empty lists if( chars[i] == "}" && first_pass == TRUE ) { i = i + 1 break } first_pass <- FALSE #get key str = .parseString( chars, i ) if( is.null( str$incomplete ) == FALSE ) return( str ) key = str$val i = str$size if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #verify seperater if( chars[i] != ":" ) stop("error - no seperator") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #get value val = .parseValue( chars, i ) if( is.null( val$incomplete ) == FALSE ) return( val ) obj[key] <- list(val$val) i = val$size if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( chars[i] == "}" ) { i = i + 1 break } if( chars[i] != "," ) stop("error - no closing tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } return( list(val=obj, size=i) ) } .parseArray <- function( chars, i ) { useVect <- TRUE arr <- list() if( chars[i] != "[" ) stop("error - no openning tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( TRUE ) { #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #look out for empty arrays if( chars[i] == "]" ) { i = i + 1 useVect <- FALSE #force an empty list instead of NULL (i.e. value = vector("list",0)) break } #get value val = .parseValue( chars, i ) if( is.null( val$incomplete ) == FALSE ) return( val ) arr[length(arr)+1] <- list(val$val) if( is.list(val$val) || length(val$val) > 1 || is.null(val$val) ) useVect <- FALSE i = val$size if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( chars[i] == "]" ) { i = i + 1 break } if( chars[i] != "," ) stop("error - no closing tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( useVect ) arr <- unlist(arr) return( list(val=arr, size=i) ) } .parseString <- function( chars, i ) { str_start = i if( chars[i] != "\"") stop("error") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( TRUE ) { while( chars[i] != "\\" && chars[i] != "\"" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( chars[i] == "\\" ) { i = i + 2 #skip the next char if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } else break } str_end = i i = i + 1 return(list( val=eval(parse( text=paste(chars[str_start:str_end], collapse="") )), size=i )) } .parseNumber <- function( chars, i ) { str_start = i if( chars[i] == "-" ) i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) if( chars[i] == "0" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) if( any(grep("[1-9]", chars[i])) ) stop("JSON specs don't allow a number like \"012\"") } else if( any(grep("[1-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( any(grep("[0-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } } else { stop( "doesn't look like a valid JSON number" ) } if( chars[i] == "." ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( any(grep("[0-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } } if( chars[i] == "e" || chars[i] == "E" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) if( chars[i] == "-" || chars[i] == "+" ) i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( any(grep("[0-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } } str_end = i-1 return(list( val=eval(parse( text=paste(chars[str_start:str_end], collapse="") )), size=i )) } .parseTrue <- function( chars, i ) { if( paste(chars[i:(i+3)], collapse="") == "true" ) return( list(val=TRUE,size=i+4) ) stop("error parsing true value (maybe the word starts with t but isnt true)") } .parseFalse <- function( chars, i ) { if( paste(chars[i:(i+4)], collapse="") == "false" ) return( list(val=FALSE,size=i+5) ) stop("error parsing false value (maybe the word starts with f but isnt false)") } .parseNull <- function( chars, i ) { if( paste(chars[i:(i+3)], collapse="") == "null" ) return( list(val=NULL,size=i+4) ) stop("error parsing null value (maybe the word starts with n but isnt null)") } rjson/R/zzz.R0000744000176000001440000000010612207035602012611 0ustar ripleyusers.onLoad <- function(lib, pkg) { library.dynam("rjson", pkg, lib) }rjson/vignettes/0000755000176000001440000000000012207035610013441 5ustar ripleyusersrjson/vignettes/json_rpc_server.Rnw0000744000176000001440000000266012207035602017342 0ustar ripleyusers\documentclass[letter]{article} %\VignetteIndexEntry{JSON RPC server for R} %\VignettePackage{rjson} \begin{document} \title{JSON RPC server for R} \author{Alex Couture-Beil} \maketitle \section{Introduction} Remote proceedure calls (RPC) provide inter-process communication which allow programs to call other program's subroutines. JSON-RPC is a RPC protocol built on top of JSON. JSON-RPC provides a nice way to interface different languages. Sample code for creating an JSON-RPC server for R is supplied with the rjson library. For this example, a client wishing to execute R code will first execute a new instance of R, and will communicate over standard IO (stdin/stdout). After the client executes any number of calls, it will terminate the R session with an end of file (ctrl-D). \section{Sample Code} Sample code can be found in the {\it ..../library/rjson/rpc\_server} directory. The server is started with {\it ./start\_server} (unix), or with {\it start\_server.bat} (windows). An optional paramater specifies a user supplied source file to be loaded by the server, thus allowing the client to execute some user supplied functions. Note that this code posses serious security risks if the client accecpts input from anyone. (i.e. the client redirects IO from some tcp port to the R json-rpc interface). If this is the case, you'll likely want to avoid allowing anyone to pass anything to eval. \end{document} rjson/MD50000644000176000001440000000306612207040627011752 0ustar ripleyusers4b3a715345e182d018776fdb68416a46 *DESCRIPTION 34551522533d48d0a968454bea1b4d30 *NAMESPACE e55356bebdb32a78f25913061ad61cb9 *R/json.R fe0816aba49fd43d5839ec47f7424a4e *R/zzz.R 3eadbc78b5bb07643db14d365416f7c4 *inst/changelog.txt d5ee201778e62a76798467a2b5e05939 *inst/doc/json_rpc_server.Rnw 37bebbc789033a63b0cd8a23c250542a *inst/doc/json_rpc_server.pdf cee224c8dc417dece605178406f9b2d5 *inst/rpc_server/server.r ce0131b40a9fe6dbd17ac5e623c438e9 *inst/rpc_server/some_script.r e29f8f1f26f017f214682f36e42db7e6 *inst/rpc_server/start_server 73af6807a8fbffa9294a857fbe1e9142 *inst/rpc_server/start_server.bat 8bdfe289eb96e1bd1eaae9424465c95d *inst/unittests/runtests.r 4332629bb0c7980a23ccc5593446ddea *inst/unittests/test.array.r 00b153c57bd7dfc9afdd56c1a0c046fc *inst/unittests/test.big.r 98440e2bad97aa6643e8caa0cc8b4a62 *inst/unittests/test.factors.r 87796fc72bf1b5cdf54863e97418902d *inst/unittests/test.list.r e170f788eff599224fc6a74bd84321bb *inst/unittests/test.number.r f1a69faf07ff11ae05dbfa6506006400 *inst/unittests/test.strings.r 8b882fa46012945b1692e7edbe9f2fbc *inst/unittests/test.tojson.r c092ae9e4fa9e9a38dada80e022578e6 *inst/unittests/test.twitter.r f199072cb2d721fa87e732296d86757e *inst/unittests/test.unicode.r e8ad3a9acb7040339ae9f0f00b258a9e *man/fromJSON.Rd bd9f6db6dd53775f9f0e32f769aa0791 *man/newJSONParser.Rd 0d41a3e0097885679eb96d80b17aa766 *man/rjson.Rd 8c44b9023e78c35cf4b62af840975262 *man/toJSON.Rd 93d51de794d9775178e9879d13f747bc *src/dump.cpp c994ae4749f00961f0cea0398464e22a *src/parser.c d5ee201778e62a76798467a2b5e05939 *vignettes/json_rpc_server.Rnw rjson/DESCRIPTION0000744000176000001440000000057512207040627013153 0ustar ripleyusersPackage: rjson Version: 0.2.13 Date: 2012-11-29 Title: JSON for R Author: Alex Couture-Beil Maintainer: Alex Couture-Beil Depends: R (>= 2.12.0) Description: Converts R object into JSON objects and vice-versa License: GPL-2 Repository: CRAN Date/Publication: 2013-08-27 08:05:11 Packaged: 2013-08-27 05:39:20 UTC; alex NeedsCompilation: yes rjson/man/0000755000176000001440000000000012207035602012205 5ustar ripleyusersrjson/man/rjson.Rd0000744000176000001440000000056112207035602013632 0ustar ripleyusers\name{rjson} \docType{package} \alias{rjson} \alias{rjson-package} \title{JSON for R} \description{ JSON (JavaScript Object Notation) is a lightweight data-interchange format. This package converts JSON objects into R objects and vice-versa. See json.org for an overview of JSON. Unicode is unfortunately not supported at the moment. } \keyword{package} rjson/man/toJSON.Rd0000744000176000001440000000215312207035602013612 0ustar ripleyusers\name{toJSON} \alias{toJSON} \title{Convert R To JSON} \description{ Convert an R object into a corresponding JSON object. ***Lists with unnamed components are not currently supported*** } \usage{toJSON( x, method="C" )} \arguments{ \item{x}{a vector or list to convert into a JSON object} \item{method}{use the \code{C} implementation, or the older slower (and one day to be depricated) \code{R} implementation} } \value{a string containing the JSON object} \seealso{ \code{\link{fromJSON}} } \examples{ x <- list( alpha = 1:5, beta = "Bravo", gamma = list(a=1:3, b=NULL), delta = c(TRUE, FALSE) ) json <- toJSON( x ) fromJSON( json ) #named vectors are treated as JSON objects (lists) toJSON(islands[1:4]) #data.frames must be converted into a list before converting into JSON plot(cars, pch=2) json_cars <- toJSON(as.list(cars)) points( data.frame( fromJSON( json_cars ) ), col="red", pch=3 ) #special R types are encoded as strings testString <- c(1,2,3,4,NA,NaN,Inf,8,9); toJSON(testString); } %TODO find better keyword \keyword{interface} rjson/man/fromJSON.Rd0000744000176000001440000000227512207035602014140 0ustar ripleyusers\name{fromJSON} \alias{fromJSON} \title{Convert JSON To R} \description{ Convert a JSON object into an R object. } \usage{fromJSON( json_str, file, method = "C", unexpected.escape = "error" )} \arguments{ \item{json_str}{a JSON object to convert} \item{file}{the name of a file to read the json_str from; this can also be a URL. Only one of json_str or file must be supplied.} \item{method}{use the \code{C} implementation, or the older slower (and one day to be depricated) \code{R} implementation} \item{unexpected.escape}{changed handling of unexpected escaped characters. Handling value should be one of "error", "skip", or "keep"; on unexpected characters issue an \code{error}, \code{skip} the character, or \code{keep} the character} } \value{R object that corresponds to the JSON object} \seealso{ \code{\link{toJSON}} } \examples{ #watch out for R turning null into FALSE fromJSON( "[true, false, null]" ) ##[1] TRUE FALSE __FALSE__ #but if you use a hash, this will be avoided fromJSON( '{"a":true, "b":false, "c":null}' ) #R vs C x <- toJSON( iris ) system.time( y <- fromJSON(x) ) system.time( y2 <- fromJSON(x,method = "R") ) } \keyword{interface} rjson/man/newJSONParser.Rd0000744000176000001440000000254412207035602015142 0ustar ripleyusers\name{newJSONParser} \alias{newJSONParser} \title{Convert buffered JSON objects To R } \description{ Convert a collection of JSON objects into R objects. } \usage{newJSONParser(method = "R")} \arguments{ \item{method}{use the \code{C} implementation, or the slower original \code{R} implementation} } \value{A list of functions used for parsing objects} \seealso{ \code{\link{toJSON}} } \examples{ sample_json <- ' { "breakfast" : [ "milk", "fruit loops", "juice" ], "lunch" : [ "left over sushi" ] } ' parser <- newJSONParser() parser$addData( sample_json ) food <- parser$getObject() print( food ) #This is equivalent to using FromJSON( sample_json ) #However, sample_json can be split into several parts: ### EXAMPLE 2: part_1 <- '{ "breakfast" : [ "milk", "fruit loops", "juice" ], ' part_2 <- '"lunch" : [ "left over sushi" ]' # close off the first object, and create a 2nd JSON object, which is simply an # array part_3 <- '} [1,2,3,4,5]' parser <- newJSONParser() parser$addData( part_1 ) parser$getObject() #returns NULL - since part_1 isn't complete parser$addData( part_2 ) parser$getObject() #returns NULL - since part_2 still isn't complete parser$addData( part_3 ) parser$getObject() #returns the first food object parser$getObject() #returns the second array } \keyword{interface}