Autocomplete from within --- Nicolas's suggestion

5 views
Skip to first unread message

devrim

unread,
Jun 13, 2009, 11:28:56 PM6/13/09
to Kodingen

I think once we get the Json for the code within the project, adding
the ones you create on the file you work on, won't be that difficult.

From your example, I understand that $user->getBirthdate(); returns
Zend_Date. You want to catch that..

Well, I haven't seen this before, they do show you if you do:

$x = new User();
$x-> (will list user class' methods in autocomplete)

$y = $x->method();

$y-> (will yield nothing out of my experience)

Let's find out dream solution, best solution and just a solution and
see which one is most feasible.

Cheers,
D


Nicolas wrote:

Your idea works for not OO Code. But with object oriented code it gets
a lot more complicate. Because during typing a variable name, it needs
to the type of this variable:

$user = new User(1);
$date = $user->getBirthdate();
$date->...

So here it needs to know first, that user is a user object and has the
function getBirthdate. Then it needs to know the return type of this
function (perhaps a Zend_Date type). And based on this, it shows the
available functions for date. I need to find out how it works in
eclipse or netbeans.

I assume the problem wont be the size of some json code, it's more the
processing power that is needed.

What do you think about this project: https://bespin.mozilla.com/ ?


Am 13.06.2009 um 10:47 schrieb Devrim Yasar:

Hi Nicolas,

I see how you approach to this problem. I think it may not be that
difficult in the end. Here is how I see it;

- we are implementing a search function right now (a typical one that
you can find in any editor, that searches multiple files and displays
results)

using this function

- once you denote a folder as a project
- kodingen can search for methods and functions in your code every 5
mins (or per change)
- saves this data as json, and updates it regularly
- and feeds it to editor for code completion.

I just don't know how expensive that it'd be in terms of CPU and
memory and browser cache. But I'd assume that in 100 lines of code
there will be on average 10 methods/functions that of say 100 chars,
so on 50000 line of code this would translate to 5k's of json per
project (sorry if my math sucks, it is 4:42am here).

I'd also assume that if we get this functionality within our code
editor, where will be so little to no reason to stay on desktop
environments, so I heartily and fully be together with you on this
venture.

Maybe we should get this conversation going on a mailing list :) it is
pretty interesting..

Cheers,
D

On Jun 13, 2009, at 4:29 AM, Ruflin wrote:

I assume code completion wont be that easy. I think it's not that hard
to implement it for example for php function. But code completion is
especially useful with frameworks and bigger projects. As an example
with Zend Framework:

I type

Zend_Json::

Then it offers me a list with encode, decode and directly the short
documentation for it.

Or if I created an object user with functions like getName() I can
type:

$user = new User(15);
$user->

and it offers me the list of available functions.

So it's not just a local problem. As far as I can see CodeEditing is
"only" an Editor. So the editor is not aware of other source code
files and doesn't "understand" the code. I don't know you how you
could solve this yet. If you like i can digg a bit more into the
problem to come up with a possible solution or at least an approach.

I'm really interested in the whole project. Who is standing behind the
project? On what are you developing the whole platform (Language /
Framework)?
At the moment I'm pretty busy, but I should have some more time in a
month. I saw that you are looking for developers. Perhaps then I can
lend a hand.

I will use the google issue tracker in the future.

Greetings Nicolas

--
"Hi Nicolas,

It is wonderful to hear you are making such plans. This is definitely
a motivation for us to release faster.

your first point: this would be cool, i'll add it to our list. I think
i can squeeze it in with search files function.

second: we are using codemirror for code editing, we can pressure him
to get us a new version what do you think? :)

I hope everything will work out by the end of July so that you can
have your classes with Kodingen.

If you would like to help us by submitting bugs and feature requests
you are welcome to join us at, http://code.google.com/p/kodingen/issues/list

Cheers,
D"

Am 13.06.2009 um 02:17 schrieb Devrim Yasar:

Hi Ruflin,

Actually, that's the very next thing that you will see on Kodingen,
probably in 2 weeks we will be able to finish internal testing and GUI
integration. This task is dependent on our accounts-collaboration
module (instant chat, instant collaboration on same code) so I can't
say exactly but this is what we are working on right now, maybe we
will find a shorter way to deploy it without it's dependencies.

Thanks for the feedback!

Cheers,
Devrim

On Jun 12, 2009, at 8:01 PM, feed...@kodingen.com wrote:

is it possible to be a bit more specific when svn is going to release?
That\'s one of the last things that keeps me back from using kodingen
a lot
more.


Feedback from:ruflin [Question:svn soon? how soon?]


User ID......:129

Date.............: June 12, 2009, 8:01 pm
Page.............:
Name.......: ruflin

Email......: sp...@ruflin.com

IP Address....: 80.219.203.197
Host.......:

Browser....:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-
de)
AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17



Probably it's a good idea to get this conversation to a mailing list,
but which mailing list?

Your idea works for not OO Code. But with object oriented code it gets
a lot more complicate. Because during typing a variable name, it needs
to the type of this variable:

$user = new User(1);
$date = $user->getBirthdate();
$date->...

So here it needs to know first, that user is a user object and has the
function getBirthdate. Then it needs to know the return type of this
function (perhaps a Zend_Date type). And based on this, it shows the
available functions for date. I need to find out how it works in
eclipse or netbeans.

I assume the problem wont be the size of some json code, it's more the
processing power that is needed.

What do you think about this project: https://bespin.mozilla.com/ ?


Am 13.06.2009 um 10:47 schrieb Devrim Yasar:

Hi Nicolas,

I see how you approach to this problem. I think it may not be that
difficult in the end. Here is how I see it;

- we are implementing a search function right now (a typical one that
you can find in any editor, that searches multiple files and displays
results)

using this function

- once you denote a folder as a project
- kodingen can search for methods and functions in your code every 5
mins (or per change)
- saves this data as json, and updates it regularly
- and feeds it to editor for code completion.

I just don't know how expensive that it'd be in terms of CPU and
memory and browser cache. But I'd assume that in 100 lines of code
there will be on average 10 methods/functions that of say 100 chars,
so on 50000 line of code this would translate to 5k's of json per
project (sorry if my math sucks, it is 4:42am here).

I'd also assume that if we get this functionality within our code
editor, where will be so little to no reason to stay on desktop
environments, so I heartily and fully be together with you on this
venture.

Maybe we should get this conversation going on a mailing list :) it is
pretty interesting..

Cheers,
D

On Jun 13, 2009, at 4:29 AM, Ruflin wrote:

I assume code completion wont be that easy. I think it's not that hard
to implement it for example for php function. But code completion is
especially useful with frameworks and bigger projects. As an example
with Zend Framework:

I type

Zend_Json::

Then it offers me a list with encode, decode and directly the short
documentation for it.

Or if I created an object user with functions like getName() I can
type:

$user = new User(15);
$user->

and it offers me the list of available functions.

So it's not just a local problem. As far as I can see CodeEditing is
"only" an Editor. So the editor is not aware of other source code
files and doesn't "understand" the code. I don't know you how you
could solve this yet. If you like i can digg a bit more into the
problem to come up with a possible solution or at least an approach.

I'm really interested in the whole project. Who is standing behind the
project? On what are you developing the whole platform (Language /
Framework)?
At the moment I'm pretty busy, but I should have some more time in a
month. I saw that you are looking for developers. Perhaps then I can
lend a hand.

I will use the google issue tracker in the future.

Greetings Nicolas

--
"Hi Nicolas,

It is wonderful to hear you are making such plans. This is definitely
a motivation for us to release faster.

your first point: this would be cool, i'll add it to our list. I think
i can squeeze it in with search files function.

second: we are using codemirror for code editing, we can pressure him
to get us a new version what do you think? :)

I hope everything will work out by the end of July so that you can
have your classes with Kodingen.

If you would like to help us by submitting bugs and feature requests
you are welcome to join us at, http://code.google.com/p/kodingen/issues/list

Cheers,
D"

Am 13.06.2009 um 02:17 schrieb Devrim Yasar:

Hi Ruflin,

Actually, that's the very next thing that you will see on Kodingen,
probably in 2 weeks we will be able to finish internal testing and GUI
integration. This task is dependent on our accounts-collaboration
module (instant chat, instant collaboration on same code) so I can't
say exactly but this is what we are working on right now, maybe we
will find a shorter way to deploy it without it's dependencies.

Thanks for the feedback!

Cheers,
Devrim

On Jun 12, 2009, at 8:01 PM, feed...@kodingen.com wrote:

is it possible to be a bit more specific when svn is going to release?
That\'s one of the last things that keeps me back from using kodingen
a lot
more.


Feedback from:ruflin [Question:svn soon? how soon?]


User ID......:129

Date.............: June 12, 2009, 8:01 pm
Page.............:
Name.......: ruflin

Email......: sp...@ruflin.com

IP Address....: 80.219.203.197
Host.......:

Browser....:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-
de)
AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17



Duckness

unread,
Jun 14, 2009, 6:03:09 AM6/14/09
to Kodingen
I have been thinking about this code completition too. It would take
Kodingen to a whole new level but as mentioned I guess it will take a
lot of CPU usage on the server. But there might be a possibility to
move the CPU usage to the client somehow. My experience with
Javascript/JQuery/JSon is not that big so I don't know for sure if
that's possible.

But it might be very interesting to look into. I'm going to look up
some things myself! If I find something interesting, I'll let you
know!
> you are welcome to join us at,http://code.google.com/p/kodingen/issues/list
>
> Cheers,
> D"
>
> Am 13.06.2009 um 02:17 schrieb Devrim Yasar:
>
> Hi Ruflin,
>
> Actually, that's the very next thing that you will see on Kodingen,
> probably in 2 weeks we will be able to finish internal testing and GUI
> integration. This task is dependent on our accounts-collaboration
> module (instant chat, instant collaboration on same code) so I can't
> say exactly but this is what we are working on right now, maybe we
> will find a shorter way to deploy it without it's dependencies.
>
> Thanks for the feedback!
>
> Cheers,
> Devrim
>
> On Jun 12, 2009, at 8:01 PM, feedb...@kodingen.com wrote:
>
> is it possible to be a bit more specific when svn is going to release?
> That\'s one of the last things that keeps me back from using kodingen
> a lot
> more.
>
>                         Feedback from:ruflin [Question:svn soon? how soon?]
>
>                         User ID......:129
>
>                         Date.............: June 12, 2009, 8:01 pm
>                         Page.............:
>                         Name.......: ruflin
>
>                         Email......: s...@ruflin.com
>
>                         IP Address....: 80.219.203.197
>                         Host.......:
>
>                         Browser....:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-
> de)
> AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17
>
> Probably it's a good idea to get this conversation to a mailing list,
> but which mailing list?
>
> Your idea works for not OO Code. But with object oriented code it gets
> a lot more complicate. Because during typing a variable name, it needs
> to the type of this variable:
>
> $user = new User(1);
> $date = $user->getBirthdate();
> $date->...
>
> So here it needs to know first, that user is a user object and has the
> function getBirthdate. Then it needs to know the return type of this
> function (perhaps a Zend_Date type). And based on this, it shows the
> available functions for date. I need to find out how it works in
> eclipse or netbeans.
>
> I assume the problem wont be the size of some json code, it's more the
> processing power that is needed.
>
> What do you think about this project:https://bespin.mozilla.com/?
>
> you are welcome to join us at,http://code.google.com/p/kodingen/issues/list
>
> Cheers,
> D"
>
> Am 13.06.2009 um 02:17 schrieb Devrim Yasar:
>
> Hi Ruflin,
>
> Actually, that's the very next thing that you will see on Kodingen,
> probably in 2 weeks we will be able to finish internal testing and GUI
> integration. This task is dependent on our accounts-collaboration
> module (instant chat, instant collaboration on same code) so I can't
> say exactly but this is what we are working on right now, maybe we
> will find a shorter way to deploy it without it's dependencies.
>
> Thanks for the feedback!
>
> Cheers,
> Devrim
>
> On Jun 12, 2009, at 8:01 PM, feedb...@kodingen.com wrote:
>
> is it possible to be a bit more specific when svn is going to release?
> That\'s one of the last things that keeps me back from using kodingen
> a lot
> more.
>
>                         Feedback from:ruflin [Question:svn soon? how soon?]
>
>                         User ID......:129
>
>                         Date.............: June 12, 2009, 8:01 pm
>                         Page.............:
>                         Name.......: ruflin
>
>                         Email......: s...@ruflin.com

