made with requirebin
Last active
October 10, 2016 13:54
-
-
Save edwinwright/dd8fdd421e833296cd1de18cc056ab93 to your computer and use it in GitHub Desktop.
RequireBin - Flattening Marvel API response with normalizr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const response = { | |
| "code": 200, | |
| "status": "Ok", | |
| "copyright": "© 2016 MARVEL", | |
| "attributionText": "Data provided by Marvel. © 2016 MARVEL", | |
| "attributionHTML": "<a href=\"http://marvel.com\">Data provided by Marvel. © 2016 MARVEL</a>", | |
| "etag": "2f08937547f5cbb41e1f5845f9b3adf36417e332", | |
| "data": { | |
| "offset": 0, | |
| "limit": 20, | |
| "total": 1485, | |
| "count": 20, | |
| "results": [ | |
| { | |
| "id": 1011334, | |
| "name": "3-D Man", | |
| "description": "", | |
| "modified": "2014-04-29T14:18:17-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/c/e0/535fecbbb9784", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011334", | |
| "comics": { | |
| "available": 11, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21366", | |
| "name": "Avengers: The Initiative (2007) #14" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24571", | |
| "name": "Avengers: The Initiative (2007) #14 (SPOTLIGHT VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21546", | |
| "name": "Avengers: The Initiative (2007) #15" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21741", | |
| "name": "Avengers: The Initiative (2007) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21975", | |
| "name": "Avengers: The Initiative (2007) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/22299", | |
| "name": "Avengers: The Initiative (2007) #18" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/22300", | |
| "name": "Avengers: The Initiative (2007) #18 (ZOMBIE VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/22506", | |
| "name": "Avengers: The Initiative (2007) #19" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/10223", | |
| "name": "Marvel Premiere (1972) #35" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/10224", | |
| "name": "Marvel Premiere (1972) #36" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/10225", | |
| "name": "Marvel Premiere (1972) #37" | |
| } | |
| ], | |
| "returned": 11 | |
| }, | |
| "series": { | |
| "available": 2, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1945", | |
| "name": "Avengers: The Initiative (2007 - 2010)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2045", | |
| "name": "Marvel Premiere (1972 - 1981)" | |
| } | |
| ], | |
| "returned": 2 | |
| }, | |
| "stories": { | |
| "available": 17, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19947", | |
| "name": "Cover #19947", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19948", | |
| "name": "The 3-D Man!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19949", | |
| "name": "Cover #19949", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19950", | |
| "name": "The Devil's Music!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19951", | |
| "name": "Cover #19951", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19952", | |
| "name": "Code-Name: The Cold Warrior!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47185", | |
| "name": "Avengers: The Initiative (2007) #14 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47499", | |
| "name": "Avengers: The Initiative (2007) #15 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47792", | |
| "name": "Avengers: The Initiative (2007) #16", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47793", | |
| "name": "Avengers: The Initiative (2007) #16 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/48362", | |
| "name": "Avengers: The Initiative (2007) #17 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49104", | |
| "name": "Avengers: The Initiative (2007) #18 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49106", | |
| "name": "Avengers: The Initiative (2007) #18, Zombie Variant - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49888", | |
| "name": "Avengers: The Initiative (2007) #19", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49889", | |
| "name": "Avengers: The Initiative (2007) #19 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/54371", | |
| "name": "Avengers: The Initiative (2007) #14, Spotlight Variant - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/96303", | |
| "name": "Deadpool (1997) #44", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 17 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/269", | |
| "name": "Secret Invasion" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/74/3-d_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/3-D_Man_(Chandler)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011334/3-d_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1017100, | |
| "name": "A-Bomb (HAS)", | |
| "description": "Rick Jones has been Hulk's best bud since day one, but now he's more than a friend...he's a teammate! Transformed by a Gamma energy explosion, A-Bomb's thick, armored skin is just as strong and powerful as it is blue. And when he curls into action, he uses it like a giant bowling ball of destruction! ", | |
| "modified": "2013-09-18T15:54:04-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/3/20/5232158de5b16", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1017100", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/105929", | |
| "name": "cover from Free Comic Book Day 2013 (Avengers/Hulk) (2013) #1", | |
| "type": "cover" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/76/a-bomb?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1017100/a-bomb_has?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009144, | |
| "name": "A.I.M.", | |
| "description": "AIM is a terrorist organization bent on destroying the world.", | |
| "modified": "2013-10-17T14:41:30-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/6/20/52602f21f29ec", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009144", | |
| "comics": { | |
| "available": 33, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36763", | |
| "name": "Ant-Man & the Wasp (2010) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17553", | |
| "name": "Avengers (1998) #67" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/7340", | |
| "name": "Avengers (1963) #87" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1170", | |
| "name": "Avengers Vol. 2: Red Zone (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1214", | |
| "name": "Avengers Vol. II: Red Zone (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12787", | |
| "name": "Captain America (1998) #28" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20367", | |
| "name": "Defenders (1972) #57" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/31068", | |
| "name": "Incredible Hulks (2009) #606 (VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36737", | |
| "name": "Marvel Adventures Super Heroes (2010) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2110", | |
| "name": "Marvel Masterworks: Captain America Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1130", | |
| "name": "Marvel Masterworks: Captain America Vol. 1 - 2nd Edition (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2319", | |
| "name": "Marvel Masterworks: Doctor Strange Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2820", | |
| "name": "Marvel Masterworks: Doctor Strange Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2001", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17468", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. 1 (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1164", | |
| "name": "Marvel Masterworks: The Silver Surfer Vol. 2 (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/48816", | |
| "name": "Secret Avengers (2013) #14" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/48817", | |
| "name": "Secret Avengers (2013) #15" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/48818", | |
| "name": "Secret Avengers (2013) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/11068", | |
| "name": "Strange Tales (1951) #146" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 23, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13082", | |
| "name": "Ant-Man & the Wasp (2010 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/354", | |
| "name": "Avengers (1998 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1991", | |
| "name": "Avengers (1963 - 1996)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/227", | |
| "name": "Avengers Vol. 2: Red Zone (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/271", | |
| "name": "Avengers Vol. II: Red Zone (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1997", | |
| "name": "Captain America (1998 - 2002)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3743", | |
| "name": "Defenders (1972 - 1986)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/8842", | |
| "name": "Incredible Hulks (2009 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9718", | |
| "name": "Marvel Adventures Super Heroes (2010 - 2012)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1506", | |
| "name": "Marvel Masterworks: Captain America Vol. (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/189", | |
| "name": "Marvel Masterworks: Captain America Vol. 1 - 2nd Edition (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1468", | |
| "name": "Marvel Masterworks: Doctor Strange Vol. (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1494", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3300", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. 1 (0000 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/222", | |
| "name": "Marvel Masterworks: The Silver Surfer Vol. 2 (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/17547", | |
| "name": "Secret Avengers (2013 - 2014)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2076", | |
| "name": "Strange Tales (1951 - 1968)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2079", | |
| "name": "Tales of Suspense (1959 - 1968)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13213", | |
| "name": "Taskmaster (2010 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2258", | |
| "name": "Uncanny X-Men (1963 - 2011)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 31, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10253", | |
| "name": "When the Unliving Strike", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10255", | |
| "name": "Cover #10255", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10256", | |
| "name": "The Enemy Within!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10259", | |
| "name": "Death Before Dishonor!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10261", | |
| "name": "Cover #10261", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10262", | |
| "name": "The End of A.I.M.!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11921", | |
| "name": "The Red Skull Lives!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11930", | |
| "name": "He Who Holds the Cosmic Cube", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11936", | |
| "name": "The Maddening Mystery of the Inconceivable Adaptoid!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11981", | |
| "name": "If This Be... Modok", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11984", | |
| "name": "A Time to Die -- A Time to Live!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11995", | |
| "name": "At the Mercy of the Maggia", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/15243", | |
| "name": "Look Homeward, Avenger", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28233", | |
| "name": "In Sin Airy X", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28971", | |
| "name": "[The Brothers Part I]", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34426", | |
| "name": "The Red Skull Lives!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34435", | |
| "name": "He Who Holds the Cosmic Cube", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34441", | |
| "name": "The Maddening Mystery of the Inconceivable Adaptoid!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34486", | |
| "name": "If This Be... Modok", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34489", | |
| "name": "A Time to Die -- A Time to Live!", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/77/aim.?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/A.I.M.?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009144/aim.?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010699, | |
| "name": "Aaron Stack", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010699", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/2809/aaron_stack?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010699/aaron_stack?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009146, | |
| "name": "Abomination (Emil Blonsky)", | |
| "description": "Formerly known as Emil Blonsky, a spy of Soviet Yugoslavian origin working for the KGB, the Abomination gained his powers after receiving a dose of gamma radiation similar to that which transformed Bruce Banner into the incredible Hulk.", | |
| "modified": "2012-03-20T12:32:12-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/9/50/4ce18691cbf04", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009146", | |
| "comics": { | |
| "available": 43, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17547", | |
| "name": "Avengers (1998) #61" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17548", | |
| "name": "Avengers (1998) #62" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1098", | |
| "name": "Avengers Vol. 1: World Trust (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8557", | |
| "name": "Earth X (1999) #7" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4241", | |
| "name": "Earth X (New (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20863", | |
| "name": "Hulk (2008) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23677", | |
| "name": "Hulk Vol. 1: Red Hulk (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2499", | |
| "name": "Hulk: Destruction (2005) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14425", | |
| "name": "Incredible Hulk (1999) #25" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14428", | |
| "name": "Incredible Hulk (1999) #28" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14450", | |
| "name": "Incredible Hulk (1999) #50" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14451", | |
| "name": "Incredible Hulk (1999) #51" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8948", | |
| "name": "Incredible Hulk (1962) #137" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9006", | |
| "name": "Incredible Hulk (1962) #195" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9007", | |
| "name": "Incredible Hulk (1962) #196" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9125", | |
| "name": "Incredible Hulk (1962) #314" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9193", | |
| "name": "Incredible Hulk (1962) #382" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9194", | |
| "name": "Incredible Hulk (1962) #383" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9195", | |
| "name": "Incredible Hulk (1962) #384" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9243", | |
| "name": "Incredible Hulk (1962) #432" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 24, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/354", | |
| "name": "Avengers (1998 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/158", | |
| "name": "Avengers Vol. 1: World Trust (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/378", | |
| "name": "Earth X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1806", | |
| "name": "Earth X (New (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3374", | |
| "name": "Hulk (2008 - 2012)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6831", | |
| "name": "Hulk Vol. 1: Red Hulk (2009 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/924", | |
| "name": "Hulk: Destruction (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/465", | |
| "name": "Incredible Hulk (1999 - 2008)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2021", | |
| "name": "Incredible Hulk (1962 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2983", | |
| "name": "Incredible Hulk Annual (1968 - 1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/212", | |
| "name": "Incredible Hulk Vol. 4: Abominable (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/244", | |
| "name": "Incredible Hulk Vol. IV: Abominable (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/8842", | |
| "name": "Incredible Hulks (2009 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2572", | |
| "name": "Iron Man (1998 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/977", | |
| "name": "Irredeemable Ant-Man (2006 - 2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2423", | |
| "name": "Irredeemable Ant-Man Vol. 1: Low-Life (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3722", | |
| "name": "Killraven (2002 - 2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2437", | |
| "name": "Killraven Premiere (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1671", | |
| "name": "Marvel Masterworks: The Incredible Hulk Vol.3 (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2301", | |
| "name": "Marvel Super-Heroes (1992 - 1993)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 39, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/4946", | |
| "name": "4 of 4 - 4XLS", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/5496", | |
| "name": "1 of 6 -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/12370", | |
| "name": "Cover #12370", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/12372", | |
| "name": "Whosoever Harms the Hulk..!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18419", | |
| "name": "[none]", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18420", | |
| "name": "The Stars Mine Enemy", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18537", | |
| "name": "Warfare In Wonderland!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18539", | |
| "name": "The Abomination Proclamation!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18776", | |
| "name": "Cover #18776", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18914", | |
| "name": "Moving On", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18916", | |
| "name": "Green Canard", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18918", | |
| "name": "Small Talk", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19024", | |
| "name": "Shades of Green", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19081", | |
| "name": "Who Shall Fear The Green Goliath?", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19082", | |
| "name": "Last Legs", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19119", | |
| "name": "The Great Astonishment - Chapter One: Auld Lang Syne", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19122", | |
| "name": "The Great Astonishment - Chapter Two: The Edge of Universal Pain", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19124", | |
| "name": "The Strangest Story Of All Time!!", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19125", | |
| "name": "The Great Astonishment - Conclusion: It's All True!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/24932", | |
| "name": "Earth X Chapter Seven", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 2, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/296", | |
| "name": "Chaos War" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/253", | |
| "name": "Infinity Gauntlet" | |
| } | |
| ], | |
| "returned": 2 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/81/abomination?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Abomination?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009146/abomination_emil_blonsky?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1016823, | |
| "name": "Abomination (Ultimate)", | |
| "description": "", | |
| "modified": "2012-07-10T19:11:52-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1016823", | |
| "comics": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/15717", | |
| "name": "Ultimate X-Men (2000) #26" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1151", | |
| "name": "Ultimate X-Men Vol. 6: Return of the King (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1186", | |
| "name": "Ultimate X-Men Vol. VI: Return of the King (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/474", | |
| "name": "Ultimate X-Men (2000 - 2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/210", | |
| "name": "Ultimate X-Men Vol. 6: Return of the King (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/243", | |
| "name": "Ultimate X-Men Vol. VI: Return of the King (2003)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/31883", | |
| "name": "Free Preview of THE INCREDIBLE HULK #50", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/81/abomination?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1016823/abomination_ultimate?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009148, | |
| "name": "Absorbing Man", | |
| "description": "", | |
| "modified": "2013-10-24T14:32:08-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/1/b0/5269678709fb7", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009148", | |
| "comics": { | |
| "available": 44, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36481", | |
| "name": "Avengers Academy (2010) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36480", | |
| "name": "Avengers Academy (2010) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36479", | |
| "name": "Avengers Academy (2010) #18" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36484", | |
| "name": "Avengers Academy (2010) #19" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36489", | |
| "name": "Avengers Academy (2010) #21" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/6935", | |
| "name": "Avengers Annual (1967) #20" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12783", | |
| "name": "Captain America (1998) #24" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20427", | |
| "name": "Dazzler (1981) #18" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20428", | |
| "name": "Dazzler (1981) #19" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/41433", | |
| "name": "Fear Itself (2010) #2 (3rd Printing Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/38452", | |
| "name": "Fear Itself: Fellowship of Fear (2011) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/39848", | |
| "name": "Fear Itself: The Worthy (2011) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/40977", | |
| "name": "Fear Itself: The Worthy (2011) #7" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/55857", | |
| "name": "Illuminati (2015) #7" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9072", | |
| "name": "Incredible Hulk (1962) #261" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/29794", | |
| "name": "Iron Man 2.0 (2011) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/29795", | |
| "name": "Iron Man 2.0 (2011) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9698", | |
| "name": "Journey Into Mystery (1952) #122" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5234", | |
| "name": "Marvel Adventures Fantastic Four (2005) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/6277", | |
| "name": "Marvel Adventures Fantastic Four Vol. 5: All 4 One, 4 for All (Digest)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 30, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9086", | |
| "name": "Avengers Academy (2010 - 2012)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1988", | |
| "name": "Avengers Annual (1967 - 1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1997", | |
| "name": "Captain America (1998 - 2002)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3745", | |
| "name": "Dazzler (1981 - 1986)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13691", | |
| "name": "Fear Itself (2010 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13857", | |
| "name": "Fear Itself: Fellowship of Fear (2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13827", | |
| "name": "Fear Itself: The Worthy (2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/20084", | |
| "name": "Heroes for Hire (1997 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/20552", | |
| "name": "Illuminati (2015 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2021", | |
| "name": "Incredible Hulk (1962 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9924", | |
| "name": "Iron Man 2.0 (2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2032", | |
| "name": "Journey Into Mystery (1952 - 1966)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/926", | |
| "name": "Marvel Adventures Fantastic Four (2005 - 2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1959", | |
| "name": "Marvel Adventures Fantastic Four Vol. 5: All 4 One, 4 for All (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/14492", | |
| "name": "Marvel Masterworks: The Mighty Thor Vol. 3 (2011 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/14491", | |
| "name": "Marvel Masterworks: The Mighty Thor Vol. 3 Variant (DM Only) (2011 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1588", | |
| "name": "Marvel Masterworks: The Mighty Thor Vol. 4 (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2301", | |
| "name": "Marvel Super-Heroes (1992 - 1993)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1866", | |
| "name": "Mighty Avengers (2007 - 2010)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2059", | |
| "name": "Paradise X (2002 - 2003)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 45, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/4988", | |
| "name": "1 of 1", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11028", | |
| "name": "Journey Into Mystery (1952) #122", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/16688", | |
| "name": "Thor (1966) #206", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/16691", | |
| "name": "Thor (1966) #207", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17049", | |
| "name": "Thor (1966) #375", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17050", | |
| "name": "Shadows of the Past", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17051", | |
| "name": "Heroes Always Win...Don't They?", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17342", | |
| "name": "Cover #17342", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17412", | |
| "name": "A Wing and a Prayer", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18670", | |
| "name": "Encounter On Easter Island!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/21604", | |
| "name": "Secret Wars (1984) #6", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/21606", | |
| "name": "Secret Wars (1984) #7", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/26016", | |
| "name": "Paradise X Issue 0", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/26025", | |
| "name": "Cover #26025", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28708", | |
| "name": "The Hunted Part 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/31596", | |
| "name": "", | |
| "type": "pinup" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/31597", | |
| "name": "Downtown Demolition", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37745", | |
| "name": "A Wing and a Prayer", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/39926", | |
| "name": "And the Absorbing Man Makes Three!", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/39927", | |
| "name": "Hammer Time!", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 4, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/302", | |
| "name": "Fear Itself" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/270", | |
| "name": "Secret Wars" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/309", | |
| "name": "Shattered Heroes" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/273", | |
| "name": "Siege" | |
| } | |
| ], | |
| "returned": 4 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/84/absorbing_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Absorbing_Man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009148/absorbing_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009149, | |
| "name": "Abyss", | |
| "description": "", | |
| "modified": "2014-04-29T14:10:43-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/9/30/535feab462a64", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009149", | |
| "comics": { | |
| "available": 8, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13943", | |
| "name": "Uncanny X-Men (1963) #402" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13945", | |
| "name": "Uncanny X-Men (1963) #404" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13946", | |
| "name": "Uncanny X-Men (1963) #405" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13947", | |
| "name": "Uncanny X-Men (1963) #406" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13970", | |
| "name": "Uncanny X-Men (1963) #429" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13972", | |
| "name": "Uncanny X-Men (1963) #431" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12386", | |
| "name": "X-Men: Alpha (1994) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2539", | |
| "name": "X-Men: The Complete Age of Apocalypse Epic Book 2 (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 8 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2258", | |
| "name": "Uncanny X-Men (1963 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2104", | |
| "name": "X-Men: Alpha (1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1583", | |
| "name": "X-Men: The Complete Age of Apocalypse Epic Book 2 (2005)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 8, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/26281", | |
| "name": "A Beginning", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28352", | |
| "name": "Utility of Myth", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28356", | |
| "name": "Army Ants", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28358", | |
| "name": "Ballroom Blitzkrieg", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28360", | |
| "name": "Staring Contests are for Suckers", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28407", | |
| "name": "The Draco Part One: Sins of the Father", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28411", | |
| "name": "The Draco Part Three", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28413", | |
| "name": "The Draco Part Four", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 8 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/227", | |
| "name": "Age of Apocalypse" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/85/abyss?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Abyss_(alien)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009149/abyss?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010903, | |
| "name": "Abyss (Age of Apocalypse)", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/3/80/4c00358ec7548", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010903", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/85/abyss?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Abyss_(Age_of_Apocalypse)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010903/abyss_age_of_apocalypse?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011266, | |
| "name": "Adam Destine", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011266", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/2902/adam_destine?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Destine,_Adam?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011266/adam_destine?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010354, | |
| "name": "Adam Warlock", | |
| "description": "Adam Warlock is an artificially created human who was born in a cocoon at a scientific complex called The Beehive.", | |
| "modified": "2013-08-07T13:49:06-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/a/f0/5202887448860", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010354", | |
| "comics": { | |
| "available": 123, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17271", | |
| "name": "Annihilation: Conquest (2007) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17405", | |
| "name": "Annihilation: Conquest (2007) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17645", | |
| "name": "Annihilation: Conquest (2007) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20686", | |
| "name": "Annihilation: Conquest (2007) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20885", | |
| "name": "Annihilation: Conquest (2007) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21016", | |
| "name": "Annihilation: Conquest (2007) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12412", | |
| "name": "Avengers Forever (1998) #9" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1033", | |
| "name": "Avengers Legends Vol. I: Avengers Forever (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20731", | |
| "name": "Clandestine Classic Premiere (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20187", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988) #27" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20193", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988) #32" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20197", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988) #36" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8560", | |
| "name": "Earth X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8552", | |
| "name": "Earth X (1999) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8550", | |
| "name": "Earth X (1999) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4241", | |
| "name": "Earth X (New (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12975", | |
| "name": "Fantastic Four (1961) #172" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13195", | |
| "name": "Fantastic Four (1961) #370" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/25305", | |
| "name": "Guardians of the Galaxy (2008) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8988", | |
| "name": "Incredible Hulk (1962) #177" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 52, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3061", | |
| "name": "Annihilation: Conquest (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2111", | |
| "name": "Avengers Forever (1998 - 2001)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/93", | |
| "name": "Avengers Legends Vol. I: Avengers Forever (2002)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3874", | |
| "name": "Clandestine Classic Premiere (2008)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3741", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988 - 1996)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/378", | |
| "name": "Earth X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1806", | |
| "name": "Earth X (New (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2121", | |
| "name": "Fantastic Four (1961 - 1998)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/4885", | |
| "name": "Guardians of the Galaxy (2008 - 2010)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2021", | |
| "name": "Incredible Hulk (1962 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2983", | |
| "name": "Incredible Hulk Annual (1968 - 1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6673", | |
| "name": "Infinity Crusade (1993 - 2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6449", | |
| "name": "Infinity Crusade Vol. 1 (2008 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2023", | |
| "name": "Infinity Gauntlet (1991)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2024", | |
| "name": "Infinity War (1992)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2039", | |
| "name": "Marvel Comics Presents (1988 - 1995)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1697", | |
| "name": "Marvel Comics Presents: Wolverine Vol. 4 (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1837", | |
| "name": "Marvel Masterworks: Warlock Vol. (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2045", | |
| "name": "Marvel Premiere (1972 - 1981)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2301", | |
| "name": "Marvel Super-Heroes (1992 - 1993)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 142, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1412", | |
| "name": "Cover #1412", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1602", | |
| "name": "Cover #1602", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1800", | |
| "name": "Cover #1800", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1842", | |
| "name": "Cover #1842", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/12569", | |
| "name": "Cry, the Bedeviled Planet!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/13121", | |
| "name": "Forever Evil", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18500", | |
| "name": "Peril of the Paired Planets", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18501", | |
| "name": "Peril of the Paired Planets", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18503", | |
| "name": "Triumph On Terra-Two", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19847", | |
| "name": "Cover #19847", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19848", | |
| "name": "Performance", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19859", | |
| "name": "Days of Future Present Part 4", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19860", | |
| "name": "You Must Remember This", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19883", | |
| "name": "The Adventures of Lockheed the Space Dragon and His Pet Girl, Kitty", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19884", | |
| "name": "The Saga of Storm: Goddess of Thunder", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19885", | |
| "name": "There's No Place Like Home", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19887", | |
| "name": "Cover #19887", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19888", | |
| "name": "And Men Shall Call Him Warlock", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19911", | |
| "name": "Cover #19911", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19912", | |
| "name": "The Hounds of Helios", | |
| "type": "" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 10, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/293", | |
| "name": "Annihilation: Conquest" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/233", | |
| "name": "Atlantis Attacks" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/235", | |
| "name": "Blood and Thunder" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/240", | |
| "name": "Days of Future Present" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/302", | |
| "name": "Fear Itself" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/253", | |
| "name": "Infinity Gauntlet" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/29", | |
| "name": "Infinity War" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/263", | |
| "name": "Mutant Massacre" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/271", | |
| "name": "Secret Wars II" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/280", | |
| "name": "X-Tinction Agenda" | |
| } | |
| ], | |
| "returned": 10 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/2854/adam_warlock?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Warlock,_Adam?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010354/adam_warlock?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010846, | |
| "name": "Aegis (Trey Rollins)", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/5/e0/4c0035c9c425d", | |
| "extension": "gif" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010846", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/95/aegis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Aegis_%28Trey_Rollins%29?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010846/aegis_trey_rollins?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011297, | |
| "name": "Agent Brand", | |
| "description": "", | |
| "modified": "2013-10-24T13:09:30-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/4/60/52695285d6e7e", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011297", | |
| "comics": { | |
| "available": 5, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5477", | |
| "name": "Astonishing X-Men (2004) #19 (Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/38318", | |
| "name": "Astonishing X-Men (2004) #38" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/38319", | |
| "name": "Astonishing X-Men (2004) #40" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/40024", | |
| "name": "Astonishing X-Men (2004) #40 (I Am Captain America Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/39890", | |
| "name": "Heralds (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 5 | |
| }, | |
| "series": { | |
| "available": 2, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/744", | |
| "name": "Astonishing X-Men (2004 - 2013)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13065", | |
| "name": "Heralds (2010 - Present)" | |
| } | |
| ], | |
| "returned": 2 | |
| }, | |
| "stories": { | |
| "available": 5, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/3353", | |
| "name": "Interior #3353", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/89900", | |
| "name": "Astonishing X-Men (2004) #38", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/90548", | |
| "name": "Heralds TPB", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/90819", | |
| "name": "Interior #90819", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/90853", | |
| "name": " Interior Astonishing X-Men (2004) #40", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 5 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/100/agent_brand?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agent_Brand?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011297/agent_brand?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011031, | |
| "name": "Agent X (Nijo)", | |
| "description": "Originally a partner of the mind-altering assassin Black Swan, Nijo spied on Deadpool as part of the Swan's plan to exact revenge for Deadpool falsely taking credit for the Swan's assassination of the Four Winds crime family, which included Nijo's brother.", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011031", | |
| "comics": { | |
| "available": 10, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17702", | |
| "name": "Agent X (2002) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17709", | |
| "name": "Agent X (2002) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17710", | |
| "name": "Agent X (2002) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17711", | |
| "name": "Agent X (2002) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17712", | |
| "name": "Agent X (2002) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17713", | |
| "name": "Agent X (2002) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17704", | |
| "name": "Agent X (2002) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1649", | |
| "name": "Cable & Deadpool (2004) #12" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21845", | |
| "name": "Cable & Deadpool (2004) #46 (Zombie Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5761", | |
| "name": "Cable & Deadpool Vol. 2: The Burnt Offering (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 10 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/459", | |
| "name": "Agent X (2002 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/693", | |
| "name": "Cable & Deadpool (2004 - 2008)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1338", | |
| "name": "Cable & Deadpool Vol. 2: The Burnt Offering (2007)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 15, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/2484", | |
| "name": "2 of 2 - Thirty Pieces", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37514", | |
| "name": "Cover #37514", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37515", | |
| "name": "Dead Man's Switch Part One", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37518", | |
| "name": "Cover #37518", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37525", | |
| "name": "Cover #37525", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37526", | |
| "name": "Dead Man's Switch Part Two", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37527", | |
| "name": "Cover #37527", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37528", | |
| "name": "Dead Man's Switch Part Three", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37529", | |
| "name": "Cover #37529", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37530", | |
| "name": "Dead Man's Switch Part Four", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37531", | |
| "name": "Cover #37531", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37532", | |
| "name": "Dead Man's Switch Part Five", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37533", | |
| "name": "Cover #37533", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37534", | |
| "name": "Dead Man's Switch Part Six", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/94769", | |
| "name": "Cable & Deadpool (2004) #46, Zombie Variant", | |
| "type": "cover" | |
| } | |
| ], | |
| "returned": 15 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/101/agent_x?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agent_X_(Nijo)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011031/agent_x_nijo?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009150, | |
| "name": "Agent Zero", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/f/60/4c0042121d790", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009150", | |
| "comics": { | |
| "available": 20, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/3357", | |
| "name": "Weapon X: Days of Future Now (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2438", | |
| "name": "Weapon X: Days of Future Now (2005) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18293", | |
| "name": "What If? (1989) #-1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14182", | |
| "name": "Wolverine (1988) #60" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14183", | |
| "name": "Wolverine (1988) #61" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14184", | |
| "name": "Wolverine (1988) #62" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14185", | |
| "name": "Wolverine (1988) #63" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14186", | |
| "name": "Wolverine (1988) #64" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14189", | |
| "name": "Wolverine (1988) #67" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14190", | |
| "name": "Wolverine (1988) #68" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14211", | |
| "name": "Wolverine (1988) #87" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14107", | |
| "name": "Wolverine (1988) #163" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14110", | |
| "name": "Wolverine (1988) #166" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14121", | |
| "name": "Wolverine (1988) #176" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1023", | |
| "name": "Wolverine/Deadpool: Weapon X (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18176", | |
| "name": "X-Man (1995) #-1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14282", | |
| "name": "X-Men (1991) #10" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14293", | |
| "name": "X-Men (1991) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18132", | |
| "name": "X-Men Unlimited (1993) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18116", | |
| "name": "X-Men Unlimited (1993) #15" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 8, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1478", | |
| "name": "Weapon X: Days of Future Now (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/869", | |
| "name": "Weapon X: Days of Future Now (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3648", | |
| "name": "What If? (1989 - 1998)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2262", | |
| "name": "Wolverine (1988 - 2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/84", | |
| "name": "Wolverine/Deadpool: Weapon X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3643", | |
| "name": "X-Man (1995 - 2000)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2265", | |
| "name": "X-Men (1991 - 2001)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3637", | |
| "name": "X-Men Unlimited (1993 - 2003)" | |
| } | |
| ], | |
| "returned": 8 | |
| }, | |
| "stories": { | |
| "available": 20, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/4606", | |
| "name": "3 of 5 - 5XLS", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28706", | |
| "name": "The Hunted Part 2", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28712", | |
| "name": "The Hunted Part 5", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28738", | |
| "name": "The Logan Files Epilogue", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28881", | |
| "name": "Counting Coup", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28883", | |
| "name": "Nightmare Quest!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28885", | |
| "name": "Reunion!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28887", | |
| "name": "Bastions of Glory!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28889", | |
| "name": "What Goes Around...", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28895", | |
| "name": "Valley O' Death", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28897", | |
| "name": "Epsilon Red", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28941", | |
| "name": "Showdown In Lowtown", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/29125", | |
| "name": "Last Stand", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/29139", | |
| "name": "Over...Again", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38511", | |
| "name": "Second Contact", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38554", | |
| "name": "Among Us--A Sabretooth", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38555", | |
| "name": "The Whispers Scream", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38556", | |
| "name": "Sabretooth Vs. Maverick: Severed Ties", | |
| "type": "pinup" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38650", | |
| "name": "Maverick", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38903", | |
| "name": "Maverick", | |
| "type": "" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/102/agent_zero?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agent_Zero?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009150/agent_zero?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011198, | |
| "name": "Agents of Atlas", | |
| "description": "", | |
| "modified": "2010-11-17T14:36:25-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/9/a0/4ce18a834b7f5", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011198", | |
| "comics": { | |
| "available": 31, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/6318", | |
| "name": "Agents of Atlas (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23659", | |
| "name": "Agents of Atlas (2009) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4801", | |
| "name": "Agents of Atlas (2006) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23660", | |
| "name": "Agents of Atlas (2009) #1 (50/50 COVER)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5089", | |
| "name": "Agents of Atlas (2006) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23825", | |
| "name": "Agents of Atlas (2009) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23824", | |
| "name": "Agents of Atlas (2009) #2 (MCGUINNESS VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/27402", | |
| "name": "Agents of Atlas (2009) #2 (BACHALO 2ND PRINTING VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5241", | |
| "name": "Agents of Atlas (2006) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24015", | |
| "name": "Agents of Atlas (2009) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24016", | |
| "name": "Agents of Atlas (2009) #3 (MCGUINNESS VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24017", | |
| "name": "Agents of Atlas (2009) #3 (Wolverine Art Appreciation Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5404", | |
| "name": "Agents of Atlas (2006) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24219", | |
| "name": "Agents of Atlas (2009) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5665", | |
| "name": "Agents of Atlas (2006) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24221", | |
| "name": "Agents of Atlas (2009) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24222", | |
| "name": "Agents of Atlas (2009) #5 (MCGUINNESS VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24360", | |
| "name": "Agents of Atlas (2009) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5842", | |
| "name": "Agents of Atlas (2006) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24361", | |
| "name": "Agents of Atlas (2009) #7" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 4, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6807", | |
| "name": "Agents of Atlas (2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1980", | |
| "name": "Agents of Atlas (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1097", | |
| "name": "Agents of Atlas (2006 - 2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9181", | |
| "name": "Avengers Vs. Atlas (2010)" | |
| } | |
| ], | |
| "returned": 4 | |
| }, | |
| "stories": { | |
| "available": 38, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6008", | |
| "name": "1 of 6 - 6 XLS-", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6009", | |
| "name": "1 of 6 - 6 XLS-", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6010", | |
| "name": "2 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6011", | |
| "name": "2 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6012", | |
| "name": "3 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6013", | |
| "name": "3 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6014", | |
| "name": "4 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6015", | |
| "name": "4 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6016", | |
| "name": "5 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6017", | |
| "name": "5 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6018", | |
| "name": "5 of 6 - Story A - 6XLS", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6019", | |
| "name": "5 of 6 - Story A - 6XLS", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52393", | |
| "name": "1 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52395", | |
| "name": "1 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52861", | |
| "name": "2 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52863", | |
| "name": "2 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53263", | |
| "name": "3 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53265", | |
| "name": "3 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53266", | |
| "name": "3 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53669", | |
| "name": "1 of 2", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/318", | |
| "name": "Dark Reign" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/103/agents_of_atlas?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agents_of_Atlas?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011198/agents_of_atlas?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011175, | |
| "name": "Aginar", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011175", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/105/aginar?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Aginar?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011175/aginar?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011136, | |
| "name": "Air-Walker (Gabriel Lan)", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011136", | |
| "comics": { | |
| "available": 4, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4108", | |
| "name": "Annihilation: Silver Surfer (2006) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5589", | |
| "name": "Heroes Reborn: Iron Man (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/16330", | |
| "name": "Iron Man (1996) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/16331", | |
| "name": "Iron Man (1996) #12" | |
| } | |
| ], | |
| "returned": 4 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1078", | |
| "name": "Annihilation: Silver Surfer (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1814", | |
| "name": "Heroes Reborn: Iron Man (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13577", | |
| "name": "Iron Man (1996 - 1998)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/5925", | |
| "name": "Annihilation: Silver Surfer (2006) #1", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34082", | |
| "name": "Magical Mystery Tour", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34085", | |
| "name": "Matters of the Heart", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/229", | |
| "name": "Annihilation" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/109/air-walker?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Air-Walker_(Gabriel_Lan)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011136/air-walker_gabriel_lan?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011176, | |
| "name": "Ajak", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/2/80/4c002f35c5215", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011176", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/111/ajak?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Ajak?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011176/ajak?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010870, | |
| "name": "Ajaxis", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/70/4c0035adc7d3a", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010870", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/113/ajaxis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Ajaxis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010870/ajaxis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| }; | |
| console.log(response); | |
| const { Schema, normalize, arrayOf } = require('normalizr'); | |
| const character = new Schema('characters'); | |
| const comic = new Schema('comics', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| const event = new Schema('events', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| const series = new Schema('series', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| const story = new Schema('stories', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| character.define({ | |
| comics: { items: arrayOf(comic) }, | |
| events: { items: arrayOf(event) }, | |
| series: { items: arrayOf(series) }, | |
| stories: { items: arrayOf(story) } | |
| }); | |
| const dataSchema = { | |
| data: { | |
| results: arrayOf(character) | |
| } | |
| }; | |
| const result = normalize(response, dataSchema); | |
| console.log(result); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| setTimeout(function(){ | |
| ;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
| 'use strict'; | |
| Object.defineProperty(exports, "__esModule", { | |
| value: true | |
| }); | |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | |
| var EntitySchema = function () { | |
| function EntitySchema(key) { | |
| var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | |
| _classCallCheck(this, EntitySchema); | |
| if (!key || typeof key !== 'string') { | |
| throw new Error('A string non-empty key is required'); | |
| } | |
| this._key = key; | |
| this._assignEntity = options.assignEntity; | |
| var idAttribute = options.idAttribute || 'id'; | |
| this._getId = typeof idAttribute === 'function' ? idAttribute : function (x) { | |
| return x[idAttribute]; | |
| }; | |
| this._idAttribute = idAttribute; | |
| this._meta = options.meta; | |
| this._defaults = options.defaults; | |
| } | |
| _createClass(EntitySchema, [{ | |
| key: 'getAssignEntity', | |
| value: function getAssignEntity() { | |
| return this._assignEntity; | |
| } | |
| }, { | |
| key: 'getKey', | |
| value: function getKey() { | |
| return this._key; | |
| } | |
| }, { | |
| key: 'getId', | |
| value: function getId(entity) { | |
| return this._getId(entity); | |
| } | |
| }, { | |
| key: 'getIdAttribute', | |
| value: function getIdAttribute() { | |
| return this._idAttribute; | |
| } | |
| }, { | |
| key: 'getMeta', | |
| value: function getMeta(prop) { | |
| if (!prop || typeof prop !== 'string') { | |
| throw new Error('A string non-empty property name is required'); | |
| } | |
| return this._meta && this._meta[prop]; | |
| } | |
| }, { | |
| key: 'getDefaults', | |
| value: function getDefaults() { | |
| return this._defaults; | |
| } | |
| }, { | |
| key: 'define', | |
| value: function define(nestedSchema) { | |
| for (var key in nestedSchema) { | |
| if (nestedSchema.hasOwnProperty(key)) { | |
| this[key] = nestedSchema[key]; | |
| } | |
| } | |
| } | |
| }]); | |
| return EntitySchema; | |
| }(); | |
| exports.default = EntitySchema; | |
| },{}],2:[function(require,module,exports){ | |
| 'use strict'; | |
| Object.defineProperty(exports, "__esModule", { | |
| value: true | |
| }); | |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | |
| var _isObject = require('lodash/isObject'); | |
| var _isObject2 = _interopRequireDefault(_isObject); | |
| var _UnionSchema = require('./UnionSchema'); | |
| var _UnionSchema2 = _interopRequireDefault(_UnionSchema); | |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | |
| var ArraySchema = function () { | |
| function ArraySchema(itemSchema) { | |
| var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | |
| _classCallCheck(this, ArraySchema); | |
| if (!(0, _isObject2.default)(itemSchema)) { | |
| throw new Error('ArraySchema requires item schema to be an object.'); | |
| } | |
| if (options.schemaAttribute) { | |
| var schemaAttribute = options.schemaAttribute; | |
| this._itemSchema = new _UnionSchema2.default(itemSchema, { schemaAttribute: schemaAttribute }); | |
| } else { | |
| this._itemSchema = itemSchema; | |
| } | |
| } | |
| _createClass(ArraySchema, [{ | |
| key: 'getItemSchema', | |
| value: function getItemSchema() { | |
| return this._itemSchema; | |
| } | |
| }]); | |
| return ArraySchema; | |
| }(); | |
| exports.default = ArraySchema; | |
| },{"./UnionSchema":3,"lodash/isObject":80}],3:[function(require,module,exports){ | |
| 'use strict'; | |
| Object.defineProperty(exports, "__esModule", { | |
| value: true | |
| }); | |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | |
| var _isObject = require('lodash/isObject'); | |
| var _isObject2 = _interopRequireDefault(_isObject); | |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | |
| var UnionSchema = function () { | |
| function UnionSchema(itemSchema, options) { | |
| _classCallCheck(this, UnionSchema); | |
| if (!(0, _isObject2.default)(itemSchema)) { | |
| throw new Error('UnionSchema requires item schema to be an object.'); | |
| } | |
| if (!options || !options.schemaAttribute) { | |
| throw new Error('UnionSchema requires schemaAttribute option.'); | |
| } | |
| this._itemSchema = itemSchema; | |
| var schemaAttribute = options.schemaAttribute; | |
| this._getSchema = typeof schemaAttribute === 'function' ? schemaAttribute : function (x) { | |
| return x[schemaAttribute]; | |
| }; | |
| } | |
| _createClass(UnionSchema, [{ | |
| key: 'getItemSchema', | |
| value: function getItemSchema() { | |
| return this._itemSchema; | |
| } | |
| }, { | |
| key: 'getSchemaKey', | |
| value: function getSchemaKey(item) { | |
| return this._getSchema(item); | |
| } | |
| }]); | |
| return UnionSchema; | |
| }(); | |
| exports.default = UnionSchema; | |
| },{"lodash/isObject":80}],4:[function(require,module,exports){ | |
| var getNative = require('./_getNative'), | |
| root = require('./_root'); | |
| /* Built-in method references that are verified to be native. */ | |
| var DataView = getNative(root, 'DataView'); | |
| module.exports = DataView; | |
| },{"./_getNative":35,"./_root":62}],5:[function(require,module,exports){ | |
| var hashClear = require('./_hashClear'), | |
| hashDelete = require('./_hashDelete'), | |
| hashGet = require('./_hashGet'), | |
| hashHas = require('./_hashHas'), | |
| hashSet = require('./_hashSet'); | |
| /** | |
| * Creates a hash object. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */ | |
| function Hash(entries) { | |
| var index = -1, | |
| length = entries ? entries.length : 0; | |
| this.clear(); | |
| while (++index < length) { | |
| var entry = entries[index]; | |
| this.set(entry[0], entry[1]); | |
| } | |
| } | |
| // Add methods to `Hash`. | |
| Hash.prototype.clear = hashClear; | |
| Hash.prototype['delete'] = hashDelete; | |
| Hash.prototype.get = hashGet; | |
| Hash.prototype.has = hashHas; | |
| Hash.prototype.set = hashSet; | |
| module.exports = Hash; | |
| },{"./_hashClear":38,"./_hashDelete":39,"./_hashGet":40,"./_hashHas":41,"./_hashSet":42}],6:[function(require,module,exports){ | |
| var listCacheClear = require('./_listCacheClear'), | |
| listCacheDelete = require('./_listCacheDelete'), | |
| listCacheGet = require('./_listCacheGet'), | |
| listCacheHas = require('./_listCacheHas'), | |
| listCacheSet = require('./_listCacheSet'); | |
| /** | |
| * Creates an list cache object. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */ | |
| function ListCache(entries) { | |
| var index = -1, | |
| length = entries ? entries.length : 0; | |
| this.clear(); | |
| while (++index < length) { | |
| var entry = entries[index]; | |
| this.set(entry[0], entry[1]); | |
| } | |
| } | |
| // Add methods to `ListCache`. | |
| ListCache.prototype.clear = listCacheClear; | |
| ListCache.prototype['delete'] = listCacheDelete; | |
| ListCache.prototype.get = listCacheGet; | |
| ListCache.prototype.has = listCacheHas; | |
| ListCache.prototype.set = listCacheSet; | |
| module.exports = ListCache; | |
| },{"./_listCacheClear":47,"./_listCacheDelete":48,"./_listCacheGet":49,"./_listCacheHas":50,"./_listCacheSet":51}],7:[function(require,module,exports){ | |
| var getNative = require('./_getNative'), | |
| root = require('./_root'); | |
| /* Built-in method references that are verified to be native. */ | |
| var Map = getNative(root, 'Map'); | |
| module.exports = Map; | |
| },{"./_getNative":35,"./_root":62}],8:[function(require,module,exports){ | |
| var mapCacheClear = require('./_mapCacheClear'), | |
| mapCacheDelete = require('./_mapCacheDelete'), | |
| mapCacheGet = require('./_mapCacheGet'), | |
| mapCacheHas = require('./_mapCacheHas'), | |
| mapCacheSet = require('./_mapCacheSet'); | |
| /** | |
| * Creates a map cache object to store key-value pairs. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */ | |
| function MapCache(entries) { | |
| var index = -1, | |
| length = entries ? entries.length : 0; | |
| this.clear(); | |
| while (++index < length) { | |
| var entry = entries[index]; | |
| this.set(entry[0], entry[1]); | |
| } | |
| } | |
| // Add methods to `MapCache`. | |
| MapCache.prototype.clear = mapCacheClear; | |
| MapCache.prototype['delete'] = mapCacheDelete; | |
| MapCache.prototype.get = mapCacheGet; | |
| MapCache.prototype.has = mapCacheHas; | |
| MapCache.prototype.set = mapCacheSet; | |
| module.exports = MapCache; | |
| },{"./_mapCacheClear":52,"./_mapCacheDelete":53,"./_mapCacheGet":54,"./_mapCacheHas":55,"./_mapCacheSet":56}],9:[function(require,module,exports){ | |
| var getNative = require('./_getNative'), | |
| root = require('./_root'); | |
| /* Built-in method references that are verified to be native. */ | |
| var Promise = getNative(root, 'Promise'); | |
| module.exports = Promise; | |
| },{"./_getNative":35,"./_root":62}],10:[function(require,module,exports){ | |
| var getNative = require('./_getNative'), | |
| root = require('./_root'); | |
| /* Built-in method references that are verified to be native. */ | |
| var Set = getNative(root, 'Set'); | |
| module.exports = Set; | |
| },{"./_getNative":35,"./_root":62}],11:[function(require,module,exports){ | |
| var MapCache = require('./_MapCache'), | |
| setCacheAdd = require('./_setCacheAdd'), | |
| setCacheHas = require('./_setCacheHas'); | |
| /** | |
| * | |
| * Creates an array cache object to store unique values. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [values] The values to cache. | |
| */ | |
| function SetCache(values) { | |
| var index = -1, | |
| length = values ? values.length : 0; | |
| this.__data__ = new MapCache; | |
| while (++index < length) { | |
| this.add(values[index]); | |
| } | |
| } | |
| // Add methods to `SetCache`. | |
| SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; | |
| SetCache.prototype.has = setCacheHas; | |
| module.exports = SetCache; | |
| },{"./_MapCache":8,"./_setCacheAdd":63,"./_setCacheHas":64}],12:[function(require,module,exports){ | |
| var ListCache = require('./_ListCache'), | |
| stackClear = require('./_stackClear'), | |
| stackDelete = require('./_stackDelete'), | |
| stackGet = require('./_stackGet'), | |
| stackHas = require('./_stackHas'), | |
| stackSet = require('./_stackSet'); | |
| /** | |
| * Creates a stack cache object to store key-value pairs. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */ | |
| function Stack(entries) { | |
| var data = this.__data__ = new ListCache(entries); | |
| this.size = data.size; | |
| } | |
| // Add methods to `Stack`. | |
| Stack.prototype.clear = stackClear; | |
| Stack.prototype['delete'] = stackDelete; | |
| Stack.prototype.get = stackGet; | |
| Stack.prototype.has = stackHas; | |
| Stack.prototype.set = stackSet; | |
| module.exports = Stack; | |
| },{"./_ListCache":6,"./_stackClear":66,"./_stackDelete":67,"./_stackGet":68,"./_stackHas":69,"./_stackSet":70}],13:[function(require,module,exports){ | |
| var root = require('./_root'); | |
| /** Built-in value references. */ | |
| var Symbol = root.Symbol; | |
| module.exports = Symbol; | |
| },{"./_root":62}],14:[function(require,module,exports){ | |
| var root = require('./_root'); | |
| /** Built-in value references. */ | |
| var Uint8Array = root.Uint8Array; | |
| module.exports = Uint8Array; | |
| },{"./_root":62}],15:[function(require,module,exports){ | |
| var getNative = require('./_getNative'), | |
| root = require('./_root'); | |
| /* Built-in method references that are verified to be native. */ | |
| var WeakMap = getNative(root, 'WeakMap'); | |
| module.exports = WeakMap; | |
| },{"./_getNative":35,"./_root":62}],16:[function(require,module,exports){ | |
| var baseTimes = require('./_baseTimes'), | |
| isArguments = require('./isArguments'), | |
| isArray = require('./isArray'), | |
| isBuffer = require('./isBuffer'), | |
| isIndex = require('./_isIndex'), | |
| isTypedArray = require('./isTypedArray'); | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** | |
| * Creates an array of the enumerable property names of the array-like `value`. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @param {boolean} inherited Specify returning inherited property names. | |
| * @returns {Array} Returns the array of property names. | |
| */ | |
| function arrayLikeKeys(value, inherited) { | |
| var isArr = isArray(value), | |
| isArg = !isArr && isArguments(value), | |
| isBuff = !isArr && !isArg && isBuffer(value), | |
| isType = !isArr && !isArg && !isBuff && isTypedArray(value), | |
| skipIndexes = isArr || isArg || isBuff || isType, | |
| result = skipIndexes ? baseTimes(value.length, String) : [], | |
| length = result.length; | |
| for (var key in value) { | |
| if ((inherited || hasOwnProperty.call(value, key)) && | |
| !(skipIndexes && ( | |
| // Safari 9 has enumerable `arguments.length` in strict mode. | |
| key == 'length' || | |
| // Node.js 0.10 has enumerable non-index properties on buffers. | |
| (isBuff && (key == 'offset' || key == 'parent')) || | |
| // PhantomJS 2 has enumerable non-index properties on typed arrays. | |
| (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || | |
| // Skip index properties. | |
| isIndex(key, length) | |
| ))) { | |
| result.push(key); | |
| } | |
| } | |
| return result; | |
| } | |
| module.exports = arrayLikeKeys; | |
| },{"./_baseTimes":26,"./_isIndex":43,"./isArguments":73,"./isArray":74,"./isBuffer":76,"./isTypedArray":82}],17:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.some` for arrays without support for iteratee | |
| * shorthands. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to iterate over. | |
| * @param {Function} predicate The function invoked per iteration. | |
| * @returns {boolean} Returns `true` if any element passes the predicate check, | |
| * else `false`. | |
| */ | |
| function arraySome(array, predicate) { | |
| var index = -1, | |
| length = array ? array.length : 0; | |
| while (++index < length) { | |
| if (predicate(array[index], index, array)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| module.exports = arraySome; | |
| },{}],18:[function(require,module,exports){ | |
| var eq = require('./eq'); | |
| /** | |
| * Gets the index at which the `key` is found in `array` of key-value pairs. | |
| * | |
| * @private | |
| * @param {Array} array The array to inspect. | |
| * @param {*} key The key to search for. | |
| * @returns {number} Returns the index of the matched value, else `-1`. | |
| */ | |
| function assocIndexOf(array, key) { | |
| var length = array.length; | |
| while (length--) { | |
| if (eq(array[length][0], key)) { | |
| return length; | |
| } | |
| } | |
| return -1; | |
| } | |
| module.exports = assocIndexOf; | |
| },{"./eq":72}],19:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */ | |
| var objectToString = objectProto.toString; | |
| /** | |
| * The base implementation of `getTag`. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @returns {string} Returns the `toStringTag`. | |
| */ | |
| function baseGetTag(value) { | |
| return objectToString.call(value); | |
| } | |
| module.exports = baseGetTag; | |
| },{}],20:[function(require,module,exports){ | |
| var isObjectLike = require('./isObjectLike'); | |
| /** `Object#toString` result references. */ | |
| var argsTag = '[object Arguments]'; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */ | |
| var objectToString = objectProto.toString; | |
| /** | |
| * The base implementation of `_.isArguments`. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an `arguments` object, | |
| */ | |
| function baseIsArguments(value) { | |
| return isObjectLike(value) && objectToString.call(value) == argsTag; | |
| } | |
| module.exports = baseIsArguments; | |
| },{"./isObjectLike":81}],21:[function(require,module,exports){ | |
| var baseIsEqualDeep = require('./_baseIsEqualDeep'), | |
| isObject = require('./isObject'), | |
| isObjectLike = require('./isObjectLike'); | |
| /** | |
| * The base implementation of `_.isEqual` which supports partial comparisons | |
| * and tracks traversed objects. | |
| * | |
| * @private | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @param {Function} [customizer] The function to customize comparisons. | |
| * @param {boolean} [bitmask] The bitmask of comparison flags. | |
| * The bitmask may be composed of the following flags: | |
| * 1 - Unordered comparison | |
| * 2 - Partial comparison | |
| * @param {Object} [stack] Tracks traversed `value` and `other` objects. | |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
| */ | |
| function baseIsEqual(value, other, customizer, bitmask, stack) { | |
| if (value === other) { | |
| return true; | |
| } | |
| if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { | |
| return value !== value && other !== other; | |
| } | |
| return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); | |
| } | |
| module.exports = baseIsEqual; | |
| },{"./_baseIsEqualDeep":22,"./isObject":80,"./isObjectLike":81}],22:[function(require,module,exports){ | |
| var Stack = require('./_Stack'), | |
| equalArrays = require('./_equalArrays'), | |
| equalByTag = require('./_equalByTag'), | |
| equalObjects = require('./_equalObjects'), | |
| getTag = require('./_getTag'), | |
| isArray = require('./isArray'), | |
| isBuffer = require('./isBuffer'), | |
| isTypedArray = require('./isTypedArray'); | |
| /** Used to compose bitmasks for comparison styles. */ | |
| var PARTIAL_COMPARE_FLAG = 2; | |
| /** `Object#toString` result references. */ | |
| var argsTag = '[object Arguments]', | |
| arrayTag = '[object Array]', | |
| objectTag = '[object Object]'; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** | |
| * A specialized version of `baseIsEqual` for arrays and objects which performs | |
| * deep comparisons and tracks traversed objects enabling objects with circular | |
| * references to be compared. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Function} [customizer] The function to customize comparisons. | |
| * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` | |
| * for more details. | |
| * @param {Object} [stack] Tracks traversed `object` and `other` objects. | |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
| */ | |
| function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { | |
| var objIsArr = isArray(object), | |
| othIsArr = isArray(other), | |
| objTag = arrayTag, | |
| othTag = arrayTag; | |
| if (!objIsArr) { | |
| objTag = getTag(object); | |
| objTag = objTag == argsTag ? objectTag : objTag; | |
| } | |
| if (!othIsArr) { | |
| othTag = getTag(other); | |
| othTag = othTag == argsTag ? objectTag : othTag; | |
| } | |
| var objIsObj = objTag == objectTag, | |
| othIsObj = othTag == objectTag, | |
| isSameTag = objTag == othTag; | |
| if (isSameTag && isBuffer(object)) { | |
| if (!isBuffer(other)) { | |
| return false; | |
| } | |
| objIsArr = true; | |
| objIsObj = false; | |
| } | |
| if (isSameTag && !objIsObj) { | |
| stack || (stack = new Stack); | |
| return (objIsArr || isTypedArray(object)) | |
| ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) | |
| : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); | |
| } | |
| if (!(bitmask & PARTIAL_COMPARE_FLAG)) { | |
| var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), | |
| othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); | |
| if (objIsWrapped || othIsWrapped) { | |
| var objUnwrapped = objIsWrapped ? object.value() : object, | |
| othUnwrapped = othIsWrapped ? other.value() : other; | |
| stack || (stack = new Stack); | |
| return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack); | |
| } | |
| } | |
| if (!isSameTag) { | |
| return false; | |
| } | |
| stack || (stack = new Stack); | |
| return equalObjects(object, other, equalFunc, customizer, bitmask, stack); | |
| } | |
| module.exports = baseIsEqualDeep; | |
| },{"./_Stack":12,"./_equalArrays":30,"./_equalByTag":31,"./_equalObjects":32,"./_getTag":36,"./isArray":74,"./isBuffer":76,"./isTypedArray":82}],23:[function(require,module,exports){ | |
| var isFunction = require('./isFunction'), | |
| isMasked = require('./_isMasked'), | |
| isObject = require('./isObject'), | |
| toSource = require('./_toSource'); | |
| /** | |
| * Used to match `RegExp` | |
| * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). | |
| */ | |
| var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; | |
| /** Used to detect host constructors (Safari). */ | |
| var reIsHostCtor = /^\[object .+?Constructor\]$/; | |
| /** Used for built-in method references. */ | |
| var funcProto = Function.prototype, | |
| objectProto = Object.prototype; | |
| /** Used to resolve the decompiled source of functions. */ | |
| var funcToString = funcProto.toString; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** Used to detect if a method is native. */ | |
| var reIsNative = RegExp('^' + | |
| funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') | |
| .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' | |
| ); | |
| /** | |
| * The base implementation of `_.isNative` without bad shim checks. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a native function, | |
| * else `false`. | |
| */ | |
| function baseIsNative(value) { | |
| if (!isObject(value) || isMasked(value)) { | |
| return false; | |
| } | |
| var pattern = isFunction(value) ? reIsNative : reIsHostCtor; | |
| return pattern.test(toSource(value)); | |
| } | |
| module.exports = baseIsNative; | |
| },{"./_isMasked":45,"./_toSource":71,"./isFunction":78,"./isObject":80}],24:[function(require,module,exports){ | |
| var isLength = require('./isLength'), | |
| isObjectLike = require('./isObjectLike'); | |
| /** `Object#toString` result references. */ | |
| var argsTag = '[object Arguments]', | |
| arrayTag = '[object Array]', | |
| boolTag = '[object Boolean]', | |
| dateTag = '[object Date]', | |
| errorTag = '[object Error]', | |
| funcTag = '[object Function]', | |
| mapTag = '[object Map]', | |
| numberTag = '[object Number]', | |
| objectTag = '[object Object]', | |
| regexpTag = '[object RegExp]', | |
| setTag = '[object Set]', | |
| stringTag = '[object String]', | |
| weakMapTag = '[object WeakMap]'; | |
| var arrayBufferTag = '[object ArrayBuffer]', | |
| dataViewTag = '[object DataView]', | |
| float32Tag = '[object Float32Array]', | |
| float64Tag = '[object Float64Array]', | |
| int8Tag = '[object Int8Array]', | |
| int16Tag = '[object Int16Array]', | |
| int32Tag = '[object Int32Array]', | |
| uint8Tag = '[object Uint8Array]', | |
| uint8ClampedTag = '[object Uint8ClampedArray]', | |
| uint16Tag = '[object Uint16Array]', | |
| uint32Tag = '[object Uint32Array]'; | |
| /** Used to identify `toStringTag` values of typed arrays. */ | |
| var typedArrayTags = {}; | |
| typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = | |
| typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = | |
| typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = | |
| typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = | |
| typedArrayTags[uint32Tag] = true; | |
| typedArrayTags[argsTag] = typedArrayTags[arrayTag] = | |
| typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = | |
| typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = | |
| typedArrayTags[errorTag] = typedArrayTags[funcTag] = | |
| typedArrayTags[mapTag] = typedArrayTags[numberTag] = | |
| typedArrayTags[objectTag] = typedArrayTags[regexpTag] = | |
| typedArrayTags[setTag] = typedArrayTags[stringTag] = | |
| typedArrayTags[weakMapTag] = false; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */ | |
| var objectToString = objectProto.toString; | |
| /** | |
| * The base implementation of `_.isTypedArray` without Node.js optimizations. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. | |
| */ | |
| function baseIsTypedArray(value) { | |
| return isObjectLike(value) && | |
| isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; | |
| } | |
| module.exports = baseIsTypedArray; | |
| },{"./isLength":79,"./isObjectLike":81}],25:[function(require,module,exports){ | |
| var isPrototype = require('./_isPrototype'), | |
| nativeKeys = require('./_nativeKeys'); | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** | |
| * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| */ | |
| function baseKeys(object) { | |
| if (!isPrototype(object)) { | |
| return nativeKeys(object); | |
| } | |
| var result = []; | |
| for (var key in Object(object)) { | |
| if (hasOwnProperty.call(object, key) && key != 'constructor') { | |
| result.push(key); | |
| } | |
| } | |
| return result; | |
| } | |
| module.exports = baseKeys; | |
| },{"./_isPrototype":46,"./_nativeKeys":59}],26:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.times` without support for iteratee shorthands | |
| * or max array length checks. | |
| * | |
| * @private | |
| * @param {number} n The number of times to invoke `iteratee`. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Array} Returns the array of results. | |
| */ | |
| function baseTimes(n, iteratee) { | |
| var index = -1, | |
| result = Array(n); | |
| while (++index < n) { | |
| result[index] = iteratee(index); | |
| } | |
| return result; | |
| } | |
| module.exports = baseTimes; | |
| },{}],27:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.unary` without support for storing metadata. | |
| * | |
| * @private | |
| * @param {Function} func The function to cap arguments for. | |
| * @returns {Function} Returns the new capped function. | |
| */ | |
| function baseUnary(func) { | |
| return function(value) { | |
| return func(value); | |
| }; | |
| } | |
| module.exports = baseUnary; | |
| },{}],28:[function(require,module,exports){ | |
| /** | |
| * Checks if a `cache` value for `key` exists. | |
| * | |
| * @private | |
| * @param {Object} cache The cache to query. | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function cacheHas(cache, key) { | |
| return cache.has(key); | |
| } | |
| module.exports = cacheHas; | |
| },{}],29:[function(require,module,exports){ | |
| var root = require('./_root'); | |
| /** Used to detect overreaching core-js shims. */ | |
| var coreJsData = root['__core-js_shared__']; | |
| module.exports = coreJsData; | |
| },{"./_root":62}],30:[function(require,module,exports){ | |
| var SetCache = require('./_SetCache'), | |
| arraySome = require('./_arraySome'), | |
| cacheHas = require('./_cacheHas'); | |
| /** Used to compose bitmasks for comparison styles. */ | |
| var UNORDERED_COMPARE_FLAG = 1, | |
| PARTIAL_COMPARE_FLAG = 2; | |
| /** | |
| * A specialized version of `baseIsEqualDeep` for arrays with support for | |
| * partial deep comparisons. | |
| * | |
| * @private | |
| * @param {Array} array The array to compare. | |
| * @param {Array} other The other array to compare. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` | |
| * for more details. | |
| * @param {Object} stack Tracks traversed `array` and `other` objects. | |
| * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. | |
| */ | |
| function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { | |
| var isPartial = bitmask & PARTIAL_COMPARE_FLAG, | |
| arrLength = array.length, | |
| othLength = other.length; | |
| if (arrLength != othLength && !(isPartial && othLength > arrLength)) { | |
| return false; | |
| } | |
| // Assume cyclic values are equal. | |
| var stacked = stack.get(array); | |
| if (stacked && stack.get(other)) { | |
| return stacked == other; | |
| } | |
| var index = -1, | |
| result = true, | |
| seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; | |
| stack.set(array, other); | |
| stack.set(other, array); | |
| // Ignore non-index properties. | |
| while (++index < arrLength) { | |
| var arrValue = array[index], | |
| othValue = other[index]; | |
| if (customizer) { | |
| var compared = isPartial | |
| ? customizer(othValue, arrValue, index, other, array, stack) | |
| : customizer(arrValue, othValue, index, array, other, stack); | |
| } | |
| if (compared !== undefined) { | |
| if (compared) { | |
| continue; | |
| } | |
| result = false; | |
| break; | |
| } | |
| // Recursively compare arrays (susceptible to call stack limits). | |
| if (seen) { | |
| if (!arraySome(other, function(othValue, othIndex) { | |
| if (!cacheHas(seen, othIndex) && | |
| (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { | |
| return seen.push(othIndex); | |
| } | |
| })) { | |
| result = false; | |
| break; | |
| } | |
| } else if (!( | |
| arrValue === othValue || | |
| equalFunc(arrValue, othValue, customizer, bitmask, stack) | |
| )) { | |
| result = false; | |
| break; | |
| } | |
| } | |
| stack['delete'](array); | |
| stack['delete'](other); | |
| return result; | |
| } | |
| module.exports = equalArrays; | |
| },{"./_SetCache":11,"./_arraySome":17,"./_cacheHas":28}],31:[function(require,module,exports){ | |
| var Symbol = require('./_Symbol'), | |
| Uint8Array = require('./_Uint8Array'), | |
| eq = require('./eq'), | |
| equalArrays = require('./_equalArrays'), | |
| mapToArray = require('./_mapToArray'), | |
| setToArray = require('./_setToArray'); | |
| /** Used to compose bitmasks for comparison styles. */ | |
| var UNORDERED_COMPARE_FLAG = 1, | |
| PARTIAL_COMPARE_FLAG = 2; | |
| /** `Object#toString` result references. */ | |
| var boolTag = '[object Boolean]', | |
| dateTag = '[object Date]', | |
| errorTag = '[object Error]', | |
| mapTag = '[object Map]', | |
| numberTag = '[object Number]', | |
| regexpTag = '[object RegExp]', | |
| setTag = '[object Set]', | |
| stringTag = '[object String]', | |
| symbolTag = '[object Symbol]'; | |
| var arrayBufferTag = '[object ArrayBuffer]', | |
| dataViewTag = '[object DataView]'; | |
| /** Used to convert symbols to primitives and strings. */ | |
| var symbolProto = Symbol ? Symbol.prototype : undefined, | |
| symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; | |
| /** | |
| * A specialized version of `baseIsEqualDeep` for comparing objects of | |
| * the same `toStringTag`. | |
| * | |
| * **Note:** This function only supports comparing values with tags of | |
| * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {string} tag The `toStringTag` of the objects to compare. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` | |
| * for more details. | |
| * @param {Object} stack Tracks traversed `object` and `other` objects. | |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
| */ | |
| function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { | |
| switch (tag) { | |
| case dataViewTag: | |
| if ((object.byteLength != other.byteLength) || | |
| (object.byteOffset != other.byteOffset)) { | |
| return false; | |
| } | |
| object = object.buffer; | |
| other = other.buffer; | |
| case arrayBufferTag: | |
| if ((object.byteLength != other.byteLength) || | |
| !equalFunc(new Uint8Array(object), new Uint8Array(other))) { | |
| return false; | |
| } | |
| return true; | |
| case boolTag: | |
| case dateTag: | |
| case numberTag: | |
| // Coerce booleans to `1` or `0` and dates to milliseconds. | |
| // Invalid dates are coerced to `NaN`. | |
| return eq(+object, +other); | |
| case errorTag: | |
| return object.name == other.name && object.message == other.message; | |
| case regexpTag: | |
| case stringTag: | |
| // Coerce regexes to strings and treat strings, primitives and objects, | |
| // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring | |
| // for more details. | |
| return object == (other + ''); | |
| case mapTag: | |
| var convert = mapToArray; | |
| case setTag: | |
| var isPartial = bitmask & PARTIAL_COMPARE_FLAG; | |
| convert || (convert = setToArray); | |
| if (object.size != other.size && !isPartial) { | |
| return false; | |
| } | |
| // Assume cyclic values are equal. | |
| var stacked = stack.get(object); | |
| if (stacked) { | |
| return stacked == other; | |
| } | |
| bitmask |= UNORDERED_COMPARE_FLAG; | |
| // Recursively compare objects (susceptible to call stack limits). | |
| stack.set(object, other); | |
| var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); | |
| stack['delete'](object); | |
| return result; | |
| case symbolTag: | |
| if (symbolValueOf) { | |
| return symbolValueOf.call(object) == symbolValueOf.call(other); | |
| } | |
| } | |
| return false; | |
| } | |
| module.exports = equalByTag; | |
| },{"./_Symbol":13,"./_Uint8Array":14,"./_equalArrays":30,"./_mapToArray":57,"./_setToArray":65,"./eq":72}],32:[function(require,module,exports){ | |
| var keys = require('./keys'); | |
| /** Used to compose bitmasks for comparison styles. */ | |
| var PARTIAL_COMPARE_FLAG = 2; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** | |
| * A specialized version of `baseIsEqualDeep` for objects with support for | |
| * partial deep comparisons. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` | |
| * for more details. | |
| * @param {Object} stack Tracks traversed `object` and `other` objects. | |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
| */ | |
| function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { | |
| var isPartial = bitmask & PARTIAL_COMPARE_FLAG, | |
| objProps = keys(object), | |
| objLength = objProps.length, | |
| othProps = keys(other), | |
| othLength = othProps.length; | |
| if (objLength != othLength && !isPartial) { | |
| return false; | |
| } | |
| var index = objLength; | |
| while (index--) { | |
| var key = objProps[index]; | |
| if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { | |
| return false; | |
| } | |
| } | |
| // Assume cyclic values are equal. | |
| var stacked = stack.get(object); | |
| if (stacked && stack.get(other)) { | |
| return stacked == other; | |
| } | |
| var result = true; | |
| stack.set(object, other); | |
| stack.set(other, object); | |
| var skipCtor = isPartial; | |
| while (++index < objLength) { | |
| key = objProps[index]; | |
| var objValue = object[key], | |
| othValue = other[key]; | |
| if (customizer) { | |
| var compared = isPartial | |
| ? customizer(othValue, objValue, key, other, object, stack) | |
| : customizer(objValue, othValue, key, object, other, stack); | |
| } | |
| // Recursively compare objects (susceptible to call stack limits). | |
| if (!(compared === undefined | |
| ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)) | |
| : compared | |
| )) { | |
| result = false; | |
| break; | |
| } | |
| skipCtor || (skipCtor = key == 'constructor'); | |
| } | |
| if (result && !skipCtor) { | |
| var objCtor = object.constructor, | |
| othCtor = other.constructor; | |
| // Non `Object` object instances with different constructors are not equal. | |
| if (objCtor != othCtor && | |
| ('constructor' in object && 'constructor' in other) && | |
| !(typeof objCtor == 'function' && objCtor instanceof objCtor && | |
| typeof othCtor == 'function' && othCtor instanceof othCtor)) { | |
| result = false; | |
| } | |
| } | |
| stack['delete'](object); | |
| stack['delete'](other); | |
| return result; | |
| } | |
| module.exports = equalObjects; | |
| },{"./keys":83}],33:[function(require,module,exports){ | |
| (function (global){ | |
| /** Detect free variable `global` from Node.js. */ | |
| var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; | |
| module.exports = freeGlobal; | |
| }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiJdfQ== | |
| },{}],34:[function(require,module,exports){ | |
| var isKeyable = require('./_isKeyable'); | |
| /** | |
| * Gets the data for `map`. | |
| * | |
| * @private | |
| * @param {Object} map The map to query. | |
| * @param {string} key The reference key. | |
| * @returns {*} Returns the map data. | |
| */ | |
| function getMapData(map, key) { | |
| var data = map.__data__; | |
| return isKeyable(key) | |
| ? data[typeof key == 'string' ? 'string' : 'hash'] | |
| : data.map; | |
| } | |
| module.exports = getMapData; | |
| },{"./_isKeyable":44}],35:[function(require,module,exports){ | |
| var baseIsNative = require('./_baseIsNative'), | |
| getValue = require('./_getValue'); | |
| /** | |
| * Gets the native function at `key` of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {string} key The key of the method to get. | |
| * @returns {*} Returns the function if it's native, else `undefined`. | |
| */ | |
| function getNative(object, key) { | |
| var value = getValue(object, key); | |
| return baseIsNative(value) ? value : undefined; | |
| } | |
| module.exports = getNative; | |
| },{"./_baseIsNative":23,"./_getValue":37}],36:[function(require,module,exports){ | |
| var DataView = require('./_DataView'), | |
| Map = require('./_Map'), | |
| Promise = require('./_Promise'), | |
| Set = require('./_Set'), | |
| WeakMap = require('./_WeakMap'), | |
| baseGetTag = require('./_baseGetTag'), | |
| toSource = require('./_toSource'); | |
| /** `Object#toString` result references. */ | |
| var mapTag = '[object Map]', | |
| objectTag = '[object Object]', | |
| promiseTag = '[object Promise]', | |
| setTag = '[object Set]', | |
| weakMapTag = '[object WeakMap]'; | |
| var dataViewTag = '[object DataView]'; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */ | |
| var objectToString = objectProto.toString; | |
| /** Used to detect maps, sets, and weakmaps. */ | |
| var dataViewCtorString = toSource(DataView), | |
| mapCtorString = toSource(Map), | |
| promiseCtorString = toSource(Promise), | |
| setCtorString = toSource(Set), | |
| weakMapCtorString = toSource(WeakMap); | |
| /** | |
| * Gets the `toStringTag` of `value`. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @returns {string} Returns the `toStringTag`. | |
| */ | |
| var getTag = baseGetTag; | |
| // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. | |
| if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || | |
| (Map && getTag(new Map) != mapTag) || | |
| (Promise && getTag(Promise.resolve()) != promiseTag) || | |
| (Set && getTag(new Set) != setTag) || | |
| (WeakMap && getTag(new WeakMap) != weakMapTag)) { | |
| getTag = function(value) { | |
| var result = objectToString.call(value), | |
| Ctor = result == objectTag ? value.constructor : undefined, | |
| ctorString = Ctor ? toSource(Ctor) : undefined; | |
| if (ctorString) { | |
| switch (ctorString) { | |
| case dataViewCtorString: return dataViewTag; | |
| case mapCtorString: return mapTag; | |
| case promiseCtorString: return promiseTag; | |
| case setCtorString: return setTag; | |
| case weakMapCtorString: return weakMapTag; | |
| } | |
| } | |
| return result; | |
| }; | |
| } | |
| module.exports = getTag; | |
| },{"./_DataView":4,"./_Map":7,"./_Promise":9,"./_Set":10,"./_WeakMap":15,"./_baseGetTag":19,"./_toSource":71}],37:[function(require,module,exports){ | |
| /** | |
| * Gets the value at `key` of `object`. | |
| * | |
| * @private | |
| * @param {Object} [object] The object to query. | |
| * @param {string} key The key of the property to get. | |
| * @returns {*} Returns the property value. | |
| */ | |
| function getValue(object, key) { | |
| return object == null ? undefined : object[key]; | |
| } | |
| module.exports = getValue; | |
| },{}],38:[function(require,module,exports){ | |
| var nativeCreate = require('./_nativeCreate'); | |
| /** | |
| * Removes all key-value entries from the hash. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf Hash | |
| */ | |
| function hashClear() { | |
| this.__data__ = nativeCreate ? nativeCreate(null) : {}; | |
| this.size = 0; | |
| } | |
| module.exports = hashClear; | |
| },{"./_nativeCreate":58}],39:[function(require,module,exports){ | |
| /** | |
| * Removes `key` and its value from the hash. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf Hash | |
| * @param {Object} hash The hash to modify. | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */ | |
| function hashDelete(key) { | |
| var result = this.has(key) && delete this.__data__[key]; | |
| this.size -= result ? 1 : 0; | |
| return result; | |
| } | |
| module.exports = hashDelete; | |
| },{}],40:[function(require,module,exports){ | |
| var nativeCreate = require('./_nativeCreate'); | |
| /** Used to stand-in for `undefined` hash values. */ | |
| var HASH_UNDEFINED = '__lodash_hash_undefined__'; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** | |
| * Gets the hash value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf Hash | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */ | |
| function hashGet(key) { | |
| var data = this.__data__; | |
| if (nativeCreate) { | |
| var result = data[key]; | |
| return result === HASH_UNDEFINED ? undefined : result; | |
| } | |
| return hasOwnProperty.call(data, key) ? data[key] : undefined; | |
| } | |
| module.exports = hashGet; | |
| },{"./_nativeCreate":58}],41:[function(require,module,exports){ | |
| var nativeCreate = require('./_nativeCreate'); | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** | |
| * Checks if a hash value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf Hash | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function hashHas(key) { | |
| var data = this.__data__; | |
| return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); | |
| } | |
| module.exports = hashHas; | |
| },{"./_nativeCreate":58}],42:[function(require,module,exports){ | |
| var nativeCreate = require('./_nativeCreate'); | |
| /** Used to stand-in for `undefined` hash values. */ | |
| var HASH_UNDEFINED = '__lodash_hash_undefined__'; | |
| /** | |
| * Sets the hash `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf Hash | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the hash instance. | |
| */ | |
| function hashSet(key, value) { | |
| var data = this.__data__; | |
| this.size += this.has(key) ? 0 : 1; | |
| data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; | |
| return this; | |
| } | |
| module.exports = hashSet; | |
| },{"./_nativeCreate":58}],43:[function(require,module,exports){ | |
| /** Used as references for various `Number` constants. */ | |
| var MAX_SAFE_INTEGER = 9007199254740991; | |
| /** Used to detect unsigned integer values. */ | |
| var reIsUint = /^(?:0|[1-9]\d*)$/; | |
| /** | |
| * Checks if `value` is a valid array-like index. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. | |
| * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. | |
| */ | |
| function isIndex(value, length) { | |
| length = length == null ? MAX_SAFE_INTEGER : length; | |
| return !!length && | |
| (typeof value == 'number' || reIsUint.test(value)) && | |
| (value > -1 && value % 1 == 0 && value < length); | |
| } | |
| module.exports = isIndex; | |
| },{}],44:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is suitable for use as unique object key. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is suitable, else `false`. | |
| */ | |
| function isKeyable(value) { | |
| var type = typeof value; | |
| return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') | |
| ? (value !== '__proto__') | |
| : (value === null); | |
| } | |
| module.exports = isKeyable; | |
| },{}],45:[function(require,module,exports){ | |
| var coreJsData = require('./_coreJsData'); | |
| /** Used to detect methods masquerading as native. */ | |
| var maskSrcKey = (function() { | |
| var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); | |
| return uid ? ('Symbol(src)_1.' + uid) : ''; | |
| }()); | |
| /** | |
| * Checks if `func` has its source masked. | |
| * | |
| * @private | |
| * @param {Function} func The function to check. | |
| * @returns {boolean} Returns `true` if `func` is masked, else `false`. | |
| */ | |
| function isMasked(func) { | |
| return !!maskSrcKey && (maskSrcKey in func); | |
| } | |
| module.exports = isMasked; | |
| },{"./_coreJsData":29}],46:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** | |
| * Checks if `value` is likely a prototype object. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. | |
| */ | |
| function isPrototype(value) { | |
| var Ctor = value && value.constructor, | |
| proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; | |
| return value === proto; | |
| } | |
| module.exports = isPrototype; | |
| },{}],47:[function(require,module,exports){ | |
| /** | |
| * Removes all key-value entries from the list cache. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf ListCache | |
| */ | |
| function listCacheClear() { | |
| this.__data__ = []; | |
| this.size = 0; | |
| } | |
| module.exports = listCacheClear; | |
| },{}],48:[function(require,module,exports){ | |
| var assocIndexOf = require('./_assocIndexOf'); | |
| /** Used for built-in method references. */ | |
| var arrayProto = Array.prototype; | |
| /** Built-in value references. */ | |
| var splice = arrayProto.splice; | |
| /** | |
| * Removes `key` and its value from the list cache. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf ListCache | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */ | |
| function listCacheDelete(key) { | |
| var data = this.__data__, | |
| index = assocIndexOf(data, key); | |
| if (index < 0) { | |
| return false; | |
| } | |
| var lastIndex = data.length - 1; | |
| if (index == lastIndex) { | |
| data.pop(); | |
| } else { | |
| splice.call(data, index, 1); | |
| } | |
| --this.size; | |
| return true; | |
| } | |
| module.exports = listCacheDelete; | |
| },{"./_assocIndexOf":18}],49:[function(require,module,exports){ | |
| var assocIndexOf = require('./_assocIndexOf'); | |
| /** | |
| * Gets the list cache value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf ListCache | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */ | |
| function listCacheGet(key) { | |
| var data = this.__data__, | |
| index = assocIndexOf(data, key); | |
| return index < 0 ? undefined : data[index][1]; | |
| } | |
| module.exports = listCacheGet; | |
| },{"./_assocIndexOf":18}],50:[function(require,module,exports){ | |
| var assocIndexOf = require('./_assocIndexOf'); | |
| /** | |
| * Checks if a list cache value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf ListCache | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function listCacheHas(key) { | |
| return assocIndexOf(this.__data__, key) > -1; | |
| } | |
| module.exports = listCacheHas; | |
| },{"./_assocIndexOf":18}],51:[function(require,module,exports){ | |
| var assocIndexOf = require('./_assocIndexOf'); | |
| /** | |
| * Sets the list cache `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf ListCache | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the list cache instance. | |
| */ | |
| function listCacheSet(key, value) { | |
| var data = this.__data__, | |
| index = assocIndexOf(data, key); | |
| if (index < 0) { | |
| ++this.size; | |
| data.push([key, value]); | |
| } else { | |
| data[index][1] = value; | |
| } | |
| return this; | |
| } | |
| module.exports = listCacheSet; | |
| },{"./_assocIndexOf":18}],52:[function(require,module,exports){ | |
| var Hash = require('./_Hash'), | |
| ListCache = require('./_ListCache'), | |
| Map = require('./_Map'); | |
| /** | |
| * Removes all key-value entries from the map. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf MapCache | |
| */ | |
| function mapCacheClear() { | |
| this.size = 0; | |
| this.__data__ = { | |
| 'hash': new Hash, | |
| 'map': new (Map || ListCache), | |
| 'string': new Hash | |
| }; | |
| } | |
| module.exports = mapCacheClear; | |
| },{"./_Hash":5,"./_ListCache":6,"./_Map":7}],53:[function(require,module,exports){ | |
| var getMapData = require('./_getMapData'); | |
| /** | |
| * Removes `key` and its value from the map. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf MapCache | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */ | |
| function mapCacheDelete(key) { | |
| var result = getMapData(this, key)['delete'](key); | |
| this.size -= result ? 1 : 0; | |
| return result; | |
| } | |
| module.exports = mapCacheDelete; | |
| },{"./_getMapData":34}],54:[function(require,module,exports){ | |
| var getMapData = require('./_getMapData'); | |
| /** | |
| * Gets the map value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf MapCache | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */ | |
| function mapCacheGet(key) { | |
| return getMapData(this, key).get(key); | |
| } | |
| module.exports = mapCacheGet; | |
| },{"./_getMapData":34}],55:[function(require,module,exports){ | |
| var getMapData = require('./_getMapData'); | |
| /** | |
| * Checks if a map value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf MapCache | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function mapCacheHas(key) { | |
| return getMapData(this, key).has(key); | |
| } | |
| module.exports = mapCacheHas; | |
| },{"./_getMapData":34}],56:[function(require,module,exports){ | |
| var getMapData = require('./_getMapData'); | |
| /** | |
| * Sets the map `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf MapCache | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the map cache instance. | |
| */ | |
| function mapCacheSet(key, value) { | |
| var data = getMapData(this, key), | |
| size = data.size; | |
| data.set(key, value); | |
| this.size += data.size == size ? 0 : 1; | |
| return this; | |
| } | |
| module.exports = mapCacheSet; | |
| },{"./_getMapData":34}],57:[function(require,module,exports){ | |
| /** | |
| * Converts `map` to its key-value pairs. | |
| * | |
| * @private | |
| * @param {Object} map The map to convert. | |
| * @returns {Array} Returns the key-value pairs. | |
| */ | |
| function mapToArray(map) { | |
| var index = -1, | |
| result = Array(map.size); | |
| map.forEach(function(value, key) { | |
| result[++index] = [key, value]; | |
| }); | |
| return result; | |
| } | |
| module.exports = mapToArray; | |
| },{}],58:[function(require,module,exports){ | |
| var getNative = require('./_getNative'); | |
| /* Built-in method references that are verified to be native. */ | |
| var nativeCreate = getNative(Object, 'create'); | |
| module.exports = nativeCreate; | |
| },{"./_getNative":35}],59:[function(require,module,exports){ | |
| var overArg = require('./_overArg'); | |
| /* Built-in method references for those with the same name as other `lodash` methods. */ | |
| var nativeKeys = overArg(Object.keys, Object); | |
| module.exports = nativeKeys; | |
| },{"./_overArg":61}],60:[function(require,module,exports){ | |
| var freeGlobal = require('./_freeGlobal'); | |
| /** Detect free variable `exports`. */ | |
| var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; | |
| /** Detect free variable `module`. */ | |
| var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; | |
| /** Detect the popular CommonJS extension `module.exports`. */ | |
| var moduleExports = freeModule && freeModule.exports === freeExports; | |
| /** Detect free variable `process` from Node.js. */ | |
| var freeProcess = moduleExports && freeGlobal.process; | |
| /** Used to access faster Node.js helpers. */ | |
| var nodeUtil = (function() { | |
| try { | |
| return freeProcess && freeProcess.binding('util'); | |
| } catch (e) {} | |
| }()); | |
| module.exports = nodeUtil; | |
| },{"./_freeGlobal":33}],61:[function(require,module,exports){ | |
| /** | |
| * Creates a unary function that invokes `func` with its argument transformed. | |
| * | |
| * @private | |
| * @param {Function} func The function to wrap. | |
| * @param {Function} transform The argument transform. | |
| * @returns {Function} Returns the new function. | |
| */ | |
| function overArg(func, transform) { | |
| return function(arg) { | |
| return func(transform(arg)); | |
| }; | |
| } | |
| module.exports = overArg; | |
| },{}],62:[function(require,module,exports){ | |
| var freeGlobal = require('./_freeGlobal'); | |
| /** Detect free variable `self`. */ | |
| var freeSelf = typeof self == 'object' && self && self.Object === Object && self; | |
| /** Used as a reference to the global object. */ | |
| var root = freeGlobal || freeSelf || Function('return this')(); | |
| module.exports = root; | |
| },{"./_freeGlobal":33}],63:[function(require,module,exports){ | |
| /** Used to stand-in for `undefined` hash values. */ | |
| var HASH_UNDEFINED = '__lodash_hash_undefined__'; | |
| /** | |
| * Adds `value` to the array cache. | |
| * | |
| * @private | |
| * @name add | |
| * @memberOf SetCache | |
| * @alias push | |
| * @param {*} value The value to cache. | |
| * @returns {Object} Returns the cache instance. | |
| */ | |
| function setCacheAdd(value) { | |
| this.__data__.set(value, HASH_UNDEFINED); | |
| return this; | |
| } | |
| module.exports = setCacheAdd; | |
| },{}],64:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is in the array cache. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf SetCache | |
| * @param {*} value The value to search for. | |
| * @returns {number} Returns `true` if `value` is found, else `false`. | |
| */ | |
| function setCacheHas(value) { | |
| return this.__data__.has(value); | |
| } | |
| module.exports = setCacheHas; | |
| },{}],65:[function(require,module,exports){ | |
| /** | |
| * Converts `set` to an array of its values. | |
| * | |
| * @private | |
| * @param {Object} set The set to convert. | |
| * @returns {Array} Returns the values. | |
| */ | |
| function setToArray(set) { | |
| var index = -1, | |
| result = Array(set.size); | |
| set.forEach(function(value) { | |
| result[++index] = value; | |
| }); | |
| return result; | |
| } | |
| module.exports = setToArray; | |
| },{}],66:[function(require,module,exports){ | |
| var ListCache = require('./_ListCache'); | |
| /** | |
| * Removes all key-value entries from the stack. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf Stack | |
| */ | |
| function stackClear() { | |
| this.__data__ = new ListCache; | |
| this.size = 0; | |
| } | |
| module.exports = stackClear; | |
| },{"./_ListCache":6}],67:[function(require,module,exports){ | |
| /** | |
| * Removes `key` and its value from the stack. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf Stack | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */ | |
| function stackDelete(key) { | |
| var data = this.__data__, | |
| result = data['delete'](key); | |
| this.size = data.size; | |
| return result; | |
| } | |
| module.exports = stackDelete; | |
| },{}],68:[function(require,module,exports){ | |
| /** | |
| * Gets the stack value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf Stack | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */ | |
| function stackGet(key) { | |
| return this.__data__.get(key); | |
| } | |
| module.exports = stackGet; | |
| },{}],69:[function(require,module,exports){ | |
| /** | |
| * Checks if a stack value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf Stack | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function stackHas(key) { | |
| return this.__data__.has(key); | |
| } | |
| module.exports = stackHas; | |
| },{}],70:[function(require,module,exports){ | |
| var ListCache = require('./_ListCache'), | |
| Map = require('./_Map'), | |
| MapCache = require('./_MapCache'); | |
| /** Used as the size to enable large array optimizations. */ | |
| var LARGE_ARRAY_SIZE = 200; | |
| /** | |
| * Sets the stack `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf Stack | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the stack cache instance. | |
| */ | |
| function stackSet(key, value) { | |
| var data = this.__data__; | |
| if (data instanceof ListCache) { | |
| var pairs = data.__data__; | |
| if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { | |
| pairs.push([key, value]); | |
| this.size = ++data.size; | |
| return this; | |
| } | |
| data = this.__data__ = new MapCache(pairs); | |
| } | |
| data.set(key, value); | |
| this.size = data.size; | |
| return this; | |
| } | |
| module.exports = stackSet; | |
| },{"./_ListCache":6,"./_Map":7,"./_MapCache":8}],71:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var funcProto = Function.prototype; | |
| /** Used to resolve the decompiled source of functions. */ | |
| var funcToString = funcProto.toString; | |
| /** | |
| * Converts `func` to its source code. | |
| * | |
| * @private | |
| * @param {Function} func The function to process. | |
| * @returns {string} Returns the source code. | |
| */ | |
| function toSource(func) { | |
| if (func != null) { | |
| try { | |
| return funcToString.call(func); | |
| } catch (e) {} | |
| try { | |
| return (func + ''); | |
| } catch (e) {} | |
| } | |
| return ''; | |
| } | |
| module.exports = toSource; | |
| },{}],72:[function(require,module,exports){ | |
| /** | |
| * Performs a | |
| * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) | |
| * comparison between two values to determine if they are equivalent. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
| * @example | |
| * | |
| * var object = { 'a': 1 }; | |
| * var other = { 'a': 1 }; | |
| * | |
| * _.eq(object, object); | |
| * // => true | |
| * | |
| * _.eq(object, other); | |
| * // => false | |
| * | |
| * _.eq('a', 'a'); | |
| * // => true | |
| * | |
| * _.eq('a', Object('a')); | |
| * // => false | |
| * | |
| * _.eq(NaN, NaN); | |
| * // => true | |
| */ | |
| function eq(value, other) { | |
| return value === other || (value !== value && other !== other); | |
| } | |
| module.exports = eq; | |
| },{}],73:[function(require,module,exports){ | |
| var baseIsArguments = require('./_baseIsArguments'), | |
| isObjectLike = require('./isObjectLike'); | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| /** Built-in value references. */ | |
| var propertyIsEnumerable = objectProto.propertyIsEnumerable; | |
| /** | |
| * Checks if `value` is likely an `arguments` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an `arguments` object, | |
| * else `false`. | |
| * @example | |
| * | |
| * _.isArguments(function() { return arguments; }()); | |
| * // => true | |
| * | |
| * _.isArguments([1, 2, 3]); | |
| * // => false | |
| */ | |
| var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { | |
| return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && | |
| !propertyIsEnumerable.call(value, 'callee'); | |
| }; | |
| module.exports = isArguments; | |
| },{"./_baseIsArguments":20,"./isObjectLike":81}],74:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is classified as an `Array` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an array, else `false`. | |
| * @example | |
| * | |
| * _.isArray([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isArray(document.body.children); | |
| * // => false | |
| * | |
| * _.isArray('abc'); | |
| * // => false | |
| * | |
| * _.isArray(_.noop); | |
| * // => false | |
| */ | |
| var isArray = Array.isArray; | |
| module.exports = isArray; | |
| },{}],75:[function(require,module,exports){ | |
| var isFunction = require('./isFunction'), | |
| isLength = require('./isLength'); | |
| /** | |
| * Checks if `value` is array-like. A value is considered array-like if it's | |
| * not a function and has a `value.length` that's an integer greater than or | |
| * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is array-like, else `false`. | |
| * @example | |
| * | |
| * _.isArrayLike([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isArrayLike(document.body.children); | |
| * // => true | |
| * | |
| * _.isArrayLike('abc'); | |
| * // => true | |
| * | |
| * _.isArrayLike(_.noop); | |
| * // => false | |
| */ | |
| function isArrayLike(value) { | |
| return value != null && isLength(value.length) && !isFunction(value); | |
| } | |
| module.exports = isArrayLike; | |
| },{"./isFunction":78,"./isLength":79}],76:[function(require,module,exports){ | |
| var root = require('./_root'), | |
| stubFalse = require('./stubFalse'); | |
| /** Detect free variable `exports`. */ | |
| var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; | |
| /** Detect free variable `module`. */ | |
| var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; | |
| /** Detect the popular CommonJS extension `module.exports`. */ | |
| var moduleExports = freeModule && freeModule.exports === freeExports; | |
| /** Built-in value references. */ | |
| var Buffer = moduleExports ? root.Buffer : undefined; | |
| /* Built-in method references for those with the same name as other `lodash` methods. */ | |
| var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; | |
| /** | |
| * Checks if `value` is a buffer. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.3.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. | |
| * @example | |
| * | |
| * _.isBuffer(new Buffer(2)); | |
| * // => true | |
| * | |
| * _.isBuffer(new Uint8Array(2)); | |
| * // => false | |
| */ | |
| var isBuffer = nativeIsBuffer || stubFalse; | |
| module.exports = isBuffer; | |
| },{"./_root":62,"./stubFalse":84}],77:[function(require,module,exports){ | |
| var baseIsEqual = require('./_baseIsEqual'); | |
| /** | |
| * Performs a deep comparison between two values to determine if they are | |
| * equivalent. | |
| * | |
| * **Note:** This method supports comparing arrays, array buffers, booleans, | |
| * date objects, error objects, maps, numbers, `Object` objects, regexes, | |
| * sets, strings, symbols, and typed arrays. `Object` objects are compared | |
| * by their own, not inherited, enumerable properties. Functions and DOM | |
| * nodes are **not** supported. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
| * @example | |
| * | |
| * var object = { 'a': 1 }; | |
| * var other = { 'a': 1 }; | |
| * | |
| * _.isEqual(object, other); | |
| * // => true | |
| * | |
| * object === other; | |
| * // => false | |
| */ | |
| function isEqual(value, other) { | |
| return baseIsEqual(value, other); | |
| } | |
| module.exports = isEqual; | |
| },{"./_baseIsEqual":21}],78:[function(require,module,exports){ | |
| var isObject = require('./isObject'); | |
| /** `Object#toString` result references. */ | |
| var funcTag = '[object Function]', | |
| genTag = '[object GeneratorFunction]', | |
| proxyTag = '[object Proxy]'; | |
| /** Used for built-in method references. */ | |
| var objectProto = Object.prototype; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */ | |
| var objectToString = objectProto.toString; | |
| /** | |
| * Checks if `value` is classified as a `Function` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a function, else `false`. | |
| * @example | |
| * | |
| * _.isFunction(_); | |
| * // => true | |
| * | |
| * _.isFunction(/abc/); | |
| * // => false | |
| */ | |
| function isFunction(value) { | |
| // The use of `Object#toString` avoids issues with the `typeof` operator | |
| // in Safari 9 which returns 'object' for typed array and other constructors. | |
| var tag = isObject(value) ? objectToString.call(value) : ''; | |
| return tag == funcTag || tag == genTag || tag == proxyTag; | |
| } | |
| module.exports = isFunction; | |
| },{"./isObject":80}],79:[function(require,module,exports){ | |
| /** Used as references for various `Number` constants. */ | |
| var MAX_SAFE_INTEGER = 9007199254740991; | |
| /** | |
| * Checks if `value` is a valid array-like length. | |
| * | |
| * **Note:** This method is loosely based on | |
| * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. | |
| * @example | |
| * | |
| * _.isLength(3); | |
| * // => true | |
| * | |
| * _.isLength(Number.MIN_VALUE); | |
| * // => false | |
| * | |
| * _.isLength(Infinity); | |
| * // => false | |
| * | |
| * _.isLength('3'); | |
| * // => false | |
| */ | |
| function isLength(value) { | |
| return typeof value == 'number' && | |
| value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; | |
| } | |
| module.exports = isLength; | |
| },{}],80:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is the | |
| * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) | |
| * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an object, else `false`. | |
| * @example | |
| * | |
| * _.isObject({}); | |
| * // => true | |
| * | |
| * _.isObject([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isObject(_.noop); | |
| * // => true | |
| * | |
| * _.isObject(null); | |
| * // => false | |
| */ | |
| function isObject(value) { | |
| var type = typeof value; | |
| return value != null && (type == 'object' || type == 'function'); | |
| } | |
| module.exports = isObject; | |
| },{}],81:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is object-like. A value is object-like if it's not `null` | |
| * and has a `typeof` result of "object". | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is object-like, else `false`. | |
| * @example | |
| * | |
| * _.isObjectLike({}); | |
| * // => true | |
| * | |
| * _.isObjectLike([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isObjectLike(_.noop); | |
| * // => false | |
| * | |
| * _.isObjectLike(null); | |
| * // => false | |
| */ | |
| function isObjectLike(value) { | |
| return value != null && typeof value == 'object'; | |
| } | |
| module.exports = isObjectLike; | |
| },{}],82:[function(require,module,exports){ | |
| var baseIsTypedArray = require('./_baseIsTypedArray'), | |
| baseUnary = require('./_baseUnary'), | |
| nodeUtil = require('./_nodeUtil'); | |
| /* Node.js helper references. */ | |
| var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; | |
| /** | |
| * Checks if `value` is classified as a typed array. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 3.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. | |
| * @example | |
| * | |
| * _.isTypedArray(new Uint8Array); | |
| * // => true | |
| * | |
| * _.isTypedArray([]); | |
| * // => false | |
| */ | |
| var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; | |
| module.exports = isTypedArray; | |
| },{"./_baseIsTypedArray":24,"./_baseUnary":27,"./_nodeUtil":60}],83:[function(require,module,exports){ | |
| var arrayLikeKeys = require('./_arrayLikeKeys'), | |
| baseKeys = require('./_baseKeys'), | |
| isArrayLike = require('./isArrayLike'); | |
| /** | |
| * Creates an array of the own enumerable property names of `object`. | |
| * | |
| * **Note:** Non-object values are coerced to objects. See the | |
| * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) | |
| * for more details. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.a = 1; | |
| * this.b = 2; | |
| * } | |
| * | |
| * Foo.prototype.c = 3; | |
| * | |
| * _.keys(new Foo); | |
| * // => ['a', 'b'] (iteration order is not guaranteed) | |
| * | |
| * _.keys('hi'); | |
| * // => ['0', '1'] | |
| */ | |
| function keys(object) { | |
| return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); | |
| } | |
| module.exports = keys; | |
| },{"./_arrayLikeKeys":16,"./_baseKeys":25,"./isArrayLike":75}],84:[function(require,module,exports){ | |
| /** | |
| * This method returns `false`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.13.0 | |
| * @category Util | |
| * @returns {boolean} Returns `false`. | |
| * @example | |
| * | |
| * _.times(2, _.stubFalse); | |
| * // => [false, false] | |
| */ | |
| function stubFalse() { | |
| return false; | |
| } | |
| module.exports = stubFalse; | |
| },{}],"normalizr":[function(require,module,exports){ | |
| 'use strict'; | |
| Object.defineProperty(exports, "__esModule", { | |
| value: true | |
| }); | |
| exports.Schema = undefined; | |
| var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; | |
| exports.arrayOf = arrayOf; | |
| exports.valuesOf = valuesOf; | |
| exports.unionOf = unionOf; | |
| exports.normalize = normalize; | |
| var _EntitySchema = require('./EntitySchema'); | |
| var _EntitySchema2 = _interopRequireDefault(_EntitySchema); | |
| var _IterableSchema = require('./IterableSchema'); | |
| var _IterableSchema2 = _interopRequireDefault(_IterableSchema); | |
| var _UnionSchema = require('./UnionSchema'); | |
| var _UnionSchema2 = _interopRequireDefault(_UnionSchema); | |
| var _isEqual = require('lodash/isEqual'); | |
| var _isEqual2 = _interopRequireDefault(_isEqual); | |
| var _isObject = require('lodash/isObject'); | |
| var _isObject2 = _interopRequireDefault(_isObject); | |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
| function defaultAssignEntity(normalized, key, entity) { | |
| normalized[key] = entity; | |
| } | |
| function visitObject(obj, schema, bag, options) { | |
| var _options$assignEntity = options.assignEntity; | |
| var assignEntity = _options$assignEntity === undefined ? defaultAssignEntity : _options$assignEntity; | |
| var defaults = schema && schema.getDefaults && schema.getDefaults(); | |
| var schemaAssignEntity = schema && schema.getAssignEntity && schema.getAssignEntity(); | |
| var normalized = (0, _isObject2.default)(defaults) ? _extends({}, defaults) : {}; | |
| for (var key in obj) { | |
| if (obj.hasOwnProperty(key)) { | |
| var entity = visit(obj[key], schema[key], bag, options); | |
| assignEntity.call(null, normalized, key, entity, obj, schema); | |
| if (schemaAssignEntity) { | |
| schemaAssignEntity.call(null, normalized, key, entity, obj, schema); | |
| } | |
| } | |
| } | |
| return normalized; | |
| } | |
| function defaultMapper(iterableSchema, itemSchema, bag, options) { | |
| return function (obj) { | |
| return visit(obj, itemSchema, bag, options); | |
| }; | |
| } | |
| function polymorphicMapper(iterableSchema, itemSchema, bag, options) { | |
| return function (obj) { | |
| var schemaKey = iterableSchema.getSchemaKey(obj); | |
| var result = visit(obj, itemSchema[schemaKey], bag, options); | |
| return { id: result, schema: schemaKey }; | |
| }; | |
| } | |
| function visitIterable(obj, iterableSchema, bag, options) { | |
| var itemSchema = iterableSchema.getItemSchema(); | |
| var curriedItemMapper = defaultMapper(iterableSchema, itemSchema, bag, options); | |
| if (Array.isArray(obj)) { | |
| return obj.map(curriedItemMapper); | |
| } else { | |
| return Object.keys(obj).reduce(function (objMap, key) { | |
| objMap[key] = curriedItemMapper(obj[key]); | |
| return objMap; | |
| }, {}); | |
| } | |
| } | |
| function visitUnion(obj, unionSchema, bag, options) { | |
| var itemSchema = unionSchema.getItemSchema(); | |
| return polymorphicMapper(unionSchema, itemSchema, bag, options)(obj); | |
| } | |
| function defaultMergeIntoEntity(entityA, entityB, entityKey) { | |
| for (var key in entityB) { | |
| if (!entityB.hasOwnProperty(key)) { | |
| continue; | |
| } | |
| if (!entityA.hasOwnProperty(key) || (0, _isEqual2.default)(entityA[key], entityB[key])) { | |
| entityA[key] = entityB[key]; | |
| continue; | |
| } | |
| console.warn('When merging two ' + entityKey + ', found unequal data in their "' + key + '" values. Using the earlier value.', entityA[key], entityB[key]); | |
| } | |
| } | |
| function visitEntity(entity, entitySchema, bag, options) { | |
| var _options$mergeIntoEnt = options.mergeIntoEntity; | |
| var mergeIntoEntity = _options$mergeIntoEnt === undefined ? defaultMergeIntoEntity : _options$mergeIntoEnt; | |
| var entityKey = entitySchema.getKey(); | |
| var id = entitySchema.getId(entity); | |
| if (!bag.hasOwnProperty(entityKey)) { | |
| bag[entityKey] = {}; | |
| } | |
| if (!bag[entityKey].hasOwnProperty(id)) { | |
| bag[entityKey][id] = {}; | |
| } | |
| var stored = bag[entityKey][id]; | |
| var normalized = visitObject(entity, entitySchema, bag, options); | |
| mergeIntoEntity(stored, normalized, entityKey); | |
| return id; | |
| } | |
| function visit(obj, schema, bag, options) { | |
| if (!(0, _isObject2.default)(obj) || !(0, _isObject2.default)(schema)) { | |
| return obj; | |
| } | |
| if (schema instanceof _EntitySchema2.default) { | |
| return visitEntity(obj, schema, bag, options); | |
| } else if (schema instanceof _IterableSchema2.default) { | |
| return visitIterable(obj, schema, bag, options); | |
| } else if (schema instanceof _UnionSchema2.default) { | |
| return visitUnion(obj, schema, bag, options); | |
| } else { | |
| return visitObject(obj, schema, bag, options); | |
| } | |
| } | |
| function arrayOf(schema, options) { | |
| return new _IterableSchema2.default(schema, options); | |
| } | |
| function valuesOf(schema, options) { | |
| return new _IterableSchema2.default(schema, options); | |
| } | |
| function unionOf(schema, options) { | |
| return new _UnionSchema2.default(schema, options); | |
| } | |
| exports.Schema = _EntitySchema2.default; | |
| function normalize(obj, schema) { | |
| var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; | |
| if (!(0, _isObject2.default)(obj)) { | |
| throw new Error('Normalize accepts an object or an array as its input.'); | |
| } | |
| if (!(0, _isObject2.default)(schema) || Array.isArray(schema)) { | |
| throw new Error('Normalize accepts an object for schema.'); | |
| } | |
| var bag = {}; | |
| var result = visit(obj, schema, bag, options); | |
| return { | |
| entities: bag, | |
| result: result | |
| }; | |
| } | |
| },{"./EntitySchema":1,"./IterableSchema":2,"./UnionSchema":3,"lodash/isEqual":77,"lodash/isObject":80}]},{},[]) | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImxpYi9FbnRpdHlTY2hlbWEuanMiLCJsaWIvSXRlcmFibGVTY2hlbWEuanMiLCJsaWIvVW5pb25TY2hlbWEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19EYXRhVmlldy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX0hhc2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1Byb21pc2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzb2NJbmRleE9mLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJBcmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzRXF1YWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsImxpYi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgRW50aXR5U2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbnRpdHlTY2hlbWEoa2V5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbnRpdHlTY2hlbWEpO1xuXG4gICAgaWYgKCFrZXkgfHwgdHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdHJpbmcgbm9uLWVtcHR5IGtleSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB0aGlzLl9hc3NpZ25FbnRpdHkgPSBvcHRpb25zLmFzc2lnbkVudGl0eTtcblxuICAgIHZhciBpZEF0dHJpYnV0ZSA9IG9wdGlvbnMuaWRBdHRyaWJ1dGUgfHwgJ2lkJztcbiAgICB0aGlzLl9nZXRJZCA9IHR5cGVvZiBpZEF0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJyA/IGlkQXR0cmlidXRlIDogZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiB4W2lkQXR0cmlidXRlXTtcbiAgICB9O1xuICAgIHRoaXMuX2lkQXR0cmlidXRlID0gaWRBdHRyaWJ1dGU7XG4gICAgdGhpcy5fbWV0YSA9IG9wdGlvbnMubWV0YTtcbiAgICB0aGlzLl9kZWZhdWx0cyA9IG9wdGlvbnMuZGVmYXVsdHM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRW50aXR5U2NoZW1hLCBbe1xuICAgIGtleTogJ2dldEFzc2lnbkVudGl0eScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFzc2lnbkVudGl0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hc3NpZ25FbnRpdHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0S2V5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0S2V5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2tleTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRJZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldElkKGVudGl0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldElkKGVudGl0eSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0SWRBdHRyaWJ1dGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJZEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pZEF0dHJpYnV0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRNZXRhJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWV0YShwcm9wKSB7XG4gICAgICBpZiAoIXByb3AgfHwgdHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdHJpbmcgbm9uLWVtcHR5IHByb3BlcnR5IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9tZXRhICYmIHRoaXMuX21ldGFbcHJvcF07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0RGVmYXVsdHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWZhdWx0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZWZpbmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZpbmUobmVzdGVkU2NoZW1hKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gbmVzdGVkU2NoZW1hKSB7XG4gICAgICAgIGlmIChuZXN0ZWRTY2hlbWEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHRoaXNba2V5XSA9IG5lc3RlZFNjaGVtYVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVudGl0eVNjaGVtYTtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gRW50aXR5U2NoZW1hOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9pc09iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC9pc09iamVjdCcpO1xuXG52YXIgX2lzT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzT2JqZWN0KTtcblxudmFyIF9VbmlvblNjaGVtYSA9IHJlcXVpcmUoJy4vVW5pb25TY2hlbWEnKTtcblxudmFyIF9VbmlvblNjaGVtYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9VbmlvblNjaGVtYSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBBcnJheVNjaGVtYSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXJyYXlTY2hlbWEoaXRlbVNjaGVtYSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXJyYXlTY2hlbWEpO1xuXG4gICAgaWYgKCEoMCwgX2lzT2JqZWN0Mi5kZWZhdWx0KShpdGVtU2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheVNjaGVtYSByZXF1aXJlcyBpdGVtIHNjaGVtYSB0byBiZSBhbiBvYmplY3QuJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2NoZW1hQXR0cmlidXRlKSB7XG4gICAgICB2YXIgc2NoZW1hQXR0cmlidXRlID0gb3B0aW9ucy5zY2hlbWFBdHRyaWJ1dGU7XG4gICAgICB0aGlzLl9pdGVtU2NoZW1hID0gbmV3IF9VbmlvblNjaGVtYTIuZGVmYXVsdChpdGVtU2NoZW1hLCB7IHNjaGVtYUF0dHJpYnV0ZTogc2NoZW1hQXR0cmlidXRlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pdGVtU2NoZW1hID0gaXRlbVNjaGVtYTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXJyYXlTY2hlbWEsIFt7XG4gICAga2V5OiAnZ2V0SXRlbVNjaGVtYScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEl0ZW1TY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbVNjaGVtYTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXJyYXlTY2hlbWE7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEFycmF5U2NoZW1hOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9pc09iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC9pc09iamVjdCcpO1xuXG52YXIgX2lzT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzT2JqZWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFVuaW9uU2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVbmlvblNjaGVtYShpdGVtU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVuaW9uU2NoZW1hKTtcblxuICAgIGlmICghKDAsIF9pc09iamVjdDIuZGVmYXVsdCkoaXRlbVNjaGVtYSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pb25TY2hlbWEgcmVxdWlyZXMgaXRlbSBzY2hlbWEgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5zY2hlbWFBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pb25TY2hlbWEgcmVxdWlyZXMgc2NoZW1hQXR0cmlidXRlIG9wdGlvbi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pdGVtU2NoZW1hID0gaXRlbVNjaGVtYTtcblxuICAgIHZhciBzY2hlbWFBdHRyaWJ1dGUgPSBvcHRpb25zLnNjaGVtYUF0dHJpYnV0ZTtcbiAgICB0aGlzLl9nZXRTY2hlbWEgPSB0eXBlb2Ygc2NoZW1hQXR0cmlidXRlID09PSAnZnVuY3Rpb24nID8gc2NoZW1hQXR0cmlidXRlIDogZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiB4W3NjaGVtYUF0dHJpYnV0ZV07XG4gICAgfTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVbmlvblNjaGVtYSwgW3tcbiAgICBrZXk6ICdnZXRJdGVtU2NoZW1hJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SXRlbVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVtU2NoZW1hO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFNjaGVtYUtleScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNjaGVtYUtleShpdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2NoZW1hKGl0ZW0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBVbmlvblNjaGVtYTtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gVW5pb25TY2hlbWE7IiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhVmlldztcbiIsInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcbiIsInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpLFxuICAgIHNldENhY2hlQWRkID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVBZGQnKSxcbiAgICBzZXRDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX3NldENhY2hlSGFzJyk7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID8gdmFsdWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0Q2FjaGU7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgc3RhY2tDbGVhciA9IHJlcXVpcmUoJy4vX3N0YWNrQ2xlYXInKSxcbiAgICBzdGFja0RlbGV0ZSA9IHJlcXVpcmUoJy4vX3N0YWNrRGVsZXRlJyksXG4gICAgc3RhY2tHZXQgPSByZXF1aXJlKCcuL19zdGFja0dldCcpLFxuICAgIHN0YWNrSGFzID0gcmVxdWlyZSgnLi9fc3RhY2tIYXMnKSxcbiAgICBzdGFja1NldCA9IHJlcXVpcmUoJy4vX3N0YWNrU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcblN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcblN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGFjaztcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV2Vha01hcDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5U29tZTtcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwidmFyIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtiaXRtYXNrXSBUaGUgYml0bWFzayBvZiBjb21wYXJpc29uIGZsYWdzLlxuICogIFRoZSBiaXRtYXNrIG1heSBiZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOlxuICogICAgIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogICAgIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBjdXN0b21pemVyLCBiaXRtYXNrLCBzdGFjaykge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0KHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYmFzZUlzRXF1YWwsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNvbXBhcmlzb24gc3R5bGVzLiAqL1xudmFyIFBBUlRJQUxfQ09NUEFSRV9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2JpdG1hc2tdIFRoZSBiaXRtYXNrIG9mIGNvbXBhcmlzb24gZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgXG4gKiAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBiaXRtYXNrLCBzdGFjaykge1xuICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgb2JqVGFnID0gYXJyYXlUYWcsXG4gICAgICBvdGhUYWcgPSBhcnJheVRhZztcblxuICBpZiAoIW9iaklzQXJyKSB7XG4gICAgb2JqVGFnID0gZ2V0VGFnKG9iamVjdCk7XG4gICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gIH1cbiAgaWYgKCFvdGhJc0Fycikge1xuICAgIG90aFRhZyA9IGdldFRhZyhvdGhlcik7XG4gICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG4gIH1cbiAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgIG9iaklzT2JqID0gZmFsc2U7XG4gIH1cbiAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGVxdWFsRnVuYywgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcbiAgfVxuICBpZiAoIShiaXRtYXNrICYgUEFSVElBTF9DT01QQVJFX0ZMQUcpKSB7XG4gICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbERlZXA7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwidmFyIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheVNvbWUgPSByZXF1aXJlKCcuL19hcnJheVNvbWUnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNvbXBhcmlzb24gc3R5bGVzLiAqL1xudmFyIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgPSAxLFxuICAgIFBBUlRJQUxfQ09NUEFSRV9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBjb21wYXJpc29uIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYFxuICogIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGVxdWFsRnVuYywgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICBpZiAoc3RhY2tlZCAmJiBzdGFjay5nZXQob3RoZXIpKSB7XG4gICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgc2VlbiA9IChiaXRtYXNrICYgVU5PUkRFUkVEX0NPTVBBUkVfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoc2Vlbikge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKVxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY29tcGFyaXNvbiBzdHlsZXMuICovXG52YXIgVU5PUkRFUkVEX0NPTVBBUkVfRkxBRyA9IDEsXG4gICAgUEFSVElBTF9DT01QQVJFX0ZMQUcgPSAyO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIG9mIGNvbXBhcmlzb24gZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgXG4gKiAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGVxdWFsRnVuYywgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IFVOT1JERVJFRF9DT01QQVJFX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGVxdWFsRnVuYywgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxCeVRhZztcbiIsInZhciBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNvbXBhcmlzb24gc3R5bGVzLiAqL1xudmFyIFBBUlRJQUxfQ09NUEFSRV9GTEFHID0gMjtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBjb21wYXJpc29uIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYFxuICogIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgUEFSVElBTF9DT01QQVJFX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0ga2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBiaXRtYXNrLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbE9iamVjdHM7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndlgyWnlaV1ZIYkc5aVlXd3Vhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtpQkVaWFJsWTNRZ1puSmxaU0IyWVhKcFlXSnNaU0JnWjJ4dlltRnNZQ0JtY205dElFNXZaR1V1YW5NdUlDb3ZYRzUyWVhJZ1puSmxaVWRzYjJKaGJDQTlJSFI1Y0dWdlppQm5iRzlpWVd3Z1BUMGdKMjlpYW1WamRDY2dKaVlnWjJ4dlltRnNJQ1ltSUdkc2IySmhiQzVQWW1wbFkzUWdQVDA5SUU5aWFtVmpkQ0FtSmlCbmJHOWlZV3c3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1puSmxaVWRzYjJKaGJEdGNiaUpkZlE9PSIsInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG4iLCJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGFnO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hHZXQ7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gZGF0YVtrZXldICE9PSB1bmRlZmluZWQgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpICYmXG4gICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXlhYmxlO1xuIiwidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCIvKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gW107XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlQ2xlYXI7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVEZWxldGU7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVIYXM7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVTZXQ7XG4iLCJ2YXIgSGFzaCA9IHJlcXVpcmUoJy4vX0hhc2gnKSxcbiAgICBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlQ2xlYXI7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVEZWxldGU7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlU2V0O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBUb0FycmF5O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBhZGRcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQGFsaWFzIHB1c2hcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7XG4gIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlQWRkO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tEZWxldGU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tHZXQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrSGFzO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gIH1cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tTZXQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiIsInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiIsInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICogZXF1aXZhbGVudC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gKiBub2RlcyBhcmUgKipub3QqKiBzdXBwb3J0ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uaXNFcXVhbChvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBvYmplY3QgPT09IG90aGVyO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFcXVhbDtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5TY2hlbWEgPSB1bmRlZmluZWQ7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHMuYXJyYXlPZiA9IGFycmF5T2Y7XG5leHBvcnRzLnZhbHVlc09mID0gdmFsdWVzT2Y7XG5leHBvcnRzLnVuaW9uT2YgPSB1bmlvbk9mO1xuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbnZhciBfRW50aXR5U2NoZW1hID0gcmVxdWlyZSgnLi9FbnRpdHlTY2hlbWEnKTtcblxudmFyIF9FbnRpdHlTY2hlbWEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRW50aXR5U2NoZW1hKTtcblxudmFyIF9JdGVyYWJsZVNjaGVtYSA9IHJlcXVpcmUoJy4vSXRlcmFibGVTY2hlbWEnKTtcblxudmFyIF9JdGVyYWJsZVNjaGVtYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JdGVyYWJsZVNjaGVtYSk7XG5cbnZhciBfVW5pb25TY2hlbWEgPSByZXF1aXJlKCcuL1VuaW9uU2NoZW1hJyk7XG5cbnZhciBfVW5pb25TY2hlbWEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVW5pb25TY2hlbWEpO1xuXG52YXIgX2lzRXF1YWwgPSByZXF1aXJlKCdsb2Rhc2gvaXNFcXVhbCcpO1xuXG52YXIgX2lzRXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNFcXVhbCk7XG5cbnZhciBfaXNPYmplY3QgPSByZXF1aXJlKCdsb2Rhc2gvaXNPYmplY3QnKTtcblxudmFyIF9pc09iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc09iamVjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGRlZmF1bHRBc3NpZ25FbnRpdHkobm9ybWFsaXplZCwga2V5LCBlbnRpdHkpIHtcbiAgbm9ybWFsaXplZFtrZXldID0gZW50aXR5O1xufVxuXG5mdW5jdGlvbiB2aXNpdE9iamVjdChvYmosIHNjaGVtYSwgYmFnLCBvcHRpb25zKSB7XG4gIHZhciBfb3B0aW9ucyRhc3NpZ25FbnRpdHkgPSBvcHRpb25zLmFzc2lnbkVudGl0eTtcbiAgdmFyIGFzc2lnbkVudGl0eSA9IF9vcHRpb25zJGFzc2lnbkVudGl0eSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdEFzc2lnbkVudGl0eSA6IF9vcHRpb25zJGFzc2lnbkVudGl0eTtcblxuXG4gIHZhciBkZWZhdWx0cyA9IHNjaGVtYSAmJiBzY2hlbWEuZ2V0RGVmYXVsdHMgJiYgc2NoZW1hLmdldERlZmF1bHRzKCk7XG4gIHZhciBzY2hlbWFBc3NpZ25FbnRpdHkgPSBzY2hlbWEgJiYgc2NoZW1hLmdldEFzc2lnbkVudGl0eSAmJiBzY2hlbWEuZ2V0QXNzaWduRW50aXR5KCk7XG4gIHZhciBub3JtYWxpemVkID0gKDAsIF9pc09iamVjdDIuZGVmYXVsdCkoZGVmYXVsdHMpID8gX2V4dGVuZHMoe30sIGRlZmF1bHRzKSA6IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICB2YXIgZW50aXR5ID0gdmlzaXQob2JqW2tleV0sIHNjaGVtYVtrZXldLCBiYWcsIG9wdGlvbnMpO1xuICAgICAgYXNzaWduRW50aXR5LmNhbGwobnVsbCwgbm9ybWFsaXplZCwga2V5LCBlbnRpdHksIG9iaiwgc2NoZW1hKTtcbiAgICAgIGlmIChzY2hlbWFBc3NpZ25FbnRpdHkpIHtcbiAgICAgICAgc2NoZW1hQXNzaWduRW50aXR5LmNhbGwobnVsbCwgbm9ybWFsaXplZCwga2V5LCBlbnRpdHksIG9iaiwgc2NoZW1hKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRNYXBwZXIoaXRlcmFibGVTY2hlbWEsIGl0ZW1TY2hlbWEsIGJhZywgb3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB2aXNpdChvYmosIGl0ZW1TY2hlbWEsIGJhZywgb3B0aW9ucyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvbHltb3JwaGljTWFwcGVyKGl0ZXJhYmxlU2NoZW1hLCBpdGVtU2NoZW1hLCBiYWcsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgc2NoZW1hS2V5ID0gaXRlcmFibGVTY2hlbWEuZ2V0U2NoZW1hS2V5KG9iaik7XG4gICAgdmFyIHJlc3VsdCA9IHZpc2l0KG9iaiwgaXRlbVNjaGVtYVtzY2hlbWFLZXldLCBiYWcsIG9wdGlvbnMpO1xuICAgIHJldHVybiB7IGlkOiByZXN1bHQsIHNjaGVtYTogc2NoZW1hS2V5IH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHZpc2l0SXRlcmFibGUob2JqLCBpdGVyYWJsZVNjaGVtYSwgYmFnLCBvcHRpb25zKSB7XG4gIHZhciBpdGVtU2NoZW1hID0gaXRlcmFibGVTY2hlbWEuZ2V0SXRlbVNjaGVtYSgpO1xuICB2YXIgY3VycmllZEl0ZW1NYXBwZXIgPSBkZWZhdWx0TWFwcGVyKGl0ZXJhYmxlU2NoZW1hLCBpdGVtU2NoZW1hLCBiYWcsIG9wdGlvbnMpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChjdXJyaWVkSXRlbU1hcHBlcik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKGZ1bmN0aW9uIChvYmpNYXAsIGtleSkge1xuICAgICAgb2JqTWFwW2tleV0gPSBjdXJyaWVkSXRlbU1hcHBlcihvYmpba2V5XSk7XG4gICAgICByZXR1cm4gb2JqTWFwO1xuICAgIH0sIHt9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2aXNpdFVuaW9uKG9iaiwgdW5pb25TY2hlbWEsIGJhZywgb3B0aW9ucykge1xuICB2YXIgaXRlbVNjaGVtYSA9IHVuaW9uU2NoZW1hLmdldEl0ZW1TY2hlbWEoKTtcbiAgcmV0dXJuIHBvbHltb3JwaGljTWFwcGVyKHVuaW9uU2NoZW1hLCBpdGVtU2NoZW1hLCBiYWcsIG9wdGlvbnMpKG9iaik7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRNZXJnZUludG9FbnRpdHkoZW50aXR5QSwgZW50aXR5QiwgZW50aXR5S2V5KSB7XG4gIGZvciAodmFyIGtleSBpbiBlbnRpdHlCKSB7XG4gICAgaWYgKCFlbnRpdHlCLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghZW50aXR5QS5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8ICgwLCBfaXNFcXVhbDIuZGVmYXVsdCkoZW50aXR5QVtrZXldLCBlbnRpdHlCW2tleV0pKSB7XG4gICAgICBlbnRpdHlBW2tleV0gPSBlbnRpdHlCW2tleV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oJ1doZW4gbWVyZ2luZyB0d28gJyArIGVudGl0eUtleSArICcsIGZvdW5kIHVuZXF1YWwgZGF0YSBpbiB0aGVpciBcIicgKyBrZXkgKyAnXCIgdmFsdWVzLiBVc2luZyB0aGUgZWFybGllciB2YWx1ZS4nLCBlbnRpdHlBW2tleV0sIGVudGl0eUJba2V5XSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmlzaXRFbnRpdHkoZW50aXR5LCBlbnRpdHlTY2hlbWEsIGJhZywgb3B0aW9ucykge1xuICB2YXIgX29wdGlvbnMkbWVyZ2VJbnRvRW50ID0gb3B0aW9ucy5tZXJnZUludG9FbnRpdHk7XG4gIHZhciBtZXJnZUludG9FbnRpdHkgPSBfb3B0aW9ucyRtZXJnZUludG9FbnQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNZXJnZUludG9FbnRpdHkgOiBfb3B0aW9ucyRtZXJnZUludG9FbnQ7XG5cblxuICB2YXIgZW50aXR5S2V5ID0gZW50aXR5U2NoZW1hLmdldEtleSgpO1xuICB2YXIgaWQgPSBlbnRpdHlTY2hlbWEuZ2V0SWQoZW50aXR5KTtcblxuICBpZiAoIWJhZy5oYXNPd25Qcm9wZXJ0eShlbnRpdHlLZXkpKSB7XG4gICAgYmFnW2VudGl0eUtleV0gPSB7fTtcbiAgfVxuXG4gIGlmICghYmFnW2VudGl0eUtleV0uaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgYmFnW2VudGl0eUtleV1baWRdID0ge307XG4gIH1cblxuICB2YXIgc3RvcmVkID0gYmFnW2VudGl0eUtleV1baWRdO1xuICB2YXIgbm9ybWFsaXplZCA9IHZpc2l0T2JqZWN0KGVudGl0eSwgZW50aXR5U2NoZW1hLCBiYWcsIG9wdGlvbnMpO1xuICBtZXJnZUludG9FbnRpdHkoc3RvcmVkLCBub3JtYWxpemVkLCBlbnRpdHlLZXkpO1xuXG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gdmlzaXQob2JqLCBzY2hlbWEsIGJhZywgb3B0aW9ucykge1xuICBpZiAoISgwLCBfaXNPYmplY3QyLmRlZmF1bHQpKG9iaikgfHwgISgwLCBfaXNPYmplY3QyLmRlZmF1bHQpKHNjaGVtYSkpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIF9FbnRpdHlTY2hlbWEyLmRlZmF1bHQpIHtcbiAgICByZXR1cm4gdmlzaXRFbnRpdHkob2JqLCBzY2hlbWEsIGJhZywgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgX0l0ZXJhYmxlU2NoZW1hMi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuIHZpc2l0SXRlcmFibGUob2JqLCBzY2hlbWEsIGJhZywgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgX1VuaW9uU2NoZW1hMi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuIHZpc2l0VW5pb24ob2JqLCBzY2hlbWEsIGJhZywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZpc2l0T2JqZWN0KG9iaiwgc2NoZW1hLCBiYWcsIG9wdGlvbnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFycmF5T2Yoc2NoZW1hLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgX0l0ZXJhYmxlU2NoZW1hMi5kZWZhdWx0KHNjaGVtYSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlc09mKHNjaGVtYSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IF9JdGVyYWJsZVNjaGVtYTIuZGVmYXVsdChzY2hlbWEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiB1bmlvbk9mKHNjaGVtYSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IF9VbmlvblNjaGVtYTIuZGVmYXVsdChzY2hlbWEsIG9wdGlvbnMpO1xufVxuXG5leHBvcnRzLlNjaGVtYSA9IF9FbnRpdHlTY2hlbWEyLmRlZmF1bHQ7XG5mdW5jdGlvbiBub3JtYWxpemUob2JqLCBzY2hlbWEpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1syXTtcblxuICBpZiAoISgwLCBfaXNPYmplY3QyLmRlZmF1bHQpKG9iaikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vcm1hbGl6ZSBhY2NlcHRzIGFuIG9iamVjdCBvciBhbiBhcnJheSBhcyBpdHMgaW5wdXQuJyk7XG4gIH1cblxuICBpZiAoISgwLCBfaXNPYmplY3QyLmRlZmF1bHQpKHNjaGVtYSkgfHwgQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3JtYWxpemUgYWNjZXB0cyBhbiBvYmplY3QgZm9yIHNjaGVtYS4nKTtcbiAgfVxuXG4gIHZhciBiYWcgPSB7fTtcbiAgdmFyIHJlc3VsdCA9IHZpc2l0KG9iaiwgc2NoZW1hLCBiYWcsIG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgZW50aXRpZXM6IGJhZyxcbiAgICByZXN1bHQ6IHJlc3VsdFxuICB9O1xufSJdfQ== | |
| const response = { | |
| "code": 200, | |
| "status": "Ok", | |
| "copyright": "© 2016 MARVEL", | |
| "attributionText": "Data provided by Marvel. © 2016 MARVEL", | |
| "attributionHTML": "<a href=\"http://marvel.com\">Data provided by Marvel. © 2016 MARVEL</a>", | |
| "etag": "2f08937547f5cbb41e1f5845f9b3adf36417e332", | |
| "data": { | |
| "offset": 0, | |
| "limit": 20, | |
| "total": 1485, | |
| "count": 20, | |
| "results": [ | |
| { | |
| "id": 1011334, | |
| "name": "3-D Man", | |
| "description": "", | |
| "modified": "2014-04-29T14:18:17-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/c/e0/535fecbbb9784", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011334", | |
| "comics": { | |
| "available": 11, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21366", | |
| "name": "Avengers: The Initiative (2007) #14" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24571", | |
| "name": "Avengers: The Initiative (2007) #14 (SPOTLIGHT VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21546", | |
| "name": "Avengers: The Initiative (2007) #15" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21741", | |
| "name": "Avengers: The Initiative (2007) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21975", | |
| "name": "Avengers: The Initiative (2007) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/22299", | |
| "name": "Avengers: The Initiative (2007) #18" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/22300", | |
| "name": "Avengers: The Initiative (2007) #18 (ZOMBIE VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/22506", | |
| "name": "Avengers: The Initiative (2007) #19" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/10223", | |
| "name": "Marvel Premiere (1972) #35" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/10224", | |
| "name": "Marvel Premiere (1972) #36" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/10225", | |
| "name": "Marvel Premiere (1972) #37" | |
| } | |
| ], | |
| "returned": 11 | |
| }, | |
| "series": { | |
| "available": 2, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1945", | |
| "name": "Avengers: The Initiative (2007 - 2010)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2045", | |
| "name": "Marvel Premiere (1972 - 1981)" | |
| } | |
| ], | |
| "returned": 2 | |
| }, | |
| "stories": { | |
| "available": 17, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19947", | |
| "name": "Cover #19947", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19948", | |
| "name": "The 3-D Man!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19949", | |
| "name": "Cover #19949", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19950", | |
| "name": "The Devil's Music!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19951", | |
| "name": "Cover #19951", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19952", | |
| "name": "Code-Name: The Cold Warrior!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47185", | |
| "name": "Avengers: The Initiative (2007) #14 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47499", | |
| "name": "Avengers: The Initiative (2007) #15 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47792", | |
| "name": "Avengers: The Initiative (2007) #16", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/47793", | |
| "name": "Avengers: The Initiative (2007) #16 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/48362", | |
| "name": "Avengers: The Initiative (2007) #17 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49104", | |
| "name": "Avengers: The Initiative (2007) #18 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49106", | |
| "name": "Avengers: The Initiative (2007) #18, Zombie Variant - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49888", | |
| "name": "Avengers: The Initiative (2007) #19", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/49889", | |
| "name": "Avengers: The Initiative (2007) #19 - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/54371", | |
| "name": "Avengers: The Initiative (2007) #14, Spotlight Variant - Int", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/96303", | |
| "name": "Deadpool (1997) #44", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 17 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011334/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/269", | |
| "name": "Secret Invasion" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/74/3-d_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/3-D_Man_(Chandler)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011334/3-d_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1017100, | |
| "name": "A-Bomb (HAS)", | |
| "description": "Rick Jones has been Hulk's best bud since day one, but now he's more than a friend...he's a teammate! Transformed by a Gamma energy explosion, A-Bomb's thick, armored skin is just as strong and powerful as it is blue. And when he curls into action, he uses it like a giant bowling ball of destruction! ", | |
| "modified": "2013-09-18T15:54:04-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/3/20/5232158de5b16", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1017100", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/105929", | |
| "name": "cover from Free Comic Book Day 2013 (Avengers/Hulk) (2013) #1", | |
| "type": "cover" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1017100/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/76/a-bomb?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1017100/a-bomb_has?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009144, | |
| "name": "A.I.M.", | |
| "description": "AIM is a terrorist organization bent on destroying the world.", | |
| "modified": "2013-10-17T14:41:30-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/6/20/52602f21f29ec", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009144", | |
| "comics": { | |
| "available": 33, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36763", | |
| "name": "Ant-Man & the Wasp (2010) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17553", | |
| "name": "Avengers (1998) #67" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/7340", | |
| "name": "Avengers (1963) #87" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1170", | |
| "name": "Avengers Vol. 2: Red Zone (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1214", | |
| "name": "Avengers Vol. II: Red Zone (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12787", | |
| "name": "Captain America (1998) #28" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20367", | |
| "name": "Defenders (1972) #57" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/31068", | |
| "name": "Incredible Hulks (2009) #606 (VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36737", | |
| "name": "Marvel Adventures Super Heroes (2010) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2110", | |
| "name": "Marvel Masterworks: Captain America Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1130", | |
| "name": "Marvel Masterworks: Captain America Vol. 1 - 2nd Edition (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2319", | |
| "name": "Marvel Masterworks: Doctor Strange Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2820", | |
| "name": "Marvel Masterworks: Doctor Strange Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2001", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17468", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. 1 (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1164", | |
| "name": "Marvel Masterworks: The Silver Surfer Vol. 2 (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/48816", | |
| "name": "Secret Avengers (2013) #14" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/48817", | |
| "name": "Secret Avengers (2013) #15" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/48818", | |
| "name": "Secret Avengers (2013) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/11068", | |
| "name": "Strange Tales (1951) #146" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 23, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13082", | |
| "name": "Ant-Man & the Wasp (2010 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/354", | |
| "name": "Avengers (1998 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1991", | |
| "name": "Avengers (1963 - 1996)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/227", | |
| "name": "Avengers Vol. 2: Red Zone (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/271", | |
| "name": "Avengers Vol. II: Red Zone (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1997", | |
| "name": "Captain America (1998 - 2002)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3743", | |
| "name": "Defenders (1972 - 1986)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/8842", | |
| "name": "Incredible Hulks (2009 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9718", | |
| "name": "Marvel Adventures Super Heroes (2010 - 2012)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1506", | |
| "name": "Marvel Masterworks: Captain America Vol. (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/189", | |
| "name": "Marvel Masterworks: Captain America Vol. 1 - 2nd Edition (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1468", | |
| "name": "Marvel Masterworks: Doctor Strange Vol. (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1494", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3300", | |
| "name": "Marvel Masterworks: The Invincible Iron Man Vol. 1 (0000 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/222", | |
| "name": "Marvel Masterworks: The Silver Surfer Vol. 2 (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/17547", | |
| "name": "Secret Avengers (2013 - 2014)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2076", | |
| "name": "Strange Tales (1951 - 1968)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2079", | |
| "name": "Tales of Suspense (1959 - 1968)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13213", | |
| "name": "Taskmaster (2010 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2258", | |
| "name": "Uncanny X-Men (1963 - 2011)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 31, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10253", | |
| "name": "When the Unliving Strike", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10255", | |
| "name": "Cover #10255", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10256", | |
| "name": "The Enemy Within!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10259", | |
| "name": "Death Before Dishonor!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10261", | |
| "name": "Cover #10261", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/10262", | |
| "name": "The End of A.I.M.!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11921", | |
| "name": "The Red Skull Lives!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11930", | |
| "name": "He Who Holds the Cosmic Cube", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11936", | |
| "name": "The Maddening Mystery of the Inconceivable Adaptoid!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11981", | |
| "name": "If This Be... Modok", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11984", | |
| "name": "A Time to Die -- A Time to Live!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11995", | |
| "name": "At the Mercy of the Maggia", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/15243", | |
| "name": "Look Homeward, Avenger", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28233", | |
| "name": "In Sin Airy X", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28971", | |
| "name": "[The Brothers Part I]", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34426", | |
| "name": "The Red Skull Lives!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34435", | |
| "name": "He Who Holds the Cosmic Cube", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34441", | |
| "name": "The Maddening Mystery of the Inconceivable Adaptoid!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34486", | |
| "name": "If This Be... Modok", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34489", | |
| "name": "A Time to Die -- A Time to Live!", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009144/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/77/aim.?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/A.I.M.?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009144/aim.?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010699, | |
| "name": "Aaron Stack", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010699", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010699/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/2809/aaron_stack?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010699/aaron_stack?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009146, | |
| "name": "Abomination (Emil Blonsky)", | |
| "description": "Formerly known as Emil Blonsky, a spy of Soviet Yugoslavian origin working for the KGB, the Abomination gained his powers after receiving a dose of gamma radiation similar to that which transformed Bruce Banner into the incredible Hulk.", | |
| "modified": "2012-03-20T12:32:12-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/9/50/4ce18691cbf04", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009146", | |
| "comics": { | |
| "available": 43, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17547", | |
| "name": "Avengers (1998) #61" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17548", | |
| "name": "Avengers (1998) #62" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1098", | |
| "name": "Avengers Vol. 1: World Trust (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8557", | |
| "name": "Earth X (1999) #7" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4241", | |
| "name": "Earth X (New (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20863", | |
| "name": "Hulk (2008) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23677", | |
| "name": "Hulk Vol. 1: Red Hulk (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2499", | |
| "name": "Hulk: Destruction (2005) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14425", | |
| "name": "Incredible Hulk (1999) #25" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14428", | |
| "name": "Incredible Hulk (1999) #28" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14450", | |
| "name": "Incredible Hulk (1999) #50" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14451", | |
| "name": "Incredible Hulk (1999) #51" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8948", | |
| "name": "Incredible Hulk (1962) #137" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9006", | |
| "name": "Incredible Hulk (1962) #195" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9007", | |
| "name": "Incredible Hulk (1962) #196" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9125", | |
| "name": "Incredible Hulk (1962) #314" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9193", | |
| "name": "Incredible Hulk (1962) #382" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9194", | |
| "name": "Incredible Hulk (1962) #383" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9195", | |
| "name": "Incredible Hulk (1962) #384" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9243", | |
| "name": "Incredible Hulk (1962) #432" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 24, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/354", | |
| "name": "Avengers (1998 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/158", | |
| "name": "Avengers Vol. 1: World Trust (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/378", | |
| "name": "Earth X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1806", | |
| "name": "Earth X (New (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3374", | |
| "name": "Hulk (2008 - 2012)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6831", | |
| "name": "Hulk Vol. 1: Red Hulk (2009 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/924", | |
| "name": "Hulk: Destruction (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/465", | |
| "name": "Incredible Hulk (1999 - 2008)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2021", | |
| "name": "Incredible Hulk (1962 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2983", | |
| "name": "Incredible Hulk Annual (1968 - 1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/212", | |
| "name": "Incredible Hulk Vol. 4: Abominable (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/244", | |
| "name": "Incredible Hulk Vol. IV: Abominable (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/8842", | |
| "name": "Incredible Hulks (2009 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2572", | |
| "name": "Iron Man (1998 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/977", | |
| "name": "Irredeemable Ant-Man (2006 - 2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2423", | |
| "name": "Irredeemable Ant-Man Vol. 1: Low-Life (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3722", | |
| "name": "Killraven (2002 - 2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2437", | |
| "name": "Killraven Premiere (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1671", | |
| "name": "Marvel Masterworks: The Incredible Hulk Vol.3 (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2301", | |
| "name": "Marvel Super-Heroes (1992 - 1993)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 39, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/4946", | |
| "name": "4 of 4 - 4XLS", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/5496", | |
| "name": "1 of 6 -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/12370", | |
| "name": "Cover #12370", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/12372", | |
| "name": "Whosoever Harms the Hulk..!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18419", | |
| "name": "[none]", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18420", | |
| "name": "The Stars Mine Enemy", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18537", | |
| "name": "Warfare In Wonderland!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18539", | |
| "name": "The Abomination Proclamation!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18776", | |
| "name": "Cover #18776", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18914", | |
| "name": "Moving On", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18916", | |
| "name": "Green Canard", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18918", | |
| "name": "Small Talk", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19024", | |
| "name": "Shades of Green", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19081", | |
| "name": "Who Shall Fear The Green Goliath?", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19082", | |
| "name": "Last Legs", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19119", | |
| "name": "The Great Astonishment - Chapter One: Auld Lang Syne", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19122", | |
| "name": "The Great Astonishment - Chapter Two: The Edge of Universal Pain", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19124", | |
| "name": "The Strangest Story Of All Time!!", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19125", | |
| "name": "The Great Astonishment - Conclusion: It's All True!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/24932", | |
| "name": "Earth X Chapter Seven", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 2, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009146/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/296", | |
| "name": "Chaos War" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/253", | |
| "name": "Infinity Gauntlet" | |
| } | |
| ], | |
| "returned": 2 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/81/abomination?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Abomination?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009146/abomination_emil_blonsky?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1016823, | |
| "name": "Abomination (Ultimate)", | |
| "description": "", | |
| "modified": "2012-07-10T19:11:52-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1016823", | |
| "comics": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/15717", | |
| "name": "Ultimate X-Men (2000) #26" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1151", | |
| "name": "Ultimate X-Men Vol. 6: Return of the King (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1186", | |
| "name": "Ultimate X-Men Vol. VI: Return of the King (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/474", | |
| "name": "Ultimate X-Men (2000 - 2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/210", | |
| "name": "Ultimate X-Men Vol. 6: Return of the King (2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/243", | |
| "name": "Ultimate X-Men Vol. VI: Return of the King (2003)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/31883", | |
| "name": "Free Preview of THE INCREDIBLE HULK #50", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1016823/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/81/abomination?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1016823/abomination_ultimate?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009148, | |
| "name": "Absorbing Man", | |
| "description": "", | |
| "modified": "2013-10-24T14:32:08-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/1/b0/5269678709fb7", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009148", | |
| "comics": { | |
| "available": 44, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36481", | |
| "name": "Avengers Academy (2010) #16" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36480", | |
| "name": "Avengers Academy (2010) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36479", | |
| "name": "Avengers Academy (2010) #18" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36484", | |
| "name": "Avengers Academy (2010) #19" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/36489", | |
| "name": "Avengers Academy (2010) #21" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/6935", | |
| "name": "Avengers Annual (1967) #20" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12783", | |
| "name": "Captain America (1998) #24" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20427", | |
| "name": "Dazzler (1981) #18" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20428", | |
| "name": "Dazzler (1981) #19" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/41433", | |
| "name": "Fear Itself (2010) #2 (3rd Printing Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/38452", | |
| "name": "Fear Itself: Fellowship of Fear (2011) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/39848", | |
| "name": "Fear Itself: The Worthy (2011) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/40977", | |
| "name": "Fear Itself: The Worthy (2011) #7" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/55857", | |
| "name": "Illuminati (2015) #7" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9072", | |
| "name": "Incredible Hulk (1962) #261" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/29794", | |
| "name": "Iron Man 2.0 (2011) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/29795", | |
| "name": "Iron Man 2.0 (2011) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/9698", | |
| "name": "Journey Into Mystery (1952) #122" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5234", | |
| "name": "Marvel Adventures Fantastic Four (2005) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/6277", | |
| "name": "Marvel Adventures Fantastic Four Vol. 5: All 4 One, 4 for All (Digest)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 30, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9086", | |
| "name": "Avengers Academy (2010 - 2012)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1988", | |
| "name": "Avengers Annual (1967 - 1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1997", | |
| "name": "Captain America (1998 - 2002)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3745", | |
| "name": "Dazzler (1981 - 1986)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13691", | |
| "name": "Fear Itself (2010 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13857", | |
| "name": "Fear Itself: Fellowship of Fear (2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13827", | |
| "name": "Fear Itself: The Worthy (2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/20084", | |
| "name": "Heroes for Hire (1997 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/20552", | |
| "name": "Illuminati (2015 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2021", | |
| "name": "Incredible Hulk (1962 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9924", | |
| "name": "Iron Man 2.0 (2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2032", | |
| "name": "Journey Into Mystery (1952 - 1966)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/926", | |
| "name": "Marvel Adventures Fantastic Four (2005 - 2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1959", | |
| "name": "Marvel Adventures Fantastic Four Vol. 5: All 4 One, 4 for All (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/14492", | |
| "name": "Marvel Masterworks: The Mighty Thor Vol. 3 (2011 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/14491", | |
| "name": "Marvel Masterworks: The Mighty Thor Vol. 3 Variant (DM Only) (2011 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1588", | |
| "name": "Marvel Masterworks: The Mighty Thor Vol. 4 (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2301", | |
| "name": "Marvel Super-Heroes (1992 - 1993)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1866", | |
| "name": "Mighty Avengers (2007 - 2010)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2059", | |
| "name": "Paradise X (2002 - 2003)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 45, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/4988", | |
| "name": "1 of 1", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/11028", | |
| "name": "Journey Into Mystery (1952) #122", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/16688", | |
| "name": "Thor (1966) #206", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/16691", | |
| "name": "Thor (1966) #207", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17049", | |
| "name": "Thor (1966) #375", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17050", | |
| "name": "Shadows of the Past", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17051", | |
| "name": "Heroes Always Win...Don't They?", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17342", | |
| "name": "Cover #17342", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/17412", | |
| "name": "A Wing and a Prayer", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18670", | |
| "name": "Encounter On Easter Island!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/21604", | |
| "name": "Secret Wars (1984) #6", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/21606", | |
| "name": "Secret Wars (1984) #7", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/26016", | |
| "name": "Paradise X Issue 0", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/26025", | |
| "name": "Cover #26025", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28708", | |
| "name": "The Hunted Part 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/31596", | |
| "name": "", | |
| "type": "pinup" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/31597", | |
| "name": "Downtown Demolition", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37745", | |
| "name": "A Wing and a Prayer", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/39926", | |
| "name": "And the Absorbing Man Makes Three!", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/39927", | |
| "name": "Hammer Time!", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 4, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009148/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/302", | |
| "name": "Fear Itself" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/270", | |
| "name": "Secret Wars" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/309", | |
| "name": "Shattered Heroes" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/273", | |
| "name": "Siege" | |
| } | |
| ], | |
| "returned": 4 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/84/absorbing_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Absorbing_Man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009148/absorbing_man?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009149, | |
| "name": "Abyss", | |
| "description": "", | |
| "modified": "2014-04-29T14:10:43-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/9/30/535feab462a64", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009149", | |
| "comics": { | |
| "available": 8, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13943", | |
| "name": "Uncanny X-Men (1963) #402" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13945", | |
| "name": "Uncanny X-Men (1963) #404" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13946", | |
| "name": "Uncanny X-Men (1963) #405" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13947", | |
| "name": "Uncanny X-Men (1963) #406" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13970", | |
| "name": "Uncanny X-Men (1963) #429" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13972", | |
| "name": "Uncanny X-Men (1963) #431" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12386", | |
| "name": "X-Men: Alpha (1994) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2539", | |
| "name": "X-Men: The Complete Age of Apocalypse Epic Book 2 (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 8 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2258", | |
| "name": "Uncanny X-Men (1963 - 2011)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2104", | |
| "name": "X-Men: Alpha (1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1583", | |
| "name": "X-Men: The Complete Age of Apocalypse Epic Book 2 (2005)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 8, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/26281", | |
| "name": "A Beginning", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28352", | |
| "name": "Utility of Myth", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28356", | |
| "name": "Army Ants", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28358", | |
| "name": "Ballroom Blitzkrieg", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28360", | |
| "name": "Staring Contests are for Suckers", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28407", | |
| "name": "The Draco Part One: Sins of the Father", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28411", | |
| "name": "The Draco Part Three", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28413", | |
| "name": "The Draco Part Four", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 8 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009149/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/227", | |
| "name": "Age of Apocalypse" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/85/abyss?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Abyss_(alien)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009149/abyss?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010903, | |
| "name": "Abyss (Age of Apocalypse)", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/3/80/4c00358ec7548", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010903", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010903/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/85/abyss?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Abyss_(Age_of_Apocalypse)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010903/abyss_age_of_apocalypse?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011266, | |
| "name": "Adam Destine", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011266", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011266/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/2902/adam_destine?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Destine,_Adam?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011266/adam_destine?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010354, | |
| "name": "Adam Warlock", | |
| "description": "Adam Warlock is an artificially created human who was born in a cocoon at a scientific complex called The Beehive.", | |
| "modified": "2013-08-07T13:49:06-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/a/f0/5202887448860", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010354", | |
| "comics": { | |
| "available": 123, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17271", | |
| "name": "Annihilation: Conquest (2007) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17405", | |
| "name": "Annihilation: Conquest (2007) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17645", | |
| "name": "Annihilation: Conquest (2007) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20686", | |
| "name": "Annihilation: Conquest (2007) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20885", | |
| "name": "Annihilation: Conquest (2007) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21016", | |
| "name": "Annihilation: Conquest (2007) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12412", | |
| "name": "Avengers Forever (1998) #9" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1033", | |
| "name": "Avengers Legends Vol. I: Avengers Forever (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20731", | |
| "name": "Clandestine Classic Premiere (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20187", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988) #27" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20193", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988) #32" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/20197", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988) #36" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8560", | |
| "name": "Earth X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8552", | |
| "name": "Earth X (1999) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8550", | |
| "name": "Earth X (1999) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4241", | |
| "name": "Earth X (New (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/12975", | |
| "name": "Fantastic Four (1961) #172" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/13195", | |
| "name": "Fantastic Four (1961) #370" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/25305", | |
| "name": "Guardians of the Galaxy (2008) #17" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/8988", | |
| "name": "Incredible Hulk (1962) #177" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 52, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3061", | |
| "name": "Annihilation: Conquest (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2111", | |
| "name": "Avengers Forever (1998 - 2001)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/93", | |
| "name": "Avengers Legends Vol. I: Avengers Forever (2002)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3874", | |
| "name": "Clandestine Classic Premiere (2008)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3741", | |
| "name": "Doctor Strange, Sorcerer Supreme (1988 - 1996)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/378", | |
| "name": "Earth X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1806", | |
| "name": "Earth X (New (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2121", | |
| "name": "Fantastic Four (1961 - 1998)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/4885", | |
| "name": "Guardians of the Galaxy (2008 - 2010)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2021", | |
| "name": "Incredible Hulk (1962 - 1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2983", | |
| "name": "Incredible Hulk Annual (1968 - 1994)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6673", | |
| "name": "Infinity Crusade (1993 - 2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6449", | |
| "name": "Infinity Crusade Vol. 1 (2008 - Present)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2023", | |
| "name": "Infinity Gauntlet (1991)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2024", | |
| "name": "Infinity War (1992)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2039", | |
| "name": "Marvel Comics Presents (1988 - 1995)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1697", | |
| "name": "Marvel Comics Presents: Wolverine Vol. 4 (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1837", | |
| "name": "Marvel Masterworks: Warlock Vol. (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2045", | |
| "name": "Marvel Premiere (1972 - 1981)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2301", | |
| "name": "Marvel Super-Heroes (1992 - 1993)" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "stories": { | |
| "available": 142, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1412", | |
| "name": "Cover #1412", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1602", | |
| "name": "Cover #1602", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1800", | |
| "name": "Cover #1800", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/1842", | |
| "name": "Cover #1842", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/12569", | |
| "name": "Cry, the Bedeviled Planet!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/13121", | |
| "name": "Forever Evil", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18500", | |
| "name": "Peril of the Paired Planets", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18501", | |
| "name": "Peril of the Paired Planets", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/18503", | |
| "name": "Triumph On Terra-Two", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19847", | |
| "name": "Cover #19847", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19848", | |
| "name": "Performance", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19859", | |
| "name": "Days of Future Present Part 4", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19860", | |
| "name": "You Must Remember This", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19883", | |
| "name": "The Adventures of Lockheed the Space Dragon and His Pet Girl, Kitty", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19884", | |
| "name": "The Saga of Storm: Goddess of Thunder", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19885", | |
| "name": "There's No Place Like Home", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19887", | |
| "name": "Cover #19887", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19888", | |
| "name": "And Men Shall Call Him Warlock", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19911", | |
| "name": "Cover #19911", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/19912", | |
| "name": "The Hounds of Helios", | |
| "type": "" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 10, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010354/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/293", | |
| "name": "Annihilation: Conquest" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/233", | |
| "name": "Atlantis Attacks" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/235", | |
| "name": "Blood and Thunder" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/240", | |
| "name": "Days of Future Present" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/302", | |
| "name": "Fear Itself" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/253", | |
| "name": "Infinity Gauntlet" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/29", | |
| "name": "Infinity War" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/263", | |
| "name": "Mutant Massacre" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/271", | |
| "name": "Secret Wars II" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/280", | |
| "name": "X-Tinction Agenda" | |
| } | |
| ], | |
| "returned": 10 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/2854/adam_warlock?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Warlock,_Adam?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010354/adam_warlock?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010846, | |
| "name": "Aegis (Trey Rollins)", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/5/e0/4c0035c9c425d", | |
| "extension": "gif" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010846", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010846/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/95/aegis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Aegis_%28Trey_Rollins%29?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010846/aegis_trey_rollins?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011297, | |
| "name": "Agent Brand", | |
| "description": "", | |
| "modified": "2013-10-24T13:09:30-0400", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/4/60/52695285d6e7e", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011297", | |
| "comics": { | |
| "available": 5, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5477", | |
| "name": "Astonishing X-Men (2004) #19 (Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/38318", | |
| "name": "Astonishing X-Men (2004) #38" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/38319", | |
| "name": "Astonishing X-Men (2004) #40" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/40024", | |
| "name": "Astonishing X-Men (2004) #40 (I Am Captain America Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/39890", | |
| "name": "Heralds (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 5 | |
| }, | |
| "series": { | |
| "available": 2, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/744", | |
| "name": "Astonishing X-Men (2004 - 2013)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13065", | |
| "name": "Heralds (2010 - Present)" | |
| } | |
| ], | |
| "returned": 2 | |
| }, | |
| "stories": { | |
| "available": 5, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/3353", | |
| "name": "Interior #3353", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/89900", | |
| "name": "Astonishing X-Men (2004) #38", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/90548", | |
| "name": "Heralds TPB", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/90819", | |
| "name": "Interior #90819", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/90853", | |
| "name": " Interior Astonishing X-Men (2004) #40", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 5 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011297/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/100/agent_brand?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agent_Brand?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011297/agent_brand?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011031, | |
| "name": "Agent X (Nijo)", | |
| "description": "Originally a partner of the mind-altering assassin Black Swan, Nijo spied on Deadpool as part of the Swan's plan to exact revenge for Deadpool falsely taking credit for the Swan's assassination of the Four Winds crime family, which included Nijo's brother.", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011031", | |
| "comics": { | |
| "available": 10, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17702", | |
| "name": "Agent X (2002) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17709", | |
| "name": "Agent X (2002) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17710", | |
| "name": "Agent X (2002) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17711", | |
| "name": "Agent X (2002) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17712", | |
| "name": "Agent X (2002) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17713", | |
| "name": "Agent X (2002) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/17704", | |
| "name": "Agent X (2002) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1649", | |
| "name": "Cable & Deadpool (2004) #12" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/21845", | |
| "name": "Cable & Deadpool (2004) #46 (Zombie Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5761", | |
| "name": "Cable & Deadpool Vol. 2: The Burnt Offering (Trade Paperback)" | |
| } | |
| ], | |
| "returned": 10 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/459", | |
| "name": "Agent X (2002 - 2004)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/693", | |
| "name": "Cable & Deadpool (2004 - 2008)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1338", | |
| "name": "Cable & Deadpool Vol. 2: The Burnt Offering (2007)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 15, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/2484", | |
| "name": "2 of 2 - Thirty Pieces", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37514", | |
| "name": "Cover #37514", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37515", | |
| "name": "Dead Man's Switch Part One", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37518", | |
| "name": "Cover #37518", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37525", | |
| "name": "Cover #37525", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37526", | |
| "name": "Dead Man's Switch Part Two", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37527", | |
| "name": "Cover #37527", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37528", | |
| "name": "Dead Man's Switch Part Three", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37529", | |
| "name": "Cover #37529", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37530", | |
| "name": "Dead Man's Switch Part Four", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37531", | |
| "name": "Cover #37531", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37532", | |
| "name": "Dead Man's Switch Part Five", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37533", | |
| "name": "Cover #37533", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/37534", | |
| "name": "Dead Man's Switch Part Six", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/94769", | |
| "name": "Cable & Deadpool (2004) #46, Zombie Variant", | |
| "type": "cover" | |
| } | |
| ], | |
| "returned": 15 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011031/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/101/agent_x?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agent_X_(Nijo)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011031/agent_x_nijo?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1009150, | |
| "name": "Agent Zero", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/f/60/4c0042121d790", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009150", | |
| "comics": { | |
| "available": 20, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/3357", | |
| "name": "Weapon X: Days of Future Now (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/2438", | |
| "name": "Weapon X: Days of Future Now (2005) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18293", | |
| "name": "What If? (1989) #-1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14182", | |
| "name": "Wolverine (1988) #60" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14183", | |
| "name": "Wolverine (1988) #61" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14184", | |
| "name": "Wolverine (1988) #62" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14185", | |
| "name": "Wolverine (1988) #63" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14186", | |
| "name": "Wolverine (1988) #64" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14189", | |
| "name": "Wolverine (1988) #67" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14190", | |
| "name": "Wolverine (1988) #68" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14211", | |
| "name": "Wolverine (1988) #87" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14107", | |
| "name": "Wolverine (1988) #163" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14110", | |
| "name": "Wolverine (1988) #166" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14121", | |
| "name": "Wolverine (1988) #176" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/1023", | |
| "name": "Wolverine/Deadpool: Weapon X (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18176", | |
| "name": "X-Man (1995) #-1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14282", | |
| "name": "X-Men (1991) #10" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/14293", | |
| "name": "X-Men (1991) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18132", | |
| "name": "X-Men Unlimited (1993) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/18116", | |
| "name": "X-Men Unlimited (1993) #15" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 8, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1478", | |
| "name": "Weapon X: Days of Future Now (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/869", | |
| "name": "Weapon X: Days of Future Now (2005)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3648", | |
| "name": "What If? (1989 - 1998)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2262", | |
| "name": "Wolverine (1988 - 2003)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/84", | |
| "name": "Wolverine/Deadpool: Weapon X (1999)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3643", | |
| "name": "X-Man (1995 - 2000)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/2265", | |
| "name": "X-Men (1991 - 2001)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/3637", | |
| "name": "X-Men Unlimited (1993 - 2003)" | |
| } | |
| ], | |
| "returned": 8 | |
| }, | |
| "stories": { | |
| "available": 20, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/4606", | |
| "name": "3 of 5 - 5XLS", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28706", | |
| "name": "The Hunted Part 2", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28712", | |
| "name": "The Hunted Part 5", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28738", | |
| "name": "The Logan Files Epilogue", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28881", | |
| "name": "Counting Coup", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28883", | |
| "name": "Nightmare Quest!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28885", | |
| "name": "Reunion!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28887", | |
| "name": "Bastions of Glory!", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28889", | |
| "name": "What Goes Around...", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28895", | |
| "name": "Valley O' Death", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28897", | |
| "name": "Epsilon Red", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/28941", | |
| "name": "Showdown In Lowtown", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/29125", | |
| "name": "Last Stand", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/29139", | |
| "name": "Over...Again", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38511", | |
| "name": "Second Contact", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38554", | |
| "name": "Among Us--A Sabretooth", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38555", | |
| "name": "The Whispers Scream", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38556", | |
| "name": "Sabretooth Vs. Maverick: Severed Ties", | |
| "type": "pinup" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38650", | |
| "name": "Maverick", | |
| "type": "" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/38903", | |
| "name": "Maverick", | |
| "type": "" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009150/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/102/agent_zero?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agent_Zero?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1009150/agent_zero?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011198, | |
| "name": "Agents of Atlas", | |
| "description": "", | |
| "modified": "2010-11-17T14:36:25-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/9/a0/4ce18a834b7f5", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011198", | |
| "comics": { | |
| "available": 31, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/6318", | |
| "name": "Agents of Atlas (Hardcover)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23659", | |
| "name": "Agents of Atlas (2009) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4801", | |
| "name": "Agents of Atlas (2006) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23660", | |
| "name": "Agents of Atlas (2009) #1 (50/50 COVER)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5089", | |
| "name": "Agents of Atlas (2006) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23825", | |
| "name": "Agents of Atlas (2009) #2" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/23824", | |
| "name": "Agents of Atlas (2009) #2 (MCGUINNESS VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/27402", | |
| "name": "Agents of Atlas (2009) #2 (BACHALO 2ND PRINTING VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5241", | |
| "name": "Agents of Atlas (2006) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24015", | |
| "name": "Agents of Atlas (2009) #3" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24016", | |
| "name": "Agents of Atlas (2009) #3 (MCGUINNESS VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24017", | |
| "name": "Agents of Atlas (2009) #3 (Wolverine Art Appreciation Variant)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5404", | |
| "name": "Agents of Atlas (2006) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24219", | |
| "name": "Agents of Atlas (2009) #4" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5665", | |
| "name": "Agents of Atlas (2006) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24221", | |
| "name": "Agents of Atlas (2009) #5" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24222", | |
| "name": "Agents of Atlas (2009) #5 (MCGUINNESS VARIANT)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24360", | |
| "name": "Agents of Atlas (2009) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5842", | |
| "name": "Agents of Atlas (2006) #6" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/24361", | |
| "name": "Agents of Atlas (2009) #7" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "series": { | |
| "available": 4, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/6807", | |
| "name": "Agents of Atlas (2009)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1980", | |
| "name": "Agents of Atlas (2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1097", | |
| "name": "Agents of Atlas (2006 - 2007)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/9181", | |
| "name": "Avengers Vs. Atlas (2010)" | |
| } | |
| ], | |
| "returned": 4 | |
| }, | |
| "stories": { | |
| "available": 38, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6008", | |
| "name": "1 of 6 - 6 XLS-", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6009", | |
| "name": "1 of 6 - 6 XLS-", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6010", | |
| "name": "2 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6011", | |
| "name": "2 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6012", | |
| "name": "3 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6013", | |
| "name": "3 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6014", | |
| "name": "4 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6015", | |
| "name": "4 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6016", | |
| "name": "5 of 6 - 6 XLS -", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6017", | |
| "name": "5 of 6 - 6 XLS -", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6018", | |
| "name": "5 of 6 - Story A - 6XLS", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/6019", | |
| "name": "5 of 6 - Story A - 6XLS", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52393", | |
| "name": "1 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52395", | |
| "name": "1 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52861", | |
| "name": "2 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/52863", | |
| "name": "2 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53263", | |
| "name": "3 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53265", | |
| "name": "3 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53266", | |
| "name": "3 of 3", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/53669", | |
| "name": "1 of 2", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 20 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011198/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/318", | |
| "name": "Dark Reign" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/103/agents_of_atlas?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Agents_of_Atlas?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011198/agents_of_atlas?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011175, | |
| "name": "Aginar", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011175", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011175/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/105/aginar?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Aginar?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011175/aginar?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011136, | |
| "name": "Air-Walker (Gabriel Lan)", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011136", | |
| "comics": { | |
| "available": 4, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/comics", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/4108", | |
| "name": "Annihilation: Silver Surfer (2006) #1" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/5589", | |
| "name": "Heroes Reborn: Iron Man (Trade Paperback)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/16330", | |
| "name": "Iron Man (1996) #11" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/comics/16331", | |
| "name": "Iron Man (1996) #12" | |
| } | |
| ], | |
| "returned": 4 | |
| }, | |
| "series": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/series", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1078", | |
| "name": "Annihilation: Silver Surfer (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/1814", | |
| "name": "Heroes Reborn: Iron Man (2006)" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/series/13577", | |
| "name": "Iron Man (1996 - 1998)" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "stories": { | |
| "available": 3, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/stories", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/5925", | |
| "name": "Annihilation: Silver Surfer (2006) #1", | |
| "type": "cover" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34082", | |
| "name": "Magical Mystery Tour", | |
| "type": "interiorStory" | |
| }, | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/stories/34085", | |
| "name": "Matters of the Heart", | |
| "type": "interiorStory" | |
| } | |
| ], | |
| "returned": 3 | |
| }, | |
| "events": { | |
| "available": 1, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011136/events", | |
| "items": [ | |
| { | |
| "resourceURI": "http://gateway.marvel.com/v1/public/events/229", | |
| "name": "Annihilation" | |
| } | |
| ], | |
| "returned": 1 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/109/air-walker?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Air-Walker_(Gabriel_Lan)?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011136/air-walker_gabriel_lan?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1011176, | |
| "name": "Ajak", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/2/80/4c002f35c5215", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1011176", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1011176/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/111/ajak?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Ajak?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1011176/ajak?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| }, | |
| { | |
| "id": 1010870, | |
| "name": "Ajaxis", | |
| "description": "", | |
| "modified": "1969-12-31T19:00:00-0500", | |
| "thumbnail": { | |
| "path": "http://i.annihil.us/u/prod/marvel/i/mg/b/70/4c0035adc7d3a", | |
| "extension": "jpg" | |
| }, | |
| "resourceURI": "http://gateway.marvel.com/v1/public/characters/1010870", | |
| "comics": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/comics", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "series": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/series", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "stories": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/stories", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "events": { | |
| "available": 0, | |
| "collectionURI": "http://gateway.marvel.com/v1/public/characters/1010870/events", | |
| "items": [], | |
| "returned": 0 | |
| }, | |
| "urls": [ | |
| { | |
| "type": "detail", | |
| "url": "http://marvel.com/characters/113/ajaxis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "wiki", | |
| "url": "http://marvel.com/universe/Ajaxis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| }, | |
| { | |
| "type": "comiclink", | |
| "url": "http://marvel.com/comics/characters/1010870/ajaxis?utm_campaign=apiRef&utm_source=2eb975a9ffd76703448dbc2d0781be73" | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| }; | |
| console.log(response); | |
| const { Schema, normalize, arrayOf } = require('normalizr'); | |
| const character = new Schema('characters'); | |
| const comic = new Schema('comics', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| const event = new Schema('events', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| const series = new Schema('series', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| const story = new Schema('stories', { idAttribute: (entity) => { | |
| return entity.resourceURI.substr(entity.resourceURI.lastIndexOf('/') + 1); | |
| }}); | |
| character.define({ | |
| comics: { items: arrayOf(comic) }, | |
| events: { items: arrayOf(event) }, | |
| series: { items: arrayOf(series) }, | |
| stories: { items: arrayOf(story) } | |
| }); | |
| const dataSchema = { | |
| data: { | |
| results: arrayOf(character) | |
| } | |
| }; | |
| const result = normalize(response, dataSchema); | |
| console.log(result); | |
| ;}, 0) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "requirebin-sketch", | |
| "version": "1.0.0", | |
| "dependencies": { | |
| "normalizr": "2.2.1" | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!-- contents of this file will be placed inside the <body> --> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!-- contents of this file will be placed inside the <head> --> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment