Can be convenient if you can only post code, no web host to put a project zip-file or bitmap.
It is meant for small images with a limited amount of unique colors.
For the first run of the code, this bitmap is needed:
https://nr100.home.xs4all.nl/badidea/un ... st_aid.bmp
After the first run, the bitmap can be deleted.
Change #Define FIRST_RUN to comment (section main program).
Code: Select all
'============================= list stuff ======================================
'Modified version of DynamicUserStackTypeCreateMacro.bi
'https://freebasic.net/forum/viewtopic.php?f=9&t=27026
#macro listTypeCreate(list_type, data_type)
type list_type
public:
declare property push(byval value as data_type)
declare property pop() as data_type
declare property size() as integer 'stack size
declare property find(byval value as data_type) as integer
declare property get(index as integer) as data_type
declare destructor()
private:
dim as data_type list(any) 'stack
dim as integer current = 0
end type
'increase list size + add value
property list_type.push(byval value as data_type)
redim preserve list(ubound(list) + 1)
list(ubound(list)) = value
end property
property list_type.pop() as data_type
dim as data_type value
select case ubound(list)
case is > 0
'get value + decrease list size
value = list(ubound(list))
redim preserve list(ubound(list) - 1)
case is = 0
'get value + empty list
value = list(ubound(list))
erase list
case else
'keep uninitialised value
end select
return value
end property
property list_type.size() as integer
return ubound(list) + 1
end property
'find first match
property list_type.find(byval value as data_type) as integer
for i as integer = lbound(list) to ubound(list)
if list(i) = value then return i
next
return -1
end property
property list_type.get(index as integer) as data_type
dim as data_type value
if index >= lbound(list) and index <= ubound(list) then
value = list(index)
end if
return value
end property
destructor list_type
erase list
end destructor
#endmacro
'============================= sprite stuff ====================================
#include "file.bi"
#include "string.bi"
listTypeCreate(listTypeUlong, ulong) 'macro thing
type int2d
as integer x, y
end type
type bitmap_header field = 1
bfType as ushort
bfsize as ulong
bfReserved1 as ushort
bfReserved2 as ushort
bfOffBits as ulong
biSize as ulong
biWidth as ulong
biHeight as ulong
biPlanes as ushort
biBitCount as ushort
biCompression as ulong
biSizeImage as ulong
biXPelsPerMeter as ulong
biYPelsPerMeter as ulong
biClrUsed as ulong
biClrImportant as ulong
end type
const as ulong C_MANGENTA = &h00FF00FF
const as integer SPRITE_DRAW_NO_CENTER = 0
const as integer SPRITE_DRAW_CENTER = 1
const as integer SPRITE_DRAW_PSET = 0
const as integer SPRITE_DRAW_TRANS = 1
const as integer SPRITE_DRAW_ALPHA = 2
type sprite_type
public:
dim as any ptr pImage
dim as int2d size, half
dim as integer center, method, alphaval
declare sub create(sizeInit as int2d, colorInit as ulong)
declare function createFromBmp(fileName as string) as integer
declare sub destroy()
declare sub drawxy(x as integer, y as integer)
declare sub setDrawProp(centerInit as integer, methodInit as integer, alphavalInit as integer)
declare sub saveToFbDataFormat(fileName as string)
declare sub createFromFbDataFormat()
declare destructor()
end type
declare sub sprite_rotate(srcImg as any ptr, dstImg as any ptr, rotation as single, defaultColour as ulong)
sub sprite_type.create(sizeInit as int2d, colorInit as ulong)
pImage = imagecreate(sizeInit.x, sizeInit.y, colorInit)
size = sizeInit
half.x = size.x \ 2
half.y = size.y \ 2
center = 0
method = 0
end sub
function sprite_type.createFromBmp(fileName as string) as integer
dim as bitmap_header bmp_header
dim as int2d bmpSize
if fileexists(filename) then
open fileName for binary as #1
get #1, , bmp_header
close #1
bmpSize.x = bmp_header.biWidth
bmpSize.y = bmp_header.biHeight
create(bmpSize, &hff000000) '<---!
bload fileName, pImage
print "Bitmap loaded: " & filename
else
print "File not found: " & filename
sleep 1000: return -1
end if
return 0
end function
sub sprite_type.destroy()
if (pImage <> 0) then
imagedestroy(pImage)
pImage = 0
end if
end sub
destructor sprite_type()
destroy
end destructor
sub sprite_type.drawxy(x as integer, y as integer)
if (center) then
x -= half.x
y -= half.y
end if
select case method
case 1 : put (x , y), pImage, trans
case 2 : put (x , y), pImage, alpha, alphaval
case else : put (x , y), pImage, pset
end select
end sub
sub sprite_type.setDrawProp(centerInit as integer, methodInit as integer, alphavalInit as integer)
center = centerInit
method = methodInit
alphaval = alphavalInit
end sub
sub sprite_type.saveToFbDataFormat(fileName as string)
dim as integer x, y, wImage, hImage, pitchImage
dim as ulong c
dim as ulong ptr pPixels
imageinfo pImage, wImage, hImage, , pitchImage, pPixels
pitchImage shr= 2
'index the unique colors
dim as listTypeUlong list
dim as integer index, lastIndex, colorIndex(wImage-1, hImage-1)
for y = 0 to hImage-1
for x = 0 to wImage-1
c = pPixels[y * pitchImage + x]
index = list.find(c)
if index = -1 then 'not in list
index = list.size()
list.push(c) 'add to list
end if
colorIndex(x, y) = index
next
next
'save to file
dim as string sepStr
var fileNum = freefile()
open fileName for output as fileNum
'write number of unique colors
print #fileNum, "data " & str(wImage) & ", " & str(hImage) & ", " & str(list.size)
'write unique color array
print #fileNum, "data";
lastIndex = list.size() - 1
for i as integer = 0 to lastIndex
if i = lastIndex then sepStr = "" else sepStr = ","
print #fileNum, " &h" & hex(list.get(i)) & sepStr;
next
print #fileNum, "" 'new line
'write color index map
for y = 0 to hImage-1
print #fileNum, "data";
for x = 0 to wImage-1
if x = wImage - 1 then sepStr = "" else sepStr = ","
print #fileNum, " " & format(colorIndex(x, y), "00") & sepStr;
next
print #fileNum, "" 'new line
next
close fileNum
list.destructor() 'clear list
end sub
sub sprite_type.createFromFbDataFormat()
dim as integer x, y, wImage, hImage, pitchImage
dim as ulong c
dim as ulong ptr pPixels
'index the unique colors
dim as listTypeUlong list
dim as integer index
dim as integer wData, hData, numColor
'read image dimensions and create empty sprite
read wData, hData, numColor
create(type(wData, hData), C_MANGENTA)
imageinfo pImage, wImage, hImage, , pitchImage, pPixels
pitchImage shr= 2
for i as integer = 0 to numColor-1
read c
list.push(c)
next
'read color index and get indexed color from list
for y = 0 to hImage-1
for x = 0 to wImage-1
read index
pPixels[y * pitchImage + x] = list.get(index)
next
next
list.destructor() 'clear list
end sub
'============================= main program ====================================
'1st run: Load from bitmap file, save data file
'2nd run: Change to comment to load from data file
#Define FIRST_RUN
screenres 800, 600, 32
const as integer NUM_SPR_ROT = 360 \ 15
dim as sprite_type medicSpr
#ifdef FIRST_RUN
if medicSpr.createFromBmp("unimog_first_aid.bmp") < 0 then goto endNow
#else
#include "unimog_first_aid.data"
medicSpr.createFromFbDataFormat()
print "Image loaded from data file"
#endif
'draw image
medicSpr.setDrawProp(SPRITE_DRAW_CENTER, SPRITE_DRAW_TRANS, 0)
medicSpr.drawxy(800 \ 2, 600 \ 2)
#ifdef FIRST_RUN
medicSpr.saveToFbDataFormat("unimog_first_aid.data")
#endif
endNow:
print "End, press any key"
while inkey = "": wend
Code: Select all
data 48, 48, 16
data &hFFFF00FF, &hFFEDECD4, &hFFFFD800, &hFFFFEB00, &hFFFFB27F, &hFF808080, &hFF404040, &hFF303030, &hFF000000, &hFFD02F2F, &hFF0026FF, &hFF0094FF, &hFF7FC9FF, &hFFA0A0A0, &hFFA92020, &hFFFF0000
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 02, 03, 02, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 02, 03, 02, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 04, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 04, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 01, 04, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 04, 01, 05, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 01, 04, 04, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 04, 04, 01, 05, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 01, 04, 04, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 06, 04, 04, 01, 05, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 05, 01, 07, 04, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 04, 07, 01, 05, 05, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 05, 01, 07, 04, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 04, 07, 01, 05, 05, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 05, 05, 01, 07, 04, 01, 01, 01, 01, 01, 01, 01, 09, 09, 01, 01, 01, 01, 01, 01, 01, 04, 07, 01, 05, 05, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 05, 05, 01, 07, 04, 01, 10, 10, 01, 01, 01, 01, 09, 09, 01, 01, 01, 01, 10, 10, 01, 04, 07, 01, 05, 05, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 05, 05, 01, 07, 04, 10, 11, 11, 10, 01, 09, 09, 09, 09, 09, 09, 01, 10, 11, 11, 10, 04, 07, 01, 05, 05, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 05, 05, 01, 07, 04, 10, 12, 12, 10, 01, 09, 09, 09, 09, 09, 09, 01, 10, 12, 12, 10, 04, 07, 01, 05, 05, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 05, 05, 01, 04, 04, 01, 10, 10, 01, 01, 01, 01, 09, 09, 01, 01, 01, 01, 10, 10, 01, 04, 04, 01, 05, 05, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 05, 05, 01, 04, 04, 01, 01, 01, 01, 01, 01, 01, 09, 09, 01, 01, 01, 01, 01, 01, 01, 04, 04, 01, 05, 05, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 05, 05, 01, 04, 04, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 04, 04, 01, 05, 05, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 05, 05, 01, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 01, 05, 05, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 08, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 13, 13, 07, 07, 07, 07, 08, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 08, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 13, 13, 07, 07, 07, 07, 08, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 07, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 07, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 07, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 05, 07, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 07, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 05, 07, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 07, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 05, 07, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 07, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 05, 07, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 06, 06, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 06, 06, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 06, 06, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 06, 06, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 09, 09, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 13, 13, 01, 01, 01, 09, 09, 09, 09, 09, 09, 09, 14, 14, 09, 09, 09, 09, 09, 09, 09, 01, 01, 01, 13, 13, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 13, 13, 01, 01, 01, 09, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 09, 01, 01, 01, 13, 13, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 06, 06, 01, 01, 01, 09, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 09, 01, 01, 01, 06, 06, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 06, 06, 01, 01, 01, 09, 09, 09, 09, 09, 09, 09, 14, 14, 09, 09, 09, 09, 09, 09, 09, 01, 01, 01, 06, 06, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 07, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 14, 14, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 09, 09, 09, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 08, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 13, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 13, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 06, 06, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 13, 06, 06, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 06, 06, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 06, 06, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 15, 15, 15, 15, 00, 00, 00, 00, 00, 00, 06, 06, 06, 06, 00, 00, 00, 00, 00, 00, 15, 15, 15, 15, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
data 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00