text:
101 Dalmatians Wiki
101 Dalmatians: The Series
101 Dalmatians II: Patch's London Adventure
Anita Radcliffe
List of 101 Dalmatians: The Series Episodes
Lucky/Gallery
Dalmatian Vacation
Canon characters
P.H. de Vil
Cecil B. de Vil
Home is Where the Bark Is
On the Lamb
Love 'Em and Flea 'Em
Alive N' Chicken
Prima Doggy
Market Mayhem
in: Villains, Characters, De Vil family,
Animated Characters
Series Characters
Live-Action Characters
Video Game Characters
Novel Characters
House Of Mouse
102D;PTTR
DVC
The Hundred and One Dalmatians
101 Dalmatians (1996 film)
101 Dalmatians: Escape From DeVil Manor
102 Dalmatians: Puppies To The Rescue
101 Dalmatians: The Musical
Electric Holiday
Sorcerers of the Magic Kingdom
101 Dalmatian Street
Voice Actor(s)
Betty Lou Gerson (Original film)
Susanne Blakeslee (Sequel and 102 Dalmatians: Puppies To The Rescue)
April Winchell (Series and 101 Dalmatians: Escape From DeVil Manor)
Tress MacNeille (Series; "Close But No Cigar" and "The Fungus Among Us" only)
Glenn Close (Live-action films)
Sara Gettelfinger (Musical)
Victoria Smurfit (Once Upon a Time)
Milli Wilkinson (Young Cruella, in Once Upon a Time)
Wendy Raquel Robinson (Descendants)
Malevola de Vil (mother, in 101 Dalmatians: The Series)
Ivy de Vil (niece)
Coup de Vil (uncle)
Cecil B. de Vil (brother)
P.H. de Vil (cousin)
Mr. (Harry) de Vil (husband, in novel and musical)
Mr. Feinberg (husband, in Once Upon a Time)
Madeline de Vil (mother, in Once Upon a Time)
Carlos de Vil (son, in Descendants)
Dementia de Vil (mother, in "The Villain Files")
Coup de Vil (uncle, in "The Villain Files")
Hunter de Vil (great-nephew)
Cruella de Vil is the main antagonist of the 101 Dalmatians franchise and Anita's former boss. She constantly schemes to steal the Dearly Farm or get richer. In 101 Dalmatians: The Series, she lives next door to Roger and Anita in Villa De Vil. Like her character played by Glenn Close in the 1996 live-action film, she is also the owner of the House of DeVil, a fashion house where Anita works. Cruella is Anita's former schoolmate. As a couple of running gags throughout the series, she reminds herself of random things by making memos to herself via a tape recorder, and always calls Roger other names that start with an "R".
1 Dodie Smith Novel
2 Animated Movies
3 Live-Action Movies
3.1 101 Dalmatians
4 101 Dalmatians: The Series
5 Musical Incarnation
6 House of Mouse
7 Once Upon a Time
8 Descendants
9 Cruella (live-action film)
10 Kingdom Keepers
11 Video Games
11.1 101 Dalmatians: Animated Storybook
11.2 Escape from DeVil Manor
11.3 102 Dalmatians: Puppies To The Rescue
11.4 Disney Villains Challenge
11.5 Disney INFINITY
11.6 Disney Universe
12 Disney Parks
12.1 Sorcerers of the Magic Kingdom
12.2 Fantasmic!
12.3 Disney Villains Mix and Mingle
12.4 Disney's Maleficious Halloween Party
13 Disney Cruise Line
13.1 Villains Tonight
13.2 Midship Detective Agency
15 Homages
Dodie Smith Novel
Cruella as she appears in the novel
In the original story, Cruella is a pampered London heiress who knows the owner of the Dalmatian puppies through school. Her net wealth as mentioned in The Hundred and One Dalmatians is 6 million pounds. She was a notorious student with black and white plaits. She was later expelled for drinking ink. Now she is the last of her prosperous and notorious family and married to a furrier who supplies her obsession, such as the one-piece she is never seen without; a white mink cloak. With this, she wears skin-tight satin gowns and ropes of jewels in contrasting colors, such as an emerald color dress with ropes of rubies. Her chauffeur-driven car is black-and-white striped (Mr. Dearly comments that it looks like "a moving zebra crossing") and has the loudest horn in London, which she insists on displaying to the Dearly family. Such dramatic luxuries were said to be based on Tallulah Bankhead's lavish spending habits, which the producers of the film first read about in a newspaper. When she has guests for dinner, all of Cruella's food is strange colors and tastes of black pepper (alluding to her quick temper). She constantly stokes a roaring fire and complains of being cold despite the elevated temperature. The flat is portrayed as a sort of luxurious version of hell and sets up Cruella's "devilish" persona for her later crimes. Her guests also meet her abused white Persian cat, which plays a key role in a later part of the story.
When invited to a dinner party held by the Dearly couple, Cruella expresses her sinister interest in the Dalmatians, remarking how she and her henpecked husband have never thought of making clothing from dog pelt before. Yet seeing the spotless skins of the newborn puppies she is revolted and offers to have them drowned at once; her way of getting rid of animals which she views as worthless, including her own cat's kittens. Upon a second visit to the house, she picks up the mature puppies and treats them like clothing to be worn.
Cruella makes a brief appearance, albeit asleep, in Dodie Smith's sequel The Starlight Barking.
Cruella as she appears in the animated films
Disney's animated version of Cruella first appeared in 1961's One Hundred and One Dalmatians, in which she was voiced by Betty Lou Gerson and animated by Marc Davis who together crafted her into an iconic and memorable character. The cool detachment of the original character was replaced by a crazed mania, in which Cruella only barely clung to a sheen of glamour. Anita comments Cruella's above mentioned fur coat is new when Cruella first appears. For unexplained reasons, Cruella's cat and husband were omitted from the Disney version. Cruella drives a very distinctive Zimmer-like automobile, colored red and black.
The film featured a Cruella de Vil song, written by Mel Leven, using her name as the title, sung by the dalmatians' owner Roger (Bill Lee), who holds the woman in contempt. The lyric begins with: "Cruella De Vil, Cruella De Vil. If she doesn't scare you, no evil thing will..."
Disney considered reusing Cruella as the main antagonist of The Rescuers, but decided against it because they did not want to make it a sequel to an otherwise unrelated film. Cruella returned in 101 Dalmatians II: Patch's London Adventure as the main antagonist, where she was voiced by Susanne Blakeslee.
In the sequel, Cruella has been let out of jail, but the rules of her probation state she is no longer allowed to buy any more furs and there is a restraining order against her and the Radcliff's. When trying to find what she has left to live for she meets an undiscovered artist called Lars, whom paints Spots. She has Lars paint many, many spotted paintings before figuring that the paint isn't good enough. She pays for Horace and Jasper's bail from prison and after stealing a Kanine Krunchies Van, has the Badduns steal the Dalmatian Puppies again, asking Lars to make a canvas with the puppies, Lars refuses, resulting in Cruella to tieing him up.
When the Dalmatians escape, she chases them through London, before cornering them in an Alleyway, Thunderbolt distracts them long enough for Patch to start the London Bus, the Dalmatians were in, to chase them into the Thames. She is later dragged away, seeming to have gone insane and is sent to a Mental Institute.
Blakeslee also voiced Cruella in Disney's House of Mouse, which featured a running gag in which she inspects dogs from other Disney films with a measuring ruler. Cruella is also one of the Disney Villains Mickey fights in Disney's Hollywood Studios version of Fantasmic! Nighttime Show Spectacular in Walt Disney World. In Disney On Ice play 'Celebrations', Cruella was one of the Villains who appears during the Halloween Party. In the Disney Cruise Stage Show; 'Villains Tonight' Cruella appears in a hip hop version of her theme displaying a fashion show, she later hosts the party the same evening.
Live-Action Movies
Cruella as she appears in the live-action films
Cruella de Vil is the main antagonist of 101 Dalmatians and 102 Dalmatians.
Cruella is the head of the London fashion house called House of De Vil. Anita Dearly is one of Cruella's employees and hinted to be her best fashion designer. Cruella first took interest in the Dalmatian puppies when Anita drew spots on one of the designs. Cruella has another henchman, named Mr. Skinner, a taxidermist. She hires him to kill and skin the puppies for the designs. Cruella sent her henchmen to capture the puppies, but they fail thanks to the intervention of the farm animals. Cruella herself then went after the puppies after her henchmen were defeated, and located the puppies to the farm. She tried to kill them but fell victim to the farm animals, who managed to trick and outwit her and defeated her by knocking her into mud. Cruella was later arrested for her crimes along with her henchmen.
Cruella has seemingly been released of her obsession of furs and now loves puppies and has decided to get rid of her fashion house because the clothes are made out of fur. While visiting Chloe Simon, one of the puppies nearly falls out the window and while Chloe and the other puppies try to rescue her, Cruella hears the chimes of Big Ben and she reverts back to her original obsession with spots, seeing black spots everywhere and she now wants 102 Dalmatian puppies for her designs. She enlists the help of another fashion designer named Jean-Pierre Le Pelt and an unwilling butler named Alonzo. She frames the owner of the animal shelter Kevin Shepherd for kidnapping the puppies and he is arrested. He escapes from jail and tries to help Chloe rescue the puppies, but they are trapped by Cruella. The puppies escape and Cruella tries to capture them and at the same time, Alonzo, fed up with Cruella's abuse of him, defeats Jean-Pierre Le Pelt and frees Chloe and Kevin while Cruella is defeated by getting baked in a cake. The police come and arrest her and Le Pelt.
Cruella in The Series
In 101 Dalmatians: The Series, Cruella was voiced by April Winchell and was based on Glenn Close's portrayal from the live-action film, but with Betty Lou Gerson's design from the animated film. She is not seen wearing clothes made out of animals, nor smoked (although in the episode "Smoke Detectors" she did) and is totally sane. Her villainous plot in the show was to steal the Dearlys' farm from them, and using the puppies as a ransom, mainly because Widow Smedly would not sell it to her and that her mother Malevola demands it. She is an archetypal corporate villain who will seize on any scheme to make money, including drilling oil from the swamp near Dearly farm (thereby polluting it), buying Kanine Krunchies and replacing the nutritious ingredients with sawdust and chalk or sending Jasper and Horace to drive out the owners of Mom and Pop's Grocery Store so she can buy it herself.
In "A Christmas Cruella", it is revealed that ever since Cruella was a child, she wanted a Dalmatian for Christmas, but her parents would always go on vacations and leave her with a foreign nanny. Cruella's parents refused to give her a Dalmatian and gave her clothes for Christmas every year. During her teens, was the final straw which gave her her half white hairline in her fury (earlier, she is seen with all black hair and a slight gray-ish streak). Her miserable childhood is what drove her to evil. Deep down Cruella is lonely. All she really wants is a Dalmatian to love.
The series is also the first time Cruella uses seduction as one of her plans. In the series finale, she uses an inflatable body suit to disguise herself as a sexy blonde bikini surfer to seduce Roger to make Anita think he is cheating her so they will split up and she can get the farm. When Anita goes swimming, she makes her move on him. She asks him to go swimming with her and then tries to kiss him, but her suit is deflated by Spot, and she turns into a surfboard.
She has often gotten into romantic affairs in the series too. In "Shipwrecked", she tries to swoon with Starbuck, Captain Ahab's first mate, In "Cupid Pups", Cruella joined the tally-ho fox hunting club to seduce and wed herself to Baron von Schnickerdoodle. In "Valentine Daze", Cruella accidentally receives Roger's valentine to Anita and thinks it's for her.
When Roger and Anita legally get married, Ahab, Starbuck, the Baron, Ralphie St. Lowrent, the leader of a biker gang, a sheriff, Swamp Rat, and an alien cult claim they want to marry her. Surprised by this display of affection, Cruella allows Roger and Anita to wed and keep the farm.
Musical Incarnation
Cruella also appears as the primary antagonist in the Broadway musical based on the novel. The character was portrayed by Rachel York; however, the actress announced on her blog that she had stepped down from the role of Cruella de Vil to pursue other projects. The role has been taken over by Sara Gettelfinger.
In the series House of Mouse, Cruella appears as a recurring character. In the series, Cruella usually measures and examines other dogs from other Disney films, and also threatens Pluto in the first episode.
Goofy: "Here's your doggy bag, Ms. De Vil."
Cruella: "Forget the bag." (gestures to Pluto) "I'll take the doggy!" (laughs fiendishly)
Also in the first episode, when Pete attempted to escape Mickey and friends after his villainy was exposed, he disguised himself as a Dalmatian but ran away in fear after Cruella began to measure him with a wicked grin. In the episode "House of Crime", Cruella was accused of kidnapping the puppies. She replies by shouting, "You make one movie, and you're labeled for life!"
In "Max's Embarrassing Date", Cruella appears to be on a date with the Beast, but asks if he comes in a medium size. When Goofy accidentally causes soup to spill on the Beast, Cruella concerns that she will now have to get him dry-cleaned.
In "Max's New Car", when Max is being taken on a wild ride along Main Street in the car from "Mickey's New Car", they almost collide with Cruella and her car, leading her to criticize Max's driving. She is later shown being given a speeding ticket as part of a commercial for "Supercalifragilisticexpial-Insurance".
In "Clarabelle's Christmas List", when Mickey asks Cruella if she has been naughty or nice, Cruella insists she has been divine, though the Dalmatians' barking claim otherwise.
Cruella also appears as one of the main villains in the film Mickey's House of Villains where she, Jafar, Hades, Ursula and Captain Hook take over the House of Mouse. Out of the main villains, Cruella was the first to note her interest in taking over the club for her own purposes.
In "Pluto Saves the Day", when Pluto and his all dog band performed, Cruella eagerly mumbled to herself, "Ooh, where's my tailor when I need him?!"
Cruella in Once Upon a Time
Cruella is a character that appears in the fourth season ABC's Once Upon a Time, portrayed by Victoria Smurfit.
Her appearance is based more on how she appears in the animated 101 Dalmatians.
In this continuity, she has magical abilities given to her by the author, which allow her to take control of animals by simply breathing some green smoke to them (similar to her cigarette smoke in the animated 101 Dalmatians). This magic can also affect those who can transform into animals, as Cruella was able to provoke Malificent into changing in to a dragon, before using her magic to put her in a sleep. She first appears in the episode "Heroes and Villains" in which she teams up with Maleficent and Ursula to obtain a magic gauntlet from Rumplestiltskin, claiming that it shall show them the weaknesses of their enemies. She initially captures Belle by using her powers on a Dalmatian puppy who leads Belle into the Queens of Evil's trap. She seems to have some awareness that it's the heroes that win in the stories, and she hopes to make it so that the villains win. Cruella does offer Rumple to join forces with them, but he claims he always wins. Some months later, Rumple returns after Belle makes him powerless, and he agrees to join the Queens of Darkness.
She initially meets Malificient and Ursula, when the three arrive in the Dark Fortress, at Rumple's invitation. Together the four head to Bald Mountain, where she uses her powers to make a horde of creatures that block their path to the mountain. Eventually, Rumple reveals that he only used the three and Chernabog attacks them; however, the Queens of Evil make their escape.
In the real world, she is married and has the marriage name Feinberg, living in a mansion in Great Neck, Long Island. When Rumple and Ursula come looking for her, her husband seems to have been arrested by the FBI and some of her possessions are being claimed. She is able to get her fur (claiming it was hers) before she marries Feinberg.
Rumple informs her of a being called "The Author" who can allow them to gain their victories. They drive in Cruella's car to the border of the town, where there is a magical barrier that prevents any non-magic beings from finding it. Cruella and Ursula trick the heroes in to thinking they wish to join the good side, and prove this by helping them combat Chernabog. Once they are allowed in to Storybrooke, later showing the spell that allows them to enter to Rumple.
Together, she and Ursula resurrect Maleficent, and it shows that before the curse, she and Ursula were supposed to protect an egg, to contain Lilly, Maleficent's daughter. Snow White and Prince Charming attempt to fuse darkness into Lilly's egg to make sure their own child doesn't become evil. However, in Cruella and Ursala's attempts to protect the egg, they and the egg are sucked through a portal to the modern world. Cruella, however, tells Maleficent that Lilly was klled, and when confronted on this, she retorts, "[She's] a terrible person!" She then claims they use the dragon egg to absorb its magic and keep them youthful, which provokes Maleficent into turning into a dragon before Cruella puts her in a deep sleep.
Her backstory is shown in the episode "Sympathy for the De Vil", in which we learn that Cruella has been evil, since her youth, having poisoned her father, and also killing her other stepfathers. Because of this, Cruella's mother (Madeline in this continuity) locks her up in the attic, using her Dalmatians to protect others from Cruella.
Sometime later, Isaac, the author, arrives and helps Cruella before she tricks him in to thinking that Madeline is the guilty one, and the two plan to elope together after Isaac gives Cruella the power to control animals. However, Cruella uses this power to have Madeline's Dalmatians attack her before making a coat from those Dalmatians.
Isaac learns that Cruella was using him and writes about it so Cruella shall be incapable of killing again. When Cruella tries to stop him, the ink spills onto Cruella, changing her hair from blond to the signature two-tone look.
In "Storybrooke", Cruella uses her animal control on Pongo, and uses it to abduct Henry in order to bribe Emma and Regin to kill the author for Henry. Cruella is confronted and Emma uses her powers to knock Cruella off a cliff. Pongo returns to normal once this happens.
In "Labor of Love", Henry finds Cruella in the underworld recreation of the Storybrooke Town Hall. She explains that since Henry is now the author, he could bring her back to life. She also explains that if Henry brings her back to life, it will be as though she was never killed, hence Emma's soul shall be pure again. When Robin asks Henry if he found anything in the town hall, he bluffs about seeing anything or anyone.
In "Devil's Due", Regina finds Cruella in the underworld's version of the cafe and asks her for the location of a cemetary. Cruella questions why Regina doesn't use her magic, and notes that magic doesn't work as well in the underworld. Cruella explains that she is now the mayor of what Regina dubs "Under Brooke" (the underworld version of Storybrooke), and shows her a list of cemetary places and how to interprete the head stones. In the meeting, she wears a doe fur, claiming that "[She's] not saying it's Bambi's mother...but [she's] not saying it's not [either]."
In "The Brothers Jones", she searches with Henry for the quill, which can bring her and Emma back to life. While Henry is able to find the apprentice, Cruella doesn't. Later, when David (Prince Charming) looks around a mansion, Cruella is there with champagne, suggesting that she has started dating his brother, James. She starts flirting with David, acting as though she thinks he's James, before admitting that she knew all the time that it was David. She then explains about the anger that James has towards David for being the one their mother chose to be raised by the royal family.
In "Ruby Slippers", David, Hook and Henry find that Cruella is having her men wreck the phone booth, which allows those in the Underbrooke to contact the world of the living. Henry figures it's because he will not write Cruella to life, but Cruella claims it's because Hades has ordered her to do so as a means to wreck the hope of those in the Underbrooke. Cruella tries to make a deal that if she allows David to make a call, he will have Cruella be written to life, but David refuses the deal and she has her men trash the phone booth.
In "Sisters", Cruella is able to capture Emma, Robin Hood and his daughter by having James pretend to be David and lure them into the forest, though Cruella does complain that everything is always in the forest with them. Cruella then proceeds to slap Emma (getting her back for killing her) and explains her plan. Since Henry will not write Cruella out of Underbrooke, she plans to bargain with Hades, using the child of the Zelena (the woman Hades loves) as leverage.
Cruella and James take the three to the harbour to kill Emma and Robin. Emma notes that killing them will not help Cruella escape Underbrooke, but Cruella claims that it's so she can send Emma to eternal torment. As they are about to kill the two, David arrives and rescues them. Cruella tries to grab the gun, but Hook takes it before she can. Cruella hides as James and David battle, but she suggests that James use a knife he has on him. However, James continues to battle and is thrown into the River of Souls. Cruella then flees the scene.
In "Fire Bird", when Cruella learns that Hades is heading to the Upper World, she decides to stay as the new ruler of the Underworld and keep the heroes there as punishment for what they did to James. She approaches the heroes as Henry is writing everyone's unfinished business, and informs them of her plan. When Regina points out that her magic only affects animals, Cruella reveals that she's made an alliance with the Blind Witch (from Hansel and Gretel), and the two lock the heroes in the Underbrooke Library with Cruella sensing eternity is going to feel nice.
When Hook and King Arthur seek Cruella out in the Underbrooke Diner, Cruella tells them that she has ripped out the phone boxes that can contact the Upper World, and that she has thrown the Underbrooke version of the storybook into the River of Souls.
In the Season 5 DVD and Blu-ray exclusive mini-episode "A Knight with Cruella", Cruella wakes up with a hangover in a bar in the Under World. She asks the bartender what time it is, and he tells her it's 11 o'clock in the morning, so she orders a mimosa without the juice. She asks the bartender what he was before he finds himself in the Under World, and he explains that he is Sir Mordred. Cruella starts to rub her hand on Mordred, asking if she can skin him just to keep in practice, but no matter how much she persists, he doesn't allow her to. She orders a whiskey, but Mordred claims they're low on whiskey, annoying Cruella more. Mordred does suggest that he and Cruella can usurp control of the Under World, but considering that's how Mordred had gotten to the Under World, Cruella suggests making that Plan B for them. Mordred also suggests they seek redemption so when they do move oin, they will find themselves in the "good place," yet Cruella doesn't think she can do that. Mordred then suggests that Cruella stay, explaining that Cruella's evil makes others look good by comparison ("The Darkness That Makes the Light Visible"). Cruella spin-doctors this to mean that she's what makes good possible and that she's the real hero, so she drinks to that and stays. Cruella then questions how she found herself drunk in the bar, and Mordred explains that everyone was celebrating, as it has been fifty years since Arthur became ruler of the Under World. Cruella remembers and continues drinking.
Cruella in Descendants
Cruella appeared in Descendants with her son Carlos de Vil as one of the main characters. She is portrayed by Wendy Raquel Robinson.
It is shown that she treats Carlos more as a slave or servant than her own kind. Though being the first to show concern for their children attending Auradon, it's more that she questions about who shall help touch up her roots, fluff up her fur, and scrape the bunions from her feet. She raised Carlos to be afraid of dogs, explaining that she was a "dog yellerer" - an expert.
As Carlos and the others set off to Auradon, Cruella tells Carlos to bring back a puppy.
When the Fairy Godmother arranges a video call between the children and their parents, Cruella notices that Carlos has a canine (the school mutt called Dude), and claims he'll make good pair of earmuffs. Carlos settles that Dude would make a good pet, possibly being the first time Carlos has stood up to Cruella.
She is shown to have a squeaky dog on her attire, which she seems to treat like an actual pet.
In the book Isle of the Lost, it is stated that Cruella and Carlos still live in Hell Hall (either it already being there or having been rebuilt on the island), and she has Carlos sleep in an inhospitable coat closet rather than give him a room of his own. She spends a portion of her time at an area on the island that passes for a spa, which serves as a bit of comfort and reminder of her luxurious life. She is also shown to still drive her car on the island too.
Whether she is to appear in Wicked World is unknown at this time.
Cruella (live-action film)
In September 2013, it was announced that Cruella would appear in a film telling of her origins. In January 2016, it was reported that Emma Stone is in negotiations (and later confirmed in April 2016) to play Cruella.
Kingdom Keepers
Cruella is one of the leaders of the Overtakers in the series. Cruella appears in the fourth and fifth books in the saga. In Power Play, she and the Queen take over the leadership of the Overtakers when Maleficent and Chernabog are captured. At the end of the book, she mentions she's an important part of the Overtakers, because she knows the ways of the modern world unlike The Queen or Maleficent. In Shell Game, she and the Queen reappear aboard the Disney Dream while following the hyenas who caught the Keepers' scent.
Though Finn describes Cruella as annoying, she can be very evil and uncaring, such as when she threatened to burn Charlene with her cigarette.
Cruella makes a number of appearances in Disney video games.
101 Dalmatians: Animated Storybook
She appears in the Animated Storybook, which is based more on her appearance from the first live-action film.
In the "House of DeVil" page, if a music player is clicked, Cruella gets her first musical number titled "I Love Fur", where she discusses her obsession with fur fashion.
Like in the first live-action film, Roger is inspired to make her the main antagonist of his video game.
Escape from DeVil Manor
In Escape from DeVil Manor (based on Roger's video game) from the first live-action film, Cruella is shown to be present at Roger and Anita's wedding.
As Wizzer and Patches look around DeVil Manor, they find her nanny's room with a portrait of a young Cruella ripping the head from a doll, with a nervous nanny behind her. Wizzer and Patches also find Cruella's room from when she was younger, as it seems to suggest she tortured animals in her youth.
When Cruella learns of Wizzer and Patches, she chases them into a mine shaft where they throw a pile of explosives at her, sending her flying into a bathtub in a junkyard, where the police are waiting to arrest her.
In 102 Dalmatians: Puppies To The Rescue, Cruella has set up a toy factory next to DeVil Manor. She seems to have tried online dating, where she has supposedly wed herself to Professor Farzboom, a meek professor who helps her make her toys. However, the toy sales are failing, and Cruella suspects it is because the public is spending their money more on animals. She then sends her toys to abduct all the pets in England.
Domino and Oddball confront Cruella on a number of occasions, with her in devices that Farzboom makes for her (such as a helicopter or a boat).
Cruella's plan is to incise the pets of England in a Super Glop made by Farzboom and then sell them as lifelike plush toys.
When Domino and Oddball confront Cruella at her toy factory, they are able to knock her into the vat of Super Glop, with Farzboom jumping in to help her. Afterwards, they are arrested, with the Super Glop sticking them together for 20 years (which is the same as their prison sentence).
Dottie describes Cruella's scent to be like Pepper, a likely homage to how her scent and taste are described in the novel.
Disney Villains Challenge
In the Disney Villains Challenge Tablet game, Cruella is one of the main antagonists that the player may face. Her challenges include trying to help a Dalmatian from DeVil Manor, pinning down her car, repainting said car, playing Roger's piano, and giving Cruella a makeover to make her look silly.
Cruella also appears as a Townsperson in Disney INFINITY. In the 3DS version of the game, she appears as a cameo and will take coins from the player with the highest amount and keep them for herself. Her car is also a usable vehicle in the game.
Disney Universe
In Disney Universe, a Cruella costume can be unlocked for the player to wear.
Cruella make appearances in the Disney Parks around the world. Cruella usually appears as a meet and greet character. She is considerably more common in Disneyland Paris. Cruella's most notable park appearance in arguably Disney Stars and Motorcars Parade and Celebrate A Dreams Come True Parade.
In Sorcerers of the Magic Kingdom, Cruella is a villain enemy featured in Main Street, U.S.A. She makes a deal with Hades (under the guise of Boss Teal), to have all the dalmatians in her possessions in exchange for the legendary crystal of the Magic Kingdom. When word spreads that Pongo has contacted the local dogs to guard the crystal, Cruella sends Jasper and Horace to capture the dogs. They capture a few but before they a given a chance to eliminate them, the park guests arrives and defeats the hoodlums. Meanwhile, Hades created a fireworks show to distract the citizens whilst Cruella rampages through their homes to find the crystal. Eventually, she breaks into Merlin's secret vault. However, whilst the Park Guests did battle with Cruella, Perdita and the Other Puppies replaced the crystal with chew toys, and Cruella breaks down in tears at the fact that she's been outwitted by dogs. After the guests blast her with magic, he coat falls apart, causing her to throw a tantrum and fall beneath the floor.
Fantasmic!
Cruella appears as one of the villains in the Florida version of Fantasmic!. In the show, Cruella is called forth by the Queen when she plans to destroy Mickey Mouse once and for all, with the help of her fellow villains. In the end, Cruella is defeated by Mickey, along with the other villains.
Disney Villains Mix and Mingle
In the live castle show in Walt Disney World, Cruella is summoned by Dr. Facilier (and, prior to 2011, Maleficent) to celebrate the dark and sinister style of Halloween.
Disney's Maleficious Halloween Party
In the show, Cruella is the fourth villain Doctor Facilier encounters. She teaches Facilier about fashion and he defeats Cruella using the puppies which drives her to running away.
Villains Tonight
Cruella makes an appearance during the Disney Magic's performance of 'Villains Tonight!', after the Pirates mutiny against Captain Hook. She claims that 'You're Either In Or Out and (Captain Hook) is Out, whilst she Never is'. She holds a fashion show based on Dalmatian looks before ripping the shirts off the Pirates, commenting how she prefers Spots over Stripes.
She later appears in the climax of the show, to help Hades unleash his full evil potential.
She will later host the Villains/Halloween Party after the show.
Midship Detective Agency
Cruella is one of the villain suspects in Midship Detective Agency on the Disney Fantasy cruise ship. However, after finding some evidence, it is reveled that Cruella is not responsible for the crime in question, being absent from the ship at the time the crime was committed, due to her attending her Court Hearing. Ironically, one of the crimes she is innocent of is the kidnapping of Pongo and Perdita's Puppies. The real culprit being either the Evil Queen from Snow White, Dr. Falicier from Princess & The Frog, Malificnt from Slepng Beauty, Captain Hook frm Peter Pan, Jafar frm Aladdn, or Yzm frm Emperor's Nw Grove.
At this point, she is innocent on the cases, but future cases may have her be a culprit too.
Rachel York as Cruella in the "Musical"
The Queen song "Let Me Entertain You" features the lyrics "I'll Cruella de Vil You!".
The Children 18:3 song "The Cruel One" is about 101 Dalmatians and mentions Cruella by name in the chorus.
The Deadsy song "Cruella" is written about Cruella de Vil to honor her memory because of the fact that she was shot by a mysterious assassin in "Who Shot Cruella De Vil?" (Part 1).
The Spanish singer Alaska made a song called "Cruella de Vil" for the 101 Dalmatians live-action film.
Teen singer and actress Selena Gomez redid the song, based on the song from Disney's 101 Dalmatians.
American singer and performer Lady Gaga dressed up as Cruella de Vil for Halloween in 2010. The performer has had many outfits inspired by the villain.
During the "Second Star to the Right" sequence at the London 2012 Olympics Opening Ceremony, as tribute to British Literature, a child's dream is invaded by Literature Villains, Cruella makes an appearance as one of a large balloons portraying the villains, with some Dalmatians dancing around her.
In The Simpsons episode "Two Dozen and One Greyhounds", Mr. Burns plays the role of Cruella de Vil, who was authentically assassinated, but unlike her in the movies, where she steals the Dalmatian puppies to make them into fur coats, he steals Santa's Little Helper and his girlfriend's greyhound puppies to make them into a tuxedo. And unlike Cruella, who has no hesitation in killing the puppies, Burns cannot bear to kill the puppies himself because they are too cute. Instead, he decides to train them to be world-class racing dogs.
Coco LaBouche from 2000 film Rugrats in Paris is a parody of Cruella.
According to Disney animator Bruce Smith, the design of Dr. Facilier (from The Princess and the Frog) is supposed to be what the love child of Cruella de Vil and Captain Hook would look like.
De Vil family
More 101 Dalmatians Wiki
1 Anita Radcliffe
2 Lucky
3 Cameos from Other Films
101 Dalmatians Wiki is a FANDOM Movies Community.


And makes you more proactive for the future. Like anything you have learned how to do; those skills can continually be fine-tuned. Finance it is of course fundamental to have enough money to live in a comfortable house and maintain your family Setting your sail for a successful journey I definitely recommend that you check out this site. And this can be done on the go by using your phone or tablet.
Work on one single habit per month You earn more by learning more. Developing good health means to eat properly You are continuously developing your knowledge And pours those toxins into your kidneys for elimination in the morning. Do not forget to thank them for helping you out in your quest for self improvement.
A calendar By listening to speakers who have mastered the techniques Understand that people have different perceptions and sensibilities. Your subconscious will open doors and your eyes to opportunities you didn't even know were there. I recommend that you constantly work on each of those. One of the core aspects of mindbloom is the bloom programme.
But the set of the sail that determines your destination -- jim rohn if you learn to set a good sail Under the slogan ideas worth spreading. The personal development plan can be of help in goals such as developing innate talents A community Eat a healthier diet people who are trying to live a healthier lifestyle usually incorporate a better diet into their personal development program. Your problems are not more important than other people's problems.


Book of, ra, slot play online for free Book of, ra, slot, machine, play, online, uK, best Deluxe, free, slots, online, play, the 2017. Play, book of,. Deluxe other Video, slots from Novomatic. Book of, ra, online. Free game slotsBook of, ra, slot play online for free Book of, ra, slot, machine, play, online, uK, best Deluxe, free, slots, online, play, the 2017. Play, book of,. Deluxe other Video, slots from Novomatic. Book of, ra, online. Free game slots book of ra : Play free casino slots games online Book of, ra, slot. Game Description: Book Of, ra is another very popular casino game and very loved. With well over 800 free slots. Playability should always come before all else in the realm of Canadian free slots online, so don't hesitate to play. Book of Ra 6 Sloturi Online România Joacă Gratis Novomatic Cele Mai Atractive.
The Book of Ra slot online will take you into the dark old tomb of the ancient Egyptian heroes to see what it is you can unearth there. Sizzling Hot, book of Ra, fruit cocktail, garage Slot. How to Play Free Casino Slot Machine Game. They believe that you need to bet 5 credits each time, so you can collect more symbols with the Book of Ra, which provide much more additional chances because they activate online free spins on slots. The Book of Ra casino game is developed by the Novomatic group. So it does not surprise that this particular topic from the start gained such tremendous popularity. You can choose between 1 and 9 lines. These theories are very easily tested; all you need is to play free games of slot machine Book of Ra as much as possible. This is offered in all major casinos, and you can use this site to learn and master the slot. Where Players Can Enjoy This Slot Game. Sign up for free and see for yourself exactly how exciting and well-designed these slots games can be and enjoy playing for fun! You can bet from 1 to 900 coins in general per spin. It online game casino slot spielen kostenlos does not break your bankroll and there are no complicated processes.
Book of Ra 6 Online Slot SA Play Free Novomatic Slots For Fun. Play free games from Novoline such as Book of Ra, Book of Ra Deluxe and much more popular games. Lord Of The Ocean Slot - Play Free Vegas Slots Online. Risk Game, the risk game of free online slot games with such an option is activated after each winning spin. We have tested them, noted their strengths and weaknesses, and then ranked them to show you casino online list book auf ra exactly which games we think you will like the best. Aztec Gold 2, beetle Mania, dolphins Pearl, lucky Lady's Charm. For example, sometimes players argue that you need to count spins until the good and generous combination of symbols will appear; so in the next game, you can calculate the number of spins, after which a big win happens again; so at such point you need.


Has your skin suddenly become dry and patchy? Are you experiencing extreme changes in weight? Has your hair lost shine and volume? Are you often irritated and depressed? Well, if these are the symptoms you are experiencing for quite some time then it is possible that your hormones are playing havoc on the endocrine system. Hormone Imbalance or fluctuation often happens in a woman's life in different phases like puberty, pregnancy, menopause, breastfeeding or post menopause but if you are living a perfectly normal life without any of the above situations then it's important to pay a visit to a gynecologist.
Often unhealthy lifestyle, poor nutrition, obesity, intake of steroids or stress can result in a change in hormone profile that directly affects the endocrine system. Hormones are responsible for metabolism in the body, cardiac health, reproduction, growth, and development of the body and in case of imbalance its first target is metabolism. Metabolism of the person with hormonal balance will diminish marginally and will result in an increase in stress, anxiety, excessive sleep, etc. So how should one regulate hormonal profile?
Visit an expert gynecologist: Don't be late and book your appointment with an expert gynecologist. He/she might suggest some tests that will give an insight into the exact situation and accordingly you will be put on a medication. The source or reason of hormonal imbalance is important to know before starting the treatment.
Opt for hormone replacement or birth control pills: Often females suffer from over or underproduction of estrogen or progesterone levels that can be regulated with the help of birth control pills or estrogen patches or rings. Hormone replacement medicine is also a better alternative when clinically prescribed especially in case of the thyroid as it will help to eliminate the side effects of under or overproduction of thyroid hormone. In case you don't want to physically go to the doctor/pharmacy then you can get an online prescription from online doctors and order medicines online using vouchers from By discount codes.
Change your lifestyle: It is essential to have a well-disciplined lifestyle. It's time to become responsible and quit drinking, smoking or late night parties. Detoxifying the body or mind will help to stabilize the hormones but it will not happen overnight. It will take time to change habits and lifestyle hence, it is important to practice self-control. It is also advisable to add herbs in your diet like ginseng or maca as it will help to reduce anxiety or fatigue.
Practice mind relaxation techniques: It is an old saying, "Our body is the reflection of our mind." Hence, it is important to relax your mind, stay positive and make contemplation your habit. It will help to relax the tired nerves, reduce tension and also promote the production of happy hormones which in turn will help you beat the stress and regulate hormone profile.
Lastly, most of the people keep changing the medicines from western to eastern to physiotherapy to naturoptherapy and what not. It is advisable to stick to one branch of medicine and let it work for your system as frequent changes have more drawbacks than benefits. Verisana specializes in hormonal imbalances, metabolic disorders and all peripheral diseases that can make our body unbalanced.


This paper presents a model-driven approach to developing pervasive computing applications that exploits design-time information to support the engineering of planning and optimisation algorithms that reflect the presence of uncertainty, dynamism and complexity in the application domain. In particular the task of generating code to implement planning and optimisation algorithms in pervasive computing domains is addressed. We present a layered domain model that provides a set of object-oriented specifications for modelling physical and sensor/actuator infrastructure and state-space information. Our model-driven engineering approach is implemented in two transformation algorithms. The initial transformation parses the domain model and generates a planning model for the application being developed that encodes an application?s states, actions and rewards. The second transformation parses the planning model and selects and seeds a planning or optimisation algorithm for use in the application. We present an empirical evaluation of the impact of our approach on the development effort associated with two pervasive computing applications from the Intelligent Transportation Systems (ITS) domain, and provide a quantitative evaluation of the performance of the algorithms generated by the transformations.


Problems Booking? Let us know.
We have so many different holidays for you to choose from, below are details of our most popular options. If there is something you would like that is not listed below, please contact us & we will do our best to make your holiday just what you want.
Check availability and Book your holiday!
Phone Call EmailI don't mind try every which way !
Do you need us to help you with transport ?


Investigators examine a weapon and search for other evidence at the scene after a Philadelphia Police officer shot and wounded a gun suspect Sunday night. Photographs for the Gun Crisis Reporting Project by Joseph Kaczmarek.
A Philadelphia Police officer shot a 17-year-old who officials said pointed a handgun at officers during a foot pursuit Sunday night on North 57th Street near Media Street in the Carroll Park section of Philadelphia. According to police, officers encountered the suspect as they were responding to the report of a person with a gun.
Police then rushed the teen, who had been struck once in the torso, to the Hospital of the University of Pennsylvania where he was listed in critical condition. Police said they recovered a semi automatic-handgun with an extended capacity magazine at the scene.


We offer a complete package of parts and service which allows us to fully guarantee our products and ensure correct fitting.
We have improved upon the standard vulcanizing service traditionally offered, providing a full conveyor maintenance package. This allows one team to go to site strip the conveyor, carryout repairs to the conveyor, fit and vulcanize the belt and then leave everything in a condition "ready to run". Our engineers are also trained to spot potential problems and can offer advice to prevent damage to the belt or the conveyor.
Health and Safety has been put at the core of our on-site service. All of our engineers are trained to SafePass and Quarry Passport standards, along with this they use a custom designed Safe System of Work Plan to evaluate and communicate the risks involved before starting any job.


Working Equitation IALHA USA Nationals "EOH"
As I rode Carbon into Watt arena in Fort Worth Texas for the EOH phase, the gate keeper kindly said, "Good luck Randy." I turned to look at her with a crooked smile and replied, "It was not luck that got me here." To play at this level it takes: planning, preparation, talent, tenacity, heart, try, desire, a support team, money, time, blood, sweat, tears, drive, patience, etc, etc… It would cheapen the win if it was all due to chance.
Little did she know that I have been training Carbon for the last five years and worked the last six months practicing specifically to win this championship, but that is just part of the journey. Three days earlier, I was stuck in a little town in South Carolina looking for a mechanic to repair my truck. The short story is that it took $1,000 and 48 hours to figure out that the catalytic converter was clogged and the water pump needed to be replaced. As you can see by the picture, Carbon supervised the mechanic to make sure the truck met all safety requirements. Now that I spent my mad money, the question was, do I have enough money to make the 3,000 mile and 10 day journey to get to TX and back home? Well we said our good byes to the mechanic and drove straight through to Forth Worth.
With eight exhibitors in level 4, we had our work cut out for us. All the exhibitors were excellent riders and had great horses. We were pretty much on pins and needles the whole time. At this point I trusted in Carbon's training and rode what I brought to the show. I knew he was better than he was a few months ago, but I was not sure if the other fancy horses would kick our butts. We placed 2nd in the dressage phase and I thought we received a 3rd place in speed. After knocking down two polls in the EOH phase, I thought for sure the best we could do is reserve or 3rd place. Carbon and I had no idea we had won until they announced it at the awards.
Well the rest is history and if it was not for Sierra Nevada Lusitanos prize money, we would not have made it home. So you could say that Carbon earned his ticket home.
I want to give a special thanks to all of Carbon's fans that watched us on live streaming provided by AndalusianWorld.com. Don't miss the video of our EOH below. We made some mistakes, but Carbon was in good form..
Canter Footfall, how do you know when to ask for the lead?
Western Dressage USEF Basic Test #1. What does (69.524) looks like?
Working Equitation IALHA USA Nationals "Speed"
USEF Western Dressage Basic Test #1 What does 80.174 look like?
6/02/12 Western Dressage USEF Primary Test #2. What does (80.926) looks like?
ERAHC VA Classic Horse show Working Equitation "Dressage Phase"
Why Elevate the Front End?
This is an introduction to Randy Byers during the first MWWD Western Dressage clinic in Minnesota at the University of Minnesota in April of 2011.
ERAHC VA Classic Horse show Working Equitation "Speed"
The prerequisite to "Bridle Work" from the ground, is being able to put on the bridle. Many horses develop issues with having the bridle put on by the handler. This is a great little trick to try out before introducing the actual snaffle bit.
This footage was taken from The Washington Horse Expo at Clark County Events Center Feb 2011.
ERAHC VA Classic Horse show Working Equitation "Ease of Handling"
Collection is so much more than a headset or a body frame - it's a mental, emotional, and physical state. learn how to activate your horse to build toward the ultimate sense of collection.This footage was taken from The Washington Horse Expo at Clark County Events Center Feb 2011.
You are here: Home Videos Blog Video Archive Working Equitation IALHA USA Nationals "EOH"


text:
package cmd

import (
	"context"
	"fmt"
	"io"
	"os"
	"path"
	"sort"
	"strconv"
	"strings"
	"sync"
	"time"

	"github.com/minio/minio-go/v7/pkg/set"
	xhttp "github.com/minio/minio/internal/http"
	"github.com/minio/minio/internal/logger"
	"github.com/minio/minio/internal/sync/errgroup"
	"github.com/minio/pkg/mimedb"
)

func (er erasureObjects) getUploadIDDir(bucket, object, uploadID string) string {
	return pathJoin(er.getMultipartSHADir(bucket, object), uploadID)
}

func (er erasureObjects) getMultipartSHADir(bucket, object string) string {
	return getSHA256Hash([]byte(pathJoin(bucket, object)))
}

// checkUploadIDExists - verify if a given uploadID exists and is valid.
func (er erasureObjects) checkUploadIDExists(ctx context.Context, bucket, object, uploadID string) (err error) {
	defer func() {
		if err == errFileNotFound {
			err = errUploadIDNotFound
		}
	}()

	disks := er.getDisks()

	// Read metadata associated with the object from all disks.
	metaArr, errs := readAllFileInfo(ctx, disks, minioMetaMultipartBucket, er.getUploadIDDir(bucket, object, uploadID), "", false)

	readQuorum, _, err := objectQuorumFromMeta(ctx, metaArr, errs, er.defaultParityCount)
	if err != nil {
		return err
	}

	if reducedErr := reduceReadQuorumErrs(ctx, errs, objectOpIgnoredErrs, readQuorum); reducedErr != nil {
		return reducedErr
	}

	// List all online disks.
	_, modTime, dataDir := listOnlineDisks(disks, metaArr, errs)

	// Pick latest valid metadata.
	_, err = pickValidFileInfo(ctx, metaArr, modTime, dataDir, readQuorum)
	return err
}

// Removes part given by partName belonging to a mulitpart upload from minioMetaBucket
func (er erasureObjects) removeObjectPart(bucket, object, uploadID, dataDir string, partNumber int) {
	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)
	curpartPath := pathJoin(uploadIDPath, dataDir, fmt.Sprintf("part.%d", partNumber))
	storageDisks := er.getDisks()

	g := errgroup.WithNErrs(len(storageDisks))
	for index, disk := range storageDisks {
		if disk == nil {
			continue
		}
		index := index
		g.Go(func() error {
			// Ignoring failure to remove parts that weren't present in CompleteMultipartUpload
			// requests. xl.meta is the authoritative source of truth on which parts constitute
			// the object. The presence of parts that don't belong in the object doesn't affect correctness.
			_ = storageDisks[index].Delete(context.TODO(), minioMetaMultipartBucket, curpartPath, false)
			return nil
		}, index)
	}
	g.Wait()
}

// Clean-up the old multipart uploads. Should be run in a Go routine.
func (er erasureObjects) cleanupStaleUploads(ctx context.Context, expiry time.Duration) {
	// run multiple cleanup's local to this server.
	var wg sync.WaitGroup
	for _, disk := range er.getLoadBalancedLocalDisks() {
		if disk != nil {
			wg.Add(1)
			go func(disk StorageAPI) {
				defer wg.Done()
				er.cleanupStaleUploadsOnDisk(ctx, disk, expiry)
			}(disk)
		}
	}
	wg.Wait()
}

func (er erasureObjects) renameAll(ctx context.Context, bucket, prefix string) {
	var wg sync.WaitGroup
	for _, disk := range er.getDisks() {
		if disk == nil {
			continue
		}
		wg.Add(1)
		go func(disk StorageAPI) {
			defer wg.Done()
			disk.RenameFile(ctx, bucket, prefix, minioMetaTmpDeletedBucket, mustGetUUID())
		}(disk)
	}
	wg.Wait()
}

func (er erasureObjects) deleteAll(ctx context.Context, bucket, prefix string) {
	var wg sync.WaitGroup
	for _, disk := range er.getDisks() {
		if disk == nil {
			continue
		}
		wg.Add(1)
		go func(disk StorageAPI) {
			defer wg.Done()
			disk.Delete(ctx, bucket, prefix, true)
		}(disk)
	}
	wg.Wait()
}

// Remove the old multipart uploads on the given disk.
func (er erasureObjects) cleanupStaleUploadsOnDisk(ctx context.Context, disk StorageAPI, expiry time.Duration) {
	now := time.Now()
	diskPath := disk.Endpoint().Path

	readDirFn(pathJoin(diskPath, minioMetaMultipartBucket), func(shaDir string, typ os.FileMode) error {
		return readDirFn(pathJoin(diskPath, minioMetaMultipartBucket, shaDir), func(uploadIDDir string, typ os.FileMode) error {
			uploadIDPath := pathJoin(shaDir, uploadIDDir)
			fi, err := disk.ReadVersion(ctx, minioMetaMultipartBucket, uploadIDPath, "", false)
			if err != nil {
				return nil
			}
			wait := er.deletedCleanupSleeper.Timer(ctx)
			if now.Sub(fi.ModTime) > expiry {
				er.renameAll(ctx, minioMetaMultipartBucket, uploadIDPath)
			}
			wait()
			return nil
		})
	})

	readDirFn(pathJoin(diskPath, minioMetaTmpBucket), func(tmpDir string, typ os.FileMode) error {
		if tmpDir == ".trash/" { // do not remove .trash/ here, it has its own routines
			return nil
		}
		vi, err := disk.StatVol(ctx, pathJoin(minioMetaTmpBucket, tmpDir))
		if err != nil {
			return nil
		}
		wait := er.deletedCleanupSleeper.Timer(ctx)
		if now.Sub(vi.Created) > expiry {
			er.deleteAll(ctx, minioMetaTmpBucket, tmpDir)
		}
		wait()
		return nil
	})
}

// ListMultipartUploads - lists all the pending multipart
// uploads for a particular object in a bucket.
//
// Implements minimal S3 compatible ListMultipartUploads API. We do
// not support prefix based listing, this is a deliberate attempt
// towards simplification of multipart APIs.
// The resulting ListMultipartsInfo structure is unmarshalled directly as XML.
func (er erasureObjects) ListMultipartUploads(ctx context.Context, bucket, object, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (result ListMultipartsInfo, err error) {
	result.MaxUploads = maxUploads
	result.KeyMarker = keyMarker
	result.Prefix = object
	result.Delimiter = delimiter

	var uploadIDs []string
	var disk StorageAPI
	for _, disk = range er.getLoadBalancedDisks(true) {
		uploadIDs, err = disk.ListDir(ctx, minioMetaMultipartBucket, er.getMultipartSHADir(bucket, object), -1)
		if err != nil {
			if err == errDiskNotFound {
				continue
			}
			if err == errFileNotFound {
				return result, nil
			}
			logger.LogIf(ctx, err)
			return result, toObjectErr(err, bucket, object)
		}
		break
	}

	for i := range uploadIDs {
		uploadIDs[i] = strings.TrimSuffix(uploadIDs[i], SlashSeparator)
	}

	// S3 spec says uploadIDs should be sorted based on initiated time, we need
	// to read the metadata entry.
	var uploads []MultipartInfo

	populatedUploadIds := set.NewStringSet()

	for _, uploadID := range uploadIDs {
		if populatedUploadIds.Contains(uploadID) {
			continue
		}
		fi, err := disk.ReadVersion(ctx, minioMetaMultipartBucket, pathJoin(er.getUploadIDDir(bucket, object, uploadID)), "", false)
		if err != nil {
			return result, toObjectErr(err, bucket, object)
		}
		populatedUploadIds.Add(uploadID)
		uploads = append(uploads, MultipartInfo{
			Object:    object,
			UploadID:  uploadID,
			Initiated: fi.ModTime,
		})
	}

	sort.Slice(uploads, func(i int, j int) bool {
		return uploads[i].Initiated.Before(uploads[j].Initiated)
	})

	uploadIndex := 0
	if uploadIDMarker != "" {
		for uploadIndex < len(uploads) {
			if uploads[uploadIndex].UploadID != uploadIDMarker {
				uploadIndex++
				continue
			}
			if uploads[uploadIndex].UploadID == uploadIDMarker {
				uploadIndex++
				break
			}
			uploadIndex++
		}
	}
	for uploadIndex < len(uploads) {
		result.Uploads = append(result.Uploads, uploads[uploadIndex])
		result.NextUploadIDMarker = uploads[uploadIndex].UploadID
		uploadIndex++
		if len(result.Uploads) == maxUploads {
			break
		}
	}

	result.IsTruncated = uploadIndex < len(uploads)

	if !result.IsTruncated {
		result.NextKeyMarker = ""
		result.NextUploadIDMarker = ""
	}

	return result, nil
}

// newMultipartUpload - wrapper for initializing a new multipart
// request; returns a unique upload id.
//
// Internally this function creates 'uploads.json' associated for the
// incoming object at
// '.minio.sys/multipart/bucket/object/uploads.json' on all the
// disks. `uploads.json` carries metadata regarding on-going multipart
// operation(s) on the object.
func (er erasureObjects) newMultipartUpload(ctx context.Context, bucket string, object string, opts ObjectOptions) (string, error) {
	onlineDisks := er.getDisks()
	parityDrives := globalStorageClass.GetParityForSC(opts.UserDefined[xhttp.AmzStorageClass])
	if parityDrives <= 0 {
		parityDrives = er.defaultParityCount
	}

	parityOrig := parityDrives
	for _, disk := range onlineDisks {
		if parityDrives >= len(onlineDisks)/2 {
			parityDrives = len(onlineDisks) / 2
			break
		}
		if disk == nil {
			parityDrives++
			continue
		}
		di, err := disk.DiskInfo(ctx)
		if err != nil || di.ID == "" {
			parityDrives++
		}
	}
	if parityOrig != parityDrives {
		opts.UserDefined[minIOErasureUpgraded] = strconv.Itoa(parityOrig) + "->" + strconv.Itoa(parityDrives)
	}

	dataDrives := len(onlineDisks) - parityDrives

	// we now know the number of blocks this object needs for data and parity.
	// establish the writeQuorum using this data
	writeQuorum := dataDrives
	if dataDrives == parityDrives {
		writeQuorum++
	}

	// Initialize parts metadata
	partsMetadata := make([]FileInfo, len(onlineDisks))

	fi := newFileInfo(pathJoin(bucket, object), dataDrives, parityDrives)
	fi.VersionID = opts.VersionID
	if opts.Versioned && fi.VersionID == "" {
		fi.VersionID = mustGetUUID()
	}
	fi.DataDir = mustGetUUID()

	// Initialize erasure metadata.
	for index := range partsMetadata {
		partsMetadata[index] = fi
	}

	// Guess content-type from the extension if possible.
	if opts.UserDefined["content-type"] == "" {
		opts.UserDefined["content-type"] = mimedb.TypeByExtension(path.Ext(object))
	}

	modTime := opts.MTime
	if opts.MTime.IsZero() {
		modTime = UTCNow()
	}

	onlineDisks, partsMetadata = shuffleDisksAndPartsMetadata(onlineDisks, partsMetadata, fi)

	// Fill all the necessary metadata.
	// Update `xl.meta` content on each disks.
	for index := range partsMetadata {
		partsMetadata[index].Fresh = true
		partsMetadata[index].ModTime = modTime
		partsMetadata[index].Metadata = opts.UserDefined
	}

	uploadID := mustGetUUID()
	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)

	// Write updated `xl.meta` to all disks.
	if _, err := writeUniqueFileInfo(ctx, onlineDisks, minioMetaMultipartBucket, uploadIDPath, partsMetadata, writeQuorum); err != nil {
		return "", toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
	}

	// Return success.
	return uploadID, nil
}

// NewMultipartUpload - initialize a new multipart upload, returns a
// unique id. The unique id returned here is of UUID form, for each
// subsequent request each UUID is unique.
//
// Implements S3 compatible initiate multipart API.
func (er erasureObjects) NewMultipartUpload(ctx context.Context, bucket, object string, opts ObjectOptions) (string, error) {
	// No metadata is set, allocate a new one.
	if opts.UserDefined == nil {
		opts.UserDefined = make(map[string]string)
	}
	return er.newMultipartUpload(ctx, bucket, object, opts)
}

// CopyObjectPart - reads incoming stream and internally erasure codes
// them. This call is similar to put object part operation but the source
// data is read from an existing object.
//
// Implements S3 compatible Upload Part Copy API.
func (er erasureObjects) CopyObjectPart(ctx context.Context, srcBucket, srcObject, dstBucket, dstObject, uploadID string, partID int, startOffset int64, length int64, srcInfo ObjectInfo, srcOpts, dstOpts ObjectOptions) (pi PartInfo, e error) {
	partInfo, err := er.PutObjectPart(ctx, dstBucket, dstObject, uploadID, partID, NewPutObjReader(srcInfo.Reader), dstOpts)
	if err != nil {
		return pi, toObjectErr(err, dstBucket, dstObject)
	}

	// Success.
	return partInfo, nil
}

// PutObjectPart - reads incoming stream and internally erasure codes
// them. This call is similar to single put operation but it is part
// of the multipart transaction.
//
// Implements S3 compatible Upload Part API.
func (er erasureObjects) PutObjectPart(ctx context.Context, bucket, object, uploadID string, partID int, r *PutObjReader, opts ObjectOptions) (pi PartInfo, err error) {
	// Write lock for this part ID.
	// Held throughout the operation.
	partIDLock := er.NewNSLock(bucket, pathJoin(object, uploadID, strconv.Itoa(partID)))
	plkctx, err := partIDLock.GetLock(ctx, globalOperationTimeout)
	if err != nil {
		return PartInfo{}, err
	}
	pctx := plkctx.Context()
	defer partIDLock.Unlock(plkctx.Cancel)

	// Read lock for upload id.
	// Only held while reading the upload metadata.
	uploadIDRLock := er.NewNSLock(bucket, pathJoin(object, uploadID))
	rlkctx, err := uploadIDRLock.GetRLock(ctx, globalOperationTimeout)
	if err != nil {
		return PartInfo{}, err
	}
	rctx := rlkctx.Context()
	defer func() {
		if uploadIDRLock != nil {
			uploadIDRLock.RUnlock(rlkctx.Cancel)
		}
	}()

	data := r.Reader
	// Validate input data size and it can never be less than zero.
	if data.Size() < -1 {
		logger.LogIf(rctx, errInvalidArgument, logger.Application)
		return pi, toObjectErr(errInvalidArgument)
	}

	var partsMetadata []FileInfo
	var errs []error
	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)

	// Validates if upload ID exists.
	if err = er.checkUploadIDExists(rctx, bucket, object, uploadID); err != nil {
		return pi, toObjectErr(err, bucket, object, uploadID)
	}

	storageDisks := er.getDisks()

	// Read metadata associated with the object from all disks.
	partsMetadata, errs = readAllFileInfo(rctx, storageDisks, minioMetaMultipartBucket,
		uploadIDPath, "", false)

	// Unlock upload id locks before, so others can get it.
	uploadIDRLock.RUnlock(rlkctx.Cancel)
	uploadIDRLock = nil

	// get Quorum for this object
	_, writeQuorum, err := objectQuorumFromMeta(pctx, partsMetadata, errs, er.defaultParityCount)
	if err != nil {
		return pi, toObjectErr(err, bucket, object)
	}

	reducedErr := reduceWriteQuorumErrs(pctx, errs, objectOpIgnoredErrs, writeQuorum)
	if reducedErr == errErasureWriteQuorum {
		return pi, toObjectErr(reducedErr, bucket, object)
	}

	// List all online disks.
	onlineDisks, modTime, dataDir := listOnlineDisks(storageDisks, partsMetadata, errs)

	// Pick one from the first valid metadata.
	fi, err := pickValidFileInfo(pctx, partsMetadata, modTime, dataDir, writeQuorum)
	if err != nil {
		return pi, err
	}

	onlineDisks = shuffleDisks(onlineDisks, fi.Erasure.Distribution)

	// Need a unique name for the part being written in minioMetaBucket to
	// accommodate concurrent PutObjectPart requests

	partSuffix := fmt.Sprintf("part.%d", partID)
	tmpPart := mustGetUUID()
	tmpPartPath := pathJoin(tmpPart, partSuffix)

	// Delete the temporary object part. If PutObjectPart succeeds there would be nothing to delete.
	var online int
	defer func() {
		if online != len(onlineDisks) {
			er.deleteObject(context.Background(), minioMetaTmpBucket, tmpPart, writeQuorum)
		}
	}()

	erasure, err := NewErasure(pctx, fi.Erasure.DataBlocks, fi.Erasure.ParityBlocks, fi.Erasure.BlockSize)
	if err != nil {
		return pi, toObjectErr(err, bucket, object)
	}

	// Fetch buffer for I/O, returns from the pool if not allocates a new one and returns.
	var buffer []byte
	switch size := data.Size(); {
	case size == 0:
		buffer = make([]byte, 1) // Allocate atleast a byte to reach EOF
	case size == -1:
		if size := data.ActualSize(); size > 0 && size < fi.Erasure.BlockSize {
			buffer = make([]byte, data.ActualSize()+256, data.ActualSize()*2+512)
		} else {
			buffer = er.bp.Get()
			defer er.bp.Put(buffer)
		}
	case size >= fi.Erasure.BlockSize:
		buffer = er.bp.Get()
		defer er.bp.Put(buffer)
	case size < fi.Erasure.BlockSize:
		// No need to allocate fully fi.Erasure.BlockSize buffer if the incoming data is smaller.
		buffer = make([]byte, size, 2*size+int64(fi.Erasure.ParityBlocks+fi.Erasure.DataBlocks-1))
	}

	if len(buffer) > int(fi.Erasure.BlockSize) {
		buffer = buffer[:fi.Erasure.BlockSize]
	}
	writers := make([]io.Writer, len(onlineDisks))
	for i, disk := range onlineDisks {
		if disk == nil {
			continue
		}
		writers[i] = newBitrotWriter(disk, minioMetaTmpBucket, tmpPartPath, erasure.ShardFileSize(data.Size()), DefaultBitrotAlgorithm, erasure.ShardSize())
	}

	n, err := erasure.Encode(pctx, data, writers, buffer, writeQuorum)
	closeBitrotWriters(writers)
	if err != nil {
		return pi, toObjectErr(err, bucket, object)
	}

	// Should return IncompleteBody{} error when reader has fewer bytes
	// than specified in request header.
	if n < data.Size() {
		return pi, IncompleteBody{Bucket: bucket, Object: object}
	}

	for i := range writers {
		if writers[i] == nil {
			onlineDisks[i] = nil
		}
	}

	// Acquire write lock to update metadata.
	uploadIDWLock := er.NewNSLock(bucket, pathJoin(object, uploadID))
	wlkctx, err := uploadIDWLock.GetLock(pctx, globalOperationTimeout)
	if err != nil {
		return PartInfo{}, err
	}
	wctx := wlkctx.Context()
	defer uploadIDWLock.Unlock(wlkctx.Cancel)

	// Validates if upload ID exists.
	if err = er.checkUploadIDExists(wctx, bucket, object, uploadID); err != nil {
		return pi, toObjectErr(err, bucket, object, uploadID)
	}

	// Rename temporary part file to its final location.
	partPath := pathJoin(uploadIDPath, fi.DataDir, partSuffix)
	onlineDisks, err = rename(wctx, onlineDisks, minioMetaTmpBucket, tmpPartPath, minioMetaMultipartBucket, partPath, false, writeQuorum, nil)
	if err != nil {
		return pi, toObjectErr(err, minioMetaMultipartBucket, partPath)
	}

	// Read metadata again because it might be updated with parallel upload of another part.
	partsMetadata, errs = readAllFileInfo(wctx, onlineDisks, minioMetaMultipartBucket, uploadIDPath, "", false)
	reducedErr = reduceWriteQuorumErrs(wctx, errs, objectOpIgnoredErrs, writeQuorum)
	if reducedErr == errErasureWriteQuorum {
		return pi, toObjectErr(reducedErr, bucket, object)
	}

	// Get current highest version based on re-read partsMetadata.
	onlineDisks, modTime, dataDir = listOnlineDisks(onlineDisks, partsMetadata, errs)

	// Pick one from the first valid metadata.
	fi, err = pickValidFileInfo(wctx, partsMetadata, modTime, dataDir, writeQuorum)
	if err != nil {
		return pi, err
	}

	// Once part is successfully committed, proceed with updating erasure metadata.
	fi.ModTime = UTCNow()

	md5hex := r.MD5CurrentHexString()

	// Add the current part.
	fi.AddObjectPart(partID, md5hex, n, data.ActualSize())

	for i, disk := range onlineDisks {
		if disk == OfflineDisk {
			continue
		}
		partsMetadata[i].Size = fi.Size
		partsMetadata[i].ModTime = fi.ModTime
		partsMetadata[i].Parts = fi.Parts
		partsMetadata[i].Erasure.AddChecksumInfo(ChecksumInfo{
			PartNumber: partID,
			Algorithm:  DefaultBitrotAlgorithm,
			Hash:       bitrotWriterSum(writers[i]),
		})
	}

	// Writes update `xl.meta` format for each disk.
	if _, err = writeUniqueFileInfo(wctx, onlineDisks, minioMetaMultipartBucket, uploadIDPath, partsMetadata, writeQuorum); err != nil {
		return pi, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
	}

	online = countOnlineDisks(onlineDisks)

	// Return success.
	return PartInfo{
		PartNumber:   partID,
		ETag:         md5hex,
		LastModified: fi.ModTime,
		Size:         n,
		ActualSize:   data.ActualSize(),
	}, nil
}