Nicolas Ruflin

unread,
Jun 14, 2009, 3:31:49 AM6/14/09
to kodi...@googlegroups.com
Here an other feature that works in Eclipse:

"nesting" functions
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Kodingen" group.
To post to this group, send email to kodi...@googlegroups.com
To unsubscribe from this group, send email to kodingen+u...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/kodingen?hl=en
-~----------~----~----~----~------~----~------~--~---


Nicolas Ruflin

unread,
Jun 14, 2009, 2:34:53 AM6/14/09
to kodi...@googlegroups.com
I thought that's exactly how eclipse work. But you were right. In some cases it works, in some not, and in other cases it offers a wrong object.

Here with a static function it works. I need to test this one a bit more.

Let's see what's possible. 

Am 14.06.2009 um 05:28 schrieb devrim:

devrim

unread,
Jun 14, 2009, 11:19:57 AM6/14/09
to Kodingen
Nicolas,

Can you find out how exactly they search and index? Do they search
files and create a database before you start working on the project?
Or do they look at the current code you are working on, see included
files/dependencies and just check those files for methods and
functions?

I'm guessing they check whole project once and update it regularly,
which would be in my opinion what we should do.

in overview;

A- Main functionality
1- search whole project directory
2- index everything that can be used in auto-complete.
3- feed this json to each codemirror that opens with a file under
this project.

B- Supplementaries
1- support variables assigned to objects on multiple levels
$x = new User();
$x->[AutoComplete]

$y = $x;
$y->[AC]

2- support return values of custom methods {dream solution}

$a = $x->getMyObject();

$a->[AC from MyObject]

I have to admit this can be whole lot trickier than I can imagine
right now but it won't hurt to try :)

If you guys agree on breakdown, I think we can release the A part and
get ready for B. A will bring at least Kodingen to the same level of
most IDE's.

I'm not much worried about CPU overhead most of the project stays
intact we only change a little each time (server can search only
modified files). I'm concerned about this new data that has to be
processed by codemirror, which may make overall coding experience
slower on browsers. We have take this into account make our indexing
really smart.

Cheers,
D

ps. M: We can't tackle this problem on the client side considering
people have all their files on the server (100s maybe 1000s).

ps2: Nicolas attachment pictures do not get stored here on google? i
see it on my inbox but not here, it's a pity, if more people join us
in the future, they won't see them..
On Jun 14, 2:34 am, Nicolas Ruflin <m...@ruflin.com> wrote:
> I thought that's exactly how eclipse work. But you were right. In some  
> cases it works, in some not, and in other cases it offers a wrong  
> object.
>
> Here with a static function it works. I need to test this one a bit  
> more.
>
> Let's see what's possible.
>
> > you are welcome to join us at,http://code.google.com/p/kodingen/issues/list
>
> > Cheers,
> > D"
>
> > Am 13.06.2009 um 02:17 schrieb Devrim Yasar:
>
> > Hi Ruflin,
>
> > Actually, that's the very next thing that you will see on Kodingen,
> > probably in 2 weeks we will be able to finish internal testing and GUI
> > integration. This task is dependent on our accounts-collaboration
> > module (instant chat, instant collaboration on same code) so I can't
> > say exactly but this is what we are working on right now, maybe we
> > will find a shorter way to deploy it without it's dependencies.
>
> > Thanks for the feedback!
>
> > Cheers,
> > Devrim
>
> > On Jun 12, 2009, at 8:01 PM, feedb...@kodingen.com wrote:
>
> > is it possible to be a bit more specific when svn is going to release?
> > That\'s one of the last things that keeps me back from using kodingen
> > a lot
> > more.
>
> >                    Feedback from:ruflin [Question:svn soon? how soon?]
>
> >                    User ID......:129
>
> >                    Date.............: June 12, 2009, 8:01 pm
> >                    Page.............:
> >                    Name.......: ruflin
>
> >                    Email......: s...@ruflin.com
>
> >                    IP Address....: 80.219.203.197
> >                    Host.......:
>
> >                    Browser....:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-
> > de)
> > AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17
>
> > Probably it's a good idea to get this conversation to a mailing list,
> > but which mailing list?
>
> > Your idea works for not OO Code. But with object oriented code it gets
> > a lot more complicate. Because during typing a variable name, it needs
> > to the type of this variable:
>
> > $user = new User(1);
> > $date = $user->getBirthdate();
> > $date->...
>
> > So here it needs to know first, that user is a user object and has the
> > function getBirthdate. Then it needs to know the return type of this
> > function (perhaps a Zend_Date type). And based on this, it shows the
> > available functions for date. I need to find out how it works in
> > eclipse or netbeans.
>
> > I assume the problem wont be the size of some json code, it's more the
> > processing power that is needed.
>
> > What do you think about this project:https://bespin.mozilla.com/?
>
> ...
>
> read more »

