Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


SOIL: new lightweight image loading lib


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
130 replies to this topic

#41 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 12 September 2007 - 05:22 AM

Quote:
Original post by Davian_
Hi. The library is looking good so far. Thanks!
...
I'm using VS.NET 2003, have the project linked to libSOIL.a, and the file in question includes SOIL.h.

Thanks! When using VS.NET 2k3, I'd recommend linking against one of the MS compiler generated *.lib files. (The libSOIL.a file is meant for the MinGW compiler.) I'd try SOIL_vc7.lib first to verify that it works.

If that doesn't fix the issue, I'd try including "math.h" in that same source file and try doing a "temp = sqrtf( temp );" and see if that causes any problems.

Sponsor:

#42 Davian_   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 September 2007 - 07:41 AM

Sorry, browser hiccup caused a double post.

#43 Davian_   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 September 2007 - 07:42 AM

Hi. Switching to SOIL_vc7.lib produces the following errors:

error LNK2019: unresolved external symbol _convert_image_to_DXT1 referenced in function _SOIL_internal_create_OGL_texture
error LNK2019: unresolved external symbol _convert_image_to_DXT5 referenced in function _SOIL_internal_create_OGL_texture
error LNK2019: unresolved external symbol _save_image_as_DDS referenced in function _SOIL_save_image

It doesn't seem that there is any difference in including math.h or not, and using a function like sqrt() does not cause an error.

#44 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 13 September 2007 - 05:44 AM

Quote:
Original post by Davian_
Hi. Switching to SOIL_vc7.lib produces the following errors:

error LNK2019: unresolved external symbol _convert_image_to_DXT1 referenced in function _SOIL_internal_create_OGL_texture
error LNK2019: unresolved external symbol _convert_image_to_DXT5 referenced in function _SOIL_internal_create_OGL_texture
error LNK2019: unresolved external symbol _save_image_as_DDS referenced in function _SOIL_save_image

It doesn't seem that there is any difference in including math.h or not, and using a function like sqrt() does not cause an error.

Hey, as it turns out, I'm a moron! In the VS projects I forgot to include the DXT code. And in VS2k3 I can use sqrt(), but not sqrtf(), so I'll make the changes to the code, recompile everything, and upload the new version by tonight. Thanks so much for finding and reporting these errors!

#45 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 13 September 2007 - 01:48 PM

Quote:
Original post by lonesock
...so I'll make the changes to the code, recompile everything, and upload the new version by tonight...

I ran into a small problem. I'm trying to have just a single one of the compiled libraries for MS compilers in the distribution. The VC6 version of the lib is now working with all MS compilers. The 2k3 version of the lib is unfortunately the largest. The 2k5 version of the lib is the smallest & fastest, so I wanted to use that, however when I try to use it with 2k3 I get an error about ftol2_sse not being defined.

So I have uploaded the fixed (for MS compilers) version of SOIL with the VC6 version of SOIL.lib. If anybody knows what I should be doing to get 2k5 to compile without the _sse version of the function, I'll update the "one true lib" to using the 2005 compiler's version. I will update the website documentation after I've ironed all this out, but at least the current version should get you up and running, Davian_!

thanks for you patience, everybody.

#46 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 20 September 2007 - 09:21 AM

I've uploaded a new version of SOIL:
* upgraded to stb_image version 1.00
* only including 1 prebuilt library file (libSOIL.a) which works for MinGW and Microsoft compilers (including VS 2003)
* added the DXT source files to the MS projects so you can recompile the lib if you wish
* updated the Usage section of the SOIL website with an example of SOIL_load_OGL_texture_from_memory

Please let me know if the new version works for all'y'all. Thanks so much for testing SOIL and reporting problems.

#47 let_bound   Members   -  Reputation: 488

Like
0Likes
Like

Posted 20 September 2007 - 09:28 AM

Quote:
Original post by shotgunnutter
This will allow the code to compile on gcc 4.0.2 and on MSC. I haven't tested it on a Linux system but the headers are the same as for OS X.


I thought I'd let you know: the headers definitely aren't the same. The OpenGL headers are in a GL/ directory on most UN*X-like systems. Mac OS X is an exception.


#48 Merick Zero   Members   -  Reputation: 151

Like
0Likes
Like