// GetMultipartInfo returns multipart metadata uploaded during newMultipartUpload, used
// by callers to verify object states
// - encrypted
// - compressed
func (er erasureObjects) GetMultipartInfo(ctx context.Context, bucket, object, uploadID string, opts ObjectOptions) (MultipartInfo, error) {
	result := MultipartInfo{
		Bucket:   bucket,
		Object:   object,
		UploadID: uploadID,
	}

	uploadIDLock := er.NewNSLock(bucket, pathJoin(object, uploadID))
	lkctx, err := uploadIDLock.GetRLock(ctx, globalOperationTimeout)
	if err != nil {
		return MultipartInfo{}, err
	}
	ctx = lkctx.Context()
	defer uploadIDLock.RUnlock(lkctx.Cancel)

	if err := er.checkUploadIDExists(ctx, bucket, object, uploadID); err != nil {
		return result, toObjectErr(err, bucket, object, uploadID)
	}

	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)

	storageDisks := er.getDisks()

	// Read metadata associated with the object from all disks.
	partsMetadata, errs := readAllFileInfo(ctx, storageDisks, minioMetaMultipartBucket, uploadIDPath, opts.VersionID, false)

	// get Quorum for this object
	readQuorum, _, err := objectQuorumFromMeta(ctx, partsMetadata, errs, er.defaultParityCount)
	if err != nil {
		return result, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
	}

	reducedErr := reduceWriteQuorumErrs(ctx, errs, objectOpIgnoredErrs, readQuorum)
	if reducedErr == errErasureReadQuorum {
		return result, toObjectErr(reducedErr, minioMetaMultipartBucket, uploadIDPath)
	}

	_, modTime, dataDir := listOnlineDisks(storageDisks, partsMetadata, errs)

	// Pick one from the first valid metadata.
	fi, err := pickValidFileInfo(ctx, partsMetadata, modTime, dataDir, readQuorum)
	if err != nil {
		return result, err
	}

	result.UserDefined = cloneMSS(fi.Metadata)
	return result, nil
}

// ListObjectParts - lists all previously uploaded parts for a given
// object and uploadID.  Takes additional input of part-number-marker
// to indicate where the listing should begin from.
//
// Implements S3 compatible ListObjectParts API. The resulting
// ListPartsInfo structure is marshaled directly into XML and
// replied back to the client.
func (er erasureObjects) ListObjectParts(ctx context.Context, bucket, object, uploadID string, partNumberMarker, maxParts int, opts ObjectOptions) (result ListPartsInfo, err error) {
	uploadIDLock := er.NewNSLock(bucket, pathJoin(object, uploadID))
	lkctx, err := uploadIDLock.GetRLock(ctx, globalOperationTimeout)
	if err != nil {
		return ListPartsInfo{}, err
	}
	ctx = lkctx.Context()
	defer uploadIDLock.RUnlock(lkctx.Cancel)

	if err := er.checkUploadIDExists(ctx, bucket, object, uploadID); err != nil {
		return result, toObjectErr(err, bucket, object, uploadID)
	}

	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)

	storageDisks := er.getDisks()

	// Read metadata associated with the object from all disks.
	partsMetadata, errs := readAllFileInfo(ctx, storageDisks, minioMetaMultipartBucket, uploadIDPath, "", false)

	// get Quorum for this object
	_, writeQuorum, err := objectQuorumFromMeta(ctx, partsMetadata, errs, er.defaultParityCount)
	if err != nil {
		return result, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
	}

	reducedErr := reduceWriteQuorumErrs(ctx, errs, objectOpIgnoredErrs, writeQuorum)
	if reducedErr == errErasureWriteQuorum {
		return result, toObjectErr(reducedErr, minioMetaMultipartBucket, uploadIDPath)
	}

	_, modTime, dataDir := listOnlineDisks(storageDisks, partsMetadata, errs)

	// Pick one from the first valid metadata.
	fi, err := pickValidFileInfo(ctx, partsMetadata, modTime, dataDir, writeQuorum)
	if err != nil {
		return result, err
	}

	// Populate the result stub.
	result.Bucket = bucket
	result.Object = object
	result.UploadID = uploadID
	result.MaxParts = maxParts
	result.PartNumberMarker = partNumberMarker
	result.UserDefined = cloneMSS(fi.Metadata)

	// For empty number of parts or maxParts as zero, return right here.
	if len(fi.Parts) == 0 || maxParts == 0 {
		return result, nil
	}

	// Limit output to maxPartsList.
	if maxParts > maxPartsList {
		maxParts = maxPartsList
	}

	// Only parts with higher part numbers will be listed.
	partIdx := objectPartIndex(fi.Parts, partNumberMarker)
	parts := fi.Parts
	if partIdx != -1 {
		parts = fi.Parts[partIdx+1:]
	}
	count := maxParts
	for _, part := range parts {
		result.Parts = append(result.Parts, PartInfo{
			PartNumber:   part.Number,
			ETag:         part.ETag,
			LastModified: fi.ModTime,
			Size:         part.Size,
		})
		count--
		if count == 0 {
			break
		}
	}
	// If listed entries are more than maxParts, we set IsTruncated as true.
	if len(parts) > len(result.Parts) {
		result.IsTruncated = true
		// Make sure to fill next part number marker if IsTruncated is
		// true for subsequent listing.
		nextPartNumberMarker := result.Parts[len(result.Parts)-1].PartNumber
		result.NextPartNumberMarker = nextPartNumberMarker
	}
	return result, nil
}

// CompleteMultipartUpload - completes an ongoing multipart
// transaction after receiving all the parts indicated by the client.
// Returns an md5sum calculated by concatenating all the individual
// md5sums of all the parts.
//
// Implements S3 compatible Complete multipart API.
func (er erasureObjects) CompleteMultipartUpload(ctx context.Context, bucket string, object string, uploadID string, parts []CompletePart, opts ObjectOptions) (oi ObjectInfo, err error) {
	// Hold read-locks to verify uploaded parts, also disallows
	// parallel part uploads as well.
	uploadIDLock := er.NewNSLock(bucket, pathJoin(object, uploadID))
	rlkctx, err := uploadIDLock.GetRLock(ctx, globalOperationTimeout)
	if err != nil {
		return oi, err
	}
	rctx := rlkctx.Context()
	defer uploadIDLock.RUnlock(rlkctx.Cancel)

	if err = er.checkUploadIDExists(rctx, bucket, object, uploadID); err != nil {
		return oi, toObjectErr(err, bucket, object, uploadID)
	}

	// Calculate s3 compatible md5sum for complete multipart.
	s3MD5 := getCompleteMultipartMD5(parts)

	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)

	storageDisks := er.getDisks()

	// Read metadata associated with the object from all disks.
	partsMetadata, errs := readAllFileInfo(rctx, storageDisks, minioMetaMultipartBucket, uploadIDPath, "", false)

	// get Quorum for this object
	_, writeQuorum, err := objectQuorumFromMeta(rctx, partsMetadata, errs, er.defaultParityCount)
	if err != nil {
		return oi, toObjectErr(err, bucket, object)
	}

	reducedErr := reduceWriteQuorumErrs(rctx, errs, objectOpIgnoredErrs, writeQuorum)
	if reducedErr == errErasureWriteQuorum {
		return oi, toObjectErr(reducedErr, bucket, object)
	}

	onlineDisks, modTime, dataDir := listOnlineDisks(storageDisks, partsMetadata, errs)

	// Pick one from the first valid metadata.
	fi, err := pickValidFileInfo(rctx, partsMetadata, modTime, dataDir, writeQuorum)
	if err != nil {
		return oi, err
	}

	// Calculate full object size.
	var objectSize int64

	// Calculate consolidated actual size.
	var objectActualSize int64

	// Order online disks in accordance with distribution order.
	// Order parts metadata in accordance with distribution order.
	onlineDisks, partsMetadata = shuffleDisksAndPartsMetadataByIndex(onlineDisks, partsMetadata, fi)

	// Save current erasure metadata for validation.
	var currentFI = fi

	// Allocate parts similar to incoming slice.
	fi.Parts = make([]ObjectPartInfo, len(parts))

	// Validate each part and then commit to disk.
	for i, part := range parts {
		partIdx := objectPartIndex(currentFI.Parts, part.PartNumber)
		// All parts should have same part number.
		if partIdx == -1 {
			invp := InvalidPart{
				PartNumber: part.PartNumber,
				GotETag:    part.ETag,
			}
			return oi, invp
		}

		// ensure that part ETag is canonicalized to strip off extraneous quotes
		part.ETag = canonicalizeETag(part.ETag)
		if currentFI.Parts[partIdx].ETag != part.ETag {
			invp := InvalidPart{
				PartNumber: part.PartNumber,
				ExpETag:    currentFI.Parts[partIdx].ETag,
				GotETag:    part.ETag,
			}
			return oi, invp
		}

		// All parts except the last part has to be atleast 5MB.
		if (i < len(parts)-1) && !isMinAllowedPartSize(currentFI.Parts[partIdx].ActualSize) {
			return oi, PartTooSmall{
				PartNumber: part.PartNumber,
				PartSize:   currentFI.Parts[partIdx].ActualSize,
				PartETag:   part.ETag,
			}
		}

		// Save for total object size.
		objectSize += currentFI.Parts[partIdx].Size

		// Save the consolidated actual size.
		objectActualSize += currentFI.Parts[partIdx].ActualSize

		// Add incoming parts.
		fi.Parts[i] = ObjectPartInfo{
			Number:     part.PartNumber,
			Size:       currentFI.Parts[partIdx].Size,
			ActualSize: currentFI.Parts[partIdx].ActualSize,
		}
	}

	// Save the final object size and modtime.
	fi.Size = objectSize
	fi.ModTime = opts.MTime
	if opts.MTime.IsZero() {
		fi.ModTime = UTCNow()
	}

	// Save successfully calculated md5sum.
	fi.Metadata["etag"] = s3MD5
	if opts.UserDefined["etag"] != "" { // preserve ETag if set
		fi.Metadata["etag"] = opts.UserDefined["etag"]
	}

	// Save the consolidated actual size.
	fi.Metadata[ReservedMetadataPrefix+"actual-size"] = strconv.FormatInt(objectActualSize, 10)

	// Update all erasure metadata, make sure to not modify fields like
	// checksum which are different on each disks.
	for index := range partsMetadata {
		if partsMetadata[index].IsValid() {
			partsMetadata[index].Size = fi.Size
			partsMetadata[index].ModTime = fi.ModTime
			partsMetadata[index].Metadata = fi.Metadata
			partsMetadata[index].Parts = fi.Parts
		}
	}

	// Hold namespace to complete the transaction
	lk := er.NewNSLock(bucket, object)
	lkctx, err := lk.GetLock(ctx, globalOperationTimeout)
	if err != nil {
		return oi, err
	}
	ctx = lkctx.Context()
	defer lk.Unlock(lkctx.Cancel)

	// Write final `xl.meta` at uploadID location
	onlineDisks, err = writeUniqueFileInfo(ctx, onlineDisks, minioMetaMultipartBucket, uploadIDPath, partsMetadata, writeQuorum)
	if err != nil {
		return oi, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
	}

	// Remove parts that weren't present in CompleteMultipartUpload request.
	for _, curpart := range currentFI.Parts {
		if objectPartIndex(fi.Parts, curpart.Number) == -1 {
			// Delete the missing part files. e.g,
			// Request 1: NewMultipart
			// Request 2: PutObjectPart 1
			// Request 3: PutObjectPart 2
			// Request 4: CompleteMultipartUpload --part 2
			// N.B. 1st part is not present. This part should be removed from the storage.
			er.removeObjectPart(bucket, object, uploadID, fi.DataDir, curpart.Number)
		}
	}

	// Rename the multipart object to final location.
	if onlineDisks, err = renameData(ctx, onlineDisks, minioMetaMultipartBucket, uploadIDPath,
		partsMetadata, bucket, object, writeQuorum); err != nil {
		return oi, toObjectErr(err, bucket, object)
	}

	// Check if there is any offline disk and add it to the MRF list
	for _, disk := range onlineDisks {
		if disk != nil && disk.IsOnline() {
			continue
		}
		er.addPartial(bucket, object, fi.VersionID, fi.Size)
		break
	}

	for i := 0; i < len(onlineDisks); i++ {
		if onlineDisks[i] != nil && onlineDisks[i].IsOnline() {
			// Object info is the same in all disks, so we can pick
			// the first meta from online disk
			fi = partsMetadata[i]
			break
		}
	}

	// Success, return object info.
	return fi.ToObjectInfo(bucket, object), nil
}

// AbortMultipartUpload - aborts an ongoing multipart operation
// signified by the input uploadID. This is an atomic operation
// doesn't require clients to initiate multiple such requests.
//
// All parts are purged from all disks and reference to the uploadID
// would be removed from the system, rollback is not possible on this
// operation.
func (er erasureObjects) AbortMultipartUpload(ctx context.Context, bucket, object, uploadID string, opts ObjectOptions) (err error) {
	lk := er.NewNSLock(bucket, pathJoin(object, uploadID))
	lkctx, err := lk.GetLock(ctx, globalOperationTimeout)
	if err != nil {
		return err
	}
	ctx = lkctx.Context()
	defer lk.Unlock(lkctx.Cancel)

	// Validates if upload ID exists.
	if err := er.checkUploadIDExists(ctx, bucket, object, uploadID); err != nil {
		return toObjectErr(err, bucket, object, uploadID)
	}

	uploadIDPath := er.getUploadIDDir(bucket, object, uploadID)

	// Read metadata associated with the object from all disks.
	partsMetadata, errs := readAllFileInfo(ctx, er.getDisks(), minioMetaMultipartBucket, uploadIDPath, "", false)

	// get Quorum for this object
	_, writeQuorum, err := objectQuorumFromMeta(ctx, partsMetadata, errs, er.defaultParityCount)
	if err != nil {
		return toObjectErr(err, bucket, object, uploadID)
	}

	// Cleanup all uploaded parts.
	if err = er.deleteObject(ctx, minioMetaMultipartBucket, uploadIDPath, writeQuorum); err != nil {
		return toObjectErr(err, bucket, object, uploadID)
	}

	// Successfully purged.
	return nil
}

redpajama_set_name: RedPajamaGithub


Early into their career, legendary rock band The Doors broke onto the music scene in a massive way. Their hard hitting instrumentation and lyrical content made them a force to be reckoned with. They were provocative and controversial, to put it lightly. This was ever so evident when The Doors appeared for the first time on The Ed Sullivan Show.
Now here is where the controversy comes in. In 1967, The Doors were set to play on The Ed Sullivan Show. All seemed well until Ed Sullivan told the band that they have to alter the lyrics of the song they were playing, which was "Light My Fire", due to the sexual implications. The Doors were scrambling trying to figure out what to do. Jim Morrison assured the band not to worry. As soon as they get on stage, Jim Morrison realizes that it's live TV and proceeds to go with the original lyric, thus going against Ed's wishes.


Can I Accept EMV Cards from Customers Purchasing from my Online Business?
EMV technology plays no role in online payments. It also plays no role in telephone order or mail order payments. EMV (named after Europay, MasterCard, and Visa who designed and initiated the evolution in card security technology) is a new generation of credit and debit card that are issued with an embedded micro-chip that holds and transmits data to a specialized card-reader. This technology replaces the magnetic strip technology that has become risky and open to card-skimming by fraudsters, leaving card holders vulnerable to having their secure and sensitive card information placed in the hands of criminals who can replicate cards from the information skimmed from the magnetic strip.
The security technology built into EMV cards is only effective when the micro-chip data is read by a card reader. EMV cards look much the same as the magnetic strip cards; they are the same size, display the same card holder information, card number, expiry date and a Card Verification Code (CVC) on the back or front of the card. The only difference in appearance is the micro-chip on the front of the card.
Online, telephonic and email card payments are referred to as "Card Not Present" transactions (CNP), and they are exactly what the name implies. The cardholder is not in the merchant's presence to physically present the card for the merchant's physical confirmation at the time of payment.
This means of card payment is a perfect hunting ground for fraudsters using skimmed information to buy products because the merchant does not see if anything looks suspicious about the card itself.
One means of trying to thwart fraudsters is the CVC (Card Verification Code) printed on the back or front of both micro-chipped and magnetic strip cards. This three or four digit code must be provided when a CNP payment is made. Despite the CVC code requirement, fraudsters still manage to obtain cardholders secure and sensitive information through various means.
EMV cards issued by MasterCard and Visa have an additional level of security through technology developed by them. MasterCard has introduced Chip Authentication Program (CAP), and Visa has introduced Dynamic Password Authentication (DPA), both to enhance cardholder security when conducting business via e-commerce suppliers.
The onus of utilizing either CAP or DPA falls on the cardholder and the merchant has no involvement other than back-end software implementation which is managed by the merchant card services provider.
Online traders have yet to see any major changes to accepting online card payments for purchases because credit card technology has not yet evolved to protect cardholders secure and sensitive information. Still, there are many safeguards in place that merchant card service providers can offer to online business owners. When signing up for a merchant account, it is highly recommended that you use a merchant account provider that uses military-grade encryption to protect your customers' data. You should also ensure that your merchant account provider has a solid reputation in the industry and complies with all current regulations, because the integrity of your business depends on the quality of the merchant card service provider that processes your card payment transactions.
For more information about EMV cards and online payment security or to sign up for a merchant account, you can call 1-888-924-2743 or go to Charge.com.


Markus Krötzsch is the current lead of the SMW Project and maintainer of this site. Together with Denny Vrandečić he founded the project in late 2005 (supported by many contributors). Markus also is a co-author of the textbook Foundations of Semantic Web Technologies, maintainer of the semanticweb.org community platform, and co-editor of the W3C OWL 2 specification. Please see his homepage for up-to-date information about his activities.
Contact him at markus semantic-mediawiki.org for official SMW-related requests. Note that free user support is provided elsewhere.
This page was last edited on 24 May 2018, at 22:11.


text:
Introducing Alkimi
A decentralised replacement to the inefficient legacy programmatic ad exchanges with the mission to restore the value exchange between advertisers, publishers and users.
Alkimi is powered by the Hypergraph – a revolutionary blockchain technology – trusted by the U.S. Department of Defense – which allows us to provide the fastest, infinitely scalable solution with 0% fraud, minimal transaction fees and complete end to end transparency.
Alkimi Exchange helps you create ad products, proven to be successful by walled gardens, across the open web.
Join Us In Creating
Something From Nothing
Alkimi Exchange
THE WORLD'S FIRST DECENTRALISED AD EXCHANGE
We think about Advertising differently, so we are building the world's first decentralised ad exchange, where:
Users aren't a product
Publishers aren't at the behest of Facebook and Google
Advertisers can deliver their message with value
Using the principle of Generative Economics, the Alkimi Exchange will reward Users, Publishers and Advertisers for rebuilding the intended value exchange of the Open Web. Fewer Ads, Better User Experience, Increased Engagement.
The New Digital Ecosystem
Learn about The New Digital Ecosystem and what it means for Internet Users, Advertisers, and Publishers
The Alkimists
Ben Putley
10 years' experience in digital advertising, predominantly focused on selling software to global publishers.
Ben led the new business function at The Fifth, News Corp's influencer marketing agency, where he delivered £2m+ in influencer marketing campaigns with brands including Disney+, Heineken, LR Suntory, Unilever and Nestle.
Prior to the Fifth, Ben led all software sales for Sharethrough's European Business, selling content management solutions to CNN (International/ Domestic), Forbes, The Telegraph, The Daily Mail and other Comscore top 100 publishers.
Neil Bruce
Fifteen years of experience in digital advertising, spent in agencies and ad tech businesses.
Neil most recently led business development for the EMEA region at ironSource, one of the largest in-App networks globally.
Prior to this, he spent 5 years at Mindshare (the world's second largest Media agency) as Head of Mobile and Digital Innovation, as well as being a member of GroupM's technology leadership team.
In 2015, he was named one of the 25 most influential people in mobile by The Drum.
Ten years of experience spent on the sell-side at start-ups and large legacy publishers.
Adam started his working life in ad operations before moving on to become a highly successful salesperson.
He was the Sales Director at SmartFrame technologies, a start-up helping image owners protect, track, present and monetise their images. His role was to build an entire advertising strategy, team and product from the ground up.
Before this, Adam was the Programmatic Director at Conde Nast, helping to bring new advertising technology and revenue streams to a global legacy publisher.
Adam Chorley
Chandrashekar Narayana
Twenty years of experience in various disciplines of software development, architecture, management, and delivery of complex programs. Specialization in information security, privacy, and regulatory aspects of data-driven solutions.
Chandru has worked with clients such as BT, Cisco, Virgin Media, and Vodafone in various capacities. He comes with significant experience in overcoming technical, strategic, and regulatory challenges in the field of digital advertising.
Recently, he helped to build and operationalize Virgin Media's targeted advertising platform.
Ben is the founder and CEO of Constellation Network, a distributed network designed to enable fast, scalable solutions for organizations needing to process and transfer data quickly and securely.
At the core of Constellation's technology is the Hypergraph, a fee-less decentralized network accessed by their native token, $DAG.
Hypergraph technology is the only existing technology that can match the cost and speed requirements of hosting an ad auction on a blockchain, so it is fundamental to helping Alkimi fix the internet with $ADS.
In addition to leading Constellation's incubation of Alkimi Exchange, Ben brings years of experience developing blockchain projects and community, as well as a background in Ad Tech.
Benjamin Jorgensen
CEO & Co-Founder, Constellation Network
Chief Product Officer, OpenSlate
Andrew is the Chief Product Officer at OpenSlate, a leading measurement and analytics company focused on creating transparent and healthy media ecosystems that support high-quality content.
Andrew's career has been shaped by more than 30 years of devotion to media, where he has sought to evolve the advertising technology space through innovative approaches to content and commercialization.
His prior experience includes roles at Oracle Data Cloud, Moat, Grapeshot, VICE Media, and SpinMedia, providing leadership across product development, product marketing, advertising operations, business strategy, sales enablement, and editorial.
Barry Herbst is a proud advisor to Alkimi Exchange. Barry brings a depth of experience in the human capital/talent acquisition world, along with a natural penchant for networking and business development.
He values trust-based relationships and is delighted to connect Alkimi to his network of owners, operators, investors from a myriad of consumer and technology-based businesses to further Alkimi's growth and adoption.
Barry Herbst
Senior Vice President at The Elliot Group
Mark Woolard
CEO & Co-Founder, HUN Wines
Mark Woollard is co founder and CEO of HUNWines – a disruptive startup targeting the canned wine sector. HUNWines has raised over £1m in seed funding & launched nationwide in Tesco & Sainsburys. The business is backed by RedBull, Brewdog & Waitrose executives.
He's also the founder of UpStart Gaming- a consultancy business in which he enters into senior management positions over medium term contracts to affect business strategy specifically in the gaming & gambling sector.
Prior to this he was Commercial Director at EndemolShine (now Banijay) the largest global TV production company and sits on the board of tech gaming startup Playzido.
Mark provides Alkimi with valuable insight into how to found and scale a successful business.
Following an undergraduate degree in physics with astrophysics, Linden worked as a trader across the London and European derivatives markets for seven years. Specializing in market-making algorithms, he rose to head of Europe for Bear Stearns Inc (Wall St Bank) by the age of 30. He brings 25 years of experience in economics, trading, and managing transition across multiple sectors.
As Constellation's business pod lead, Linden has advised Alkimi throughout the development of our Tokenomics, and we're delighted to have him on board as an economic advisor.
Linden Leadbetter
Business Pod Lead, Constellation Network
Business Pod, Constellation Network
Tim has a degree in law & economics and a postgrad in fraud management. He spent four years in corporate finance with UBS investment bank, including 18 months as a tech banker in Silicon Valley.
He served as an infantry officer in the British Army for four years with operational tours as well as working as a civilian on US Government (DoD & DoS) security contracts in Iraq & Afghanistan. He subsequently spent a decade in senior leadership roles with a US defense and national security business, including IPOing two subsidiaries on the NASDAQ.
Tim then joined Save the Children International for three years as head of anti-corruption, leading training and investigations worldwide. He has dozens of passport stamps from doing business in the types of places your mom warned you about and relishes navigating the challenges of risk and compliance.
Daniel is Partner at Partis Solutions, a global leader in the provision of corporate services to the Interactive Gaming & Gambling industry.
Recognized as an industry leader in M&A Advisory and Management Consultancy, Daniel will be working with Alkimi to bolster our Corporate Strategy as we embark on our mission to fix the internet with $ADS.
Daniel Beard
Partner, Partis Solutions
The Tea Building
56 Shoreditch High St
E1 6JJ
hello@alkimiexchange.com
Join us on Github
© Copyright 2022 alkimiexchange.com | design by Wildnut Studios

redpajama_set_name: RedPajamaCommonCrawl


Knowledge is power, so get a handle on the risks you face right away.
Healthy eating is one of the most important things you can do for your body. A healthy diet and lifestyle are your best weapons in the fight against heart disease. Use our recommendations to make smart choices and eat healthy, in order to benefit your heart and your overall health.
20 percent of patients were taking all their medication and 20 percent none of their medication.
31 percent of patients either improved or lessened their medication compliance.
After six months, average daytime systolic blood pressure fell two points (mm Hg) more in control patients than in those who had renal denervation, but remained abnormally high in both groups.
Among patients with similar blood levels of medication at each assessment, systolic blood pressure fell 3.3 points more in those who received the procedure than in controls.
Q: Are all sugars bad?
—to improve their taste, especially for children, is a better use of added sugars than nutrient-poor, highly sweetened foods.
We are not license physicians. The information contained in this website is for general information purposes only. In no event will we be liable for self diagnosing and/or treatment. Seek qualified professional medical advice. Tria Lifestyle Coaching, LLC.. The information contained in this website is for general information purposes only. In no event will we be liable for self diagnosing and/or treatment. Seek qualified professional medical advice. Tria Lifestyle Coaching, LLC.
Copyright © 2017 Tria Lifestyle Coaching, LLC All Rights Reserved.


An update for Google News & Weather is set to roll out this week, centered entirely on bringing more headlines to your eyeballs.
According to Google, they have added over 200 headlines of content to the home section of the app, meaning you have a lot of news to get through. After a bit of research, Google found that users were hitting the bottom of the page looking for more to read. To fix that, you guessed it, Google is packing in the stories.
With many content publishers supporting AMP (including DL), stories and media load quickly through this app, meaning you can read all of the important info without waiting. As the app's name suggests, you can also check your weather forecast.
If you need all those headlines, be on the lookout for the update to hit your phone this week.