Android reactive programming with Rxjava

Video in TIB AV-Portal: Android reactive programming with Rxjava

Formal Metadata

Android reactive programming with Rxjava
Title of Series
CC Attribution 3.0 Germany:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal purpose as long as the work is attributed to the author in the manner specified by the author or licensor.
Release Date
Production Place

Content Metadata

Subject Area
In a world where there is a smartphone in every pocket, designing and building applications that can run smoothly and provide the User Experience that users will like it’s the only way to go. Reactive Programming style with RxJava will help you to beat Android Platform limitations to create astonishing Android Apps. This talk will be a practical journey from basic Reactive Programming and Observer Pattern concepts to the main feature of RxJava, with practical code examples and a real-world app. I'll show the audience how to create an Observable "from scratch", from a list or from a function we already have in our code base. Our listeners will learn how to filter an Observable sequence to create a new sequence containing only the values we want; they will learn how to apply a function to an Observable, how to concatenate, merge or zip Observables. I'll show how to enjoy RxAndroid Schedulers to overcome the threading and concurrency hell in Android. I will close the talk with a practical example about RxJava + Retrofit, to easily communicate with a REST API.
Keywords reactive programming Android rxJava Observer Pattern Retrofit REST API
Mapping Voltmeter
Programming paradigm Concurrency (computer science) Cellular automaton Projective plane Android (robot) 3 (number) Computer programming Event horizon Formal language Data management Process (computing) Uniform resource name Computer programming Convex hull
Area Radical (chemistry) State observer Implementation IRIS-T Weight Virtual machine Mereology Extension (kinesiology) Computer programming Formal language
Dataflow Software design pattern Server (computing) Process (computing) Dataflow State observer Complex system Mass Scalability
State observer Mathematics Multiplication sign State observer Pattern language Sound effect
Randomization Spreadsheet Cellular automaton Multiplication sign Software design pattern Summierbarkeit Quicksort Pie chart
Point (geometry) Pay television View (database) Mereology
Standard deviation Server (computing) Implementation Mobile app Personal identification number Multiplication sign 1 (number) Electronic mailing list Mereology Rule of inference Revision control Mathematics Pattern language Physical law Form (programming) Mobile app Addition Standard deviation Moment (mathematics) State observer Android (robot) Instance (computer science) Sequence Process (computing) Personal digital assistant Network topology
Point (geometry) Metre State observer Real number Coroutine Control flow Infinity Revision control Pointer (computer programming) Physical law Information Error message Form (programming) Mobile app Computer icon Rule of inference Standard deviation Moment (mathematics) Interior (topology) Line (geometry) Sequence Type theory Loop (music) Personal digital assistant Abelian category Optical disc drive Booting
Area Mobile app Computer file Information systems Electronic mailing list Damping Sequence Error message Flow separation Exception handling Element (mathematics)
Point (geometry) Mobile app State observer Wechselseitige Information Mobile app Mapping Personal identification number Multiplication sign View (database) Boilerplate (text) Interior (topology) Maxima and minima Bit Electronic mailing list Uniformer Raum Semiconductor memory Physical law
Point (geometry) State observer Message passing Length Electronic mailing list Video game Arithmetic progression
Boolean algebra Mobile app State observer Digital filter Mobile app Electronic mailing list Bit Object (grammar) Condition number
Graphical user interface Code State of matter Line (geometry) Sequence Element (mathematics)
Summierbarkeit Software testing Insertion loss Complete metric space Sequence Element (mathematics)
Area Point (geometry) State observer Hoax Logic Multiplication sign View (database) Whiteboard Event horizon Sequence Arm Element (mathematics)
Ocean current State observer Execution unit Multiplication sign Moment (mathematics) Execution unit Electronic mailing list Bit Perturbation theory Bit Sequence Element (mathematics) 2 (number) Medical imaging Sample (statistics) Bit rate Order (biology) Electronic visual display Window
Point (geometry) Mobile app State observer Beta function Functional (mathematics) Mapping Mapping Information View (database) Multiplication sign Electronic mailing list Amsterdam Ordnance Datum Bit Raster graphics Sequence Flow separation Hand fan Element (mathematics) Personal digital assistant String (computer science) Object (grammar) Singuläres Integral
Point (geometry) Metropolitan area network State observer Functional (mathematics) Mapping Process (computing) Mapping Chain Interior (topology) Raster graphics Metropolitan area network Emulation
Classical physics Software engineering State observer Mobile app Thread (computing) Mapping Repetition Multiplication sign Instance (computer science) Sequence Mathematics Process (computing) Different (Kate Ryan album) Object (grammar) Resultant Task (computing) Data buffer
Type theory State observer Casting (performing arts) Buffer solution Electronic mailing list Instance (computer science) Form (programming) Subset
Revision control State observer Execution unit Single-precision floating-point format Electronic mailing list Lattice (order) Limit (category theory) Sequence God
Mobile app State observer Execution unit Functional (mathematics) Process (computing) String (computer science) Object (grammar) Number Element (mathematics)
Mobile app Android (robot) Food energy Thread (computing) Data type
Mobile app Trail Asynchronous Transfer Mode Thread (computing) Scaling (geometry) View (database) Multiplication sign View (database) Real number Android (robot) Set (mathematics) Thread (computing) Hierarchy Crash (computing) Process (computing) Software Personal digital assistant Hierarchy Order (biology) Ideal (ethics) MiniDisc Reading (process) Asynchronous Transfer Mode Data type
Thread (computing) Key (cryptography) View (database) View (database) Android (robot) 3 (number) Line (geometry) Measurement Thread (computing) Hierarchy Process (computing) Synchronization MiniDisc Extension (kinesiology) Curve fitting Resultant Reading (process) God Task (computing)
Mobile app Thread (computing) Service (economics) Multiplication sign Android (robot) Thread (computing)
Domain name Frame problem Skeleton (computer programming) Trail Computational physics Thread (computing) Android (robot) Thread (computing) Frame problem Scattering Physical system
Dynamical system Root Process (computing) Computer-generated imagery Control flow Arrow of time Representational state transfer Cartesian coordinate system Event horizon Lambda calculus Product (business) Booting
Web page Profil (magazine) Multiplication sign File viewer Open set Cartesian coordinate system Number
Implementation Mass flow rate Service (economics) Logarithm View (database) Uniform resource locator Mathematics Representational state transfer Bit rate Cuboid Dependent and independent variables Mapping Interface (computing) Electronic mailing list Staff (military) Representational state transfer Data management Malware Uniform resource name Social class Summierbarkeit Energy level Object (grammar) Pressure Resultant
Mobile app Execution unit Message passing Data management Error message Oval Information systems Ext functor Bit Arithmetic progression Multiplication
Data management Presentation of a group Representational state transfer Thread (computing) Logarithm Building Social class Energy level Instance (computer science) Wide area network
Computer icon Mobile app Digital filter Thread (computing) Service (economics) Scaling (geometry) Mapping Dependent and independent variables View (database) Computer-generated imagery Bit Line (geometry) Computer icon Uniform resource locator Error message Physical law Game theory
Uniform resource locator Digital filter Word Presentation of a group Profil (magazine) Equals sign Moment (mathematics) Open set Usability Sequence
Area State observer Data mining Operator (mathematics) Event horizon Reverse engineering
Dataflow Digital filter Wechselseitige Information Water vapor 3 (number) Water vapor Special unitary group Sequence
this 1 OK your attention please IEEE everybody uneasy even modulo managing and from
southern Italy sold more so the talk will be in English and hand moving yeah have the all the all of our X jealous and shows you it's there and step-by-step journey from the beginning of of absorber of pardon and back to and read and and redevelopment has been
published last week you can check it out of my most popular that produced greatest the Books for Kindle formerly kingdom values that Amazon we have as small discussion about trademarks but still it's a how we can project it's a very prevalent in Germany but minutes 100 thousand volts right now and it's combining map for Kindle users and it's all about free books from
the able cannibalism but brawl with 20 dollars
something you can afford it to project manager come on tell by as a company you know
charge them from for the next cell flower are mostly we're are working we're talking about and the the reactive programming with Rx job well the goals as ended us we has to be issue with concurrency with least events and stuff like that and the external can be really useful itself it's which etc. earlier paradigms which but you can reuse it in local languages beagles they're basically compatible with
everything if you're iris you can use radical clawer Rubio adopt metal or whatever you just Rx and your language that that's it is our costly into the and brave people from reactive remaining is a
new idea is based on the observer part that is probably 40 years old so it's quite new was Barbara by a was made popular by attic areas than Microsoft thank you for the truck guys and they created the react the extensions for about 2 minutes and then back Christensen and Netflix ported it to 1 our its implementation it's not the port and they were targeting the little machines so you can use it with Scala Clojure a groovy whatever and that's
a future for 10 minutes a really great solution for a scalability and of complex systems on the job of the concise and it's weird using its mass lightly and it's not that complex and you will see the remarks stylized as the concept of data flow and basically it's like
in all my thinking about the there is a sequence of and so you can imagine it as a a river that flows and you can further it's merging it's and you can combine these 2 rivers and you will get the reason you need and it's based on the remote server pardon so it's nothing new we use it every day and then forced the push
against the full concept because you don't ask and wait for of the of the data you just politely subscribe and react when the data are coming of the
observer but there is basically a nothing new we we use it every day is that going for added basically of common concepts you just observe something that can change and lower the time and you just react when the change happens on we
don't check I were made 11 time we just get the of the frication so they push the data to us from it's the same with those those prejudiced our example from we have these people polled cells and we update a few values and the pooled also updates because we expected because we're not updating the other cells manually every time we are not checking if everything is has changed from which as expected that the sum of the value updates and as a spreadsheets remaining example we have the concept of some everybody can observe and changing source and represent the data as random as he likes so and we we can have a pie chart sort of bar chart the we are observing the same amount of data and
representing it so it's time for but the pattern enforceable of the coupling stuff some Americans gel implants just
served by the itself and the handsome and basically the some the goes adds a few more methods we have 4 players that the observable that's that's the entity that changes or generates new new values new
items in this that of let's say that the generated in the active part that we have observed and subscriber there and they are the passage from our subscription point of view because they rely on subscribe
to that of the observable and reacts when the the the change uh um and basically we have the fancy 1 the subject that they can be at the same time all observable and observing its use of rule for instance to create some edge cases or additional custom even or a new version of the of the observable that you already have it's a really handy and the moment you can get the get it you you figure out what scenario you can you can exploit and use it on basically the observers and observable communicate by using tree methods but next on their at own complicated and really scared of this animation things I'm checking that uh at basically we have their own next method that is so far the when we go out and new them from the sequence of the on and basically that's the 1 that this kind of some form compliant with the the job server implementation new ones are on Arabic goes stuff can go salt and uncompleted because we want to get the mitigation when the sequence of the solar and we're not expecting any more them so this is the offences thing ever itself but it gets you the idea that stuff comes from the observable during time and every time you get new them you get it in Europe on next method and the use it so yeah pubs and
we are going to create them and this is the idea that sampled at that we're using to show off a few methods is a standard that the parts of the material leash it's using the recital of U. S and the least my installed apps nothing fancy 1st thing
1st we create the observable can you read it ceased yes please of some its own Popel sits the Boston purple because I want to show what a real example real leash so we can read the new forms standard native and we are returning unobservable all of the item that we expect then we used to create methods to create our routine and so we in this case we're fetching and install that's least and we create the of a loop over the least and at the moment we have a new object that we want to find a mate we call subscribers go on next in the moment that we don't have more guidance which us complete the sequence we're doing it in a for world you're not doing it enough for open but it's for the sake of the example as show how a normal routine can be converted in Rx jollity so you just a meter new item we did your next you cooled user all error at some point if you have some try catch something and that can get to explore the this is the
version without altering the lumber so you can appreciate the boiler break uh you can appreciate the few types some being more lines a so
that we can do we have created
our observable from scratch but yeah I already have my that that's the least so what the hell I already have the the sequence so somehow Melissa and observable but from we
present lists and we have an observable we can subscribe from I don't have a least I have 3 items and I want to make them mean our Rx each
from observable sequence how I do it I want just make them and the rest of several of the just so we have our least we're basically creating for the sake of the posts we are getting 3 elements 3 of them and we are are using just to admit them and we have an xj our sequence of what the fight won't unobservable that emit snapping completes normally empty what if I want unobservable that does not the name it's not being and never complete manner and some file on an observable that and not being area goes on error of chosen an exception you know conventions you expect that yeah we we're
we're discussing why and then new book the reason you know troll memory it's the best thing purpose you know I want to test this some time out goes off some points and 90 see you know I will need something that doesn't need and doesn't calls so memory could be useful for trolls what you can do whatever you want so we have a lot of the online so standard and stuff we have the 2nd view we are there that there we have a fancies professionally out of the rocket science and we have our observable from apps we subscribe and would provide an observer yes what what an
observer they whatever is a bit of boilerplate because we're not fully compliant through relatively
accessible to write on the for this but Pollock so that the observable new observer of that for he has 3 methods the the 1 on next we're getting into the act being fall we are adding get painful to get up there and we are updating the adaptive on complicated we stopped the refreshing progress but and we show tentacles message on their or something went wrong and we're stopping the progress bar and we are showing the posts so here is
a list of this OK yes what what's the point is just a new thing to learn and is showing up a list but life is
finding a so we're here we have our list we subscribe where the observer of everything is
fine we have the daring marketing guys picking and we go Treasury pressed we want only the apps that start with C we want to change as less as possible so we trust in Rx and we start finding out if you made those that are called filter basically we are using a bit already from that because we like the offense 0 and we're filtering filter just read on a Boolean just check condition and propagates to the observer only the the you only the items that you are fine with the condition the observer is always the same is not aware of anything is just still waiting for being for objects and displayed them
so we have a new filter collection with 1 line of code so all in
what if we want to just 3 elements from the sequence guess what state 3 which I
subscriber always the same take 3 what if
we won't last 3 of them out of gastritis but by the
best the yeah already skilled some data for the testing assigned if you will of something and it's more will be out there so it's the sum the research and take last
there's a bunch of filtering methods you could you could use skip skip 3 because you know that your 1st element of the set the sequence is some kind of check element it can happen you wouldn't ignore it and just say skip 1 or escape loss if you know that your sequence complete without a check daily or something you skip it so I have the we how can we be sure
that we are processing 1 element once this was 1 time the observer is in the doesn't know anything is just you know react so we don't know where the data are generated where and the data are emitted when the sequential completes we want something that filter out the doubly candidates for the example we don't have duplicates in our at least so we're creating new we're creating a fake for all duplicate sequences without axiological why not we take 3 we're pretty 3 now we have 9 elements events for the readers at this point we can find we can search a method that will get rid of the public gets this distinct this OK the observer is in this area is the the poor guy and that this is the board I don't have any it's it's basically civilian 1807 nothing here is just shut up there and display the thing I'm being raises but the I'm italian so I'm a lot of these things will work on some completed see
with because you know it's a from a logical point of view if I have to get rid of the blickets but and here's an idea comes in all ongoing sequence I am these
temperature sensor in this room that is meeting the current temperature orders of so I'm getting probably 25 hearable more it's hot for our American audiences 77 itself not halt like me but so it's a it's time the bending will every 2nd we're getting a new value and we're displaying the value on a small display but we are going cheap so we're kind of trying to save resources because you know on my everything is expensive and we don't want to all over refresh the display William 25 25 25 25 we need something that will filter out the duplicates but how it's an ongoing sequence this thing about these changed it will listen Mira observable and give you only the new value so all you will just wait for the new value and the moment it goes to 24 26 we fire all next to the fires so next time I don't know anything and so we can subscribe and we can update the display new now lasts less often just lists of where saving resources of some clues in it up a bit yet we're getting there 1 you every 2nd beauty the temperature will change so quickly all so we can you know change the somehow the emission rates there's simple simple creates a time window you can specify the amount and the unit time unit and it will animate the last item from the URI general subjects from image observer in that time window so you're getting only 1 item every 30 seconds then we go concatenated distinct thumping changed and we'll we will get probably you know 1 elements every 10 minutes because it's not changing but we have not stressing we've ever said on simple take the last trouble states the 1st because you know there's everything about external they you the 1st element of the window you use trouble 1st now what's
transforming we have our
fans cities it's OK could took 5 Orlando called and now we have the marketing guys so far they
decided that from a marketing point of view the least has to be changed some of our now from lower case names so all we don't want to change
so much gold we want to apply the function to every element emitted from the original observer we want to map they have to have a good concept so basically we take the element that is emitted from the observable when we Choate somehow and we the item to the observable sequence as while cold and we go all the new lowercase map is good because it's taking it at the info object but it could return everything so most of the time we're working well what we have 100 mobile because you know probably the back and is already there so we're not in charge 0 changing stuff and what if we just want the list of names we could use map to extract the name and so the that even for object we could return the string severable costs will which Ange we will both be observing a string sequence but still we were using overview you are our original object is actually is well what if we want a bit not just the bitmap we want observed we want to observe a bitmap sequence we take the same list we extract the bitmap from the object and we returned the bitmap and now we have an
observer that can you change it and use just the the bitmap police are
generalizable bond show transforming functions of some fat man it's the of the famous mark the famous 1 it's kind of tricky to move in the name get because it's like
map but it's returning unobservable basically if we start using of job or we can have a gap at some point that we have the of few methods that our small routine because they are testable and they returning on observables so holy chain some
unobservable in unobservable sequence we use flat map so basically when we're attaching flat map to our unobservable that we have we are passing the object it will work on the object process the object and retard unobservable some kind we are training observable that it's unbelievable for a
single task because we can't change as in classical stuff like that but that map as these educators and for instance it interleave the result because every observable cool run on different thread so oxygen just give users conquer map that solve the issue because there is a method for that trip there is an app for that's back in time and there was a there is a matter of 11 and some
transforming the easy 1 compressed gasses we have to for somehow cast every item we get from our list to our new type cast and the type of for some reason we need to observe from
a subset of all by them in form of list we use buffer a buffer mirrors the original observer and gives you back least all of this kind this example 3 at for instance you 3 applied through the of the
previous of the previous example so basically the sky's the limit combining can example we have our at least as an observable least and then we can read out reversed version how can we merge 2 observable that basically at a meeting the same kind of item at for we don't want to change the observer because because it is the poor guy so what we managing observable all my god marriage you know it's like Cobol that just use English as some we are creating a new observable merging 2 observable our observer is not changing and now we have 1 single emitting sequence and that's the 1 we are
introducing a new burglars in the love we have for 2 different observables it's our released and the 2nd 1 tick-tock it's a meeting along the every 2nd it's just a dynamic observable is for the post and and now we have a fancy update
died routine takes the number and create a new string with a number the name and the dark and not been for object how we call
online everything together we used z z it takes up to 9 observable and Mira them and pass the new below that lost unzipped emitted by them to go function so basically this is the fancy job 0 8 something syntax is comes with the river along the and some basically we have two observable a function that takes 2 element and return at the inn for object to the observer is always the same now and
wrote a subunits I believe that serves the poor post our release some fetches stuff from shared the preferences it's called be interesting yes it's Rx Geller yaks um works numerical could obviously are there because we are especially energies on maritime so it's there just for
the example everything is defined we're using jello we feel
very very very very very confortable with it and then we enable stick mode
2nd order just some throughout the disk read the violation basically we're doing stuff from the main thread we're reading from these condom interest and we are losing 200 53 milliseconds to read the least so that's the main problem you II thread this is the main threat is the right thing if you do stuff on the main thread used slow down the and initial step to stocks and stuff like that so we need some way to do the work away from the main thread we could use ink please leave the room we're using our next job because there is a method for that we have scandalous we don't do multithreading manually come on real data sets in Gaza strip it's no it's not 1995 so we have there's an Alexander gives you scare there's this case scandalous ideal it's based on a pool of so netflix and of the things that I don't care about the job you know them and basically the thread pool increase the size decreases the size every time we need to do something that is ideal related really from network from a database or from the B score or whatever we can use a scandal adult by your we subscribe on the scale the so we asked to jollity do from the routine the staffing get the absolutist on a different track that is supposed to be the ideal trade-offs scared of we had that we're on the other hand the crashes obviously all the original thread that created view hierarchy can touch it to you because it's 108 back again to 100 we're doing suffer different
and we're trying to from update the recital view from a try that is not the UI thread so all you know
it's kind that getting 3 3 key because we have to do the job on 1 triads somehow come back with the result on another thread that is due I all my god probably D N Sync task is the answer and not because we have observer on because there is a measure of the fidelity so tends to 0 extent we have a schedule of specific for and that let us get the result on the main threat so basically line where fetching and stuff from the from the disk using got a different thread but when the baby that coming we will indeed on the main thread because we're aware updating the UI that's the base OK read from here
using this thread and when you have the data on here on the main thread and waiting politely this is done from pointless 1 but the service what we
could generating any observable that's before meeting some something something to just that has fueled nonsense thinks just waste time we are on the main thing so we go the fancy dialog
and there we are if we are lucky we got the dialog if we have like he the system is complaining about where you're keeping frames that well there was no tomorrow because we have blocking the your domain but it's not by you wise thing so you won't scare the you hire you uh I old once served the purpose so here
we understand so if you have to do some computational things we have competition skeleton if you want to execute something now we have the mediator scatter all we have new threads scheda because you just want a new dress so scattered as the competition on the scatterers about new track scare there's about trampoline if you want something to Q on the current thread could be used full there is a method for everybody so really work
that are using a lateral I'm lying I like the arrow I don't care about the mess it does with the a bite called I like less border break I I'm using dynamic huge application in production for a huge sports event it's 14 I don't care about how they do stuff I have a daily job I need to be on the on the spot I don't care about that I am using but the knife because I really I I hate the find you by I can send it and I'm using long I don't care I call it does
stuff because I'm told to create manually get the sense that there's come on it and toward using rather free to because it's the only way we can probably be communicated with a REST API
tank you guys that square LSO so people will never buy you some time using universally major
because it works says the bubbles you can use because so you can use the phrase go you know it's just major loading application and this is the obligation it's kind of amazing at the end of them least viewers eigenvalue whatever we are fetching data from stack we're displaying the pictured name repetition number of CD and we are fetching the forecasts from open whether my baby I and then we a of attaching a listener if the user tap 1 the them if the stack for users of a web page opens the profile or it opens the government StackOverflow profile so we
have a threat of it as a sum brilliant implementation they just map the REST API to the to watch our interface you basically but that's it so the support that x joule called box because there's much people I mean what white wine of that and so we are passing the from where mapping of response to a gel object i'm tool for creating the objects mentally so we are are using adjacent schema because you know I have I have not so much time know and and that's it so we go to our API manager for 2nd change we created so that the minimum thing for a rate of it rests about there we buy and the the the the service the interface we we have and then we provide them and get most popular s or users him right there remains in that the the 1st thing all documentation is metabolized by some basic idea we are wrapping that we're wrapping the some DAPI because we want to kind of some shielded and most will be goes we are getting a response that it's not perfectly fitting our needs weird using a list of users and so basically we're getting the staff we our mapping the observable so we are extracting the use of these we are working on a scale aerial and we're getting back the wrong result on the main these OK it selected it is found
that they get it although the blood pressure just want to point out that it's a normal or a set view about the events white and we
have the refresh least method basically we are from getting a bit about the API manager somehow use data to we are getting the users we stop the progress by we update get up after or if something goes wrong we use just bring the message and we stop the further progress by about
now the weather's being the same
as those decorous saying we create the manager because you know stuff it's more organized don't create a single long like that used the idea is just for the purpose of the
presentation of some we have the get forecast by CT metal that that basically right a rock the API users get aerial
because it's a metal called and we get the stuff on the main thread so we update our adapted for every user we proved in the
least we queried the known the forecast services we filter for knowledge could happen actually happened are we felt that a game we don't need to know where if the size is there is no no it's as to be greater than 1 we could use 1 line but it's you know and then we conquer a new observable because because we are reactive so we're fetching that for us that the you know the bit-mapped using the unobservable mental that takes a stream and give it gives back up a bit map we want to train everything together so we flat maps we make sure that we are working on the scale we we get the stuff on the UI thread because we are changing the view we get the icon we said the something goes wrong with logic and
we haven't had sex and
words but that's how we can attach a listeners through of you with observable but clicks it's usable for the moment we have the um profile we over the profile of the moment we have those of you out there was nothing yes we open the Stack Exchange seeing so
basically it's was a short presentation sorry we have up now
amount of methods that it splits unbelievable there's a method for everything sold a I could talk probably for 2
days you would you would kill me at the end but that that that thing is that that's just gives you the opportunity to create
your own over so it it really could be endless there's an operator for everything that the mines which is that you have to think do observables events like wall there like a reverse you can create you filter area you can just for
money that you can combine to reverse in the 1 headed still flow in the and it will be the reader you want it to to be be water thank you very much future


  752 ms - page object


AV-Portal 3.21.3 (19e43a18c8aa08bcbdf3e35b975c18acb737c630)