It looks good to me.
2018-01-03 20:39 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > Well, that bead only dispatches "dataProvidedChanged" regardless of the > reason. And it does so after the data as changed. We want to know before > the data changes so we can save the selection and then after the data > changes so it can be restored, if possible. We need something to send out > an event prior to the changes. > > ArrayList only sends post-change events. If we listen for when the > selectedIndex changes, then we can keep a reference to the item selected. > When ArrayList is updated and sends, say a "itemAdded" event, the model > must not change the selectedIndex (thus dispatching a event and wiping out > our save). > > I think the right way to do this is: > > ArrayList - sends itemAdded, itemRemoved, itemUpdated events. This is what > it does now. > > DynamicArrayList - extends ArrayList, and sends itemAdding, itemRemoving, > and itemUpdating events prior to making the changes and then calls the > super function to dispatch the normal post-change event. > > DynamicArrayListSelectionModel listens for the "-ing" events and saves the > current selection. When it receives the "-ed" event, it restores the > selection. > > I think this will work and should not be disruptive. > > On 1/3/18, 12:26 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> wrote: > > >Hi Peter, > > > >What about DataProviderItemsChangeNotifier - It exactly doing what you > are > >saying and what that restoration bead needs. What do you think ? > > > >Thanks, Piotr > > > > > >2018-01-03 18:05 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > > > >> I've spent this morning wrestling with this. > >> > >> Right now when a model (eg, ArraySelectionModel, > >>ArrayListSelectionModel) > >> has its dataProvider replaced, it will set the selectedIndex to -1 (and > >> selectedItem to null) if the dataProvider is being set to null; > >>otherwise > >> it leaves the values unchanged unless the current value exceeds the size > >> of the new dataProvider. > >> > >> A typical way to change things is to update the dataProvider and then > >>set > >> the list.dataProvider to null (selectedIndex becomes -1, dispatches > >> "selectedIndexChanged") followed setting list.dataProvider back to the > >> original dataProvider. This is done because we did not have a dynamic > >> system. Reseting the selection in this cause falls on the application > >> writer. > >> > >> For dynamic data, I think we also need a dynamic model (eg, > >> DynamicCollectionViewSelectionModel) which is tuned into the needs of a > >> dynamic system. > >> > >> Before changing a dataProvider, the DyanmicCollectionViewSelectionModel > >> will dispatch a "dataProviderChanging" event. This would give a > >>selection > >> restoration bead the opportunity to store the current selection. Then > >>upon > >> receiving the "dataProviderChanged" event, restore the selection. > >> > >> Unfortunately, the selection restoration bead still does not know when > >>an > >> item will be added or removed. While the model can listen for a complete > >> replacement of the dataProvider and warning with a > >>"dataProviderChanging" > >> event, then is no "itemAdding" or "itemRemoving" event prior to an item > >> being added or removed. To do this, we will need to having a new > >> collection view that extends ArrayList and dispatches those extra > >>events. > >> Then the selection restoration bead can operate correctly. > >> > >> This is my current thinking. > >> > >> —peter > >> > >> > >> On 1/2/18, 4:43 PM, "Alex Harui" <aha...@adobe.com.INVALID> wrote: > >> > >> >And this one reason we have beads as a pattern. There is no one right > >>way > >> >to preserve selection and selection should not always be preserved for > >> >certain kinds of data provider changes. So, create a bead that > >>performs > >> >the selection preservation you need and give it a name that makes it > >>clear > >> >what it does. Then others can create similar beads for other > >>strategies. > >> > > >> >My 2 cents, > >> >-Alex > >> > > >> >On 1/2/18, 1:26 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> > wrote: > >> > > >> >>Peter, > >> >> > >> >>You didn't misread, but my thoughts probably didn't far away into > >>problem > >> >>resolution. That's why I was surprise why I haven't thought about > >> >>preserving selection. :) > >> >> > >> >>Thanks, Piotr > >> >> > >> >> > >> >>2018-01-02 22:10 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > >> >> > >> >>> I thought because you mentioned that rollover and selection were > >>messed > >> >>> up, that was the thing needing attention. I must have misread your > >> >>>email; > >> >>> I'll go back. > >> >>> > >> >>> In the meantime, I have a Button that inserts an item into the > >> >>> dataProvider. Before doing this I am: > >> >>> > >> >>> var oldSelection:Object = list.selectedItem; // or selectedIndex?? > >> >>> > >> >>> > >> >>> then update the dataProvider by inserting an item into it. For a > >>List > >> >>>with > >> >>> the standard bead set, I have to: > >> >>> > >> >>> list.dataProvider = null; > >> >>> list.dataProvider = applicationModel.dataProvider; > >> >>> > >> >>> After that, I just restore the selection: list.dataProvider = > >> >>>oldSelection > >> >>> > >> >>> Need to figure out if the dataProvider will change, save the > >>selection, > >> >>> allow the change, then restore it. > >> >>> > >> >>> —peter > >> >>> > >> >>> On 1/2/18, 3:58 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> > >> wrote: > >> >>> > >> >>> >How are you doing that preservation, by simply saving item > >>somewhere > >> >>> >before > >> >>> >remove/add operation ? > >> >>> > > >> >>> >I'm not following the part where we you wanted some opinion. > >>Actually > >> >>>in > >> >>> >case of refreshing I didn't even thing about saving selection, but > >> >>>it's > >> >>> >true that it should happen! It's surprises me that in my app I > >>forgot > >> >>> >about > >> >>> >that. :) > >> >>> > > >> >>> >Thanks, Piotr > >> >>> > > >> >>> > > >> >>> >2018-01-02 21:44 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > >> >>> > > >> >>> >> The first task is to determine if a list's selectedIndex or > >> >>>selectedItem > >> >>> >> should be preserved. > >> >>> >> > >> >>> >> For selectedIndex, adding or removing an item will get the same > >>row > >> >>> >> selected until that row no longer exists. > >> >>> >> > >> >>> >> For selectedItem, adding or removing an item will keep the same > >>item > >> >>> >> selected until that item no longer exists. For example, if the > >>4th > >> >>>item > >> >>> >>is > >> >>> >> "red" and you insert an item at position 2, "red" remains > >>selected > >> >>>by > >> >>> >> shifts down a row. > >> >>> >> > >> >>> >> I can see this working both ways. > >> >>> >> > >> >>> >> In either case, first preserving the selection (index or item) > >> >>>before > >> >>> >>the > >> >>> >> add or remove and then restoring it works fine - I did this in > >> >>> >>application > >> >>> >> code, not in framework code. Works very nicely, as a matter of > >>fact. > >> >>> >>Works > >> >>> >> for both traditional lists and dynamic lists with the new beads > >> >>>(yours, > >> >>> >> Piotr, or my new collection ones). Its *very simple* code. > >> >>> >> > >> >>> >> So once we decide which selection is preserved, we need to decide > >> >>>where > >> >>> >> that goes. Even though this code is just a couple of lines, in > >>the > >> >>>PAYG > >> >>> >> world, not every app needs this so it must go into additional > >>beads > >> >>> >>since > >> >>> >> it is added functionality. > >> >>> >> > >> >>> >> —peter > >> >>> >> > >> >>> >> > >> >>> >> > >> >>> >> > >> >>> >> > >> >>> >> On 1/2/18, 1:31 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> > >> >>>wrote: > >> >>> >> > >> >>> >> >Hi Peter, > >> >>> >> > > >> >>> >> >Welcome after vacation! I sense all ideas when I'm working with > >> >>>that > >> >>> >> >stuff. > >> >>> >> >I think you will see the issue with indexes, even if it's not > >>the > >> >>>case > >> >>> >> >with > >> >>> >> >removing from the list. I will wait for your review with that > >>index > >> >>> >> >refresh. > >> >>> >> > > >> >>> >> >Thank you so much! :) > >> >>> >> > > >> >>> >> > > >> >>> >> >2018-01-02 19:10 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > >> >>> >> > > >> >>> >> >> Hi, > >> >>> >> >> > >> >>> >> >> Catching up and building stuff. I'm going to repeat some > >>things > >> >>>for > >> >>> >>the > >> >>> >> >> befit of anyone joining Royale for 2018 (and to refresh my own > >> >>> >>thoughts > >> >>> >> >> coming off of holiday!). > >> >>> >> >> > >> >>> >> >> The initial idea of List and related classes was their beads > >>were > >> >>>to > >> >>> >>be > >> >>> >> >> almost static. You'd have data that you would use to create > >>the > >> >>> >> >> dataProvider to the list and when set, would cause the > >> >>>itemRenderers > >> >>> >>to > >> >>> >> >>be > >> >>> >> >> deleted and replaced. Even something as simple as adding new > >>data > >> >>>to > >> >>> >>the > >> >>> >> >> end of the dataProvider would require this reset: you'd have > >>to > >> >>>clear > >> >>> >> >>the > >> >>> >> >> dataProvider (list.dataProver = null) and set it again or > >>create > >> >>>a > >> >>> >> >> completely new dataProvider and set that to the list. > >> >>> >> >> > >> >>> >> >> The selected item and index should, in this case, be cleared. > >>I'd > >> >>> >>have > >> >>> >> >>to > >> >>> >> >> run a test to see if that really happens as I don't remember. > >>If > >> >>>you > >> >>> >> >>want > >> >>> >> >> to reset them back (assuming that index still existed) you > >>would > >> >>> >>write a > >> >>> >> >> bead to do it. > >> >>> >> >> > >> >>> >> >> Now we are at the dynamic stage where we want to handle > >>runtime > >> >>> >>updates > >> >>> >> >>to > >> >>> >> >> the dataProvider and create just new itemRenderers and insert > >> >>>them or > >> >>> >> >> remove itemRenderers when data is deleted from the > >>dataProvider. > >> >>> >> >> > >> >>> >> >> Alex believes that the initial creation and insertions are the > >> >>>most > >> >>> >> >>common > >> >>> >> >> of the dynamic actions; removals being less common. As such in > >> >>>the > >> >>> >>PAYG > >> >>> >> >> world you would have a bead that handled a replacement of the > >> >>> >> >>dataProvider > >> >>> >> >> (which covers the initialization step) and a bead which > >>handled > >> >>> >> >>additions > >> >>> >> >> and a bead to handle removals. There's a lot of duplication of > >> >>>code > >> >>> >>in > >> >>> >> >> these and under a non-PAYG system you'd just combine these > >>into a > >> >>> >>single > >> >>> >> >> bead to do initialize, add, and removal. > >> >>> >> >> > >> >>> >> >> In the dynamic beads, the selection should be preserved. That > >> >>> >> >>information > >> >>> >> >> is stored in the model. The model doesn't do much else accept > >> >>>keep > >> >>> >>the > >> >>> >> >> data. The standard view bead would not know about these extra > >> >>>events > >> >>> >>so > >> >>> >> >> yes, we'd need another view bead to intercept those events and > >> >>> >>re-apply > >> >>> >> >>or > >> >>> >> >> adjust the selection. > >> >>> >> >> > >> >>> >> >> ‹peter > >> >>> >> >> > >> >>> >> >> On 12/30/17, 4:29 PM, "Piotr Zarzycki" > >> >>><piotrzarzyck...@gmail.com> > >> >>> >> >>wrote: > >> >>> >> >> > >> >>> >> >> >Peter, > >> >>> >> >> > > >> >>> >> >> >I have figure out what is wrong in case of List. I reported > >>in > >> >>>the > >> >>> >> >> >previous > >> >>> >> >> >email that in the ListExample once you remove one item, > >> >>>something is > >> >>> >> >>wrong > >> >>> >> >> >with selection. Issue happened when you removing item in the > >> >>>middle > >> >>> >>of > >> >>> >> >> >collection. > >> >>> >> >> > > >> >>> >> >> >Let's say that you have 5 items and you are removing item > >>with > >> >>> >>index = > >> >>> >> >>2. > >> >>> >> >> >Removing will work properly, but StringItemRenderer -> > >> >>> >> >> >DataItemRenderer -> UIItemRendererBase > >> >>> >> >> ><- has property "index" which is basically not being > >>refreshed > >> >>>after > >> >>> >> >> >remove. In the result renderers has following indexes: > >> >>> >> >> > > >> >>> >> >> >0, > >> >>> >> >> >1, > >> >>> >> >> >3, > >> >>> >> >> >4 > >> >>> >> >> > > >> >>> >> >> >Which is messes up selection and roll over color changes. How > >> >>> >>actually > >> >>> >> >>fix > >> >>> >> >> >that ? My first thought was that ListView should listen for > >> >>> >> >>"layoutNeeded" > >> >>> >> >> >(we are dispatching that event after remove, add etc.) and > >> >>>refresh > >> >>> >> >>indexes > >> >>> >> >> >of all renderers. > >> >>> >> >> > > >> >>> >> >> >The second thought is that ListView should listen for remove > >> >>>event, > >> >>> >> >>where > >> >>> >> >> >we will have index of removed row, so we will be able loop > >> >>>through > >> >>> >> >>part of > >> >>> >> >> >the collection and refresh rest of the indexes. It is more > >> >>> >>efficient, > >> >>> >> >>but > >> >>> >> >> >maybe this is job for new type of View (bead) - > >>ListRemoveView > >> >>>bead > >> >>> >>? > >> >>> >> >> > > >> >>> >> >> >Looking forward to your thought once you get back from > >>Vacation. > >> >>>:) > >> >>> >> >> > > >> >>> >> >> >Thanks, Piotr > >> >>> >> >> > > >> >>> >> >> > > >> >>> >> >> > > >> >>> >> >> >2017-12-22 15:05 GMT+01:00 Piotr Zarzycki > >> >>> >><piotrzarzyck...@gmail.com>: > >> >>> >> >> > > >> >>> >> >> >> Hi Peter, > >> >>> >> >> >> > >> >>> >> >> >> I haven't checked your branch yet, but I just pushed > >>couple of > >> >>> >> >>things to > >> >>> >> >> >> the develop which I needed for my examples. Here is the > >>list > >> >>>of > >> >>> >>beads > >> >>> >> >> >>which > >> >>> >> >> >> we currently have and can be used for List. I think names > >>are > >> >>>self > >> >>> >> >> >> explanatory. > >> >>> >> >> >> > >> >>> >> >> >> DynamicAddItemRendererForArrayListData > >> >>> >> >> >> > >> >>> >> >> >> DynamicUpdateItemRendererForArrayListData > >> >>> >> >> >> > >> >>> >> >> >> DynamicRemoveItemRendererForArrayListData > >> >>> >> >> >> > >> >>> >> >> >> DynamicRemoveAllItemRendererForArrayListData > >> >>> >> >> >> > >> >>> >> >> >> DynamicRemoveAllByNullItemRendererForArrayListData > >> >>> >> >> >> > >> >>> >> >> >> All beads above should be used once you set for your list: > >> >>> >> >> >>IDataProviderItemRendererMapper: > >> >>> >> >> >>ClassReference("org.apache.royale.html.beads. > >> >>> >> >> DataItemRendererFactoryForAr > >> >>> >> >> >>rayList") > >> >>> >> >> >> > >> >>> >> >> >> We have also DynamicItemsRendererFactoryForArrayListData - > >> >>>which > >> >>> >>is > >> >>> >> >> >>doing actually two things. Create all items once someone set > >> >>> >> >> >>dataProvider (the same logic as in > >> >>> >> >>DataItemRendererFactoryForArrayList) > >> >>> >> >> >>AND handle adding to > >> >>> >> >> >> > >> >>> >> >> >> ArrayList (the same logic as in > >> >>> >> >>DynamicAddItemRendererForArrayListData) > >> >>> >> >> >>- It duplicates logic from those both beads. > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> Two Scenarios with > >> >>>DynamicItemsRendererFactoryForArrayListData: > >> >>> >> >> >> > >> >>> >> >> >> 1) If we use DynamicItemsRendererFactoryForArrayListData > >> >>>simply > >> >>> in > >> >>> >> >>the > >> >>> >> >> >>List as it is in our ListExample [1] we don't have to > >>remember > >> >>>to > >> >>> >> >>setup: > >> >>> >> >> >> > >> >>> >> >> >> IDataProviderItemRendererMapper: > >> >>> >> >> >>ClassReference("org.apache.royale.html.beads. > >> >>> >> >> DataItemRendererFactoryForAr > >> >>> >> >> >>rayList"). > >> >>> >> >> >> > >> >>> >> >> >> However in that scenario we will have in List totally > >>useless > >> >>>bead > >> >>> >> >> >>DataItemRendererFactoryForArray which is being added > default > >> to > >> >>> the > >> >>> >> >> List. > >> >>> >> >> >> > >> >>> >> >> >> 2) If we use DynamicItemsRendererFactoryForArrayListData > >>and > >> >>>we > >> >>> >>add > >> >>> >> >>in > >> >>> >> >> >>CSS IDataProviderItemRendererMapper: > >> >>> >> >> >>ClassReference("org.apache.royale.html.beads. > >> >>> >> >> DataItemRendererFactoryForAr > >> >>> >> >> >>rayList") > >> >>> >> >> >> > >> >>> >> >> >> I'm not sure what can happen actually, cause both beads are > >> >>>using > >> >>> >>the > >> >>> >> >> >>same logic to create item renderers. Can be situation when > >>one > >> >>> >>bead is > >> >>> >> >> >>create renderers and second one re do this work again ? :) > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> Thanks, Piotr > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> [1] > >> >>> >> >> >>https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> >> https%3A%2F%2Fgithub.c > >> >>> >> >> >>om%2Fapache%2Froyale-asjs%2Fblob% > >> 2F24b09c787fc1da2d0a19895a2b2d > >> >>> >> >> 4a440e26c5 > >> >>> >> >> >>97%2Fexamples%2Froyale%2FListExample%2Fsrc%2Fmain% > >> >>> >> >> 2Froyale%2FMyInitialVie > >> >>> >> >> >>w.mxml%23L69&data=02%7C01%7Cpent%40adobe.com% > >> >>> >> >> 7C94d879f8f6054e10c75508d54f > >> >>> >> >> >>cc6fe8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% > >> >>> >> >> 7C636502661827506659&sd > >> >>> >> >> >>ata=W4Ih5Q0IGhGNvOX9jrmn580Qw4ljo%2BavjqABV4%2BJr%2Bc%3D& > >> >>> reserved=0 > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> 2017-12-19 20:35 GMT+01:00 Olaf Krueger > >> >>><m...@olafkrueger.net>: > >> >>> >> >> >> > >> >>> >> >> >>> Peter, great to read something about these "Collections" > >>and > >> >>> >> >> >>>"Hierarchical > >> >>> >> >> >>> data" stuff here! > >> >>> >> >> >>> Thanks for working on this, have a nice time and enjoy > >>your > >> >>> >>break! > >> >>> >> >> >>> > >> >>> >> >> >>> Olaf > >> >>> >> >> >>> > >> >>> >> >> >>> > >> >>> >> >> >>> > >> >>> >> >> >>> -- > >> >>> >> >> >>> Sent from: > >> >>> >> >> >>>https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> >> http%3A%2F%2Fapache-r > >> >>> >> >> > >>>>>oyale-development.20373.n8.nabble.com%2F&data=02%7C01%7Cpent% > >> >>> >> >> 40adobe.com > >> >>> >> >> >>>%7C94d879f8f6054e10c75508d54fcc6fe8% > >> >>> 7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> >> cee1%7 > >> >>> >> >> > >> >>>>>>C0%7C0%7C636502661827506659&sdata=Zb1nVaD5dUx1Y89Q1jj4LxqBhtlxoZ > >> >>> >> >> FlwDFJAq > >> >>> >> >> >>>ruTsY%3D&reserved=0 > >> >>> >> >> >>> > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> > >> >>> >> >> >> -- > >> >>> >> >> >> > >> >>> >> >> >> Piotr Zarzycki > >> >>> >> >> >> > >> >>> >> >> >> Patreon: > >> >>> >> >> >>*https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> >> https%3A%2F%2Fwww.pat > >> >>> >> >> >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com > >> >>> >> >> %7C94d879f8f6054e > >> >>> >> >> >>10c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> >> cee1%7C0%7C0%7C636502661 > >> >>> >> >> >>827506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >> >>> >> >> FXtA%3D&reserv > >> >>> >> >> >>ed=0 > >> >>> >> >> >> > >> >>> >> >> >><https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> >> https%3A%2F%2Fwww.pat > >> >>> >> >> >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com > >> >>> >> >> %7C94d879f8f6054e > >> >>> >> >> >>10c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> >> cee1%7C0%7C0%7C636502661 > >> >>> >> >> >>827506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >> >>> >> >> FXtA%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%7Cpent%40adobe.com% > >> >>> >> >> 7C94d879f8f6054e10 > >> >>> >> >> >c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> >> cee1%7C0%7C0%7C636502661827 > >> >>> >> >> >506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >> >>> >> >> FXtA%3D&reserved=0 > >> >>> >> >> ><https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> >> https%3A%2F%2Fwww.patr > >> >>> >> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >> >>> >> >> 7C94d879f8f6054e10 > >> >>> >> >> >c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> >> cee1%7C0%7C0%7C636502661827 > >> >>> >> >> >506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >> >>> >> >> FXtA%3D&reserved=0 > >> >>> >> >> >>* > >> >>> >> >> > >> >>> >> >> > >> >>> >> > > >> >>> >> > > >> >>> >> >-- > >> >>> >> > > >> >>> >> >Piotr Zarzycki > >> >>> >> > > >> >>> >> >Patreon: > >> >>> >> >*https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> https%3A%2F%2Fwww.patr > >> >>> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >> >>> >> 7C96bb80bb6fef4b94 > >> >>> >> >089008d5520f1a9f%7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> cee1%7C0%7C0%7C636505147194 > >> >>> >> > >> >>> >>>474371&sdata=D3%2FGi2wtNJLEO716RK18TbD1VMFdB3V > >> >>> Kv3Br5KkZfFI%3D&reserved=0 > >> >>> >> ><https://na01.safelinks.protection.outlook.com/?url= > >> >>> >> https%3A%2F%2Fwww.patr > >> >>> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >> >>> >> 7C96bb80bb6fef4b94 > >> >>> >> >089008d5520f1a9f%7Cfa7b1b5a7b34438794aed2c178de > >> >>> >> cee1%7C0%7C0%7C636505147194 > >> >>> >> >474371&sdata=D3%2FGi2wtNJLEO716RK18TbD1VMFdB3V > >> >>> >> Kv3Br5KkZfFI%3D&reserved=0>* > >> >>> >> > >> >>> >> > >> >>> > > >> >>> > > >> >>> >-- > >> >>> > > >> >>> >Piotr Zarzycki > >> >>> > > >> >>> >Patreon: > >> >>> >*https://na01.safelinks.protection.outlook.com/?url= > >> >>> https%3A%2F%2Fwww.patr > >> >>> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >> >>> 7C61ec983f6a9747bd > >> >>> >cd7d08d552239493%7Cfa7b1b5a7b34438794aed2c178de > >> >>> cee1%7C0%7C0%7C636505235128 > >> >>> >887083&sdata=Y%2BHjYn%2BGj%2Bhb0VVVy7fSW%2BGEvQo2% > >> >>> 2FUjH2EhucTbxR8Q%3D&rese > >> >>> >rved=0 > >> >>> ><https://na01.safelinks.protection.outlook.com/?url= > >> >>> https%3A%2F%2Fwww.patr > >> >>> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >> >>> 7C61ec983f6a9747bd > >> >>> >cd7d08d552239493%7Cfa7b1b5a7b34438794aed2c178de > >> >>> cee1%7C0%7C0%7C636505235128 > >> >>> >887083&sdata=Y%2BHjYn%2BGj%2Bhb0VVVy7fSW%2BGEvQo2% > >> >>> 2FUjH2EhucTbxR8Q%3D&rese > >> >>> >rved=0>* > >> >>> > >> >>> > >> >> > >> >> > >> >>-- > >> >> > >> >>Piotr Zarzycki > >> >> > >> >>Patreon: > >> >>*https://na01.safelinks.protection.outlook.com/?url= > >> https%3A%2F%2Fwww.pat > >> >>r > >> >>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com > >> %7C4ed02057c74e4 > >> >>5 > >> >>0da30908d552277e71%7Cfa7b1b5a7b34438794aed2c178de > >> cee1%7C0%7C0%7C636505251 > >> >>9 > >> > >>>>40120787&sdata=aJzPBX5fyLQVXr21gO9aLOIIQhVMgf > 3QaT4qEcsnWE4%3D&reserved= > >>>>0 > >> >><https://na01.safelinks.protection.outlook.com/?url= > >> https%3A%2F%2Fwww.pat > >> >>r > >> >>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com > >> %7C4ed02057c74e4 > >> >>5 > >> >>0da30908d552277e71%7Cfa7b1b5a7b34438794aed2c178de > >> cee1%7C0%7C0%7C636505251 > >> >>9 > >> >>40120787&sdata=aJzPBX5fyLQVXr21gO9aLOIIQhVMgf > >> 3QaT4qEcsnWE4%3D&reserved=0> > >> >>* > >> > > >> > >> > > > > > >-- > > > >Piotr Zarzycki > > > >Patreon: > >*https://na01.safelinks.protection.outlook.com/?url= > https%3A%2F%2Fwww.patr > >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > 7Cbc91b6fdde6b490b > >314408d552cf1a3d%7Cfa7b1b5a7b34438794aed2c178de > cee1%7C0%7C0%7C636505971860 > >386569&sdata=6jY4KSQS6PyNDnWtW3XBVP69nGU%2FHJYfyxHdhurBwh0%3D&reserved=0 > ><https://na01.safelinks.protection.outlook.com/?url= > https%3A%2F%2Fwww.patr > >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > 7Cbc91b6fdde6b490b > >314408d552cf1a3d%7Cfa7b1b5a7b34438794aed2c178de > cee1%7C0%7C0%7C636505971860 > >386569&sdata=6jY4KSQS6PyNDnWtW3XBVP69nGU%2FHJYfyxHdhurBwh0%3D&reserved= > 0>* > > -- Piotr Zarzycki Patreon: *https://www.patreon.com/piotrzarzycki <https://www.patreon.com/piotrzarzycki>*