SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
ELM
OR HOW I LEARNED TO FRONT-END
DEVELOPMENT
WHO AM I?
/@marcoshuttle m.perone@mvlabs.it
PHP developer in my daily life
grew up as a mathematician
weakness for functional programming
DISCLAIMER
I'm not an expert
Just loving ELM and wanting to share it
WHO ARE YOU?
Front end developers?
Functional programmers?
Both?
Tried ELM?
Running ELM in production?
WHAT IS ELM?
Statically typed reactive functional programming in the
browser
RUNS IN THE BROWSER
Compiles to Html, Javascript and Css
elm make Main.elm
STATIC TYPING
Type of a variable is known at compile time
Errors catched at compile time
NO RUNTIME EXCEPTIONS!!
Enforced semantic versioning
Hot-swapping
FUNCTIONAL PROGRAMMING
Making inputs and outputs explicit
WE HAVE A LITTLE PROBLEM...
If functions are stateless and variables are immutable,
how can we interact with the real world?
Possible solutions:
Relax requirements
Play with function composition (monads)
Or ...
FUNCTIONAL REACTIVE
PROGRAMMING
Program paradigm oriented around data flows and the
propagation of change
Time as first order citizen
Dynamic evolving values
Specify the dynamic behavior completely at the time of
declaration
SIGNALS
Similar to EventEmitters or Observables in Javascript
They exist for the entire lifetime of the program
They always have an initial value
EXAMPLES OF SIGNALS
main = 
 
  Signal.map show Mouse.position
(0,0)
EXAMPLES OF SIGNALS
main = 
 
  Signal.map display Keyboard.presses 
 
 
 
display keyCode = 
 
  show ( Char.fromCode keyCode )
'0'
SIGNALS IN ELM
Only "real" signals
Not possible to create or destroy a signal, not to use
signals of signals
Signals are connected setting up a static processing
network
SIGNAL GRAPH
INPUT
Signals from the world
We are not in control of changing the value, the value
is changing everything else
TRANSFORMATIONS
map : ( a ­> b ) ­> Signal a ­> Signal b
Keyboard.presses : Signal KeyCode
keyboardChar: Signal Char
0
Signal.map Char.fromCode
'0'
STATE
foldp : ( a ­> b ­> b ) ­> b ­> Signal a 
 
  ­> Signal b
Application state all in one place
Save and undo become easy
STATE
Mouse.clicks : Signal ()
counter : Signal Int
()
foldp (_ n -> n + 1) 0 Mouse.clicks
0
MERGE
merge : Signal a ­> Signal a ­> Signal b
MERGE
clicks : Signal Action
presses : Signal Action
ticks : Signal Action
clickPressTick : Signal Action
Click
Press
Tick
mergeMany [ clicks, presses, ticks ]
Tick
ELM ARCHITECTURE
Simple pattern for infinitely nestable components
Great for modularity, code reuse and testing
MODULARITY
Hide implementation details
Expose just what you need
EXTENSIBILITY
Ability to combine modules one with the other
ELM ARCHITECTURE PILLARS
Model
View
Update
OUR APPLICATION
MODEL
Data structure representing the state of the
component
Single source of truth
MODEL
type alias Talk = 
 
  { title : String 
 
  , description : String 
 
  , speaker : String 
 
  }
VIEW
view : Model ­> Html
No mutation of the DOM
VIEW
view : Talk ­> Html 
 
view talk = 
 
  div [ class "talk" ] 
 
    [ div [] [ text ( talk.title ++ 
 
      " by " ++ talk.speaker )] 
 
    , div [] [ text talk.description ] 
 
    ]
by
Marco Perone
Front-end development is rapidly evolving, with new
frameworks coming and going at a crazy pace. Among
the many options, Elm stands out as one of the most
original and promising approaches: it combines the
principles of reactive programming with the elegance of
strongly typed functional programming, yet providing a
seamless integration with javascript code. In this talk ...
Elm or how I learned to love front-end development
UPDATE
update : Action ­> Model ­> Model
Clear representation of how the model can be
transformed
type Action 
 
  = ClickTitle 
 
  | ClickDescription 
 
 
update : Action ­> Talk ­> Talk 
 
update action talk = 
 
  case action of 
 
    ClickDescription ­> 
 
      { talk | description = 
 
        "We got a new description!" }
ACTIONS IN ACTION
Elm or how I learned to love front-end development by
Marco Perone
Front-end development is rapidly evolving, with new
frameworks coming and going at a crazy pace. Among
the many options, Elm stands out as one of the most
original and promising approaches: it combines the
principles of reactive programming with the elegance of
strongly typed functional programming, yet providing a
seamless integration with javascript code. In this talk ...
ALL TOGETHER
from
to
LET'S HAVE ANOTHER ROUND
PORTS
Mechanism for sending messages in and out of ELM
INCOMING PORTS
Passing messages from Javascript to ELM
port addTalk : Signal ( 
 
  Title, Description, Author )
myApp.ports.addTalk.send([ 
 
  "ELM or how I learned to love ...", 
 
  "Front­end development is rapidly ...", 
 
  "Marco Perone" 
 
]);
OUTGOING PORTS
Passing messages from ELM to JavaScript
port requestTalks : Signal EventName 
 
port requestTalks = signalOfEventName
myApp.ports.requestTalks.subscribe( 
 
  retrieveTalks); 
 
 
function retrieveTalks (eventName) { 
 
  ... 
 
}
TASKS
Abstraction to model side-effects handled by the
runtime
Way to describe asynchronous operations that may fail
TASKS LIFECYCLE
Tasks describe operations that could be performed in
the future
To perform a task we hand it to a port
TASKS
retrieveTalks : String  
 
  ­> Task Http.Error Action 
 
retrieveTalks uri = 
 
  get decoder uri 
 
  |> Task.map TalksRetrieved
MAILBOXES
type alias Mailbox a = 
 
  { address : Address a 
 
  , signal : Signal a 
 
  } 
 
 
mailbox : a ­> Mailbox a
TASKS LIFECYCLE WITH
MAILBOXES
ELM ARCHITECTURE AND
TASKS
Asynchronous operations modelled with Effects Action
End result of execution is an Action that will be routed
through the update function
ELM ARCHITECTURE AND
TASKS
Model is replaced by ( Model, Effects Action )
update : Action ­> Model 
 
  ­> ( Model, Effects Action )
type Action 
 
  = ConfRetrieved ( Maybe Conferences ) 
 
  | RetrieveTalks 
 
 
 
update action joindin = 
 
  case action of 
 
    ConfRetrieved maybeConf ­> 
 
      ( addConferences joindin maybeConf 
 
      , task ( succeed RetrieveTalks ) 
 
      )
The slides archive
Did you miss a conference? Here you will find all the latest slides uploaded on Joind.in by the most amazing speakers in the wild!
Gainesville Barcamp 2016
Building Creative Communities by Bernie Marger, Takashi Wickes, Matt O'Hagan
Info Tech Room It's not easy to build a maker culture from scratch. It takes dedication to those you are serving, passion for innovation, and intense personal
sacrifice. You have to lead by example, create spaces in which your community can thrive, and ensure that the community you build lasts long after you're
gone. Join the organizers of the two largest student­run hackathons in the state of Florida as they share stories, personal inspirations, and essential tips
centered around building creative communities. Freestyle rap battles may replace the Q
Go get the slides
BSidesSLC
How to Build an Effective Information Security Risk Management Program by Kiston Finney
This session will focus on the elements of an effective information security risk management program, including how to select a framework for assessing
risk and tailor it to your organization's culture, the difference between inherent and residual risk and why reporting on both is critical, common mistakes
information security personnel make while trying to get a new risk management program off of the ground, how to set expectations with leadership, and
how to partner with governance, compliance, and legal teams in your organization to garner true top­down support.
Go get the slides
This page is realized using the data exposed by the Joind.in API's.
CREDITS
https://github.com/yang-wei/elmflux
RESOURCES
elm-lang.org
github.com/evancz/elm-architecture-tutorial
www.elm-tutorial.org
www.elmcast.io
www.elmweekly.nl
www.elmbark.com
THANKS!
SPEAKERS FEEDBACK!
/@marcoshuttle m.perone@mvlabs.it