Posted 21 September 2007 - 11:39 AM

I just used swig to translate soil.h for FreeBasic. I don't really know enough about ogl to really use it yet, but by plugging it into some FB ogl examples I was able to verify that libSOIL.a does work when linked statically in FB.

''
''
'' soil -- header translated with help of SWIG FB wrapper
''
'' NOTICE: This file is part of the FreeBASIC Compiler package and can't
'' be included in other distributions without authorization.
''
''
#ifndef __soil_bi__
#define __soil_bi__
#inclib "SOIL"

enum
SOIL_LOAD_AUTO = 0
SOIL_LOAD_L = 1
SOIL_LOAD_LA = 2
SOIL_LOAD_RGB = 3
SOIL_LOAD_RGBA = 4
end enum

enum
SOIL_CREATE_NEW_ID = 0
end enum

enum
SOIL_FLAG_POWER_OF_TWO = 1
SOIL_FLAG_MIPMAPS = 2
SOIL_FLAG_TEXTURE_REPEATS = 4
SOIL_FLAG_MULTIPLY_ALPHA = 8
SOIL_FLAG_INVERT_Y = 16
SOIL_FLAG_COMPRESS_TO_DXT = 32
SOIL_FLAG_DDS_LOAD_DIRECT = 64
end enum

enum
SOIL_SAVE_TYPE_TGA = 0
SOIL_SAVE_TYPE_BMP
SOIL_SAVE_TYPE_DDS
end enum

