From 8728780565e5b72f2f72ead5766550e575ee228b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 11 Jan 2016 15:25:02 -0300 Subject: [PATCH] transition --- SuperNET/Makefile | 4 +- SuperNET/SuperNET.c | 469 +++++++++++++ SuperNET/SuperNET.h | 4 +- SuperNET/m_osx | 2 +- SuperNET/m_unix | 2 +- SuperNET/main.c | 127 +++- crypto777/Makefile | 18 +- crypto777/OS_time.c | 14 +- crypto777/ccgi.c | 1328 +++++++++++++++++++++++++++++++++++ crypto777/crypto777.sources | 11 + crypto777/inet.c | 1 + crypto777/m_win32 | 3 +- crypto777/mingw | 6 + crypto777/mingw32 | 2 + crypto777/mingw64 | 3 + deprecated/obsolete.h | 837 +++++++++++++++++++++- iguana/Makefile | 13 +- iguana/SuperNET.c | 507 +++++++++++++ iguana/SuperNET.h | 91 +++ iguana/iguana.sources | 10 +- iguana/iguana777.c | 7 +- iguana/iguana777.h | 15 +- iguana/iguana_bitmap.c | 7 +- iguana/iguana_chains.c | 1 + iguana/iguana_html.c | 783 ++++++--------------- iguana/iguana_init.c | 2 - iguana/iguana_json.c | 557 ++------------- iguana/iguana_msg.c | 2 +- iguana/iguana_peers.c | 4 +- iguana/iguana_rpc.c | 179 ++--- iguana/iguana_wallet.c | 4 +- iguana/main.c | 789 ++++++--------------- iguana/mingw32 | 3 +- iguana/mingw64 | 5 +- includes/ccgi.h | 64 ++ m_unix | 2 +- mingw.path | 2 + mingw.path64 | 2 + pangea/main.c | 10 +- win/libcurl.a | Bin 0 -> 604532 bytes win/libcurldll.a | Bin 0 -> 686792 bytes 41 files changed, 4075 insertions(+), 1815 deletions(-) create mode 100755 crypto777/ccgi.c create mode 100644 crypto777/crypto777.sources create mode 100755 crypto777/mingw create mode 100755 crypto777/mingw32 create mode 100755 crypto777/mingw64 create mode 100644 iguana/SuperNET.c create mode 100644 iguana/SuperNET.h create mode 100755 includes/ccgi.h create mode 100644 mingw.path create mode 100644 mingw.path64 create mode 100644 win/libcurl.a create mode 100644 win/libcurldll.a diff --git a/SuperNET/Makefile b/SuperNET/Makefile index 7310ee0d1..90045f33c 100644 --- a/SuperNET/Makefile +++ b/SuperNET/Makefile @@ -8,12 +8,12 @@ VALID_TOOLCHAINS := pnacl newlib glibc clang-newlib mac NACL_SDK_ROOT ?= $(abspath $(CURDIR)) - TARGET = SuperNET EXTRA= -D__PNACL include $(NACL_SDK_ROOT)/tools/common.mk +include SuperNET.sources CHROME_ARGS += --allow-nacl-socket-api=127.0.0.1 @@ -23,7 +23,7 @@ LIBS = crypto777 nanomsg curl ssl crypto z glibc-compat nacl_spawn ppapi nacl_i CFLAGS = -Wall -D__PNACL -fno-strict-aliasing $(EXTRA) LFLAGS = libs -SOURCES = main.c SuperNET.c +SOURCES = $(SOURCES) # Build rules generated by macros from common.mk: diff --git a/SuperNET/SuperNET.c b/SuperNET/SuperNET.c index d7a7a23ac..5f807e552 100644 --- a/SuperNET/SuperNET.c +++ b/SuperNET/SuperNET.c @@ -14,6 +14,139 @@ ******************************************************************************/ #include "SuperNET.h" +#define IGUANA_FORMS "[ \ +\ +{\"disp\":\"simple explorer\",\"agent\":\"ramchain\",\"method\":\"explore\",\"fields\":[{\"skip\":1,\"field\":\"search\",\"cols\":65,\"rows\":1}]}, \ +{\"disp\":\"block height\",\"agent\":\"ramchain\",\"method\":\"block\",\"fields\":[{\"field\":\"height\",\"cols\":10,\"rows\":1}]}, \ +{\"disp\":\"block hash\",\"agent\":\"ramchain\",\"method\":\"block\",\"fields\":[{\"field\":\"hash\",\"cols\":65,\"rows\":1}]}, \ +{\"disp\":\"txid\",\"agent\":\"ramchain\",\"method\":\"txid\",\"fields\":[{\"skip\":1,\"field\":\"hash\",\"cols\":65,\"rows\":1}]}, \ +{\"disp\":\"status\",\"agent\":\"ramchain\",\"method\":\"status\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"bundleinfo\",\"agent\":\"ramchain\",\"method\":\"bundleinfo\",\"fields\":[{\"skip\":1,\"field\":\"height\",\"cols\":12,\"rows\":1}]}, \ +\ +{\"disp\":\"addcoin\",\"agent\":\"iguana\",\"method\":\"addcoin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1}]}, \ +{\"disp\":\"pausecoin\",\"agent\":\"iguana\",\"method\":\"pausecoin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"startcoin\",\"agent\":\"iguana\",\"method\":\"startcoin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"addnode\",\"agent\":\"iguana\",\"method\":\"addnode\",\"fields\":[{\"skip\":1,\"field\":\"ipaddr\",\"cols\":32,\"rows\":1}]}, \ +{\"disp\":\"maxpeers\",\"agent\":\"iguana\",\"method\":\"maxpeers\",\"fields\":[{\"skip\":1,\"field\":\"max\",\"cols\":8,\"rows\":1}]}, \ +{\"disp\":\"peers\",\"agent\":\"iguana\",\"method\":\"peers\",\"fields\":[{\"field\":\"coin\",\"cols\":16,\"rows\":1}]}, \ +{\"disp\":\"nodestatus\",\"agent\":\"iguana\",\"method\":\"nodestatus\",\"fields\":[{\"skip\":1,\"field\":\"ipaddr\",\"cols\":32,\"rows\":1}]}, \ +\ +{\"disp\":\"rates\",\"agent\":\"PAX\",\"method\":\"rates\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1}]},\ +{\"disp\":\"prices\",\"agent\":\"PAX\",\"method\":\"prices\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1}]},\ +{\"agent\":\"PAX\",\"method\":\"lock\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"lockdays\",\"cols\":6,\"rows\":1},{\"skip\":1,\"field\":\"units\",\"cols\":12,\"rows\":1}]}, \ +{\"agent\":\"PAX\",\"method\":\"redeem\",\"fields\":[{\"skip\":1,\"field\":\"txid\",\"cols\":65,\"rows\":1},{\"skip\":1,\"field\":\"dest\",\"cols\":65,\"rows\":1}]},\ +{\"disp\":\"balance\",\"agent\":\"PAX\",\"method\":\"balance\",\"fields\":[{\"skip\":1,\"field\":\"address\",\"cols\":44,\"rows\":1}]},\ +{\"agent\":\"PAX\",\"method\":\"rollover\",\"fields\":[{\"skip\":1,\"field\":\"txid\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"newpeg\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"newlockdays\",\"cols\":6,\"rows\":1}]},\ +{\"agent\":\"PAX\",\"method\":\"swap\",\"fields\":[{\"skip\":1,\"field\":\"txid\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"othertxid\",\"cols\":16,\"rows\":1}]},\ +{\"agent\":\"PAX\",\"method\":\"bet\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"price\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":16,\"rows\":1}]},\ +\ +{\"agent\":\"InstantDEX\",\"method\":\"placebid\",\"fields\":[{\"skip\":1,\"field\":\"base\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"rel\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1},{\"field\":\"price\",\"cols\":16,\"rows\":1},{\"field\":\"volume\",\"cols\":16,\"rows\":1}]}, \ +{\"agent\":\"InstantDEX\",\"method\":\"placeask\",\"fields\":[{\"skip\":1,\"field\":\"base\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"rel\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1},{\"field\":\"price\",\"cols\":16,\"rows\":1},{\"field\":\"volume\",\"cols\":16,\"rows\":1}]}, \ +{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"fields\":[{\"skip\":1,\"field\":\"base\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"rel\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1}]}, \ +{\"disp\":\"orderstatus\",\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"fields\":[{\"skip\":1,\"field\":\"orderid\",\"cols\":32,\"rows\":1}]}, \ +{\"disp\":\"cancelorder\",\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"fields\":[{\"skip\":1,\"field\":\"orderid\",\"cols\":32,\"rows\":1}]}, \ +{\"disp\":\"balance\",\"agent\":\"InstantDEX\",\"method\":\"balance\",\"fields\":[{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"allorderbooks\",\"agent\":\"InstantDEX\",\"method\":\"allorderbooks\",\"fields\":[{\"skip\":1,\"field\":\"allorderbooks\",\"cols\":1,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"openorders\",\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"fields\":[{\"skip\":1,\"field\":\"openorders\",\"cols\":1,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"tradehistory\",\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"fields\":[{\"skip\":1,\"field\":\"tradehistory\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"allexchanges\",\"agent\":\"InstantDEX\",\"method\":\"allexchanges\",\"fields\":[{\"skip\":1,\"field\":\"allexchanges\",\"cols\":1,\"rows\":1}]}, \ +\ +{\"agent\":\"pangea\",\"method\":\"bet\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":24,\"rows\":1}]}, \ +{\"disp\":\"call\",\"agent\":\"pangea\",\"method\":\"call\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"fold\",\"agent\":\"pangea\",\"method\":\"fold\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"status\",\"agent\":\"pangea\",\"method\":\"status\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"hand history\",\"agent\":\"pangea\",\"method\":\"handhistory\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"history\",\"agent\":\"pangea\",\"method\":\"history\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"follow\",\"agent\":\"pangea\",\"method\":\"follow\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1}]}, \ +{\"disp\":\"lobby\",\"agent\":\"pangea\",\"method\":\"lobby\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1}]}, \ +{\"disp\":\"join\",\"agent\":\"pangea\",\"method\":\"join\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1}]}, \ +{\"agent\":\"pangea\",\"method\":\"buyin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":12,\"rows\":1}]}, \ +{\"agent\":\"pangea\",\"method\":\"newtournament\",\"fields\":[{\"field\":\"mintables\",\"cols\":8,\"rows\":1},{\"field\":\"maxtables\",\"cols\":4,\"rows\":1},{\"field\":\"starttime\",\"cols\":16,\"rows\":1},{\"field\":\"prizefund\",\"cols\":12,\"rows\":1},{\"field\":\"coin\",\"cols\":12,\"rows\":1}]}, \ +{\"agent\":\"pangea\",\"method\":\"newtable\",\"fields\":[{\"field\":\"minplayers\",\"cols\":4,\"rows\":1},{\"field\":\"maxplayers\",\"cols\":4,\"rows\":1},{\"field\":\"rake\",\"cols\":4,\"rows\":1},{\"field\":\"bigblind\",\"cols\":12,\"rows\":1},{\"field\":\"ante\",\"cols\":12,\"rows\":1},{\"field\":\"minbuyin\",\"cols\":12,\"rows\":1},{\"field\":\"maxbuyin\",\"cols\":12,\"rows\":1}]}, \ +{\"disp\":\"leave\",\"agent\":\"pangea\",\"method\":\"leave\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":8,\"rows\":1}]}, \ +\ +{\"agent\":\"jumblr\",\"method\":\"send\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":13,\"rows\":1},{\"skip\":1,\"field\":\"address\",\"cols\":8,\"rows\":1}]}, \ +{\"agent\":\"jumblr\",\"method\":\"invoice\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":13,\"rows\":1},{\"skip\":1,\"field\":\"address\",\"cols\":8,\"rows\":1}]}, \ +{\"agent\":\"jumblr\",\"method\":\"shuffle\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":13,\"rows\":1}]}, \ +{\"agent\":\"jumblr\",\"method\":\"balance\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"address\",\"cols\":13,\"rows\":1}]}, \ +\ +{\"newline\":0,\"disp\":\"InstantDEX\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"InstantDEX\",\"cols\":1,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"PAX\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"PAX\",\"cols\":1,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"pangea\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"pangea\",\"cols\":1,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"jumblr\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"jumblr\",\"cols\":1,\"rows\":1}]}, \ +{\"disp\":\"ramchain\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"ramchain\",\"cols\":1,\"rows\":1}]}, \ +{\"newline\":0,\"disp\":\"iguana\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"iguana\",\"cols\":1,\"rows\":1}]}, \ +\ +{\"agent\":\"hash\",\"method\":\"NXT\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":100,\"rows\":1}]}, \ +{\"agent\":\"hash\",\"method\":\"curve25519\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"rmd160_sha256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"sha256_sha256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"base64_encode\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"base64_decode\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"crc32\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"sha512\",\"fields\":[{\"skip\":1,\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"sha384\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"sha256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"sha224\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"rmd320\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"rmd256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"rmd160\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"rmd128\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"sha1\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"md2\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"md4\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"md5\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"tiger\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"whirlpool\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_sha512\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_sha384\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_sha256\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_sha224\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_rmd320\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_rmd256\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_rmd160\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_rmd128\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_sha1\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_md2\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_md4\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_md5\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_tiger\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \ +{\"agent\":\"hash\",\"method\":\"hmac_whirlpool\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}\ +]" + +char *HTMLheader = +" \ + \ + \ + \ + \ +iguana \ + \ + \ +\ + \ +"; + +// Link + +char *HTMLfooter = +" \ +\ + \ + \ +\ + \ + \ + \ + \ + \ + \ + \ +\ + \ +"; + +#define HTML_EMIT(str) if ( (str) != 0 && (str)[0] != 0 ) strcpy(&retbuf[size],str), size += (int32_t)strlen(str) /* struct endpoint find_epbits(struct relay_info *list,uint32_t ipbits,uint16_t port,int32_t type) @@ -265,3 +398,339 @@ void SuperNET_init(struct supernet_info *myinfo,char *jsonstr) init_SUPERNET_pullsock(myinfo,10,10); }*/ +int32_t Supernet_lineparse(char *key,int32_t keymax,char *value,int32_t valuemax,char *src) +{ + int32_t a,b,c,n = 0; + key[0] = value[0] = 0; + while ( (c= src[n]) == ' ' || c == '\t' || c == '\n' || c == '\t' ) + n++; + while ( (c= src[n]) != ':' && c != 0 ) + { + *key++ = c; + if ( ++n >= keymax-1 ) + { + *key = 0; + printf("lineparse overflow key.(%s)\n",src); + return(-1); + } + } + *key = 0; + if ( src[n] != ':' ) + return(n); + n++; + while ( (c= src[n]) == ' ' || c == '\t' ) + n++; + while ( (c= src[n]) != 0 && c != '\r' && c != '\n' ) + { + if ( c == '%' && (a= src[n+1]) != 0 && (b= src[n+2]) != 0 ) + c = ((unhex(a) << 4) | unhex(b)), n += 2; + *value++ = c; + n++; + if ( n >= valuemax-1 ) + { + *value = 0; + printf("lineparse overflow.(%s)\n",src); + return(-1); + } + } + *value = 0; + if ( src[n] != 0 ) + { + n++; + while ( (c= src[n]) == '\r' || c == '\n' ) + n++; + } + return(n); +} + +cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr) +{ + int32_t i,n,totallen,datalen,len = 0; cJSON *json,*array; char key[8192],*data; + json = cJSON_CreateObject(); + array = cJSON_CreateArray(); + totallen = (int32_t)strlen(urlstr); + while ( 1 ) + { + for (i=len; urlstr[i]!=0; i++) + if ( urlstr[i] == '\r' || urlstr[i] == '\n' ) + break; + if ( i == len && (urlstr[len] == '\r' || urlstr[len] == '\n') ) + { + len++; + continue; + } + urlstr[i] = 0; + if ( (n= Supernet_lineparse(key,sizeof(key),value,bufsize,&urlstr[len])) > 0 ) + { + if ( value[0] != 0 ) + jaddstr(json,key,value); + else jaddistr(array,key); + len += (n + 1); + if ( strcmp(key,"Content-Length") == 0 && (datalen= atoi(value)) > 0 ) + { + data = &urlstr[totallen - datalen]; + data[-1] = 0; + //printf("post.(%s) (%c)\n",data,data[0]); + jaddstr(json,"POST",data); + } + } else break; + } + jadd(json,"lines",array); + return(json); +} + +char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsize,int32_t *postflagp,char *urlstr,char *remoteaddr) +{ + cJSON *tokens,*argjson,*json = 0; char urlmethod[16],*data,url[1024],*retstr,*token = 0; int32_t i,j,n; + //printf("rpcparse.(%s)\n",urlstr); + for (i=0; i 0 ) + { + jaddstr(argjson,"agent",jstri(tokens,0)); + if ( n > 1 ) + jaddstr(argjson,"method",jstri(tokens,1)); + for (i=2; i (%s) postflag.%d (%s)\n",urlstr,cJSON_Print(json),*postflagp,jprint(argjson,0)); + return(retstr); + } + return(clonestr("{\"error\":\"couldnt process packet\"}")); +} + +#ifdef notyet +int32_t iguana_htmlgen(char *retbuf,int32_t bufsize,char *result,char *error,cJSON *json,char *tabname,char *origjsonstr) +{ + char *url = "http://127.0.0.1:7778"; + int i,j,m,size = 0,n,rows,cols; cJSON *array,*obj,*array2,*item,*tmp; + char formheader[512],formfooter[512],clickname[512],buf[512],fieldbuf[512],fieldindex[2],postjson[8192]; + char *disp,*fieldname,*button,*agent,*method,*str; + bufsize--; + HTML_EMIT("

"); + sprintf(buf,"
"); + //sprintf(buf,"
COIN: "); + //HTML_EMIT(buf); + //HTML_EMIT(" Agent: "); HTML_EMIT(Default_agent); + + HTML_EMIT("

"); + HTML_EMIT(origjsonstr); HTML_EMIT(" -> "); + HTML_EMIT(""); + formheader[0] = formfooter[0] = 0; + if ( (array= jarray(&n,json,"forms")) != 0 ) + { + for (i=0; i function click_%s()\n{\n",clickname); + HTML_EMIT(buf); + sprintf(postjson,"%s/%s",agent,method); + //printf("form.%s button.%s [%s]\n",formname,button,postjson); + if ( (array2= jarray(&m,item,"fields")) != 0 ) + { + //sprintf(buf,"COIN = document.COIN_NAME.value;\n"); + //sprintf(postjson+strlen(postjson),"/%s/' + %s + '","coin","COIN"); + for (j=0; j (%s)\n",j,jprint(obj,0)); + sprintf(fieldindex,"%c",'A'+j); + if ( (fieldname= jstr(obj,"field")) != 0 ) + { + sprintf(buf,"%s = document.%s.%s.value;\n",fieldindex,clickname,fieldname); + HTML_EMIT(buf); + //sprintf(postjson+strlen(postjson),",\"%s\":\"' + %s + '\"",fieldname,fieldindex); + if ( juint(obj,"skip") == 0 ) + sprintf(postjson+strlen(postjson),"/%s/' + %s + '",fieldname,fieldindex); + else sprintf(postjson+strlen(postjson),"/' + %s + '",fieldindex); + } + } + //strcat(postjson,"}"); + sprintf(&retbuf[size],"location.href = '%s/%s';\n}\r\n",url,postjson), size += strlen(&retbuf[size]); + sprintf(formheader,"
",clickname,url); + HTML_EMIT(formheader); + disp = jstr(item,"disp"); + for (j=0; j",fieldname); + else sprintf(buf,"",cols,rows,fieldname,cols == 1 ? "hidden" : ""); + str = disp==0?jstr(obj,"disp"):disp; + sprintf(&retbuf[size],"\r\n",str!=0?str:fieldname,buf), size += strlen(&retbuf[size]); + } + sprintf(formfooter,"\n
%s %s
",button,clickname); + HTML_EMIT(formfooter); + } + } + } + HTML_EMIT("

"); HTML_EMIT(""); HTML_EMIT("

"); + return((int32_t)strlen(retbuf)); +} +#undef HTML_EMIT + +char *SuperNET_htmlresponse(char *retbuf,int32_t bufsize,int32_t *remainsp,int32_t localaccess,char *retstr,int32_t freeflag) +{ + static char *html = " %s "; + char *result=0,*error=0; int32_t n; cJSON *json,*formsjson; + retbuf[0] = 0; + /*if ( localaccess == 0 ) + sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Origin: *\r\n"); + else sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Origin: null\r\n"); + sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Credentials: true\r\n"); + sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Headers: Authorization, Content-Type\r\n"); + sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Methods: GET, POST\r\n"); + sprintf(retbuf+strlen(retbuf),"Cache-Control: no-cache, no-store, must-revalidate\r\n"); + sprintf(retbuf+strlen(retbuf),"Content-type: text/html\r\n"); + sprintf(retbuf+strlen(retbuf),"Content-Length: %8d\r\n\r\n",n);*/ + sprintf(retbuf+strlen(retbuf),"\n\r"); + n = (int32_t)strlen(retbuf); + formsjson = cJSON_Parse(IGUANA_FORMS); + if ( (json= cJSON_Parse(retstr)) == 0 ) + json = cJSON_CreateObject(); + jadd(json,"forms",formsjson); + error = jstr(json,"error"); + result = jstr(json,"result"); + //printf("process.(%s)\n",jprint(formsjson,0)); + n = iguana_htmlgen(&retbuf[n],bufsize-n,result,error,json,"iguana",Currentjsonstr); + free_json(json); + if ( n == 0 ) + { + n = (int32_t)(strlen(html) + strlen(retstr) + 1); + sprintf(retbuf+strlen(retbuf),html,retstr); + } + if ( freeflag != 0 ) + free(retstr); + if ( n > bufsize ) + { + printf("htmlresponse overflowed buffer[%d] with %d\n",bufsize,n); + exit(-1); + } + *remainsp = n; + return(retbuf); +} +#endif diff --git a/SuperNET/SuperNET.h b/SuperNET/SuperNET.h index c9e7efb55..7a3f7fd29 100644 --- a/SuperNET/SuperNET.h +++ b/SuperNET/SuperNET.h @@ -20,7 +20,7 @@ #include "../includes/cJSON.h" #include "../includes/nanomsg/nn.h" -#define SUPERNET_PORT 7774 +#define SUPERNET_PORT 7778 #define SUPERNET_NETWORKTIMEOUT 10000 #define SUPERNET_POLLTIMEOUT 1 #define SUPERNET_APIUSLEEP (SUPERNET_POLLTIMEOUT * 10000) @@ -83,6 +83,8 @@ struct endpoint calc_epbits(char *transport,uint32_t ipbits,uint16_t port,int32_ int32_t badass_servers(char servers[][MAX_SERVERNAME],int32_t max,int32_t port); int32_t crackfoo_servers(char servers[][MAX_SERVERNAME],int32_t max,int32_t port); void SuperNET_init(); +char *SuperNET_JSON(struct supernet_info *myinfo,cJSON *argjson,char *remoteaddr); +char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsize,int32_t *postflagp,char *urlstr,char *remoteaddr); extern int32_t PULLsock; extern struct relay_info RELAYS; diff --git a/SuperNET/m_osx b/SuperNET/m_osx index edf4f7b28..8ec8d6032 100755 --- a/SuperNET/m_osx +++ b/SuperNET/m_osx @@ -1 +1 @@ -gcc -o ../agents/SuperNET -O2 *.c ../agents/libcrypto777.a -lssl -lcrypto -lpthread -lm +gcc -o ../agents/SuperNET -O2 *.c ../agents/libcrypto777.a -lnanomsg -lssl -lcrypto -lpthread -lm diff --git a/SuperNET/m_unix b/SuperNET/m_unix index a2dff2084..8ec8d6032 100755 --- a/SuperNET/m_unix +++ b/SuperNET/m_unix @@ -1 +1 @@ -gcc -o ../agents/SuperNET -O2 *.c ../agents/libcrypto777.a -lssl -lcrypto -lpthread -lm +gcc -o ../agents/SuperNET -O2 *.c ../agents/libcrypto777.a -lnanomsg -lssl -lcrypto -lpthread -lm diff --git a/SuperNET/main.c b/SuperNET/main.c index 2d13dea5b..1ba57afe1 100644 --- a/SuperNET/main.c +++ b/SuperNET/main.c @@ -162,11 +162,6 @@ int32_t SuperNET_msgvalidate(struct supernet_msghdr *msg) return(msglen); } -char *SuperNET_JSON(struct supernet_info *myinfo,char *jsonstr) -{ - return(clonestr("{\"error\":\"SuperNET is just a stub for now\"}")); -} - int32_t nn_settimeouts(int32_t sock,int32_t sendtimeout,int32_t recvtimeout) { int32_t retrymillis,maxmillis; @@ -215,25 +210,10 @@ int32_t nn_createsocket(struct supernet_info *myinfo,char *endpoint,int32_t bind bits256 SuperNET_OPRETURN(struct supernet_info *myinfo,char *symbol,double fee,uint8_t *buf,int32_t len) { bits256 txid; + printf("send OPRETURN\n"); return(txid); } -/*int32_t SuperNET_OPRETURN(uint8_t *data,char *announce) -{ - static char *protocols[][2] = { {"pangea","GEA"}, {"peggy","PAX"} }; - int32_t i; - for (i=0; i= 0 ) + { + clilen = sizeof(cli_addr); + //printf("ACCEPT (%s:%d) on sock.%d\n","127.0.0.1",port,bindsock); + sock = accept(bindsock,(struct sockaddr *)&cli_addr,&clilen); + if ( sock < 0 ) + { + //printf("iguana_rpcloop ERROR on accept usock.%d\n",sock); + continue; + } + memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits)); + expand_ipbits(remoteaddr,ipbits); + memset(jsonbuf,0,sizeof(jsonbuf)); + remains = (int32_t)(sizeof(jsonbuf) - 1); + buf = jsonbuf; + recvlen = 0; + retstr = 0; + while ( remains > 0 ) + { + if ( (len= (int32_t)recv(sock,buf,remains,0)) < 0 ) + { + if ( errno == EAGAIN ) + { + printf("EAGAIN for len %d, remains.%d\n",len,remains); + usleep(10000); + } + break; + } + else + { + if ( len > 0 ) + { + remains -= len; + recvlen += len; + buf = &buf[len]; + retstr = SuperNET_rpcparse(myinfo,space,size,&postflag,jsonbuf,remoteaddr); + break; + } else usleep(10000); + } + } + if ( retstr != 0 ) + { + i = 0; + if ( postflag == 0 ) + { + //retstr = SuperNET_htmlresponse(space,size,&remains,1,retstr,1); + } + else remains = (int32_t)strlen(retstr); + printf("RETBUF.(%s)\n",retstr); + while ( remains > 0 ) + { + if ( (numsent= (int32_t)send(sock,&retstr[i],remains,MSG_NOSIGNAL)) < 0 ) + { + if ( errno != EAGAIN && errno != EWOULDBLOCK ) + { + //printf("%s: %s numsent.%d vs remains.%d len.%d errno.%d (%s) usock.%d\n",retstr,ipaddr,numsent,remains,recvlen,errno,strerror(errno),sock); + break; + } + } + else if ( remains > 0 ) + { + remains -= numsent; + i += numsent; + if ( remains > 0 ) + printf("iguana sent.%d remains.%d of len.%d\n",numsent,remains,recvlen); + } + } + if ( retstr != space ) + free(retstr); + } + //printf("done response sock.%d\n",sock); + closesocket(sock); + } +} + int32_t SuperNET_msgrecv(struct supernet_info *myinfo,struct supernet_agent *agent,uint8_t *_buf,int32_t maxlen) { int32_t len,recvlen; void *buf = _buf; struct supernet_msghdr H; @@ -647,7 +720,7 @@ void SuperNET_loop(struct supernet_info *myinfo) void SuperNET_main(void *arg) { - struct supernet_info MYINFO; cJSON *json,*array; uint16_t port; int32_t i,n = 0; + struct supernet_info MYINFO; int32_t i;//cJSON *json,*array; uint16_t port;,n = 0; memset(&MYINFO,0,sizeof(MYINFO)); if ( 1 ) { @@ -658,8 +731,8 @@ void SuperNET_main(void *arg) if ( MYINFO.POLLTIMEOUT == 0 ) MYINFO.POLLTIMEOUT = SUPERNET_POLLTIMEOUT; } - if ( arg == 0 || (json= cJSON_Parse(arg)) == 0 ) - SuperNET_acceptport(&MYINFO,MYINFO.port); + /*if ( arg == 0 || (json= cJSON_Parse(arg)) == 0 ) + SuperNET_acceptport(&MYINFO,MYINFO.acceptport); else { if ( (array= jarray(&n,json,"accept")) != 0 ) @@ -669,9 +742,9 @@ void SuperNET_main(void *arg) SuperNET_acceptport(&MYINFO,port); } free_json(json); - } - sleep(3); - printf("start SuperNET_loop on port.%u\n",MYINFO.port); + }*/ + printf("start SuperNET_loop on port.%u\n",SUPERNET_PORT); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)SuperNET_rpcloop,&MYINFO); for (i=0; i datenum + number of seconds + checkval = OS_conv_datenum(datenum,seconds/3600,(seconds/60)%60,seconds%60); // datenum+H:M:S -> unix time + if ( checkval != timestamp ) + printf("%s i.%lld timestamp.%-12llu -> (%d:%06d) -> checkval.%-12llu diff.[%lld]\n",tai_str(str,t),(long long)i,(long long)timestamp,datenum,seconds,(long long)checkval,(long long)(timestamp-checkval)); + } + printf("million tai compares in %.3f microseconds per encode/decode\n",1000. * (OS_milliseconds()-startmillis)/i); + } return 0; } #endif diff --git a/crypto777/ccgi.c b/crypto777/ccgi.c new file mode 100755 index 000000000..e42349033 --- /dev/null +++ b/crypto777/ccgi.c @@ -0,0 +1,1328 @@ +/* + * C CGI Library version 1.1 + * + * Author: Stephen C. Losen, University of Virginia + * + * Copyright 2009 Stephen C. Losen. Distributed under the terms + * of the GNU General Public License (GPL) + * + * C CGI is a C language library for parsing, decoding, storing and + * retrieving data passed from a web browser to a CGI program. C CGI + * supports URL encoded form data (application/x-www-form-urlencoded) + * and multipart (mutlipart/form-data), including file uploads. HTML + * cookies can also be stored and retrieved. + * + * The library builds one or more "variable lists" of type + * CGI_varlist. A list entry consists of a name (null terminated + * string) and one or more values (also null terminated strings) + * associated with the name. We allow multiple values because 1) + * some HTML form elements (such as checkboxes and selections) + * allow the form user to select multiple values and 2) different + * form elements may be given the same name. + * + * The library function CGI_lookup_all() searches a variable list for + * an entry with the specified name and returns the values in a + * null terminated array of pointers to null terminated strings. + * + * Variable list entries can be obtained iteratively with + * CGI_first_name(), CGI_next_name() and CGI_lookup_all(). + * + * For a file upload, the user provides a filename template that + * is passed to mkstemp() to create a new file to hold the data. + */ + +#include +#include +#include +#include +#include +#include +#include "../includes/ccgi.h" +#ifdef _WIN32 +#define mkstemp(name) _mktemp_s(name, sizeof(name)) +#endif + +/* CGI_val is an entry in a list of variable values */ + +typedef struct CGI_val CGI_val; + +struct CGI_val { + CGI_val *next; /* next entry on list */ + const char value[1]; /* variable value */ +}; + +/* + * CGI_varlist is an entry in a list of variables. The fields + * "iter" and "tail" are only used in the first list entry. + */ + +struct CGI_varlist { + CGI_varlist *next; /* next entry on list */ + CGI_varlist *tail; /* last entry on list */ + CGI_varlist *iter; /* list iteration pointer */ + int numvalue; /* number of values */ + CGI_val *value; /* linked list of values */ + CGI_val *valtail; /* last value on list */ + CGI_value *vector; /* array of values */ + const char varname[1]; /* variable name */ +}; + +/* strbuf is a string buffer of arbitrary size */ + +typedef struct { + int size; + char str[1]; +} +strbuf; + +/* mymalloc() is a malloc() wrapper that exits on failure */ + +static void * +mymalloc(int size) { + void *ret = malloc(size); + if (ret == 0) { + fputs("C CGI Library out of memory\n", stderr); + exit(1); + } + return ret; +} + +/* + * sb_get() creates or extends a strbuf + */ + +static strbuf * +sb_get(strbuf *sb, int len) { + int size; + for (size = 128; size < len; size += size) + ; + if (sb == 0) { + sb = (strbuf *) mymalloc(sizeof(*sb) + size); + } + else { + sb = (strbuf *) realloc(sb, sizeof(*sb) + size); + if (sb == 0) { + fputs("C CGI Library out of memory\n", stderr); + exit(1); + } + } + sb->size = size; + return sb; +} + +/* savechar() saves a character in a strbuf at index idx */ + +static strbuf * +savechar(strbuf *sb, int idx, int c) { + if (sb == 0 || idx >= sb->size) { + sb = sb_get(sb, idx + 1); + } + sb->str[idx] = c; + return sb; +} + +/* savestr() saves a string in a strbuf */ + +static strbuf * +savestr(strbuf *sb, const char *str) { + int len = (int)strlen(str); + if (sb == 0 || len >= sb->size) { + sb = sb_get(sb, len + 1); + } + strcpy(sb->str, str); + return sb; +} + +/* + * findvar() searches variable list "v" for an entry whose name + * is "varname" and returns a pointer to the entry or else null + * if not found. If varname is null then we return v->iter, + * which is the "current" variable entry. + */ + +static CGI_varlist * +findvar(CGI_varlist *v, const char *varname) { + if (varname == 0 && v != 0) { + return v->iter; + } + for (; v != 0; v = v->next) { + if (v->varname[0] == varname[0] && + strcmp(v->varname, varname) == 0) + { + break; + } + } + return v; +} + +/* + * hex() returns the numeric value of hexadecimal digit "digit" + * or returns -1 if "digit" is not a hexadecimal digit. + */ + +static int +hex(int digit) { + switch(digit) { + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return digit - '0'; + + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + return 10 + digit - 'A'; + + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + return 10 + digit - 'a'; + + default: + return -1; + } +} + +/* urlcount() returns the number of bytes needed to URL encode a string */ + +static int +urlcount(const char *p, const char *keep) { + int k; + for (k = 0; *p != 0; p++) { + if (isalnum((int32_t)*p) || *p == ' ' || + (keep != 0 && strchr(keep, *p) != 0)) + { + k++; + } + else { + k += 3; + } + } + return k; +} + +/* + * urlencode() URL encodes string "in" into string "out" and + * returns a pointer to the null byte at the end of "out" + */ + +static char * +urlencode(const char *in, char *out, const char *keep) { + const char hexdigit[] = "0123456789ABCDEF"; + + for (; *in != 0; in++) { + if (isalnum((int32_t)*in) || + (keep != 0 && strchr(keep, *in) != 0)) + { + *out++ = *in; + } + else if (*in == ' ') { + *out++ = '+'; + } + else { + *out++ = '%'; + *out++ = hexdigit[(*in >> 4) & 0xf]; + *out++ = hexdigit[*in & 0xf]; + } + } + *out = 0; + return out; +} + +/* scanspaces() scans over spaces and tabs in a string */ + +static char * +scanspaces(char *p) { + while (*p == ' ' || *p == '\t') { + p++; + } + return p; +} + +/* + * scanattr() scans for an attribute such as name="value" or + * name=value; saving the attribute name in attr[0] and saving + * the attribute value in attr[1]. If successful, we return a + * pointer to where the scan ended, otherwise we return null. + * The input string is modified. + */ + +static char * +scanattr(char *p, char *attr[2]) { + int quote = 0; + + attr[0] = p = scanspaces(p); + while (*p != '=' && *p != 0) { + p++; + } + if (*p != '=' || p == attr[0]) { + return 0; + } + *p++ = 0; + if (*p == '"' || *p == '\'' || *p == '`') { + quote = *p++; + } + attr[1] = p; + if (quote != 0) { + while(*p != quote && *p != 0) { + p++; + } + if (*p != quote) { + return 0; + } + *p++ = 0; + if (*p == ';') { + p++; + } + } + else { + while (*p != ';' && *p != ' ' && *p != '\t' && + *p != '\r' && *p != '\n' && *p != 0) + { + p++; + } + if (*p != 0) { + *p++ = 0; + } + } + return p; +} + +/* + * scanheader() scans a line of input for a header name followed by + * a colon and the header value, such as: + * + * Content-Disposition: form-data; + * + * We place the header name in header[0] and the value in header[1]. + * If successful we return a pointer to the character where the scan + * ended, otherwise we return null. The input string is modified. + */ + +static char * +scanheader(char *p, char *header[2]) { + if (isalnum((int32_t)*p) == 0) { + return 0; + } + header[0] = p; + while (*p != ':' && *p != 0) { + p++; + } + if (*p != ':') { + return 0; + } + *p++ = 0; + header[1] = p = scanspaces(p); + while (*p != ';' && *p != '\r' && *p != '\n' && *p != 0) { + p++; + } + if (*p != 0) { + *p++ = 0; + } + return p; +} + +/* + * readline() reads characters from open file "in" into strbuf "line". + * We stop reading when we encounter '\n' or end of file. We null + * terminate "line" and return it. We return null if we encounter + * end of file without reading any characters. + */ + +static strbuf * +readline(strbuf *line, FILE *in) { + int c, i = 0; + + while ((c = getc(in)) != EOF) { + line = savechar(line, i++, c); + if (c == '\n') { + break; + } + } + if (i == 0) { + if (line != 0) { + free(line); + } + return 0; + } + return savechar(line, i, 0); /* null terminate */ +} + +/* + * copyvalue() reads bytes from open file "in", which contains + * "multipart/form-data", delimited by "boundary". We read + * bytes until we encounter the boundary. If the flag "wantfile" + * is true then we write the bytes (minus the boundary) to open + * file pointer "out" (or discard the output if "out" is NULL). + * Otherwise we copy the bytes to "value". + */ + +static strbuf * +copyvalue(const char *boundary, FILE *in, const int wantfile, + strbuf *value, FILE *out) +{ + int c, i, k, matched; + + matched = k = 0; + + while ((c = getc(in)) != EOF) { + + /* + * If we partially match the boundary, then we copy the + * entire matching prefix to the output. We do not need to + * backtrack and look for shorter matching prefixes because + * they cannot exist. The boundary always begins with '\r' + * and never contains another '\r'. + */ + + if (matched > 0 && c != boundary[matched]) { + for (i = 0; i < matched; i++) { + if (wantfile == 0) { + value = savechar(value, k++, boundary[i]); + } + else if (out != 0) { + fputc(boundary[i], out); + } + } + matched = 0; + } + + /* check for full or partial boundary match */ + + if (c == boundary[matched]) { + if (boundary[++matched] == 0) { + break; /* full match */ + } + continue; /* partial match */ + } + + /* no match, so copy byte to output */ + + if (wantfile == 0) { + value = savechar(value, k++, c); + } + else if (out != 0) { + fputc(c, out); + } + } + if (wantfile == 0) { + return savechar(value, k, 0); + } + return 0; +} + +/* + * read_multipart() reads form data encoded as "multipart/form-data" + * and adds form field names and values to variable list "v" and + * returns "v". + * + * The input is split into parts delimited by a boundary string. + * Each part starts with this header: + * + * Content-Disposition: form-data; name="fieldname"; filename="filename" + * + * where "fieldname" is the name of the form field. The "filename=" + * attribute is only present when this part contains file data for + * a file upload. A "Content-type:" header line may also be present + * with a file upload. After the header lines comes a blank line + * followed by the field data (or file data) terminated by "\r\n--" + * followed by the boundary string. If the boundary string is + * followed by "--\r\n" then this is the last part. + */ + +static CGI_varlist * +read_multipart(CGI_varlist *v, const char *template) { + const char *ctype, *name, *filename; + char *p, *token[2], *boundary, *localname = 0; + strbuf *bbuf = 0, *nbuf = 0, *fbuf = 0; + strbuf *line = 0, *value = 0; + int len, fd; + FILE *out; + + /* + * get the boundary string from the environment and prepend + * "\r\n--" to it. + */ + + if ((ctype = getenv("CONTENT_TYPE")) == 0 || + strncasecmp(ctype, "multipart/form-data;", len = 20) != 0) + { + return v; + } + bbuf = savestr(bbuf, ctype + len); + if (scanattr(bbuf->str, token) == 0 || + strcasecmp(token[0], "boundary") != 0) + { + goto cleanup; + } + boundary = token[1] - 4; + memcpy(boundary, "\r\n--", 4); + + /* + * first line is the boundary string, but with "\r\n" + * at the end rather than the start. + */ + + len = (int)strlen(boundary) - 2; + if ((line = readline(line, stdin)) == 0 || + strncmp(line->str, boundary + 2, len) != 0 || + line->str[len] != '\r' || line->str[len + 1] != '\n') + { + goto cleanup; + } + + /* read all the parts */ + + for (;;) { + + /* Scan header lines for the Content-Disposition: header */ + + name = filename = 0; + while ((line = readline(line, stdin)) != 0 && + (p = scanheader(line->str, token)) != 0) + { + if (strcasecmp(token[0], "Content-Disposition") != 0 || + strcasecmp(token[1], "form-data") != 0) + { + continue; + } + + /* Content-Disposition: has field name and file name */ + + while ((p = scanattr(p, token)) != 0) { + if (name == 0 && + strcasecmp(token[0], "name") == 0) + { + nbuf = savestr(nbuf, token[1]); + name = nbuf->str; + } + else if (filename == 0 && + strcasecmp(token[0], "filename") == 0) + { + fbuf = savestr(fbuf, token[1]); + filename = fbuf->str; + } + } + } + + /* after the headers is a blank line (just "\r\n") */ + + if (line == 0 || name == 0 || + line->str[0] != '\r' || line->str[1] != '\n') + { + break; + } + + /* + * If filename is non null (file upload) then we read file data, + * otherwise we read field data. In either case the data + * consists of everything up to, but not including the boundary. + */ + + if (filename != 0) { + + /* copy file data to newly created file */ + + out = 0; + if (template != 0 && *filename != 0) { + if (localname == 0) { + localname = (char *) mymalloc((int)strlen(template) + 1); + } + strcpy(localname, template); + if ((fd = mkstemp(localname)) >= 0) { + out = fdopen(fd, "wb"); + } + } + copyvalue(boundary, stdin, 1, 0, out); + if (out != 0) { + fclose(out); + v = CGI_add_var(v, name, localname); + v = CGI_add_var(v, name, filename); + } + } + else { + value = copyvalue(boundary, stdin, 0, value, 0); + v = CGI_add_var(v, name, value->str); + } + + /* + * read the rest of the line after the boundary. If we + * get "--\r\n" then this is the last field. Otherwise + * we presumably get "\r\n" and we continue. + */ + + if ((line = readline(line, stdin)) != 0 && + line->str[0] == '-' && line->str[1] == '-' && + line->str[2] == '\r' && line->str[3] == '\n') + { + break; + } + } + +cleanup: + if (bbuf != 0) { + free(bbuf); + } + if (nbuf != 0) { + free(nbuf); + } + if (fbuf != 0) { + free(fbuf); + } + if (line != 0) { + free(line); + } + if (value != 0) { + free(value); + } + if (localname != 0) { + free(localname); + } + return v; +} + +/* + * EXPORTED FUNCTIONS + * + * CGI_decode_url() returns a new string which is a copy of the input + * string with '+' converted to ' ' and %xx converted to the character + * whose hex numeric value is xx. + */ + +char * +CGI_decode_url(const char *p) { + char *out; + int i, k, L, R; + + if (p == 0) { + return 0; + } + out = (char *) mymalloc((int)strlen(p) + 1); + for (i = k = 0; p[i] != 0; i++) { + switch(p[i]) { + + case '+': + out[k++] = ' '; + continue; + + case '%': + if ((L = hex(p[i + 1])) >= 0 && + (R = hex(p[i + 2])) >= 0) + { + out[k++] = (L << 4) + R; + i += 2; + continue; + } + break; + } + out[k++] = p[i]; + } + out[k] = 0; + return out; +} + +/* + * CGI_encode_url() URL encodes a string and returns the result + * in memory from malloc(). + */ + +char * +CGI_encode_url(const char *p, const char *keep) { + char *out; + + if (p == 0) { + return 0; + } + out = mymalloc(urlcount(p, keep) + 1); + urlencode(p, out, keep); + return out; +} + +/* + * CGI_encode_query() takes a variable arg list of strings + * and encodes them into a URL query string of the form + * name1=value1&name2=value2 ... where each name and value + * is URL encoded. + */ + +char * +CGI_encode_query(const char *keep, ...) { + char *out, *p; + va_list ap; + const char *name, *value; + int k; + + /* calculate the size of the output string */ + + va_start(ap, keep); + k = 0; + while ((value = va_arg(ap, const char *)) != 0) { + k += urlcount(value, keep) + 1; + } + va_end(ap); + if (k == 0) { + return 0; + } + p = out = mymalloc(k); + + /* url encode each name=value pair */ + + va_start(ap, keep); + while ((name = va_arg(ap, const char *)) != 0 && + (value = va_arg(ap, const char *)) != 0) + { + if (p != out) { + *p++ = '&'; + } + p = urlencode(name, p, keep); + *p++ = '='; + p = urlencode(value, p, keep); + } + va_end(ap); + *p = 0; + return out; +} + +/* + * CGI_encode_varlist() encodes a CGI_varlist into a query + * string of the form name1=value1&name2=value2 ... where + * each name and value is URL encoded. + */ + +char * +CGI_encode_varlist(CGI_varlist *vlist, const char *keep) { + char *out, *p; + CGI_varlist *v; + CGI_val *value; + int k = 0; + + /* calculate size of the output string */ + + for (v = vlist; v != 0; v = v->next) { + for (value = v->value; value != 0; value = value->next) { + k += 2 + urlcount(v->varname, keep) + + urlcount(value->value, keep); + } + } + if (k == 0) { + return 0; + } + p = out = mymalloc(k); + + /* URL encode each name=value pair */ + + for (v = vlist; v != 0; v = v->next) { + for (value = v->value; value != 0; value = value->next) { + if (p != out) { + *p++ = '&'; + } + p = urlencode(v->varname, p, keep); + *p++ = '='; + p = urlencode(value->value, p, keep); + } + } + *p = 0; + return out; +} + +/* + * CGI_add_var() adds a new variable name and value to variable list + * "v" and returns the resulting list. If "v" is null or if the + * variable name is not on the list, then we create a new entry. + * We add the value to the appropriate list entry. + */ + +CGI_varlist * +CGI_add_var(CGI_varlist *v, const char *varname, const char *value) { + CGI_val *val; + CGI_varlist *v2; + + if (varname == 0 || value == 0) { + return v; + } + + /* create a new value */ + + val = (CGI_val *) mymalloc(sizeof(*val) + (int)strlen(value)); + strcpy((char *) val->value, value); + val->next = 0; + + /* + * find the list entry or else create a new one. Add the + * new value. We use "tail" pointers to keep the lists + * in the same order as the input. + */ + + if ((v2 = findvar(v, varname)) == 0) { + v2 = (CGI_varlist *) mymalloc((int)sizeof(*v2) + (int)strlen(varname)); + strcpy((char *) v2->varname, varname); + v2->value = val; + v2->numvalue = 1; + v2->next = v2->iter = v2->tail = 0; + v2->vector = 0; + if (v == 0) { + v = v2; + } + else { + v->tail->next = v2; + } + v->tail = v2; + } + else { + v2->valtail->next = val; + v2->numvalue++; + } + v2->valtail = val; + if (v2->vector != 0) { + free((void *)v2->vector); + v2->vector = 0; + } + v->iter = 0; + return v; +} + +/* + * CGI_decode_query() adds all the names and values in query string + * "query" to variable list "v" (which may be null) and returns the + * resulting variable list. The query string has the form + * + * name1=value1&name2=value2&name3=value3 + * + * We convert '+' to ' ' and convert %xx to the character whose + * hex numeric value is xx. + */ + +CGI_varlist * +CGI_decode_query(CGI_varlist *v, const char *query) { + char *buf; + const char *name, *value; + int i, k, L, R, done; + + if (query == 0) { + return v; + } + buf = (char *) mymalloc((int)strlen(query) + 1); + name = value = 0; + for (i = k = done = 0; done == 0; i++) { + switch (query[i]) { + + case '=': + if (name != 0) { + break; /* treat extraneous '=' as data */ + } + if (name == 0 && k > 0) { + name = buf; + buf[k++] = 0; + value = buf + k; + } + continue; + + case 0: + done = 1; /* fall through */ + + case '&': + buf[k] = 0; + if (name == 0 && k > 0) { + name = buf; + value = buf + k; + } + if (name != 0) { + v = CGI_add_var(v, name, value); + } + k = 0; + name = value = 0; + continue; + + case '+': + buf[k++] = ' '; + continue; + + case '%': + if ((L = hex(query[i + 1])) >= 0 && + (R = hex(query[i + 2])) >= 0) + { + buf[k++] = (L << 4) + R; + i += 2; + continue; + } + break; /* treat extraneous '%' as data */ + } + buf[k++] = query[i]; + } + free(buf); + return v; +} + +/* + * CGI_get_cookie() adds all the cookie names and values from the + * environment variable HTTP_COOKIE to variable list "v" (which + * may be null) and returns the resulting variable list. + */ + +CGI_varlist * +CGI_get_cookie(CGI_varlist *v) { + const char *env; + char *buf, *p, *cookie[2]; + + if ((env = getenv("HTTP_COOKIE")) == 0) { + return v; + } + buf = (char *) mymalloc((int)strlen(env) + 1); + p = strcpy(buf, env); + while ((p = scanattr(p, cookie)) != 0) { + v = CGI_add_var(v, cookie[0], cookie[1]); + } + free(buf); + return v; +} + +/* + * CGI_get_query() adds all the field names and values from the + * environment variable QUERY_STRING to variable list "v" (which + * may be null) and returns the resulting variable list. + */ + +CGI_varlist * +CGI_get_query(CGI_varlist *v) { + return CGI_decode_query(v, getenv("QUERY_STRING")); +} + +/* + * CGI_get_post() reads field names and values from stdin and adds + * them to variable list "v" (which may be null) and returns the + * resulting variable list. We accept input encoded as + * "application/x-www-form-urlencoded" or as "multipart/form-data". + * In the case of a file upload, we write to a new file created + * with mkstemp() and "template". If the template is null or if + * mkstemp() fails then we silently discard the uploaded file data. + * The local name of the file (created by mkstemp()) and the remote + * name (as specified by the user) can be obtained with + * CGI_lookup_all(v, fieldname). + */ + +CGI_varlist * +CGI_get_post(CGI_varlist *v, const char *template) { + const char *env; + char *buf; + int len; + + if ((env = getenv("CONTENT_TYPE")) != 0 && + strcasecmp(env, "application/x-www-form-urlencoded") == 0 && + (env = getenv("CONTENT_LENGTH")) != 0 && + (len = atoi(env)) > 0) + { + buf = (char *) mymalloc(len + 1); + if (fread(buf, 1, len, stdin) == len) { + buf[len] = 0; + v = CGI_decode_query(v, buf); + } + free(buf); + } + else { + v = read_multipart(v, template); + } + return v; +} + +/* + * CGI_get_all() returns a variable list that contains a combination of the + * following: cookie names and values from HTTP_COOKIE, field names and + * values from QUERY_STRING, and POSTed field names and values from stdin. + * File uploads are handled using "template" (see CGI_get_post()) + */ + +CGI_varlist * +CGI_get_all(const char *template) { + CGI_varlist *v = 0; + + v = CGI_get_cookie(v); + v = CGI_get_query(v); + v = CGI_get_post(v, template); + return v; +} + +/* CGI_free_varlist() frees all memory used by variable list "v" */ + +void +CGI_free_varlist(CGI_varlist *v) { + CGI_val *val, *valnext; + + if (v != 0) { + if (v->vector != 0) { + free((void *)v->vector); + } + for (val = v->value; val != 0; val = valnext) { + valnext = val->next; + free(val); + } + CGI_free_varlist(v->next); + free(v); + } +} + + +/* + * CGI_lookup() searches variable list "v" for an entry named + * "varname" and returns null if not found. Otherwise we return the + * first value associated with "varname", which is a null terminated + * string. If varname is null then we return the first value of the + * "current entry", which was set using the iterating functions + * CGI_first_name() and CGI_next_name(). + */ + +const char * +CGI_lookup(CGI_varlist *v, const char *varname) { + return (v = findvar(v, varname)) == 0 ? 0 : v->value->value; +} + +/* + * CGI_lookup_all() searches variable list "v" for an entry named + * "varname" and returns null if not found. Otherwise we return + * a pointer to a null terminated array of string pointers (see + * CGI_value) where each string is a value of the variable. If + * varname is null then we return the values of the "current entry", + * which was set using the iterating functions CGI_first_name() and + * CGI_next_name(). + */ + +CGI_value * +CGI_lookup_all(CGI_varlist *v, const char *varname) { + CGI_val *val; + int i; + + if ((v = findvar(v, varname)) == 0) { + return 0; + } + if (v->vector == 0) { + v->vector = (CGI_value *) + mymalloc(sizeof(CGI_value) * (v->numvalue + 1)); + i = 0; + + /* to initialize v->vector we must cast away const */ + + for (val = v->value; val != 0 && i < v->numvalue; + val = val->next) + { + ((const char **)v->vector)[i++] = val->value; + } + ((const char **)v->vector)[i] = 0; + } + return v->vector; +} + +/* + * CGI_first_name() returns the name of the first entry in + * variable list "v", or null if "v" is null. + */ + +const char * +CGI_first_name(CGI_varlist *v) { + return v == 0 ? 0 : (v->iter = v)->varname; +} + +/* + * CGI_next_name() returns the name of the next entry in variable list + * "v" after the most recent call to CGI_first_name() or CGI_next_name(). + * We return null if there are no more entries + */ + +const char * +CGI_next_name(CGI_varlist *v) { + return v == 0 || v->iter == 0 || (v->iter = v->iter->next) == 0 ? + 0 : v->iter->varname; +} + +/* + * CGI_encode_entity() converts null terminated string "in" to + * HTML entity encoding where > become > and < become < + * and & becomes & etc., and returns the result. Allocates + * memory for the result with malloc(). + */ + +char * +CGI_encode_entity(const char *in) { + char *out, *p; + int i, k; + + if (in == 0) { + return 0; + } + for (i = k = 0; in[i] != 0; i++) { + switch(in[i]) { + + case '<': + case '>': + k += 4; + break; + case '&': + case '\'': + case '\r': + case '\n': + k += 5; + break; + case '"': + k += 6; + break; + default: + k++; + break; + } + } + out = p = mymalloc(k + 1); + + for (i = 0; in[i] != 0; i++) { + switch(in[i]) { + + case '<': + *p++ = '&'; + *p++ = 'l'; + *p++ = 't'; + *p++ = ';'; + break; + case '>': + *p++ = '&'; + *p++ = 'g'; + *p++ = 't'; + *p++ = ';'; + break; + case '&': + *p++ = '&'; + *p++ = 'a'; + *p++ = 'm'; + *p++ = 'p'; + *p++ = ';'; + break; + case '\'': + *p++ = '&'; + *p++ = '#'; + *p++ = '3'; + *p++ = '9'; + *p++ = ';'; + break; + case '\r': + *p++ = '&'; + *p++ = '#'; + *p++ = '1'; + *p++ = '3'; + *p++ = ';'; + break; + case '\n': + *p++ = '&'; + *p++ = '#'; + *p++ = '1'; + *p++ = '0'; + *p++ = ';'; + break; + case '"': + *p++ = '&'; + *p++ = 'q'; + *p++ = 'u'; + *p++ = 'o'; + *p++ = 't'; + *p++ = ';'; + break; + default: + *p++ = in[i]; + break; + } + } + *p = 0; + return out; +} + +/* base64 conversion */ + +static const char b64encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789+/"; + +#define BAD 100 + +static const unsigned char b64decode[] = { + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, 62, BAD, BAD, BAD, 63, + 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, BAD, BAD, BAD, BAD, BAD, BAD, + + BAD, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, BAD, BAD, BAD, BAD, BAD, + BAD, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, BAD, BAD, BAD, BAD, BAD, + + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD, + BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD +}; + +/* + * CGI_decode_base64() decodes null terminated base64 encoded string p + * and returns the result. We store the length of the result in + * *len and we write a null byte after the last byte of the result. + * We allocate memory for the result with malloc(); + */ + +void * +CGI_decode_base64(const char *p, int *len) { + const unsigned char *in = (const unsigned char *) p; + unsigned char *out; + int save = 0, nbits = 0, sixbits; + int i, k; + + if (p == 0) { + return 0; + } + out = mymalloc(3 + 3 * (int)strlen(p) / 4); + + /* every four base64 input characters becomes three output bytes */ + + for (i = k = 0; in[i] != 0; i++) { + if ((sixbits = b64decode[in[i]]) == BAD) { + continue; + } + save |= sixbits << (18 - nbits); /* 4 x 6 bits in */ + if ((nbits += 6) == 24) { + out[k++] = save >> 16; /* 3 x 8 bits out */ + out[k++] = save >> 8; + out[k++] = save; + nbits = 0; + save = 0; + } + } + + /* convert leftover bits */ + + for (i = 16; i >= 0 && nbits >= 8; i -= 8) { + out[k++] = save >> i; + nbits -= 8; + } + out[k] = 0; + if (len != 0) { + *len = k; + } + return out; +} + +/* + * CGI_encode_base64() base64 encodes bytes in array p of length len + * and returns the result, which is a null terminated base64 encoded + * string. We allocate memory for the result with malloc(). + */ + +char * +CGI_encode_base64(const void *p, int len) { + const unsigned char *in = p; + char *out; + int save = 0, nbits = 0; + int i, k = 0; + + if (in == 0 || len <= 0) { + return 0; + } + out = mymalloc(4 + 4 * len / 3); + + /* every three input bytes becomes 4 base64 output characters */ + + for (i = 0; i < len; i++) { + save |= in[i] << (16 - nbits); /* 3 x 8 bits in */ + if ((nbits += 8) == 24) { + out[k++] = b64encode[(save >> 18) & 077]; /* 4 x 6 bits out */ + out[k++] = b64encode[(save >> 12) & 077]; + out[k++] = b64encode[(save >> 6) & 077]; + out[k++] = b64encode[ save & 077]; + nbits = 0; + save = 0; + } + } + + /* convert leftover bits */ + + if (nbits > 0) { + for (i = 18; i >= 0; i -= 6) { + if (nbits > 0) { + out[k++] = b64encode[(save >> i) & 077]; + nbits -= 6; + } + else { + out[k++] = '='; + } + } + } + out[k] = 0; + return out; +} + +/* hex conversion */ + +/* + * CGI_decode_hex() decodes null terminated hex encoded string p + * and returns the result. We store the length of the result in + * *len and we write a null byte after the last byte of the result. + * We allocate memory for the result with malloc(); + */ + +void * +CGI_decode_hex(const char *p, int *len) { + unsigned char *out; + int i, k, n, L, R; + + if (p == 0 || ((n = (int)strlen(p)) & 1)) { + return 0; /* length of input must be even */ + } + out = mymalloc(n / 2 + 1); + for (i = k = 0; i < n; i += 2) { + if ((L = hex(p[i])) >= 0 && (R = hex(p[i + 1])) >= 0) { + out[k++] = (L << 4) + R; + } + else { + free(out); + return 0; + } + } + out[k] = 0; + if (len != 0) { + *len = k; + } + return out; +} + +/* + * CGI_encode_hex() hex encodes bytes in array p of length len + * and returns the result, which is a null terminated hex encoded + * string. We allocate memory for the result with malloc(). + */ + +char * +CGI_encode_hex(const void *p, int len) { + const unsigned char *in = p; + int i, k; + char *out; + const char hexdigit[] = "0123456789ABCDEF"; + + if (in == 0 || len <= 0) { + return 0; + } + out = mymalloc(len * 2 + 1); + for (i = k = 0; i < len; i++) { + out[k++] = hexdigit[in[i] >> 4]; + out[k++] = hexdigit[in[i] & 0xf]; + } + out[k] = 0; + return out; +} diff --git a/crypto777/crypto777.sources b/crypto777/crypto777.sources new file mode 100644 index 000000000..0b8882e8a --- /dev/null +++ b/crypto777/crypto777.sources @@ -0,0 +1,11 @@ +JPEG_SRCS := ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c \ + ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c \ + ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c \ + ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c \ + ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c \ + ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c \ + ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c \ + ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/jmemmgr.c ../crypto777/jpeg/jmemnobs.c + +CRYPTO777_SRCS := ../crypto777/ccgi.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/libgfshare.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) + diff --git a/crypto777/inet.c b/crypto777/inet.c index ff0b486a6..0ef873257 100755 --- a/crypto777/inet.c +++ b/crypto777/inet.c @@ -19,6 +19,7 @@ #ifndef crypto777_inet_h #define crypto777_inet_h #include "OS_portable.h" +#include #ifdef _WIN32 #include diff --git a/crypto777/m_win32 b/crypto777/m_win32 index 161160b46..6b5486e36 100755 --- a/crypto777/m_win32 +++ b/crypto777/m_win32 @@ -1,2 +1 @@ -echo do equivalent of: gcc -c -O2 *.c jpeg/*.c jpeg/win/*.c -echo do equivalent of: rm ../agents/libcrypto777.a; ar rcu ../agents/libcrypto777.a *.o +make -f mingw32 diff --git a/crypto777/mingw b/crypto777/mingw new file mode 100755 index 000000000..ec2e9bfd1 --- /dev/null +++ b/crypto777/mingw @@ -0,0 +1,6 @@ +include crypto777.sources + +all: + $(TOOL_DIR)/$(MINGW)-gcc -D __MINGW -c $(CRYPTO777_SRCS) + $(TOOL_DIR)/$(MINGW)-ar rcu *.o ../agents/libcrypto777.a + diff --git a/crypto777/mingw32 b/crypto777/mingw32 new file mode 100755 index 000000000..311cdb763 --- /dev/null +++ b/crypto777/mingw32 @@ -0,0 +1,2 @@ +include ../mingw.path +include mingw diff --git a/crypto777/mingw64 b/crypto777/mingw64 new file mode 100755 index 000000000..c2d0741ec --- /dev/null +++ b/crypto777/mingw64 @@ -0,0 +1,3 @@ +include ../mingw.path +include mingw + diff --git a/deprecated/obsolete.h b/deprecated/obsolete.h index 7e1d83b73..0fe41f05b 100644 --- a/deprecated/obsolete.h +++ b/deprecated/obsolete.h @@ -10184,5 +10184,840 @@ void iguana_dedicatedrecv(void *arg) } else retjsonstr = clonestr("{\"error\":\"cant parse generic JSON\"}"); return(retjsonstr); }*/ - + + char *iguana_remoteparser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json) + { + int32_t i,n,remains,numsent; char *jsonstr = 0,*retstr = 0; uint8_t hdr[128]; + if ( agent->sock < 0 ) + agent->sock = iguana_socket(0,agent->hostname,agent->port); + if ( agent->sock >= 0 ) + { + i = 0; + jsonstr = jprint(json,0); + n = (int32_t)strlen(jsonstr) + 1; + remains = n; + //printf("RETBUF.(%s)\n",retbuf); + while ( remains > 0 ) + { + if ( (numsent= (int32_t)send(agent->sock,&jsonstr[i],remains,MSG_NOSIGNAL)) < 0 ) + { + if ( errno != EAGAIN && errno != EWOULDBLOCK ) + { + printf("%s: %s numsent.%d vs remains.%d of %d errno.%d (%s) usock.%d\n",jsonstr,agent->name,numsent,remains,n,errno,strerror(errno),agent->sock); + break; + } + } + else if ( remains > 0 ) + { + remains -= numsent; + i += numsent; + if ( remains > 0 ) + printf("iguana sent.%d remains.%d of len.%d\n",numsent,remains,n); + } + } + if ( (n= (int32_t)recv(agent->sock,hdr,sizeof(hdr),0)) >= 0 ) + { + remains = (hdr[0] + ((int32_t)hdr[1] << 8) + ((int32_t)hdr[2] << 16)); + retstr = mycalloc('p',1,remains + 1); + i = 0; + while ( remains > 0 ) + { + if ( (n= (int32_t)recv(agent->sock,&retstr[i],remains,0)) < 0 ) + { + if ( errno == EAGAIN ) + { + printf("EAGAIN for len %d, remains.%d\n",n,remains); + usleep(10000); + } + break; + } + else + { + if ( n > 0 ) + { + remains -= n; + i += n; + } else usleep(10000); + } + } + } + free(jsonstr); + } + if ( retstr == 0 ) + retstr = clonestr("{\"error\":\"null return\"}"); + return(retstr); + } + + struct iguana_agent *Agents[16]; + + cJSON *iguana_agentinfojson(struct iguana_agent *agent) + { + cJSON *json= cJSON_CreateObject(); + jaddstr(json,"name",agent->name); + jadd(json,"methods",agent->methods); + if ( agent->port != 0 ) + jaddnum(json,"port",agent->port); + else jaddstr(json,"type","builtin"); + return(json); + } + + char *iguana_addagent(char *name,char *(*parsefunc)(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json),char *hostname,cJSON *methods,uint16_t port,char *pubkeystr,char *privkeystr) + { + int32_t i; struct iguana_agent *agent; char retbuf[8192]; + for (i=0; iname,name) == 0 ) + { + if ( pubkeystr != 0 && privkeystr != 0 && strlen(pubkeystr) == 64 && strlen(privkeystr) == 64 ) + { + decode_hex(agent->pubkey.bytes,sizeof(bits256),pubkeystr); + decode_hex(agent->privkey.bytes,sizeof(bits256),privkeystr); + } + if ( port != 0 && agent->port == 0 ) + { + if ( agent->sock >= 0 ) + close(agent->sock); + agent->port = port; + strcpy(agent->hostname,hostname); + agent->sock = iguana_socket(0,agent->hostname,port); + printf("set (%s) port.%d for %s -> sock.%d\n",hostname,port,agent->name,agent->sock); + } + if ( agent->port > 0 && agent->sock < 0 && agent->hostname[0] != 0 && (agent->sock= iguana_socket(0,agent->hostname,agent->port)) < 0 ) + return(clonestr("{\"result\":\"existing agent couldnt connect to remote agent\"}")); + else return(clonestr("{\"result\":\"agent already there\"}")); + } + } + for (i=0; iname,name,sizeof(agent->name)-1); + strncpy(agent->hostname,hostname,sizeof(agent->hostname)-1); + agent->methods = methods, agent->nummethods = cJSON_GetArraySize(methods); + agent->sock = -1; + agent->port = port; + agent->parsefunc = (void *)parsefunc; + if ( pubkeystr != 0 && privkeystr != 0 && strlen(pubkeystr) == 64 && strlen(privkeystr) == 64 ) + { + decode_hex(agent->pubkey.bytes,sizeof(bits256),pubkeystr); + decode_hex(agent->privkey.bytes,sizeof(bits256),privkeystr); + } + if ( port > 0 ) + { + if ( (agent->sock= iguana_socket(0,hostname,port)) < 0 ) + return(clonestr("{\"result\":\"agent added, but couldnt connect to remote agent\"}")); + } + sprintf(retbuf,"{\"result\":\"agent added\",\"name\"\"%s\",\"methods\":%s,\"hostname\":\"%s\",\"port\":%u,\"sock\":%d}",agent->name,jprint(agent->methods,0),agent->hostname,agent->port,agent->sock); + return(clonestr(retbuf)); + } + } + return(clonestr("{\"error\":\"no more agent slots available\"}")); + } + else if ( strcmp(method,"addagent") == 0 ) + { + char *hostname = "127.0.0.1",*name; uint16_t port; + if ( (name= jstr(json,"name")) != 0 && (methods= jarray(&n,json,"methods")) != 0 ) + { + if ( (port= juint(json,"port")) != 0 ) + { + if ( (hostname= jstr(json,"host")) == 0 ) + { + if ( (hostname= jstr(json,"ipaddr")) == 0 ) + hostname = "127.0.0.1"; + } + if ( hostname == 0 ) + return(clonestr("{\"error\":\"no host specified for remote agent\"}")); + } + else if ( strcmp(name,"pangea") != 0 && strcmp(name,"InstantDEX") != 0 && strcmp(name,"jumblr") != 0 ) + return(clonestr("{\"error\":\"no port specified for remote agent\"}")); + return(iguana_addagent(name,iguana_remoteparser,hostname,methods,port,jstr(json,"pubkey"),jstr(json,"privkey"))); + } else return(clonestr("{\"error\":\"cant addagent without name and methods\"}")); + } + if ( (retstr= iguana_addagent("ramchain",ramchain_parser,"127.0.0.1",cJSON_Parse("[\"block\", \"tx\", \"txs\", \"rawtx\", \"balance\", \"totalreceived\", \"totalsent\", \"utxo\", \"status\"]"),0,0,0)) != 0 ) + printf("%s\n",retstr), free(retstr); + + + /*void iguana_issuejsonstrM(void *arg) + { + cJSON *json; int32_t fd; char *retjsonstr,*jsonstr = arg; + retjsonstr = iguana_JSON(jsonstr); + if ( (json= cJSON_Parse(jsonstr)) != 0 ) + { + if ( (fd= juint(json,"retdest")) > 0 ) + { + send(fd,jsonstr,(int32_t)strlen(jsonstr)+1,MSG_NOSIGNAL); + } + free_json(json); + return; + } + printf("%s\n",retjsonstr); + free(retjsonstr);//,strlen(retjsonstr)+1); + free(jsonstr);//,strlen(jsonstr)+1); + }*/ + + int32_t iguana_rpctestvector(struct iguana_info *coin,char *checkstr,char *jsonstr,int32_t maxlen,int32_t testi) + { + int32_t len,checklen; + sprintf(jsonstr,"{\"rpc.%s testvector.%d\"}",coin->symbol,testi); + sprintf(checkstr,"{\"rpc.%s testvector.%d checkstr should have all info needed to verify the rpc request\"}",coin->symbol,testi); + len = (int32_t)strlen(jsonstr); + checklen = (int32_t)strlen(checkstr); + if ( len > maxlen || checklen > maxlen ) + printf("iguana_rpctestvector: i was bad and overflowed buffer len.%d checklen.%d\n",len,checklen), exit(-1); + if ( checklen > len ) + len = checklen; + return(len); + } + + int32_t iguana_rpctestcheck(struct iguana_info *coin,char *jsonstr,char *retjsonstr) + { + if ( (rand() % 100) == 0 ) // 1% failure rate + return(-1); + else return(0); + } + + int32_t iguana_rpctest(struct iguana_info *coin) + { + /* static int32_t testi,good,bad; + char *retjsonstr,jsonstr[4096],checkstr[sizeof(jsonstr)]; // should be big enough + //if ( (rand() % 1000) < 999 ) // if no test active, just return 0 + return(0); + if ( iguana_rpctestvector(coin,checkstr,jsonstr,sizeof(jsonstr),testi++) > 0 ) + { + retjsonstr = iguana_rpc(coin,jsonstr); + if ( iguana_rpctestcheck(coin,jsonstr,retjsonstr) < 0 ) + bad++, printf("rpctestcheck.%s error: (%s) -> (%s) | good.%d bad.%d %.2f%%\n",coin->symbol,jsonstr,retjsonstr,good,bad,100.*(double)good/(good+bad)); + else good++; + free(retjsonstr); + return(1); // indicates was active + }*/ + return(0); + } + + char *iguana_agentjson(char *name,struct iguana_info *coin,char *method,cJSON *json,char *remoteaddr) + { + cJSON *retjson = 0,*array,*methods,*obj; int32_t i,n,j; struct iguana_agent *agent; + if ( strcmp(name,"SuperNET") != 0 ) + { + for (i=0; iname,name) == 0 ) + { + if ( agent->parsefunc != 0 ) + { + for (j=0; jnummethods; j++) + { + if ( (obj= jitem(agent->methods,j)) != 0 ) + { + if ( strcmp(method,jstr(obj,0)) == 0 ) + return((*agent->parsefunc)(agent,method,json,remoteaddr)); + } + } + return(clonestr("{\"result\":\"agent doesnt have method\"}")); + } else return(clonestr("{\"result\":\"agent doesnt have parsefunc\"}")); + } + } + } + else if ( remoteaddr == 0 || strcmp(remoteaddr,"127.0.0.1") != 0 ) // public api + { + char *coinstr; int32_t j,k,l,r,rr; struct iguana_peer *addr; + array = 0; + if ( strcmp(method,"getpeers") == 0 ) + { + if ( (coinstr= jstr(json,"coin")) != 0 ) + { + if ( (array= iguana_peersjson(iguana_coinfind(coinstr),1)) == 0 ) + return(clonestr("{\"error\":\"coin not found\"}")); + } + else + { + n = 0; + array = cJSON_CreateArray(); + r = rand(); + for (i=0; ipeers.active[l]; + if ( addr->usock >= 0 && addr->supernet != 0 ) + { + jaddistr(array,addr->ipaddr); + if ( ++n >= 64 ) + break; + } + } + } + } + } + if ( array != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"agent","SuperNET"); + jaddstr(retjson,"method","mypeers"); + jaddstr(retjson,"result","peers found"); + jadd(retjson,"peers",array); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"no peers found\"}")); + } + else if ( strcmp(method,"mypeers") == 0 ) + { + printf("mypeers from %s\n",remoteaddr!=0?remoteaddr:"local"); + } + } + else // local api + { + if ( strcmp(method,"list") == 0 ) + { + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + for (i=0; isymbol[0] != 0 ) + jaddistr(array,Coins[i]->symbol); + } + jadd(retjson,"coins",array); + array = cJSON_CreateArray(); + for (i=0; iname[0] != 0 ) + jaddi(array,iguana_agentinfojson(Agents[i])); + } + jadd(retjson,"agents",array); + return(jprint(retjson,1)); + } + else if ( strcmp(method,"peers") == 0 ) + { + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + for (i=0; isymbol[0] != 0 ) + jaddi(array,iguana_peersjson(Coins[i],0)); + } + jadd(retjson,"allpeers",array); + return(jprint(retjson,1)); + } + } + return(clonestr("{\"result\":\"stub processed generic json\"}")); + } + + char *iguana_jsonstr(struct iguana_info *coin,char *jsonstr,char *remoteaddr) + { + cJSON *json; char *retjsonstr,*methodstr,*agentstr; + //printf("iguana_jsonstr.(%s)\n",jsonstr); + if ( (json= cJSON_Parse(jsonstr)) != 0 ) + { + if ( (methodstr= jstr(json,"method")) != 0 ) + { + if ( (agentstr= jstr(json,"agent")) == 0 || strcmp(agentstr,"iguana") == 0 ) + retjsonstr = iguana_coinjson(coin,methodstr,json); + else retjsonstr = iguana_agentjson(agentstr,coin,methodstr,json,remoteaddr); + } else retjsonstr = clonestr("{\"error\":\"no method in JSON\"}"); + free_json(json); + } else retjsonstr = clonestr("{\"error\":\"cant parse JSON\"}"); + printf("iguana_jsonstr.(%s)\n",retjsonstr); + return(retjsonstr); + } + char *iguana_htmlget(char *space,int32_t max,int32_t *jsonflagp,char *path,char *remoteaddr,int32_t localaccess) + { + char *iguana_coinjson(struct iguana_info *coin,char *method,cJSON *json); + struct iguana_info *coin = 0; cJSON *json; bits256 hash2; int32_t height,i; + char buf[64],jsonstr[1024],coinstr[64],*retstr; + for (i=0; path[i]!=0; i++) + if ( path[i] == ' ' ) + break; + path[i] = 0; + if ( path[strlen(path)-1] == '/' ) + path[strlen(path)-1] = 0; + if ( strncmp(path,"/api",strlen("/api")) == 0 ) + { + *jsonflagp = 1; + path += strlen("/api"); + } else *jsonflagp = 0; + iguana_coinset(coinstr,path); + if ( coinstr[0] != 0 ) + coin = iguana_coinfind(coinstr); + else coin = 0; + if ( strncmp(path,"/bitmap",strlen("/bitmap")) == 0 ) + { + path += strlen("/bitmap"); + *jsonflagp = 2; + iguana_bitmap(space,max,path); + return(space); + } + //printf("GETCHECK.(%s)\n",path); + if ( strncmp(path,"/ramchain/",strlen("/ramchain/")) == 0 ) + { + path += strlen("/ramchain/"); + if ( strncmp(path,"block/",strlen("block/")) == 0 ) + { + path += strlen("block/"); + if ( strncmp(path,"height/",strlen("height/")) == 0 ) + { + height = atoi(path + strlen("height/")); + sprintf(Currentjsonstr,"{\"agent\":\"ramchain\",\"method\":\"block\",\"coin\":\"%s\",\"height\":%d,\"txids\":1}",coinstr,height); + return(iguana_ramchain_glue(coin,"block",Currentjsonstr)); + } + else if ( strncmp(path,"hash/",strlen("hash/")) == 0 ) + { + decode_hex(hash2.bytes,sizeof(hash2),path + strlen("hash/")); + char str[65]; printf("ramchain blockhash.%s\n",bits256_str(str,hash2)); + sprintf(Currentjsonstr,"{\"agent\":\"ramchain\",\"method\":\"block\",\"coin\":\"%s\",\"hash\":\"%s\",\"txids\":1}",coinstr,str); + return(iguana_ramchain_glue(coin,"block",Currentjsonstr)); + } + } + else if ( strncmp(path,"txid/",strlen("txid/")) == 0 ) + { + decode_hex(hash2.bytes,sizeof(hash2),path + strlen("txid/")); + char str[65]; bits256_str(str,hash2); + sprintf(Currentjsonstr,"{\"agent\":\"ramchain\",\"method\":\"tx\",\"coin\":\"%s\",\"txid\":\"%s\"}",coinstr,str); + return(iguana_ramchain_glue(coin,"tx",Currentjsonstr)); + } + else if ( strncmp(path,"explore/",strlen("explore/")) == 0 ) + { + path += strlen("explore/"); + if ( coin != 0 ) + { + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"explore\",\"coin\":\"%s\",\"search\":\"%s\"}",coinstr,path); + } else sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"explore\",\"search\":\"%s\"}",path); + return(iguana_ramchain_glue(coin,"explore",Currentjsonstr)); + } + else if ( strncmp(path,"bundleinfo/",strlen("bundleinfo/")) == 0 ) + { + path += strlen("bundleinfo/"); + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"bundleinfo\",\"coin\":\"%s\",\"height\":%d}",coinstr,atoi(path)); + + } + else + { + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"%s\",\"coin\":\"%s\"}",path,coinstr); + return(iguana_ramchain_glue(coin,path,Currentjsonstr)); + } + } + else if ( strncmp(path,"/hash/",strlen("/hash/")) == 0 ) + { + path += strlen("/hash/"); + return(iguana_hashparse(path)); + } + else if ( strncmp(path,"/iguana/",strlen("/iguana/")) == 0 ) + { + strcpy(Currentjsonstr,path); + path += strlen("/iguana/"); + if ( strncmp(path,"setagent/",strlen("setagent/")) == 0 ) + { + path += strlen("setagent/"); + if ( strncmp(path,"ramchain",strlen("ramchain")) == 0 || strncmp(path,"iguana",strlen("iguana")) == 0 || strncmp(path,"InstantDEX",strlen("InstantDEX")) == 0 || strncmp(path,"pangea",strlen("pangea")) == 0 || strncmp(path,"PAX",strlen("PAX")) == 0 || strncmp(path,"ALL",strlen("ALL")) == 0 || strncmp(path,"jumblr",strlen("jumblr")) == 0 ) + { + if ( strncmp(Default_agent,path,strlen(path)) == 0 ) + { + strcpy(Default_agent,"ALL"); + return(clonestr("{\"result\":\"ALL agents selected\"}")); + } + strcpy(Default_agent,path); + if ( Default_agent[strlen(Default_agent)-1] == '/' ) + Default_agent[strlen(Default_agent)-1] = 0; + sprintf(buf,"{\"result\":\"agent selected\",\"name\":\"%s\"}",path); + return(clonestr(buf)); + } + return(clonestr("{\"error\":\"invalid agent specified\"}")); + } + else + { + if ( strncmp(path,"peers/",strlen("peers/")) == 0 ) + { + path += strlen("peers/"); + if ( coin != 0 ) + { + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"peers\",\"coin\":\"%s\"}",coinstr); + } else sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"peers\"}"); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"peers",json); + free_json(json); + return(retstr); + } + else if ( coin != 0 ) + { + if ( strncmp(path,"addnode/",strlen("addnode/")) == 0 ) + { + path += strlen("addnode/"); + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"addnode\",\"coin\":\"%s\",\"ipaddr\":\"%s\"}",coinstr,path); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"addnode",json); + free_json(json); + return(retstr); + } + else if ( strncmp(path,"nodestatus/",strlen("nodestatus/")) == 0 ) + { + path += strlen("nodestatus/"); + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"nodestatus\",\"coin\":\"%s\",\"ipaddr\":\"%s\"}",coinstr,path); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"nodestatus",json); + free_json(json); + return(retstr); + } + else if ( strncmp(path,"addcoin",strlen("addcoin")) == 0 ) + { + path += strlen("addcoin"); + iguana_coinset(buf,path); + if ( (coin= iguana_coinadd(buf)) != 0 ) + { + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"addcoin\",\"coin\":\"%s\"}",buf); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"addcoin",json); + free_json(json); + } + else retstr = clonestr("{\"error\":\"cant create coin\"}"); + return(retstr); + } + else if ( strncmp(path,"startcoin",strlen("startcoin")) == 0 ) + { + path += strlen("startcoin"); + iguana_coinset(buf,path); + if ( (coin= iguana_coinfind(buf)) != 0 ) + { + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"startcoin\",\"coin\":\"%s\"}",buf); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"startcoin",json); + free_json(json); + } + else retstr = clonestr("{\"error\":\"cant create coin\"}"); + return(retstr); + } + else if ( strncmp(path,"pausecoin",strlen("pausecoin")) == 0 ) + { + path += strlen("pausecoin"); + iguana_coinset(buf,path); + if ( (coin= iguana_coinfind(buf)) != 0 ) + { + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"coin\":\"%s\"}",buf); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"pausecoin",json); + free_json(json); + } + else retstr = clonestr("{\"error\":\"cant create coin\"}"); + return(retstr); + } + else if ( strncmp(path,"maxpeers/",strlen("maxpeers/")) == 0 ) + { + path += strlen("maxpeers/"); + sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"maxpeers\",\"coin\":\"%s\",\"max\":%d}",coinstr,atoi(path)); + json = cJSON_Parse(Currentjsonstr); + retstr = iguana_coinjson(coin,"maxpeers",json); + free_json(json); + return(retstr); + } + return(clonestr("{\"result\":\"iguana method not found\"}")); + } + return(clonestr("{\"result\":\"iguana method needs coin\"}")); + } + } + else if ( strncmp(path,"/InstantDEX/",strlen("/InstantDEX/")) == 0 ) + { + double price,volume; char base[16],rel[16],exchange[16]; + path += strlen("/InstantDEX/"); + jsonstr[0] = 0; + if ( strncmp(path,"placebid/",strlen("placebid/")) == 0 ) + { + path += strlen("placebid/"); + if ( iguana_InstantDEX(jsonstr,path,"placebid") == 0 ) + return(clonestr("{\"error\":\"error with placebid parameters\"}")); + } + else if ( strncmp(path,"placeask/",strlen("placeask/")) == 0 ) + { + path += strlen("placeask/"); + if ( iguana_InstantDEX(jsonstr,path,"placeask") == 0 ) + return(clonestr("{\"error\":\"error with placeask parameters\"}")); + } + else if ( strncmp(path,"orderbook/",strlen("orderbook/")) == 0 ) + { + path += strlen("orderbook/"); + iguana_parsebidask(base,rel,exchange,&price,&volume,path); + if ( exchange[0] == 0 ) + strcpy(exchange,"active"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"base\":\"%s\",\"rel\":\"%s\",\"exchange\":\"%s\",\"allfields\":1}",base,rel,exchange); + } + else if ( strncmp(path,"orderstatus/",strlen("orderstatus/")) == 0 ) + { + path += strlen("orderstatus/"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"orderid\":\"%s\"}",path); + } + else if ( strncmp(path,"cancelorder/",strlen("cancelorder/")) == 0 ) + { + path += strlen("cancelorder/"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"orderid\":\"%s\"}",path); + } + else if ( strncmp(path,"balance/",strlen("balance/")) == 0 ) + { + path += strlen("balance/"); + iguana_parsebidask(base,rel,exchange,&price,&volume,path); + if ( path[0] != ' ' && path[0] != '/' ) + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"%s\"}",path); + else sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"balance\"}"); + } + else if ( strncmp(path,"openorders",strlen("openorders")) == 0 ) + { + path += strlen("openorders"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"openorders\"}"); + } + else if ( strncmp(path,"tradehistory",strlen("tradehistory")) == 0 ) + { + path += strlen("tradehistory"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\"}"); + } + else if ( strncmp(path,"allorderbooks",strlen("allorderbooks")) == 0 ) + { + path += strlen("allorderbooks"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"allorderbooks\"}"); + } + else if ( strncmp(path,"allexchanges",strlen("allexchanges")) == 0 ) + { + path += strlen("allexchanges"); + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"allexchanges\"}"); + } + if ( jsonstr[0] != 0 ) + { + strcpy(Currentjsonstr,jsonstr); + return(clonestr(jsonstr)); + //return(InstantDEX(jsonstr,remoteaddr,localaccess)); + } + return(clonestr("{\"error\":\"unrecognized InstantDEX API call\"}")); + } + else if ( strncmp(path,"/pangea/",strlen("/pangea/")) == 0 ) + { + path += strlen("/pangea/"); + } + else if ( strncmp(path,"/jumblr/",strlen("/jumblr/")) == 0 ) + { + path += strlen("/jumblr/"); + } + else printf("no match to (%s)\n",path); + return(0); + } + + char *iguana_rpcparse(char *retbuf,int32_t bufsize,int32_t *postflagp,char *jsonstr) + { + cJSON *json = 0; int32_t i,n,localaccess,datalen,postflag = 0; + char *key,*reststr,*str,*retstr,remoteaddr[65],porturl[65],*data = 0,*value,*agent = "SuperNET"; + //printf("rpcparse.(%s)\n",jsonstr); + localaccess = 1; + if ( (str= strstr("Referer: ",jsonstr)) != 0 ) + { + for (i=0; str[i]!=' '&&str[i]!=0&&str[i]!='\n'&&str[i]!='\r'; i++) + remoteaddr[i] = str[i]; + remoteaddr[i] = 0; + } else strcpy(remoteaddr,"127.0.0.1"); // need to verify this + *postflagp = 0; + if ( strncmp("POST",jsonstr,4) == 0 ) + jsonstr += 6, *postflagp = postflag = 1; + else if ( strncmp("GET",jsonstr,3) == 0 ) + { + jsonstr += 4; + str = 0; + sprintf(porturl,"Referer: http://127.0.0.1:%u",IGUANA_RPCPORT); + if ( (str= iguana_htmlget(retbuf,bufsize,postflagp,jsonstr,remoteaddr,localaccess)) == 0 && (reststr= strstr(jsonstr,porturl)) != 0 ) + { + reststr += strlen(porturl); + str = iguana_htmlget(retbuf,bufsize,postflagp,reststr,remoteaddr,localaccess); + } + if ( str != 0 ) + { + if ( *postflagp == 0 ) + { + json = cJSON_CreateObject(); + jaddstr(json,"result",str); + if ( str != retbuf ) + free(str); + str = cJSON_Print(json); + free_json(json); + } + return(str); + } + jsonstr++; + } + else return(0); + n = (int32_t)strlen(jsonstr); + for (i=0; i 0 ) + { + jsonstr[i] = 0; + agent = jsonstr; + jsonstr += i; + } + jsonstr++; + json = cJSON_CreateObject(); + jaddstr(json,"agent",agent); + while ( 1 ) + { + n = (int32_t)strlen(jsonstr); + key = jsonstr; + value = 0; + for (i=0; i 0. && volume > 0. ) + { + sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"%s\",\"base\":\"%s\",\"rel\":\"%s\",\"exchange\":\"%s\",\"price\":\%0.8f,\"volume\":%0.8f}",method,base,rel,exchange,price,volume); + return(jsonstr); + } + else return(0); + } + return(0); + } + + void iguana_coinset(char *buf,char *path) + { + int32_t i; + if ( path[0] == '/' ) + path++; + for (i=0; i<8&&path[i]!=0&&path[i]!=' '&&path[i]!='/'; i++) + buf[i] = path[i]; + buf[i] = 0; + touppercase(buf); + } + + char *iguana_ramchain_glue(struct iguana_info *coin,char *method,char *jsonstr) + { + cJSON *json; char *retstr; + json = cJSON_Parse(jsonstr); + retstr = ramchain_parser(0,method,json); + free_json(json); + return(retstr); + } #endif diff --git a/iguana/Makefile b/iguana/Makefile index 53acc4163..518be082b 100644 --- a/iguana/Makefile +++ b/iguana/Makefile @@ -10,14 +10,11 @@ VALID_TOOLCHAINS := pnacl newlib glibc clang-newlib mac NACL_SDK_ROOT ?= $(abspath $(CURDIR)) TARGET = iguana -TARGETI = InstantDEX -TARGETP = pangea -TARGETX = PAX EXTRA= -D__PNACL include $(NACL_SDK_ROOT)/tools/common.mk - +include iguana.sources CHROME_ARGS += --allow-nacl-socket-api=127.0.0.1 DEPS = nacl_io @@ -26,14 +23,6 @@ LIBS = crypto777 curl ssl crypto z glibc-compat nacl_spawn ppapi nacl_io ppapi_ CFLAGS = -Wall -D__PNACL -fno-strict-aliasing $(EXTRA) LFLAGS = libs -SOURCES = main.c iguana777.c iguana_wallet.c iguana_init.c iguana_json.c iguana_recv.c iguana_chains.c iguana_ramchain.c iguana_bitmap.c iguana_rpc.c iguana_bundles.c iguana_pubkeys.c iguana_msg.c iguana_html.c iguana_blocks.c iguana_peers.c - -SOURCESI = InstantDEX/main.c InstantDEX/InstantDEX_main.c InstantDEX/prices777.c - -SOURCESP = pangea/main.c pangea/cards777.c pangea/pangea777.c pangea/pangeafunds.c pangea/poker.c pangea/tourney777.c - -SOURCESX = peggy/main.c peggy/peggy777.c peggy/peggytx.c peggy/txidind777.c peggy/opreturn777.c quotes777.c - # Build rules generated by macros from common.mk: $(foreach dep,$(DEPS),$(eval $(call DEPEND_RULE,$(dep)))) diff --git a/iguana/SuperNET.c b/iguana/SuperNET.c new file mode 100644 index 000000000..ded022edf --- /dev/null +++ b/iguana/SuperNET.c @@ -0,0 +1,507 @@ +/****************************************************************************** + * Copyright © 2014-2015 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#include "../crypto777/OS_portable.h" +#include "SuperNET.h" + +void SuperNET_rpcloop(void *args) +{ + struct supernet_info *myinfo = args; + int32_t recvlen,bindsock,postflag,sock,remains,jsonflag,numsent,len; socklen_t clilen; + char remoteaddr[64],jsonbuf[8192],*buf,*retstr,*space;//,*retbuf; ,n,i,m + struct sockaddr_in cli_addr; uint32_t ipbits,i; uint16_t port; + int32_t size = 1024 * 1024 * 2; + port = SUPERNET_PORT; + bindsock = iguana_socket(1,"127.0.0.1",port); + printf("SuperNET_rpcloop 127.0.0.1:%d bind sock.%d\n",port,bindsock); + space = calloc(1,size); + while ( bindsock >= 0 ) + { + clilen = sizeof(cli_addr); + //printf("ACCEPT (%s:%d) on sock.%d\n","127.0.0.1",port,bindsock); + sock = accept(bindsock,(struct sockaddr *)&cli_addr,&clilen); + if ( sock < 0 ) + { + //printf("iguana_rpcloop ERROR on accept usock.%d\n",sock); + continue; + } + memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits)); + expand_ipbits(remoteaddr,ipbits); + memset(jsonbuf,0,sizeof(jsonbuf)); + remains = (int32_t)(sizeof(jsonbuf) - 1); + buf = jsonbuf; + recvlen = 0; + retstr = 0; + while ( remains > 0 ) + { + if ( (len= (int32_t)recv(sock,buf,remains,0)) < 0 ) + { + if ( errno == EAGAIN ) + { + printf("EAGAIN for len %d, remains.%d\n",len,remains); + usleep(10000); + } + break; + } + else + { + if ( len > 0 ) + { + remains -= len; + recvlen += len; + buf = &buf[len]; + retstr = SuperNET_rpcparse(myinfo,space,size,&jsonflag,&postflag,jsonbuf,remoteaddr); + break; + } else usleep(10000); + } + } + if ( retstr != 0 ) + { + i = 0; + if ( postflag == 0 && jsonflag == 0 ) + retstr = SuperNET_htmlresponse(space,size,&remains,1,retstr,1); + else remains = (int32_t)strlen(retstr); + printf("RETBUF.(%s)\n",retstr); + while ( remains > 0 ) + { + if ( (numsent= (int32_t)send(sock,&retstr[i],remains,MSG_NOSIGNAL)) < 0 ) + { + if ( errno != EAGAIN && errno != EWOULDBLOCK ) + { + //printf("%s: %s numsent.%d vs remains.%d len.%d errno.%d (%s) usock.%d\n",retstr,ipaddr,numsent,remains,recvlen,errno,strerror(errno),sock); + break; + } + } + else if ( remains > 0 ) + { + remains -= numsent; + i += numsent; + if ( remains > 0 ) + printf("iguana sent.%d remains.%d of len.%d\n",numsent,remains,recvlen); + } + } + if ( retstr != space ) + free(retstr); + } + //printf("done response sock.%d\n",sock); + closesocket(sock); + } +} +/* +struct endpoint find_epbits(struct relay_info *list,uint32_t ipbits,uint16_t port,int32_t type) +{ + int32_t i; struct endpoint epbits; + memset(&epbits,0,sizeof(epbits)); + if ( list != 0 && list->num > 0 ) + { + if ( type >= 0 ) + type = nn_portoffset(type); + for (i=0; inum&&i<(int32_t)(sizeof(list->connections)/sizeof(*list->connections)); i++) + if ( list->connections[i].ipbits == ipbits && (port == 0 || port == list->connections[i].port) && (type < 0 || type == list->connections[i].nn) ) + return(list->connections[i]); + } + return(epbits); +} + +int32_t add_relay(struct relay_info *list,struct endpoint epbits) +{ + list->connections[list->num % (sizeof(list->connections)/sizeof(*list->connections))] = epbits, list->num++; + if ( list->num > (sizeof(list->connections)/sizeof(*list->connections)) ) + printf("add_relay warning num.%d > %ld\n",list->num,(long)(sizeof(list->connections)/sizeof(*list->connections))); + return(list->num); +} + +int32_t nn_add_lbservers(struct supernet_info *myinfo,uint16_t port,uint16_t globalport,uint16_t relaysport,int32_t priority,int32_t sock,char servers[][MAX_SERVERNAME],int32_t num) +{ + int32_t i; char endpoint[512],pubendpoint[512]; struct endpoint epbits; uint32_t ipbits; + if ( num > 0 && servers != 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&priority,sizeof(priority)) >= 0 ) + { + for (i=0; i= 0 ) + { + printf("+R%s ",endpoint); + add_relay(&myinfo->active,epbits); + } + if ( myinfo->subclient >= 0 ) + { + if ( myinfo->iamrelay != 0 ) + { + epbits = calc_epbits("tcp",ipbits,relaysport,NN_PUB); + expand_epbits(pubendpoint,epbits); + if ( nn_connect(myinfo->subclient,pubendpoint) >= 0 ) + printf("+P%s ",pubendpoint); + } + epbits = calc_epbits("tcp",ipbits,globalport,NN_PUB); + expand_epbits(pubendpoint,epbits); + if ( nn_connect(myinfo->subclient,pubendpoint) >= 0 ) + printf("+P%s ",pubendpoint); + } + } + } + printf("added priority.%d\n",priority); + priority++; + } else printf("error setting priority.%d (%s)\n",priority,nn_errstr()); + return(priority); +} + +int32_t _lb_socket(struct supernet_info *myinfo,uint16_t port,uint16_t globalport,uint16_t relaysport,int32_t maxmillis,char servers[][MAX_SERVERNAME],int32_t num,char backups[][MAX_SERVERNAME],int32_t numbacks,char failsafes[][MAX_SERVERNAME],int32_t numfailsafes) +{ + int32_t lbsock,timeout,retrymillis,priority = 1; + if ( (lbsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) + { + retrymillis = (maxmillis / 30) + 1; + printf("!!!!!!!!!!!! lbsock.%d !!!!!!!!!!!\n",lbsock); + if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RECONNECT_IVL,&retrymillis,sizeof(retrymillis)) < 0 ) + printf("error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); + else if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RECONNECT_IVL_MAX,&maxmillis,sizeof(maxmillis)) < 0 ) + fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); + timeout = SUPERNET_NETWORKTIMEOUT; + if ( 1 && nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)) < 0 ) + printf("error setting NN_SOL_SOCKET NN_RCVTIMEO socket %s\n",nn_errstr()); + timeout = 100; + if ( 1 && nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)) < 0 ) + printf("error setting NN_SOL_SOCKET NN_SNDTIMEO socket %s\n",nn_errstr()); + if ( num > 0 ) + priority = nn_add_lbservers(myinfo,port,globalport,relaysport,priority,lbsock,servers,num); + if ( numbacks > 0 ) + priority = nn_add_lbservers(myinfo,port,globalport,relaysport,priority,lbsock,backups,numbacks); + if ( numfailsafes > 0 ) + priority = nn_add_lbservers(myinfo,port,globalport,relaysport,priority,lbsock,failsafes,numfailsafes); + } else printf("error getting req socket %s\n",nn_errstr()); + //printf("myinfo->lb.num %d\n",myinfo->lb.num); + return(lbsock); +} + +int32_t nn_lbsocket(struct supernet_info *myinfo,int32_t maxmillis,int32_t port,uint16_t globalport,uint16_t relaysport) +{ + char Cservers[32][MAX_SERVERNAME],Bservers[32][MAX_SERVERNAME],failsafes[4][MAX_SERVERNAME]; + int32_t n,m,lbsock,numfailsafes = 0; + printf("redo lbsocket()\n"), exit(-1); + //strcpy(failsafes[numfailsafes++],"5.9.56.103"); + //strcpy(failsafes[numfailsafes++],"5.9.102.210"); + // n = crackfoo_servers(Cservers,sizeof(Cservers)/sizeof(*Cservers),port); + // m = badass_servers(Bservers,sizeof(Bservers)/sizeof(*Bservers),port); + lbsock = _lb_socket(myinfo,port,globalport,relaysport,maxmillis,Bservers,m,Cservers,n*0,failsafes,numfailsafes); + return(lbsock); +} + +void add_standard_fields(char *request) +{ + cJSON *json; uint64_t tag; + if ( (json= cJSON_Parse(request)) != 0 ) + { + if ( get_API_nxt64bits(cJSON_GetObjectItem(json,"NXT")) == 0 ) + { + randombytes((void *)&tag,sizeof(tag)); + sprintf(request + strlen(request) - 1,",\"NXT\":\"%s\",\"tag\":\"%llu\"}",myinfo->NXTADDR,(long long)tag); + if ( myinfo->iamrelay != 0 && (myinfo->hostname[0] != 0 || myinfo->ipaddr[0] != 0) ) + sprintf(request + strlen(request) - 1,",\"iamrelay\":\"%s\"}",myinfo->hostname[0]!=0?myinfo->hostname:myinfo->myipaddr); + } + free_json(json); + } +} + +char *nn_loadbalanced(struct supernet_info *myinfo,uint8_t *data,int32_t len) +{ + char *msg,*jsonstr = 0; + int32_t sendlen,i,lbsock,recvlen = 0; + if ( (lbsock= myinfo->lbclient) < 0 ) + return(clonestr("{\"error\":\"invalid load balanced socket\"}")); + for (i=0; i<10; i++) + if ( (nn_socket_status(lbsock,1) & NN_POLLOUT) != 0 ) + break; + if ( myinfo->Debuglevel > 2 ) + printf("sock.%d NN_LBSEND.(%s)\n",lbsock,data); + //fprintf(stderr,"send to network\n"); + if ( (sendlen= nn_send(lbsock,data,len,0)) == len ) + { + for (i=0; i<10; i++) + if ( (nn_socket_status(lbsock,1) & NN_POLLIN) != 0 ) + break; + if ( (recvlen= nn_recv(lbsock,&msg,NN_MSG,0)) > 0 ) + { + if ( myinfo->Debuglevel > 2 ) + printf("LBRECV.(%s)\n",msg); + jsonstr = clonestr((char *)msg); + nn_freemsg(msg); + } + else + { + printf("nn_loadbalanced got recvlen.%d %s\n",recvlen,nn_errstr()); + jsonstr = clonestr("{\"error\":\"lb recv error, probably timeout\"}"); + } + } else printf("got sendlen.%d instead of %d %s\n",sendlen,len,nn_errstr()), jsonstr = clonestr("{\"error\":\"lb send error\"}"); + return(jsonstr); +} + +cJSON *relay_json(struct relay_info *list) +{ + cJSON *json,*array; char endpoint[512]; int32_t i; + if ( list == 0 || list->num == 0 ) + return(0); + array = cJSON_CreateArray(); + for (i=0; inum&&i<(int32_t)(sizeof(list->connections)/sizeof(*list->connections)); i++) + { + expand_epbits(endpoint,list->connections[i]); + jaddistr(array,endpoint); + } + json = cJSON_CreateObject(); + jadd(json,"endpoints",array); + //cJSON_AddItemToObject(json,"type",cJSON_CreateString(nn_typestr(list->mytype))); + //cJSON_AddItemToObject(json,"dest",cJSON_CreateString(nn_typestr(list->desttype))); + jaddnum(json,"total",list->num); + return(json); +} + +char *relays_jsonstr(struct supernet_info *myinfo,char *jsonstr,cJSON *argjson) +{ + cJSON *json; + if ( myinfo->iamrelay != 0 && myinfo->ipaddr[0] != 0 ) + { + json = cJSON_CreateObject(); + jaddstr(json,"relay",myinfo->ipaddr); + if ( myinfo->active.num > 0 ) + jadd(json,"relays",relay_json(&myinfo->active)); + return(jprint(json,1)); + } + else return(clonestr("{\"error\":\"get relay list from relay\"}")); +} + +int32_t init_SUPERNET_pullsock(struct supernet_info *myinfo,int32_t sendtimeout,int32_t recvtimeout) +{ + char bindaddr[64],*transportstr; int32_t iter; + myinfo->pullsock = -1; + if ( (myinfo->pullsock= nn_socket(AF_SP,NN_PULL)) < 0 ) + { + printf("error creating pullsock %s\n",nn_strerror(nn_errno())); + return(-1); + } + printf("got pullsock.%d\n",myinfo->pullsock); + if ( nn_settimeouts(myinfo->pullsock,sendtimeout,recvtimeout) < 0 ) + { + printf("error settime pullsock timeouts %s\n",nn_strerror(nn_errno())); + return(-1); + } + printf("PULLsock.%d\n",myinfo->pullsock); + for (iter=0; iter<2; iter++) + { + transportstr = (iter == 0) ? "ipc" : "inproc"; + sprintf(bindaddr,"%s://SuperNET.agents",transportstr); + if ( nn_bind(myinfo->pullsock,bindaddr) < 0 ) + { + printf("error binding pullsock to (%s) %s\n",bindaddr,nn_strerror(nn_errno())); + return(-1); + } + } + return(0); +} + +void busdata_init(struct supernet_info *myinfo,int32_t sendtimeout,int32_t recvtimeout,int32_t firstiter) +{ + char endpoint[512]; int32_t i; + myinfo->servicesock = myinfo->pubglobal = myinfo->pubrelays = myinfo->lbserver = -1; + endpoint[0] = 0; + if ( (myinfo->subclient= nn_createsocket(myinfo,endpoint,0,"NN_SUB",NN_SUB,0,sendtimeout,recvtimeout)) >= 0 ) + { + myinfo->pfd[myinfo->numservers++].fd = myinfo->subclient, printf("numservers.%d\n",myinfo->numservers); + nn_setsockopt(myinfo->subclient,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + } else printf("error creating subclient\n"); + myinfo->lbclient = nn_lbsocket(myinfo,SUPERNET_NETWORKTIMEOUT,SUPERNET_PORT + LB_OFFSET,myinfo->port + PUBGLOBALS_OFFSET,myinfo->port + PUBRELAYS_OFFSET); + printf("LBclient.%d port.%d\n",myinfo->lbclient,SUPERNET_PORT + LB_OFFSET); + sprintf(endpoint,"%s://%s:%u",myinfo->transport,myinfo->ipaddr,myinfo->serviceport); + if ( (myinfo->servicesock= nn_createsocket(myinfo,endpoint,1,"NN_REP",NN_REP,myinfo->serviceport,sendtimeout,recvtimeout)) >= 0 ) + myinfo->pfd[myinfo->numservers++].fd = myinfo->servicesock, printf("numservers.%d\n",myinfo->numservers); + else printf("error creating servicesock\n"); + for (i=0; inumservers; i++) + myinfo->pfd[i].events = NN_POLLIN | NN_POLLOUT; + printf("myinfo->iamrelay %d, numservers.%d ipaddr.(%s://%s) port.%d serviceport.%d\n",myinfo->iamrelay,myinfo->numservers,myinfo->transport,myinfo->ipaddr,myinfo->port,myinfo->serviceport); +} + +void SuperNET_init(struct supernet_info *myinfo,char *jsonstr) +{ + char *str; + if ( jsonstr != 0 && (str= SuperNET_JSON(myinfo,jsonstr)) != 0 ) + free(str); + busdata_init(myinfo,10,1,0); + init_SUPERNET_pullsock(myinfo,10,10); +}*/ + +int32_t Supernet_lineparse(char *key,int32_t keymax,char *value,int32_t valuemax,char *src) +{ + int32_t a,b,c,n = 0; + key[0] = value[0] = 0; + while ( (c= src[n]) == ' ' || c == '\t' || c == '\n' || c == '\t' ) + n++; + while ( (c= src[n]) != ':' && c != 0 ) + { + *key++ = c; + if ( ++n >= keymax-1 ) + { + *key = 0; + printf("lineparse overflow key.(%s)\n",src); + return(-1); + } + } + *key = 0; + if ( src[n] != ':' ) + return(n); + n++; + while ( (c= src[n]) == ' ' || c == '\t' ) + n++; + while ( (c= src[n]) != 0 && c != '\r' && c != '\n' ) + { + if ( c == '%' && (a= src[n+1]) != 0 && (b= src[n+2]) != 0 ) + c = ((unhex(a) << 4) | unhex(b)), n += 2; + *value++ = c; + n++; + if ( n >= valuemax-1 ) + { + *value = 0; + printf("lineparse overflow.(%s)\n",src); + return(-1); + } + } + *value = 0; + if ( src[n] != 0 ) + { + n++; + while ( (c= src[n]) == '\r' || c == '\n' ) + n++; + } + return(n); +} + +cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr) +{ + int32_t i,n,totallen,datalen,len = 0; cJSON *json,*array; char key[8192],*data; + json = cJSON_CreateObject(); + array = cJSON_CreateArray(); + totallen = (int32_t)strlen(urlstr); + while ( 1 ) + { + for (i=len; urlstr[i]!=0; i++) + if ( urlstr[i] == '\r' || urlstr[i] == '\n' ) + break; + if ( i == len && (urlstr[len] == '\r' || urlstr[len] == '\n') ) + { + len++; + continue; + } + urlstr[i] = 0; + if ( (n= Supernet_lineparse(key,sizeof(key),value,bufsize,&urlstr[len])) > 0 ) + { + if ( value[0] != 0 ) + jaddstr(json,key,value); + else jaddistr(array,key); + len += (n + 1); + if ( strcmp(key,"Content-Length") == 0 && (datalen= atoi(value)) > 0 ) + { + data = &urlstr[totallen - datalen]; + data[-1] = 0; + //printf("post.(%s) (%c)\n",data,data[0]); + jaddstr(json,"POST",data); + } + } else break; + } + jadd(json,"lines",array); + return(json); +} + +char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *postflagp,char *urlstr,char *remoteaddr) +{ + cJSON *tokens,*argjson,*json = 0; char urlmethod[16],*data,url[1024],*retstr,*token = 0; int32_t i,j,n; + //printf("rpcparse.(%s)\n",urlstr); + for (i=0; i 0 ) + { + jaddstr(argjson,"agent",jstri(tokens,0)); + if ( n > 1 ) + jaddstr(argjson,"method",jstri(tokens,1)); + for (i=2; i (%s) postflag.%d (%s)\n",urlstr,cJSON_Print(json),*postflagp,jprint(argjson,0)); + return(retstr); + } + return(clonestr("{\"error\":\"couldnt process packet\"}")); +} + diff --git a/iguana/SuperNET.h b/iguana/SuperNET.h new file mode 100644 index 000000000..4b5deadd6 --- /dev/null +++ b/iguana/SuperNET.h @@ -0,0 +1,91 @@ +/****************************************************************************** + * Copyright © 2014-2015 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#ifndef INCLUDED_SUPERNET_H +#define INCLUDED_SUPERNET_H + +#include "../crypto777/OS_portable.h" +#include "../includes/cJSON.h" +#include "../includes/nanomsg/nn.h" + +#define SUPERNET_PORT 7778 +#define SUPERNET_NETWORKTIMEOUT 10000 +#define SUPERNET_POLLTIMEOUT 1 +#define SUPERNET_APIUSLEEP (SUPERNET_POLLTIMEOUT * 10000) +#define SUPERNET_MAXAGENTS 64 +#define NXT_TOKEN_LEN 160 +#define nn_errstr() nn_strerror(nn_errno()) + +/*#define LB_OFFSET 1 +#define PUBGLOBALS_OFFSET 2 +#define PUBRELAYS_OFFSET 3 + + +#define MAX_SERVERNAME 128 +struct relayargs +{ + char name[16],endpoint[MAX_SERVERNAME]; + int32_t sock,type,bindflag,sendtimeout,recvtimeout; +}; +struct relay_info { int32_t sock,num,mytype,desttype; struct endpoint connections[1 << CONNECTION_NUMBITS]; };*/ + +#define CONNECTION_NUMBITS 10 +struct endpoint { queue_t nnrecvQ; int32_t nnsock,nnind; uint64_t ipbits:32,port:16,transport:2,nn:4,directind:CONNECTION_NUMBITS; }; + +struct direct_connection { char handler[16]; struct endpoint epbits; int32_t sock; }; + +struct supernet_msghdr { uint8_t type,serlen[3]; char command[16]; uint8_t hdrdata[44]; uint8_t data[]; }; + +struct supernet_agent +{ + struct queueitem DL; queue_t recvQ; uint64_t totalrecv,totalsent; + int32_t (*recvfunc)(void *myinfo,struct supernet_agent *,struct supernet_msghdr *msg,uint8_t *data,int32_t datalen); + cJSON *networks; + char name[9],ipaddr[64],reppoint[64],pubpoint[64]; int32_t reqsock,repsock,pubsock,subsock; + uint32_t ipbits,dead; int32_t num,sock; uint16_t port,pubport,repport; +}; + +struct supernet_info +{ + char ipaddr[64],transport[8]; int32_t APISLEEP; int32_t iamrelay; uint64_t my64bits; uint64_t ipbits; + int32_t Debuglevel,readyflag,dead,POLLTIMEOUT; + //int32_t pullsock,subclient,lbclient,lbserver,servicesock,pubglobal,pubrelays,numservers; + bits256 privkey,pubkey; + uint16_t port,serviceport,acceptport; + struct nn_pollfd pfd[SUPERNET_MAXAGENTS]; //struct relay_info active; + struct supernet_agent agents[SUPERNET_MAXAGENTS]; queue_t acceptQ; int32_t numagents; +}; + +struct supernet_endpoint +{ + char name[64]; struct endpoint ep; + int32_t (*nnrecvfunc)(struct supernet_info *,struct supernet_endpoint *,int32_t ind,uint8_t *msg,int32_t nnlen); + queue_t nnrecvQ; + int32_t nnsock,num; struct endpoint eps[]; +}; + +void expand_epbits(char *endpoint,struct endpoint epbits); +struct endpoint calc_epbits(char *transport,uint32_t ipbits,uint16_t port,int32_t type); + +void SuperNET_init(); +char *SuperNET_JSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr); + +char *pangea_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr); +char *ramchain_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr); +char *iguana_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr); +char *InstantDEX_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr); + +#endif + diff --git a/iguana/iguana.sources b/iguana/iguana.sources index 23a485ba6..50b735bff 100755 --- a/iguana/iguana.sources +++ b/iguana/iguana.sources @@ -1,9 +1 @@ -SOURCES := iguana_wallet.c iguana_pubkeys.c iguana_recv.c iguana_bundles.c iguana_msg.c iguana_rpc.c iguana777.c iguana_chains.c iguana_peers.c iguana_accept.c iguana_html.c iguana_bitmap.c iguana_init.c iguana_ramchain.c iguana_blocks.c iguana_json.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/libgfshare.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c \ - ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c \ - ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c \ - ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c \ - ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c \ - ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c \ - ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c \ - ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/jmemmgr.c ../crypto777/jpeg/jmemnobs.c main.c - +SOURCES := iguana_wallet.c iguana_html.c iguana_pubkeys.c iguana_recv.c iguana_bundles.c iguana_msg.c iguana_rpc.c iguana777.c iguana_chains.c iguana_peers.c iguana_accept.c iguana_bitmap.c iguana_init.c iguana_ramchain.c iguana_blocks.c iguana_json.c $(CRYPTO777_SRCS) main.c diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 0c5e8da7d..04106ab28 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -284,7 +284,7 @@ int32_t iguana_helpertask(FILE *fp,struct OS_memspace *mem,struct OS_memspace *m void iguana_helper(void *arg) { - FILE *fp = 0; char fname[512],name[64],*helpername = 0; cJSON *argjson=0; int32_t i,flag; + FILE *fp = 0; char fname[512],name[64],*helpername = 0; cJSON *argjson=0; int32_t flag; struct iguana_helper *ptr; struct iguana_info *coin; struct OS_memspace MEM,*MEMB; if ( arg != 0 && (argjson= cJSON_Parse(arg)) != 0 ) helpername = jstr(argjson,"name"); @@ -302,6 +302,7 @@ void iguana_helper(void *arg) MEMB = mycalloc('b',IGUANA_MAXBUNDLESIZE,sizeof(*MEMB)); while ( 1 ) { + iguana_jsonQ(); flag = 0; if ( (ptr= queue_dequeue(&helperQ,0)) != 0 ) { @@ -316,11 +317,11 @@ void iguana_helper(void *arg) } if ( flag == 0 ) { - for (i=0; ilaunched != 0 ) flag += iguana_rpctest(coin); - } + }*/ if ( flag == 0 ) usleep(10000); } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index b83bd6038..03009f3f3 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -132,7 +132,7 @@ extern int32_t IGUANA_NUMHELPERS; #define IGUANA_ALLOC_MULT 1.1 #define IGUANA_ALLOC_INCR 1000 -#define IGUANA_JSONTIMEOUT 10000 +#define IGUANA_JSONTIMEOUT 1000 #define IGUANA_MAPRECVDATA 1 #define IGUANA_MAPTXIDITEMS 2 @@ -432,7 +432,7 @@ struct iguana_info struct iguana_bitmap screen; //struct pollfd fds[IGUANA_MAXPEERS]; struct iguana_peer bindaddr; int32_t numsocks; struct OS_memspace TXMEM; - queue_t acceptQ,bundlesQ,hdrsQ,blocksQ,priorityQ,possibleQ,jsonQ,finishedQ,TerminateQ,cacheQ; + queue_t acceptQ,bundlesQ,hdrsQ,blocksQ,priorityQ,possibleQ,TerminateQ,cacheQ; double parsemillis,avetime; uint32_t Launched[8],Terminated[8]; portable_mutex_t peers_mutex,blocks_mutex; struct iguana_bundle *bundles[IGUANA_MAXBUNDLES]; @@ -477,7 +477,7 @@ int32_t iguana_rwblock(int32_t rwflag,bits256 *hash2p,uint8_t *serialized,struct int32_t iguana_serialize_block(bits256 *hash2p,uint8_t serialized[sizeof(struct iguana_msgblock)],struct iguana_block *block); void iguana_blockconv(struct iguana_block *dest,struct iguana_msgblock *msg,bits256 hash2,int32_t height); //void iguana_freetx(struct iguana_msgtx *tx,int32_t n); -int32_t iguana_parser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t datalen); +int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t datalen); // send message int32_t iguana_validatehdr(struct iguana_msghdr *H); @@ -559,7 +559,7 @@ double dxblend(double *destp,double val,double decay); // json int32_t iguana_processjsonQ(struct iguana_info *coin); // reentrant, can be called during any idletime -char *iguana_JSON(struct iguana_info *coin,char *jsonstr,char *remoteaddr); +char *iguana_JSON(char *jsonstr); char *SuperNET_p2p(struct iguana_info *coin,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen); char *mbstr(char *str,double); @@ -670,11 +670,14 @@ int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,c struct iguana_waccount *iguana_waccountfind(struct iguana_info *coin,char *account); struct iguana_waccount *iguana_waccountadd(struct iguana_info *coin,char *walletaccount,struct iguana_waddress *waddr); -int32_t iguana_waccountswitch(struct iguana_info *coin,struct iguana_waddress *waddr,char *coinaddr); -struct iguana_waddress *iguana_waddressfind(struct iguana_info *coin,char *coinaddr); +int32_t iguana_waccountswitch(struct iguana_info *coin,char *account,struct iguana_waccount *oldwaddr,int32_t oldind,char *coinaddr); +struct iguana_waddress *iguana_waddresscalc(struct iguana_info *coin,struct iguana_waddress *addr,bits256 privkey); +struct iguana_waccount *iguana_waddressfind(struct iguana_info *coin,int32_t *indp,char *coinaddr); char *iguana_coinjson(struct iguana_info *coin,char *method,cJSON *json); cJSON *iguana_peersjson(struct iguana_info *coin,int32_t addronly); int32_t btc_priv2wip(char *wipstr,uint8_t privkey[32],uint8_t addrtype); int32_t btc_pub2rmd(uint8_t rmd160[20],uint8_t pubkey[33]); +int32_t iguana_launchcoin(char *symbol,cJSON *json); +int32_t iguana_jsonQ(); #endif diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index 1a8d57880..678af8bd2 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -123,7 +123,7 @@ void gen_jpegfile(char *fname,int32_t quality,uint8_t *bitmap,int32_t width,int3 int row_stride; /* physical row width in image buffer */ cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); - if ((outfile = fopen(fname, "wb")) == NULL) + if ( (outfile= fopen(fname,"wb")) == NULL) { fprintf(stderr, "can't open %s\n", fname); exit(1); @@ -1131,11 +1131,10 @@ void iguana_bitmap(char *space,int32_t max,char *name) //sprintf(space,"Content-type: text/standard\r\n"); //sprintf(space+strlen(space),"Content-Length: %ld\r\n\r\n",strlen(buf)); //strcpy(space,buf); - //printf("bitmap.[%s]\n",space); + printf("bitmap.[%s]\n",space); } else { - sprintf(space,"{\"name\":\"%s\",\"status\":\"%s\",\"amplitude\":%u,\"width\":%d,\"height\":%d,\"pixels\":[",name,coin!=0?coin->statusstr:"no coin",rect->amplitude,rect->width,rect->height), len = (int32_t)strlen(space); ptr = rect->data; h = rect->height, w = rect->width; for (y=0; ysymbol) == 0 ) { + printf("found.(%s)\n",name); iguana_chaininit(chain,strcmp(chain->symbol,"BTC") == 0); return(chain); } diff --git a/iguana/iguana_html.c b/iguana/iguana_html.c index 83c4178b4..a87762154 100755 --- a/iguana/iguana_html.c +++ b/iguana/iguana_html.c @@ -14,7 +14,7 @@ ******************************************************************************/ #include "iguana777.h" -#include "../includes/cJSON.h" +#include "SuperNET.h" char Default_agent[64] = { "ALL" }; #define IGUANA_FORMS "[ \ @@ -152,552 +152,6 @@ char *HTMLfooter = #define HTML_EMIT(str) if ( (str) != 0 && (str)[0] != 0 ) strcpy(&retbuf[size],str), size += (int32_t)strlen(str) char Prevjsonstr[1024],Currentjsonstr[1024]; -char *iguana_rpc(char *agent,cJSON *json,char *data,int32_t datalen,char *remoteaddr) -{ - //printf("agent.(%s) json.(%s) data[%d] %s\n",agent,jprint(json,0),datalen,data!=0?data:""); - if ( data == 0 ) - return(iguana_JSON(0,jprint(json,0),remoteaddr)); - else return(iguana_JSON(0,data,remoteaddr)); -} - -void iguana_urldecode(char *str) -{ - int32_t a,b,c; char *dest = str; - while ( (c= *str) != 0 ) - { - if ( c == '%' && (a= str[1]) != 0 && (b= str[2]) != 0 ) - *dest++ = (unhex(a)<<4) | unhex(b); - else *dest++ = c; - } - *dest = 0; -} - -char *iguana_parsebidask(char *base,char *rel,char *exchange,double *pricep,double *volumep,char *line) -{ - int32_t i; - for (i=0; i<16&&line[i]!='/'&&line[i]!=0; i++) - base[i] = line[i]; - base[i] = 0; - touppercase(base); - line += (i + 1); - for (i=0; i<16&&line[i]!='/'&&line[i]!=0; i++) - rel[i] = line[i]; - rel[i] = 0; - touppercase(rel); - line += (i + 1); - for (i=0; i<16&&line[i]!='/'&&line[i]!=0; i++) - exchange[i] = line[i]; - exchange[i] = 0; - line += (i + 1); - if ( strncmp(line,"price/",strlen("price/")) == 0 ) - { - line += strlen("price/"); - *pricep = atof(line); - if ( (line= strstr(line,"volume/")) != 0 ) - { - line += strlen("volume/"); - *volumep = atof(line); - for (i=0; i<16&&line[i]!=0; i++) - if ( line[i] == '/' ) - { - i++; - break; - } - return(line+i); - } - } - return(0); -} - -char *iguana_InstantDEX(char *jsonstr,char *path,char *method) -{ - char *str,base[64],rel[64],exchange[64]; double price,volume; - if ( (str= iguana_parsebidask(base,rel,exchange,&price,&volume,path)) != 0 ) - { - if ( price > 0. && volume > 0. ) - { - sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"%s\",\"base\":\"%s\",\"rel\":\"%s\",\"exchange\":\"%s\",\"price\":\%0.8f,\"volume\":%0.8f}",method,base,rel,exchange,price,volume); - return(jsonstr); - } - else return(0); - } - return(0); -} - -void iguana_coinset(char *buf,char *path) -{ - int32_t i; - if ( path[0] == '/' ) - path++; - for (i=0; i<8&&path[i]!=0&&path[i]!=' '&&path[i]!='/'; i++) - buf[i] = path[i]; - buf[i] = 0; - touppercase(buf); -} - -char *iguana_ramchain_glue(struct iguana_info *coin,char *method,char *jsonstr) -{ - char *ramchain_parser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json); - cJSON *json; char *retstr; - json = cJSON_Parse(jsonstr); - retstr = ramchain_parser(0,coin,method,json); - free_json(json); - return(retstr); -} - -char *iguana_hashparse(char *path) -{ - int32_t i,j,len,iter,n; uint8_t databuf[512]; - char hexstr[1025],password[512],hashname[512],*name,*msg; cJSON *json; - typedef void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); - typedef char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message); - struct hashfunc_entry { char *name; hashfunc hashfunc; }; - struct hmacfunc_entry { char *name; hmacfunc hmacfunc; }; - struct hashfunc_entry hashes[] = { {"NXT",calc_NXTaddr}, {"curve25519",calc_curve25519_str }, {"base64_encode",calc_base64_encodestr}, {"base64_decode",calc_base64_decodestr}, {"crc32",calc_crc32str}, {"rmd160_sha256",rmd160ofsha256}, {"sha256_sha256",sha256_sha256}, {"sha256",vcalc_sha256}, {"sha512",calc_sha512}, {"sha384",calc_sha384}, {"sha224",calc_sha224}, {"rmd160",calc_rmd160}, {"rmd256",calc_rmd256}, {"rmd320",calc_rmd320}, {"rmd128",calc_rmd128}, {"sha1",calc_sha1}, {"md5",calc_md5str}, {"tiger",calc_tiger}, {"whirlpool",calc_whirlpool} }; - struct hmacfunc_entry hmacs[] = { {"hmac_sha256",hmac_sha256_str}, {"hmac_sha512",hmac_sha512_str}, {"hmac_sha384",hmac_sha384_str}, {"hmac_sha224",hmac_sha224_str}, {"hmac_rmd160",hmac_rmd160_str}, {"hmac_rmd256",hmac_rmd256_str}, {"hmac_rmd320",hmac_rmd320_str}, {"hmac_rmd128",hmac_rmd128_str}, {"hmac_sha1",hmac_sha1_str}, {"hmac_md5",hmac_md5_str}, {"hmac_tiger",hmac_tiger_str}, {"hmac_whirlpool",hmac_whirlpool_str} }; - n = (int32_t)sizeof(hashes)/sizeof(*hashes); - for (j=0; j 0 ) - { - jsonstr[i] = 0; - agent = jsonstr; - jsonstr += i; - } - jsonstr++; - json = cJSON_CreateObject(); - jaddstr(json,"agent",agent); - while ( 1 ) - { - n = (int32_t)strlen(jsonstr); - key = jsonstr; - value = 0; - for (i=0; i

"); + HTML_EMIT(" SuperUGLY GUI>

"); sprintf(buf,"
"); - //sprintf(buf,"
COIN: "); - //HTML_EMIT(buf); - if ( 0 ) - { - sprintf(formfooter,"\t","InstantDEX","iguana49_setagent"); HTML_EMIT(formfooter); - sprintf(formfooter,"\t","PAX","iguana50_setagent"); HTML_EMIT(formfooter); - sprintf(formfooter,"\t","pangea","iguana51_setagent"); HTML_EMIT(formfooter); - sprintf(formfooter,"\t","jumblr","iguana52_setagent"); HTML_EMIT(formfooter); - sprintf(formfooter,"\t","ramchain","iguana53_setagent"); HTML_EMIT(formfooter); - sprintf(formfooter,"\t","iguana","iguana54_setagent"); HTML_EMIT(formfooter); - } - HTML_EMIT(" Agent: "); HTML_EMIT(Default_agent); - HTML_EMIT("

"); HTML_EMIT(origjsonstr); HTML_EMIT(" -> "); - HTML_EMIT("",cols,rows,fieldname,cols == 1 ? "hidden" : ""); + else sprintf(buf,"",cols,rows,fieldname,cols == 1 ? "hidden" : ""); str = disp==0?jstr(obj,"disp"):disp; - sprintf(&retbuf[size],"%s %s \r\n",str!=0?str:fieldname,buf), size += strlen(&retbuf[size]); + sprintf(&retbuf[size],"%s %s \r\n",str!=0?str:fieldname,buf), size += strlen(&retbuf[size]); } sprintf(formfooter," \n",button,clickname); HTML_EMIT(formfooter); @@ -858,7 +304,7 @@ function iguana_poll( )\ char *iguana_htmlresponse(char *retbuf,int32_t bufsize,int32_t *remainsp,int32_t localaccess,char *retstr,int32_t freeflag) { - static char *html = " %s "; + //static char *html = " %s "; char *result=0,*error=0; int32_t n; cJSON *json,*formsjson; retbuf[0] = 0; /*if ( localaccess == 0 ) @@ -873,7 +319,7 @@ char *iguana_htmlresponse(char *retbuf,int32_t bufsize,int32_t *remainsp,int32_t sprintf(retbuf+strlen(retbuf),"\n\r"); n = (int32_t)strlen(retbuf); formsjson = cJSON_Parse(IGUANA_FORMS); - if ( (json= cJSON_Parse(retstr)) == 0 ) + if ( retstr == 0 || (json= cJSON_Parse(retstr)) == 0 ) json = cJSON_CreateObject(); jadd(json,"forms",formsjson); error = jstr(json,"error"); @@ -881,11 +327,11 @@ char *iguana_htmlresponse(char *retbuf,int32_t bufsize,int32_t *remainsp,int32_t //printf("process.(%s)\n",jprint(formsjson,0)); n = iguana_htmlgen(&retbuf[n],bufsize-n,result,error,json,"iguana",Currentjsonstr); free_json(json); - if ( n == 0 ) + /*if ( n == 0 ) { n = (int32_t)(strlen(html) + strlen(retstr) + 1); sprintf(retbuf+strlen(retbuf),html,retstr); - } + }*/ if ( freeflag != 0 ) free(retstr); if ( n > bufsize ) @@ -897,10 +343,180 @@ char *iguana_htmlresponse(char *retbuf,int32_t bufsize,int32_t *remainsp,int32_t return(retbuf); } +int32_t Supernet_lineparse(char *key,int32_t keymax,char *value,int32_t valuemax,char *src) +{ + int32_t a,b,c,n = 0; + key[0] = value[0] = 0; + while ( (c= src[n]) == ' ' || c == '\t' || c == '\n' || c == '\t' ) + n++; + while ( (c= src[n]) != ':' && c != 0 ) + { + *key++ = c; + if ( ++n >= keymax-1 ) + { + *key = 0; + printf("lineparse overflow key.(%s)\n",src); + return(-1); + } + } + *key = 0; + if ( src[n] != ':' ) + return(n); + n++; + while ( (c= src[n]) == ' ' || c == '\t' ) + n++; + while ( (c= src[n]) != 0 && c != '\r' && c != '\n' ) + { + if ( c == '%' && (a= src[n+1]) != 0 && (b= src[n+2]) != 0 ) + c = ((unhex(a) << 4) | unhex(b)), n += 2; + *value++ = c; + n++; + if ( n >= valuemax-1 ) + { + *value = 0; + printf("lineparse overflow.(%s)\n",src); + return(-1); + } + } + *value = 0; + if ( src[n] != 0 ) + { + n++; + while ( (c= src[n]) == '\r' || c == '\n' ) + n++; + } + return(n); +} + +cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr) +{ + int32_t i,n,totallen,datalen,len = 0; cJSON *json,*array; char key[8192],*data; + json = cJSON_CreateObject(); + array = cJSON_CreateArray(); + totallen = (int32_t)strlen(urlstr); + while ( 1 ) + { + for (i=len; urlstr[i]!=0; i++) + if ( urlstr[i] == '\r' || urlstr[i] == '\n' ) + break; + if ( i == len && (urlstr[len] == '\r' || urlstr[len] == '\n') ) + { + len++; + continue; + } + urlstr[i] = 0; + if ( (n= Supernet_lineparse(key,sizeof(key),value,bufsize,&urlstr[len])) > 0 ) + { + if ( value[0] != 0 ) + jaddstr(json,key,value); + else jaddistr(array,key); + len += (n + 1); + if ( strcmp(key,"Content-Length") == 0 && (datalen= atoi(value)) > 0 ) + { + data = &urlstr[totallen - datalen]; + data[-1] = 0; + //printf("post.(%s) (%c)\n",data,data[0]); + jaddstr(json,"POST",data); + } + } else break; + } + jadd(json,"lines",array); + return(json); +} + +char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *postflagp,char *urlstr,char *remoteaddr) +{ + cJSON *tokens,*argjson,*json = 0; char urlmethod[16],*data,url[1024],*retstr,*token = 0; int32_t i,j,n; + //printf("rpcparse.(%s)\n",urlstr); + for (i=0; i 0 ) + { + jaddstr(argjson,"agent",jstri(tokens,0)); + if ( n > 1 ) + jaddstr(argjson,"method",jstri(tokens,1)); + for (i=2; i (%s) postflag.%d (%s)\n",urlstr,cJSON_Print(json),*postflagp,retstr); + return(retstr); + } + return(clonestr("{\"error\":\"couldnt process packet\"}")); +} + void iguana_rpcloop(void *args) { - int32_t recvlen,bindsock,postflag,sock,remains,numsent,len; socklen_t clilen; - char ipaddr[64],jsonbuf[8192],*buf,*retstr,*space;//,*retbuf; ,n,i,m + struct supernet_info *myinfo = args; + int32_t recvlen,bindsock,postflag,sock,remains,numsent,jsonflag,len; socklen_t clilen; + char remoteaddr[64],jsonbuf[8192],*buf,*retstr,*space;//,*retbuf; ,n,i,m struct sockaddr_in cli_addr; uint32_t ipbits,i,size = IGUANA_WIDTH*IGUANA_HEIGHT*16 + 512; uint16_t port; port = IGUANA_RPCPORT; bindsock = iguana_socket(1,"127.0.0.1",port); @@ -917,7 +533,7 @@ void iguana_rpcloop(void *args) continue; } memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits)); - expand_ipbits(ipaddr,ipbits); + expand_ipbits(remoteaddr,ipbits); //printf("RPC.%d for %x (%s)\n",sock,ipbits,ipaddr); //printf("%p got.(%s) from %s | usock.%d ready.%u dead.%u\n",addr,H.command,addr->ipaddr,addr->usock,addr->ready,addr->dead); memset(jsonbuf,0,sizeof(jsonbuf)); @@ -943,18 +559,23 @@ void iguana_rpcloop(void *args) remains -= len; recvlen += len; buf = &buf[len]; + retstr = SuperNET_rpcparse(myinfo,space,size,&jsonflag,&postflag,jsonbuf,remoteaddr); + break; } else usleep(10000); //printf("got.(%s) %d remains.%d of total.%d\n",jsonbuf,recvlen,remains,len); - retstr = iguana_rpcparse(space,size,&postflag,jsonbuf); + //retstr = iguana_rpcparse(space,size,&postflag,jsonbuf); break; } } + if ( retstr == 0 ) + retstr = iguana_htmlresponse(space,size,&remains,1,retstr,retstr != space); if ( retstr != 0 ) { i = 0; - if ( postflag == 0 ) - retstr = iguana_htmlresponse(space,size,&remains,1,retstr,1); + if ( 0 && postflag == 0 ) + retstr = iguana_htmlresponse(space,size,&remains,1,retstr,retstr != space); else remains = (int32_t)strlen(retstr); + //printf("POSTFLAG.%d\n",postflag); //printf("RETBUF.(%s)\n",retstr); while ( remains > 0 ) { @@ -981,6 +602,6 @@ void iguana_rpcloop(void *args) strcpy(Prevjsonstr,Currentjsonstr); Currentjsonstr[0] = 0; //printf("done response sock.%d\n",sock); - close(sock); + closesocket(sock); } } \ No newline at end of file diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 8348fd075..76bfe9fe7 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -32,8 +32,6 @@ void iguana_initQs(struct iguana_info *coin) iguana_initQ(&coin->blocksQ,"blocksQ"); iguana_initQ(&coin->priorityQ,"priorityQ"); iguana_initQ(&coin->possibleQ,"possibleQ"); - iguana_initQ(&coin->jsonQ,"jsonQ"); - iguana_initQ(&coin->finishedQ,"finishedQ"); iguana_initQ(&coin->cacheQ,"cacheQ"); iguana_initQ(&coin->TerminateQ,"TerminateQ"); for (i=0; iname); - jadd(json,"methods",agent->methods); - if ( agent->port != 0 ) - jaddnum(json,"port",agent->port); - else jaddstr(json,"type","builtin"); - return(json); -} - -char *iguana_remoteparser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json) -{ - int32_t i,n,remains,numsent; char *jsonstr = 0,*retstr = 0; uint8_t hdr[128]; - if ( agent->sock < 0 ) - agent->sock = iguana_socket(0,agent->hostname,agent->port); - if ( agent->sock >= 0 ) - { - i = 0; - jsonstr = jprint(json,0); - n = (int32_t)strlen(jsonstr) + 1; - remains = n; - //printf("RETBUF.(%s)\n",retbuf); - while ( remains > 0 ) - { - if ( (numsent= (int32_t)send(agent->sock,&jsonstr[i],remains,MSG_NOSIGNAL)) < 0 ) - { - if ( errno != EAGAIN && errno != EWOULDBLOCK ) - { - printf("%s: %s numsent.%d vs remains.%d of %d errno.%d (%s) usock.%d\n",jsonstr,agent->name,numsent,remains,n,errno,strerror(errno),agent->sock); - break; - } - } - else if ( remains > 0 ) - { - remains -= numsent; - i += numsent; - if ( remains > 0 ) - printf("iguana sent.%d remains.%d of len.%d\n",numsent,remains,n); - } - } - if ( (n= (int32_t)recv(agent->sock,hdr,sizeof(hdr),0)) >= 0 ) - { - remains = (hdr[0] + ((int32_t)hdr[1] << 8) + ((int32_t)hdr[2] << 16)); - retstr = mycalloc('p',1,remains + 1); - i = 0; - while ( remains > 0 ) - { - if ( (n= (int32_t)recv(agent->sock,&retstr[i],remains,0)) < 0 ) - { - if ( errno == EAGAIN ) - { - printf("EAGAIN for len %d, remains.%d\n",n,remains); - usleep(10000); - } - break; - } - else - { - if ( n > 0 ) - { - remains -= n; - i += n; - } else usleep(10000); - } - } - } - free(jsonstr); - } - if ( retstr == 0 ) - retstr = clonestr("{\"error\":\"null return\"}"); - return(retstr); -} - -char *iguana_addagent(char *name,char *(*parsefunc)(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json),char *hostname,cJSON *methods,uint16_t port,char *pubkeystr,char *privkeystr) -{ - int32_t i; struct iguana_agent *agent; char retbuf[8192]; - for (i=0; iname,name) == 0 ) - { - if ( pubkeystr != 0 && privkeystr != 0 && strlen(pubkeystr) == 64 && strlen(privkeystr) == 64 ) - { - decode_hex(agent->pubkey.bytes,sizeof(bits256),pubkeystr); - decode_hex(agent->privkey.bytes,sizeof(bits256),privkeystr); - } - if ( port != 0 && agent->port == 0 ) - { - if ( agent->sock >= 0 ) - close(agent->sock); - agent->port = port; - strcpy(agent->hostname,hostname); - agent->sock = iguana_socket(0,agent->hostname,port); - printf("set (%s) port.%d for %s -> sock.%d\n",hostname,port,agent->name,agent->sock); - } - if ( agent->port > 0 && agent->sock < 0 && agent->hostname[0] != 0 && (agent->sock= iguana_socket(0,agent->hostname,agent->port)) < 0 ) - return(clonestr("{\"result\":\"existing agent couldnt connect to remote agent\"}")); - else return(clonestr("{\"result\":\"agent already there\"}")); - } - } - for (i=0; iname,name,sizeof(agent->name)-1); - strncpy(agent->hostname,hostname,sizeof(agent->hostname)-1); - agent->methods = methods, agent->nummethods = cJSON_GetArraySize(methods); - agent->sock = -1; - agent->port = port; - agent->parsefunc = (void *)parsefunc; - if ( pubkeystr != 0 && privkeystr != 0 && strlen(pubkeystr) == 64 && strlen(privkeystr) == 64 ) - { - decode_hex(agent->pubkey.bytes,sizeof(bits256),pubkeystr); - decode_hex(agent->privkey.bytes,sizeof(bits256),privkeystr); - } - if ( port > 0 ) - { - if ( (agent->sock= iguana_socket(0,hostname,port)) < 0 ) - return(clonestr("{\"result\":\"agent added, but couldnt connect to remote agent\"}")); - } - sprintf(retbuf,"{\"result\":\"agent added\",\"name\"\"%s\",\"methods\":%s,\"hostname\":\"%s\",\"port\":%u,\"sock\":%d}",agent->name,jprint(agent->methods,0),agent->hostname,agent->port,agent->sock); - return(clonestr(retbuf)); - } - } - return(clonestr("{\"error\":\"no more agent slots available\"}")); -} - -char *iguana_agentjson(char *name,struct iguana_info *coin,char *method,cJSON *json,char *remoteaddr) -{ - cJSON *retjson = 0,*array,*methods,*obj; int32_t i,n,j; struct iguana_agent *agent; - if ( strcmp(name,"SuperNET") != 0 ) - { - for (i=0; iname,name) == 0 ) - { - if ( agent->parsefunc != 0 ) - { - for (j=0; jnummethods; j++) - { - if ( (obj= jitem(agent->methods,j)) != 0 ) - { - if ( strcmp(method,jstr(obj,0)) == 0 ) - return((*agent->parsefunc)(agent,method,json,remoteaddr)); - } - } - return(clonestr("{\"result\":\"agent doesnt have method\"}")); - } else return(clonestr("{\"result\":\"agent doesnt have parsefunc\"}")); - } - } - } - else if ( remoteaddr == 0 || strcmp(remoteaddr,"127.0.0.1") != 0 ) // public api - { - char *coinstr; int32_t j,k,l,r,rr; struct iguana_peer *addr; - array = 0; - if ( strcmp(method,"getpeers") == 0 ) - { - if ( (coinstr= jstr(json,"coin")) != 0 ) - { - if ( (array= iguana_peersjson(iguana_coinfind(coinstr),1)) == 0 ) - return(clonestr("{\"error\":\"coin not found\"}")); - } - else - { - n = 0; - array = cJSON_CreateArray(); - r = rand(); - for (i=0; ipeers.active[l]; - if ( addr->usock >= 0 && addr->supernet != 0 ) - { - jaddistr(array,addr->ipaddr); - if ( ++n >= 64 ) - break; - } - } - } - } - } - if ( array != 0 ) - { - retjson = cJSON_CreateObject(); - jaddstr(retjson,"agent","SuperNET"); - jaddstr(retjson,"method","mypeers"); - jaddstr(retjson,"result","peers found"); - jadd(retjson,"peers",array); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"no peers found\"}")); - } - else if ( strcmp(method,"mypeers") == 0 ) - { - printf("mypeers from %s\n",remoteaddr!=0?remoteaddr:"local"); - } - } - else // local api - { - if ( strcmp(method,"list") == 0 ) - { - retjson = cJSON_CreateObject(); - array = cJSON_CreateArray(); - for (i=0; isymbol[0] != 0 ) - jaddistr(array,Coins[i]->symbol); - } - jadd(retjson,"coins",array); - array = cJSON_CreateArray(); - for (i=0; iname[0] != 0 ) - jaddi(array,iguana_agentinfojson(Agents[i])); - } - jadd(retjson,"agents",array); - return(jprint(retjson,1)); - } - else if ( strcmp(method,"peers") == 0 ) - { - retjson = cJSON_CreateObject(); - array = cJSON_CreateArray(); - for (i=0; isymbol[0] != 0 ) - jaddi(array,iguana_peersjson(Coins[i],0)); - } - jadd(retjson,"allpeers",array); - return(jprint(retjson,1)); - } - else if ( strcmp(method,"addagent") == 0 ) - { - char *hostname = "127.0.0.1",*name; uint16_t port; - if ( (name= jstr(json,"name")) != 0 && (methods= jarray(&n,json,"methods")) != 0 ) - { - if ( (port= juint(json,"port")) != 0 ) - { - if ( (hostname= jstr(json,"host")) == 0 ) - { - if ( (hostname= jstr(json,"ipaddr")) == 0 ) - hostname = "127.0.0.1"; - } - if ( hostname == 0 ) - return(clonestr("{\"error\":\"no host specified for remote agent\"}")); - } - else if ( strcmp(name,"pangea") != 0 && strcmp(name,"InstantDEX") != 0 && strcmp(name,"jumblr") != 0 ) - return(clonestr("{\"error\":\"no port specified for remote agent\"}")); - return(iguana_addagent(name,iguana_remoteparser,hostname,methods,port,jstr(json,"pubkey"),jstr(json,"privkey"))); - } else return(clonestr("{\"error\":\"cant addagent without name and methods\"}")); - } - } - return(clonestr("{\"result\":\"stub processed generic json\"}")); -} - char *iguana_coinjson(struct iguana_info *coin,char *method,cJSON *json) { int32_t i,max,retval; struct iguana_peer *addr; char *ipaddr; cJSON *retjson = 0; @@ -422,244 +152,101 @@ char *iguana_coinjson(struct iguana_info *coin,char *method,cJSON *json) return(clonestr("{\"error\":\"unhandled request\"}")); } -char *iguana_jsonstr(struct iguana_info *coin,char *jsonstr,char *remoteaddr) +char *iguana_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr) { - cJSON *json; char *retjsonstr,*methodstr,*agentstr; - //printf("iguana_jsonstr.(%s)\n",jsonstr); - if ( (json= cJSON_Parse(jsonstr)) != 0 ) + char *coinstr,SYM[16]; int32_t j,k,l,r,rr; struct iguana_peer *addr; + cJSON *retjson = 0,*array; int32_t i,n; struct iguana_info *coin; char *symbol; + printf("remoteaddr.(%s)\n",remoteaddr!=0?remoteaddr:"local"); + if ( remoteaddr == 0 || remoteaddr[0] == 0 || strcmp(remoteaddr,"127.0.0.1") == 0 ) // local (private) api { - if ( (methodstr= jstr(json,"method")) != 0 ) - { - if ( (agentstr= jstr(json,"agent")) == 0 || strcmp(agentstr,"iguana") == 0 ) - retjsonstr = iguana_coinjson(coin,methodstr,json); - else retjsonstr = iguana_agentjson(agentstr,coin,methodstr,json,remoteaddr); - } else retjsonstr = clonestr("{\"error\":\"no method in JSON\"}"); - free_json(json); - } else retjsonstr = clonestr("{\"error\":\"cant parse JSON\"}"); - printf("iguana_jsonstr.(%s)\n",retjsonstr); - return(retjsonstr); -} - -int32_t iguana_processjsonQ(struct iguana_info *coin) // reentrant, can be called during any idletime -{ - struct iguana_jsonitem *ptr; - if ( (ptr= queue_dequeue(&coin->finishedQ,0)) != 0 ) - { - if ( ptr->expired != 0 ) - { - *ptr->retjsonstrp = clonestr("{\"error\":\"request timeout\"}"); - printf("garbage collection: expired.(%s)\n",ptr->jsonstr); - myfree(ptr,ptr->allocsize); - } else queue_enqueue("finishedQ",&coin->finishedQ,&ptr->DL,0); - } - if ( (ptr= queue_dequeue(&coin->jsonQ,0)) != 0 ) - { - //printf("process.(%s)\n",ptr->jsonstr); - if ( (*ptr->retjsonstrp= iguana_jsonstr(ptr->fallback==0?coin:0,ptr->jsonstr,ptr->remoteaddr)) == 0 ) - *ptr->retjsonstrp = clonestr("{\"error\":\"null return from iguana_jsonstr\"}"); - queue_enqueue("finishedQ",&coin->finishedQ,&ptr->DL,0); - return(1); - } - return(0); -} - -char *iguana_blockingjsonstr(struct iguana_info *coin,char *jsonstr,uint64_t tag,int32_t maxmillis,char *remoteaddr) -{ - struct iguana_jsonitem *ptr; char *retjsonstr = 0; int32_t fallback = 0,len,allocsize; double expiration = OS_milliseconds() + maxmillis; - if ( coin == 0 ) - coin = iguana_coinfind("BTCD"), fallback = 1; - if ( coin != 0 ) - { - //printf("blocking case.(%s)\n",jsonstr); - len = (int32_t)strlen(jsonstr); - allocsize = sizeof(*ptr) + len + 1; - ptr = mycalloc('J',1,allocsize); - ptr->allocsize = allocsize; - ptr->fallback = fallback; - ptr->retjsonstrp = &retjsonstr; - safecopy(ptr->remoteaddr,remoteaddr,sizeof(ptr->remoteaddr)); - memcpy(ptr->jsonstr,jsonstr,len+1); - queue_enqueue("jsonQ",&coin->jsonQ,&ptr->DL,0); - while ( OS_milliseconds() < expiration ) + if ( strcmp(method,"list") == 0 ) { - usleep(100); - if ( retjsonstr != 0 ) + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + for (i=0; ifinishedQ,&ptr->DL,allocsize,1); - return(retjsonstr); + if ( Coins[i] != 0 && Coins[i]->symbol[0] != 0 ) + jaddistr(array,Coins[i]->symbol); } - usleep(1000); - } - printf("(%s) expired\n",jsonstr); - ptr->expired = (uint32_t)time(NULL); - return(clonestr("{\"error\":\"iguana jsonstr expired\"}")); - } - return(clonestr("{\"error\":\"iguana blockingjsonstr cant get coin_info\"}")); -} - -char *iguana_JSON(struct iguana_info *coin,char *jsonstr,char *remoteaddr) -{ - cJSON *json,*retjson; uint64_t tag; uint32_t timeout; int32_t retval,localaccess = 0; - char *method,*retjsonstr,*symbol,*retstr = 0; - if ( remoteaddr == 0 || strcmp(remoteaddr,"127.0.0.1") == 0 ) // || strcmp(remoteaddr,myipaddr) == 0 ) - localaccess = 1; - printf("iguana_JSON.(%s) from %s\n",jsonstr,localaccess==0?remoteaddr:"local access"); - if ( (json= cJSON_Parse(jsonstr)) != 0 ) - { - if ( localaccess != 0 && (method= jstr(json,"method")) != 0 && strcmp(method,"addcoin") == 0 ) - { - if ( (retval= iguana_launchcoin(jstr(json,"coin"),json)) > 0 ) - return(clonestr("{\"result\":\"launched coin\"}")); - else if ( retval == 0 ) return(clonestr("{\"result\":\"coin already launched\"}")); - else return(clonestr("{\"error\":\"error launching coin\"}")); - } - if ( (tag= j64bits(json,"tag")) == 0 ) - OS_randombytes((uint8_t *)&tag,sizeof(tag)); - if ( (symbol= jstr(json,"coin")) != 0 ) - { - coin = iguana_coinfind(symbol); - if ( coin != 0 && localaccess != 0 && coin->launched == 0 ) - iguana_launchcoin(symbol,json); + jadd(retjson,"coins",array); + return(jprint(retjson,1)); } - if ( (timeout= juint(json,"timeout")) == 0 ) - timeout = IGUANA_JSONTIMEOUT; - if ( (retjsonstr= iguana_blockingjsonstr(coin,jsonstr,tag,timeout,remoteaddr)) != 0 ) + else if ( strcmp(method,"allpeers") == 0 ) { - //printf("retjsonstr.(%s)\n",retjsonstr); - if ( (retjson= cJSON_Parse(retjsonstr)) == 0 ) + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + for (i=0; isymbol[0] != 0 ) + jaddi(array,iguana_peersjson(Coins[i],0)); } - jdelete(retjson,"tag"); - jadd64bits(retjson,"tag",tag); - retstr = jprint(retjson,1); - //printf("retstr.(%s) retjsonstr.%p retjson.%p\n",retstr,retjsonstr,retjson); - free(retjsonstr);//,strlen(retjsonstr)+1); + jadd(retjson,"allpeers",array); + return(jprint(retjson,1)); } - free_json(json); - } else retstr = clonestr("{\"error\":\"cant parse JSON\"}"); - if ( retstr == 0 ) - retstr = clonestr("{\"error\":\"null return\"}"); - return(retstr); -} - -char *SuperNET_p2p(struct iguana_info *coin,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen) -{ - cJSON *json,*retjson; char *retstr = 0; - if ( (json= cJSON_Parse((char *)data)) != 0 ) - { - printf("GOT >>>>>>>> SUPERNET P2P.(%s)\n",(char *)data); - if ( (retstr = iguana_JSON(coin,(char *)data,ipaddr)) != 0 ) + else { - if ( (retjson= cJSON_Parse(retstr)) != 0 ) + if ( (symbol= jstr(json,"coin")) != 0 && strlen(symbol) < sizeof(SYM)-1 ) { - if ( jobj(retjson,"result") != 0 || jobj(retjson,"error") != 0 || jobj(retjson,"method") == 0 ) + strcpy(SYM,symbol); + touppercase(SYM); + if ( (coin= iguana_coinfind(SYM)) == 0 ) { - free(retstr); - retstr = 0; + if ( strcmp(method,"addcoin") == 0 ) + coin = iguana_coinadd(SYM); } - free_json(retjson); + if ( coin != 0 ) + return(iguana_coinjson(coin,method,json)); + else return(clonestr("{\"error\":\"cant get coin info\"}")); } } - free_json(json); - } - return(retstr); -} - -/*void iguana_issuejsonstrM(void *arg) -{ - cJSON *json; int32_t fd; char *retjsonstr,*jsonstr = arg; - retjsonstr = iguana_JSON(jsonstr); - if ( (json= cJSON_Parse(jsonstr)) != 0 ) - { - if ( (fd= juint(json,"retdest")) > 0 ) - { - send(fd,jsonstr,(int32_t)strlen(jsonstr)+1,MSG_NOSIGNAL); - } - free_json(json); - return; } - printf("%s\n",retjsonstr); - free(retjsonstr);//,strlen(retjsonstr)+1); - free(jsonstr);//,strlen(jsonstr)+1); -}*/ - -void iguana_main(void *arg) -{ - char helperstr[64],*helperargs,*coinargs=0,*retstr,*secret,*jsonstr = arg; - int32_t i,len,flag; cJSON *json; uint8_t secretbuf[512]; - // portable_OS_init()? - mycalloc(0,0,0); + array = 0; + if ( strcmp(method,"getpeers") == 0 ) { - char str[65]; struct tai t; double startmillis; int32_t datenum,seconds; uint64_t i,checkval,timestamp,now = (uint32_t)time(NULL); - startmillis = OS_milliseconds(); - for (i=0; i<1000000; i++) + if ( (coinstr= jstr(json,"coin")) != 0 ) { - timestamp = now - (rand() % 100000000LL); // range -100000000LL to +500000000LL - datenum = OS_conv_unixtime(&t,&seconds,timestamp); // gmtime -> datenum + number of seconds - checkval = OS_conv_datenum(datenum,seconds/3600,(seconds/60)%60,seconds%60); // datenum+H:M:S -> unix time - if ( checkval != timestamp ) - printf("%s i.%lld timestamp.%-12llu -> (%d:%06d) -> checkval.%-12llu diff.[%lld]\n",tai_str(str,t),(long long)i,(long long)timestamp,datenum,seconds,(long long)checkval,(long long)(timestamp-checkval)); + if ( (array= iguana_peersjson(iguana_coinfind(coinstr),1)) == 0 ) + return(clonestr("{\"error\":\"coin not found\"}")); } - printf("million tai compares in %.3f microseconds per encode/decode\n",1000. * (OS_milliseconds()-startmillis)/i); - } - if ( (retstr= iguana_addagent("ramchain",ramchain_parser,"127.0.0.1",cJSON_Parse("[\"block\", \"tx\", \"txs\", \"rawtx\", \"balance\", \"totalreceived\", \"totalsent\", \"utxo\", \"status\"]"),0,0,0)) != 0 ) - printf("%s\n",retstr), free(retstr); - if ( (retstr= iguana_addagent("pangea",pangea_parser,"127.0.0.1",cJSON_Parse("[\"test\"]"),0,0,0)) != 0 ) - printf("%s\n",retstr), free(retstr); - if ( (retstr= iguana_addagent("InstantDEX",InstantDEX_parser,"127.0.0.1",cJSON_Parse("[\"test\"]"),0,0,0)) != 0 ) - printf("%s\n",retstr), free(retstr); - if ( (retstr= iguana_addagent("jumblr",jumblr_parser,"127.0.0.1",cJSON_Parse("[\"test\"]"),0,0,0)) != 0 ) - printf("%s\n",retstr), free(retstr); - iguana_initQ(&helperQ,"helperQ"); - OS_ensure_directory("confs"); - OS_ensure_directory("DB"); - OS_ensure_directory("tmp"); - if ( jsonstr != 0 && (json= cJSON_Parse(jsonstr)) != 0 ) - { - if ( jobj(json,"numhelpers") != 0 ) - IGUANA_NUMHELPERS = juint(json,"numhelpers"); - if ( (secret= jstr(json,"secret")) != 0 ) + else { - len = (int32_t)strlen(secret); - if ( is_hexstr(secret,0) != 0 && len <= (sizeof(secretbuf)<<1) ) + n = 0; + array = cJSON_CreateArray(); + r = rand(); + for (i=0; i>= 1; - decode_hex(secretbuf,len,secret); - } else vcalc_sha256(0,secretbuf,(void *)secret,len), len = sizeof(bits256); + j = (r + i) % IGUANA_MAXCOINS; + if ( (coin= Coins[j]) != 0 ) + { + rr = rand(); + for (k=0; kpeers.active[l]; + if ( addr->usock >= 0 && addr->supernet != 0 ) + { + jaddistr(array,addr->ipaddr); + if ( ++n >= 64 ) + break; + } + } + } + } } - if ( jobj(json,"coins") != 0 ) - coinargs = jsonstr; - } - if ( IGUANA_NUMHELPERS == 0 ) - IGUANA_NUMHELPERS = 1; - for (i=0; isymbol[0] != 0 ) - flag += iguana_processjsonQ(Coins[i]); - if ( flag == 0 ) - usleep(100000); + printf("mypeers from %s\n",remoteaddr!=0?remoteaddr:"local"); } + return(clonestr("{\"result\":\"stub processed generic json\"}")); } + diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index f1127ad4e..17e0a0e72 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -422,7 +422,7 @@ int32_t iguana_send_hashes(struct iguana_info *coin,char *command,struct iguana_ return(retval); } -int32_t iguana_parser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t recvlen) +int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t recvlen) { uint8_t serialized[512]; char *retstr; int32_t i,retval,delay,srvmsg,bloom,intvectors,len= -100; uint64_t nonce,x; uint32_t type; bits256 hash2; diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index e952f664f..f2de86f8b 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -480,7 +480,7 @@ void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct ig iguana_meminit(&addr->HASHMEM,"HASHPTRS",0,256,0);//IGUANA_MAXPACKETSIZE*16,0); //printf("Init %s memory %p %p %p\n",addr->ipaddr,addr->RAWMEM.ptr,addr->TXDATA.ptr,addr->HASHMEM.ptr); } - if ( iguana_parser(coin,addr,&addr->RAWMEM,&addr->TXDATA,&addr->HASHMEM,H,buf,len) < 0 || addr->dead != 0 ) + if ( iguana_msgparser(coin,addr,&addr->RAWMEM,&addr->TXDATA,&addr->HASHMEM,H,buf,len) < 0 || addr->dead != 0 ) { printf("%p addr->dead.%d or parser break at %u\n",&addr->dead,addr->dead,(uint32_t)time(NULL)); addr->dead = (uint32_t)time(NULL); @@ -706,7 +706,7 @@ uint32_t iguana_possible_peer(struct iguana_info *coin,char *ipaddr) free_queueitem(ipaddr); return((uint32_t)time(NULL)); } - else if ( coin->peers.active[i].ipaddr != 0 ) + else if ( coin->peers.active[i].ipaddr[0] != 0 ) n++; } if ( n >= coin->MAXPEERS-(coin->MAXPEERS>>3)-1 ) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 009b03075..986d8bbee 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -14,60 +14,7 @@ ******************************************************************************/ #include "iguana777.h" - -int32_t iguana_rpctestvector(struct iguana_info *coin,char *checkstr,char *jsonstr,int32_t maxlen,int32_t testi) -{ - int32_t len,checklen; - sprintf(jsonstr,"{\"rpc.%s testvector.%d\"}",coin->symbol,testi); - sprintf(checkstr,"{\"rpc.%s testvector.%d checkstr should have all info needed to verify the rpc request\"}",coin->symbol,testi); - len = (int32_t)strlen(jsonstr); - checklen = (int32_t)strlen(checkstr); - if ( len > maxlen || checklen > maxlen ) - printf("iguana_rpctestvector: i was bad and overflowed buffer len.%d checklen.%d\n",len,checklen), exit(-1); - if ( checklen > len ) - len = checklen; - return(len); -} - -int32_t iguana_rpctestcheck(struct iguana_info *coin,char *jsonstr,char *retjsonstr) -{ - if ( (rand() % 100) == 0 ) // 1% failure rate - return(-1); - else return(0); -} - -int32_t iguana_rpctest(struct iguana_info *coin) -{ -/* static int32_t testi,good,bad; - char *retjsonstr,jsonstr[4096],checkstr[sizeof(jsonstr)]; // should be big enough - //if ( (rand() % 1000) < 999 ) // if no test active, just return 0 - return(0); - if ( iguana_rpctestvector(coin,checkstr,jsonstr,sizeof(jsonstr),testi++) > 0 ) - { - retjsonstr = iguana_rpc(coin,jsonstr); - if ( iguana_rpctestcheck(coin,jsonstr,retjsonstr) < 0 ) - bad++, printf("rpctestcheck.%s error: (%s) -> (%s) | good.%d bad.%d %.2f%%\n",coin->symbol,jsonstr,retjsonstr,good,bad,100.*(double)good/(good+bad)); - else good++; - free(retjsonstr); - return(1); // indicates was active - }*/ - return(0); -} - -char *pangea_parser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json) -{ - return(clonestr("{\"error\":\"pangea API is not yet\"}")); -} - -char *InstantDEX_parser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json) -{ - return(clonestr("{\"error\":\"InstantDEX API is not yet\"}")); -} - -char *jumblr_parser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json) -{ - return(clonestr("{\"error\":\"jumblr API is not yet\"}")); -} +#include "SuperNET.h" struct iguana_txid *iguana_blocktx(struct iguana_info *coin,struct iguana_txid *tx,struct iguana_block *block,int32_t i) { @@ -441,9 +388,9 @@ char *iguana_jsoncheck(char *retstr,int32_t freeflag) return(0); } -char *ramchain_parser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json) +char *ramchain_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr) { - char *symbol,*str,*retstr; int32_t height; cJSON *argjson,*obj; + char *symbol,*str,*retstr; int32_t height; cJSON *argjson,*obj; struct iguana_info *coin = 0; /*{"agent":"ramchain","method":"block","coin":"BTCD","hash":""} {"agent":"ramchain","method":"block","coin":"BTCD","height":345600} {"agent":"ramchain","method":"tx","coin":"BTCD","txid":""} @@ -506,8 +453,8 @@ char *ramchain_parser(struct iguana_agent *agent,struct iguana_info *coin,char * return(ramchain_coinparser(coin,method,json)); } -/* -#define RPCARGS struct iguana_info *coin,struct iguana_wallet *wallet,cJSON *params[],int32_t n,char *origstr,char *remoteaddr + +#define RPCARGS struct supernet_info *myinfo,struct iguana_info *coin,cJSON *params[],int32_t n,cJSON *json,char *remoteaddr // MAP bitcoin RPC to SuperNET JSONstr // MAP REST to SuperNET JSONstr @@ -524,15 +471,17 @@ static char *stop(RPCARGS) static char *sendalert(RPCARGS) { + return(0); } static char *SuperNET(RPCARGS) { - return(iguana_JSON(coin,origstr,remoteaddr)); + return(SuperNET_JSON(myinfo,json,remoteaddr)); } static char *getrawmempool(RPCARGS) { + return(0); } // peers @@ -558,10 +507,11 @@ static char *getpeerinfo(RPCARGS) static char *addnode(RPCARGS) { // addnode version 0.8 Attempts add or remove from the addnode list or try a connection to once. N + return(0); } // address and pubkeys -int32_t iguana_waddresscalc(struct iguana_info *coin,struct iguana_waddress *addr,bits256 privkey) +struct iguana_waddress *iguana_waddresscalc(struct iguana_info *coin,struct iguana_waddress *addr,bits256 privkey) { memset(addr,0,sizeof(*addr)); addr->privkey = privkey; @@ -569,9 +519,15 @@ int32_t iguana_waddresscalc(struct iguana_info *coin,struct iguana_waddress *add { addr->wiptype = coin->chain->wipval; addr->type = coin->chain->pubval; - return(0); + return(addr); } - return(-1); + return(0); +} + +int32_t iguana_addressvalidate(struct iguana_info *coin,char *coinaddr) +{ + // verify checksum bytes + return(0); } static char *validateretstr(struct iguana_info *coin,char *coinaddr) @@ -611,6 +567,7 @@ static char *validatepubkey(RPCARGS) static char *createmultisig(RPCARGS) { + return(0); } // blockchain @@ -637,43 +594,53 @@ static char *getblockcount(RPCARGS) static char *getblock(RPCARGS) { + return(0); } static char *getblockhash(RPCARGS) { + return(0); } static char *gettransaction(RPCARGS) { + return(0); } static char *listtransactions(RPCARGS) { + return(0); } static char *getreceivedbyaddress(RPCARGS) { + return(0); } static char *listreceivedbyaddress(RPCARGS) { + return(0); } static char *listsinceblock(RPCARGS) { + return(0); } // waccount and waddress funcs static char *getreceivedbyaccount(RPCARGS) { + return(0); } static char *listreceivedbyaccount(RPCARGS) { + return(0); } static char *addmultisigaddress(RPCARGS) { + return(0); } static char *getnewaddress(RPCARGS) @@ -712,13 +679,14 @@ static char *makekeypair(RPCARGS) static char *getaccountaddress(RPCARGS) { - struct iguana_waddress *waddr,addr; char str[67]; char *account,*coinaddr; cJSON *retjson; - if ( params[0] != 0 && (coinaddr= jstr(params[0],0)) != 0 ) + struct iguana_waccount *wacct; struct iguana_waddress *waddr=0,addr; char str[67]; char *account; cJSON *retjson; + if ( params[0] != 0 && (account= jstr(params[0],0)) != 0 ) { - if ( (waddr= iguana_waccountfind(coin,account)) == 0 ) + if ( (wacct= iguana_waccountfind(coin,account)) == 0 ) { if ( (waddr= iguana_waddresscalc(coin,&addr,rand256(1))) == 0 ) return(clonestr("{\"error\":\"cant generate address\"}")); + iguana_waccountswitch(coin,account,0,-1,addr.coinaddr); } retjson = cJSON_CreateObject(); jaddstr(retjson,"result",waddr->coinaddr); @@ -736,17 +704,17 @@ static char *getaccountaddress(RPCARGS) static char *setaccount(RPCARGS) { - struct iguana_waddress *waddr,addr; char *account,*coinaddr; + struct iguana_waccount *wacct; struct iguana_waddress *waddr=0,addr; int32_t ind=-1; char *account,*coinaddr; if ( params[0] != 0 && (coinaddr= jstr(params[0],0)) != 0 && params[1] != 0 && (account= jstr(params[1],0)) != 0 ) { if ( iguana_addressvalidate(coin,coinaddr) < 0 ) return(clonestr("{\"error\":\"invalid coin address\"}")); - if ( (waddr= iguana_waddressfind(coin,coinaddr)) == 0 ) + if ( (wacct= iguana_waddressfind(coin,&ind,coinaddr)) == 0 ) { if ( (waddr= iguana_waddresscalc(coin,&addr,rand256(1))) == 0 ) return(clonestr("{\"error\":\"cant generate address\"}")); } - iguana_waccountswitch(coin,waddr,coinaddr); + iguana_waccountswitch(coin,account,wacct,ind,coinaddr); return(clonestr("{\"result\":\"account set\"}")); } return(clonestr("{\"error\":\"need address and account\"}")); @@ -754,15 +722,15 @@ static char *setaccount(RPCARGS) static char *getaccount(RPCARGS) { - struct iguana_waddress *waddr,addr; char *account,*coinaddr; cJSON *retjson; + struct iguana_waccount *wacct; char *coinaddr; cJSON *retjson; int32_t ind; if ( params[0] != 0 && (coinaddr= jstr(params[0],0)) != 0 ) { if ( iguana_addressvalidate(coin,coinaddr) < 0 ) return(clonestr("{\"error\":\"invalid coin address\"}")); - if ( (waddr= iguana_waccountfind(coin,account)) == 0 ) + if ( (wacct= iguana_waddressfind(coin,&ind,coinaddr)) == 0 ) return(clonestr("{\"result\":\"no account for address\"}")); retjson = cJSON_CreateObject(); - jaddstr(retjson,"result",waddr->account); + jaddstr(retjson,"result",wacct->account); return(jprint(retjson,1)); } return(clonestr("{\"error\":\"need address\"}")); @@ -770,11 +738,11 @@ static char *getaccount(RPCARGS) static char *getaddressesbyaccount(RPCARGS) { - struct iguana_waccount *subset; char *account; cJSON *retjson,*array; + struct iguana_waccount *subset; struct iguana_waddress *waddr,*tmp; char *account; cJSON *retjson,*array; retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); if ( params[0] != 0 && (account= jstr(params[0],0)) != 0 ) { - array = cJSON_CreateArray(); if ( (subset= iguana_waccountfind(coin,account)) != 0 ) { HASH_ITER(hh,subset->waddrs,waddr,tmp) @@ -789,91 +757,116 @@ static char *getaddressesbyaccount(RPCARGS) static char *listaddressgroupings(RPCARGS) { + return(0); } static char *getbalance(RPCARGS) { + return(0); } // wallet static char *listaccounts(RPCARGS) { + return(0); } static char *dumpprivkey(RPCARGS) { + return(0); } static char *importprivkey(RPCARGS) { + return(0); } static char *dumpwallet(RPCARGS) { + return(0); } static char *importwallet(RPCARGS) { + return(0); } static char *walletpassphrase(RPCARGS) { + return(0); } static char *walletpassphrasechange(RPCARGS) { + return(0); } static char *walletlock(RPCARGS) { + return(0); } static char *encryptwallet(RPCARGS) { + return(0); } static char *checkwallet(RPCARGS) { + return(0); } static char *repairwallet(RPCARGS) { + return(0); +} + +static char *backupwallet(RPCARGS) +{ + return(0); } // messages static char *signmessage(RPCARGS) { + return(0); } static char *verifymessage(RPCARGS) { + return(0); } // unspents static char *listunspent(RPCARGS) { + return(0); } static char *lockunspent(RPCARGS) { + return(0); } static char *listlockunspent(RPCARGS) { + return(0); } static char *gettxout(RPCARGS) { + return(0); } static char *gettxoutsetinfo(RPCARGS) { + return(0); } // payments static char *sendtoaddress(RPCARGS) { - struct iguana_waddress *waddr,addr; char *account,*coinaddr,*comment=0,*comment2=0; double amount = -1.; + char *coinaddr,*comment=0,*comment2=0; double amount = -1.; //sendtoaddress [comment] [comment-to] is a real and is rounded to 8 decimal places. Returns the transaction ID if successful. Y if ( params[0] != 0 && (coinaddr= jstr(params[0],0)) != 0 && params[1] != 0 && is_cJSON_Number(params[1]) != 0 ) { @@ -882,60 +875,74 @@ static char *sendtoaddress(RPCARGS) amount = jdouble(params[1],0); comment = jstr(params[2],0); comment2 = jstr(params[3],0); - printf("need to generate send %.8f to %s [%s] [%s]\n",dstr(amount),coinaddr,comment!=0?comment:"",comment2!=0comment2:""); + printf("need to generate send %.8f to %s [%s] [%s]\n",dstr(amount),coinaddr,comment!=0?comment:"",comment2!=0?comment2:""); } return(clonestr("{\"error\":\"need address and amount\"}")); } -static char *move(RPCARGS) +static char *movecmd(RPCARGS) { + return(0); } static char *sendfrom(RPCARGS) { + return(0); } static char *sendmany(RPCARGS) { + return(0); } static char *settxfee(RPCARGS) { + return(0); } // rawtransaction static char *getrawtransaction(RPCARGS) { + return(0); } static char *createrawtransaction(RPCARGS) { + return(0); } static char *decoderawtransaction(RPCARGS) { + return(0); } static char *decodescript(RPCARGS) { + return(0); } static char *signrawtransaction(RPCARGS) { + return(0); } static char *sendrawtransaction(RPCARGS) { + return(0); } static char *resendtx(RPCARGS) { + return(0); } static char *getrawchangeaddress(RPCARGS) { + return(0); } +#define true 1 +#define false 0 struct RPC_info { char *name; char *(*rpcfunc)(RPCARGS); int32_t flag0,flag1; } RPCcalls[] = { { "help", &help, true, true }, @@ -996,13 +1003,14 @@ struct RPC_info { char *name; char *(*rpcfunc)(RPCARGS); int32_t flag0,flag1; } { "makekeypair", &makekeypair, false, true}, { "sendalert", &sendalert, false, false}, // - { "addnode", &addnode, false, false}, + { "createmultisig", &createmultisig, false, false}, + { "addnode", &addnode, false, false}, { "getrawmempool", &getrawmempool, false, false}, { "getrawchangeaddress", &getrawchangeaddress, false, false}, { "listlockunspent", &listlockunspent, false, false}, { "lockunspent", &lockunspent, false, false}, { "gettxout", &gettxout, false, false}, - { "gettxoutsetinfo", &gettxoutsetinfo, false, false}] + { "gettxoutsetinfo", &gettxoutsetinfo, false, false} #ifdef PEGGY //{ "peggytx", &peggytx, true, false }, //{ "peggypayments", &peggypayments, true, false }, @@ -1024,38 +1032,38 @@ struct RPC_info { char *name; char *(*rpcfunc)(RPCARGS); int32_t flag0,flag1; } // { "reservebalance", &reservebalance, false, true}, }; -char *iguana_bitcoinrpc(struct iguana_info *coin,struct iguana_wallet *wallet,char *method,cJSON *params,int32_t n,char *origstr,char *remoteaddr) +char *iguana_bitcoinrpc(struct supernet_info *myinfo,struct iguana_info *coin,char *method,cJSON *params[16],int32_t n,cJSON *json,char *remoteaddr) { int32_t i; for (i=0; i 1 ) for (i=1; isymbol,waddr->account,waddr->coinaddr,coinaddr); return(0); } -struct iguana_waddress *iguana_waddressfind(struct iguana_info *coin,char *coinaddr) +struct iguana_waccount *iguana_waddressfind(struct iguana_info *coin,int32_t *indp,char *coinaddr) { return(0); } diff --git a/iguana/main.c b/iguana/main.c index 3cb3240ad..1183d4fa8 100644 --- a/iguana/main.c +++ b/iguana/main.c @@ -22,6 +22,7 @@ #include "../pnacl_main.h" #include "iguana777.h" +#include "SuperNET.h" // ALL globals must be here! struct iguana_info *Coins[IGUANA_MAXCOINS]; @@ -29,7 +30,7 @@ int32_t USE_JAY,FIRST_EXTERNAL,IGUANA_disableNXT,Debuglevel; uint32_t prices777_NXTBLOCK,MAX_DEPTH = 100; char NXTAPIURL[256],IGUANA_NXTADDR[256],IGUANA_NXTACCTSECRET[256]; uint64_t IGUANA_MY64BITS; -queue_t helperQ; +queue_t helperQ,jsonQ,finishedQ; static int32_t initflag; #ifdef __linux__ int32_t IGUANA_NUMHELPERS = 4; @@ -37,626 +38,284 @@ int32_t IGUANA_NUMHELPERS = 4; int32_t IGUANA_NUMHELPERS = 1; #endif -#ifdef oldway -void *iguana(void *arg) +char *hash_parser(struct supernet_info *myinfo,char *hashname,cJSON *json,char *remoteaddr) { - if ( arg == 0 ) -#ifdef __linux__ - arg = 0;//"{\"coins\":[{\"name\":\"BTCD\",\"maxpeers\":128,\"initialheight\":400000,\"services\":1,\"peers\":[\"127.0.0.1\"]}]}"; - //arg = "{\"coins\":[{\"name\":\"BTCD\",\"services\":1,\"maxrecvcache\":64,\"peers\":[\"127.0.0.1\",\"107.170.13.184\",\"108.58.252.82\",\"207.182.151.130\",\"70.106.255.189\"]}]}"; -#else - arg = 0;//"{\"coins\":[{\"name\":\"BTCD\",\"maxpeers\":128,\"initialheight\":400000,\"services\":1,\"peers\":[\"127.0.0.1\"]}]}"; -#endif - PostMessage("iguana start.(%s)\n",(char *)arg); - while ( initflag == 0 ) - sleep(1); - iguana_main(arg); - return(0); -} - -#ifdef __PNACL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "includes/ppapi/c/ppb.h" -#include "includes/ppapi/c/ppb_var.h" -#include "includes/ppapi/c/ppb_instance.h" -#include "includes/ppapi/c/ppb_messaging.h" -#include "includes/ppapi/c/ppb_var_array.h" -#include "includes/ppapi/c/ppb_var_dictionary.h" -#include "includes/ppapi/c/pp_errors.h" -#include "includes/ppapi/c/ppp_messaging.h" -#include "includes/ppapi/c/ppp_instance.h" -typedef int (*PSMainFunc_t)(int argc, char *argv[]); - -#if defined(WIN32) -#define va_copy(d, s) ((d) = (s)) -#endif - -#ifndef __PNACL -int32_t PSGetInstanceId() -{ - return(4); -} -#endif - -typedef int (*HandleFunc)(struct PP_Var params,struct PP_Var* out_var,const char** error); -typedef struct { const char* name; HandleFunc function; } FuncNameMapping; -static PP_Instance g_instance = 0; -static PPB_GetInterface g_get_browser_interface = NULL; -static PPB_Messaging* g_ppb_messaging = NULL; -PPB_Var* g_ppb_var = NULL; -PPB_VarArray* g_ppb_var_array = NULL; -PPB_VarDictionary* g_ppb_var_dictionary = NULL; -int Handle_iguana(struct PP_Var params,struct PP_Var *output,const char **out_error); -static FuncNameMapping g_function_map[] = { { "iguana", Handle_iguana }, { NULL, NULL } }; -struct PP_Var CStrToVar(const char* str) { return g_ppb_var->VarFromUtf8(str, (int32_t)strlen(str)); } - -char *VprintfToNewString(const char* format, va_list args) -{ - va_list args_copy; int length; char *buffer; int result; - va_copy(args_copy, args); - length = vsnprintf(NULL, 0, format, args); - buffer = (char*)malloc(length + 1); // +1 for NULL-terminator. - result = vsnprintf(&buffer[0], length + 1, format, args_copy); - if ( result != length ) + int32_t i,len,iter,n; uint8_t databuf[512]; + char hexstr[1025],*password,*name,*msg; + typedef void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); + typedef char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message); + struct hashfunc_entry { char *name; hashfunc hashfunc; }; + struct hmacfunc_entry { char *name; hmacfunc hmacfunc; }; + struct hashfunc_entry hashes[] = { {"NXT",calc_NXTaddr}, {"curve25519",calc_curve25519_str }, {"base64_encode",calc_base64_encodestr}, {"base64_decode",calc_base64_decodestr}, {"crc32",calc_crc32str}, {"rmd160_sha256",rmd160ofsha256}, {"sha256_sha256",sha256_sha256}, {"sha256",vcalc_sha256}, {"sha512",calc_sha512}, {"sha384",calc_sha384}, {"sha224",calc_sha224}, {"rmd160",calc_rmd160}, {"rmd256",calc_rmd256}, {"rmd320",calc_rmd320}, {"rmd128",calc_rmd128}, {"sha1",calc_sha1}, {"md5",calc_md5str}, {"tiger",calc_tiger}, {"whirlpool",calc_whirlpool} }; + struct hmacfunc_entry hmacs[] = { {"hmac_sha256",hmac_sha256_str}, {"hmac_sha512",hmac_sha512_str}, {"hmac_sha384",hmac_sha384_str}, {"hmac_sha224",hmac_sha224_str}, {"hmac_rmd160",hmac_rmd160_str}, {"hmac_rmd256",hmac_rmd256_str}, {"hmac_rmd320",hmac_rmd320_str}, {"hmac_rmd128",hmac_rmd128_str}, {"hmac_sha1",hmac_sha1_str}, {"hmac_md5",hmac_md5_str}, {"hmac_tiger",hmac_tiger_str}, {"hmac_whirlpool",hmac_whirlpool_str} }; + if ( (msg= jstr(json,"message")) == 0 ) + return(clonestr("{\"error\":\"no message to hash\"}")); + password = jstr(json,"password"); + n = (int32_t)sizeof(hashes)/sizeof(*hashes); + printf("msg.(%s) password.(%s)\n",msg,password!=0?password:""); + for (iter=0; iter<2; iter++) { - assert(0); - return NULL; + for (i=0; iVarFromUtf8(string, (int32_t)strlen(string)); - free(string); - return var; + return(clonestr("{\"error\":\"jumblr API is not yet\"}")); } -static const char *VarToCStr(struct PP_Var var) +char *pangea_parser(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr) { - uint32_t length; char *new_str; const char *str = g_ppb_var->VarToUtf8(var, &length); - if ( str == NULL ) - return NULL; - new_str = (char*)malloc(length + 1); - memcpy(new_str, str, length); // str is NOT NULL-terminated. Copy using memcpy. - new_str[length] = 0; - return new_str; + return(clonestr("{\"error\":\"jumblr API is not yet\"}")); } -struct PP_Var GetDictVar(struct PP_Var dict, const char* key) +char *SuperNET_jsonstr(struct supernet_info *myinfo,char *jsonstr,char *remoteaddr) { - struct PP_Var key_var = CStrToVar(key); - struct PP_Var value = g_ppb_var_dictionary->Get(dict, key_var); - g_ppb_var->Release(key_var); - return value; + cJSON *json; char *agent,*method; + if ( (json= cJSON_Parse(jsonstr)) != 0 ) + { + if ( (agent= jstr(json,"agent")) != 0 && (method= jstr(json,"method")) != 0 ) + { + if ( strcmp(agent,"iguana") == 0 ) + return(iguana_parser(myinfo,method,json,remoteaddr)); + else if ( strcmp(agent,"ramchain") == 0 ) + return(ramchain_parser(myinfo,method,json,remoteaddr)); + else if ( strcmp(agent,"InstantDEX") == 0 ) + return(InstantDEX_parser(myinfo,method,json,remoteaddr)); + else if ( strcmp(agent,"pangea") == 0 ) + return(pangea_parser(myinfo,method,json,remoteaddr)); + else if ( strcmp(agent,"jumblr") == 0 ) + return(jumblr_parser(myinfo,method,json,remoteaddr)); + else if ( strcmp(agent,"hash") == 0 ) + return(hash_parser(myinfo,method,json,remoteaddr)); + } + return(clonestr("{\"error\":\"need both agent and method\"}")); + } + return(clonestr("{\"error\":\"couldnt parse SuperNET_JSON\"}")); } -void PostMessage(const char* format, ...) -{ - va_list args; - va_start(args, format); -#ifdef __PNACL - struct PP_Var var; - var = VprintfToVar(format, args); - g_ppb_messaging->PostMessage(g_instance, var); - g_ppb_var->Release(var); -#else - printf(format,args); -#endif - va_end(args); -} +struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char **retjsonstrp; char remoteaddr[64]; char jsonstr[]; }; -/** - * Given a message from JavaScript, parse it for functions and parameters. - * - * The format of the message is: - * { - * "cmd": , - * "args": [, , ...] - * } - * - * @param[in] message The message to parse. - * @param[out] out_function The function name. - * @param[out] out_params A PP_Var array. - * @return 0 if successful, otherwise 1. - */ -static int ParseMessage(struct PP_Var message,const char **out_function,struct PP_Var *out_params) +int32_t iguana_jsonQ() { - if ( message.type != PP_VARTYPE_DICTIONARY ) - return(1); - struct PP_Var cmd_value = GetDictVar(message, "cmd"); - *out_function = VarToCStr(cmd_value); - g_ppb_var->Release(cmd_value); - *out_params = GetDictVar(message, "args"); - PostMessage("Parse.(%s) cmd.(%s)\n",*out_function,VarToCStr(*out_params)); - if ( cmd_value.type != PP_VARTYPE_STRING ) - return(1); - if ( out_params->type != PP_VARTYPE_ARRAY ) + struct iguana_jsonitem *ptr; + if ( (ptr= queue_dequeue(&finishedQ,0)) != 0 ) + { + if ( ptr->expired != 0 ) + { + *ptr->retjsonstrp = clonestr("{\"error\":\"request timeout\"}"); + printf("garbage collection: expired.(%s)\n",ptr->jsonstr); + myfree(ptr,ptr->allocsize); + } else queue_enqueue("finishedQ",&finishedQ,&ptr->DL,0); + } + if ( (ptr= queue_dequeue(&jsonQ,0)) != 0 ) + { + printf("process.(%s)\n",ptr->jsonstr); + if ( (*ptr->retjsonstrp= SuperNET_jsonstr(ptr->myinfo,ptr->jsonstr,ptr->remoteaddr)) == 0 ) + *ptr->retjsonstrp = clonestr("{\"error\":\"null return from iguana_jsonstr\"}"); + printf("finished.(%s)\n",ptr->jsonstr); + queue_enqueue("finishedQ",&finishedQ,&ptr->DL,0); return(1); + } return(0); } -static HandleFunc GetFunctionByName(const char* function_name) +char *iguana_blockingjsonstr(struct supernet_info *myinfo,char *jsonstr,uint64_t tag,int32_t maxmillis,char *remoteaddr) { - FuncNameMapping* map_iter = g_function_map; - for (; map_iter->name; ++map_iter) + struct iguana_jsonitem *ptr; char *retjsonstr = 0; int32_t len,allocsize; double expiration; + expiration = OS_milliseconds() + maxmillis; + //printf("blocking case.(%s)\n",jsonstr); + len = (int32_t)strlen(jsonstr); + allocsize = sizeof(*ptr) + len + 1; + ptr = mycalloc('J',1,allocsize); + ptr->allocsize = allocsize; + ptr->myinfo = myinfo; + ptr->retjsonstrp = &retjsonstr; + safecopy(ptr->remoteaddr,remoteaddr,sizeof(ptr->remoteaddr)); + memcpy(ptr->jsonstr,jsonstr,len+1); + queue_enqueue("jsonQ",&jsonQ,&ptr->DL,0); + while ( OS_milliseconds() < expiration ) { - if (strcmp(map_iter->name, function_name) == 0) - return map_iter->function; + usleep(100); + if ( retjsonstr != 0 ) + { + printf("blocking retjsonstr.(%s)\n",retjsonstr); + queue_delete(&finishedQ,&ptr->DL,allocsize,1); + return(retjsonstr); + } + usleep(1000); } - return NULL; + //printf("(%s) expired\n",jsonstr); + ptr->expired = (uint32_t)time(NULL); + return(clonestr("{\"error\":\"iguana jsonstr expired\"}")); } -/** - * Handle as message from JavaScript on the worker thread. - * - * @param[in] message The message to parse and handle. - */ -static void HandleMessage(struct PP_Var message) +char *SuperNET_JSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr) { - const char *function_name,*error; struct PP_Var params,result_var; - if ( ParseMessage(message, &function_name, ¶ms) != 0 ) + cJSON *retjson; uint64_t tag; uint32_t timeout; char *jsonstr; char *retjsonstr,*retstr = 0; + if ( json != 0 ) { - PostMessage("Error: Unable to parse message"); - return; - } - HandleFunc function = GetFunctionByName(function_name); - if ( function == 0 ) - { - PostMessage("Error: Unknown function \"%s\"", function_name); // Function name wasn't found. - return; - } - // Function name was found, call it. - int result = (*function)(params, &result_var, &error); - if ( result != 0 ) - { - if ( error != NULL ) + /*if ( localaccess != 0 && (method= jstr(json,"method")) != 0 && strcmp(method,"addcoin") == 0 ) { - PostMessage("Error: \"%s\" failed: %s.", function_name, error); - free((void*)error); + if ( (retval= iguana_launchcoin(jstr(json,"coin"),json)) > 0 ) + return(clonestr("{\"result\":\"launched coin\"}")); + else if ( retval == 0 ) return(clonestr("{\"result\":\"coin already launched\"}")); + else return(clonestr("{\"error\":\"error launching coin\"}")); + }*/ + if ( (tag= j64bits(json,"tag")) == 0 ) + OS_randombytes((uint8_t *)&tag,sizeof(tag)); + /*if ( (symbol= jstr(json,"coin")) != 0 ) + { + coin = iguana_coinfind(symbol); + if ( coin != 0 && localaccess != 0 && coin->launched == 0 ) + iguana_launchcoin(symbol,json); + }*/ + if ( (timeout= juint(json,"timeout")) == 0 ) + timeout = IGUANA_JSONTIMEOUT; + jsonstr = jprint(json,0); + if ( (retjsonstr= iguana_blockingjsonstr(myinfo,jsonstr,tag,timeout,remoteaddr)) != 0 ) + { + //printf("retjsonstr.(%s)\n",retjsonstr); + if ( (retjson= cJSON_Parse(retjsonstr)) == 0 ) + retjson = cJSON_Parse("{\"error\":\"cant parse retjsonstr\"}"); + jdelete(retjson,"tag"); + jadd64bits(retjson,"tag",tag); + retstr = jprint(retjson,1); + //printf("retstr.(%s) retjsonstr.%p retjson.%p\n",retstr,retjsonstr,retjson); + free(retjsonstr);//,strlen(retjsonstr)+1); } - else PostMessage("Error: \"%s\" failed.", function_name); - return; - } - // Function returned an output dictionary. Send it to JavaScript. - g_ppb_messaging->PostMessage(g_instance, result_var); - g_ppb_var->Release(result_var); + free(jsonstr); + } else retstr = clonestr("{\"error\":\"cant parse JSON\"}"); + if ( retstr == 0 ) + retstr = clonestr("{\"error\":\"null return\"}"); + return(retstr); } -#define MAX_QUEUE_SIZE 256 - -// A mutex that guards |g_queue|. -static pthread_mutex_t g_queue_mutex; -// A condition variable that is signalled when |g_queue| is not empty. -static pthread_cond_t g_queue_not_empty_cond; - -/** A circular queue of messages from JavaScript to be handled. - * - * If g_queue_start < g_queue_end: - * all elements in the range [g_queue_start, g_queue_end) are valid. - * If g_queue_start > g_queue_end: - * all elements in the ranges [0, g_queue_end) and - * [g_queue_start, MAX_QUEUE_SIZE) are valid. - * If g_queue_start == g_queue_end, and g_queue_size > 0: - * all elements in the g_queue are valid. - * If g_queue_start == g_queue_end, and g_queue_size == 0: - * No elements are valid. */ -static struct PP_Var g_queue[MAX_QUEUE_SIZE]; -static int g_queue_start = 0; // The index of the head of the queue -static int g_queue_end = 0; // The index of the tail of the queue, non-inclusive. -static int g_queue_size = 0; -// NOTE: this function assumes g_queue_mutex lock is held. @return non-zero if the queue is empty -static int IsQueueEmpty() { return g_queue_size == 0; } -// NOTE: this function assumes g_queue_mutex lock is held. @return non-zero if the queue is full -static int IsQueueFull() { return g_queue_size == MAX_QUEUE_SIZE; } - -void InitializeMessageQueue() +char *iguana_JSON(char *jsonstr) { - pthread_mutex_init(&g_queue_mutex, NULL); - pthread_cond_init(&g_queue_not_empty_cond, NULL); -} - -int EnqueueMessage(struct PP_Var message) -{ - pthread_mutex_lock(&g_queue_mutex); - // We shouldn't block the main thread waiting for the queue to not be full, so just drop the message. - if ( IsQueueFull() != 0) + char *retstr=0; cJSON *json; + if ( (json= cJSON_Parse(jsonstr)) != 0 ) { - PostMessage("EnqueueMessage: full Q, drop message\n"); - pthread_mutex_unlock(&g_queue_mutex); - return(0); + retstr = SuperNET_JSON(0,json,"127.0.0.1"); + free_json(json); } - g_queue[g_queue_end] = message; - g_queue_end = (g_queue_end + 1) % MAX_QUEUE_SIZE; - g_queue_size++; - pthread_cond_signal(&g_queue_not_empty_cond); - pthread_mutex_unlock(&g_queue_mutex); - return 1; -} - -struct PP_Var DequeueMessage() -{ - struct PP_Var message; - pthread_mutex_lock(&g_queue_mutex); - while ( IsQueueEmpty() != 0 ) - pthread_cond_wait(&g_queue_not_empty_cond, &g_queue_mutex); - message = g_queue[g_queue_start]; - g_queue_start = (g_queue_start + 1) % MAX_QUEUE_SIZE; - g_queue_size--; - pthread_mutex_unlock(&g_queue_mutex); - return(message); + if ( retstr == 0 ) + retstr = clonestr("{\"error\":\"cant parse jsonstr from pnacl\"}"); + return(retstr); } -/** - * A worker thread that handles messages from JavaScript. - * @param[in] user_data Unused. - * @return unused. - */ -void *HandleMessageThread(void *user_data) +char *SuperNET_p2p(struct iguana_info *coin,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen) { - while ( 1 ) + cJSON *json,*retjson; char *agent,*method,*retstr = 0; + if ( (json= cJSON_Parse((char *)data)) != 0 ) { - struct PP_Var message = DequeueMessage(); - HandleMessage(message); - g_ppb_var->Release(message); + printf("GOT >>>>>>>> SUPERNET P2P.(%s) from.%s\n",(char *)data,coin->symbol); + if ( (agent= jstr(json,"agent")) != 0 && (method= jstr(json,"method")) != 0 ) + { + jaddstr(json,"fromp2p",coin->symbol); + if ( (retstr= SuperNET_JSON(0,json,ipaddr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jobj(retjson,"result") != 0 || jobj(retjson,"error") != 0 || jobj(retjson,"method") == 0 ) + { + free(retstr); + retstr = 0; + } + free_json(retjson); + } + } + } + free_json(json); } + return(retstr); } -#include -#include -#include -#include -#include -#undef mount -#undef umount - -static PP_Bool Instance_DidCreate(PP_Instance instance,uint32_t argc,const char* argn[],const char* argv[]) -{ - int nacl_io_init_ppapi(PP_Instance instance, PPB_GetInterface get_interface); - static pthread_t g_handle_message_thread; - static pthread_t iguana_thread; - int64_t allocsize; - g_instance = instance; - // By default, nacl_io mounts / to pass through to the original NaCl - // filesystem (which doesn't do much). Let's remount it to a memfs - // filesystem. - InitializeMessageQueue(); - pthread_create(&g_handle_message_thread, NULL, &HandleMessageThread, NULL); - pthread_create(&iguana_thread,NULL,&iguana,OS_filestr(&allocsize,"iguana.conf")); - nacl_io_init_ppapi(instance,g_get_browser_interface); - umount("/"); - mount("", "/memfs", "memfs", 0, ""); - mount("", /* source */ - "/", /* target */ - "html5fs", /* filesystemtype */ - 0, /* mountflags */ - "type=PERSISTENT,expected_size=10000000000"); /* data */ - mount("", /* source. Use relative URL */ - "/http", /* target */ - "httpfs", /* filesystemtype */ - 0, /* mountflags */ - ""); /* data */ - PostMessage("finished DidCreate\n"); - initflag = 1; - return PP_TRUE; -} - -static void Instance_DidDestroy(PP_Instance instance) { } - -static void Instance_DidChangeView(PP_Instance instance,PP_Resource view_resource) { } - -static void Instance_DidChangeFocus(PP_Instance instance, PP_Bool has_focus) { } - -static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance,PP_Resource url_loader) -{ - // NaCl modules do not need to handle the document load function. - return PP_FALSE; -} - -static void Messaging_HandleMessage(PP_Instance instance,struct PP_Var message) +void iguana_main(void *arg) { - if ( message.type != PP_VARTYPE_DICTIONARY ) // Special case for jspipe input handling - { - PostMessage("Got unexpected message type: %d\n", message.type); - return; - } - struct PP_Var pipe_var = CStrToVar("pipe"); - struct PP_Var pipe_name = g_ppb_var_dictionary->Get(message, pipe_var); - g_ppb_var->Release(pipe_var); - if ( pipe_name.type == PP_VARTYPE_STRING ) // Special case for jspipe input handling + struct supernet_info MYINFO; char helperstr[64],*helperargs,*coinargs=0,*secret,*jsonstr = arg; + int32_t i,len,flag; cJSON *json; uint8_t secretbuf[512]; + mycalloc(0,0,0); + iguana_initQ(&helperQ,"helperQ"); + OS_ensure_directory("confs"); + OS_ensure_directory("DB"); + OS_ensure_directory("tmp"); + memset(&MYINFO,0,sizeof(MYINFO)); + if ( jsonstr != 0 && (json= cJSON_Parse(jsonstr)) != 0 ) { - char file_name[PATH_MAX]; - snprintf(file_name, PATH_MAX, "/dev/%s", VarToCStr(pipe_name)); - int fd = open(file_name, O_RDONLY); - g_ppb_var->Release(pipe_name); - if ( fd < 0 ) + if ( jobj(json,"numhelpers") != 0 ) + IGUANA_NUMHELPERS = juint(json,"numhelpers"); + if ( (secret= jstr(json,"secret")) != 0 ) { - PostMessage("Warning: opening %s failed.", file_name); - goto done; + len = (int32_t)strlen(secret); + if ( is_hexstr(secret,0) != 0 && len == 128 ) + { + len >>= 1; + decode_hex(secretbuf,len,secret); + } else vcalc_sha256(0,secretbuf,(void *)secret,len), len = sizeof(bits256); + memcpy(MYINFO.privkey.bytes,secretbuf,sizeof(MYINFO.privkey)); } - //if ( ioctl(fd, NACL_IOC_HANDLEMESSAGE, &message) != 0 ) - // PostMessage("Error: ioctl on %s failed: %s", file_name, strerror(errno)); - close(fd); - goto done; + if ( jobj(json,"coins") != 0 ) + coinargs = jsonstr; } - g_ppb_var->AddRef(message); - if ( !EnqueueMessage(message) ) + if ( IGUANA_NUMHELPERS == 0 ) + IGUANA_NUMHELPERS = 1; + for (i=0; iRelease(message); - PostMessage("Warning: dropped message because the queue was full."); + sprintf(helperstr,"{\"name\":\"helper.%d\"}",i); + helperargs = clonestr(helperstr); + iguana_launch(iguana_coinadd("BTCD"),"iguana_helper",iguana_helper,helperargs,IGUANA_PERMTHREAD); } -done: - g_ppb_var->Release(pipe_name); -} - -#define GET_INTERFACE(var, type, name) \ -var = (type*)(get_browser(name)); \ -if (!var) { \ -printf("Unable to get interface " name "\n"); \ -return PP_ERROR_FAILED; \ -} - -//PP_EXPORT -int32_t PPP_InitializeModule(PP_Module a_module_id,PPB_GetInterface get_browser) -{ - g_get_browser_interface = get_browser; - GET_INTERFACE(g_ppb_messaging, PPB_Messaging, PPB_MESSAGING_INTERFACE); - GET_INTERFACE(g_ppb_var, PPB_Var, PPB_VAR_INTERFACE); - GET_INTERFACE(g_ppb_var_array, PPB_VarArray, PPB_VAR_ARRAY_INTERFACE); - GET_INTERFACE(g_ppb_var_dictionary, PPB_VarDictionary, PPB_VAR_DICTIONARY_INTERFACE); - return PP_OK; -} - -//PP_EXPORT -const void *PPP_GetInterface(const char* interface_name) -{ - if ( strcmp(interface_name,PPP_INSTANCE_INTERFACE) == 0 ) + iguana_launch(iguana_coinadd("BTCD"),"rpcloop",iguana_rpcloop,iguana_coinadd("BTCD"),IGUANA_PERMTHREAD); + if ( coinargs != 0 ) + iguana_launch(iguana_coinadd("BTCD"),"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD); + else if ( 1 ) { - static PPP_Instance instance_interface = +#ifdef __APPLE__ + sleep(1); + char *str; + if ( (str= SuperNET_JSON(&MYINFO,cJSON_Parse("{\"agent\":\"iguana\",\"method\":\"addcoin\",\"services\":128,\"maxpeers\":16,\"coin\":\"BTCD\",\"active\":1}"),0)) != 0 ) { - &Instance_DidCreate, - &Instance_DidDestroy, - &Instance_DidChangeView, - &Instance_DidChangeFocus, - &Instance_HandleDocumentLoad, - }; - return &instance_interface; - } - else if ( strcmp(interface_name, PPP_MESSAGING_INTERFACE) == 0 ) - { - static PPP_Messaging messaging_interface = { &Messaging_HandleMessage }; - return &messaging_interface; - } - return NULL; -} - -//PP_EXPORT -void PPP_ShutdownModule() { } - -#define CHECK_PARAM_COUNT(name, expected) \ -if (GetNumParams(params) != expected) { \ -*out_error = PrintfToNewString(#name " takes " #expected " parameters." \ -" Got %d", GetNumParams(params)); \ -return 1; \ -} - -#define PARAM_STRING(index, var) \ -char* var; \ -uint32_t var##_len; \ -if (GetParamString(params, index, &var, &var##_len, out_error)) { \ -return 1; \ -} - -#define CREATE_RESPONSE(name) CreateResponse(output, #name, out_error) -#define RESPONSE_STRING(var) AppendResponseString(output, var, out_error) -#define RESPONSE_INT(var) AppendResponseInt(output, var, out_error) -#define MAX_PARAMS 4 -static char* g_ParamStrings[MAX_PARAMS]; -/** - * Get the number of parameters. - * @param[in] params The parameter array. - * @return uint32_t The number of parameters in the array. - */ -static uint32_t GetNumParams(struct PP_Var params) { - return g_ppb_var_array->GetLength(params); -} - - -/** - * Create a response PP_Var to send back to JavaScript. - * @param[out] response_var The response PP_Var. - * @param[in] cmd The name of the function that is being executed. - * @param[out] out_error An error message, if this call failed. - */ -static void CreateResponse(struct PP_Var* response_var, - const char* cmd, - const char** out_error) { - PP_Bool result; - - struct PP_Var dict_var = g_ppb_var_dictionary->Create(); - struct PP_Var cmd_key = CStrToVar("cmd"); - struct PP_Var cmd_value = CStrToVar(cmd); - - result = g_ppb_var_dictionary->Set(dict_var, cmd_key, cmd_value); - g_ppb_var->Release(cmd_key); - g_ppb_var->Release(cmd_value); - - if (!result) { - g_ppb_var->Release(dict_var); - *out_error = - PrintfToNewString("Unable to set \"cmd\" key in result dictionary"); - return; - } - - struct PP_Var args_key = CStrToVar("args"); - struct PP_Var args_value = g_ppb_var_array->Create(); - result = g_ppb_var_dictionary->Set(dict_var, args_key, args_value); - g_ppb_var->Release(args_key); - g_ppb_var->Release(args_value); - - if (!result) { - g_ppb_var->Release(dict_var); - *out_error = - PrintfToNewString("Unable to set \"args\" key in result dictionary"); - return; - } - - *response_var = dict_var; -} -/** - * Append a PP_Var to the response dictionary. - * @param[in,out] response_var The response PP_var. - * @param[in] value The value to add to the response args. - * @param[out] out_error An error message, if this call failed. - */ -static void AppendResponseVar(struct PP_Var* response_var, - struct PP_Var value, - const char** out_error) { - struct PP_Var args_value = GetDictVar(*response_var, "args"); - uint32_t args_length = g_ppb_var_array->GetLength(args_value); - PP_Bool result = g_ppb_var_array->Set(args_value, args_length, value); - if (!result) { - // Release the dictionary that was there before. - g_ppb_var->Release(*response_var); - - // Return an error message instead. - *response_var = PP_MakeUndefined(); - *out_error = PrintfToNewString("Unable to append value to result"); - return; - } -} - -/** - * Append a string to the response dictionary. - * @param[in,out] response_var The response PP_var. - * @param[in] value The value to add to the response args. - * @param[out] out_error An error message, if this call failed. - */ -static void AppendResponseString(struct PP_Var* response_var, - const char* value, - const char** out_error) { - struct PP_Var value_var = CStrToVar(value); - AppendResponseVar(response_var, value_var, out_error); - g_ppb_var->Release(value_var); -} - -/** - * Get a parameter at |index| as a string. - * @param[in] params The parameter array. - * @param[in] index The index in |params| to get. - * @param[out] out_string The output string. - * @param[out] out_string_len The length of the output string. - * @param[out] out_error An error message, if this operation failed. - * @return int 0 if successful, otherwise 1. - */ -static int GetParamString(struct PP_Var params, - uint32_t index, - char** out_string, - uint32_t* out_string_len, - const char** out_error) { - if (index >= MAX_PARAMS) { - *out_error = PrintfToNewString("Param index %u >= MAX_PARAMS (%d)", - index, MAX_PARAMS); - return 1; - } - - struct PP_Var value = g_ppb_var_array->Get(params, index); - if (value.type != PP_VARTYPE_STRING) { - *out_error = - PrintfToNewString("Expected param at index %d to be a string not.%d", index,value.type); - return 1; + printf("got.(%s)\n",str); + free(str); + } +#endif } - - uint32_t length; - const char* var_str = g_ppb_var->VarToUtf8(value, &length); - - char* string = (char*)malloc(length + 1); - memcpy(string, var_str, length); - string[length] = 0; - - /* Put the allocated string in g_ParamStrings. This keeps us from leaking - * each parameter string, without having to do manual cleanup in every - * Handle* function below. - */ - free(g_ParamStrings[index]); - g_ParamStrings[index] = string; - - - *out_string = string; - *out_string_len = length; - return 0; -} - -int Handle_iguana(struct PP_Var params,struct PP_Var *output,const char **out_error) -{ - char *iguana_JSON(char *); - char *retstr; - PostMessage("inside Handle_iguana\n"); - CHECK_PARAM_COUNT(iguana, 1); - PARAM_STRING(0,jsonstr); - retstr = iguana_JSON(jsonstr); - CREATE_RESPONSE(iguana); - RESPONSE_STRING(retstr); - return 0; -} - -int example_main() -{ - PostMessage("Started example main.\n"); - //g_pInputEvent = (PPB_InputEvent*) PSGetInterface(PPB_INPUT_EVENT_INTERFACE); - //g_pKeyboardInput = (PPB_KeyboardInputEvent*)PSGetInterface(PPB_KEYBOARD_INPUT_EVENT_INTERFACE); - //g_pMouseInput = (PPB_MouseInputEvent*) PSGetInterface(PPB_MOUSE_INPUT_EVENT_INTERFACE); - //g_pTouchInput = (PPB_TouchInputEvent*) PSGetInterface(PPB_TOUCH_INPUT_EVENT_INTERFACE); - //PSEventSetFilter(PSE_ALL); + if ( arg != 0 ) + SuperNET_JSON(&MYINFO,cJSON_Parse(arg),0); + //init_InstantDEX(); while ( 1 ) { - sleep(777); - /* Process all waiting events without blocking - PSEvent* event; - while ((event = PSEventTryAcquire()) != NULL) { - ProcessEvent(event); - PSEventRelease(event); - }*/ + //flag = 0; + //for (i=0; isymbol[0] != 0 ) + // flag += iguana_processjsonQ(Coins[i]); + flag = iguana_jsonQ(); + if ( flag == 0 ) + usleep(100000); } - return 0; } -PSMainFunc_t PSUserMainGet() -{ - return(example_main); -} -#else -int main(int argc, const char * argv[]) -{ - char *jsonstr; - if ( argc < 2 ) - jsonstr = 0; - else jsonstr = (char *)argv[1]; - initflag = 1; - printf("main\n"); - iguana(jsonstr); - return 0; -} -#endif -#endif diff --git a/iguana/mingw32 b/iguana/mingw32 index ed1e15c4f..ea3a9299b 100755 --- a/iguana/mingw32 +++ b/iguana/mingw32 @@ -1,5 +1,4 @@ -TOOL_DIR := /usr/local/gcc-4.8.0-qt-4.8.4-for-mingw32/win32-gcc/bin -MINGW := i586-mingw32 +include ../mingw.path LIBS := ../win/libcrypto.a ../win/libssl.a ../win/libpthreadGC2.a -lws2_32 -lgdi32 include mingw diff --git a/iguana/mingw64 b/iguana/mingw64 index 3937e43db..15defbe70 100755 --- a/iguana/mingw64 +++ b/iguana/mingw64 @@ -1,6 +1,3 @@ -TOOL_DIR := /usr/local/gcc-4.8.0-qt-4.8.4-for-mingw64/win64-gcc/bin -MINGW := i686-mingw64 +include ../mingw.path64 LIBS := ../win/libcrypto.a ../win/libs/libssl.a ../win/libpthreadGC2_64.a -lws2_64 -lgdi64 - include mingw - diff --git a/includes/ccgi.h b/includes/ccgi.h new file mode 100755 index 000000000..c0f2f99e0 --- /dev/null +++ b/includes/ccgi.h @@ -0,0 +1,64 @@ +/* + * C CGI Library version 1.1 + * + * Copyright 2009 Stephen C. Losen. Distributed under the terms + * of the GNU General Public License (GPL) + */ + +#ifndef _CCGI_H +#define _CCGI_H + +typedef struct CGI_varlist CGI_varlist; + +typedef const char * const CGI_value; + +char *CGI_decode_url(const char *p); + +char *CGI_encode_url(const char *p, const char *keep); + +char *CGI_encode_entity(const char *p); + +char *CGI_encode_base64(const void *p, int len); + +void *CGI_decode_base64(const char *p, int *len); + +char *CGI_encode_hex(const void *p, int len); + +void *CGI_decode_hex(const char *p, int *len); + +char *CGI_encrypt(const void *p, int len, const char *password); + +void *CGI_decrypt(const char *p, int *len, const char *password); + +char *CGI_encode_query(const char *keep, ...); + +char *CGI_encode_varlist(CGI_varlist *v, const char *keep); + +CGI_varlist *CGI_decode_query(CGI_varlist *v, const char *query); + +CGI_varlist *CGI_get_cookie(CGI_varlist *v); + +CGI_varlist *CGI_get_query(CGI_varlist *v); + +CGI_varlist *CGI_get_post(CGI_varlist *v, const char *template); + +CGI_varlist *CGI_get_all(const char *template); + +CGI_varlist *CGI_add_var(CGI_varlist *v, const char *varname, + const char *value); + +void CGI_free_varlist(CGI_varlist *v); + +CGI_value *CGI_lookup_all(CGI_varlist *v, const char *varname); + +const char *CGI_lookup(CGI_varlist *v, const char *varname); + +const char *CGI_first_name(CGI_varlist *v); + +const char *CGI_next_name(CGI_varlist *v); + +void CGI_prefork_server(const char *host, int port, const char *pidfile, + int maxproc, int minidle, int maxidle, int maxreq, + void (*callback)(void)); + +#endif diff --git a/m_unix b/m_unix index 1b6fdf124..c39b4ce45 100755 --- a/m_unix +++ b/m_unix @@ -1,3 +1,3 @@ git pull cd iguana; ./m_unix; cd .. -cd SuperNET; ./m_unix; cd .. +#cd SuperNET; ./m_unix; cd .. diff --git a/mingw.path b/mingw.path new file mode 100644 index 000000000..93e0dc13e --- /dev/null +++ b/mingw.path @@ -0,0 +1,2 @@ +TOOL_DIR := /usr/local/gcc-4.8.0-qt-4.8.4-for-mingw32/win32-gcc/bin +MINGW := i586-mingw32 diff --git a/mingw.path64 b/mingw.path64 new file mode 100644 index 000000000..c66bf9aef --- /dev/null +++ b/mingw.path64 @@ -0,0 +1,2 @@ +TOOL_DIR := /usr/local/gcc-4.8.0-qt-4.8.4-for-mingw64/win64-gcc/bin +MINGW := i686-mingw64 diff --git a/pangea/main.c b/pangea/main.c index 25ae66cf9..951795872 100644 --- a/pangea/main.c +++ b/pangea/main.c @@ -13,6 +13,7 @@ * * ******************************************************************************/ +#ifdef STANDALONE #define CHROMEAPP_NAME pangea #define CHROMEAPP_STR "pangea" #define CHROMEAPP_CONF "pangea.conf" @@ -33,4 +34,11 @@ void pangea_main(void *arg) char *pangea_JSON(char *jsonstr) { return(clonestr("{\"error\":\"pangea is just a stub for now\"}")); -} \ No newline at end of file +} +#else + +char *pangea_parser(struct supernet_info *myinfo,char *method,cJSON *json) +{ + return(clonestr("{\"error\":\"pangea API is not yet\"}")); +} +#endif diff --git a/win/libcurl.a b/win/libcurl.a new file mode 100644 index 0000000000000000000000000000000000000000..768133dde72faa01a71ca8c80679c43ddc3daf63 GIT binary patch literal 604532 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%0Ai^IdFFyx>Ub!_Lb-*}yU@$~s+ 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�D!+C%%?=aV%ZOF|j*H4r~ey-D;b`#3Aim zrnhbWyOVEP^@T-_ec3EQ%_{4z+bCS)NYr~+LGA=sHXbTqe+sT^x- zC=0bTiPoY#(vv#PV3F&05^okpu0Qa0T4#F#Z@S1O&;!g}NpusHFFz)kN_~$uK=l{$ zMph%e|DskQD-PIpbfj+`WK-L5wC#hHJ~0aFhWr~c1ci`Ma}0|%<2SX9P@?Z~WtX(C zo{?FVoPJErHszp2RF#FH>M@>*ID417QhPR0VT_Y|-{V9~bee$s#^EsI5w*+gZ~Y=4 zm@C<3@)zlACr0J>$<*oMOEBM5TVV3*7myK}+h*>T8kNTOaZklQFg+pL1J@oC zx#1)jHhoJEUy+T+0=tQM#_!w=zw11|vI07N%Ua|2x4`fO4UC)C2uJZr3nNKi3Dg)j zp%}^dVv})G4V03^q0qXsA~((*uS6*!uB!x8??K+Gu01hw!_)dgR3g_s36#!X!lcU3 zQ7T2}W04zQG<1|m*Hz*?I!8xta05EJ&_{Nt=NmPXqM+=2HnArnA-(Y~j8OJM>n^&` zHqpd8EbN;B3lr~5i}aoapbqsWIU@6$wFdjzteP?L@#%VpxL3Y5s0^#*gHlHV{P7`{IBhk91kbBb}h8!iQjen5YkGR4knZ^u@mM^LO&aOz`O%hEUB~-EmDSLWm z4@|NyG=4fwWA7*Ex18ESH{7>`c;xSVVOYD^gG`%bsj;S^xlm?Lc9O-=r z!p_D`Bxhjb4g6OLD0w=1?w1TI{9?7HPs#5g7ArQrV4CE`N@^V*-?e-j3E{QNrVuM% zOZ_A4Lk$6%K#gMl)+>GzLy51DPjY^N%)`2D6Ypk5-n*>C9 z$B}+gNjDNoy~Fa8$Nw$rf3(&iJGVjS^9w%ktR$J>NW%k!Y1yn;jFv_R`C3X<$@J+& zcd9t$aVK>wAEvxr_ifVlSg6L((Z<&%aS@uMJfGZ9<`1Y9i9Al7cOBD=k;e3JI0x&?Wd~fVbiYB!jY=J`@p0g z;9t-mA`6R0WRoSqT}+C9^Law!s&F5mjaQ$7~-yCikq4bLji^xLdlRwbm zE9j0#eiPez$q=)-uOOeQYm9zuwNQOS$e-d`R7I==5NptX2l_c;Cw^@uW+hI_Jpyd1 zcWOCSKAl~uW->5JF)2lVPvRkMTB7d&L&|K5HdbDJ(N@jQQ7r?cIRkKv(qJ-gO6>$@ zwbki=pLG!wKOBgxw^fbIYsQjj{3D9h2~-c`=V9EL0hD(=6y{=l1?r0(-WeB7GkJBY z@<|o4*b(WQ=;cPmR$Hi#)Hg+X9XDM?Ha<(artVVV9-10IT72599#_rcwGhbQs!HH-)#;N| z(ah+~j@ih%KQV2^E}R}ciqn6v>`^9dNna%~`3nd{l@LYZ6PP9f>6R+hOZqdut#X=b zQLbz*tCUNLu+=WkRd`QVT}y6Fvv!*$;%<`C#N2YL>DG^k^d3bU3g;MqhEijI32D0i zBVa}*!{6{2&fz*BkJl=qpJFPJk~r*P)DlXf%+?uwq)LEsvbtWR_gnZRpn8tfmw}nh zm)yZcJ0PG=`7*LQ()R_tAxn!TJ&2TXA#s5Wiuu|=4h8EbN!-nZ$Z83=PAX97kzQ2= zf-QFbXtXe^UsIdEMui+n4r&28(*pEqQ%Y*H?Y*2o=A?n)c)A%Nl8h*9SxhCCzSrVw z6OYu84%nlGM3bC!eUl3d$8zT(TSj+Ow#gwsYmHwO$IxVO;W5k%_GzZH764z>OsPQb zp^eeIiW+ZfcxtA)VgiXa#cx_CX#33G6+e&Mj)_fzi04dr;|il!dio9Wn$Jw=}mJI|1(5)!4Ewl(P5^+RPrdl6_XPsp7L-p||pAU-c}6H;xGcdO4~ zj`1jW%iDrbbsm);^%Vw1D$vP6Y|7#)3Nl% zZ0U(TW&D(+#_HSbaq|vb5@SY+QrZ^cZz2HSTgCS_wdAQM>E}1I*U50u&U2gn^}n$D z>$Mfol4K{)#WX9W!yFuVhD#V=KmAquJOW~qtes2RZ3*?qKI@j7>!mmRz@O!e^vYmX zu(w6))~JVOB{?g7ShV`vzZsn#_Kj8TnVB;Lnv>eTkwjCNrUA zZJi20;1T3cu*?*sAID7Fe!!LAO#qbhcCMMn-ZkegFID@&CN5s$HQ`q|kKjd4j zF245L4vRm7Z6pN~6T$u}4&Op)zS)$CDR8^7ZL|e5KcT71DS(XdvzaxEo%eJAYtkPg8SEWg0*>Q-H)w8JB`}ySo>sQ0ClW+Yt^Xt#} z8RGz*9c^vp6Plt;-4$4yjjrmRDD^aCEX=lJ=G7SDiRz?Sm#p1(cVgTLo4QTS(Q|!! zwj=x+D+ll9w|+%ub97l($I9k&qOD8Yo7ym8+gTCC%#Y|{mDj`__Y}Vdh5nYBkpeQz7vDg|4U2e?dC^lKGY7#!W)VKA@CEq$ACc8IH-Le~-Wf%6( zdcG8^S4#sEvVYF2P2z+Lrc_y99W7D&vFs`g31MV+dGm_Z7^1>@;D3l_4w=wgtXRpY za&*m7%=}{Lp$U`4(Yi|-qQ)AM;bD{!*`89)UzSn!6F8a4?`Ckn;9DE9_M93DHSxWS z_a9E-1Sr2Ael;fpM?;|~zk?@n8qSo1@l44`X)s`(X%zRdq~4D>kv zr77iye$D^s2B&kIGYoVF(76UuUpoaTKeP_$JcHW=RAq2~6+mAD($To$&@LcL<#@W8 z8iT6_vN+k0v$*d9%`~pjuum@mG|S+g2C6ksF}1JGKxYBXHqh^ZY>s}J??Y!7_|Re? zt>Wc}wgAmBA-)G>^YIIy^9^nsb9i$NvT}5>S5VO9Aw?0QxS_g~s1@ zpoGZ9tcs5IsN*26`RHmigzHSeb8dHv?T^pxXo7lRyg$?inDPf?ok$ zVsI}3U233rfNZLY&@(M`A&?E*1Y|>84YbgN*bKDDK(_(eH2)UJ%3uD`zHA%~WN{|~ zeZqwJERZepj~we$=?1ctFGUNG#21IUfocqN2auK6^N#anEe2#I@hd=8_{$G{6Ug%F z=RlUquLIYiz;)j7zC>IGWXtzsCvaZT#CAK-VgtPZWaGUQHPpuTZ6KTa@0}P5ecJfj z1yp08J3rv_@85tvV{oqmH5%wMAN2j*3be%Fc9#079|BrxaFrkOapwZr95n&i*nSRl zuJJeS!?alj>ISmuy9vm0;~PNBjq84(&lu=LTCpYrl>s#ys2ZrnK$is2mw_ymJAo{f z>ZtGU6F`>Uqd+#zzdjio_lC;!Q$nFu12q6ye=R^(N?f27#KG8Qk3g?m3`U26t>(DAaDC2|zZsj|17*76Ww{*L6Uh2Kpw@=M3~4pe_TQHX#(E zD@4||0L2XSAdpSL4}mQ2Uj>RA*D`v5)ds2svgNS|$j0_9pf$#I)@gpK`heCN+?@gL z37{(sE>Z5s_I;qM3~m_6=Ho*X{Wz+Dt~Rb;0lLOOj{{jbIQFA{>7NE$1SL3#iFZz7D9_KuxFn>01wEa5Zz7QOcUb^k1!VK_ zQ~>=B$mXc*3_nC0(0L{;Qzo+$(LhO{Mgx5p=vo8q2eST-s`OidzXq}){{Bqg70+Ie z6Aqw)04fZiq5vumAet91EX{!jMFR-Y^>F0@1S3712KZ!;mar&*iUUYHL9ApCxh>H|nC8P>HGNF|fc@BLZ*pvf^- z74t%}_}pmBG_*8PNFj?69f~JZ!!M1Q$ya?AWcEYzOG8UK-1iwY3 z`7quV^9`Vbd6{wjEtoy{Nyolhe(;{g{41Cx5J_Wx2c~A6#SoZh3{>wOpNY{hd`}i; zBACz-nSN%2Dayhu1Tz@{R9u#Ft1yvFOb?ivEX>Vd`inCC{Ehq^or%##wtKTMdxW81 zPsjBeFf_Iqm{){3J`md_2_>2I_1Rg#6VhM1ZEnI@D;*-8afJ zCa|E=XslUf1;%8$CFxm`pTxXlcMP-Kos%#!Z_Ut zwqZNHam~{9v_1RGkeX7Rh5d8vm@k*PbnDjAWUTIIU}R1_D`HKjE+_UYWhOtvqcIB> z$C`cyPIlL^MZOfDwdqJQ?Wue55-TR`v%&@pHz7R}EjyePF(s^R$OpM{Ft9;)9vtY#-obGRB4sU5Syj z&SqxBV^>j>SNn#|ET!eG@%EMP>B}ohCaa+kYi?ZDmc`6W=jJXR68HcqOAr zL@dilaYi{=6T<;FZSuO}?N<7zMG`G;Uzj>&YF4;_&o+cFrWusq71g-Z+_jcP&U$Xd ze4CfWcQ^F5oXg~}e((7+1DagZbs5I(tjRaezOmAmzDdByj&;wp|7Q3jUl}(HXc@zc zaugeKW|hN|@H{njh~r+x_HdS`Bal@0SjX~?wh`#SsDCyIlU?N8qo_L@BnFMG>6+F} zX^+IMTG`mt-fd?4y^w}bMzdk+Hdi7vH)bGhPCa&;qBYAZ89oe|Y!iEFN+a-X+$iA1 zZV6|*XWrDHMJCT{njE6oggka-)lkn@(+aLxFsn6w{;0?%zm2AK@~~c&X>O#|@$1ym z0jTnAdnxdtv=`v*0aU`p(Q$|y6^E%fo#?9&KSXJ-!I9@>c%pycd#JZNYcekh~ zG*vE$7I|B~lDuT~6xbd2+9P`Bj#ZQu7hrtVy1;#Y>Zh>pDV0bwlDYY?+7lU z>FjDA!MxU3tkds+JnG%Ln#SlF9wKNxh}VPtCZn5cXPOK<0>7wB`1)MjTw`JisD=8M zzFkFaABD6m?H-7vX$sDm9L;(%KP_zkPpPUh{?3{*x!MLu+sk}{d72Ly6)@Lc=Dldx z&*N6+X@E?}GCrtZk~v1V+GFnjn$YC_Nz1rDwqZT^BO-w;IEHc?Pw9DDvR7~j(J^<7MD zg<_{b{$Y>&u|E0nKKY?<;4|@WV>spK6aHdiXw1ZCEBl?Jhpung%=uk*czlQiiyLeb zF=P5cD2KM4Ym!#F6Gu5P!()$!2M(kc`*`fvNq*&K`8}ZhMkTH><^WXWUMI9RWz?`s zgnc1tTb~Q^zzo=Zq(9gyUwwD-Umg{gxWWz{lMe09*}i%~;?O&hz9e|ytXP{$jd^VQCVA0B?IW3rc#BjIY zS|C%l2NF-{#gq8$+s;!H-$-nqwmmiG)w>50_gg$(wgE-?sTjTD468VuVxI-^Gp$iF zvB|An?A)h#*iCLMopJEl8B{Gwtzg4VP(JP!QzWxty*U`2Is(_6{OBI=I-8H=-I5aR zRC|iI+4!xK(K<@h`&R}SqpNEc+gK^9xlY35_ciuW9m#hMCpcbYbEC66&GL->RsysSTg=o*T zlQ=;|9m0pDnVJkKlWkKtPAa2tW>*nJCG+RY<%betBa9Cf06Du~{m#gm7x{935OtbULu!GZZimqX?>)MjShmLQEk0x!FnA)6_Y;}?_I2gN1Y4PMI zH2AbmHLx$wtI~mWymTSk^COvIzM(L?Q-46@{Q4f0GPE+PX+SPDfajjId2Xcd^VB@L zs<}z+gN$(!P4%=_Ibrjoaw98`CZOh^^L9)ea7_K<43Q~hQxPmFrNEFm-H?&h6eE1T zc(C`a)HPC>Cg}WV;*POIKk!)tMEl z0Af#Lq1|~=x5Q2CCz(`|l4RmHKoo+P&h@6brvyP*3o@P9@7N(Pf$>W=aq?_wtwHq_aJ)x=h_Rj7DG#O34N9WAjn z7)PHJs$^nmn)yF@QdQ^}(#x_DtA5ga^pzhvg*p~7&}l$y+hEaXdVs45a6LfB8h_sh zVi^g4s_HBj0lffZsr(M8#NcKkn>LOs0;m(nhPV%iWgNo(C~(~yxDEwS0diug6am?= zrv%W=KvL%NLthV|dw^_O9spuP2yuLax?61g>FxmaG{vD;fh^?;=EW_QDFHMc$Wo~R z()w_5=o0}h4rFurXaEfYSq>e|e6)?D7RaW#56H&$#Q=8<`l!X-2xR>ck)fh@UWgSf z_&M71VUSUN#*gt(&VQ*pY0NCXiU^;^XwA1i3$qGL4SbRxn9igAs|entF?WLLB!w1Z zW=rLf2U4W)4%{SB=_ga87S+*mk*Q6SfYJSQaoOimOBeRyM^!rac_ag6bMa&j<`+4b zU*}+cA7I1{rZ8G`E2BmF{P|OsAAO7$8_eVTIWY%Qk%bxk?uK)+{G891;q@eLX)lQo8sFWjrm*9TsQ0|rsIszpisvOgs+@)JscjtX zezDC6uSS)<)EPZT^85d3RH=5VjkM*f0`buNgfyyDFDFf92Hy;KBzsoxs@zM5cRU6? zF&$hJ*la{Gd6qkH*bctOT1`i1_x%qIs@Jr`LTlB_T#OhiG`*vD3KX5E?6Ao74-*fa zYZ*pVfMjkVZRM!ksm0Ra(38Ga!Z(JOh91iJF5vsS_M3yO+vvxKpYA^y8}eggmqc#- zXDDJKJKo^dPNuK6=^Ln3vxupl)G7@a0;>)RuUtR9f1C+_)cQt+J%O+=;3WK?o9RFC z#$mA`6CgDK{6KA00fEKAR=vaKtgMX@Ue!+a>{7-bG{-tpuSn&1V@&)9ZbJpf1nwYU zpHU;a=PM+&+M1+1I`}mFSYl3drJF>`V^%n-XPc8FjJwZcnf1 z7+7FZ6MYn805~MfwHa99@zX;R1F&H-B+hhetDt&HGx9G>nKD$qU@j?{;uX4sovpqP#7=WR zsjI@G?&T(n=-3+7h!g0sI-goF{B%YZ)1%6FqdzH|{z>j93!z_o(lyXx zD0t~9#i1r3i@O0x`cZM{Ye1IDt^mTpv>N##HF0V`@>oeM2 zHQFPgujiN6I;QfqAKz)rMZ%D(G-ffFwDyv#nIvhO)gGsx|31w`?W{PG{d8n}l60QW z=U|)wy<>JM6WV0D@f(OaI$Kx8eTT0hzSxy5B%7;O<* zcStXP*FHaY>1cUJ$I2CcLafGMG1<|MvNY7qMcXSmV#Aca8S#Y7Tz1onE16j~J^g$3 z@l&TvvFbp&k8ek~->r||O3|s0zgLPXkLu5VM;||OM!1T2)_HL%UOno&-|q~wXPHrB z*%+tIFd*rg4o7mTGq;-NGSx<9Y+BW3e5CwFCOxz-+}3BHhfg z)*Xa!xeoC2uCT=2xy3REp>3QX+vxnlA145Gyo^SAU+0@Hq78i^?b2)G^QMK~+EVc=`Gw9kl@p>`tO%F42 zQg5pEvaf%e8dWZcF&z(atMjq(&sM^xkzlW9yh0Pcp9WWfX;ZSrG{iiP>6!WXn^cU+ zyKXj|j2cc#xpRAjv79XPIGOr8lm)1?1(Z!r`;JGmfZ`(>#QJ0(01kPERJjl{9iMUV zbT~6}f>GCGLW$V0Q-um`n+fpJ2U8;CO_4quu-v6$Sx?l#<%kM#53(bq`>7@Jp_jwA!RGy^6vJfF$Id^QKOHo*A3 zUv__}A?othF3*?m=leOK9?QY}CJUo+`^f&#^g1irJL4>(TT!$N%k1LH!C4P>8-O+` zHLh6I$-nOI&ZW!!#pA3&F6nNPM-xfc(lzYd`doaezaOD{DV><+?V1>Fo46ZIFSd#< zZRwQ|G+pzmrJWpqjrr^BCeU)m%k1JAHIRwRlD0JczI0VnRmK?jecZBr_L))psE4#& z&<$`f-|+OXyiEBE*gOJ=YK=2JfiuE2{Yj7ZzSmYW zU&Ob{Gpjwur8SEuNQ7ogN1HuR11-&>+*TOV!u)q=7VlSM7^#6&khZr;qecjNRQ}RH zw4xSs?=S1+8>0=yjK*v$@7a+JT76meU{#R;r*U_C%X$c6`cJQ8NIV|P9lb4FP&rH# zMd&S2I>-XT_+#tXhn=1794#~Y7;MbOj&WXa&Jyl;)DGv6G?rk5ICMa3#;(*LGzqsz zojZ^*BkkSdeR=;h;^3Ath8PF)kx+*Q!6(HzYOz)$LH_CGoxF!5-4FQg4tk5q35>L{Y4!-=y`gyNW zoq92Lb9#aNUTlj`B;;f6$iZZf{I=mfYA;4Z6>PJ;xbE!C?RWaL`-r{HNCAX!m-dOfFj3{`dDpRgSVJ>V62R6&S7m(d^0dxYR2$9@V}7 zpZcFF(o^cCP3hC4{^yE?mE3c{euV=XkCpCbC=^PzF&<(RCO<>7A`e^~a(Ck5-zC$Nk;gtW%f~eh#!M8NK^uFTg8S2~jTk#po`L^*W954u?PB842^dTS06U+IMoEo^^JU&! zsnfUGwNT`-lAgEDu~+i2>OP+#YP9mT%9n9h%dV|WC5+w4+&Nz6)Wmt2dsuL!_i#nJ zD=+a*IC9evnC&lyC+-=yJM!2`CS-g!hJQ|@BQ3!K*<|O5ME{uT9g*v{i~8?HfBQ=X zn~rvVpfYEswR>Z3b*yk^+DmGNK450QDXfp5=IadG7|#x~ z|IN2GM0t<|k(xhvpEd?~Hi+16Fd6&EC9zw$!y!PL0j|d*67TaUVs>FA-a03~9Ai&s z*!;x@ca^;avuf*R&ykljZt1e+ECFWYLZLH26!ObA=khId4d2p4ibD+ui^VMhvbe?o zH<51Aj*r&>S%2$*tiRJ~g)9zIS-Qq(y}kTM*O0uMo?M8~>HPNdOKTt63+VUTb_8rWA|DYKqI$AFs%>bF&0E?XGaFNCs#rsfb;UZ^C~jw0|F8Fczr8nn zv&-(@^7DK4-c{ApD$TGvJ$ihMg%ItO8LjtTg3_+udxnIc=bQZgJ9_U--PuIM%-{?L zDw{naUJ0@$wB&uyOVeV7rOAd8Z+>dc;n?HtA&0M~ZzQ5M3n%OIJTC>t%YG)>UiB{4 zG2zvmB;GvCILg#|MtHyXR12V{Ue~GCqbF1(zurR?AASa0g|ln-Mtw1ty7tIBAkk$@h8I-e;eg1gp0%zx(^+&L<~loweWAUVHDg-_~Ax^HXr?7^oIZwP0wtsbio? zFb`sIVr`~X>yCjBE@7xGf?182I|c>?^ENS?p2z==fj zFL$U2JtsMhpLVEyITbnl{nvQ`A!AukkCw3hJbC{c#NPXlp%ngm1 zcfX}`LlqvQE6_2JDWM~D+;TwTJ5Ml+h}oPC&m9Aw7R*B7)J2TD8Xln$i~q56(EGZ& z4jluf;+Hz(*5+SJeAfzQA}}2Tvlu!`#|THOv6nGO=@__9d^~`(tjz-wW}aX^D`A!~ zOcfFj*2+yC9RvB|+9PTFQ2bvlnA3&A&(i-|L>A1At (RFj0CnLF;o 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 TT8 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 z zA+1m-VviC9b%6R2=66HpF{$?{VN$yb6Bna45Zz%BmQJuVnUn4?3Sb#vuUw?bWA!qK zJ(V7ix_wBek_3av5!+uOg4E&6B)ALHFI}^ZFIO`!C)Q@YT1u(V#|B@GI=RyKI-I#I z@*b?zniYj6M&aSKZw!XHaC~-zM&-Tm=fuswJRCLvbI~h#E zT>(=hD#a=#^CX7wY*5cdew@**S4EO9^-LJLEtj%z(d0+bNQ!Qip^Ko^=y|dC4;&U; zhl3wJ^FiRjoQ8$FEbeegPR&y5V+GxRd$*X&%(9{0je8{?U!&7LvNxVM-OX}O#zQcX z9I%ab<+N)?5#=!n|1J*KOuHiCCyv9%V;v=Yy_ouFG3PYDYx$v`iY%UYq$YK{s#5&8 zjeF%W^^7&sj=o2zH)~DbNA)J@zawnzYs4KCL)Sn`JD#Xp20AMjlN%H8q+GFj&Ixbw zJLZZ4bwyg{uA=iEt)(1p@f*l@2Z9NkyX~$ioKBVuBr6}ZIM(}dZP02QP1F`%ehb$N zNRia3D=b9&cf0%Fm?;Tz&q(3%k4E89ULuAE0__6I%Vluez>(ZeYagHF%a8n9fO_C# zuR#KnS+E}vcErssybwW`V|H<6+#-Q0oXC&b4>d1D)G}~~BQmhT^)C~_X2omG=zKJE zb>>GFAymE8eCjw*Zqr)Cx5|LpiwS-#G=hAUy384FnK01rH>LE^4T;xjPH)D)ShG z$uTnM6Py&oVN2#Skg_;+%1ZINmJxArAQqoN6;ADrukn;Mj6Ea`wTyIVylw2Gbjf{R z@fekjQUr|=9G%ojR_efcs@!5>DA8gajP(>pNN4SHnFnbZbHd==9UmCwYzV5&A*Z&$ zoNjXYk#I+^QF`_Jcg~XNTvHvb!!+_Ns7@~5vqQ0eARRTz(v}=4x&|bnTW$tuR3!x@ z05~C(0OI^H#3xXPccvE90ZvRUnC5~6y0HFPmKfI?(I`)XX_r75V`wUsJOX*An@WkB zvvs7R`*Z2^nyLuu3cA-+mu{+3;ELe#QsCiTcY!UaCUW0%BbNDdSw@k$sV16~ zdJ-b)QkzV$F4x@s8%UpfVwDKO;@4ChO>V@QUJer`di)!#DD}v*I43);btIP%3+OWE zncPx?plnrYATKnDvT_+Tj;2%3U+FeHvfUzS#_Cy<}xCACT1v;|;vac+caFQH7eUh^&UEc4x{7M1H$Q z$Yna-;{)AgVar2C!i7sG`Mf*Y_n#W5bysE1&@fxA4;OodMI+YIlF{7^;rK`8FYcfJ zM>dTd+!uqSaS<=Q7yANU0^BU=Qr_Wrp4Swbt>Lqgz&cFb=7(}O@$lW^=SL^W!`s4~ zY~e7*G*I*Nv%!iIr#En}gFrzx&=ywV=4L0#4oK*1MdST?rh zWFsdE#KPkH6r}GdZ^Z=85)+JsZxM!z>{NffkCxUxMc$B2D^ww2u7QYL?Nhb^S17M> ztHLeLw?1VR}%BHxb-TIW6>>nA62_m zS}MxqBoh>ulZfua1YTVG642?Rka1^xpg}U6P0>uP+G@@o+)=qpv{X1WC*hD0s7DQ@ zalvMR963q_jnST=%}!JriMMDjgHVv+JUW5-snXP<;*4%e3HmQ6I4Lr0xkp0vqvrtq zuFQYf{8-&Z5TT>Y!b55|lP$N#Ao=g2Nr1bz+EE;aWuNnrs|^n-HKe5dzcrZQ+ConC z%lE@>`p5--sx_Yj<2n~9gdCxB8EeBZa&(lwWh_}Vfv_sA6?!AyBXuoGdA8jQyOz`w zEKRue2A$*9gtVY@DUKhTN}GY$gTH+sGX^0oA9VAP%*XLhLhgrlZd+?f3vyC(w&j{j z(%8O-EORB?Wz0lK`DaUPJ|iY67T?qBp341V**65hyOB?QH|w3>8a!hz#ed`-MC-Q( zA{n#>4cXS9QS~Dz(l1c18ZiT))w7CEE25yw{@>B!UZFU|Yv&fV4{r_&5?3PTceKpP|Yr| zCVQizZr#3_OKT3I4nvmRyiV?_#8gD3DESLNiCssLR*iTp2z8SIPBf|6mtQ-4TED(5 zy7kvbJHu+Jn#8VRrm^At(bH@rhXjj>FA?#8&G3j zQaAe=V$&@k@5m?1%EAv15Lr6?0Gc`J9`=LQ$j+X1>m_#n~FrS$~b^ zsk-^|qfzHQT=U}=y6%Gombl9~U70(J(&_;t#GJ`d>8O*VQuzz{8f9|i+r>VmTc?`P ze?Ncj>;((YxTyJTcX+IO#nNlr-Lan@&g4|Juk4Cnrz3EkI(yb0Tgk@D(rel|HgrXE z$2Dx4G2X|pl|bwf+o-_Ax^F91c&RV z9k4jGi)0~m2Yn3JipW=iEbOBp^i&A_B7}YuLiIFLlU!KcRbtRVAfr5yqHECmfGm!w zKo&y*I@D3dmCQdmt;% zCs6RMJTCw;${c0%seClV4TQLRfh@MKgt#X{=rEAQQG^b((bFj(gBpP>Mez{Y2V^0h z5BVeGPWg+eg zAd}0dfQ<6t&{gMx%(V*0q^2`K7RP5o=m8+3{QmMllFNW5yL8+T;+_VwIGzWx5T~Ih zZv52%8SaV@>HsqNJsU!kIMHJvYJn`o0wD8u7m$^!5>E7(zqbQfI?e&IbX)~wVdFqn zhCUzSc7(VhNLYH$2eJ_DKt?&v%P4OIGAeh3u3rGM5Zgo7XG7N)fGq4GAPo?yYz$Z| z9VY`>Et?wR<^xT1{yKo(=cKzfbbS%XIGseK7H=IdXO@^4|U>%TAo)JP9gwTQz>INb>Y3mDdpAK;kggBi6in$bhC&c|UgmB0^Q8C*6 z6!Ig^YxpmM799i6Mf@+JMa^P5!EC0T%wj$PCO8RUp|*h;q|M0sc@E63Jk0OGG*bJs zexgO_zvp43Ze%3hMGv^JVLFX=bDSYXdbvds;mTUWN7O+0RB?JF>G zvDKP29c^e(c6W6+P@E4x}-JIIoy%L47@@FE#=ToqrvqO%e0ar;~mU%kqGGBqf;e>_(k z*7W4KRbE*dh+kQ+yVfzRffAoAfwYRw`qrN7TI zHtt&55nQ33qub|#qp+&$-^O>ZygKK0mp8xPH{Cr*;M}+i9AdX#$cA`sG{7S+M#fJ*a6v}zlF}`TfI++g)0p5 z&MJy-J@)YfrAI%rXM|lrkEJ^=lD((LeYXhZ+ktc8$3(YYR`eIbN1xmi*kKjDa<1Wt zegh;oUF(}QvVKVH?VnXNYW%oIw|=XCO#cN%smC8bIN|Y3dH<}j{TGbcGq`}|aP87a zNdgPhKk6^-UsQx?;mm}`hsyg~iu>n{jc)yR|DrMd^NvbA`}i+i*p_kq^Gg14kCvm9 z3k>YtdM1t0M?s_N%FNh z5A#XBc7>SSG9`A$7HNGY|M~xF^!Itljyk?zNYGY$4)<#MU4g!*o|XT7PF?;t{;wY4 zKkpm=;kP@Zk{f|TZKc_^Y*h~e?N%O zs%!C$0}cDUo3+xJ%4%`!xncaqy&}nu*&f#Ui}QV8TmQz%Sh4@7I&IrMKJ;D}N%Eys zy5}4=x6VS3au-|EzD7gha7oWgsr^I$7PP9iqnvhTKHQa1L!a>X45Vl^f$b7S>1e`d znYKH$DWimVB>|TtWDAINWE#JAvDEptBVHg66NE38HeY;X8gc zF)A#(?lE{T{TWE5AqF|qYcXwP@=D&c;rK4Rq<%A0l`T(fmN`duAm1Pyoa%GT_K)MU z=QDoL$A?Q3!(*{t3zE!RA!=Ozv6)W-==1n!QdSG1AJ>TlA6K#SSvAWm7+w*tF{+JP8$N zxQ9VC(70oltcKeTtyQa>JY7DxeIqPn_Oh}2*uM~4<~$0^V^0e@ThI4KNXjurH}=#>bP@y*A6Cn~=X^k0Hr0wRBQYCOS3gTh}ezk7fX zo>D>POTs<-dtWb&-uyXv-1@i+fTR~o(s5C`O<`XYbhDr@3;HKPS`^E43%XfQ2at^d zw_m52WR>3kmU)fL-tgPc{CDk?Y9hD15RihbBEw)QvU8uq>VCSN+Z9mvPVCh68JV96 zQi?KD5JOnsxb0^jN^ULp;X;l_li%d+ZJMSu^7V?oZr!UQwo}HaQI|L&C=fwoXN}gb zo@)jcyHhg7jRXpc!3#%yiylNleC&@f+3iC3!QxNv+a$_X&hSJF>zsOBgs2B7a4#HC z`kX`B^_HXwJ<%5R0U<+v$bj;`q3;cPpUGjKvjB@oyd`hDgh3jccW2%QGH9Q6)+y=3 z@y~j9WBF+CFQ-yp=5YO=D1SLC-3xJYJfIxwyRJHt*pcgCj3(G}d5fj^oosk4?U zjQTAUIh}v1WnYvA-Aia@2p46ZyJ_%|lZ|%qGb%>}^hidS0sA-ZRpMMPVyr-dBON*D zu)bKT%$F)%NF-3kNt+M9bj7Cz9%d9ll-vAZAo}sOL`N6wdIi*A)mv>>MUVDvP>Qg$ z>urERW@{?j<8TgYg?HB>qLr2PXmYWNt+W(L5btV9oow-vdvY^{q@v^*P2LV=DOUu^ z7v(BZ&QZUUUtIu{RM(O?Tg-oDn~kd;YM~@dVt|ELbo<#=CAA)=~VDH?3oN$1-pY zvJT9%MYcH{J1bbKPW$hvpm6ta^kL4cf~)m4JR~kQ)z1S)2Z(! zUS15bAVH-!;a_~j2u8a=CYR&f#oHhCpoK;o7G}OHaIP;`(QrW(W9Z)}P_0~ZT2yY} zY_y<5RP468aAA1LT%dcr*oJg#BmRjem5nk*K8@nqz=)yFFM-ipKSwaAxn={7!#k+z z!9@q|#1*XSh?LJl*WiZ7?6d;GMw3_IJ!q*3qH5J5sr15H%J&NyWkDYMPWvdN6;1vI z|Ad{7zc6{~L%2igQPZST+oU=h5RIeieLT9!ALd@C9rD`SZ~|AE-2+tr-8Ipn^DX}q zdy4A6+uab|S$sl6EdJ|(hXZQmsl&7pNV;tDp`EIbiux9^Wb(eSdGv^+DD53DA}_AH zbHLY+f)%Ax>4ha7rIDyY{dM4wO|CVoDaz>TT))4B)Q%LfWUinw%8{HXgrPFOCIH9L z;40{6uG(YYBkLz)kqHE?qRSk|F%X<}yGlqY<%^5V<&w@Del*ZnX4j8y}(h6n1_s>ivxiSQnwln8vf28CBnmPGqyBF?+x zx1u?4!Jj#`wzh^It%@5GE_Zi7^}N$}?Hh)2{0k6X_b=*^#HmZoAd8%w9v-`c(mK3d z^d&5PL}x!8o!v=S38b5;B%HE9fs{V0{{S?41~uzjBsP-njB8pXXl950cQAfLdA}eD zzGOv3>x(3_&fVgnIRY0ZN;1UOkUDg5e@x-{ZpzKc$HW#ca*hpF7J9R2X0ZcOYH=Oxjb*WhN! zU^*0M`#tP`t(X=M;lZWC@@CsaB6S($7XjxX;G)1!AbWVDn^)%g%?RrcZxlz9PeMKM z2A9Mq#7E#8&l0^vl}_$aA<~l<-e2jlhEVxf{5|9o@UiV={AV7bFHY<{q|9*$+GsFg zmWXERiOdSMc$%laOHtA+Ya|!Q+I6z9;RevkjUWc^)|bg=-BmVKQod7TJ@T_Bu~X|7 z44h9rk@z@r5d#sODme z$}>%UGprD@l!0R&Gn>9gIHxP!7)|~bB{Z%UgMxQDg>}BSNs9tN&EBT{_)9$w+#;$f ziasUvB2OOde}h8($zn^3+G(k=t0R|+vJ;%X#b6D(8#%azuISgG02RG;W~nN``#2cE zXX5bb(Y|W|2-v8ApJ4`xPPBxeC!nFR=85E*y!d!UZ*eYkm)*Anbp=u_@}GFGUo;1d z9s$Z}V09^oCNzCW07Sxc{K<~eBbJfb~%4l<1VcS);phN7X zOuaiDW0ql%Z`N(&<@Da}l(;wo->iOa6x-ls?1P$ zi7Pi^7bz$73u8_F>WJ}rekw$;KZw^q=>cxkNQ3Ef@b(6jUs`nSQbBSO^lqPExwFU{ z>jo;*29lM%a7;oQIgMyFp4)%!2FKhBJux{2#VeZBeE=}fqMmdo&82d8(P$i9u8@A2 zaP2EIk0nY;F0MIxYa_VFG&re!WoVK={vR%iesVW9F6zm&=&eta+9XQ>Pw*zTYPIG8 zmHL|0?w;?kK}^Oh4v=KrVwj$0Uw;7v<1DD_vGna%U8-#nAduZi@kP3lIL1A&{D* zZc9=Fa9^!8^)=q$7G)a?amyh~gf-s%)kwYX6%yVVO@4&t6KqvZSD@bL(LIWVMZHzx z2*x7bIInR+HWfEqjzj4!HXxTqA?0z7wvO7J{fSqntn=VsH)^jE|Ama9EMD#Bo- zN@9?lgShQD&;Qfjx5rmiTy5`YfIwq|HMO)wJt%0BgA%Dj--I<~ zaEAqCc#lut&lEt*6CCz0eGL;Oj@X9t71__DB*jWCnmK2nP?kf`9VS zw-pARp4T@Abpknky@0PjUGZi?-_()t72Bj!O|(4jYFOT$lR~Ar4W;1&%D&?{lSwX-Ctp5j%Q7(fp5lEt|Re@{`Hw{8ddehUsO_;V%*?dd^`LOmOL$qZ7GtNF9EyW0tuM$ zAF*FU>z;D^Q-ygVJX005Mp%uxA43gv1nDLW6)QCj*B1YmDpY?A6|5!Jc4zbR z?Zo!Hb$#q2KZQ-setX_=?*0qg3FO_CT|h(r6xndIBzf4U?__2jx8|>?^x{G6g=z{_ z9Y$hK+jGwFE9@JA5cYx9m&{9+4AJ*-iJ98Zx&Fc>YpF2w_$b>X2)!7mLJh~ z6T7h!5*~n7ARxurYBmG=&bR<0`_{a5=fX|!xQVvsl!9G%?o~*S+L-HXh%mpz zMPqw_Fj-rNKm3sdIbI!xC0o?&7HVQg+b3T|Mk;KzMY$^W7W@xKc1&XP(c9!*{4d1i zyrVA{3Zxa|`X0>MFNGE+8x)}!Pj4{u6~d+onv>jOd;Nid6r`fXaA+IBa?kQc&6qXW z$NO&>rVPo`!}!TXHjStnS~)Of5^Ce|W)Wt6?hwRg7)~gqf{9%9H<`3F8*2^aWGUT- z%50*kAN&K;12c;{!Z(XD&#~}$kz>V`1ypf8{eiC+?}DX7K{HjuG|f)%jB>20eXQ^G zydS2TXY%SwrjT6E)b4o(oj2|CpytZC-=h#L+Xi)VnYvha^Qox(R4wWeWptx|FYa~L z-2rdrYu#duYI;|Jsf#=;`js}<9NWogC^LJOAu%L+*L<>I?t^^e0&^*5 zhuMnhC7u=>f!l}umBTju^zFmu8XELKEsrxO;`4rVjl3KPXx#=^-NHM~eFxxP2e0f{ zIMk(6uy5=U=qX1toW?r-oGC@a-GQ}4#aPjJ+*D4)0Pcs_mn4<`iHMof0!pPL4K*>C@zb_ zbl!#mw;V-%O|}e3_DC7gfJf`CI~a2d*^2NF$;5Ye`fBRBzay{meBBz9`=k^~CuO>u z6zkzN*x?W~%Dv}4XJm8nSUV)^vE4e^uUc8|U>A}-ARs%=$QI|*AvWOw7_BIJyhe>^ zhfg7f)#Ht4@f}Y;#He`j$b_*B#U7%?;A;Gp%gFV6v|TWQ&Y!aUtt`E1q-;Umu(rs8eCle5iSY(?Kv&5BAl}|b{%T}dB_RiNg%sJFtn8qb;v8FKyRGb?hIWoE zvK29Wi1Ve2glR-YzlEw-Y|Fd+ z{=~znYKSrS(^++OjyQiIhx53Ze}&rwB>p1n(#&dZ&43VVq%fJfRhNyPu2+lD^zr|dVRn& zMTYf4q}ac1Y!6aLGWqO5@E3{6-yHKdo3m~)lg!Pbx;5uI9!+Z|(zN?wI$*I9gEtA6 zz>lbC1t+q0UKyN#r^?_ei0EE|0rOQ^II-#vda^c_(`R-sU0-_j^ z)Rq^_!@V&q8fMw3%VG@1<&VOT%9t|80_awj$Q?`d#1@!5$7i8VDmL@u50-K5l@|lT!cw$<_w0>9Ro$)x}`_~GQ|mJZ}8pm^oK{B#QVajOh%ezHm+X| z*q2vc-_I~vrp6EY=KQIlLsI7ZyMW!`o=m1x&qQ3$=exB%hrI3%dE-v7tqW(N$&gjL9RK4D1ouG^DCzP zB^t_33w?91SABD@-uG}D@(2X^qNFdPnmYYcb$G7q`~DF2jQJv`W+RwJUaVx%E9y$e z@!2|@T)V)&|KcVdQfp8~u>)hA=9~DYM)DN^z6WH$NbP4Np+Rr9dQ@OPH(RL}`NRO3 zF|FO&m$K@ddohg0S%`^U!aB=5T%eeYQ{~G)^-Wkfxt<#ZG3W%n&7(7@dJ-a*&v?9_ z*VhY6GR{{uj>vC54hBe_^0X*e%+MXIA^+os$1tT4S%%VHRz>8(_A0TSX5Z(Jbsb{y ztATZ=BZM*6_}k655K8hcU&(^+BN$4*wwYk zx=~qw39651@}+j(x&lP)-NMPg7mq+gHz75{NOp;@lrAm*yXk(@yyVp#%ZCCNv(WC% zC=&JjKB+Z==NtZ#N+&nD@6E(Uev6g2ZV^U_<(bem)YY_xvpBj2S_9r&x$lXk!Q7PD%v%4VO(KVuHAT~Ria+12AusqE3wF%A z($LrYB8dO6h*Xh2>9;Psm~X=_>97A~a+!Mm32ptXPv=sZFWdWm&TnGyPBcKs9 z{zaGIA~htD8_Kk=(|jv4)u(CdOpyC^uX_e{ubZGKbNaKtzke3jYl2Rg8wc^B?L5%9?`?3BZ8-e@oLvR?F(`O2ESb@#%(ZA8;J z)}Vl{i$rc~c4klZQgNi0T>moKo`_`*QMwFb3*TIOd3{ft8CSwLUQvS^ah=)Q=JnlX zq;K&_ZE`s-%B2&?Ni`W{iqIzOFy$Avn%?HxyRrN6X*B;#Y5jjzUI&3@k~`0_$&fR zuJBv-IAonVOS}!riJfKri)qLBqU=$m%Ug|ki2_Ev@BrpR z-EKt_O1~2pw#P1%>D^IiK3Bzj3PG~`;{mogYjGqx;4v$N&fDp6IH?^NJU%9;EANBm zUohVvr}aNz#?HL+kHYNCmH}QaWso%^=`uWo)cIP$mLW@WLkqJH4mRwkEYQ#Mm1Wb> zxb|=&nRt!-f+cb$n_L-)Co%k!77&EV%LoDHi~G@Xbc0==?N3h=^(E4~V|0osrsv$y-Z@l7>gsnDV?A3r=Q90YiqMV;e+{svLcQ6NWg6#;!ZH%s|mGYsZ zVsm8)JUiu)-kAp@$-{L2MMhHaUKOqpDTRoO}z zf7SJk5(V}-IkBCskdfaq9CjBz&gOtxV1?R{on3#n^@7#LdX5tQP>JYve3SpO)+aVU zPICR^8l2mfy`+EYKyp2u0ohHom8Hz!R|6uAV&LP`CHwGrw1^=im)=vJ<_){HVZF)Af zPCB!x&(vk_q1V*@%!XeO$SpNNl0Y^4>MnTikUAQPG;Po#6}`D6@#@!k%7S)RY5$P* zPX5OCq1}lrNlMQTYUQRk`yQH*BRxi=oYbN}*!eyBL#z^jAAp|`h zlYTF)k2z5i(r7Hj{n_^?H?Vg2WpjLF!VJmi1+T!DpJ;QVGuKz4JkxiUjh*D-*F^Qg zFTEe#;N`8q5gGsFRX%Rm*0mU+6THOl5)W=mjo$V@x!d;UqZ>wwaK?P7R)(eI6HuB_ zcu77IZ%{Zy=H9_7qOKtxYAaD?$J%RlQW)Ge$v|oP2iU6{h0V8J9Q6KT=nn@32B4YUG@F%lzMk`qvUS=D~{{C5HXM>dr=$dawg)E+>nu^JaPAZ@3M9W zlTdrgm@NA{>6YVM3(F0PW=6)v3M1Iwu&q5ZuEF!bM`atKg7FBCcXhTkHbiO`*OZo2 zR9Lw$QPM9c$0jqS0ISiNc6+C!T`s39m&zfyk>*Am>g}0}<&CQ?Y{J>(F`g)1)7Xh^ z7mb{`0MXL4+6Fn%YCZKiQd(YJYts=tkC~txa=5uy*|^Fa8y~4{sb7xs*GsW{mn(pI zNV~}bsze&Q^%QKIR**v`5u?Z)tE?{}vp2f8ux)u;`>Hl?!NOW^ex+AiQM0mW;uQ0@ z$o!p5i>*9feoI)S4risu8JgZjU9RdnIwG>|D1&U;B8FPTY4C)qb)>$fqZv%WxbE@Z zxLBlMTx@)yRI^+(jGu`K_igCcFUIh7GXCzw|C`KT;>`cofZKrowfO&a{O2weT%Y2X z>onKv@%L@~XW9`wqB|7-nMW@EGA`3N0JybfDYvMKw8SE?Qlu-^(zYy87g^O;8` z6XV-gU<>!ghA|_&E@MY}ELU!u`igL+Hdbki+hP5sN<}Dzka&B2d#iE1mbOTJds|y$ zeH;fVN8<4F*vxUQ4H4LecJ~LW8Zgr&2*FC8S5i?`SqN3c7whWl8$04?5J&`@UPi`E zJQh-TLC1|exkxKRzM-W7rHe=EmSNvWMyhkVjX>_K7_X3ejH~ym%1`ym%B#Kd%DG-u z(G<Bjq+-F>W{#;YojS9)rnVaKYv*}wJZ*VN z<$}ucGc(H=Z&}gU-W5j%3$WJ}4X~;%7U90A@yM!{cr(Ii#g$Vcv96Aeb~q!hX2MEc ztqpC*#3Q=HC5i&0#v8liS^+hUaW)E`RULsV!qvMYO=$Nu)m4$YE~MJo602hcz^V(| zOv>z9{PkrLFh*~0YC>~|Td*o5dogBfdtE~W){4|?N82%Pw6`*5d`)z9P zYHKKrtmiXC;aSfr!5vo6+H7=f0`Hnp_kw1xK06?O5ijE8+P@+_&TEc*YQX~lw) zvM9T*XlZSA1$4k(WDy+p(9+fzX=ra`V~N{(iO>?XkIw=z`i(D6eO()4h|PTVl8TPN zJC7L`J0`MZTTrIrRDFMt@H9EAdUd=LvU z?fTBu9S|@@ky13q3nS1E*{FKyw(WH;l{j=cDKU3ti&ULbT2nM7BDF-lJ*{MpVzfdi z*jIlYb)9IgJ_+R9+=x9L=m@LYJK-3aoW6#QHwUT$JzT7A1$-9{OueGyLBKYz79{fS-fqM|E6S1-TlBayy2K0+S38CmrjVCFfC$3*uUBOPZ6HXUz>}=wu zzUed?pgSrWCbacL(Fslzhl8MxY4E(JIwUO}wA5K3QyMOHUpvx-zF0o(Y@gdE{Ux@%?yASsj0URmd6w%S)I&lIwrgo?OFey%`l_8! zF>&caWXd2lE&X|^UdI|+b=V|1!dob#G`jZ*?ABQWZE!mi7U%?Qc!UC(nK95dJWRVn z8gS4U;o(M(L4&zR2=7>n7w1o8}3iG0)F5WD~^-N## zQPM%zfq}23t&4W6Yg@glZZ#%Uu`bLFVzH*K*4EY94St|1-hOo%VN{{}GKW$$3#)W6 z7jbYGJc3D9S6ER_UW{#8mbGD0*$`O@#W0%G$Gg$(wze*vlC+LLChR-j9TW~UBBQ~KM5=WLe>aCMH+FM&A$eKyS z+BwfRH!cuD4}m>CF{((Q$##Ajr=hVptW=0hSG2E$;YV1n<**iSX9;0Eqls73we%Zk z8Q%O@tgErp8`s+HEz;SKH-UE&7&If5T`O=fl2=3fv$aM_T9;uO6mMSP;rOJ^IH&WC zUU_#%3&I3fX$w6C)0MRBxXDwxQMZ`$+fi0~HrJXlm2B{;Yf2*N=w6%G8LRUey#{Qp zd$!lGqN51E&Mxv=&R)^sH6Uo2j5twt1|3~X-nO zPy2fNG4}4s$DvUS$5ch^#OjetS8gyec^(eGa0W<|CSFNvywdbA5$V(#8{pV3SreQ& zG%_#I8B@QyRtzSvf6L0??8Rgt{gX*L7J+swU2}UZt^qR5SQ&4PP2vm$4luD^Q*OZ# zT+2|$EU$_-wKTTEyCmQAz}LPsj!_mp#)=j2NNF5R9ELItXl(53GXe_AG%d4xA5_`l z{=8`RNP#h&9D-%?v2%Hr_Oufw&zOL1^x?;%;279fFSXWi1AreXSK0+-LS`a~4dh-X zEXT>2Nlk4PkSq0-*Cr;@GBY|E;o%YF?sqqrq6oJyms?z^^MI7zq@zX0x?1Hn1#+zo z<59lM^!6h;NLN3RZoHr9?aL8b*&bO?T2sYbJ22`r0@OFc`x?CYZ7VUAZU_d`wu1(+ zKf)1fT7~1FHSX5}>59&_n^l8lNHpWVPFt5et_j#CBXzmg%`8@D<4QAlq7Zel_BNj~ zkewMp&tYa1nN6^x1vlIcJ^>COby&H>|E>5xAOF9M|2((nKX}1W$=mF<#%1le-{2kg zyxQ8TDW+Zr3&YJeY%P)6BRrp@wXUO3Zps-`LRp-0y>*iI!|AKs1=8ko+&t0V}80BI_G6Q`*> z2&Ad(b=+G(n(zCLyBW`AHO74oJq*N$ANgJmo*-%HsSfcpPUXJs&?OH2z@fVx+Tzfk zfHdVdfR5KvW?NJOq$!``&_aiz4z)NGbLd=$E^z2lhpu(#M-KhMp+;j?9fku_?&yF_YBZfvDynjCkXlv5Z?^u zdj|})S{(|+Z+7y%F9NCDG@$9i&2@4MfMy7{5a?*2p&q|?)jYa@H14%PTHXPN{t3i= zcJjR}d{Mx!G4j2GfUsKt(4jzI5_CAwmj&^wWsR{ENMm#WX^hoC8e=UGwpT+cHvkn2 z`V)}0g%nVUaM?MwEzAVcw(t$0*%EpQPyx_T?*~BI7G3}dP=yr#=Tuf6b0#f}-92a$n3mjFKpE<AkFtrKqre2pW5kO?euSmV?W}6>+7u z>h~Lx6g6!Ic_Lk#cA9^AT9Y+AT4L%@9RexR=l z$~o9_i-4lSoda~1p!0$11lx6j9R#H5eI7{5HV&v&d2ILi>Qu7IZC;>cVph)h>4ebxP;}P)tx3KE_-iXgE-n zpyPq!f=&g}RH8td$_k(^3H_!EO*q683r#HmtrWS(fYj?=a&oUbxkE#Wg?3s%BedAalt<|preM{oj z0ZkIr0;DDH0@4^40BP-C0n{UMcLQn5%NuQDOa)pip%sp+1=3WSfXq1NMn4*h29LL?dX2TJqe^SQa~DG_!yhVVL%#VhU2P$G{#v# z8l%UBUInCD-RZdB0cnhZRU=O`QFi$I#*Bp{8kz=gH}X>V}}(8Ut>Iw1A&p986n{}M=3*#@LOzRPic zb=;7#R&El|C6eA(95)w8<1PVem(WXH=#@Ylg!?hjmjwL+=u$zy0lG}k4j1|dpzjFx zG|=UO_5#5S7&%`BxK&J_s2((zxY#{tY&76!sTDEG(wF0$?+-k?Ib#fbkbY^~&3%wOc zZSWG%jS_d*c+dNxpw9!{BI1e-^m zLsJ}@I2MBanK@gFxz&{{Xs0teb<5POUZ)=qJJ*?zk@lsa&n&T7lGa zE&}?g#JC0MXM#2Z-74tMKtC7sGLYu+Hju_0J;`zfK*|*ZssDY`h4us8CaG)!`h}ne zTP=s_U-LwZl*kEZt`&>h147wAqw2Nl`T?=YZE!c74BrJxx= z8n+ziF5$ikbhn^7AkDW0NON21xbqx$iQ}#UQa`xKako0|9-z&V^5Z~#f?fpDTFsh* zt$u_%4Cr1#vw-ds)CTk`L019&TF{Sywg|c#NHzTpkZSN3px;R7zg*~lfV3RLkGC-n z0a9*^<7PQj>OyNBcLtE=vBGg(4qf6xuXo%=$L#=W6RjS1p-;Qee>m=4#~m`&^R`Ni zqky!O#{sF%C5}7QabE*cPh1A1p18`%^*Xt$9e0D{ZgbpSKw8QjKw3wS18oyso^f(7 zIrKJ=#u$Hs=iM)IZ9wW*y+C&ecQ25RBo6~^7w$bEy^lJ4n!T5t4YWf-7XWFAqCi@r zWk70;7?4`y631N&q`LeNNL$%GK=UNM{{u8%&;cjfRPul{l`jKnjFTOz25ONQ9Y9wL z>H|^@E(OxKw>WN-S^=gtnPHARVzs18E*(fi!NB<7PN+j^ipFx5RPv zjyuP3>m7F!&`v4aCKviE7y4VrJ?gl>I_~d|d);yGI_@(wt@eilsrHi`cOno((TkP= zog=8ug|+~lC)~L}s|8&Obh@CsfCdCT2Ba3+1ElFa@3?;gtrfYfSypa1km_;-(A^Sx z3ebas+JTk|N&@{>(2YQ+3c3SG`|K@1>ZcDGG}QYO&_*aS|c0g zQJs$f(%eo5($EGM+6knoT;M`4aiO<3ZX=Ld=t0Nra@-q0&x!`qN^M=10cpKG3iOO8GX>VnI3O_AOK)(DTBb4D^DaGl5$ z4o!7vxa;U+fW`|lG>ToFTP`5*C9O98NM@rec z9a`g1k3;Jmy3nDE96|zt6Uh(EA`|{O926I1W_c0sKnWg?-?U|#!7%GxKg7?>6G=H~ z*2Fp;%(FxNGMsf35A!qKV73Mrjt3h)<(Ijdv2y*)kHGM3l(arI89 z0TV&XPBV>QIs(i&V759Ye1iN=gz(EpHDo4~3YgL(IMq^WP9N{J_k-@*8DgFeF|UP~ELX9%EJanu5c8`L^KgiH zF~qzcVlY+6(C5=3=BN;JQiy2?FwrJ{teKfIH|^3N)k3&@bUF~n>P zF~1HmkA)bHuKHs=VPA;(Z-~jqcpHp$T!@(+V$KLLu@JK^#9SU?ZVoYq zhZ!*n8hJxd5Gx`F}H`9--VdJg_wVZ7;kuHDLxls3PQ|`5Hl~t zoDpKq2{9Lhn5#p~FG9=%A%@#J>yP!!e}_FaVH04m|`@<@cb+Nu^!bQVy+4?cZ8TfgqUYS%&Q^B zJ18^v&xe?aA*L+EEDkZT5W_F!f+f8!#B2&N4}_RUL(Ja;3}-1F?U^$o?#&#`{c|Da zgb-65V!jb#&JQt{hnTxV%#INAY>0U+#C!_(dBIW~9%2eY%(M_w9%8CP48IKw<`oMu z=ZBcfL(Gpt%;pgDP>9(RVA#GI>oVtKdjm4m^|cW5UWge!(iF?h{SFN=;{wd_xRN`- ziCt~2Ez28QS9{TREcc0G@y1F6V~uSMUX&!(14ZMVT%Z~)#U2JK$=wPxn5eN~;?xtT zPo1tzSBvhc(djO^E(UAEG^*L10MpjSjwxOgt17T8D;jHVU*$!)I%m=GQ7oQA02eDa zMCer_(UWei*ud!#1k^I(gjISM;3UZW9yDb zW!r>k{ZfCaxH!UpUEkVR*Vfe$ptuMpTHoE~C%LLm*Ln}mM$LK(f2hjGqO#oBXIY(^ z`Utx;!XMcz%!@W*rv*PRk)yC!fYj|EqSz&2Db|NB$8x_xg8dYC-iTrv%_W(B9t%&n za?wxe?iGG!MZ*a(+*AchP&eg-X&EHfQNahe>IZ(OTb4wlEh{>r(XZ8%%x#QU)WzcE z+(V^!vd2{;QPxIhRF-*qGCpgHWyVq2`NWE~v~_gFqfM=K%a8%Y?8+EoT?a0yNiopIf~;+MVCkf~I84iJ z+M(LkZ=xtFnBzaK2&;59w&AaCvLbxx{Hl57YGf@Ng`I1dn3Lg!9c`w?v9GWx%0jNy zP7}6xM#e@rQE>^sCSG)QB^oL!1PFKC^|;eDrex35(G_c!NVIE|_rM%0vFxl12B&wzF`GZse(Wv3Zv`;#&R z)7Ki5l(9<*mJ!?3=w{u~u5;q;u@+O5&bn1mG=Mr3O;V~XIkjBH(GeOME{keyY_h$R zF7%Dct`1__l~ayK`)FZRnY{tDs%lR&eFV*4iYrd)T#(umK`Zwgn_eR|Dg7lp&?dwH z)2+F#da1atmi+_eylBIemZ)wE5p6;TYhcyv@~AW)b1gerxKLkjhZT3|pwLuw_<)tF z7gyCTFohK}sx;MrBNy3K*FN_FZTis`_@}GphQ`*xXsG3*O|q&3{nqZQq*chKW0tha z80D#x)y}syYx2Xeg^?)EE>(19JPuBBFFLopvb?&aB1*5R@t2=z z=`vHJLd%o}&82GL>{H4YJDaV*c+p<3{Qzvb-1emY8e9=u<{OFqA=)#TVT=Ja#j;=v7A3`1WCm7?rv)ev}f3jN*I$#bx2>P4vW?(lyrpR z#%&Fa-O;71qm}c^GQ-g2bt1=fg!0PT>cvuP;YOoVM}M~*Z;vjlor9Sxi=zD@yCyC^ z#-i1lss)ub<(^*JHO^+%GC0d=h6%CJjk91V!^38HN*ukY^fuziTz+r*aSmA+>k%xa zsaUY!l!aBk7Ql8Sb*)n;?9yN)Yibu%OUH>xO8at7SS10metl=FNy6uQ(fSo;NM@QD zEl);K+;JMc2d`tFT2>|31-jO%9>HA~(k-XHy<;^7j84pouvdW@P=bAhxF9lh7Nc|dqY<%=eGWS z!3LU}82Iyo$~jilKT~$e`KNWJ(y=LCXIXqqhs1E>0$X6-%-%PB zOQr+9xt1vCBeco$9)K=IJD`@SJQ&&Q1hF)FaA#&@%!L&*mnu1886E>nY@Zad zKa(xMU&Z=++SI8MGUbFRM&hgy6TD@?+@+li@2tZm06UvD=KvCr(qt z(Qf+EEb=*B)#Z8FVY?ly-(PX-cK&qYf5fZ$*miS|R3$b2MY~PHm$o1FBlXoOP0)!x z0`xR=^#7o~im~-&T|DyW`Ec2T&u)D_IH_i@Aj-&->2xBCzOYjZo51n@hCH} zo&x;Ae&0*J?%&aU5w^U|PGWyr?8Tp-96IB`_(9wlHycu-PjXJqjMAL0eaShwGfH#2 zo=+~yPnPEI{VX=zMNuD5E*h0A9kq9;UOtdqG&Wf}cJEu*Y#E_-Lm%3;1zRUL=q+8jV-_%Ft(*2Em_-@OGK)I;7~fuQ`nbw89K98MT-4g}#qE!qZpB4|ka%+y6Z;+a|-kdDR$j9FlQ{Ukj`c{ zS5^u?A|k<^=$*g79HUS@5fs`fff5dsO13_#aG+H3_E7}`rJ{h38aq%bS~zN;)aWrv zcNmr(;3IH`$=s$I8$IW+wY#mVvGuWU1N|vCFc1csaRYU4*}9@~XUUKmlXX!O$`aYO zb)?w}-|VoQM5^FPihu28L?q9Iyu|jz6E^w&>?62G1_FmLj7DnN`paLP+cROz?srey z_Z_owvsll!(^?>D`g*OV8QA4DNVH z@4eTf;~ctbMt^>BfBs_w=dVG^Onl({9)q|$wB73&dQ6fH!qYoKv#4Vc!EWA-U^yKL z)|dKcIE$U$s~ubC-sDB?Vz+*is8+41dJ`vHVyp4KJzbwm-3YPX zfvn!0%`<*Yk-YW&Oz64}M9g|US%aQ7{tPTtfgQVHx8z#(h;VIjDjbslKK`3z>Bt#t zHzA;FQ-7(-Vb6MzdY9dlNL`IB)<-9K3P3)Nb59(QD9r^^mMqOq@Dveh9!C!ZZeGzI zQ04Q`Z?XJ9QhW$}7DbDXq(SMhb{l@|=$_aOcgJq?lt(Z>Jr$QXVpLx=Mp{&+zlw*% zj846XezIr}v$`=*|E534MwU}-VNtSyQl{q(l*&-YfUPK>_>mb8WVVvwk9y(*ipVxU zHaR^xmt`G-qIAWRKcLb3_QX$2UP6->?V5FVc7I88SN^_2JDw%B^=@sR(eb_b7kcl{ zn(_kIzE!tvPfw`6JBE05weA`cPA zgp=?hc?*ru``@gU70DhZpR8(SQ|O=9%!47mfH*@q8IU7P_T`E_lBazSR-2k!oIB(7 zbF&kFO*~BF{7={4ctFNXRO`Mm@qaOKiKNL&nk&8KyP9z{#^|gk5L}j+%kA~&CFb(X znNc{wW^QhBSi+9);PMm0@VhwKL;p_99f^yP$zqo1^K?dT-k)|z(=Phw+D1@3ge@)s zemxH7DcXfD;`4}+KQLE32?1&}F&F*#5%FWr7DClzcegK{*SnSHMvhAT2IZ9Ur3z4E zw!U!AMg)WClCNujFTdIF+zBh3Uod|hLV~e|oA;aU;@&DmkAE7GSy0m-pUDj5v{U>(seFw)y?b~9; z_jLQ7hvG_2q2{U*JF~X;FFydCtk!>GKrQfoJO+*DA^V&tOWumX_#_@vqoX|f?<#b$ z75!x=W+6FrvpMK})d3K%cxTxWS#n@4x~c4BkIuUEd#Wt72asmc<8m&x*a$~Q|`c(T>z-A3F%2Z^F4jltB`~n3*7ZzvV(u$`4+0Fc7 zzIR838LZUbep3(fo*ev2{Pp#l;~lKnD|lt}<4JJw2WW4&Sb8F7s*3aUKO(F9m^21< zpJAp#dsBB)>CvK^7$>niwGussnGa=;jUaADE$6MPg#;Bx%v=hf!g7pVnrRnMJmXT1 zWi#Q~v?Vwmf5@Xr&$4ofolY^FF8OL+AMalva1smK%EVE;Km=3x{_d=FOdg51?m84! z&I6%3uiFgv9qs&k=df8!l~zSmQ4=QIp11B6#AHa4A!*|d#Lw*Ap0hK}@r2&4dy=hE zj2y`;eR|jpn4H)qfyA)301<5ygk298Z>g{co}pVr;x@NgNI8iUG`kLEc_rolrge

tG`!3cGczGB62R%2k+4k-cOjbltj#eC= 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