Más contenido relacionado

Similar a Elm or how I learned to love front-end development

Similar a Elm or how I learned to love front-end development (20)

Model-driven Development of Model Transformations
Model-driven Development of Model TransformationsModel-driven Development of Model Transformations
Model-driven Development of Model Transformations
 
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling FrameworkEclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
 
Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011
 
JavaScript Modelling Framwork : MDE
JavaScript Modelling Framwork : MDE JavaScript Modelling Framwork : MDE
JavaScript Modelling Framwork : MDE
 
Pharo: A Reflective System
Pharo: A Reflective SystemPharo: A Reflective System
Pharo: A Reflective System
 
Evolve Your Code
Evolve Your CodeEvolve Your Code
Evolve Your Code
 
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
 
Envisioning the Future of Language Workbenches
Envisioning the Future of Language WorkbenchesEnvisioning the Future of Language Workbenches
Envisioning the Future of Language Workbenches
 
Why functional programming in C# & F#
Why functional programming in C# & F#Why functional programming in C# & F#
Why functional programming in C# & F#
 
Functional programming in TypeScript
Functional programming in TypeScriptFunctional programming in TypeScript
Functional programming in TypeScript
 
Epsilon
EpsilonEpsilon
Epsilon
 
The future of DSLs - functions and formal methods
The future of DSLs - functions and formal methodsThe future of DSLs - functions and formal methods
The future of DSLs - functions and formal methods
 
Dita for the web: Make Adaptive Content Simple for Writers and Developer
Dita for the web: Make Adaptive Content Simple for Writers and DeveloperDita for the web: Make Adaptive Content Simple for Writers and Developer
Dita for the web: Make Adaptive Content Simple for Writers and Developer
 
ALT
ALTALT
ALT
 
The Economics of OptimJ
The Economics of OptimJThe Economics of OptimJ
The Economics of OptimJ
 
Not quite-ignite 27 nov14
Not quite-ignite 27 nov14Not quite-ignite 27 nov14
Not quite-ignite 27 nov14
 
Unit 1
Unit 1Unit 1
Unit 1
 
JAVA
JAVAJAVA
JAVA
 
Pharo: A Reflective System
Pharo: A Reflective SystemPharo: A Reflective System
Pharo: A Reflective System
 
Functional programming is the most extreme programming
Functional programming is the most extreme programmingFunctional programming is the most extreme programming
Functional programming is the most extreme programming
 

Más de Codemotion

Más de Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

Último

一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
pxcywzqs
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
ydyuyu
 
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
ayvbos
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
ydyuyu
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Monica Sydney
 
一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理
F
 

Último (20)

20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf
 
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime NagercoilNagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
 
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
 
APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...
APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...
APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...
 
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac RoomVip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
 
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime BalliaBallia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
 
Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...
Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...
Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...
 
Call girls Service in Ajman 0505086370 Ajman call girls
Call girls Service in Ajman 0505086370 Ajman call girlsCall girls Service in Ajman 0505086370 Ajman call girls
Call girls Service in Ajman 0505086370 Ajman call girls
 
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
 
Best SEO Services Company in Dallas | Best SEO Agency Dallas
Best SEO Services Company in Dallas | Best SEO Agency DallasBest SEO Services Company in Dallas | Best SEO Agency Dallas
Best SEO Services Company in Dallas | Best SEO Agency Dallas
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
 
Meaning of On page SEO & its process in detail.
Meaning of On page SEO & its process in detail.Meaning of On page SEO & its process in detail.
Meaning of On page SEO & its process in detail.
 
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
 
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
 
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
 
Local Call Girls in Seoni 9332606886 HOT & SEXY Models beautiful and charmin...
Local Call Girls in Seoni  9332606886 HOT & SEXY Models beautiful and charmin...Local Call Girls in Seoni  9332606886 HOT & SEXY Models beautiful and charmin...
Local Call Girls in Seoni 9332606886 HOT & SEXY Models beautiful and charmin...
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
 
一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理
 

Elm or how I learned to love front-end development