declare function SOIL_load_OGL_texture cdecl alias "SOIL_load_OGL_texture" (byval filename as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_cubemap cdecl alias "SOIL_load_OGL_cubemap" (byval x_pos_file as zstring ptr, byval x_neg_file as zstring ptr, byval y_pos_file as zstring ptr, byval y_neg_file as zstring ptr, byval z_pos_file as zstring ptr, byval z_neg_file as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_single_cubemap cdecl alias "SOIL_load_OGL_single_cubemap" (byval filename as zstring ptr, byval face_order as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_texture_from_memory cdecl alias "SOIL_load_OGL_texture_from_memory" (byval buffer as ubyte ptr, byval buffer_length as integer, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_cubemap_from_memory cdecl alias "SOIL_load_OGL_cubemap_from_memory" (byval x_pos_buffer as ubyte ptr, byval x_pos_buffer_length as integer, byval x_neg_buffer as ubyte ptr, byval x_neg_buffer_length as integer, byval y_pos_buffer as ubyte ptr, byval y_pos_buffer_length as integer, byval y_neg_buffer as ubyte ptr, byval y_neg_buffer_length as integer, byval z_pos_buffer as ubyte ptr, byval z_pos_buffer_length as integer, byval z_neg_buffer as ubyte ptr, byval z_neg_buffer_length as integer, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_single_cubemap_from_memory cdecl alias "SOIL_load_OGL_single_cubemap_from_memory" (byval buffer as ubyte ptr, byval buffer_length as integer, byval face_order as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_create_OGL_texture cdecl alias "SOIL_create_OGL_texture" (byval data as ubyte ptr, byval width as integer, byval height as integer, byval channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_create_OGL_single_cubemap cdecl alias "SOIL_create_OGL_single_cubemap" (byval data as ubyte ptr, byval width as integer, byval height as integer, byval channels as integer, byval face_order as zstring ptr, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_save_screenshot cdecl alias "SOIL_save_screenshot" (byval filename as zstring ptr, byval image_type as integer, byval x as integer, byval y as integer, byval width as integer, byval height as integer) as integer
declare function SOIL_load_image cdecl alias "SOIL_load_image" (byval filename as zstring ptr, byval width as integer ptr, byval height as integer ptr, byval channels as integer ptr, byval force_channels as integer) as ubyte ptr
declare function SOIL_load_image_from_memory cdecl alias "SOIL_load_image_from_memory" (byval buffer as ubyte ptr, byval buffer_length as integer, byval width as integer ptr, byval height as integer ptr, byval channels as integer ptr, byval force_channels as integer) as ubyte ptr
declare function SOIL_save_image cdecl alias "SOIL_save_image" (byval filename as zstring ptr, byval image_type as integer, byval width as integer, byval height as integer, byval channels as integer, byval data as ubyte ptr) as integer
declare sub SOIL_free_image_data cdecl alias "SOIL_free_image_data" (byval img_data as ubyte ptr)
declare function SOIL_last_result cdecl alias "SOIL_last_result" () as zstring ptr

#endif




*edit*

Is there a function to get the pixel width and height of the image?

[Edited by - Merick Zero on September 21, 2007 9:39:32 PM]

#49 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 24 September 2007 - 06:07 AM

Quote:
Original post by Merick Zero
I just used swig to translate soil.h for FreeBasic. I don't really know enough about ogl to really use it yet, but by plugging it into some FB ogl examples I was able to verify that libSOIL.a does work when linked statically in FB.

*** Source Snippet Removed ***

*edit*

Is there a function to get the pixel width and height of the image?

Awesome! Do you mind if I include this file in the SOIL distribution zip?

As to getting the image size, you have 2 options:
1) use the OpenGL function glGetTexLevelParameter (see here) once the texture object is bound (which it is right after a call to SOIL's upload functions)
2) use a 2-step process where you call SOIL_load_image and get the image data (including size), then call SOIL_create_OGL_texture with the image data you just loaded.

#50 Merick Zero   Members   -  Reputation: 151

Like
0Likes
Like

Posted 24 September 2007 - 02:03 PM

Quote:
Original post by lonesock
Awesome! Do you mind if I include this file in the SOIL distribution zip?


Sure thing. After all, all I did was just run it through the FB version of swig to get a machine translation. -- And as such, it should be noted that all the functions should be tested with FB to make sure that there are no glitches in the translation (I actually only tested one function, SOIL_load_OGL_texture). I'd do it myself, but as I said before I'm still trying to figure out opengl and it'll probably be a while before I can really do anything with it.

#51 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 05 October 2007 - 01:09 PM

A new update is out:
* fixed a rare memory error in up_scale_image (thanks Pete!)
* sped up the up_scale_image function
* added SOIL_FLAG_NTSC_SAFE_RGB to SOIL, which causes SOIL to scale the RGB values from [0,255] to [16,235], the "safe range" for NTSC output devices (a.k.a. most US TV sets). Alpha levels remain untouched.

I plan on trying to optimize my MIPmap generation code, as that seems to be the most common bottleneck now. I will also be playing with a few different programming languages to make sure they can use SOIL (thanks for the inspiration, Merick Zero!)

#52 thelovegoose   Members   -  Reputation: 100

Like
0Likes
Like

Posted 05 October 2007 - 02:36 PM

oops

[Edited by - thelovegoose on October 5, 2007 9:36:38 PM]

#53 Merick Zero   Members   -  Reputation: 151

Like
0Likes
Like

Posted 15 October 2007 - 05:54 AM

I've got a problem using this in FreeBasic. First, if I make multiple calls to SOIL_load_OGL_texture using the SOIL_CREATE_NEW_ID flag, all of them end up returning 0 for the texture id. Aside from the fact that it just keeps over-writing the same texture with the new image, 0 is also what gets returned on an error

However, if I do specify a number for the texture id it works fine.

#54 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 17 October 2007 - 05:35 AM

I will look into this, thanks for the info.

*Edited to load 2 images*

OK, I have it working with the following lines:

dim shared g_texture as GLuint
dim shared g_texture2 as GLuint
g_texture = SOIL_load_OGL_texture( "terrain.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS )
g_texture2 = SOIL_load_OGL_texture( "mars-ter.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS )

And here is the header file (I re-ran SWIG with the latest version, so make sure you are using the latest libSOIL.a file); SOIL.bi

''
''
'' Jonathan Dummer
'' Simple OpenGL Image Library
'' MIT License
''
'' I'm using Sean's Tool Box image loader as a base:
'' http://www.nothings.org/
''
'' Note: header translated with help of SWIG FB wrapper
'' Check the SOIL.h file for more information
''
#ifndef __SOIL_bi__
#define __SOIL_bi__

#inclib "SOIL"

enum
SOIL_LOAD_AUTO = 0
SOIL_LOAD_L = 1
SOIL_LOAD_LA = 2
SOIL_LOAD_RGB = 3
SOIL_LOAD_RGBA = 4
end enum

enum
SOIL_CREATE_NEW_ID = 0
end enum

enum
SOIL_FLAG_POWER_OF_TWO = 1
SOIL_FLAG_MIPMAPS = 2
SOIL_FLAG_TEXTURE_REPEATS = 4
SOIL_FLAG_MULTIPLY_ALPHA = 8
SOIL_FLAG_INVERT_Y = 16
SOIL_FLAG_COMPRESS_TO_DXT = 32
SOIL_FLAG_DDS_LOAD_DIRECT = 64
SOIL_FLAG_NTSC_SAFE_RGB = 128
end enum

enum
SOIL_SAVE_TYPE_TGA = 0
SOIL_SAVE_TYPE_BMP = 1
SOIL_SAVE_TYPE_DDS = 2
end enum

const SOIL_DDS_CUBEMAP_FACE_ORDER = "EWUDNS"

declare function SOIL_load_OGL_texture cdecl alias "SOIL_load_OGL_texture" (byval filename as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_cubemap cdecl alias "SOIL_load_OGL_cubemap" (byval x_pos_file as zstring ptr, byval x_neg_file as zstring ptr, byval y_pos_file as zstring ptr, byval y_neg_file as zstring ptr, byval z_pos_file as zstring ptr, byval z_neg_file as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_single_cubemap cdecl alias "SOIL_load_OGL_single_cubemap" (byval filename as zstring ptr, byval face_order as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_texture_from_memory cdecl alias "SOIL_load_OGL_texture_from_memory" (byval buffer as ubyte ptr, byval buffer_length as integer, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_cubemap_from_memory cdecl alias "SOIL_load_OGL_cubemap_from_memory" (byval x_pos_buffer as ubyte ptr, byval x_pos_buffer_length as integer, byval x_neg_buffer as ubyte ptr, byval x_neg_buffer_length as integer, byval y_pos_buffer as ubyte ptr, byval y_pos_buffer_length as integer, byval y_neg_buffer as ubyte ptr, byval y_neg_buffer_length as integer, byval z_pos_buffer as ubyte ptr, byval z_pos_buffer_length as integer, byval z_neg_buffer as ubyte ptr, byval z_neg_buffer_length as integer, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_load_OGL_single_cubemap_from_memory cdecl alias "SOIL_load_OGL_single_cubemap_from_memory" (byval buffer as ubyte ptr, byval buffer_length as integer, byval face_order as zstring ptr, byval force_channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_create_OGL_texture cdecl alias "SOIL_create_OGL_texture" (byval data as ubyte ptr, byval width as integer, byval height as integer, byval channels as integer, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_create_OGL_single_cubemap cdecl alias "SOIL_create_OGL_single_cubemap" (byval data as ubyte ptr, byval width as integer, byval height as integer, byval channels as integer, byval face_order as zstring ptr, byval reuse_texture_ID as uinteger, byval flags as uinteger) as uinteger
declare function SOIL_save_screenshot cdecl alias "SOIL_save_screenshot" (byval filename as zstring ptr, byval image_type as integer, byval x as integer, byval y as integer, byval width as integer, byval height as integer) as integer
declare function SOIL_load_image cdecl alias "SOIL_load_image" (byval filename as zstring ptr, byval width as integer ptr, byval height as integer ptr, byval channels as integer ptr, byval force_channels as integer) as ubyte ptr
declare function SOIL_load_image_from_memory cdecl alias "SOIL_load_image_from_memory" (byval buffer as ubyte ptr, byval buffer_length as integer, byval width as integer ptr, byval height as integer ptr, byval channels as integer ptr, byval force_channels as integer) as ubyte ptr
declare function SOIL_save_image cdecl alias "SOIL_save_image" (byval filename as zstring ptr, byval image_type as integer, byval width as integer, byval height as integer, byval channels as integer, byval data as ubyte ptr) as integer
declare sub SOIL_free_image_data cdecl alias "SOIL_free_image_data" (byval img_data as ubyte ptr)
declare function SOIL_last_result cdecl alias "SOIL_last_result" () as zstring ptr

#endif


Note that returning 0 signifies an error, as you mentioned, because OpenGL will return a 0 if it fails to generate a texture ID. Binding a 0 as your texture ID is now (I believe) undefined.

[Edited by - lonesock on October 17, 2007 1:35:44 PM]

#55 Merick Zero   Members   -  Reputation: 151

Like
0Likes
Like

Posted 17 October 2007 - 11:03 AM

Which version of the FreeBasic compiler did you test it with? With 0.18 r2, this code:

#include once "GL/gl.bi"
#include once "soil.bi"

dim shared g_texture as GLuint
dim shared g_texture2 as GLuint

screen 18

glGenLists 10

g_texture = SOIL_load_OGL_texture( "ball.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS )
print g_texture
print *SOIL_last_result

g_texture2 = SOIL_load_OGL_texture( "mc.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS )
print g_texture2
print *SOIL_last_result


sleep


gives me this output:

0
Image loaded as an OpenGL texture


0
Image loaded as an OpenGL texture


Just in case, I did re-download the .zip from your link, but the libsoil.a in the archive is the same as the one I was already using.

#56 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 18 October 2007 - 10:05 AM

Quote:
Original post by Merick Zero
gives me this output:
0
Image loaded as an OpenGL texture

Well, the 0 is most likely because there is no OpenGL context yet. If I understand the FreeBasic docs correctly, you need to say "screen 18,16,,&h02" or something similar to actually initialize the OpenGL driver. I've had trouble doing just that simple example, though...it seems that if you don't actually display anything then the context is not created. However when I drop the SOIL test code into already working OpenGL examples (provided with the FB compiler) it has worked.

The "Image loaded as an OpenGL texture" part means that SOIL doesn't detect this class of error. I will get working on that.

#57 Merick Zero   Members   -  Reputation: 151

Like
0Likes
Like

Posted 18 October 2007 - 02:28 PM

Ah, so that's what was wrong

#include once "fbgfx.bi"
#include once "GL/gl.bi"
#include once "soil.bi"

dim shared g_texture as GLuint
dim shared g_texture2 as GLuint

screenres 648,480,32, 1, FB.GFX_OPENGL, FB.GFX_MULTISAMPLE

glGenLists 10
open cons for output as #1

g_texture = SOIL_load_OGL_texture( "ball.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS )
print #1, g_texture
print #1, *SOIL_last_result

g_texture2 = SOIL_load_OGL_texture( "mc.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS )
print #1, g_texture2
print #1, *SOIL_last_result


while not multikey(FB.SC_ESCAPE)
flip
wend


"fbgfx.bi" puts the constants for the internal graphics and keyboard scancodes into the FB namespace

#58 Dancho   Members   -  Reputation: 151

Like
0Likes
Like

Posted 22 October 2007 - 09:38 AM

heya,
Im testing your image loading libery and having problem with this little snippet:


#include <soil.h>
#include <glfw.h>

int main(int argc,char *argv[])
{
GLuint tex_2d;

tex_2d=SOIL_load_OGL_texture("somepicname.png",SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);

return 0;
}


and these are errors:

error LNK2005: _SOIL_DDS_CUBEMAP_FACE_ORDER already defined in main.obj

fatal error LNK1169: one or more multiply defined symbols found

libs (glfw,soil,opengl32,glu32) are linked staticly in console project VC++2005EE and compiled as C language,

thanks for your time,
Dancho

#59 lonesock   Members   -  Reputation: 803

Like
0Likes
Like

Posted 22 October 2007 - 06:07 PM

@Dancho: Thanks for testing SOIL! I'm not sure why that error occurs, but I have a suspicion. I have 2k5 EE at home, so I will test this within a few days. In the mean time you may be able to get it to compile and run by commenting out the offending lines (you can pass in "EWUDNS" instead if needed):

/*
const char SOIL_DDS_CUBEMAP_FACE_ORDER[] =
{ 'E', 'W', 'U', 'D', 'N', 'S' };
*/

BTW, in that snippet SOIL_load_OGL_texture will have trouble because there is no OpenGL context. You will need to call glfwInit() and glfwOpenWindow(...) before SOIL can upload OpenGL textures. It can still load them just fine for other purposes (via SOIL_load_image(), etc.).

Thanks again for testing SOIL and for the feedback!

#60 Dancho   Members   -  Reputation: 151

Like
0Likes
Like

Posted 22 October 2007 - 08:49 PM

@lonesock
np,I think that SOIL project have a great potential and Im glad I could help hounting all bugs...





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS