Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fx icon shown for keywords that are not functions #11311

Closed
EuropeanDeveloper opened this issue Feb 28, 2022 · 28 comments
Closed

Fx icon shown for keywords that are not functions #11311

EuropeanDeveloper opened this issue Feb 28, 2022 · 28 comments

Comments

@EuropeanDeveloper
Copy link

Description of the Issue

After the implementation of #11087, "fx" icon is shown for all keywords from auto-completion file. The icon should be shown only for keywords with attribute func="yes".

Steps to Reproduce the Issue

  1. Open empty file.
  2. Set language to C.
  3. Type ab.

screenshot

Expected Behavior

"fx" icon is shown only for functions (abort, abs, access, acos), not for keywords (absread, abswrite, acosl, allocmem, arc).

Actual Behavior

"fx" icon is shown for all keywords (including ones that are not functions) from auto-completion file.

Debug Information

Notepad++ v8.3.2 (64-bit)
Build time : Feb 27 2022 - 03:35:46
Path : C:\Program Files\Notepad++\notepad++.exe
Command Line :
Admin mode : OFF
Local Conf mode : OFF
Cloud Config : OFF
OS Name : Windows 10 Enterprise (64-bit)
OS Version : 2009
OS Build : 19042.1526
Current ANSI codepage : 1250
Plugins : DSpellCheck.dll mimeTools.dll NppConverter.dll NppExport.dll XMLTools.dll

@vinsworldcom
Copy link

vinsworldcom commented Mar 1, 2022

@EuropeanDeveloper @xomx , we can change the "icon", a simple XPM "file" embedded into the AutoCompletion.cpp source.

There currently is no code in AutoCompletion.cpp to check for func=yes so there was no way for me (at the time) to add differentiated icons. My goal was to distinguish between "autoComplete/*.xml" files and words from the current Notepad++ document. It was easier to add icons to the "autoComplete/*.xml" items than to current document words (explanation as to why in the original issue).

I'm afraid I don't have the requisite C++ skills to add the check for func=yes parameter in the XML parsing - I don't know the Tiny XML parser API. My guess is it would go somewhere here and if func=yes then add the "fx" image and if not then add a different image. The goal being that any words from the "autoComplete/*.xml" files get an icon to distinguish them from discovered current document words. We could create a simple "block" image like the VS Code image referenced at the bottom of my comment.

Alternatively, we could just change the current "fx" image to a simple "block" and have that apply to all since that's what seems offensive.

Cheers.

@vinsworldcom
Copy link

Here's an XPM for this image:

image

const char* xpmbox[] = {
    /* columns rows colors chars-per-pixel */
    "16 16 70 1 ",
    "  c None",
    ". c #712472",
    "X c #752775",
    "o c #7A2B7B",
    "O c #7C2D7D",
    "+ c #7C2E7C",
    "@ c #7E2E7E",
    "# c #7E307F",
    "$ c #7F3080",
    "% c #8D358E",
    "& c #953896",
    "* c #9C3C9D",
    "= c #9F3C9F",
    "- c #8E468F",
    "; c #904E91",
    ": c #965297",
    "> c #A74FA8",
    ", c #A650A7",
    "< c #A850A9",
    "1 c #A950AA",
    "2 c #A952AA",
    "3 c #BB6FBC",
    "4 c #BC70BD",
    "5 c #CB67CC",
    "6 c #D16AD2",
    "7 c #D26BD3",
    "8 c #D16DD2",
    "9 c #D36ED4",
    "0 c #D56FD5",
    "q c #8A99AE",
    "w c #98A4AE",
    "e c #9CA7AE",
    "r c #ACB5AD",
    "t c #ACB4AE",
    "y c #B5BBAD",
    "u c #C1C4AC",
    "i c #CCCEAC",
    "p c #D5D5AC",
    "a c #E5E2AB",
    "s c #E9E5AB",
    "d c #F7F0AB",
    "f c #CF88CF",
    "g c #DD98DE",
    "h c #E698E7",
    "j c #E990EA",
    "k c #EB91EC",
    "l c #EE9DEF",
    "z c #FA98FB",
    "x c #FA99FB",
    "c c #FA9BFB",
    "v c #FA9FFB",
    "b c #E3ACE3",
    "n c #E2AFE2",
    "m c #EEA5EF",
    "M c #EEBEEE",
    "N c #FAABFB",
    "B c #FAAEFB",
    "V c #E4CAE4",
    "C c #E6CCE6",
    "Z c #E8D1E8",
    "A c #EBD1EB",
    "S c #ECD2EC",
    "D c #EDD8ED",
    "F c #F0D4F0",
    "G c #F0D5F0",
    "H c #F2DBF2",
    "J c #F0E3F0",
    "K c #F2E0F3",
    "L c #F3E3F3",
    "P c #F4E6F4",
    /* pixels */
    "                ",
    "                ",
    "         HfJ    ",
    "        HfbfL   ",
    "       FfMBkfJ  ",
    "  dptq fnNzzjfP ",
    "       ,3mxxzh; ",
    "dsputw ,83mvl:@ ",
    "       <604g-*@ ",
    " daiyw C179$=%O ",
    "        Z15@&OG ",
    "         D1@XZ  ",
    "          S.C   ",
    "                ",
    "                ",
    "                "
};

