Challenge:
Winner?:
No
Code Snippet:
Rem Project: Paint Rem Created: 6/23/2006 3:30:08 PM Rem ***** Main Source File ***** set window on set display mode 800,600,32 set window size 800,600 sync on sync rate 0 type __FloodFillType Initialised as integer CoverColour as integer BitmapWidth as integer BitmapHeight as integer endtype global __FloodFillGlobal as __FloodFillType #constant __SpanListSize 15 type __FillSpan Left as integer Right as integer endtype global dim __FilledSpans() as __FillSpan global dim __FilledSpansCount() as integer global temp$ temp$="" global color color=rgb(0,0,0) global paint_mode global option_mode paint_mode=0 option_mode=1 global img_origin_x global img_origin_y global img_width global img_height global palletx1 global pallety1 global palletx2 global pallety2 global buttonsx1 global buttonsy1 global buttonsx2 global buttonsy2 global rgbx1 global rgby1 global rgbx2 global rgby2 global brush_width img_origin_x=76 img_origin_y=36 img_width=300 img_height=300 palletx1=1 pallety1=img_origin_y+20 palletx2=73 pallety2=img_origin_y+130 rgbx1=1 rgby1=img_origin_y+132 rgbx2=73 rgby2=img_origin_y+180 buttonsx1=1 buttonsy1=img_origin_y+184 buttonsx2=73 buttonsy2=img_origin_y+304 brush_width=10 get image 1,img_origin_x,img_origin_y,img_origin_x+img_width,img_origin_y+img_height,1 `create palette cls rgb(255,255,255) for x=0 to 73 for y=0 to 110 read rgbv dot x,y,rgbv next y next x sync get image 2,0,0,73,110 cls rgb(255,255,255) do cls rgb(255,255,255) draw_menu(0) draw_img() user_input() sync loop function draw_menu(not_draw_area) if not_draw_area=0 box 0,0,screen width(),screen height(),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100) box 1,1,screen width()-1,screen height()-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150) box img_origin_x-1,img_origin_y-1,screen width(),screen height(),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100) box img_origin_x,img_origin_y,screen width()-1,screen height()-1,rgb(255,255,255),rgb(255,255,255),rgb(255,255,255),rgb(255,255,255) box img_origin_x-1,img_origin_y-1,img_origin_x+1+img_width,img_origin_y+1+img_height,rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100) box 0,0,screen width(),img_origin_y,rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100) box 1,1,screen width()-1,img_origin_y-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150) else ink rgb(100,100,100),0 line img_origin_x,screen height()-1,screen width(),screen height()-1 line screen width()-1,img_origin_y,screen width()-1,screen height() line img_origin_x+img_width,img_origin_y,img_origin_x+img_width,img_origin_y+1+img_height line img_origin_x,img_origin_y+img_height,img_origin_x+1+img_width,img_origin_y+img_height box 0,0,screen width(),img_origin_y,rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100) box 0,img_origin_y-1,img_origin_x,screen height(),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100) box 1,1,screen width()-1,img_origin_y-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150) box 1,img_origin_y,img_origin_x-1,screen height()-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150) box img_origin_x+1+img_width,img_origin_y,screen width()-1,screen height()-1,rgb(255,255,255),rgb(255,255,255),rgb(255,255,255),rgb(255,255,255) box img_origin_x,img_origin_y+1+img_height,screen width()-1,screen height()-1,rgb(255,255,255),rgb(255,255,255),rgb(255,255,255),rgb(255,255,255) endif `RGB PALETTE ink rgb(0,0,255),0 center text img_origin_x/2,img_origin_y,"Color" paste image 2,palletx1,pallety1 `RGB DATA INPUT box rgbx1+20,rgby1+4,rgbx1+52,rgby1+48,rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0) text rgbx1,rgby1,"R:"+str$(rgbr(color)) text rgbx1,rgby1+16,"G:"+str$(rgbg(color)) text rgbx1,rgby1+32,"B:"+str$(rgbb(color)) ink rgb(255,255,255),0 box rgbx1+20,rgby1+17,rgbx1+52,rgby1+18 box rgbx1+20,rgby1+33,rgbx1+52,rgby1+34 ink color,0 box rgbx1+54,rgby1+4,rgbx2,rgby2 `BUTTONS draw_option(mode) endfunction function draw_img() paste image 1,img_origin_x,img_origin_y endfunction function draw_option(mode) select option_mode case 1 if paint_mode=0:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1,buttonsx2,buttonsy1+20,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1,"Circle" if paint_mode=1:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1+20,buttonsx2,buttonsy1+40,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1+20,"Box" if paint_mode=2:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1+40,buttonsx2,buttonsy1+60,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1+40,"Ellipse" if paint_mode=3:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1+60,buttonsx2,buttonsy1+80,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1+60,"Line" if paint_mode=4:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1+80,buttonsx2,buttonsy1+100,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1+80,"Brush" if paint_mode=5:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1+100,buttonsx2,buttonsy1+120,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1+100,"Flood" if paint_mode=6:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif box buttonsx1,buttonsy1+120,buttonsx2,buttonsy1+140,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255) center text buttonsx2/2,buttonsy1+120,"Dropper" endcase endselect endfunction function user_input() if mouseclick()=1 `RGB COLORS if mousex()>palletx1 and mousey()>pallety1 and mousex()<palletx2 and mousey()<pallety2 color=point(mousex(),mousey()) endif if mousex()>rgbx1+20 and mousey()>rgby1 and mousex()<rgbx1+52 and mousey()<rgby1+18`Edit R Value do cls rgb(255,255,255) ret$=get_color_val() if ret$<>"" color=rgb(val(ret$),rgbg(color),rgbb(color)) exitfunction else color=rgb(val(temp$),rgbg(color),rgbb(color)) endif draw_menu(0) draw_img() ink rgb(255,0,0),0 text rgbx1,rgby1,"R:"+str$(rgbr(color)) sync loop endif if mousex()>rgbx1+20 and mousey()>rgby1+18 and mousex()<rgbx1+52 and mousey()<rgby1+36`Edit G Value do cls rgb(255,255,255) ret$=get_color_val() if ret$<>"" color=rgb(rgbr(color),val(ret$),rgbb(color)) exitfunction else color=rgb(rgbr(color),val(temp$),rgbb(color)) endif draw_menu(0) draw_img() ink rgb(255,0,0),0 text rgbx1,rgby1+16,"G:"+str$(rgbg(color)) sync loop endif if mousex()>rgbx1+20 and mousey()>rgby1+36 and mousex()<rgbx1+52 and mousey()<rgby1+54`Edit B Value do cls rgb(255,255,255) ret$=get_color_val() if ret$<>"" color=rgb(rgbr(color),rgbg(color),val(ret$)) exitfunction else color=rgb(rgbr(color),rgbg(color),val(temp$)) endif draw_menu(0) draw_img() ink rgb(255,0,0),0 text rgbx1,rgby1+32,"B:"+str$(rgbb(color)) sync loop endif `BUTTON INTERACTIONS if mousex()>buttonsx1 and mousey()>buttonsy1 and mousex()<buttonsx2 and mousey()<buttonsy2 if mousex()>buttonsx1 and mousey()>buttonsy1 and mousex()<buttonsx2 and mousey()<buttonsy1+20 then paint_mode=0 if mousex()>buttonsx1 and mousey()>buttonsy1+20 and mousex()<buttonsx2 and mousey()<buttonsy1+40 then paint_mode=1 if mousex()>buttonsx1 and mousey()>buttonsy1+40 and mousex()<buttonsx2 and mousey()<buttonsy1+60 then paint_mode=2 if mousex()>buttonsx1 and mousey()>buttonsy1+60 and mousex()<buttonsx2 and mousey()<buttonsy1+80 then paint_mode=3 if mousex()>buttonsx1 and mousey()>buttonsy1+80 and mousex()<buttonsx2 and mousey()<buttonsy1+100 then paint_mode=4 if mousex()>buttonsx1 and mousey()>buttonsy1+100 and mousex()<buttonsx2 and mousey()<buttonsy1+120 then paint_mode=5 if mousex()>buttonsx1 and mousey()>buttonsy1+120 and mousex()<buttonsx2 and mousey()<buttonsy1+140 then paint_mode=6 endif `IMG INTERACTION if mousex()>img_origin_x-1 and mousey()>img_origin_y-1 and mousex()<img_origin_x+img_width and mousey()<img_origin_y+img_height then input_option_1() endif endfunction function input_option_1() smx=mousex() smy=mousey() select paint_mode case 0`Circle repeat cls rgb(255,255,255) draw_img() ink color,0 filled_circle(smx,smy,dist(smx,smy,mousex(),mousey())) draw_menu(1) if mouseclick()=2 or mouseclick()=3 exitfunction endif sync until mouseclick()=0 get_image() endcase case 1`Box repeat cls rgb(255,255,255) draw_img() ink color,0 box min(smx,mousex()),min(smy,mousey()),max(smx,mousex()),max(smy,mousey()) draw_menu(1) if mouseclick()=2 or mouseclick()=3 exitfunction endif sync until mouseclick()=0 get_image() endcase case 2`Ellipse repeat cls rgb(255,255,255) draw_img() ink color,0 filled_ellipse(smx,smy,abs(mousex()-smx),abs(mousey()-smy)) draw_menu(1) if mouseclick()=2 or mouseclick()=3 exitfunction endif sync until mouseclick()=0 get_image() endcase case 3`Line repeat cls rgb(255,255,255) draw_img() ink color,0 line smx,smy,mousex(),mousey() draw_menu(1) if mouseclick()=2 or mouseclick()=3 exitfunction endif sync until mouseclick()=0 get_image() endcase case 4`Brush repeat ink color,0 filled_circle(mousex(),mousey(),brush_width) draw_menu(1) if mouseclick()=2 or mouseclick()=3 exitfunction endif sync until mouseclick()=0 get_image() endcase case 5`Flood FloodFill(mousex(),mousey(),color) get_image() endcase case 6`Ink Dropper repeat color=point(mousex(),mousey()) until mouseclick()=0 endcase endselect endfunction function get_color_val() t_temp$=temp$ if returnkey() or len(temp$)>=3 ret$=temp$ temp$="" exitfunction ret$ endif if inkey$()<>"" temp$=temp$+str$(val(inkey$())) wait 200 endif if keystate(14) then temp$=left$(temp$,len(temp$)-1) temp$=str$(val(temp$)) if val(temp$)>255 then temp$=t_temp$ endfunction "" function wait_text(string$) center text screen width()/2,0,string$ sync endfunction function get_image() get image 1,img_origin_x,img_origin_y,img_origin_x+img_width,img_origin_y+img_height,1 endfunction function dist(x1#,y1#,x2#,y2#) ret#=sqrt((x2#-x1#)^2+(y2#-y1#)^2) endfunction ret# function filled_circle( CX as integer, CY as integer, R as integer ) local x as integer local y as integer local i as integer local s as integer i=R*R s=R*0.70710678 box CX-s, CY-s, CX+s+1, CY+s+1 s=s+1 for y=s to R x=sqrt( i-(y*y) ) box CX-x, CY-y, CX+x+1, CY-y+1 box CX-x, CY+y, CX+x+1, CY+y+1 box CX-y, CY-x, CX-y+1, CY+x+1 box CX+y, CY-x, CX+y+1, CY+x+1 next y endfunction function filled_ellipse(x#,y#,xrad#,yrad#) for i# =0.0 to 90.0 step 1 x1#=sin(i#-90)*xrad#+x# x2#=sin(i#+90)*xrad#+x# y1#=cos(i#+90)*yrad#+y# y2#=cos(i#-90)*yrad#+y# box x1#,y1#,x2#,y2# next i endfunction function draw_line(x1,y1,x2,y2,width) m#=(y2-y1)/(x2-x1) endfunction function min(v1,v2) if v1<v2 exitfunction v1 else exitfunction v2 endif endfunction 0 function max(v1,v2) if v1>v2 exitfunction v1 else exitfunction v2 endif endfunction 0 `FloodFill Commands are not mine, a thanks to "IanM" function FloodFill(x,y,c) __FloodFillGlobal.BitmapWidth=bitmap width()-1 __FloodFillGlobal.BitmapHeight=bitmap height()-1 __InitialiseFillSpan() if x >= 0 and x <= __FloodFillGlobal.BitmapWidth if y >= 0 and y <= __FloodFillGlobal.BitmapHeight lock pixels __FloodFillGlobal.CoverColour = point(x,y) if __FloodFillGlobal.CoverColour <> c ink c,0 __FloodLoop(x,y) endif unlock pixels endif endif endfunction function __FloodLoop(x as integer,y as integer) local Left as integer local Right as integer local SpanSize as integer for Left=x-1 to 0 step -1 if point(Left,y) <> __FloodFillGlobal.CoverColour then exit next Left inc Left for Right=x+1 to __FloodFillGlobal.BitmapWidth if point(Right,y) <> __FloodFillGlobal.CoverColour then exit next Right ` draw this line box Left,y,Right,y+1 ` and remember it __AddFillSpan(y,Left-1,Right+1) ` Fill upwards if y > 0 dec y x=Left while x < Right SpanSize=__CheckFillSpan(x,y) if SpanSize = 0 if point(x,y) = __FloodFillGlobal.CoverColour __FloodLoop(x,y) endif inc x else inc x,SpanSize endif endwhile inc y endif ` Fill downwards if y < __FloodFillGlobal.BitmapHeight inc y x=Left while x < Right SpanSize=__CheckFillSpan(x,y) if SpanSize = 0 if point(x,y) = __FloodFillGlobal.CoverColour __FloodLoop(x,y) endif inc x else inc x,SpanSize endif endwhile endif endfunction function __InitialiseFillSpan() local i as integer if __FloodFillGlobal.Initialised = 0 ` First time called, create the arrays - bigger than we should ever need undim __FilledSpans() global dim __FilledSpans(__SpanListSize,2048) as __FillSpan undim __FilledSpansCount() global dim __FilledSpansCount(2048) as integer __FloodFillGlobal.Initialised=1 else ` Subsequent call, just reset the spans we'll be using for i=__FloodFillGlobal.BitmapHeight to 0 step -1 __FilledSpansCount(i)=0 next i endif endfunction function __AddFillSpan(y as integer,Left as integer,Right as integer) local i as integer i=__FilledSpansCount(y) if i < __SpanListSize __FilledSpans(i, y).Left=Left __FilledSpans(i, y).Right=Right inc __FilledSpansCount(y) endif endfunction function __CheckFillSpan(x as integer,y as integer) local i as integer for i=__FilledSpansCount(y)-1 to 0 step -1 if x >= __FilledSpans(i, y).Left if x < __FilledSpans(i, y).Right then exitfunction __FilledSpans(i, y).Right-x endif next i endfunction 0 `//////////////////////////////////RGB COLOR INFORMATION////////////////////////////////////////// data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 data 393216,393216,393216,393472,393472,393472,393728,393728,393728,393984,393984,394240,394240,394240,394496,394496,394752,394752,394752,394752,394752,394752,329216,329216,263680,263680,263680,198144,198144,132608,132608,132608,67072,67072,67072,1536,1536,1536,1536,1536,1537,1537,1537,1538,1538,1539,1539,1539,1540,1540,1540,1541,1541,1542,1542,1542,1542,1542,1286,1286,1286,1030,1030,1030,774,774,518,518,518,262,262,6,6,6,6,6,6,65542,65542,65542,131078,131078,196614,196614,196614,262150,262150,327686,327686,327686,393222,393222,393222,393222,393222,393221,393221,393221,393220,393220,393219,393219,393219,393218,393218,393218,393217,393217,393216,393216,393216 data 851968,851968,852224,852480,852480,852736,852992,853248,853248,853504,853760,854016,854272,854272,854528,854784,855040,855040,855296,855296,789760,789760,724224,658688,593152,527616,527616,462080,396544,331008,331008,265472,199936,134400,134400,68864,3328,3328,3328,3329,3330,3331,3331,3332,3333,3334,3334,3335,3336,3337,3337,3338,3339,3340,3341,3341,3341,3085,2829,2829,2573,2317,2061,2061,1805,1549,1293,1037,1037,781,525,269,269,13,13,13,65549,131085,196621,196621,262157,327693,393229,393229,458765,524301,589837,655373,655373,720909,786445,851981,851981,851981,851980,851979,851979,851978,851977,851976,851975,851975,851974,851973,851972,851972,851971,851970,851969,851969,851968 data 1310720,1310720,1311232,1311488,1311744,1312000,1312256,1312512,1312768,1313280,1313536,1313792,1314048,1314304,1314560,1315072,1315328,1315584,1315840,1315840,1250304,1184768,1053696,988160,922624,857088,791552,726016,594944,529408,463872,398336,332800,267264,201728,70656,5120,5120,5121,5122,5123,5124,5125,5126,5127,5129,5130,5131,5132,5133,5134,5136,5137,5138,5139,5140,5140,4884,4372,4116,3860,3604,3348,3092,2580,2324,2068,1812,1556,1300,1044,532,276,20,20,65556,131092,196628,262164,327700,458772,524308,589844,655380,720916,786452,851988,983060,1048596,1114132,1179668,1245204,1310740,1310740,1310738,1310737,1310736,1310735,1310734,1310733,1310731,1310730,1310729,1310728,1310727,1310726,1310725,1310723,1310722,1310721,1310720 data 1769472,1769728,1770240,1770496,1770752,1771264,1771776,1772032,1772288,1772800,1773312,1773568,1774080,1774336,1774848,1775360,1775616,1775872,1776384,1776384,1645312,1579776,1448704,1383168,1252096,1121024,1055488,989952,858880,727808,662272,596736,465664,334592,269056,137984,72448,6912,6913,6915,6916,6918,6919,6921,6922,6924,6925,6927,6929,6930,6931,6933,6935,6936,6938,6939,6939,6427,5915,5659,5403,4891,4379,4123,3611,3355,2843,2331,2075,1819,1307,795,539,283,27,65563,196635,327707,393243,458779,589851,720923,786459,851995,983067,1114139,1179675,1310747,1376283,1507355,1638427,1703963,1769499,1769499,1769497,1769495,1769494,1769492,1769491,1769489,1769487,1769486,1769485,1769483,1769481,1769480,1769479,1769477,1769475,1769474,1769472 data 2293760,2294016,2294784,2295040,2295552,2296064,2296576,2297088,2297344,2298112,2298368,2298880,2299648,2299904,2300416,2300928,2301440,2301952,2302464,2171648,2106112,1975040,1843968,1712896,1581824,1450752,1319680,1188608,1057536,926464,860928,729856,598784,467712,336640,205568,74496,8960,8962,8964,8965,8968,8969,8971,8973,8975,8977,8978,8981,8983,8984,8987,8988,8990,8992,8994,8483,8227,7459,6947,6691,5923,5667,5155,4643,4131,3619,3107,2595,2339,1827,1059,803,291,35,131107,262179,393251,524323,589859,786467,917539,983075,1114147,1245219,1376291,1507363,1638435,1769507,1835043,2031651,2097187,2228259,2293793,2293791,2293789,2293787,2293785,2293783,2293782,2293779,2293778,2293776,2293774,2293772,2293770,2293769,2293766,2293764,2293763,2293760 data 2686976,2687232,2688000,2688512,2689024,2689792,2690304,2690816,2691328,2692096,2692608,2693120,2693888,2694400,2694912,2695680,2696192,2696704,2697472,2631936,2500864,2369792,2173184,2042112,1911040,1714432,1583360,1452288,1255680,1124608,993536,862464,665856,534784,403712,207104,76032,10496,10498,10500,10502,10505,10507,10509,10511,10514,10516,10518,10521,10523,10525,10528,10530,10532,10535,10537,10281,9769,9001,8489,7977,7209,6697,6185,5417,4905,4393,3625,3113,2601,2089,1321,809,297,41,131113,262185,458793,589865,720937,917545,1048617,1179689,1310761,1507369,1638441,1769513,1966121,2097193,2228265,2424873,2555945,2687017,2687016,2687013,2687011,2687009,2687006,2687004,2687002,2686999,2686997,2686995,2686992,2686990,2686988,2686986,2686983,2686981,2686979,2686976 data 3080192,3080704,3081472,3081984,3082752,3083520,3084032,3084800,3085312,3086080,3086592,3087360,3088128,3088640,3089408,3090176,3090688,3091456,3092224,3026688,2895616,2699008,2502400,2371328,2174720,1978112,1847040,1650432,1453824,1322752,1191680,995072,798464,667392,470784,274176,143104,12032,12035,12037,12039,12043,12045,12047,12050,12053,12055,12057,12061,12063,12065,12069,12071,12073,12077,12079,11823,11311,10287,9775,9263,8239,7727,7215,6191,5679,5167,4143,3631,3119,2607,1583,1071,559,65583,196655,327727,589871,720943,852015,1048623,1245231,1376303,1507375,1769519,1900591,2031663,2293807,2424879,2555951,2752559,2949167,3080239,3080238,3080234,3080232,3080230,3080227,3080224,3080222,3080219,3080216,3080214,3080211,3080208,3080206,3080204,3080201,3080198,3080196,3080193 data 3604480,3604992,3606016,3606784,3607296,3608320,3609088,3609600,3610368,3611392,3611904,3612672,3613696,3614208,3614976,3616000,3616512,3617280,3618304,3487488,3290880,3094272,2897664,2701056,2504448,2242304,2111232,1914624,1652480,1521408,1324800,1193728,931584,734976,603904,341760,145152,14080,14083,14086,14089,14092,14095,14098,14100,14104,14107,14109,14113,14116,14118,14122,14125,14127,14131,14134,13623,12855,11831,11063,10551,9527,8759,8247,7223,6455,5943,4919,4151,3639,2871,1847,1335,567,65591,196663,393271,655415,786487,983095,1245239,1441847,1572919,1769527,2031671,2162743,2359351,2621495,2752567,2949175,3211319,3342391,3538999,3604533,3604529,3604526,3604523,3604520,3604517,3604514,3604511,3604508,3604505,3604502,3604499,3604496,3604494,3604490,3604487,3604485,3604481 data 3997696,3998208,3999488,4000256,4001024,4002048,4002816,4003584,4004352,4005376,4006144,4006912,4007936,4008704,4009472,4010752,4011264,4012032,4013312,3882240,3685632,3489024,3226880,3030272,2833664,2571520,2374912,2178304,1916160,1719552,1522944,1326336,1064192,867584,670976,343296,146688,15616,15620,15623,15626,15630,15633,15636,15639,15643,15646,15649,15653,15656,15659,15664,15667,15669,15674,15677,15165,14397,13373,12605,11837,10813,10045,9277,8253,7485,6717,5437,4669,4157,3389,2109,1341,573,65597,262205,458813,720957,917565,1114173,1376317,1572925,1769533,1966141,2293821,2424893,2621501,2949181,3145789,3342397,3604541,3801149,3997757,3997755,3997751,3997748,3997745,3997741,3997738,3997735,3997731,3997728,3997725,3997720,3997717,3997714,3997712,3997707,3997704,3997701,3997697 data 4456448,4457216,4458496,4459264,4460032,4461312,4462080,4462848,4463872,4465152,4465920,4466688,4467968,4468736,4469504,4470784,4471808,4472576,4473856,4342784,4146176,3949568,3621888,3359744,3163136,2835456,2638848,2442240,2114560,1917952,1655808,1459200,1131520,934912,738304,410624,214016,17408,17412,17416,17419,17424,17427,17430,17433,17438,17442,17445,17450,17453,17456,17461,17464,17468,17472,17476,16964,16196,14916,14148,13124,12100,11076,10308,9028,8260,7492,6212,5444,4420,3652,2372,1604,836,65604,262212,524356,786500,1048644,1245252,1572932,1769540,1966148,2228292,2490436,2752580,2949188,3276868,3473476,3670084,3997764,4194372,4456516,4456514,4456509,4456506,4456503,4456498,4456495,4456491,4456486,4456483,4456480,4456475,4456472,4456469,4456465,4456460,4456457,4456454,4456449