Duckness

unread,
Jun 14, 2009, 2:05:02 PM6/14/09
to Kodingen
Hi Devrim and Nicolas,

I think they check the project once and update it every time you
change something. (I think they're going true all files of the project
for that reason) The difference with Kodingen is that teamwork is much
more synchronized so we gotta check it more often. And off course
check only the modified files ...

What I meant with "moving the CPU usage to the client" is fe: The
clients saves a file (let's say with a php class in it) and the file
gets automaticly uploaded. Normally the server will then index the
file and send the updates to the client. But I thought it might be
useful to just let the client index the file and pass on the updates.
I'm not sure but I guess this will save already quite some CPU load.
Off course updates are still needed when the projects is being edited
by more then 1 user ...

I don't think it's gonna be easy but it's definitely possible! Not
sure if I can help developing but I can try and do some research
though ^^

Greetz
Maarten

PS: As you may have noticed my English isn't that good (which sucks
cause I have English exam tomorrow ^^) but I'm from Belgium and my
mother language is Dutch ... ;-) Although I understand most of it. I'm
just not that good at writing without mistakes ;-)
> ...
>
> meer lezen »

Nicolas Ruflin

unread,
Jun 14, 2009, 2:09:48 PM6/14/09
to kodi...@googlegroups.com
I'm going to look closer into this. But at the moment I don't have that much time.

I think we can also split it up into dynamic files and static files (framework). Frameworks like jQuery, Prototype, Code Igniter, Zend Framework ... can we scan only once. Somehow the user needs to be able to exclude folders from scanning an just select the frameworks he is using.

The problem with php, javascript is, that return values depend on the code documentation. So we need to define a standard to use that it will be available (I use phpDocs). In Java, it would be a bit easier, because the return type is in the function header. But I assume, most people are using it for PHP and JavaScript. There is no Servlet server yet.

Kodingen is written in PHP? Based on a Framework?

Nicolas Ruflin

unread,
Jun 14, 2009, 1:57:30 PM6/14/09
to kodi...@googlegroups.com
I'm going to look closer into this. But at the moment I don't have that much time.

I think we can also split it up into dynamic files and static files (framework). Frameworks like jQuery, Prototype, Code Igniter, Zend Framework ... can we scan only once. Somehow the user needs to be able to exclude folders from scanning an just select the frameworks he is using.

The problem with php, javascript is, that return values depend on the code documentation. So we need to define a standard to use that it will be available (I use phpDocs). In Java, it would be a bit easier, because the return type is in the function header. But I assume, most people are using it for PHP and JavaScript. There is no Servlet server yet.

Kodingen is written in PHP? Based on a Framework?

Nicolas Ruflin

unread,
Jun 14, 2009, 1:28:28 PM6/14/09
to kodi...@googlegroups.com
I'm not sure if all of it is possible with JavaScript. Perhaps an extension like GoogleGears can help.

We should create a requirement analysis to show what is exactly needed.

Devrim Yasar

unread,
Jun 14, 2009, 4:26:09 PM6/14/09
to kodi...@googlegroups.com
Kodingen is pure PHP written as a plugin to Buddypress, which is written as a plugin to wordpressMU, which is written on wordpress. No framework is used (except in our case wp served as a framework).

"So we need to define a standard to use"
I think if we can successfully identify B1 (see my above email: 1- support variables assigned to objects on multiple levels) We don't need to do that, because we can extract whatever $x is from; return $x; from the method.

I think it is more interesting if we can have features that doesn't require further learning before they can be used, features that do not intercept, but understand from whatever there is and make users' lives easier, then we will have much more appreciated development environment.


"I thought it might be useful to just let the client index the file and pass on the updates. I'm not sure but I guess this will save already quite some CPU load."

Definitely a good idea, it may help, but such a tiny bit that can be omitted. E.g. if someone extracts a zip file on the server, he'd have hundreds of thousands times more load than indexing several text files. Also, if you use wordpress, cake, zend and start your writing your code, you will not see most of the code that is already there, you will never open those files, or edit them. However you will want to use methods/classes that are available in those files. 


RFP is a good idea.

Cheers,
D

devrim

unread,
Jun 14, 2009, 4:33:50 PM6/14/09
to Kodingen
* RFP - sorry I meant req. analysis..
> ...
>
> read more »

Duckness

unread,
Jun 14, 2009, 4:42:50 PM6/14/09
to Kodingen
I've done some research and it seem that Bespin implemented/is going
to implement some kind of code completion too.
A few links:
https://wiki.mozilla.org/Labs/Bespin/DesignDocs/CodeCompletion#Future_Plans
http://hg.mozilla.org/labs/bespin/ (Code of Bespin)

Gonna read through the directories and check if I find any file
containing the codes to implement the code completion. Maybe we can
use some of their ideas ...
I've read somewhere they were even interested in helping with this
project so maybe involve them in the discussion?

Greetz,
Maarten
> ...
>
> meer lezen »

devrim

unread,
Jun 15, 2009, 9:44:36 AM6/15/09
to Kodingen
Marijn's response:

Hi Devrim,

I am not quite sure what you are asking -- the thread you linked to is
huge. Others have managed to add completion to CodeMirror, by simply
listening for keys, and popping up a dialog. Extracting relevant
information from the currently edited document can be tricky. Just
parsing it whenever you need that info is probably slow, but
integrating that with CodeMirrors is quite a hairy problem, and not
something that has my priority now. (You are of course welcome to work
on it.)

Best,
Marijn

http://groups.google.com/group/codemirror/msg/d838555a04d1493b

On Jun 14, 4:42 pm, Duckness <maarten.cautre...@gmail.com> wrote:
> I've done some research and it seem that Bespin implemented/is going
> to implement some kind of code completion too.
> A few links:https://wiki.mozilla.org/Labs/Bespin/DesignDocs/CodeCompletion#Future...http://hg.mozilla.org/labs/bespin/(Code of Bespin)
> ...
>
> read more »

devrim

unread,
Jun 16, 2009, 9:14:40 PM6/16/09
to Kodingen
I have created the first version of RA for Auto Complete. I think we
should drop the one on Discussions..

http://code.google.com/p/kodingen/wiki/Auto_Complete_Requirements_Analysis

On Jun 15, 9:44 am, devrim <dev...@payms.com> wrote:
> Marijn's response:
>
> Hi Devrim,
>
> I am not quite sure what you are asking -- the thread you linked to is
> huge. Others have managed to add completion to CodeMirror, by simply
> listening for keys, and popping up a dialog. Extracting relevant
> information from the currently edited document can be tricky. Just
> parsing it whenever you need that info is probably slow, but
> integrating that with CodeMirrors is quite a hairy problem, and not
> something that has my priority now. (You are of course welcome to work
> on it.)
>
> Best,
> Marijn
>
> http://groups.google.com/group/codemirror/msg/d838555a04d1493b
>
> On Jun 14, 4:42 pm, Duckness <maarten.cautre...@gmail.com> wrote:
>
> > I've done some research and it seem that Bespin implemented/is going
> > to implement some kind of code completion too.
> > A few links:https://wiki.mozilla.org/Labs/Bespin/DesignDocs/CodeCompletion#Future...of Bespin)
> ...
>
> read more »
Reply all
Reply to author
Forward
0 new messages