@EuropeanDeveloper
Copy link
Author

I understand what was the idea behind "fx" icon. I still think there should be different symbols for functions (func=yes) and actual keywords. Sometimes it is a quite confusing to know which word is a keyword and which one is a name of a function.

@vinsworldcom
Copy link

@EuropeanDeveloper how's this:

image

NOTE: This creates a whole new problem of updating the autoComplete/*.xml files. Take your example of C - my file looks like this:

[...]
		<KeyWord name="atan" func="yes">
			<Overload retVal="double" >
				<Param name="double x" />
			</Overload>
		</KeyWord>
		<KeyWord name="atan2" func="yes">
			<Overload retVal="double" >
				<Param name="double y" />
				<Param name="double x" />
			</Overload>
		</KeyWord>
		<KeyWord name="atan2l" />
		<KeyWord name="atanl" />
[...]

see how atan and atan2 are functions but atan21 and atanl are not by definition in the XML file. So, autocomplete will happily display that now:

image

see atan21 and atanl marked "correctly" by the code because indeed they are not configured to be functions, but incorrect logically as they are functions.

Cheers.

@EuropeanDeveloper
Copy link
Author

I like the proposed solution 🙂. The behavior is expected and correct to my mind. If someone wants to list functions in auto-completion file they should mark them as functions using func=yes! Notepad++ can't guess which ones are functions and which ones are not. This is up to the author of auto-completion file.

@vinsworldcom
Copy link

I like the proposed solution

OK - I'll submit a PR - turns out I underestimated my copy/paste coding skills and was able to see a few lines above how to manipulate and analyze the TinyXML object to check for func="yes".

Cheers.

vinsworldcom pushed a commit to vinsworldcom/notepad-plus-plus that referenced this issue Mar 1, 2022
@EuropeanDeveloper
Copy link
Author

That's great! Thank you 🙂.

@donho
Copy link
Member

donho commented Mar 2, 2022

Problem:
In some (even many) language function entirs, there's no func attribute at all - see javascript.xml:
https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/PowerEditor/installer/APIs/javascript.xml

fx means all the entries from the language API files to distinguish from the word entries.

@donho donho added the reject label Mar 2, 2022
@donho donho closed this as completed Mar 2, 2022
@vinsworldcom
Copy link

@donho for those languages that don't have func="yes", they'll just show the new "box" icon. As people contribute and update the autoComplete/*.xml files with func="yes" as appropriate, their icons will change. Reference the following example using Javascript as the language as you pointed out does not have any "functions" defined in the "autoComplete/javascript.xml" file:

image

I think that looks OK. And then any complaints about "functions not showing with "fx"" can easily be fixed with pull requests to update the autoComplete files rather than changing the N++ AutoCompletion.cpp code.

That's my argument for the counterpoint. Understand this is your project and you have the final say.

Cheers.

@EuropeanDeveloper
Copy link
Author

@vinsworldcom: I agree with you.

@donho: What about other languages like Batch/CofeeScript/HTML/TypeScript? Their auto-completion files contain mostly keywords. Or some auto-completion files contain preprocessor definitions (e.g. #define). I don't think it makes sense to see "fx" icon for non-functions. The proposed solution by @vinsworldcom will not negatively affect the current implementation I think. If you don't like it, at least change the icon from "fx" to something else. The current icon is really confusing. "fx" implies function, not keywords...

@vinsworldcom
Copy link

vinsworldcom commented Mar 4, 2022

@EuropeanDeveloper there is a bit of a workaround to get a different icon than "fx" that can be triggered after Autocomplete is used once and if you have PythonScript installed. The first time Notepad++ autocomplete is triggered and goes through to show the list, it registers the "fx" image and sets a flag so that it never registers it again. You can override the registration by registering a new image with the same image ID as the "fx" icon, but it will only work after the "fx" image is registered by triggering autocomplete for the first time in a Notepad++ session. If you have PythonScript plugin installed, you can add to your startup script:

from Npp import editor, notepad, MENUCOMMAND

notepad.menuCommand(MENUCOMMAND.LANG_PERL)
editor.beginUndoAction()
editor.setText('pr')
editor.gotoPos(2)
notepad.menuCommand(MENUCOMMAND.EDIT_AUTOCOMPLETE)
editor.autoCCancel()
editor.endUndoAction()
editor.undo()
notepad.menuCommand(MENUCOMMAND.LANG_TEXT)

xpmbox = """/* XPM */
"16 16 70 1 ",
"  c None",
". c #712472",
"X c #752775",
"o c #7A2B7B",
"O c #7C2D7D",
"+ c #7C2E7C",
"@ c #7E2E7E",
"# c #7E307F",
"$ c #7F3080",
"% c #8D358E",
"& c #953896",
"* c #9C3C9D",
"= c #9F3C9F",
"- c #8E468F",
"; c #904E91",
": c #965297",
"> c #A74FA8",
", c #A650A7",
"< c #A850A9",
"1 c #A950AA",
"2 c #A952AA",
"3 c #BB6FBC",
"4 c #BC70BD",
"5 c #CB67CC",
"6 c #D16AD2",
"7 c #D26BD3",
"8 c #D16DD2",
"9 c #D36ED4",
"0 c #D56FD5",
"q c #8A99AE",
"w c #98A4AE",
"e c #9CA7AE",
"r c #ACB5AD",
"t c #ACB4AE",
"y c #B5BBAD",
"u c #C1C4AC",
"i c #CCCEAC",
"p c #D5D5AC",
"a c #E5E2AB",
"s c #E9E5AB",
"d c #F7F0AB",
"f c #CF88CF",
"g c #DD98DE",
"h c #E698E7",
"j c #E990EA",
"k c #EB91EC",
"l c #EE9DEF",
"z c #FA98FB",
"x c #FA99FB",
"c c #FA9BFB",
"v c #FA9FFB",
"b c #E3ACE3",
"n c #E2AFE2",
"m c #EEA5EF",
"M c #EEBEEE",
"N c #FAABFB",
"B c #FAAEFB",
"V c #E4CAE4",
"C c #E6CCE6",
"Z c #E8D1E8",
"A c #EBD1EB",
"S c #ECD2EC",
"D c #EDD8ED",
"F c #F0D4F0",
"G c #F0D5F0",
"H c #F2DBF2",
"J c #F0E3F0",
"K c #F2E0F3",
"L c #F3E3F3",
"P c #F4E6F4",
"                ",
"                ",
"         HfJ    ",
"        HfbfL   ",
"       FfMBkfJ  ",
"  dptq fnNzzjfP ",
"       ,3mxxzh; ",
"dsputw ,83mvl:@ ",
"       <604g-*@ ",
" daiyw C179$=%O ",
"        Z15@&OG ",
"         D1@XZ  ",
"          S.C   ",
"                ",
"                ",
"                "
"""

editor.registerImage(1000, xpmbox)

That basically sets language to Perl, types some characters, triggers autocomplete (so the "fx" image is registered) undoes the typing, sets language back to normal text (as if nothing happened) and then registers the new proposed box image with the same image ID (effectively overwriting the "fx" image for all subsequent autocompletes).

Unfortunately, this still only allows 1 icon for all completes from the "autoComplete/*.xml" files. I think the func="yes" differentiator is a nice approach to having 2 and putting the onus on developers to help update the "autoComplete/*.xml" files making them more accurate and more usable with functions and function call tips. All by editing the "autoComplete/*.xml" files only and not having to touch Notepad++ code.

Still hoping @donho reconsiders this issue / PR.

Cheers.

@donho
Copy link
Member

donho commented Mar 5, 2022

If the keyword is not function (fx), then it"s normal keyword (kw).
If you make a kw with the same style & color of fx, why not?

@EuropeanDeveloper
Copy link
Author

@donho: Can't we use the box icon for keywords as @vinsworldcom proposed?

@vinsworldcom
Copy link

vinsworldcom commented Mar 7, 2022

@donho not sure the "kw" icon will work that well. Not using a fixed-width font to achieve some form of likeness with the current "fx" icon causes an issue since the "w" character is rather wide. This makes the icon wider than tall yet it must fit to 16, 16, so the height has to shrink. This is what it looks like - and I personally don't think it looks good and is a bit confusing:

image

The PNG file from which the XPM was generated:
kw

I still think the "box" icon works well as it and "fx" are both "components" of the Notepad++ function list and we're talking about "Function" completion.

image

Cheers.

@donho
Copy link
Member

donho commented Mar 7, 2022

@vinsworldcom @EuropeanDeveloper

The icon fx was added for the purpose of distinguishing the languages keyword entries from the word entries. So it's enough IMO that 1 icon for both kinds of keywords. But if we want to add one more icon for telling "normal keyword" from "function keyword", I prefer to have the same colour & style, for the following reasons:

  1. It might be easier for updating Scintilla - The dark mode of auto-completion box in Scintilla may just inverse the xpm image's colour, that would be more harmony in black & white, then it might be not necessary to change the icons.
  2. It's more coherent to me that the keywords from the same source remain the same colour & style.
  3. Auto-completion xml files in lot of languages provided by Notepad++ have no distinguish between "normal keyword" and "function keyword", so I prefer to using an icon as neuter as possible.

After all, you can suggest the other symbols to stand for "normal keyword" with the constraint. It will be accepted if it's meaningful and readable.

@vinsworldcom
Copy link

vinsworldcom commented Mar 7, 2022

@donho understood.

With regards to point 1 - can we look forward to a Scintilla 5+ upgrade soon? :-) The XPM image format Scintilla specifies can include a color "None" for transparency, and I use that for the none "fx", "box", "kw", etc.. parts of the XPMs I create so hopefully that will "translate" well as Scintilla release 5.0.1 allows "SC_ELEMENT_LIST* to change colours of autocompletion lists" - background color changes to autocomplete!

@EuropeanDeveloper

dropping the "w" from "kw" and just using a script "k" seems to work a little better. Visually, it's hardly differentiated due to point 2 above:

image

PNG image:
k

XPM:

const char* xpmkw[] = {
    /* columns rows colors chars-per-pixel */
    "16 16 41 1 ",
    "d c None",
    "  c #131313",
    ". c #222222",
    "X c #141414",
    "o c #151515",
    "O c #282828",
    "+ c #161616",
    "@ c #2F2F2F",
    "# c #313131",
    "$ c #323232",
    "% c #202020",
    "& c #232323",
    "* c #242424",
    "= c #3F3F3F",
    "- c #292929",
    "; c #515151",
    ": c #323232",
    "> c #343434",
    ", c #383838",
    "< c #393939",
    "1 c #676767",
    "2 c #696969",
    "3 c #6F6F6F",
    "4 c #444444",
    "5 c #747474",
    "6 c #777777",
    "7 c #474747",
    "8 c #494949",
    "9 c #545454",
    "0 c #9D9D9D",
    "q c #A5A5A5",
    "w c #B4B4B4",
    "e c #C1C1C1",
    "r c #CDCDCD",
    "t c #818181",
    "y c #838383",
    "u c #848484",
    "i c #868686",
    "p c #E4E4E4",
    "a c #919191",
    "s c #EEEEEE",
    /* pixels */
    "dddddddddddddddd",
    "dddddddq%o3adddd",
    "dddddde ;4ordddd",
    "dddddde addddddd",
    "dddddde addddddd",
    "dddddd2 addddddd",
    "dddddd2-addddddd",
    "dddddd++ad8&dddd",
    "dddddd-1r7 5dddd",
    "dddddd*5% 5ddddd",
    "dddddd + >dddddd",
    "dddddd ++%pddddd",
    "dddddi 0r >%uddd",
    "ddd47-+yd9 ;addd",
    "ddd< *wdddsddddd",
    "dddddddddddddddd"
};

I can submit a new PR with the updated image if we can agree on one here.

Cheers

@donho
Copy link
Member

donho commented Mar 9, 2022

@vinsworldcom

can we look forward to a Scintilla 5+ upgrade soon? :-)

Yes, once v8.3.x is stable enough. I think next release v8.3.3 will be stable, so I will work on the Scintilla 5+ updating.

dropping the "w" from "kw" and just using a script "k" seems to work a little better. Visually, it's hardly differentiated due to point 2 above:

This k looks like f... I personally prefer kw - at least it's more distinguishable.
"kw" and "k" are 2 of possibilities. Could we find the other possibilities?

@EuropeanDeveloper
Copy link
Author

@vinsworldcom @donho

I agree that "k" icon looks like "f", it is quite hard to distinguish them.

If we want to use the same icon for "normal" keywords and functions, I think the best approach is to use box icon. What do you think about this?

@vinsworldcom
Copy link

I agree that "k" icon looks like "f", it is quite hard to distinguish them.

@donho @EuropeanDeveloper , maybe I was being to literal on 2 and 3 with "style" using a letter. How about an icon - like the box, but not purple colored. How about a black key for "keyword":

image

Same "style/color" base black with transparent (color = None) background and yet much more easily distinguished.

PNG:
key

XPM:

const char* xpmkw[] = {
    /* columns rows colors chars-per-pixel */
    "16 16 24 1 ",
    "5 c None",
    "  c #000000",
    ". c #030303",
    "X c #101010",
    "o c #181818",
    "O c #202020",
    "+ c #282828",
    "@ c #222222",
    "# c #252525",
    "$ c #484848",
    "% c #585858",
    "& c #606060",
    "* c #474747",
    "= c #505050",
    "- c #565656",
    "; c #9F9F9F",
    ": c #A7A7A7",
    "> c #AFAFAF",
    ", c #757575",
    "< c #818181",
    "1 c #D7D7D7",
    "2 c #DFDFDF",
    "3 c #EFEFEF",
    "4 c #979797",
    /* pixels */
    "5555555555555555",
    "5555555555555555",
    "5555555555555555",
    "5555555555555555",
    "5:+ @>5555555555",
    ";     -,,,,,,,55",
    "o+O           =5",
    ".42            <",
    ".-*     X.=.%O#5",
    "&     #=3<5<5235",
    "3$   $4555555555",
    "551,255555555555",
    "5555555555555555",
    "5555555555555555",
    "5555555555555555",
    "5555555555555555"
};

Cheers.

@donho
Copy link
Member

donho commented Mar 10, 2022

image

How about a cube like it?

@vinsworldcom
Copy link

@donho @EuropeanDeveloper how about:

image

I like it.

PNG:
box

XPM:

const char* xpmkw[] = {
    /* columns rows colors chars-per-pixel */
    "16 16 36 1 ",
    "u c None",
    "  c #000000",
    ". c #030303",
    "X c #101010",
    "o c #181818",
    "O c #202020",
    "+ c #282828",
    "@ c #191919",
    "# c #222222",
    "$ c #252525",
    "% c #484848",
    "& c #505050",
    "* c #606060",
    "= c #444444",
    "- c #474747",
    "; c #505050",
    ": c #535353",
    "> c #565656",
    ", c #979797",
    "< c #9A9A9A",
    "1 c #9F9F9F",
    "2 c #A7A7A7",
    "3 c #AFAFAF",
    "4 c #B7B7B7",
    "5 c #757575",
    "6 c #767676",
    "7 c #787878",
    "8 c #797979",
    "9 c #818181",
    "0 c #D0D0D0",
    "q c #828282",
    "w c #D7D7D7",
    "e c #DFDFDF",
    "r c #E7E7E7",
    "t c #EFEFEF",
    "y c #979797",
    /* pixels */
    "uuuuuuuuuuuuuuuu",
    "uuuuuuuuruuuuuuu",
    "uuuy4;$  *euuuuu",
    "u4@ $-4t6;X*euuu",
    "u1oX>uuu4u5+ 1uu",
    "u1*w%O2:%XO*&;uu",
    "u1*uu4 =,ruu1;uu",
    "u1*uuu uquuu1;uu",
    "u1*uuu u9uuu1;uu",
    "u1*uuu u4uuu1;uu",
    "u1*uww e8qyu1;uu",
    "u3o<uu uuu991;uu",
    "uu7#%w uu4-#.1uu",
    "uuuu,o $.%:7uuuu",
    "uuuuut,7uuuuuuuu",
    "uuuuuuuuuuuuuuuu"
};

Cheers.

@donho
Copy link
Member

donho commented Mar 10, 2022

@vinsworldcom
Sorry for the request of modification again.
With the small icon as it, maybe it's better to remove the transparent effect, like this:
image

And also please post one more screenshot under another language without distinguishing normal / function keywords (like Java), so we have a vision more general, not only in c/c++

@vinsworldcom
Copy link

@donho @EuropeanDeveloper - no worries - I'm happy this may actually make it in!

Language of "new-1" set to "Perl":
image

Language of "new-1" set to "Javascript":
image

PNG:
box

XPM:

const char* xpmkw[] = {
    /* columns rows colors chars-per-pixel */
    "16 16 33 1 ",
    "r c None",
    "  c #000000",
    ". c #030303",
    "X c #101010",
    "o c #181818",
    "O c #202020",
    "+ c #282828",
    "@ c #191919",
    "# c #222222",
    "$ c #252525",
    "% c #484848",
    "& c #505050",
    "* c #606060",
    "= c #444444",
    "- c #474747",
    "; c #505050",
    ": c #535353",
    "> c #565656",
    ", c #979797",
    "< c #9A9A9A",
    "1 c #9F9F9F",
    "2 c #A7A7A7",
    "3 c #AFAFAF",
    "4 c #B7B7B7",
    "5 c #757575",
    "6 c #767676",
    "7 c #787878",
    "8 c #818181",
    "9 c #D7D7D7",
    "0 c #DFDFDF",
    "q c #E7E7E7",
    "w c #EFEFEF",
    "e c #979797",
    /* pixels */
    "rrrrrrrrrrrrrrrr",
    "rrrrrrrrqrrrrrrr",
    "rrre4;$  *0rrrrr",
    "r4@ $-4w6;X*0rrr",
    "r1oX>rrrrr5+ 1rr",
    "r1*9%O2r9XO*&;rr",
    "r1*rr4==%rrr1;rr",
    "r1*rrrr$rrrr1;rr",
    "r1*rrrr$rrrr1;rr",
    "r1*rrrr$rrrr1;rr",
    "r1*rrrr$rrrr1;rr",
    "r3o<rrr$rrr8$;rr",
    "rr7#%9r$r4 #;rrr",
    "rrrr,o.$.%:rrrrr",
    "rrrrr9w,7rrrrrrr",
    "rrrrrrrrrrrrrrrr"
};

If we can agree on a solution, I'll resubmit a pull request with the appropriate XPM images and code changes.

Cheers.

@donho
Copy link
Member

donho commented Mar 10, 2022

@vinsworldcom
It looks nicer :) thank you.
What do you think @EuropeanDeveloper ?

@donho donho reopened this Mar 10, 2022
@EuropeanDeveloper
Copy link
Author

I love it! Good job @vinsworldcom 👍.

@vinsworldcom
Copy link

@donho should I open a new pull request, or just push to the existing "rejected" pull request and you can re-accept it if you still want to go this way?

Happy to do either.

Cheers.

@donho
Copy link
Member

donho commented Mar 10, 2022

OK for pushing to the existing "rejected" pull request

@donho donho closed this as completed Mar 10, 2022
@donho donho reopened this Mar 10, 2022
vinsworldcom pushed a commit to vinsworldcom/notepad-plus-plus that referenced this issue Mar 10, 2022
@donho donho removed the reject label Mar 10, 2022
@donho donho closed this as completed in 9a1a999 Mar 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants