Harbs, Alex,

I just pushed implementation of computeFinalClassNames to
branch feature/type_names_class_name_issue124. You can review
implementation in this commit [1] and example of usage in Card and Button.

I have tested with Harbs example [3] and with Card by changing orders. It's
working.

[1] http://bit.ly/2HTHaFQ
[2] http://bit.ly/2oJgKOf
[3] http://bit.ly/2F734nx

Waiting for your review.

Thanks,
Piotr


2018-02-28 23:31 GMT+01:00 Piotr Zarzycki <[email protected]>:

> Let me play with implementation of that function. It seems to me that will
> be much cleaner than current solution.
>
> If user actually wanted to do anythin with className - let the overriding
> speaks.
>
>
>
> On Wed, Feb 28, 2018, 21:51 Alex Harui <[email protected]> wrote:
>
>> On 2/28/18, 12:27 PM, "Harbs" <[email protected]> wrote:
>>
>> >OK. I think that will work for DML components, but what if there’s a bead
>> >which needs to add class names? What would be the “right” way to do that?
>> >A bead cannot override the function on the strand.
>>
>> Do we have beads that manipulate className?
>>
>> IMO, the principle behind how to handle that is knowing whether you are
>> sharing something or not.  There may not be one right way to handle it,
>> but if I had to handle it, I would have the bead set something in the
>> model or presentation model of the component.  And the component would
>> override computeFinalClassNames to take that into account.
>>
>>
>> Although having just written that, maybe this computeFinalClassNames
>> should be in the view instead of on the base class so it is replaceable
>> instead of overridable.
>>
>> Thoughts?
>> -Alex
>> >
>> >> On Feb 28, 2018, at 10:17 PM, Alex Harui <[email protected]>
>> >>wrote:
>> >>
>> >> I think you are missing that the element.className is set to
>> >> computeFinalClassNames.  So the user is welcome to manipulate the
>> >> UIBase.className however they see fit.  They can assign it a whole new
>> >> space-delimited list if they want.  But what gets set on
>> >>element.className
>> >> is computed from typeNames and className by default, and MDL would
>> >> override it to factor in fab, raised, colored into the computing of the
>> >> final classnames.
>> >>
>> >> I would prefer that we don't make requirements on users as to what they
>> >> can or can't do with the className property, like requiring them to use
>> >> addClassName/removeClassNames.  MXML and States might set className,
>> as
>> >> could any other AS logic.  I think folks may even be used to setting
>> >> className in JavaScript.  So letting UIBase.className be the "variable"
>> >> part and having computeFinalClassNames be the way the "fixed" part is
>> >> handled makes sense to me.
>> >>
>> >> Of course, I could be wrong...
>> >> -Alex
>> >>
>> >> On 2/28/18, 12:03 PM, "Harbs" <[email protected]> wrote:
>> >>
>> >>> The problem which sparked this whole issue is like this:
>> >>>
>> >>> 1. We have some components (i.e. in MDL) which add “pieces” to the
>> >>>class
>> >>> names (such as “fab”, “raised”, “colored”, etc.
>> >>> 2. The client might subsequently set the className to something else.
>> >>> 3. When the component sets the “pieces” first and the client sets the
>> >>> className later, the client will overwrite these “pieces” which were
>> >>> added by the component.
>> >>>
>> >>> My suggestion to have addClassName() and removeClassName() was to have
>> >>>a
>> >>> “safe” way to add class names which would get computed together with
>> >>>the
>> >>> className when the className is replaced.
>> >>>
>> >>> The way you have it seems to just be modifying the existing className
>> >>> property. If that’s overwritten by a client, the logic falls apart.
>> >>>
>> >>> It feels like only having typeNames which are set inside the component
>> >>> and className which is set outside the component is not really enough.
>> >>> (Unless I’m missing something.)
>> >>>
>> >>> Harbs
>> >>>
>> >>>> On Feb 28, 2018, at 9:31 PM, Alex Harui <[email protected]>
>> >>>> wrote:
>> >>>>
>> >>>> On 2/28/18, 10:44 AM, "Harbs" <[email protected]> wrote:
>> >>>>
>> >>>>> If it’s not public, I don’t see how a utility method could call it
>> >>>>> though.
>> >>>>
>> >>>> I didn't think the utility methods like addClassName/removeClassName
>> >>>> would
>> >>>> need to alter computeFinalClassNames().
>> >>>>
>> >>>> AIUI, for most UIBase subclasses, the final element.className is a
>> mix
>> >>>> of
>> >>>> the className property and the typeNames.  The typenames are thought
>> >>>>to
>> >>>> be
>> >>>> "fixed" and the space-delimited list of names in className are the
>> >>>>ones
>> >>>> the user wants to manipulate in their code.  So, I would expect them
>> >>>>to
>> >>>> write:
>> >>>>
>> >>>> org.apache.royale.utils.addClassName(myComponent, "pinkStyles");
>> >>>>
>> >>>>
>> >>>> addClassName should just do something like:
>> >>>>
>> >>>> myComponent.className += value;
>> >>>>
>> >>>> That will call the className setter that will run:
>> >>>>
>> >>>> element.className = computeFinalClassNames();
>> >>>>
>> >>>> If you call
>> >>>>
>> >>>> org.apache.royale.utils.removeClassName(myComponent, "pinkStyles");
>> >>>>
>> >>>> removeClassName should just do something like:
>> >>>>
>> >>>> Var s:String = myComponent.className;
>> >>>> Var c:int = s.indexOf(nameToRemove + " ");
>> >>>> If (c != -1)
>> >>>>    s = s.substr(0, c) + s.substr(c + nameToRemove.length + 1);
>> >>>> Else
>> >>>> {
>> >>>>    c= s.indexOf(" " + nameToRemove);
>> >>>>    if (c != -1)
>> >>>>      s = s.substr(0, c);  // remove last item
>> >>>> }
>> >>>> myComponent.className = s;
>> >>>>
>> >>>>
>> >>>>
>> >>>> It seems like it should be that simple.  What am I missing?
>> >>>>
>> >>>> -Alex
>> >>>>
>> >>>>
>> >>>>>
>> >>>>>> On Feb 28, 2018, at 8:21 PM, Alex Harui <[email protected]>
>> >>>>>> wrote:
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> On 2/28/18, 9:50 AM, "Piotr Zarzycki" <[email protected]
>> >>>>>> <mailto:[email protected]>> wrote:
>> >>>>>>
>> >>>>>>> Ok Understand, but do you agree that  computeFinalClassNames - is
>> >>>>>>> something
>> >>>>>>> which is in the UIBase ?
>> >>>>>>
>> >>>>>> Yes, and probably protected instead of public.  The one in UIBase
>> >>>>>>just
>> >>>>>> appends typenames to className.  It gets overridden in MDL where
>> >>>>>> needed
>> >>>>>> for shadow and other attributes.
>> >>>>>>
>> >>>>>> My 2 cents,
>> >>>>>> -Alex
>> >>>>>>>
>> >>>>>>> 2018-02-28 18:47 GMT+01:00 Alex Harui <[email protected]>:
>> >>>>>>>
>> >>>>>>>> I think that in the shadow setter, it would change _shadow and
>> >>>>>>>>call
>> >>>>>>>> setClassName(computeFinalClassNames());
>> >>>>>>>>
>> >>>>>>>> On 2/28/18, 9:33 AM, "Piotr Zarzycki" <[email protected]
>> >
>> >>>>>>>> wrote:
>> >>>>>>>>
>> >>>>>>>>> Alex,
>> >>>>>>>>>
>> >>>>>>>>> So we are getting back to the idea where you proposed to have
>> >>>>>>>>> function
>> >>>>>>>>> which computes everything.
>> >>>>>>>>>
>> >>>>>>>>> override public function computeFinalClassNames():String
>> >>>>>>>>> {
>> >>>>>>>>> return super.computeFinalClassNames() + " " + _shadow;
>> >>>>>>>>> }
>> >>>>>>>>>
>> >>>>>>>>> Where does that function should be placed ? Does that function
>> >>>>>>>>> should
>> >>>>>>>> be
>> >>>>>>>>> called in addedToParent plus whenever someone change _shadow ? -
>> >>>>>>>>>
>> >>>>>>>>> Because I really don't know how to handle scenario where you
>> have
>> >>>>>>>>> some
>> >>>>>>>>> property isActive = true/false and I need to add/remove class. -
>> >>>>>>>>>In
>> >>>>>>>>> the
>> >>>>>>>>> first launch I use  computeFinalClassNames, but how to handle
>> >>>>>>>>> changing
>> >>>>>>>> ?
>> >>>>>>>>>
>> >>>>>>>>> Thanks, Piotr
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>> 2018-02-28 18:26 GMT+01:00 Alex Harui <[email protected]
>> >:
>> >>>>>>>>>
>> >>>>>>>>>> Hi Piotr,
>> >>>>>>>>>>
>> >>>>>>>>>> I think am I not communicating the principles effectively.
>> >>>>>>>>>>
>> >>>>>>>>>> First, IMO, addClassName and removeClassName should not be in
>> >>>>>>>>>> UIBase.
>> >>>>>>>>>> Lots of apps can be written without needing these methods.  I
>> >>>>>>>>>> think
>> >>>>>>>> they
>> >>>>>>>>>> can be written as utility functions.
>> >>>>>>>>>>
>> >>>>>>>>>> Second, the computation of the final element.className should
>> >>>>>>>> represent
>> >>>>>>>>>> the state of the component, so I don't get why you need an
>> >>>>>>>>>> _internalClassName or should ever set it to "".  The
>> computation
>> >>>>>>>>>> for
>> >>>>>>>> a
>> >>>>>>>>>> component with a shadow would be to check the shadow property
>> >>>>>>>>>>and
>> >>>>>>>>>> if
>> >>>>>>>> it
>> >>>>>>>>>> is
>> >>>>>>>>>> true, add a className for the shadow to the list.  Then I think
>> >>>>>>>>>> you
>> >>>>>>>>>> wouldn't have the problem you showed in the animated GIF.  When
>> >>>>>>>>>> the
>> >>>>>>>>>> classname property is set from the outside by
>> >>>>>>>>>>MXMLDataInterpreter
>> >>>>>>>>>> or
>> >>>>>>>>>> even
>> >>>>>>>>>> user-written code, those classNames are added to the list with
>> >>>>>>>>>>the
>> >>>>>>>>>> typeNames and the shadow className if shadow is true and then
>> >>>>>>>>>>set
>> >>>>>>>>>> on
>> >>>>>>>> the
>> >>>>>>>>>> element.
>> >>>>>>>>>>
>> >>>>>>>>>> Finally, for addClassName and removeClassName, and all other
>> >>>>>>>>>> Royale
>> >>>>>>>>>> code,
>> >>>>>>>>>> we don't want to do much if any parameter checking.  That is
>> >>>>>>>>>>also
>> >>>>>>>>>> just-in-case code.  The production code should not be passing
>> in
>> >>>>>>>> null or
>> >>>>>>>>>> other bad values.  And once you fix that, then the checks that
>> >>>>>>>>>>you
>> >>>>>>>> have
>> >>>>>>>>>> written do not add value.  I have proposed that there are
>> >>>>>>>>>> debug-only
>> >>>>>>>>>> code
>> >>>>>>>>>> that does parameter checking.  There is a goog.DEBUG flag you
>> >>>>>>>>>>can
>> >>>>>>>>>> use
>> >>>>>>>>>> for
>> >>>>>>>>>> that.
>> >>>>>>>>>>
>> >>>>>>>>>> HTH,
>> >>>>>>>>>> -Alex
>> >>>>>>>>>>
>> >>>>>>>>>> On 2/28/18, 12:40 AM, "Piotr Zarzycki"
>> >>>>>>>>>><[email protected]>
>> >>>>>>>>>> wrote:
>> >>>>>>>>>>
>> >>>>>>>>>>> Hi Alex,
>> >>>>>>>>>>>
>> >>>>>>>>>>> Sorry about that. Let me show you code and I recorded GIF with
>> >>>>>>>> problem
>> >>>>>>>>>>> debugging.
>> >>>>>>>>>>>
>> >>>>>>>>>>> *Code in UIBase which I have implemented:*
>> >>>>>>>>>>> addClassName and removeClassName [1].
>> >>>>>>>>>>> addedToParent what is happen with internal field which I have
>> >>>>>>>>>>> added
>> >>>>>>>> [2]
>> >>>>>>>>>>>
>> >>>>>>>>>>> *Code for Testing* [3] - I'm adding first className, than
>> >>>>>>>>>>>shadow.
>> >>>>>>>>>>>
>> >>>>>>>>>>> *GIF* [4] We are starting from the constructor. Pay attention
>> >>>>>>>>>>>to
>> >>>>>>>>>>> the
>> >>>>>>>>>>> moment
>> >>>>>>>>>>> where className is being wiped out, later I have to use my
>> >>>>>>>>>>> internal
>> >>>>>>>>>>> variable to get it back.
>> >>>>>>>>>>>
>> >>>>>>>>>>> Does that more clean now ?
>> >>>>>>>>>>>
>> >>>>>>>>>>> [1]
>> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>> https%3A%2F%2Fpaste.apa
>> >>>>>>>>>>> che.org%2FEumG&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d
>> >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> >>>>>>>>>> 7C636554040718214998&
>> >>>>>>>>>>>
>> >>>>>>>>>>>
>> >>>>>>>>>>>sdata=cDT88OF63TdBMPxYY2vwMSIRxD%2FP3DvwHupj%2BQHsofw%3D&
>> reserve
>> >>>>>>>>>>>d=
>> >>>>>>>>>>> 0
>> >>>>>>>>>>> [2]
>> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>> https%3A%2F%2Fpaste.apa
>> >>>>>>>>>>> che.org%2FArmU&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d
>> >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> >>>>>>>>>> 7C636554040718214998&
>> >>>>>>>>>>> sdata=m6whImrP70u7kzRxCbErlxCHWef8TK
>> Nejwm4Sr7bw7g%3D&reserved=0
>> >>>>>>>>>>> [3]
>> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>> https%3A%2F%2Fpaste.apa
>> >>>>>>>>>>> che.org%2FKrxq&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d
>> >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> >>>>>>>>>> 7C636554040718214998&
>> >>>>>>>>>>> sdata=tpeUYSQIXGXtES8hyr7zSeet528ZTc
>> zSltcNccqRGDo%3D&reserved=0
>> >>>>>>>>>>> [4]
>> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>> https%3A%2F%2F1drv.ms%2
>> >>>>>>>>>>>
>> >>>>>>>>>>>
>> >>>>>>>>>>>Fu%2Fs!ApVpLyjpHDC2hPtoCi65kIZZPwjSpQ
>> &data=02%7C01%7Caharui%40ad
>> >>>>>>>>>>>ob
>> >>>>>>>>>>> e
>> >>>>>>>> .com
>> >>>>>>>>>> %7C
>> >>>>>>>>>>> ee5c84b4e3ff4ddb578008d57e87046f%
>> 7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>> cee1%7C0%7C
>> >>>>>>>>>>>
>> >>>>>>>>>>>
>> >>>>>>>>>>>0%7C636554040718214998&sdata=eX%2FgZ0MA%
>> 2BdQJjcpYtMkk1pw3r0iVkdR
>> >>>>>>>>>>>a%
>> >>>>>>>>>> 2F6TWRTG
>> >>>>>>>>>>> 10OY%3D&reserved=0
>> >>>>>>>>>>>
>> >>>>>>>>>>> Thanks,
>> >>>>>>>>>>> Piotr
>> >>>>>>>>>>>
>> >>>>>>>>>>> 2018-02-27 23:31 GMT+01:00 Alex Harui
>> >>>>>>>>>>><[email protected]>:
>> >>>>>>>>>>>
>> >>>>>>>>>>>> Hi Piotr,
>> >>>>>>>>>>>>
>> >>>>>>>>>>>> I could not understand this explanation. Might be better to
>> >>>>>>>>>>>>show
>> >>>>>>>>>> actual
>> >>>>>>>>>>>> code.  For example in #3, there is a cssClass variable that I
>> >>>>>>>> don't
>> >>>>>>>>>> know
>> >>>>>>>>>>>> about.  Also you mention at the bottom setting something as
>> >>>>>>>>>>>> empty,
>> >>>>>>>>>> but
>> >>>>>>>>>>>> I'm
>> >>>>>>>>>>>> not sure what that is.
>> >>>>>>>>>>>>
>> >>>>>>>>>>>> However, IMO, this code should be in utility functions, not
>> in
>> >>>>>>>>>> UIBase.
>> >>>>>>>>>>>> I
>> >>>>>>>>>>>> think plenty of useful applications can be built without
>> >>>>>>>>>>>> changing
>> >>>>>>>>>>>> classNames at runtime.
>> >>>>>>>>>>>>
>> >>>>>>>>>>>> I'm off-line for the next several hours so we can pick this
>> up
>> >>>>>>>> again
>> >>>>>>>>>> in
>> >>>>>>>>>>>> your morning.
>> >>>>>>>>>>>>
>> >>>>>>>>>>>> Thanks for working on it,
>> >>>>>>>>>>>> -Alex
>> >>>>>>>>>>>>
>> >>>>>>>>>>>> On 2/27/18, 2:21 PM, "Piotr Zarzycki"
>> >>>>>>>>>>>> <[email protected]>
>> >>>>>>>>>> wrote:
>> >>>>>>>>>>>>
>> >>>>>>>>>>>>> Here is how I'm thinking to resolve that issue. I would take
>> >>>>>>>> Harb's
>> >>>>>>>>>>>>> proposition and add to UIBase  addClassName() and
>> >>>>>>>> removeClassName().
>> >>>>>>>>>>>> Next
>> >>>>>>>>>>>>> I
>> >>>>>>>>>>>>> would add internal field _internalClassName:String.
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> addClassName(value):
>> >>>>>>>>>>>>> 1) Will check if provided class name exits in _className and
>> >>>>>>>>>>>>>in
>> >>>>>>>>>>>>> _internalClassName.
>> >>>>>>>>>>>>> 2) Will add to _internalClassName += value
>> >>>>>>>>>>>>> 3) Assign to the element.className in the following way:
>> >>>>>>>>>>>> element.className
>> >>>>>>>>>>>>> = cssClass + " " + _className + " " + typeNames;
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> removeClassName(value)
>> >>>>>>>>>>>>> 1) Will check if provided classs name exists in  _className
>> >>>>>>>>>>>>>or
>> >>>>>>>>>>>>> in
>> >>>>>>>>>>>>> _internalClassName
>> >>>>>>>>>>>>> 2) Make a replace to empty string if css class name exists.
>> >>>>>>>>>>>>> _className.replace(value, "");
>> >>>>>>>>>>>>> 3) Assign to the element.className: element.className =
>> >>>>>>>> _className
>> >>>>>>>>>> + "
>> >>>>>>>>>>>> " +
>> >>>>>>>>>>>>> typeNames;
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> In added to parent we are computing _internalClassName with
>> >>>>>>>>>> _className
>> >>>>>>>>>>>> and
>> >>>>>>>>>>>>> typeNames. Then it's being set as empty.
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> element.className =  _internalClassName  + " " + _className
>> >>>>>>>>>>>>>+ "
>> >>>>>>>> " +
>> >>>>>>>>>>>>> typeNames;
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> I have implemented it and it seems to be working. Waiting
>> for
>> >>>>>>>> your
>> >>>>>>>>>>>>> thoughts
>> >>>>>>>>>>>>> on that solution. The last step where we are adding all
>> three
>> >>>>>>>>>> fields is
>> >>>>>>>>>>>>> the
>> >>>>>>>>>>>>> most important. Points 3 in addClassName and removeClassName
>> >>>>>>>>>>>>> are
>> >>>>>>>>>>>>> necessary,
>> >>>>>>>>>>>>> because user may want to more dynamically manipulate classes
>> >>>>>>>>>>>>> once
>> >>>>>>>>>>>>> component
>> >>>>>>>>>>>>> is created. Ex. "is-active" class is removed and added on
>> >>>>>>>>>>>>> demand.
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> Thanks, Piotr
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> 2018-02-27 13:38 GMT+01:00 Piotr Zarzycki
>> >>>>>>>>>> <[email protected]>:
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>>> I think I have analyzed everything and have some
>> >>>>>>>>>>>>>> implementation
>> >>>>>>>>>>>>>> proposition. I will try to provide it later today.
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>> Thanks, Piotr
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>> 2018-02-27 13:35 GMT+01:00 Harbs <[email protected]>:
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>> ExpandableSearch broke too.
>> >>>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>>> On Feb 25, 2018, at 6:15 PM, Piotr Zarzycki
>> >>>>>>>>>>>>>>> <[email protected]>
>> >>>>>>>>>>>>>>> wrote:
>> >>>>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>>> Harbs,
>> >>>>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>>> If you are using something more than MDL Dialog in your
>> >>>>>>>>>>>> application
>> >>>>>>>>>>>>>>> it
>> >>>>>>>>>>>>>>>> would be great to get feedback whether I didn't break for
>> >>>>>>>> you
>> >>>>>>>>>>>>>>> anything.
>> >>>>>>>>>>>>>>> :)
>> >>>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>> --
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>> Piotr Zarzycki
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>> Patreon:
>> >>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>>>> https%3A%2F%2Fwww.pat
>> >>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com
>> >>>>>>>>>>>> %7C45a065853ba1
>> >>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536
>> >>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK
>> >>>>>>>>>>>> 9liXcy%2BPg%3D&rese
>> >>>>>>>>>>>>>> rved=0
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>>>> https%3A%2F%2Fwww.pat
>> >>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com
>> >>>>>>>>>>>> %7C45a065853ba1
>> >>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536
>> >>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK
>> >>>>>>>>>>>> 9liXcy%2BPg%3D&rese
>> >>>>>>>>>>>>>> rved=0>*
>> >>>>>>>>>>>>>>
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> --
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> Piotr Zarzycki
>> >>>>>>>>>>>>>
>> >>>>>>>>>>>>> Patreon:
>> >>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>>>> https%3A%2F%2Fwww.patr
>> >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>>>> 7C45a065853ba14a
>> >>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536694
>> >>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK
>> >>>>>>>>>>>> 9liXcy%2BPg%3D&reserved
>> >>>>>>>>>>>>> =0
>> >>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>>>> https%3A%2F%2Fwww.patr
>> >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>>>> 7C45a065853ba14a
>> >>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536694
>> >>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK
>> >>>>>>>>>>>> 9liXcy%2BPg%3D&reserved
>> >>>>>>>>>>>>> =0>*
>> >>>>>>>>>>>>
>> >>>>>>>>>>>>
>> >>>>>>>>>>>
>> >>>>>>>>>>>
>> >>>>>>>>>>> --
>> >>>>>>>>>>>
>> >>>>>>>>>>> Piotr Zarzycki
>> >>>>>>>>>>>
>> >>>>>>>>>>> Patreon:
>> >>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>> https%3A%2F%2Fwww.patr
>> >>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>> 7Cee5c84b4e3ff4d
>> >>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>> cee1%7C0%7C0%7C6365540407
>> >>>>>>>>>>>
>> >>>>>>>>>>>18214998&sdata=VYtgB8rsurZAHpO%2FVs%
>> 2FqOkmxROz58p7VvQ%2B0EK8VPPc
>> >>>>>>>>>>>%
>> >>>>>>>>>> 3D&reserv
>> >>>>>>>>>>> ed=0
>> >>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>>>> https%3A%2F%2Fwww.patr
>> >>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>>>> 7Cee5c84b4e3ff4d
>> >>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>>>> cee1%7C0%7C0%7C6365540407
>> >>>>>>>>>>>
>> >>>>>>>>>>>18214998&sdata=VYtgB8rsurZAHpO%2FVs%
>> 2FqOkmxROz58p7VvQ%2B0EK8VPPc
>> >>>>>>>>>>>%
>> >>>>>>>>>> 3D&reserv
>> >>>>>>>>>>> ed=0>*
>> >>>>>>>>>>
>> >>>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>> --
>> >>>>>>>>>
>> >>>>>>>>> Piotr Zarzycki
>> >>>>>>>>>
>> >>>>>>>>> Patreon:
>> >>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>> https%3A%2F%2Fwww.patr
>> >>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>> 7Cda0fd75922c94d
>> >>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>> cee1%7C0%7C0%7C6365543602
>> >>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>>95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0
>> oJqA6J42ZuhcA%3D&rese
>> >>>>>>>>>rv
>> >>>>>>>>> ed
>> >>>>>>>>> =0
>> >>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url=
>> >>>>>>>> https%3A%2F%2Fwww.patr
>> >>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%
>> >>>>>>>> 7Cda0fd75922c94d
>> >>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de
>> >>>>>>>> cee1%7C0%7C0%7C6365543602
>> >>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0
>> >>>>>>>> oJqA6J42ZuhcA%3D&reserved=0>*
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> --
>> >>>>>>>
>> >>>>>>> Piotr Zarzycki
>> >>>>>>>
>> >>>>>>> Patreon:
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>*https://na01.safelinks.protection.outlook.
>> com/?url=https%3A%2F%2Fww
>> >>>>>>>w.
>> >>>>>>> pa
>> >>>>>>> tr
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=https%3A%2F%2Fww
>> >>>>>>>w.
>> >>>>>>> pa
>> >>>>>>> tr>
>> >>>>>>> eon.com
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=http%3A%2F%2Feon
>> >>>>>>>.c
>> >>>>>>> om
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>%2F&data=02%7C01%7Caharui%40adobe.com%
>> 7C75519f53f52b4fde36b108d57edb
>> >>>>>>>59
>> >>>>>>> 03
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> 7C636554402926763835&sda
>> >>>>>>>ta
>> >>>>>>> =G
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>%
>> 2Fpiotrzar
>> >>>>>>>zy
>> >>>>>>> ck
>> >>>>>>> i&data=02%7C01%7Caharui%40adobe.com
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=http%3A%2F%2F40a
>> >>>>>>>do
>> >>>>>>> be
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>.com%2F&data=02%7C01%7Caharui%40adobe.com%
>> 7C75519f53f52b4fde36b108d5
>> >>>>>>>7e
>> >>>>>>> db
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> 7C636554402926763835
>> >>>>>>>&s
>> >>>>>>> da
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D&
>> reserved=0>%7Cf2
>> >>>>>>>5d
>> >>>>>>> bf
>> >>>>>>> 20138f47
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de
>> cee1%7C0%7C0%7C6365
>> >>>>>>>54
>> >>>>>>> 37
>> >>>>>>> 41
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS
>> etW7oghI4s%3D&rese
>> >>>>>>>rv
>> >>>>>>> ed
>> >>>>>>> =0
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=https%3A%2F%2Fww
>> >>>>>>>w.
>> >>>>>>> pa
>> >>>>>>> tr
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=https%3A%2F%2Fww
>> >>>>>>>w.
>> >>>>>>> pa
>> >>>>>>> tr>
>> >>>>>>> eon.com
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=http%3A%2F%2Feon
>> >>>>>>>.c
>> >>>>>>> om
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>%2F&data=02%7C01%7Caharui%40adobe.com%
>> 7C75519f53f52b4fde36b108d57edb
>> >>>>>>>59
>> >>>>>>> 03
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> 7C636554402926763835&sda
>> >>>>>>>ta
>> >>>>>>> =G
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>%
>> 2Fpiotrzar
>> >>>>>>>zy
>> >>>>>>> ck
>> >>>>>>> i&data=02%7C01%7Caharui%40adobe.com
>> >>>>>>>
>> >>>>>>>
>> >>>>>>><https://na01.safelinks.protection.outlook.
>> com/?url=http%3A%2F%2F40a
>> >>>>>>>do
>> >>>>>>> be
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>.com%2F&data=02%7C01%7Caharui%40adobe.com%
>> 7C75519f53f52b4fde36b108d5
>> >>>>>>>7e
>> >>>>>>> db
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
>> 7C636554402926763835
>> >>>>>>>&s
>> >>>>>>> da
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D&
>> reserved=0>%7Cf2
>> >>>>>>>5d
>> >>>>>>> bf
>> >>>>>>> 20138f47
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de
>> cee1%7C0%7C0%7C6365
>> >>>>>>>54
>> >>>>>>> 37
>> >>>>>>> 41
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS
>> etW7oghI4s%3D&rese
>> >>>>>>>rv
>> >>>>>>> ed
>> >>>>>>> =0
>> >>>>>>>> *
>> >>>>>
>> >>>>
>> >>>
>> >>
>> >
>>
>>


-- 

Piotr Zarzycki

Patreon: *https://www.patreon.com/piotrzarzycki
<https://www.patreon.com/piotrzarzycki>*

Reply via email to