From 23bc2dd9a25bef293799de33994c209f2525179d Mon Sep 17 00:00:00 2001 From: wassname <1103714+wassname@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:37:24 +0800 Subject: [PATCH] title and gpt4 summary --- nbs/mjc_001_download.ipynb | 2469 +++++++++++++++++++++++++++++++---- nbs/mjc_004_process.ipynb | 1039 +++++++++++---- outputs/links2.md | 2509 +++++++++++++++++++++++++++--------- poetry.lock | 968 +++++++++++++- pyproject.toml | 3 + 5 files changed, 5854 insertions(+), 1134 deletions(-) diff --git a/nbs/mjc_001_download.ipynb b/nbs/mjc_001_download.ipynb index 6aa2312f..7a654688 100644 --- a/nbs/mjc_001_download.ipynb +++ b/nbs/mjc_001_download.ipynb @@ -545,7 +545,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a37162e429174ccbbdc599f05f48d73e", + "model_id": "261d850a2bdb4661a772a9fb0f93fa19", "version_major": 2, "version_minor": 0 }, @@ -560,317 +560,2233 @@ "name": "stdout", "output_type": "stream", "text": [ - "## [D] Monday Request and Recommendation Thread\n", + "## [RT] Mother of Learning Chapter 63\n", "\n", - "* Author: u/AutoModerator *\n", - "* URL: https://www.reddit.com/r/rational/comments/1dne6df/d_monday_request_and_recommendation_thread/\n", - "* Score: 33\n", + "* Author: u/Krossfireo *\n", + "* URL: https://www.fictionpress.com/s/2961893/63/Mother-of-Learning\n", + "* Score: 189\n", "\n", - "* Created: 2024-06-24T14:00:11\n", + "* Created: 2017-01-01T22:29:03\n", "\n", "### Post:\n", "\n", - "Welcome to the Monday request and recommendation thread. Are you looking something to scratch an itch? Post a comment stating your request! Did you just read something that really hit the spot, \"rational\" or otherwise? Post a comment recommending it! Note that you are welcome (and encouraged) to post recommendations directly to the subreddit, so long as you think they more or less fit the criteria on the sidebar or your understanding of this community, but this thread is much more loose about whether or not things \"belong\". Still, if you're looking for beginner recommendations, perhaps [take a look at the wiki](https://www.reddit.com/r/rational/wiki)?\n", - "\n", - "If you see someone making a top level post asking for recommendation, kindly direct them to the existence of these threads.\n", - "\n", - "[Previous automated recommendation threads](https://www.reddit.com/r/rational/search?q=%22Monday+Request+and+Recommendation+Thread%22&restrict_sr=on&sort=new&t=all) \n", - "[Other recommendation threads](http://pastebin.com/SbME9sXy)\n", + "[Link to content](https://www.fictionpress.com/s/2961893/63/Mother-of-Learning)\n", "\n", "### Comments:\n", "\n", - "> **u/ansible** [+15] *The Culture**\n", + "> **u/Xtraordinaire** [+50] *Team Glimglam**\n", "> \n", - "> Any good crossover fics recently? Something like Harry Potter and Natural 20, where a D&D wizard gets cross-universe transported to Hogwarts.\n", + "> So yes, they are meeting Daimen, yes they are not forgetting Silverlake. His plan, I think, involves Bakora gates and those spiders that somehow cracked their secret.\n", + "> And yes, nice evidence that RR must have been a skillful mage when he hijacked the loop, so, not Veyers.\n", "> \n", "\n", - ">> **u/RaryTheTraitor** [+13] *The Foundation**\n", + ">> **u/thrawnca** [+12] *Carbon-based biped**\n", ">> \n", - ">> [Doors to the Unknown](https://forums.spacebattles.com/threads/doors-to-the-unknown-worm-d-d-fusion-crossover.1001110/) has been recommended here before, it's a D&D and Worm cross-over.\n", + ">> Yeah, I'm betting on a Bakora gate. The relevant Web wanted all the crystallized mana he could spare, and was evasive about their gate. I'm guessing they basically pay for a single activation, a one-way ticket.\n", ">> \n", "\n", - "> **u/Dragongeek** [+16] *Path to Victory**\n", - "> \n", - "> (2 of n):\n", - "> ## Dungeon Crawler Carl\n", - "> Overall, I am pleasantly surprised and am looking forwards to the next book coming out. I read books one and two a while ago but bounced off for reasons I don’t remember. Regardless, I saw some very positive reviews for the audiobooks, so I listened to books 3 through 6 and thoroughly enjoyed it. \n", - "> ### The Good\n", - "> * The creativity and the worldbuilding. Like, the “system apocalypse is actually an alien gameshow” subgenre existed in the webfiction space before DCC, but I feel the work does plenty to innovate and expand the subgenre. The settings/levels are all very interesting and fresh (I really liked the “Iron Tangle” concept) and there’s very little cookie-cutter-generic-fantasy-dungeon going on here. * The dystopian-ness of the setting is also impressive. Like, shit’s *dark*, but also contrasts with occasionally being very silly or inept. \n", - "> * Outside plot and protagonist smarts. I really like how the protagonist(s) and the various players need to play at multiple levels. Like, at its most basic, there is the “get stronk to fight monsters in the dungeon”-level, but then there’s also the “look good on tv and play the crowd” aspect, and even more above that like the political landscape or the interaction with the system AI. The way that the protagonist handles this clearly shows that the author is a smart cookie and is capable of writing highly intelligent characters with their own motivations, goals, and ways to achieve them. \n", - "> * Pacing and general tightness. It just *moves*. Stuff happens, there aren’t many wasted words, etc. The author is just good at a technical level, and there’s most definitely a professional editor who’s had their way with it. It doesn’t have meandering unfocused filler that is otherwise so ubiquitous in the webfiction genre, and it’s good in the sense that I feel the series can stand its own as physical books on a shelf in a bookstore. \n", - "> ### The Meh\n", - "> * There’s a reason I originally dropped this after book two, and I can’t put my finger on it. Generally though, I am rather convinced that the quality gets better further on, and it’s very possible that the first book or so are just weak. \n", - "> * Non-human protagonists. The secondary protagonist, the cat Doughnut, is one of the “best” non-human protagonists I’ve read in a while. Like, the trope of “animals gain human level intelligence” isn’t unknown in system apocalypse, litrpg, or cultivation novels, but I feel that animals in these examples typically end up more “furry”-flavored: humans with a different texture pack rather than legitimately non-human origin characters that were uplifted to sapience. The “bad” part about this is that the cat-character constantly makes cat-like choices. For example, she is impulsive, mean, self-destructive, and extremely racist to the point of advocating for the genocide of certain species of dog. Like, I get it in a “ha-ha funny, the cat doesn’t like dogs, lol” sense, but it’s a bit like someone saying that they don’t like, for example, people from Scottland and wished to put them all to death. Generally, a significant portion of the problems that the protagonists encounter are Doughnut’s fault because she couldn’t keep her trap shut, made a choice without asking, etc. It’s good in the sense that I feel this portrayal aligns with how a spoiled and uplifted beauty pageant cat might “realistically” behave, but it is frustrating as a /r/rational reader.\n", - "> \n", - "\n", - ">> **u/ahasuerus_isfdb** [+7] *\n", - ">> \n", - ">> > I feel the series can stand its own as physical books on a shelf in a bookstore. \n", - ">> Ace Books is about to [publish it in hardcover](https://www.amazon.com/dp/B08BX5D4LC).\n", - ">> > a significant portion of the problems that the protagonists encounter are Doughnut’s fault because she couldn’t keep her trap shut, made a choice without asking, etc.\n", - ">> I tend to think of Dungeon Crawler Carl as a Swiftian (or Juvenalian) satire first and foremost. They rarely intersect with rational fiction.\n", - ">> \n", - "\n", - ">> **u/Neither_Guitar7687** [+7] *\n", - ">> \n", - ">> I feel like you're missing a major pro. The production quality of the audiobook is fantastic. It's probably the highest grossing audibook soundbooth theaters has put out and the effort that goes into it is equally as high.\n", - "\n", - ">> At the same time I agree with the disrec of dungeon crawler carl. The characters arent particularly rational and I've heard multiple people say they hate the cats perspective. I've tried to read the sequals as they come out and usually drop them until the audiobook is released.\n", - ">> \n", - "\n", - ">>> **u/Dragongeek** [+4] *Path to Victory**\n", + ">>> **u/MoralRelativity** [+1] *\n", ">>> \n", - ">>> Yeah, good point. The Narrator absolutely knocks it out of the park--probably why I liked listening to them so much.\n", + ">>> Or just wipe out the colony and activate the gate themselves?\n", ">>> \n", "\n", - ">>> **u/OutOfNiceUsernames** [+2] *fear of last pages**\n", - ">>> \n", - ">>> > DCC characters arent particularly rational\n", - ">>> Which particular scenes / actions made you adopt such an opinion? *(feel free to include spoilers up to the end of the 5th floor)*\n", - ">>> \n", - "\n", - ">>>> **u/ahasuerus_isfdb** [+2] *\n", + ">>>> **u/thrawnca** [+3] *Carbon-based biped**\n", ">>>> \n", - ">>>> I believe the default answer is \"Goddamnit, Donut!\" :-)\n", + ">>>> Um... No? Quite apart from the moral issues - this web has only been helpful before - ZZ don't know *how* to activate a Bakora gate. No one officially does; it just seems likely that the Silent Doorway Adepts unofficially have worked it out.\n", ">>>> \n", "\n", - ">> **u/serge_cell** [+2] *\n", - ">> \n", - ">> > Winter of Widows\n", - ">> I was hyped by all the reviews and honestly tried to get into it. Impression: no significant medieval world-building. Do they have serfdom? How much food peasant family consume per year and how much is stored already? Knight's fee or wages? Peasants have iron tools? Trade and prices? Etc. Beside world-building: side characters looks like they are brainwashed for obedience. To the woman with questionable claim. Actions: uninspired and dull. Disrec.\n", - ">> >Dungeon Crawler Carl\n", - ">> Nothing new or outstanding to see here, move along. Disrec.\n", - ">> \n", - "\n", - ">>> **u/Revlar** [+10] *\n", - ">>> \n", - ">>> Saying there's nothing outstanding about Dungeon Crawler Carl should probably come with some level of explanation, considering everyone who gives it a chance believes it to be \"new and outstanding\" to some degree. Unless you dislike it because it doesn't have \"medieval world building\".\n", - ">>> \n", - "\n", - ">> **u/hoja_nasredin** [+1] *Dai-Gurren Brigade**\n", - ">> \n", - ">> Read them recently. Had tons of fun. Not really rational\n", - ">> \n", - "\n", - "> **u/IICVX** [+14] *\n", - "> \n", - "> I'm surprised [Common Clay](https://www.royalroad.com/fiction/78912/common-clay) didn't get more traction here since it's very much the sort of analysis based story people tend to like - it's a litrpg in which the MC gets a class with no active combat skills, yet he feels compelled to clear out the monsters near his farm anyway. He manages it by (at first) watching and analyzing their behaviors, then by figuring out how to use the active abilities he learns in unexpected ways.\n", - "> It does have a weird vestigial subplot where the MC is actually isekaied, but he doesn't remember it and it has literally come up three times - once in the first paragraph, then twice where a god mentions it offhandedly and the MC is just super confused.\n", - "> The other downside is that the MC tends to survive his mistakes with surprisingly few injuries, but that's kind of a plot requirement given that there's no easy healing in the setting.\n", - "> \n", - "\n", - ">> **u/lsparrish** [+11] *\n", - ">> \n", - ">> I just binged the story before seeing your comment, and I enjoyed it a lot. I agree with a lot of what you're saying.\n", - ">> I liked that the creativity the MC uses isn't all from his own super duper mind (though he does pull some implausible victories out of his hat), a lot of it comes from the primary love interest, who has reasons to support him other than just liking him (she's hedging against the statistically likely event of being a commoner herself, the romance is slow-moving and uncertain). He's also portrayed as depending on his parents in a lot of situations, like a normal young adult who doesn't yet have it all together.\n", - ">> The biggest strike against this being rational fiction is that the people in charge seem to be holding a gigantic idiot ball, and the lack of other commoners who lucked onto a similar strategy (being the most common class implies more chances for this to happen, sheer statistics).\n", - ">> There are some hints of an explanation for why empowering commoners could be a bad idea to the people in power (and the population in general), but it's not developed enough to make enough sense to remove the idiot ball. They are chronically short on adventurers, so there's a strong incentive to find a way, and it's not like what he's doing is particularly hard to think of to someone who knows a lot about the system (especially high level analyst types).\n", - ">> So maybe it's systematically suppressed (the magic most useful for commoners certainly is, to an extent, but not the knowledge about them being able to level). Thing is, we aren't seeing much evidence that commoner leveling is actually suppressed on purpose for that reason, in the interactions so far it looks like nothing more than a crazy social stigma with an inexplicable lack of exceptions. You can sort of rationalize it as \"commoners don't get crazy powerful without the potentially dangerous kind of magic, so it's not worth it\" but it seems like even moderately powerful commoners would have a lot of utility in the setting. (Commoners are used as guards for nobility, e.g. -- why never increase their skill cap and get super guards?)\n", - ">> I think it does make a better intelligent-MC, zero-to-hero character arc to not have special advantages (cheaty OP power, past life memories copy-pasted in) from the get-go. That said, the Isekai / gods subplot comes across as pandering/pointless fluff without even any past-life memories coming through to grant a cross-pollination of ideas advantage. Then again, for all we know, it might be setting up something that happens later (past life memories come through, MC introduces science or video games or something to the world, etc) so it's too early to tell whether this has some kind of narrative payoff. It doesn't make much sense that his past life is the reason he's doing so well (and nobody else with the class is) because all he's doing differently is acting a bit cleverer and substantially less risk-averse than his neighbors, not exhibiting some strange understanding of the world that would be alien to them.\n", - ">> So there are some things that need to be developed further before I can classify it as rational. It's still a fantastic read (or so I think immediately after reading what's been written so far).\n", - ">> Reminiscent of Mark of the Fool in that it's a story about someone with the class everyone \"knows\" is the bad one, but it turns out actually OP once you get clever enough with it. (I think I eventually got bored of MotF after he broke the limitations of the class and made them cry through super willpower though.)\n", - ">> \n", - "\n", - ">>> **u/Dragongeek** [+15] *Path to Victory**\n", - ">>> \n", - ">>> I'd like to push back a bit on the upper-level idiot-ball because we simply don't know that much yet. \n", - ">>> > lack of other commoners who lucked onto a similar strategy\n", - ">>> It is mentioned that Clay is not unique and there are other rare [commoners] who have managed to level up through monster killing--however they didn't make it very far (level 3 iirc) and all died in combat. This is somewhat reminicent of the general \"adventuring combat\" (\"permadeath pressure\") problem where you need to consistently win every fight perfectly (avoiding permanent injury) while your enemy only needs to win once. Humans are pretty fragile and unless you are a high-leveled resilient individual or have access to presumably expensive healing magic, one bad blow to your knee is all it would take to end an adventuring career. It makes sense for a society to surpress stories of adventuring commoners, because it would encourage people to get themselves killed. \n", - ">>> Then there's the fact that the low-level adventurerers we've seen are... kinda shit. Like the hometown squad of 6+ level three adventurers almost had a fatality in their first encounter with a tier 0 trash mob trapdoor spider *despite* all their advantages like more stat points in their class focus and actual training.\n", - ">>> Finally, it might simply not be economically effecitve to convert commoners into adventurers. Feudal societies require a large percentage of the population to direclty work on calorie acquisition. They already burn a large part of their surplus on supporting adventurers and nobility (Clay gets a personal servant, free room and board, etc and that's at the *lowest* level -- \"initiate\") and the cost of training a bunch of peasants to have even a ghost of a chance against low-tier monsters would still see a large attrition rate for not that much gain (a commoner needs to level up four times to have a cap at the same level as that which an adventurer starts out with). From a lord's perspective, the easiest way to create more adventurers is to encourage their peasants to have children and then roll the die and collect those 1/50 who start out an effective three-plus levels ahead. \n", - ">>> > potentially dangerous kind of magic\n", - ">>> There is a series of words that, if you say them, it spawns a dungeon and starts killing everyone in the area. Closing this dungeon (which can be opened by anyone) requires someone who's extremely powerful. This isn't \"potentially dangerous\", it's a straight-up infohazard. Meanwhile, the powers of commoner-accessible chants are... of dubious strength. Lighting a candle with your mind is neat, but from the lord's perspective consider if it's worth it potentially letting this kind of magic knowledge proliferate just for a bit of peasantry convenience? The rabble can just use a tinderbox instead, and this reduces the likelyhood they'll go around looking for chants they don't understand in old tomes and reading them aloud. \n", - ">>> > They are chronically short on adventurers\n", - ">>> You say this, but I don't feel that this is fully supported by the text. It is certainly Clay's opinion, but he's a \"country bumkin\" who lived at the edge of the wilderness and far away from the kingdom's core. More specifically, there is no indication to me that the Tanglewood forest spider situation would've grown to cause any problems--yet this is Clay's primary motivation. Like, the spider woods have been the way they are for as long as Clay's alive, and it's indicated that the local Noble regularly patrols the edges to make sure it's not growing. All of the escalation didn't start until Clay started seeing it as his personal mission to kill every last spider and even at full escalation level, the spiders still never toed even a single leg outside of their territorial border. \n", - ">>> The local lord also complains about having requested adventureres multiple times, and not getting them, yet this also doesn't necessiarily point to a lack of adventurers. It could be that whoever's managing the situation sees that the far-off lord is able to handle situations by himself, and so they decide that it's not worth deploying the resource for someone who they know cries wolf way too much or it might be that central command just doesn't care all that much about some backwater lord and his single-village holding. \n", - ">>> From the \"feudal perspective\", they might even just be at their \"adventuring cap\". They've got a specific budget to support adventuring activities (training, housing, feeding, arming, etc) and even if there were suddenly slightly more powered individuals availalbe, it wouldn't matter. This is somewhat supported by what we've already seen in book two where the \"Rogue's Gallery\" and the empowered criminals exist. These are adventurer individuals, yet if this lack of adventureres were actually such a big issue, they could've figured out a way to, for example, provide a framework in which a [Burglar] can level up in a safe and crown-supported manner.\n", - ">>> \n", - "\n", - ">>> **u/IICVX** [+3] *\n", - ">>> \n", - ">>> Ya I definitely agree on the weird societal / higher-up idiot ball - that being said though, I wouldn't be surprised if the Commoners who _do_ go around killing monsters tend to either keep quiet about it or get killed. There's also the fact that this world seems pretty small, so it's easier to slip through the cracks. I'd be surprised if the total population of the kingdom cracks 100k.\n", - ">>> \n", - "\n", - ">>>> **u/lsparrish** [+7] *\n", - ">>>> \n", - ">>>> Good points, and the text does outright state that the legal punishment for \"poaching\" monsters is what normally amounts to a suicide mission (that the MC happens to have already completed). Having the noble in charge vouch for the commoner is another probably-rare event (justified in-story) that would explain why they can't just hide him away or execute him.\n", - ">>>> I think the reason I am perceiving it as idiot ball instead of conspiracy is that the guild people seem surprised rather than worried that he exists. This could have other explanations, like they are trying not to let on what they know / it was only known to a select few, who don't want to let on that they knew. Also perhaps nobles usually manage to execute commoners for this before the guild hears about it, or swear them to secrecy and assign them to guard duty.\n", - ">>>> It's weird that nobles don't purposely power-level commoners to work as high level guards on the regular, but maybe that's forbidden by an edict that only nobles know about, or it's a privilege reserved for the king. (Orison can be used to tell if someone does this.)\n", - ">>>> Presumably, commoner guards like Herbert could sometimes level from killing monsters in defense of a noble, since nobles are expected to patrol their territory and kill monsters along with their guards. However, come to think of it, one thing the story hasn't clarified (I think) is whether the diminishing returns on Soul per monster type happen based on Soul collected vs monsters of that type killed. \n", - ">>>> Depending how it works, a noble might be able to take a big group of guards on a pacification run through monster territory such that any Soul collected rounds to 0, after which they no longer get any Soul at all for additional kills as long as it's the same monster type. Since commoner guards only get to fight monsters as a group, this would be a way for nobles to suppress their leveling systematically. (A noble would want to secretly cap out each monster type they can manage before leading the guards.)\n", - ">>>> \n", - "\n", - ">> **u/AurelianoTampa** [+8] *\n", - ">> \n", - ">> Thank you for the recommendation; I binged this over the past few days. It was overall pretty enjoyable, although some things irked me a little. \n", - ">> Pros: I liked the progression track and the gradual revelation of a larger world. The MC doesn't suddenly find out he's overpowered; he scrapes by each combat encounter and gets stronger (and more experienced) over time. There's also a good look at how powerful he becomes as he levels up and gains achievements and Experiences; in the beginning, he's barely surviving encounters with spiderlings, and by the end of book one, he's killing dozens with barely a thought and a punch. I liked that the romance was slow as well, and possibly may even be a false start; the MC certainly doesn't act like many 16 year old boys who have a girl constantly vying for his attention, to the point where I wonder if he's ace (although he could just be super inexperienced and inept). I also like the leveling system, although it's a bit fast and loose. It seems like magic (at least Chants) can be used infinitely unless the caster gets distracted or interrupted, so there's no real concept of \"mana\" or \"mp\" limiting it - although they do clarify later on that the strength of the Chants depends on other stats. \n", - ">> Cons: The worldbuilding feels a bit not-fully-thought-out. I appreciate that there was some effort put toward explaining why the spiders don't overwhelm the nearby town if they're exploding in population every 5 weeks; but the logistics of their numbers and the impact on the area seems weird. Heck, even the Lair seems weird. This is a place that's just over a forested hill from the MC's town, but no one seems to realize it even existed. It's like the people from Beauty and the Beast completely forgetting about the magical castle and the prince living less than a day's ride away, except Common Clay doesn't actually say there's a magic spell at work making people forget the ruined town that became a Lair. It also didn't make much logistical sense that the Guardians were spawning huge broods every 5 weeks when there's nothing to eat in the Tanglewood any more besides other spiders. It's probably because I just finished reading Dungeon Meshi (Delicious in Dungeon), which went into absurd detail about monstrous dungeon ecosystems, that is putting things in stark contrast. The Tanglewood feels much more like a typical RPG forest than an actual real place. Why are there always spiders around? Because the MC needs to kill monsters. How do the spiders survive, or new broods get created, if there's no food in the forest due to everything being eaten? Hell if we know, maybe magic? I mean, you could easily just handwave it as \"the Curse did it,\" but then why bother acting like the reason the spiders don't overrun the MC's town is because of rational reasons? \n", - ">> The action also felt a bit over the top. There was very much a lot of shounen action scenes described in the combat, especially as Clay gets higher in levels. I can visualize what the author was going for - the writing was solid, don't get me wrong - but on a technical level it felt like realism took a backseat to the rule of cool. Chants can take 30 seconds or more to cast, but once Clay uses one to launch himself into the air, he can use another before hitting the ground to slow his fall? That would be, like, a couple of seconds at most that he was airborne. He also exchanges weapons mid-air multiple times, firing off arrows while chanting to slow his fall before landing. Again, I bet in an anime it would look cool. But reading it I was rolling my eyes at how impossible it would have been. \n", - ">> Anyway, the cons are mostly just things that took me out of the story, not things that made it a *bad* story. I don't know the author, and RR says he has 5 ongoing fictions at the moment, but it makes me wonder if he is somewhat new to writing. It felt like Common Clay has a lot of cool ideas, and the writing itself is solid; but the world building and action aren't really fleshed out besides at a shallow level to provide backdrop for the story itself. I think I'll probably come back and read more when more is out, but I don't think it's going to be a r/rational favorite, as readers here tend to like really detailed worldbuilding and systems. This is a good popcorn read, but not something that would be analyzed and details picked apart every time a new chapter comes out, like Super Supportive is or Worth the Candle was. \n", - ">> Also, circling back around, I would recommend Dungeon Meshi/Delicious in Dungeon if people like strong fantasy worldbuilding and enjoy manga. There's also a Netflix series of 24 episodes (covering the first 54 chapters of the manga, which is finished at 97 or 98 chapters), and a second season is already announced as in the works. Worth checking that out.\n", - ">> \n", - "\n", - "> **u/Dragongeek** [+13] *Path to Victory**\n", - "> \n", - "> (3 of n, Lightning Round)\n", - "> ## Winter of Widows\n", - "> This review is a bit shorter because this work is still very much in progress, but overall, I’m liking it and will continue to read as new chapters come out (great pace). It is probably my favorite work in the ASIOF insert/uplift genre and I feel it is very strong compared to other stuff in the subgenre where there’s oft an extreme degree of Mary Sue and “white man’s burden” going on. Yes, it still has staple tropes of the genre like the protagonist magnetically attracting highly skilled and loyal help or inexplicably having easy access to Westerosi magical power, but I feel that *Winter of Widows* handles these elements very well along with presenting a female-protagonist perspective on power in a highly male-dominated low-fantasy setting. \n", - "> ## When Heroes Die\n", - "> Post-GM Worm/PGTE crossover recced two weeks ago. I like it. I’m not really quite sure where it’s going beyond “Taylor gets a kickass name and causes a revolution”, but I’m generally a sucker for post-GM stories and I really like PGTE too. Definitely agree with the comment that pointed out that PGTE acts like “glue” though, and would not recommend this to people who are, for example, only familiar with Worm.\n", - "> \n", - "\n", - ">> **u/lillarty** [+14] *\n", - ">> \n", - ">> > there’s oft an extreme degree of Mary Sue and “white man’s burden” going on\n", - ">> I believe you're thinking of *noblesse oblige*, not \"white man's burden.\" Maybe we've been reading different stories, but WMB is basically just noblesse oblige but with racial superiority explicitly cited as the justification, and I haven't seen any uplift stories which make racial supremacy part of their plot. Typically the protags in an uplift story are uplifting the same ethnicity as themselves anyway, so racial issues are never brought up.\n", - ">> \n", - "\n", - ">>> **u/Dragongeek** [+8] *Path to Victory**\n", - ">>> \n", - ">>> Eh, while I see your point about *white man's burden* generally having racial superiority themes, I think the concept applies more in uplift stories than *noblesse oblige* concepts do (typically). Additionally, WMB is not just *noblesse oblige* without racial superiority; they are quite different. \n", - ">>> Specifically, *noblesse oblige* generally asserts that those who are ennobled have responsibilities as a counterweight to their entitled status. The most basic example is the feudal social contract between the serfs and the nobility, where the serfs are expected to labor and pay their taxes while the nobles, in return, defend the land from foreign powers, uphold order, or invest in infrastructure projects, among other things. More modernly, *noblesse oblige* is also [often associated with concepts of generosity](https://www.merriam-webster.com/dictionary/noblesse%20oblige) towards the less fortunate or philanthropy generally.\n", - ">>> On the other hand, *white man's burden* is [specifically about](https://www.merriam-webster.com/dictionary/white%20man%27s%20burden) \"manag[ing] the affairs of nonwhite people whom they believed to be less developed\". Yes, there is the component of \"nonwhite people\" in there, but more generally, WMB is about people who believe themselves smart (civilized, educated, wise, etc.) going to a foreign land and imposing their own ways of thinking out of a belief that the local peoples are undeveloped idiotic primitives.\n", - ">>> Of these two, I think that WMB maps much better onto most insert/isekai/uplift stories, because they are typically about someone modern being sent into a society and civilization that they view as primitive, and then seeing it as their duty to implement their modern-world ideals to save the primitive peoples from themselves and living in squalor. Yes, this also maps somewhat onto NO, because in NO there is the foundational assumption that the noble, by simple status of their blood/birth/position \"knows better\" than the peasantry and thus is compelled to act as a guiding hand, but I'd argue that this often embodies a more traditional paradigm of stability rather than change, improvement, or general societal upheaval introduced with an outsider coming in and imposing their values and ideas.\n", - ">>> \n", - "\n", - ">>>> **u/suddenly_lurkers** [+13] *\n", - ">>>> \n", - ">>>> > Of these two, I think that WMB maps much better onto most insert/isekai/uplift stories, because they are typically about someone modern being sent into a society and civilization that they view as primitive, and then seeing it as their duty to implement their modern-world ideals to save the primitive peoples from themselves and living in squalor.\n", - ">>>> The fact that the isekaied person is stuck there and living in squalor themselves seems like a pretty key distinction. They aren't imposing ideals or technologies from out of a perceived moral duty. Usually it's driven by a material desire to not starve to death, have a proper toilet, climb up Maslow's hierarchy of needs, etc.\n", - ">>>> The element of power imbalance is also completely different. Attempts to impose modernization could be backed up by force (eg. gunboat diplomacy in Japan) or trade incentives/sanctions. None of that exists for a random person stranded alone in a foreign land. They can't impose policies or values without the approval of the local elites, at a minimum, and it would have to happen through persuasion.\n", - ">>>> Neither concept seems like a good fit.\n", - ">>>> \n", - "\n", - ">>>>> **u/ahasuerus_isfdb** [+3] *\n", + ">>>>> **u/throwawayIWGWPC** [+2] *\n", ">>>>> \n", - ">>>>> > for a random person stranded alone in a foreign land. They can't impose policies or values without the approval of the local elites, at a minimum, and it would have to happen through persuasion.\n", - ">>>>> The Hawaiian careers of [Isaac Davis](https://en.wikipedia.org/wiki/Isaac_Davis_(advisor\\)) and [John Young](https://en.wikipedia.org/wiki/John_Young_(advisor\\)) come to mind.\n", + ">>>>> ZZ have already killed plenty of aranea for the sake of training to open the mission critical memory packet. Killing Adepts within the loop so as to use their Bakora Gate sounds like a (traumatic, ethically troubling, and yet) legitimate last resort. Also, Zorian has mind magic, so he might be able to get information on how to work the Gate with or without the consent of the Adepts.\n", ">>>>> \n", "\n", - ">>>>> **u/Making_Bacon** [+3] *\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> Even in that extremity, he didn't attack his friends, only neutrals. And I really don't see any *benefit* in exterminating the Web.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>> \n", + ">>>>>>> The Silent Doorway Adepts were willing to train Zorian for a huge quantity of crystallized mana. However, assuming they have a Bakora Gate, would they be willing to teach Zorian how to use it—the artifact that gives this web their very name? Perhaps, but considering how secretive the Adepts are and how protective aranea are in general about their most prized knowledge, I doubt the Adepts would be willing to give Zorian access to their gate.\n", + ">>>>>>> As an absolute last resort, storming in, killing everyone except the elders, then extracting the Bakora Gate lore, then spending a restart studying it could catapult Zorian's knowledge of both spell formulas and dimensionalism. What's more could recruit Xvim perhaps even Nora Boole to help him study the artifact. Nora Boole might be brought to tears to have the opportunity.\n", + ">>>>>>> And it may be that the knowledge gained would also help ZZ disrupt the Bakora Gate used by the Ibasans—which may be critical once the loop ends.\n", + ">>>>>>> In my opinion, Zorian really ought to get access to that Bakora Gate if at all possible. Maybe it'll be a dead end, but it be well be an incredibly fruitful experience.\n", + ">>>>>>> Plus, if violence is the only way he could access the Adepts' Bakora Gate, then it is unlikely he will ever get access outside of the loop. He might as well do it considering the Adepts will simply respawn in the next loop. He should certainly give them every chance to share the information though; I cringe to think of him gaining access by force.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> Oh, right, the spiders might keep insisting that they don't know anything. That would pretty much put them in the same position as Xvim's list.\n", + ">>>>>>>> I can't see an easy way for them to bring any non-loop-informed individuals to study ancient artifacts inside a recently-exterminated aranean settlement... or, for that matter, even several who *are* informed, like Alanic. Xvim, though, might perhaps take an interest. He hasn't wanted to travel previously...\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> \"Professor Xvim? What can I do for you?\"\n", + ">>>>>>>>> \"Ms. Boole, I have something you may be interested in.\"\n", + ">>>>>>>>> \"Really? What's that?\"\n", + ">>>>>>>>> \"I have a student who is working with me on several advanced projects. For reasons I can't go into, this student has discovered an ancient artifact that may be of immense interest to you. However, again for reasons that I cannot go into, the research will require your utter secrecy.\"\n", + ">>>>>>>>> \"Uh, is this illegal?\"\n", + ">>>>>>>>> \"No, Ms. Boole, but it is . . . significant. Tell me, do you know anything about the Bakora Gates?\"\n", + ">>>>>>>>> \"Bakora Gates—oh my gods . . . when can we leave?\"\n", + ">>>>>>>>> \"We can leave now, but don't you want to know more details first?\"\n", + ">>>>>>>>> \"Tell me on the way, Professor. I've *got* to see this.\"\n", + ">>>>>>>>> ---\n", + ">>>>>>>>> As for Xvim traveling, I'm guessing he feels following two fifteen-year-olds on a quest to find a scroll of Simulacrum—especially because Alanic is around—is not something he'd be interested in anymore. But to conduct dimensionalism research on a Bakora Gate in an emptied out spider enclave with Zorian who is he instructing in dimensionalism? I bet he'd be willing to travel for that.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/Xtraordinaire** [+3] *Team Glimglam**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> I HEREBY CHRISTEN THIS SHIP XVOOLE!\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>>>>>> \n", + ">>>>>>>>>>> I swear: Do not tempt me to write that fanfic.\n", + ">>>>>>>>>>> Because I might.\n", + ">>>>>>>>>>> \n", + "\n", + ">>>>>>>>>>>> **u/Xtraordinaire** [+3] *Team Glimglam**\n", + ">>>>>>>>>>>> \n", + ">>>>>>>>>>>> http://i.imgur.com/gJJ1pOq.jpg?1\n", + ">>>>>>>>>>>> \n", + "\n", + ">>>>>>>>>>>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>>>>>>>>>>> \n", + ">>>>>>>>>>>>> Yes, master.\n", + ">>>>>>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Bakora gates are not rare, and are already being studied by various people. It's just that since no-one (except maybe the Silent Doorway Adepts) can use them, the interest is mostly for historical purposes.\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>>>>>> \n", + ">>>>>>>>>>> That's a good point. But if the Adepts know how to use the gate, then it's not just full access to a Bakora gate—it's full access and the knowledge required to use and experiment with it.\n", + ">>>>>>>>>>> \n", + "\n", + ">>>>>>>>>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>>>>>>>>> \n", + ">>>>>>>>>>>> Thus, my original point that exterminating the spiders is undesirable.\n", + ">>>>>>>>>>>> \n", + "\n", + ">>>>> **u/MoralRelativity** [+1] *\n", ">>>>> \n", - ">>>>> This comment has been overwritten by an automated tool.\n", + ">>>>> You're right, morality is probably an issue here. When it comes to opening the gate I had assumed that the dimensionalism that Zorian has been studying would help. But you're probably right.\n", ">>>>> \n", "\n", - "> **u/Dragongeek** [+14] *Path to Victory**\n", - "> \n", - "> (4 of 4):\n", - "> ## Apocalypse Redux (Series)\n", - "> Picked this up as an audiobook because I wanted something to listen to on long drives. Currently halfway through book four. Overall, meh. If you are bored, like LitRPG, and in the mood for some “popcorn” it’s not a bad choice, but otherwise I wouldn’t really recommend it. \n", - "> ### The good\n", - "> * Has some fresh ideas. I like the hook of one person going back in time to prevent the apocalypse, and like that the original timeline was doomed by human greed/stupidity/ineptitude rather than some other form of outside meddling. Instead of just randomly spawning monsters or dungeons or whatever, humanity was simply given enough rope to hang themselves with along with some whispered hints that tying nooses might increase shareholder value or whatever, and then they went and did it. \n", - "> * The approach of the protagonist is also interesting—he, rather sensibly, realizes that no matter how strong he is and how much he powerlevels using future knowledge, the most “rational” or “effective” thing he can do is insert himself in System-research to ensure that, for example, critical discoveries are made earlier than they originally were and he also explicitly takes a class which makes him into a trainer so that he can lift up others and generally build a stronger and more resilient humanity. \n", - "> * It’s in Europe, specifically Germany. I like that, it’s refreshing to remember that places outside of the USA exist. It is a bit funny though, because while there are enough elements in the story that convince me the author has lived in Germany for at least some time (semester abroad?) there are also enough “mistakes” that make me rather sure the author hasn’t worked in German Academia or Professionally (I have). \n", - "> ### The Bad\n", - "> * This is specific to the audiobook, but I hate it when they decide to simply narrate all the LitRPG elements. Save me from multiple minutes of reading a status screen or a half-dozen possible class evolutions aloud (when we all know that the protagonist will pick the obviously best choice). I memorized how many times I need to press the “skip forwards 10 seconds” button to skip the status screen (27 by the end of book 3) which is just UGH. If I ever write and publish a LitRPG book, I pledge to specifically prepare an “audiobook version” that isn’t tedious to listen to. \n", - "> * Cultivation/Anime-ness and the author taking themselves too seriously. Don’t know exactly what to call this, but the protagonist feels very “Protagonisty” and he often does the anime things where he flies off the handle in rage but is able to keep it on the inside through is iron will and self-control or reminds himself that he shouldn’t grin like a lunatic while he slaughters monsters wholesale because he is a combat maniac. The author also has this writing tic where they frequently need to remind us, the readers, about how much of an absolute badass the protagonist is with lines like “of course it wouldn’t be a problem if he didn’t have to hold back is power” or a similarly clichéd line reminding us that the protagonist is a superhuman who can hear people through walls and leap a building in a single bound. \n", - "> * Not very funny. There are occasions where the characters are talking or in a meeting or whatever, and someone cracks a joke and the author goes on at length about how everyone cracks up or can barely contain their humor… but the original joke or humorous situation is just not funny.\n", - "> \n", - "\n", - ">> **u/zorianteron** [+5] *\n", - ">> \n", - ">> >not very funny\n", - ">> Maybe the writer *is* german after all!\n", - ">> \n", - "\n", - "> **u/sl236** [+8] *\n", - "> \n", - "> Going to put [Player 0.4](https://www.royalroad.com/fiction/54840/player-04-you-have-died-reset-in-progress) out there. \n", - "> What it does really well is interleave multiple murder mystery style puzzles on the fly, with the next few already set up and in flight just as the reader has enough information to solve the last one. I'm a sucker for that stuff and also for timeloops :)\n", - "> Others may bounce off the first chapter or two for a number of reasons - the writing quality initially is variable, and the protagonist grabs a couple of idiot balls. Even so, if that's you, I suggest sticking with it for a couple more chapters to see if it might be your thing after all. The writing gets better (and more consistent) and the protagonist's behaviour is put into perspective.\n", - "> \n", - "\n", - ">> **u/GrecklePrime** [+2] *\n", - ">> \n", - ">> This has been surprisingly fun so far! Luca holds onto some very dumb assumptions early on but he's been mostly intelligent so far, and learning more about his first round slowly as things are introduced is really interesting and has me wondering lots. Thanks for the rec\n", - ">> \n", - "\n", - "> **u/Dragongeek** [+13] *Path to Victory**\n", - "> \n", - "> Alrighty folks. I’ve been on vacation for the past three weeks and I’ve had plenty of free time relaxing in my hammock to read and listen to all sorts of stuff (Post 1 of n):\n", - "> ## Delve\n", - "> I read it all, and my feeling is “meh”. It has a target audience, and I can see some appeal, but it isn’t for me. \n", - "> ### The Good\n", - "> * I really liked that powerful actors in the world do things when not in view of the protagonist. Specifically, (spoilers) the evil emperor was being hyped up in the background as a distant Big-Bad in a “final boss battle” sense. Like, there’s the party member who has a familial connection and a grudge, the generals of the emperor are pivotal in the final climax of the first major arc, etc. In a “classic” litrpg plot structure, facing him would be step 4 (“kill god”) and I liked that the author subverted the trope and just had him get killed offscreen by another person of similar power level. Now, this isn’t perfect, the whole story still does revolve around the protagonist, but I liked this bit of trope subversion and a couple like it.\n", - "> * Friction between modern-world ideals. This is a bit weak in the earlier bits of the story, but the author got significantly better at portraying the “reality” of litrpg worlds where might makes right, in the sense that the protagonist constantly struggles when his deep-set ideals about human rights, democracy, etc rub against the “I am higher rank than you and will turn you into paste” reality of a cultivation setting.\n", - "> * The “kingdom building”. This is only a secondary focus in the second half of the story, but I liked the protagonist taking the leadership mantle upon themselves to lead a company aligning it with his ideals, and all the work that entails. It’s the ultimate “I’ll do it myself” flex of isekai’d protagonists, and I wish more stories went this way instead of protagonists either changing to adapt to the morality of their new world or sticking to small-unit change. \n", - "> ### The Bad\n", - "> * The math. Oh my god, the math. I get that one of the primary draws of the LitRPG genre is “numbers go up”, but like large portions of the book (by page count) are just excel tables showing how various modifiers affect damage levels of skills or whatever. It’s just so pointless. I ended up completely skipping everything that was formatted as a table, and I honestly don’t think I missed much—if anything—of value. This experience reaffirms my stance that the best type of LitRPG is minimalist, like *The Wandering Inn*\n", - "> * The dream/soul sequences. Just so boring. Like, I’m already reading a work of escapist fiction, and then the protagonist has to go in his own head and we (the readers) are shown how he tediously imagines-into-existence a space station or whateverthefuck? Then he’s also constantly dealing with soul fracturing or whatever because he apparently powerleveled too hard or something? Like, I get the feeling that the author realized that they were making the protagonist too powerful and then pumped the nerf-brakes a bit, “forcing” them to delve (heh) so that they don’t die of essence starvation (whatever that is) but it just felt so contrived and like a pointless sidequest. \n", - "> * Non-protagonist POV fawning; a staple of the genre. There are occasionally non-protagonist POV chapters or sections, but they are essentially all (impolitely put) just fellating the protagonist in some way. They’re all like “OMG he’s so terrifying!!!” but then “Huh, he’s actually nice?!?” for allies or “Hah I will crush this worm under my boot!” but then “Oh no, woe is me, I underestimated his powerlevel!”\n", - "> * The memes. This is a minor stylistic choice that I didn’t like, but the protagonist really comes across as terminally online.\n", - "> \n", - "\n", - ">> **u/megazver** [+11] *\n", - ">> \n", - ">> Thanks for all the reviews!\n", - ">> > The math. Oh my god, the math. I get that one of the primary draws of the LitRPG genre is “numbers go up”, but like large portions of the book (by page count) are just excel tables showing how various modifiers affect damage levels of skills or whatever. It’s just so pointless. I ended up completely skipping everything that was formatted as a table, and I honestly don’t think I missed much—if anything—of value. This experience reaffirms my stance that the best type of LitRPG is minimalist, like The Wandering Inn\n", - ">> There is a certain demographic I've seen around (nerds probably very On The Spectrum) who really, really care about the math and actually, like, check it and get angry when it doesn't work and on one hand I am glad there is something that they can enjoy, but hooboy do I not want to actually read or write it myself.\n", - ">> \n", - "\n", - ">>> **u/DangerouslyUnstable** [+6] *\n", + ">>> **u/Fomalhaut-b** [+1] *\n", ">>> \n", - ">>> I agree with the parent comment that they can be skipped and not much of value is lost (I skip them when I do my once-every-six-months-catch-up). I think that the work would be better if all of those stat block/tables where relegated to a hidden authors note or on another site or something so the people who cared could check them and they wouldn't bog down everyone else.\n", - ">>> However, I think if the author did that, it would further highlight how _little_ he actually writes every month, in comparison to how much he is getting in patreon dollars (or at least....was last time I looked at it a long time ago).\n", + ">>> > a Bakora gate... all the crystallized mana .. pay for a single activation, a one-way ticket.\n", + ">>> There's three plot threads converging towards this. There are ~~Banora~~Bakora Gates in both the timeloop, and the real world. Connecting them could make an exit. Silverlake, the Silent Doorway Adepts, and Xvim can manipulate dimensional gateways. Sudomir Kandrei's has a giant mana crystal that can absorb a cataclysmic amount of life force.\n", + ">>> This seems possible.\n", ">>> \n", "\n", - ">>> **u/Dragongeek** [+9] *Path to Victory**\n", - ">>> \n", - ">>> RPGs are fundamentally an abstraction of the real world and the systems start breaking down when you get to the nitty gritty of \"What exactly is a hitpoint, and how injured am I if I am missing one?\"-type of question. \n", - "\n", - ">>> Doing too much math is therefore something like a significant figures problem. You're going from \"complex real world\" to \"simplified RPG stats\" back to \"complex calculations\", and you can't just generate meaningful complexity from simplicity in this case.\n", - ">>> \n", - "\n", - ">>>> **u/Audere_of_the_Grey** [+8] *Grey Collegium**\n", + ">>>> **u/Tommy2255** [+2] *\n", ">>>> \n", - ">>>> this is an overly narrow view of RPGs. litRPGs in general go from complex real world, to abstracted RPG stats, back to the impact of those stats on a less-abstracted fictional world and how the results differ from the original complexity of how things work without litRPG mechanics.\n", + ">>>> > There are Banora [sic] Gates in both the timeloop, and the real world. Connecting them could make an exit.\n", + ">>>> That doesn't make any sense at all. There's absolutely no reason to believe that any teleportation method, no matter how exotic, could get them out of the pocket dimension. The only connection between the real world and the time loop is the Sovereign Gate.\n", ">>>> \n", "\n", - ">> **u/sparkc** [+2] *\n", + ">>>>> **u/Fomalhaut-b** [+1] *\n", + ">>>>> \n", + ">>>>> You're right, it doesn't. There's also too little information about them to make this work. So far, dimensional gates have been shown to circumnavigate all the known problems that teleportation suffers- such as distance, needing to know the destination, and wards. \n", + ">>>>> >The only connection between the real world and the time loop is the Sovereign Gate.\n", + ">>>>> The Sovereign Gate is barred, but it's not inactive if RR is travelling through it between the Timeloop and the Real world. If that connection didn't exist, then the Timeloop world would be already dissolved. Perhaps the Bakora gate can piggyback on this connection? All speculation. I'm desperately trying to find a way out for Zorian, preferably with his body intact.\n", + ">>>>> It seems very possible that the Primordial is not within the Timeloop, and is being summoned from a pocket universe that is located outside of both the Timeloop, and the Real world. It's bridged by a lifeforce/blood connection. This is something that Zorian will have between himself and his irl self. If this is true, it indicates that another exit can be made, but will trigger the loop. A solution is to wait until the final loop.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> I'm pretty sure that it would be possible to ward against gates, just not with a standard teleport ward. And I get the impression that the invaders' gate consumes rather a lot of mana, though perhaps less than teleporting. Gates don't really bypass all the usual problems, although they may be a better tool in some cases for those who can actually make them.\n", + ">>>>>> \n", + "\n", + ">>>>>> **u/Tommy2255** [+2] *\n", + ">>>>>> \n", + ">>>>>> There's no reason to suspect any relationship whatsoever between the Bakora Gates and the Sovereign Gate. The only thing they share is that they have Gate in the name and we learned about them fairly close together. They're different technologies from entirely different civilizations and time periods which work according to completely different principles.\n", + ">>>>>> >I'm desperately trying to find a way out for Zorian, preferably with his body intact.\n", + ">>>>>> They have a way out. Collect the keys, unlock the Sovereign Gate, walk out.\n", + ">>>>>> If the Primordial were being summoned from a pocket universe outside of both the loop and the real world, that would imply that a) all pocket universes would display unexpected behavior during the loop, in particular a Bag of Holding or somesuch would let you send information from one loop to the next and eventually out of the loop, which directly contradicts one of the primary design goals of the Sovereign Gate b) it wouldn't work more than once, since summoning the Primordial into a world and then destroying that world would either destroy the Primordial or cause devastating consequences across all nearby universes, neither of which is consistent with what we've observed.\n", + ">>>>>> Even if some kind of blood-bridge to summon looped!Zorian bodily back into the real world were possible, that bridge would have to go through the Sovereign Gate for the same reason that the ritual to summon the Primordial has to happen at the hole. You can only access a pocket universe at the point where the pocket universe connects to the rest of the universe. The problem with this is that *the Gate is barred*. You'd still have to unlock it, which would still require finding the keys, at which point you could just walk through. The only advantage is that the summoning thing might be able to move you through bodily rather than having your spirit supplant your original self, which is extremely useful but not necessarily worth the tremendous difficulty involved in designing such a ritual.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> > They're different technologies from entirely different civilizations and time periods which work according to completely different principles.\n", + ">>>>>>> This may not be true. The Sovereign Gate utilizes time magic and dimensionalism. Bakora Gates use dimensionalism. I'm not saying they're necessarily related, but there may be a connection that can be exploited.\n", + ">>>>>>> For example, imagine there is a dimensional bridge connecting the loop dimension and the real dimension. What if Bakora Gates can punch into that exit path?\n", + ">>>>>>> But I agree that the keys are certainly their best bet. I wouldn't be surprised if unexpected problems arise however.\n", + ">>>>>>> I think the strongest case against these kinds of dimensionalism shenanigans is that, from a storytelling perspective, they would feel very deus ex machina, especially when the Sovereign Gate keys are a valid option.\n", + ">>>>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>> \n", + ">>>>>> I love this theory of yours. Very original. Dimensionalism is the study of wormholes, so I think it's an avenue worth exploring.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/Fomalhaut-b** [+2] *\n", + ">>>>>>> \n", + ">>>>>>> Silverlake is going to be a large part of the answer. Zorian noted that her home is inside a pocket. \n", + ">>>>>>> It's the nature of \"tests\" in Mother of Learning, that Zorian is going to have to develop some kind of skill that's crucial to getting the Grey Hunter eggs, that Silverlake needs him to know. The Haste spell that his simulacrum used during the encounter is also in that area of magic (and a big tip off). Zorian's dimensional gate also had some success against the Grey Hunter. \n", + ">>>>>>> I'm trying to my best to be a good reader of what the author has constructed in this world. It's a struggle not to turn everything Zorian encounters into a Chekov's Armoury. This is my first encounter with \"rational\" literature, and it's full of novelty -not just the cheery spider.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>>> \n", + ">>>>>>>> Honestly, it had totally skipped my mind that the Silverlake's disappearing house shenanigans was dimensionalism. I'm very curious what specific skills Silverlake thinks is necessary to kill the spider, and I wonder if Silverlake somehow knew Zorian was marked in the first place.\n", + ">>>>>>>> Novelty . . . I really miss the Cyoria web . . .\n", + ">>>>>>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>> \n", + ">>>>> > best \n", + ">>>>> The Gate spell is essentially a wormhole. A Bakora Gate may indeed have the ability to connect to the original universe given the collaboration of several dimensionalism experts.\n", + ">>>>> \n", + "\n", + ">> **u/valeskas** [+9] *\n", ">> \n", - ">> I really appreciate all the in-depth reviews\n", + ">> > not Veyers\n", + ">> Unless Veyers somehow struck a bargain with Panaxeth. And got Body Mark II With Bigger Brain or something.\n", + ">> Also, as a minor thought, the Gate itself is suspiciously well suited to avoid interference from other planes of existance.\n", ">> \n", "\n", - "> **u/lsparrish** [+6] *\n", - "> \n", - "> I've been having a lot of fun reading [The Stubborn Skill-Grinder In A Time Loop](https://www.royalroad.com/fiction/83294/the-stubborn-skill-grinder-in-a-time-loop). Exactly what it says on the tin.\n", - "> Not a rational MC (at least, we're supposed to think he's not), just a regular guy in a recognizable LitRPG setting who systematically bulls his way through challenges with infinite willpower (lampshaded as such) who gets to keep his skill level gains with every reset. He encounters plenty of transmigrators, reincarnators, gods, cultivators, etc. but he is just some orphan with a weirdly stubborn outlook. Analysis? Schemes? He's not stupid, he just doesn't want to concern himself with such things, he just wants to grind. Slinging spells from a distance? What a cowardly way to fight! Risk of permanent soul damage? Sounds like good training, bring it on!\n", - "> \n", - "\n", - "> **u/evesoup** [+6] *\n", - "> \n", - "> Really enjoying [Like No One Ever Was](https://www.royalroad.com/fiction/84675/like-no-one-ever-was). Unlike other pokemon reincarnation fanfic, the protag, Nemona, is smart and has a consistent personality.\n", - "> For example, I don't really like Pokemon Trainer Vicky as much because the character seems to jump between 10 year mindset and a full grown adult.\n", - "> Both fics make it out like these two are prodigies in pokemon battling but Vicky is mostly just cruising on by with game knowledge, whereas, Nemona has game knowledge *and* is actually smart.\n", - "> Also the characterization in LNOEW is just way better and actually have depth to them.\n", - "> \\_\\_\\_\\_\n", - "> Besides that, any other fics that deal with reincarnated children considered prodigies by others where the MC is actually smart enough to use their knowledge?\n", - "> \n", - "\n", - ">> **u/ReproachfulWombat** [+8] *\n", - ">> \n", - ">> The writing of LNOEW is definitely not as good PTV, but I've been enjoying it more. Thanks for the recommendation. Nemona is a much more interesting protagonist.\n", - ">> I have to say though, the latest chapter was extremely unsatisfying from a rational perspective. >!The 'rich kid uses money and connections to thwart the protagonist' is a classic trope, yes, but it's usually done to plucky, poor protagonists to demonstrate the unfairness of the system that they have to struggle against. Nemona is both richer AND more well connected than her opponent, something both she, he and the corrupt judges seem to completely forget for no reason. It's not like they don't know who she is either. The announcer spent the whole tournament shouting her full name to all and sundry and she's being followed around by her maid, and the people involved are business partners with her family. It's just... what?!<\n", - ">> \n", - "\n", - ">>> **u/Trew_McGuffin** [+3] *Dao = Improve Yourself**\n", + ">>> **u/thrawnca** [+5] *Carbon-based biped**\n", ">>> \n", - ">>> Being charitable to Nims, Rotom touches a bit on what you've layed out and that keeps my suspension of disbelief more intact than not with some eye squinting.\n", - "\n", - ">>> >!She blinked, snapping her fingers as if suddenly realizing: ‘Oh right, I’m rich, I can easily get a flying cab to pick him up quickly.” Flying cabs don’t cost that much. But **Nemona can be weirdly miserly** considering the family she was born into. Not that I would tell her that, and if I did, she’d probably just say she was being practical.!<\n", - "\n", - ">>> >!I see that as her 'getting' she's rich but not really. Along with her not really wanting to lean on her riches usually, with presumably the same applying to connections.!< \n", - "\n", - ">>> I sorta look forward to the fallout, the author indicated that there would be some. The comments that chapter were totally, delightfully, and hilariously bloodthirsty lol.\n", + ">>> > struck a deal with Panaxeth\n", + ">>> Yeah, no. There is nothing anyone could conceivably offer that thing, even assuming it's sufficiently comprehensible to negotiate with. And if he knew a way to force it to do anything, he wouldn't have needed to spend time optimising the invasion; he would have been successful already.\n", ">>> \n", "\n", - ">> **u/Makin-** [+6] *homestuck ratfic, you can do it**\n", + ">>>> **u/valeskas** [+3] *\n", + ">>>> \n", + ">>>> > nothing anyone could conceivably offer that thing\n", + ">>>> Panaxeth probably wants an optimized invasion, so it can get out of prison reliably when time loop is over.\n", + ">>>> \n", + "\n", + ">>>>> **u/GodKiller999** [+2] *\n", + ">>>>> \n", + ">>>>> It's quite clear that the invasion is extremely hard to beat, even when the invaders lose the element of surprise they still manage to summon him.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/valeskas** [+2] *\n", + ">>>>>> \n", + ">>>>>> > It's quite clear\n", + ">>>>>> 1) There is Zach, so alternative to optimized invasion is optimized city defense.\n", + ">>>>>> 2) There is a chance that angels are more efficient than demons.\n", + ">>>>>> \n", + "\n", + ">>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>> \n", + ">>>>> I think it's the other way around-Panaxeth doesn't want to get out of bed, so he activated the loop to optimise Zach and city defence.\n", + ">>>>> \n", + "\n", + "> **u/Stop_Sign** [+46] *\n", + "> \n", + "> Cheeky simulacrums. I love it.\n", + "> \n", + "\n", + ">> **u/None** [+35] *\n", ">> \n", - ">> EDIT: Just finished the fic you recommended. I didn't like at all that Nemona seems to still rely on anime protagonist fiat to win fights >!(it can bizarrely take more hits than the fully evolved enemy, for example, instead of genuinely only winning through Nemona's smarts like in *some* of Most Evil Trainer),!< and I agree the whole conceit of the fight not only makes no sense but is just a bad cliche.\n", - ">> > I don't really like Pokemon Trainer Vicky as much because the character seems to jump between 10 year mindset and a full grown adult.\n", - ">> In its defense, this is less an unintended flaw and more the premise. Other SIs have the protagonist be an adult in a child's body, PTV makes her act 10 years old whenever it would be funny.\n", + ">> I empathized with the simulacrums. Past me has made some pretty tough New Year's resolutions that present me doesn't like much.\n", ">> \n", "\n", + ">>> **u/thrawnca** [+19] *Carbon-based biped**\n", + ">>> \n", + ">>> I reckon he should treat his simulacra more like equals. In personality and intelligence, after all, they're almost the same as him. Maybe, rather than assuming he's the master, they should negotiate tasks more. But I guess that wouldn't help Simulacrum 2, since the whole point of going to class was to test the disguise, so the original couldn't take that job. And for life-threatening tasks like baiting the spider, original!Zorian is harder to replace.\n", + ">>> He could, at least, before creating a batch of simulacra, roll dice to decide which task each Zorian will have (including, when feasible, the original). Then they wouldn't have to wonder, Why did I get the boring job?\n", + ">>> And maybe they could have social events! Team-building! He doesn't like chess, but maybe he'd enjoy a party where everyone is him. Or a football match.\n", + ">>> \n", + "\n", + ">>>> **u/None** [+10] *\n", + ">>>> \n", + ">>>> I was actually thinking if he uses the simulcrum to probe the minds of those people whom Xvim had mentioned in the list, since he restraining himself to do so. But then again it comes with a considerable amount of risks if the simulcrum differs too much.\n", + ">>>> \n", + "\n", + ">>>>> **u/RMcD94** [+7] *\n", + ">>>>> \n", + ">>>>> But why would his simulacrum be willing to do that\n", + ">>>>> \n", + "\n", + ">>>>>> **u/OutOfNiceUsernames** [+14] *fear of last pages**\n", + ">>>>>> \n", + ">>>>>> Because one of his current major reasons against mind-probing non-criminals is that the very acts themselves will gradually change his moral principles and thought patterns (e.g. “I don’t like how that guy’s staring at me. → I should put a compulsion on him to go sit elsewhere.” or “I don’t know if my allies are still loyal to me. → I should [check the last 72 hours of their personal experiences](https://www.youtube.com/watch?v=4wGczRx1Bd8) without warning them just to be sure.”).\n", + ">>>>>> With simulacrums that only live <24 hours, gradual changes like this aren’t a concern. But as ani_12 said, if they see [something](http://tvtropes.org/pmwiki/pmwiki.php/Main/GoMadFromTheRevelation) [really](https://i.imgur.com/2AXGtZfg.jpg) [nasty](http://www.scp-wiki.net/system:page-tags/tag/mind-affecting) inside the target’s mind, they could turn on Zorian!prime without him even realising quickly enough what’s happening.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/RMcD94** [+3] *\n", + ">>>>>>> \n", + ">>>>>>> But you would you'd just have make a simulacrum to make the compulsion on him\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/OutOfNiceUsernames** [+7] *fear of last pages**\n", + ">>>>>>>> \n", + ">>>>>>>> If you mean you’d still be affected by the act of mind-wiping even if you used your clone as a proxy instrument, then I don’t agree. If you use a clone, you are shielding yourself from the the more “visceral” parts of the experience. \n", + ">>>>>>>> It’s like if you had to kill a person for some reason. It would’ve been much easier if all you had to do was decide that they have to be killed and they just died — you wouldn’t have nightmares about it, your human psyche wouldn’t have to re-align itself around this new important experience, etc. \n", + ">>>>>>>> It would still change you, but not as much on an unconscious level as the first-hand experience would.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/RMcD94** [+3] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> No I'm saying that if you accept that doing something immoral makes you more likely to do something immoral, then using a proxy to commit that immoral deed just means that you're more likely to use a proxy to do something immoral.\n", + ">>>>>>>>> The mental repercussions are a separate thing entirely, but I don't think it's important considering how many people's he has mindraped before who really though no fault of their own are on the side against him. It's not like all criminals are inherently evil.\n", + ">>>>>>>>> Regardless if we simplify it to killing people ever, using a gun to kill people instead of your hands, doesn't mean you will kill people less (which is what I think he's worried about).\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/OutOfNiceUsernames** [+9] *fear of last pages**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> > I don't think it's important considering how many people's he has mindraped before who really though no fault of their own are on the side against him. It's not like all criminals are inherently evil.\n", + ">>>>>>>>>> It’s not about his targets being “inherently evil”, it’s about setting at least some kind of boundaries in his mind regarding who can be an acceptable target (e.g. eldritch entity summoners, their goons, their support network, etc) and who can not. Friend-or-foe differentiation is usually very important in matters like this for people, especially during wartime when soldiers have to kill or torture their enemies. For instance, even members of Unit 731 had to be trained to double-think around their victims being humans and think of them as wooden logs.\n", + ">>>>>>>>>> >if you accept that doing something immoral makes you more likely to do something immoral, then using a proxy to commit that immoral deed just means that you're more likely to use a proxy to do something immoral.\n", + ">>>>>>>>>> I agree with that, but only partially. What I was trying to point out in [my original comment](https://www.reddit.com/r/rational/comments/5lhlt3/rt_mother_of_learning_chapter_63/dbx0hre/?utm_content=permalink&utm_medium=front&utm_source=reddit&utm_name=rational) was that immoral actions are not all grouped together in a single homogeneous bundle, and that if a person is ready to make immoral choice A then it doesn’t automatically mean that they’re also read to make *any* immoral choice at all.\n", + ">>>>>>>>>> Let’s assume there’re two versions of Zorian: one who’s ok with mind-probing non-criminals personally, and another who’s ok with doing that through a proxy clone. \n", + ">>>>>>>>>> The first one mind-probes people day after day, and gradually starts to realign his morality principles in an even more drastic manner so that all his personal experiences of what he considers mind-probing of innocent people wouldn’t paint him as some kind of a monster in his own eyes. Eventually, this Zorian!A’s moral compass will change so much that he’ll not only be ok with mind-probing them, but also with mind-torturing them, mind-torturing their families for leverage, etc. And each immoral choice that’s one step harder will warp his morality principles even more. \n", + ">>>>>>>>>> The second one, on the other hand, will know that he’s mind-probing people, but since this knowledge is more of the academic variety because he himself has none of the first-hand “personality-contaminating” experience, through time he’ll stay on the same level of only being ready to mind-probe non-criminals when there’s a very dire need for that. He *may* decide to make some harder immoral choices, but those decisions won’t be affected by his deteriorating moral principles as much as it would’ve been the case with Zorian!A.\n", + ">>>>>>>>>> *p.s. This all is of course only my current opinion. Also, this is likely my last comment in this comment chain. Thanks for the discussion!*\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>>>>> \n", + ">>>>>>> Hm, I think I'd enjoy Black Mirror.\n", + ">>>>>>> P.S. Everyone should click the [second link](http://www.scp-wiki.net/scp-2708) in the above post. SPC . . . ♥\n", + ">>>>>>> \n", + "\n", + ">>>>> **u/Veedrac** [+2] *\n", + ">>>>> \n", + ">>>>> I had the same idea, but all that does is remove the process one step. If he gets used to probing people through an intermediary, the same problem has occurred.\n", + ">>>>> \n", + "\n", + ">>>> **u/None** [+6] *\n", + ">>>> \n", + ">>>> He could also do collaborative activites as a team of simulacra, work with himslef to brainstorm plans, design spell formulae etc. \n", + ">>>> Given that we see the first one transfer memories to Zorian its unclear why he isn't taking memories from the later ones.\n", + ">>>> \n", + "\n", + ">>>>> **u/RMcD94** [+1] *\n", + ">>>>> \n", + ">>>>> Fighting himself seems useful\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> More resistance training maybe?\n", + ">>>>>> Fighting himself would have limitations. He can't really learn new techniques that way, so not really helpful for things like martial arts, and he doesn't need a sentient target for things like making force spells transparent. He could encourage the growth of his mana reserves, I guess, but he's already using them plenty, and maxing that out is supposed to be a bad idea.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> The simulacra could execute strong mind magic attacks in a controlled environment for Zorian to defend himself against. I'm sure there are plenty of interesting training regimens he could come up with---simultaneous and detailed pupeteering of highly sentient enemies and compulsions come to mind, especially of the \"give yourself greater focus\" variety.\n", + ">>>>>>> Imagine he gets two simulacra and practices puppeteering them simultaneously while maintaining combat effectiveness for himself. It's essentially like turning enemies into mini-simulacra for the price of some mind magic---which is much cheaper.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> Would he consent to be puppeteered himself in that manner?\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> I would in a heartbeat. He's done similar and been subjected to similar things in the past, though more benign and less invasive.\n", + ">>>>>>>>> >As for himself, he mostly practiced tapping into other people's senses with [Tinami].\n", + ">>>>>>>>> >Truthfully, there was very little that practicing with Tinami could offer him that he could not also do with Kirielle, Kael or some random stranger.\n", + ">>>>>>>>> And then there was the animation spell Ilsa had him use to teach his classmates how to dance.\n", + ">>>>>>>>> I think if he was the one doing the control on himself, he'd be willing. It's not like he'd make his simulacra do uncomfortable things during the training—move around, cast spells, do unstructured magic, etc.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Would his simulacra agree? It's not like they are getting anything out of it.\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>>>>>> \n", + ">>>>>>>>>>> Depends on how they look at it. The simulacra are extensive of Zorian in a way and have proven themselves nature enough to put up with less pleasurable tasks for the sake of the mission.\n", + ">>>>>>>>>>> \n", + "\n", + ">>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>> \n", + ">>>>> > he isn't taking memories from the later ones\n", + ">>>>> Sure he is. Simulacrum 2 was heading back to report at the end of the day.\n", + ">>>>> However, it appears that the simulacra are choosing which memories to send. Thus, pranking ensues.\n", + ">>>>> What's more interesting is that this one didn't use a telepathic relay. But it does make sense: with multiple simulacra and non-hazardous missions, he really doesn't need to invest in making lots of relays.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/None** [+1] *\n", + ">>>>>> \n", + ">>>>>> > However, it appears that the simulacra are choosing which memories to send. Thus, pranking ensues.\n", + ">>>>>> > \n", + ">>>>>> Ah, I thought they were talking about verbal reporting not mental\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>> \n", + ">>>>>>> > verbal reporting not mental\n", + ">>>>>>> Quite possibly both. Voice+surface thoughts and emotions for trivial stuff, memory packets for anything more important/complex.\n", + ">>>>>>> \n", + "\n", + ">> **u/ElecNinja** [+24] *\n", + ">> \n", + ">> Pretty fun to see a new perspective even if it's a clone of the MC.\n", + ">> \n", + "\n", + "> **u/AmeteurOpinions** [+44] *Finally, everyone was working together.**\n", + "> \n", + "> I love love love that, despite all the foes Zach and Zorian have conquered, that damn grey hunter is still a total pain in the ass.\n", + "> \n", + "\n", + ">> **u/None** [+43] *\n", + ">> \n", + ">> [deleted]\n", + ">> \n", + "\n", + ">>> **u/-Fender-** [+37] *\n", + ">>> \n", + ">>> Spiders are OP in this story. The author might have a fetish. Too much Kumo. But then again, that probably applies to most of us here.\n", + ">>> \n", + "\n", + ">>>> **u/MetagamingAtLast** [+11] *\n", + ">>>> \n", + ">>>> That's because they're based on Exile/Avernum's friendly talking spiders, which are usually a fun highlight of the playthrough. They're [pretty great](http://images.akamai.steamusercontent.com/ugc/939250719522111954/C1323691451DF3EEEBD9142FD29D0D3D31B905B6/).\n", + ">>>> \n", + "\n", + ">>>> **u/None** [+6] *\n", + ">>>> \n", + ">>>> [removed]\n", + ">>>> \n", + "\n", + ">>>>> **u/-Fender-** [+18] *\n", + ">>>>> \n", + ">>>>> http://raisingthedead.ninja/current-j-z/kumo-desu-ga-nani-ka/\n", + ">>>>> Literally translates to \"So I'm a spider, so what?\". Story about a girl reincarnating in another world as a spider. Very fun read, definitely recommend it, like most people here would.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/UltraRedSpectrum** [+20] *\n", + ">>>>>> \n", + ">>>>>> For the record: reincarnating in a *fantasy* world as a *giant monster spider.* People keep just saying \"spider,\" and I went into it expecting the main character to be reincarnated into a regular, everyday spider. This is not the case.\n", + ">>>>>> \n", + "\n", + ">>>>>> **u/TimTravel** [+16] *\n", + ">>>>>> \n", + ">>>>>> > Story about a squirrel reincarnating in another world as a spider. \n", + ">>>>>> My girl to squirrel foxreplace script strikes again.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/OutOfNiceUsernames** [+3] *fear of last pages**\n", + ">>>>>>> \n", + ">>>>>>> Now I can’t decide if a squirrel-to-spider protag would’ve been *more* confused than a girl-to-spider protag, or less.\n", + ">>>>>>> ~~Also, did you create that replacement because everyone knows girls don’t really exist?~~\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/TimTravel** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> My replacements are:\n", + ">>>>>>>> cloud -> butt\n", + ">>>>>>>> girl -> squirrel\n", + ">>>>>>>> man -> robot\n", + ">>>>>>>> beer -> bear\n", + ">>>>>>>> \n", + "\n", + ">>>>>> **u/nobody103** [+8] *\n", + ">>>>>> \n", + ">>>>>> Fun fact: I had read that story and liked it.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/-Fender-** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> Oh, it's still ongoing. But good reading tastes, I like that.\n", + ">>>>>>> \n", + "\n", + ">>>>>> **u/vallar57** [+8] *Unseen University: Faculty of High-Energy Magic**\n", + ">>>>>> \n", + ">>>>>> Indeed! Also, the early chapters are re-translated in a much higher translation quality by [blastron](http://blastron01.tumblr.com/kumoko-contents).\n", + ">>>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+3] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> Hmm... Kumo vs grey hunter would be an interesting match-up. I wonder at what point she became able to beat it? Zoa Ere maybe?\n", + ">>>>>> \n", + "\n", + ">>>>>> **u/cyberdsaiyan** [+2] *\n", + ">>>>>> \n", + ">>>>>> Reporting in one week after reading this comment.\n", + ">>>>>> I've spent my entire past week reading this.\n", + ">>>>>> Thank you very much for introducing me to the almighty Kumo-chan!\n", + ">>>>>> \n", + "\n", + ">>> **u/CaptainMcSmash** [+13] *\n", + ">>> \n", + ">>> Yeah, my first thought when reading Silverlake essentially trained the spider was, why not just find a different one then? It might be worth an investment of time to find another, younger and less experienced Grey Hunter that would be easier to subdue, after all there's no reason it has to be that particular one. Though if they're as rare as the author says, might not be possible.\n", + ">>> \n", + "\n", + ">>>> **u/Saffrin-chan** [+10] *\n", + ">>>> \n", + ">>>> They're really rare, and you *also* have to find one with an egg sack, so they probably won't be able to find another one.\n", + ">>>> \n", + "\n", + ">>>>> **u/OutOfNiceUsernames** [+4] *fear of last pages**\n", + ">>>>> \n", + ">>>>> It would be neat if they eventually decided to raise some of this grey hunter mother’s hatchlings in some natural reserve in the real timeline to preserve her species. The species is dangerous, but also a goldmine of magical research material.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+3] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> Just breed dragons instead. Even more magical, and less likely to kill you on sight. Seriously, even an enraged mother dragon is likely to be less aggressive than that thing.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/melmonella** [+2] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>> \n", + ">>>>>>> >dragons\n", + ">>>>>>> >less likely to kill you\n", + ">>>>>>> That seems doubtful.\n", + ">>>>>>> \n", + "\n", + ">>>>>>> **u/GodKiller999** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> Dragons might oppose their kind being treated like livestock, they are sapient after all.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> Of course they would be angry. But so is the spider...\n", + ">>>>>>>> \n", + "\n", + ">> **u/thrawnca** [+7] *Carbon-based biped**\n", + ">> \n", + ">> There must be ways they can do this. Maybe they should attack it in its lair, negating its mobility. If Zorian can cover the entrance with a gate leading to a trap, they could then bombard it through the gate... Potion grenades maybe?\n", + ">> Or drop the trap right over the hole so it can't get past without touching it, and if it holds back, start psychically digging through its magic resistance.\n", + ">> Or make a simulacrum army and overwhelm its magic resistance with psychic brute force.\n", + ">> Or provoke it into jumping and catch it in the air. Once it's already off the ground, it will have a harder time dodging. Can they make a frictionless hemisphere of force for it to land in?\n", + ">> \n", + "\n", + ">>> **u/SimonSim211** [+6] *\n", + ">>> \n", + ">>> If they could teleport it (it and the whole cave using a metric ton of mana crystals ) they could solve so many issues, just think lich vs spider or treasury vs spider or giant undead dragon vs spider\n", + ">>> \n", + "\n", + ">>>> **u/None** [+7] *\n", + ">>>> \n", + ">>>> As amusing as it is to imagine the grey hunter suddenly plummeting down on the lich, they unfortunately still need to get the eggs sacks intact\n", + ">>>> \n", + "\n", + ">>>>> **u/SimonSim211** [+5] *\n", + ">>>>> \n", + ">>>>> Only for one restart, also consider placing it into a black room without food to weaken it without harming the eggs\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+6] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> Easier to use one of Zorian's early ideas and seal it inside its lair with terrain alteration.\n", + ">>>>>> \n", + "\n", + ">>>>>> **u/None** [+1] *\n", + ">>>>>> \n", + ">>>>>> Maybe they could cover a large area outside the cave entrance with a rune that, when stepped on, teleports the spider? If they just wait for it to come out on its own without alerting it the grey hunter might not sense the trap.\n", + ">>>>>> \n", + "\n", + ">>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>> \n", + ">>>> You can't safely cast a spell using a metric ton of mana crystals. Most of the mana would still be in its raw form, so if you use it, you're subject to poisoning and madness.\n", + ">>>> \n", + "\n", + ">>>>> **u/SimonSim211** [+1] *\n", + ">>>>> \n", + ">>>>> Well I know of a lot of cultists that could be manipulated into casting it...\n", + ">>>>> \n", + "\n", + ">>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>> \n", + ">>>> Lich vs spider would be funny, but no real contest. He's basically indestructible to physical force, therefore almost certainly bite-proof. He can teleport reflexively. He can fire magical projectiles that pierce all known shielding, like that green javelin. And the spider might well ignore him completely, like the simulacrum.\n", + ">>>> \n", + "\n", + ">>> **u/Tanath** [+4] *LessWrong (than usual)**\n", + ">>> \n", + ">>> Its \"trump card\" negates catching it in the air pretty well.\n", + ">>> \n", + "\n", + ">>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>> \n", + ">>> It occurs to me that the spider has managed to break everything physical within reach. Rocks, golems, magical planes of force; it shatters them all.\n", + ">>> There must be a limit. If Zorian makes a really big golem, focused on physical resilience - no need for warding against fire etc - maybe it can survive. Then they would have a real shot at the eggs.\n", + ">>> \n", + "\n", + ">>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>> \n", + ">>> Someone on the blog brought up the question of whether magical flash-bangs exist, and the author confirmed that they do, although mages can easily block them.\n", + ">>> Saturation bombing from aerial simulacra could be perfect for wrecking the spider's super senses.\n", + ">>> \n", + "\n", + ">> **u/TwoxMachina** [+6] *\n", + ">> \n", + ">> Hmm, with all the dodging, I think they need to cast more Wall spells.\n", + ">> Like wall of fire to herd it into a trap. Can't dodge a whole plane of attack.\n", + ">> Box it in, then cast a non-lethal spell, so that if it dodges, it'll dodge INTO the lethal wall of fire.\n", + ">> EDIT: IMO, 1st, put a ceiling to things. Horizontal Wall of Fire, just right above human height. Can't jump well without headspace. Heck, just Maze the whole battleground.\n", + ">> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+1] *\n", + ">>> \n", + ">>> Very nice.\n", + ">>> Another:\n", + ">>> Block the cave entrance, then use magic to leech air from through any cracks until the spider suffocates. Or fill the cave with water somehow.\n", + ">>> \n", + "\n", + ">>>> **u/winz3r** [+4] *\n", + ">>>> \n", + ">>>> And while doing this play the Rains of Castamere.\n", + ">>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>> \n", + ">>>>> > Rains of Castamere\n", + ">>>>> Hahaha, perfect. Having never seen GoT, I had no idea what that is until now.\n", + ">>>>> \n", + "\n", + ">>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>> \n", + ">>>> What makes you think it can't break through walls?\n", + ">>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>> \n", + ">>>>> I wasn't sure why I thought the spider could break through walls of force, so I reread those paragraphs and found this:\n", + ">>>>> >Zach trapped it in a cage of dense, layered force, but the grey hunter mother shattered each one like it was made of paper and burst free before Zach and Zorian could strengthen the prison enough to hold her.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> Not to mention the magically strengthened rock that it kicked to pieces in mid-air. Seriously, this spider is a ninja.\n", + ">>>>>> \n", + "\n", + "> **u/Fredlage** [+36] *\n", + "> \n", + "> So, I've been thinking about how Zorian could better abuse the simulacrum and this chapter completed an idea. Zorian has been musing about enhancement rituals and the author stated that many of those straight up copy magical abilities from magical creatures. So, Zorian should figure a way to copy the cranium rats' hive mind ability (which is a kind of mind magic, so it should mesh well with his natural ability) then figure how to make the mental connection through his soul (or just use relays if that's not feasible) and voila, hive mind Zorian and his simulacra. That'd be interesting.\n", + "> \n", + "\n", + ">> **u/chaosmosis** [+28] *and with strange aeons, even death may die**\n", + ">> \n", + ">> Redacted. ` this message was mass deleted/edited with redact.dev `\n", + ">> \n", + "\n", + ">>> **u/Fredlage** [+2] *\n", + ">>> \n", + ">>> How so?\n", + ">>> \n", + "\n", + ">>>> **u/None** [+7] *\n", + ">>>> \n", + ">>>> Psychic feedback loops hard-coded into your soul with a magical ritual, trying to integrate higher-order minds into a gestalt using a schema that has only been shown to be successful when creating an aggregate entity of moderate intelligence out of a bunch of feckin' rats?\n", + ">>>> \n", + "\n", + ">>>>> **u/Fredlage** [+3] *\n", + ">>>>> \n", + ">>>>> Ok, maybe test it with an enhancement potion first.\n", + ">>>>> \n", + "\n", + ">> **u/throwawayIWGWPC** [+10] *\n", + ">> \n", + ">> That'd be pretty awesome.\n", + ">> \n", + "\n", + ">> **u/DR_Hero** [+5] *\n", + ">> \n", + ">> It would be interesting to see how that spell would effect his sense of self.\n", + ">> \n", + "\n", + ">> **u/cretan_bull** [+4] *\n", + ">> \n", + ">> I have another idea for simulacrum abuse.\n", + ">> Simulacra share Zorian's mana supply. If simulacra were to do the mana-regeneration meditation procedure near the Cyoria well they should be able to regenerate Zorian's mana in parallel.\n", + ">> We have not yet seen any range limitation on maintaining the simulacra, or a numerical limit on the number he could maintain at once.\n", + ">> The apparent lack of a range limitation should allow Zorian to effectively bypass the constraints on mana use when far away from a mana well.\n", + ">> As Zorian can maintain a number of simulacra simultaneously while being principally concerned with their use of mana-intensive spells rather than any sort of constant mana draw, and on the other hand Zorian can regenerate his entire mana reserves in a matter of minutes when near the Cyoria well, maintaining such simulacra should provide Zorian with far more mana than they consume.\n", + ">> This idea may not work as well if mana regeneration is principally limited by the ability of the soul to assimilate mana. In which case Zorian should still see substantial benefits from having a single simulacrum dedicated to mana regeneration, however he would not see additional benefits from having more.\n", + ">> \n", + "\n", + ">>> **u/thrawnca** [+6] *Carbon-based biped**\n", + ">>> \n", + ">>> Already discussed in a previous chapter thread, and resolved by the author. Yes, it sort of works: you could assign a simulacrum to sit cross-legged and assimilate mana, which would max out your assimilation rate, provided it didn't get too bored and wander off. However, your soul is the bottleneck; adding extras doesn't give any further benefit.\n", + ">>> \n", + "\n", + ">>> **u/melmonella** [+2] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>> \n", + ">>> I think you seem to be missing a large problem: you can't really force a simulacrum to do anything.\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>> \n", + ">>>> Actually, the politics of the mana assimilation plan don't seem so bad. If a simulacrum doesn't want the boring job, then Original!Zorian can do it, and send the simulacrum on the mana-consuming job instead. And besides, whenever their mana reserves are full, they can tap each other's senses. Not such a terrible assignment really.\n", + ">>>> \n", + "\n", + ">>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>> \n", + ">>>>> I think it would have to wait until Zorian figures out a way to seemlessly integrate the memories from his simulacra.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> What would have to wait? Sensory tap? They're doing that already.\n", + ">>>>>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>> \n", + ">>>> If the simulacrum is in Cyoria, it would have access to books, building materials, research notes, Kael, Kirielle, Xvim, etc. I'm sure it'd have no issue with spending a restart hanging out, giving Zorian a guaranteed max regeneration rate. The main issue is that Zorian hasn't been keeping any simulacra alive for more than a day, but it may be worthwhile to break the rule for this purpose.\n", + ">>>> \n", + "\n", + ">> **u/gridpoint** [+1] *\n", + ">> \n", + ">> The cranium rats don't have much ability as individuals. A single rat doesn't do anything that he can't easily overpower. It's the group that's formidable. I doubt enhancement rituals can take the cumulative abilities of a whole bunch of magical creatures. He'd be better off taking a bunch of any other creature instead.\n", + ">> \n", + "\n", + ">>> **u/Fredlage** [+8] *\n", + ">>> \n", + ">>> Each individual rat has the ability to join in a hive mind with others of the same ability. Said hive mind is more intelligent and powerful than its components. If Zorian and each of his simulacra had the same ability, the result might be very impressive for Zorian.\n", + ">>> \n", + "\n", + ">>>> **u/gridpoint** [+1] *\n", + ">>>> \n", + ">>>> But didn't the simulacra communicate telepathically with Zorian. Isn't a hive mind just like a bunch of simulacra doing the same thing simultaneously? Just as Zorian did joining with the Hive mind before they shut him out.\n", + ">>>> \n", + "\n", + ">>>>> **u/GodKiller999** [+1] *\n", + ">>>>> \n", + ">>>>> No, they're just individuals that can communicate right now, nothing like an hive mind.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> It's possible that that is simply a matter of choice and practice. Zorian likely hasn't tried to mind-meld with a simulacrum and wouldn't really want to. If they set their mind (s) to it, he might already be capable of forming a hive mind.\n", + ">>>>>> \n", + "\n", + "> **u/megazver** [+36] *\n", + "> \n", + "> The simulacrum shenanigans and how quickly they've been shown to begin to diverge from the creator's best interests struck me as more material for the \"Red Robe is a rogue simulacrum of Zach's\" theory. \n", + "> Other than that, I don't see extensive use of simulacra any less ethically challenging than marking people to retain memories in-between reboots. I'd like to see them explore the latter (and the other marker abilities) in future chapters.\n", + "> \n", + "\n", + ">> **u/Krossfireo** [+16] *\n", + ">> \n", + ">> Do simulacra maintain themselves over resets? I guess Zach could be brainwashed by his simulacra to maintain the memory of it (memory packets) and then create the simulacra as soon as the loop begins.\n", + ">> \n", + "\n", + ">>> **u/thrawnca** [+12] *Carbon-based biped**\n", + ">>> \n", + ">>> I'm pretty sure a simulacrum would not survive the restart.\n", + ">>> The Gate recreates the entire physical world according to the template, then anchors the Controller's soul into the appropriate body. And the template does not include an ectoplasmic shell.\n", + ">>> \n", + "\n", + ">>>> **u/DerSaidin** [+3] *\n", + ">>>> \n", + ">>>> Yeah, this. Both Zach and RR survive loop, which requires a soul. Simulacra do not have a soul.\n", + ">>>> Could it be possible to give a simulacrum a soul? Maybe. But Occam's Razor says RR is not a Zach simulacrum with its own soul.\n", + ">>>> \n", + "\n", + ">>> **u/megazver** [+7] *\n", + ">>> \n", + ">>> Well... We don't know the rules yet. Maybe Zach's simulacra actually share his marker, somehow. Maybe Zach actually knew a lot more about the markers and soul magic before his memory wipe, since he had one in the first place. Maybe it's the (very inventive) mechanism you've described.\n", + ">>> Or maybe simulacra do just maintain themselves over resets. They're weird-ass soul magic, who knows how weird-ass soul magic interacts with the weird-ass soul magic of resets? I suspect we'll see what happens when a simulacrum is active during the reset soon enough. Then, if they do, it probably took over Veyers' body, like people speculated in the previous chapter's discussion and off it went.\n", + ">>> Let's face it, the magic system in this story has new shit added to it every chapter and we could get new information that disproves this, then makes it possible again, then disproves it again several times over. But Zach's simulacrum just feels right to me from a storytelling perspective. It's very elegant.\n", + ">>> \n", + "\n", + ">>>> **u/GodKiller999** [+28] *\n", + ">>>> \n", + ">>>> > Let's face it, the magic system in this story has new shit added to it every chapter and we could get new information that disproves this, then makes it possible again, then disproves it again several times over. But Zach's simulacrum just feels right to me from a storytelling perspective. It's very elegant.\n", + ">>>> No? If anything the magic system has been extremely consistent, it's how we can figure out later plot points from explanations that were given in early chapters.\n", + ">>>> \n", + "\n", + ">>>>> **u/megazver** [+4] *\n", + ">>>>> \n", + ">>>>> Consistent with what has previously been added, yes. But he does add exciting new areas of magical expertise quite often.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/GodKiller999** [+24] *\n", + ">>>>>> \n", + ">>>>>> But those aren't haphazardly added for plot reasons, it's quite obvious that they existed before we ever heard about them by the way they neatly fit with the rest of the magic system.\n", + ">>>>>> \n", + "\n", + ">>>> **u/-Fender-** [+18] *\n", + ">>>> \n", + ">>>> Except that Zach had no awareness whatsoever of his soul. No defenses whatsoever. It just seems to me like there would be some signs visible to someone with soul sight (like Alanic) if he ever had the kind of soul magic expertise necessary to create a simulacra.\n", + ">>>> But then again, who knows. The author could choose to go that route regardless of what we currently know of how soul magic or the simulacrum spell works, or regardless of however I interpreted his writing.\n", + ">>>> \n", + "\n", + ">>>>> **u/Cuz_Im_TFK** [+6] *\n", + ">>>>> \n", + ">>>>> I completely agree. After the previous chapter, I argued that it's implausible for even a skilled soul/mind mage to completely erase a trained \"skill\" of Zach's: soul-sense. We know the soul grows with training, like muscles, and, especially after what we learned in this chapter about how trigger-happy the marker is, I find it highly doubtful that anyone could have altered his mind and soul enough to have completely removed his knowledge of and ability to control his marker AND set him back to square one when he tries to re-train it. \n", + ">>>>> I still think the most logical conclusion here is that Zach never knew what was going on to begin with when the loops started.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/melmonella** [+3] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>> \n", + ">>>>>> Is it possible that someone else could have cast Simulacrum *for* Zach?\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>> \n", + ">>>>>>> Technically? Yes, you *can* make a simulacrum of someone else. But I'm not sure it solves any of the issues surrounding Red Robe.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>> \n", + ">>>>>>>> It solves the issue of Zach obviously being unable to cast the spell. If he hired someone to make a simulacrum for him (for...whatever reason) that would explain where RR came from.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> > Yes, you can make a simulacrum of someone else.\n", + ">>>>>>>> How do you know this? Sudomir?\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>>> \n", + ">>>>>>>>> [Word of Domagoj](https://motheroflearninguniverse.wordpress.com/2016/08/07/golems-and-undead/#comments)\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> You always ask good questions. For everyone else, here's the relevant discussion:\n", + ">>>>>>>>>> >thrawnca\n", + ">>>>>>>>>> >If you had soul sight (and maybe a willing target), I would think you could attach a generic simulacrum body/mind to someone else’s soul. I would expect it to work pretty much the same way as if the recipient had cast the simulacrum spell themselves.\n", + ">>>>>>>>>> >(In which case, Zorian would be able to cast it on Zach before the latter has sufficient mastery of soul perception, once Zorian uses blood magic to copy Kael’s soul sight.)\n", + ">>>>>>>>>> .\n", + ">>>>>>>>>> >Domagoj (author)\n", + ">>>>>>>>>> >Yes, you could make a simulacrum of another person and it would work largely the same as if the target cast the simulacrum spell themselves. As you noted, you need soul sight first before you can do that. Necromancers a similar method to this to interrogate dead people.\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Domagoj?\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>>>>>>>> \n", + ">>>>>>>>>>> Yes, the author. Domagoj Kurmaic.\n", + ">>>>>>>>>>> I'm guessing you've never visited his Patreon page? Worth doing; he tends to answer questions there.\n", + ">>>>>>>>>>> \n", + "\n", + ">>>>> **u/megazver** [+2] *\n", + ">>>>> \n", + ">>>>> I don't think that's the case either. I just listed it as remotely plausible, based on what we've been given so far.\n", + ">>>>> I suspect it'll be something we haven't even been told about yet.\n", + ">>>>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>> \n", + ">>>> Zorian's been using simulacra for eight restarts so far; they don't seem to maintain themselves.\n", + ">>>> The memory packets theory is definitely possible. It's possible that Zach had been trained in a lot of things pre-timeloop. There is one major flaw:\n", + ">>>> Even Zorian would have a difficult time overwriting a person's life story that much. If Zach had been skilled enough to cast simulacrum, to have (novice or intermediate-level) unstructured mind shaping abilities like RR exhibited, etc., I don't think RR could have successfully purged that much information.\n", + ">>>> Plus, it is unlike Zach to have the patience or temperament to undergo that level of training, then hide it from his peers to pretend to be untalented in school. All that mastery would have required a few years of training.\n", + ">>>> It's still possible I suppose, but I find it really unlikely. Veyers also feels unlikely considering his volatile temperament, but we shall see. :D\n", + ">>>> \n", + "\n", + ">>>>> **u/megazver** [+5] *\n", + ">>>>> \n", + ">>>>> > Zorian's been using simulacra for eight restarts so far; they don't seem to maintain themselves.\n", + ">>>>> So far he has been reabsorbing them at the end of each day. I doubt he ever tried to keep one up during a reset. \n", + ">>>>> And I doubt Zach forgot that much, yes. I don't think that's the solution, I just listed it as remotely plausible.\n", + ">>>>> I suspect if the theory is true, the \"how\" might not have even been introduced to us yet.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>> \n", + ">>>>>> > So far he has been reabsorbing them at the end of each day.\n", + ">>>>>> Good point. He should maintain a simulacrum specifically at the time where restart occurs.\n", + ">>>>>> > \"How\" might not have even been introduced to us yet.\n", + ">>>>>> I hope we'll find out soon! But I don't think that's likely . . .\n", + ">>>>>> \n", + "\n", + ">> **u/pleasedothenerdful** [+1] *\n", + ">> \n", + ">> But Zach didn't know the Simulacrum spell at the beginning of the restarts.\n", + ">> \n", + "\n", + ">> **u/SpeculativeFiction** [+1] *\n", + ">> \n", + ">> It does seem to hint to that, but we've seen Red Robe make a simulacrum of their own, which they used to set off all the Aranean traps. It's possible Simulacrum can make copies of themselves, but seems a bit unlikely, I guess?\n", + ">> While I was a strong proponent of the Veyer's theory, his identity was revealed a bit too early.\n", + ">> \n", + "\n", + "> **u/TimTravel** [+34] *\n", + "> \n", + "> I forget if I already mentioned this in previous threads, but Kael's coin has (temporarily) defeated Quatach-Ichl before, and Zorian was able to fool him into touching it. It probably works by making his lich defenses think he's undergoing a serious soul attack and severing the simulacrum automatically, but regardless, it's worth a try next time they fight him.\n", + "> That devious Silverlake. She'd better have some amazing knowledge.\n", + "> \n", + "\n", + ">> **u/Krossfireo** [+15] *\n", + ">> \n", + ">> I don't know why they haven't used this attack on the lich more than once. Maybe Zorian forgot about it partially since the traumatic events of red robe's purple light spree happened right after\n", + ">> \n", + "\n", + ">>> **u/thrawnca** [+15] *Carbon-based biped**\n", + ">>> \n", + ">>> He hasn't used it because it has to touch the lich, and Zorian normally meets him with shields up.\n", + ">>> \n", + "\n", + ">>>> **u/Krossfireo** [+6] *\n", + ">>>> \n", + ">>>> He didn't touch him the first time, he tossed him the coin\n", + ">>>> \n", + "\n", + ">>>>> **u/thrawnca** [+26] *Carbon-based biped**\n", + ">>>>> \n", + ">>>>> In a normal combat situation, the lich isn't going to let any thrown object touch him. He was tricked in a specific situation that would be very difficult to replicate.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/melmonella** [+5] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>> \n", + ">>>>>> Yeah, they probably need to design an anti-lich rifle. Something with a big caliber so that all spell formula needed to sewer his soul from his body can be put on a bullet, and then something else to insure it would pierce all his shields. No matter how strong those are, there has to be a limit-and if Z&Z were to convert all the mana crystals they can gather in a month into one incredibly powerful attack...\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/TimTravel** [+2] *\n", + ">>>>>>> \n", + ">>>>>>> ...and then he teleports away. It would have to be supersonic to avoid the sound warning him.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>> \n", + ">>>>>>>> Well, obviously.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> Supersonic? Great point. Alternatively, the area around the gun could be magically silenced.\n", + ">>>>>>>> \n", + "\n", + ">>>>> **u/Xtraordinaire** [+4] *Team Glimglam**\n", + ">>>>> \n", + ">>>>> At the time it was a desperation move from Zorian. He was about to get some firsthand experience in lich soul magic, so he went for it and it worked because he was not percieved as a threat by the lich. He has no way of repeating that.\n", + ">>>>> \n", + "\n", + ">>> **u/nobody103** [+7] *\n", + ">>> \n", + ">>> As the people below said, it only worked because of very specific circumstances. He wasn't *hit* by the coin - he deliberately caught it in his hand. In a normal encounter, Quatach-Ichl would treat any object thrown at him, no matter how innocuous, as an attack.\n", + ">>> \n", + "\n", + ">> **u/nobody103** [+11] *\n", + ">> \n", + ">> >It probably works by making his lich defenses think he's undergoing a serious soul attack and severing the simulacrum automatically.\n", + ">> Less 'severing the simulacrum' and more 'pulling the soul back to the phylactery', but yes, that is how it works. \n", + ">> Edit: Although a lich's body could be thought of as a kind of simulacrum, so maybe you're right. Hmm...\n", + ">> \n", + "\n", + ">>> **u/Tommy2255** [+1] *\n", + ">>> \n", + ">>> It has been established that the Simulcrum spell is a major part of the basis of how liches are made.\n", + ">>> \n", + "\n", + ">> **u/serge_cell** [+3] *\n", + ">> \n", + ">> She could be a dud. Just bitch with delusion of unrivaled cunning thinking she can scam her way to real power. Would be ironic if the real prize after success would be not Silverlake's nonexistent wisdom, but eggs themselves and method for getting them.\n", + ">> \n", + "\n", + ">>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>> \n", + ">>> Zorian is studying dimensional magic, which is probably what she used to conceal her cottage, since Zorian physically walked through the spot where it should have been.\n", + ">>> He's learning to make transformation potions. She's a potions master, probably the best he'll ever meet.\n", + ">>> He's interested in enhancement rituals and bloodline powers. She's a witch; they love those, and probably know many useful things about them.\n", + ">>> He's already benefiting from converting the grey hunter to enhancement potions, using a recipe devised by someone who never worked with one before. Silverlake's been after the thing for years; she probably knows lots more things they can do with it, especially with the corpse presumably in good condition.\n", + ">>> She'll be useful, I have no doubt.\n", + ">>> And some of Xvim's best stuff only came out after Zorian gained his respect. The same is probably true of Silverlake. She shows that much promise *and he only met her in one restart*.\n", + ">>> \n", + "\n", + ">>>> **u/serge_cell** [+1] *\n", + ">>>> \n", + ">>>> >She'll be useful, I have no doubt.\n", + ">>>> What I mean - by the time Zorian&Zach get Grey Hunter eggs they will be the same or better in all or most important of those areas. Difference between Xvim and Silverlake is that Xvim didn't send student on suicidal mission. Silverlake actually made this mission much worse by \"teaching\" Grey Hunter with her own failed attempts. And it was not just single test of resolve - she want Zorain to make repeated attempts, which can only end with his death, if he would be a normal wizard.\n", + ">>>> It's difficult to understand her reasoning beyond simple witch's malice. May be she hope to lower Grey Hunter level of readiness by sending weak opponent. Or may be she has no other use for a student. \n", + ">>>> I expect her to attack Zorian after he handed her eggs if she can't pay him with knowledge - she looks greedy enough for it.\n", + ">>>> \n", + "\n", + ">>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>> \n", + ">>>>> To assume that she would immediately attack someone who could overpower a grey hunter is, I think, to assume that she is an idiot. Which, based on the evidence, she pretty clearly is not.\n", + ">>>>> Setting them a further impossible task, though, that I wouldn't entirely put past her.\n", + ">>>>> \n", + "\n", + "> **u/cathemeralman** [+26] *\n", + "> \n", + "> I have a theory for how Zorian might pull off transcontinental travel (besides Bakora gates).\n", + "> If Zorian's simulacrum goes to another continent and then gives him the memories of the place, does Zorian gain the ability to teleport there? That way he wouldn't have to waste a restart traveling. The only problem is the simulacrum would have to remain active for longer than a day to do this (unless Zorian has the simulacra teleport back, dispel, and then teleport back out on a day-to-day basis).\n", + "> \n", + "\n", + ">> **u/Cuz_Im_TFK** [+7] *\n", + ">> \n", + ">> > unless Zorian has the simulacra teleport back, dispel, and then teleport back out on a day-to-day basis\n", + ">> Which is impossible if taking a boat or train. I may have to consult the world map again to see if that's necessary, since I had the same thought originally.\n", + ">> \n", + "\n", + ">>> **u/kuilin** [+3] *\n", + ">>> \n", + ">>> Have the simulacra travel as far as possible in the direction for one cycle, then next cycle have the next simulacra teleport to where the previous one stopped and continue?\n", + ">>> \n", + "\n", + ">>> **u/melmonella** [+3] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>> \n", + ">>> Why would it be impossible? S. gives Z memories of the ship, Z teleports there, dispels S and makes a new S. Repeat next day.\n", + ">>> \n", + "\n", + ">>>> **u/Bighomer** [+2] *\n", + ">>>> \n", + ">>>> I reckon it is because the ship moves.\n", + ">>>> \n", + "\n", + ">>>>> **u/melmonella** [+2] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>> \n", + ">>>>> They could stop the ship for the time they need to teleport there and back.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/Cuz_Im_TFK** [+2] *\n", + ">>>>>> \n", + ">>>>>> /u/Bighomer had it right. I was assuming a commercial ship I guess, where they wouldn't have the authority to request the ship to stop once a day. I guess a private charter might be possible with the money they have, so it's not totally infeasible. \n", + ">>>>>> But there's still the distance limitation of teleportation to consider. The Bakora gates exist for a reason, after all. As far as I understand the magic system, teleporting 1 mile takes more mana than teleporting half a mile twice to reach the same destination.\n", + ">>>>>> \n", + "\n", + ">>>>>> **u/Cheese_Ninja** [+2] *\n", + ">>>>>> \n", + ">>>>>> Any series with teleports I start wondering about how it is affected by teleporting to/from a moving object, especially since the planet itself and everything on it is moving at different rates depending on latitude. \n", + ">>>>>> I feel like until the author makes a statement about it directly, teleporting to/from a moving vehicle is always an option. I can't remember if this has ever been addressed in the story.\n", + ">>>>>> I also wonder about what happens to pre-existing matter in the location being teleported to, but that's not the question at the moment.\n", + ">>>>>> The main issue here is that the basic teleport spell has a range limitation. It's not a big deal since we've almost always seen the characters stay in Eldemar: http://dodo-ptica.deviantart.com/art/Altazia-s-Central-Valley-525095257\n", + ">>>>>> Last chapter was the farthest we've actually seen them go away from here, but we don't know if they were able to teleport directly or if they had to make multiple jumps:\n", + ">>>>>> >In the Ishekatara Sea – the southern sea enclosed by the two 'prongs' of the Altazian continent – there was a pirate ship.\n", + ">>>>>> Koth (Daimen) and Bianyrre are other continents entirely.\n", + ">>>>>> The aranea colony with the Bakora Gate seems like the most likely route for Zach and Zorian.\n", + ">>>>>> Other possibilities involve teleportation and Gate spell variants, or even an established teleportation route across the ocean using islands/boats?. I think there's sufficient reason to have a much faster transoceanic route available for information/small goods/small groups of people, that would be prohibitively expensive for individuals to utilize for themselves. This chapter seems to argue against that because if it did exist Zach should have brought it up as an option, unless it's illicit knowledge that Zorian gained on his own.\n", + ">>>>>> \n", + "\n", + ">> **u/elevul** [+3] *Cyoria Observer**\n", + ">> \n", + ">> Why not just morph into an Eagle and fly there?\n", + ">> \n", + "\n", + ">>> **u/nobody103** [+12] *\n", + ">>> \n", + ">>> Out of pure curiosity, I did some quick research on this. \n", + ">>> Peregrine falcons are one of the fastest flyers in the world. Their speed in level fight is about 65 to 100 km/h. Assuming the maximum is probably unreasonable so let's say they can fly at about 80 km/h normally. Assuming 10 hours a day spent in flight, that's a travel distance of 800 km per day. \n", + ">>> But wait! Peregrine falcons are migratory birds ('peregrine' means 'wanderer') and while finding information about their migration speeds is surprisingly difficult, the internet is telling me that some individuals travel as much as 480 km per day. This is considered very impressive. Although it's possible that peregrine falcons are just being conservative with their energy, I'm going to assume they have good reasons for traveling at that speed. Let's round this to 500 km per day for easier calculation.\n", + ">>> I have not thought too deeply about actual numerical distances in my world, but I consider the planet on which the story is happening to be the same size at earth. Since Altazia is temperate, and Koth is equatorial, that's roughly the distance between Northern Europe and Central Africa. Web calculators tell me that the distance between Copenhagen and Kinshasa is 6678 km. Since I assume actual peregrine falcons are way better navigators than shapeshifted humans, let's round that up to 7000 km. \n", + ">>> 7000 divided by 500 is 14, so the best case scenario says Zach and Zorian would need 14 days to fly to Koth as birds. Not unworkable. However, spending half of the restart traveling is clearly quite suboptimal. Not to mention that reality is unlikely to be ideal, and that they would likely encounter unfamiliar complication the first few times they tried that.\n", + ">>> \n", + "\n", + ">>>> **u/Tommy2255** [+3] *\n", + ">>>> \n", + ">>>> But how fast would they be if they had to carry spell formula roughly the size and shape of a coconut? And would they encounter enough swallows on the way to satisfy the dietary requirements of a falcon?\n", + ">>>> \n", + "\n", + ">>>>> **u/nobody103** [+9] *\n", + ">>>>> \n", + ">>>>> When I started researching the topic I tried searching for the 'average speed of a swallow', since they are also famously fast birds that migrate vast distances every year. What a mistake that was...\n", + ">>>>> \n", + "\n", + ">>>> **u/elevul** [+1] *Cyoria Observer**\n", + ">>>> \n", + ">>>> They only need to do it once though. After that they just teleport there, either directly or through way points.\n", + ">>>> \n", + "\n", + ">>>>> **u/nobody103** [+5] *\n", + ">>>>> \n", + ">>>>> Teleporting directly is impossible, since teleportation has range limitations. I assume that by way points you mean they can just chain teleports to cross the distance, in which case yes, that is possible. But if the goal is just to get teleport destinations, it's easier and faster to use the already existing teleportation network and have other people teleport them to desired destinations.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>> \n", + ">>>>>> I'm glad to hear this. It's been a consistent question in my mind—can't they just hire people who can teleport them through established network nodes until they reach Koth? I'd guess wealthy people who could afford those kinds of services could arrive in Koth within a day or two using this method.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/nobody103** [+4] *\n", + ">>>>>>> \n", + ">>>>>>> Not that fast. It would take some time to arrange for all those jumps, even after Z&Z had spent some time turning the process into routine. I don't mention it often, but teleportation isn't that common among mages - especially not at high enough level to do such long jumps while carrying passengers.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> > I don't mention it often, but teleportation isn't that common among mages\n", + ">>>>>>>> Interesting. Seeing everything from the perspective of Zorian seems to have tinted our view of things. Apparently, his even his initial expectations of what a mage should do were very ambitious—teleportation, invisibility, fireballs, and so on.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>> \n", + ">>>>>>>> Well, based on this comment, I think their way of travel is confirmed.\n", + ">>>>>>>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>> \n", + ">>>> That's funny. I did similar calculations in a comment below before seeing this—but it was related to the flight speed of Zach's kinetic sphere spell compared with the giant crowned eagles following them.\n", + ">>>> \n", + "\n", + ">>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>> \n", + ">>>> Homing pigeons have faster horisontal flight speed than peregrine falcons, I believe. 170km/h IIRC.\n", + ">>>> \n", + "\n", + ">>>>> **u/nobody103** [+5] *\n", + ">>>>> \n", + ">>>>> Finding information on bird speeds is surprisingly hard. Most overviews don't seem to view it as relevant to note, or maybe its just hard to measure. In addition, when I do find data, it's unclear whether it lists the fastest observed speeds or something that can be sustained indefinitely.\n", + ">>>>> I picked peregrine falcons because they are famously fast (even disregarding their absolutely crazy diving speeds) and also migratory, meaning they have endurance to sustain those speeds over large periods of time. Rock doves (common pigeons) do not migrate, so I was less sure about relying on their information.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/melmonella** [+2] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>> \n", + ">>>>>> Huh, I only now noticed you are the author. Neat.\n", + ">>>>>> I used [this page](https://en.wikipedia.org/wiki/List_of_birds_by_flight_speed) for my sources on bird speeds. Here is [another source,](http://news.nationalgeographic.com/news/2007/09/070913-longest-flight.html) with one bird flying for about 1200 kilometers per day for 9 days.\n", + ">>>>>> In general peregrine falcons don't strike me as the kind of bird you would pick to fly across the ocean. They are small, which means they are unlikely to be able to fly 24/7, and would probably run out of energy reserves (i.e. fat) pretty quickly. \n", + ">>>>>> If we are talking about ways to get to Koth quickly in general, I think there are several good options:\n", + ">>>>>> * The easiest and the most likely to work into any other activities: use the same method Zorian's parents use at the start of the month, which likely involves a hired teleporter who knows the road. In later restarts Z&Z would know all teleportation locaitons and would be able to travel there independantly.\n", + ">>>>>> * Some sort of polymorph potion to turn into an extremely fast bird, along with some other potion to increase it's speed, letting Z&Z complete the journey in just a handful of days. Requires them to develop/buy the necessary potions, and I don't see what are the advantages over the first plan.\n", + ">>>>>> * A plane golem. Make some sort of semi-aerodynamic platform, inscribe enough spell formula into it to make it float and cut through air without any resistance, strap a big magical engine on the back, load it up with mana crystals, strap in and go. Advantage being that this platform can be used multiple times, and all it requires is a supply of mana crystals (and thus could be used by non-mages. Z&Z could get rich after the time loop by inventing aerospace industry and selling tickets to other continents)\n", + ">>>>>> * My favourite method: ICBM transportation. Use magic (Like that sphere Zach used) to gain enough speed to reach space and travel to Koth using a ballistic trajectory. Main advantage is that this method should be *fast* when compared to something like a chain of teleports (since they would likely have to rest somewhere in the middle).\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/nobody103** [+5] *\n", + ">>>>>>> \n", + ">>>>>>> That second article is pretty amazing, thank you for linking that. However, I note that shorebirds aren't very big either. \n", + ">>>>>>> In any case, I never intended for Z&Z to cross the ocean as birds - I just got my curiosity awoken by the original comment and tried to see just how feasible it was in general. As you noted, hiring teleporters is both faster and and has fewer complications. \n", + ">>>>>>> Making a plane golem or (especially) ICBM would be a major undertaking that is beyond Zorian at the moment. In fact, it would probably be beyond one person in general. Zorian would have to organize and entire team of researchers, both mundane engineers and spell formula crafters, and direct their efforts for god knows how many restarts. Z&Z don't have time to devote themselves on a project like this.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/melmonella** [+3] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>> \n", + ">>>>>>>> ...but it would be *so awesome.*\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>> **u/Karranor** [+2] *\n", + ">>>>>>>> \n", + ">>>>>>>> Googling for \"fastest migrating bird\" gave me [this](http://earthsky.org/earth/great-snipe-is-the-fastest-migratory-bird-ever-discovered)\n", + ">>>>>>>> In short, 3.5 days for 6800km (non-stop flight). Adding a day of rest and 3 flights like that would add up to 20400km in 12.5 days, which is the other side of earth. Which makes the bird idea far more reasonable than I would ever have thought.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/nobody103** [+10] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> Yeah, this is pretty damn impressive. It is clear that I have greatly underestimated the ability to birds to cross vast distances quickly. \n", + ">>>>>>>>> Since the story plan does not account for the 'fly there as a bird' plan, I'm just going to rule that Zorian isn't an ornithologist and never thought to consult one, and thus just dismissed the idea out of hand as implausible. Being a mage, he was more focused on finding a magical solution to the problem.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>> **u/GodKiller999** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> He could probably have a simulacrum on the task, after all it's not he has to do it himself.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>> \n", + ">>>>>>> Note that the sphere probably cannot be the basis of an ICBM, since it appears to be doing funky things with inertia.\n", + ">>>>>>> \n", + "\n", + ">>>> **u/Shhninja** [+1] *\n", + ">>>> \n", + ">>>> Not sure what the range on teleport is, but if I were Zorian I would just use a simulacrum to travel to the maximum range of his teleport using a bird transformation (and to each telepathic relay point) and then contact Zorian and Zach for a gate so they could memorize the locations for future restarts. Rinse repeat until the entire way could be done in a series of teleports. Then they could just chain teleports at the start of the next restart to get there insanely fast. I believe this would be easier then dealing with different people for different amounts of money and their own schedules. With Zach's huge mana pool it would be a triviality to make the trip. This would also be much faster then having to deal with other people and/or border checks or the illegality of bypassing them.\n", + ">>>> \n", + "\n", + ">>>>> **u/nobody103** [+1] *\n", + ">>>>> \n", + ">>>>> If Zach and real Zorian are traveling, they can't make use of the Black Room during the restart. The point of sending a simulacrum is so they can do their own thing while someone else does the traveling. Unfortunately, Zorian's simulacrum has a very limited amount of mana - hence him hiring other people to teleport him most of the way.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/Shhninja** [+2] *\n", + ">>>>>> \n", + ">>>>>> I think you misunderstood what I was saying =/ I was suggesting that the simulacrum would travel by themself to the maximum range of Z&Zs teleport, then open a gate with the original to bring both Z&Z through. They would then memorize the location for future restarts and let a new simulacrum start towards the next teleport relay.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>>>> \n", + ">>>>>>> Knowing the locations is only half the problem. The other half is that after doing such long jumps, even Zach would have to do a lot of waiting for his mana reserves to recover.\n", + ">>>>>>> I do agree, though, that they should have made more use of intermediate gates - for transferring funds to help the simulacrum move faster.\n", + ">>>>>>> \n", + "\n", + ">>> **u/Xtraordinaire** [+1] *Team Glimglam**\n", + ">>> \n", + ">>> And when the transformation potion runs out mid-flight... oooopsie!\n", + ">>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>> \n", + ">>>> 1. Create a potion harness for the eagle body.\n", + ">>>> 2. Use unstructured magic to levitate the harness slightly while flying. This would reduce the apparent weight of the potion harness.\n", + ">>>> It may also be possible to stop and remake the potions as necessary, especially if many of the ingredients can be brought along dry, which reduces their weight.\n", + ">>>> \n", + "\n", + ">>>>> **u/Xtraordinaire** [+2] *Team Glimglam**\n", + ">>>>> \n", + ">>>>> Why not use Zach's kinetic sphere though? (from ch 60). I'm fairly certain it can go hypersonic. Transformation potions and all the contraptions are such a mess.\n", + ">>>>> (but of course the real answer is dimensionalism anyway)\n", + ">>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>> \n", + ">>>>>> Zach's sphere can go hypersonic? I'm not sure, The need for inertial dampening made me wonder, but here are some numbers on the matter.\n", + ">>>>>> Hypersonic means five times the speed of sound (Mach 5). The speed of sound is 1200 kph (750 mph). \n", + ">>>>>> In Ch 62, Zach uses the sphere to escape giant eagles.\n", + ">>>>>> The fastest bird, the homing pigeon, has horizontal flight speed of about 80 kph (sustained) to 140 kph (short distance) (50 to 90 mph). If the giant birds were going that fast (they were probably slower than this, seeing as they're giant birds and were each carrying a human), then we know Zach was also going at least 100 kph (for ease of calculation—well under the speed of sound.\n", + ">>>>>> Zorian's reaction to escaping the giant birds wasn't that Zach was going slowly to let the birds catch up—rather, he was surprised the eagles could keep up. This suggests Zach's speed when escaping the birds was comparable to the first time Zorian saw the sphere used. I take this to mean that Zach wasn't killing his speed too much to escape the eagles, so his max speed is probably somewhere between 100 kph and 500 kph, depending on how much more he can push himself, and probably closer to 100 kph.\n", + ">>>>>> How long can Zach sustain that speed? If the above is accurate to how the sphere works, then Zach can easily travel 100 kph, but not for extended periods of time. The first time we saw the spell, Zach used the sphere to travel from the invasion army to the Hole. At 100 kph, it shouldn't take more than a few minutes to travel across the city (it takes 15 minutes to travel the length of Manhattan at that speed)—after which Zach was exhausted.\n", + ">>>>>> I think they might do better traveling as birds or, as you said, dimensionalism—or whatever else Zorian has up his sleeve.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/Xtraordinaire** [+1] *Team Glimglam**\n", + ">>>>>>> \n", + ">>>>>>> Oh, right, I forgot about that bit in ch62. \n", + ">>>>>>> So my reasoning was that the sphere was clearly pulling high-g maneuvers, while passengers were unaffected; it didn't give a damn about physical obstacles it encountered (which means it doesn't give a damn about drag) and it would not care about heating as it's not material anyway. If it was operating under proper Newtonian mechanics, it should have been possible to launch it like a ICBM.\n", + ">>>>>>> But apparently that's not the case. Oh well.\n", + ">>>>>>> \n", + "\n", + ">>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>> \n", + ">>>>>>> Peregrine falcons do not have the fastest horisontal flight speed of all birds. Try Homing pigeons (170 km/h).\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> I'm really surprised. I corrected the post, however 170 kph seems a bit high.\n", + ">>>>>>>> https://en.wikipedia.org/wiki/Homing_pigeon#Navigation\n", + ">>>>>>>> >Their average flying speed over moderate[clarification needed] distances is around 80 km/h (50 miles per hour) but speeds of up to **140 km/h** (90 miles per hour) have been observed in top racers for short[clarification needed] distances.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>>> \n", + ">>>>>>>>> https://en.wikipedia.org/wiki/List_of_birds_by_flight_speed\n", + ">>>>>>>>> hashtag wikipedia is a great source\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Nice. Yeah, wikipedia is amazing. I think it was the journal Nature analyzed the quality of Wikipedia compared with Britannica. Wikipedia did pretty well.\n", + ">>>>>>>>>> http://www.nature.com/nature/journal/v438/n7070/full/438900a.html\n", + ">>>>>>>>>> \n", + "\n", + "> **u/throwawayIWGWPC** [+22] *\n", + "> \n", + "> Was anyone else momentarily confused when, after transforming into eagles, they weren't able to communicate via thought-speech?\n", + "> (For those who don't know: In the series Animorphs, the protagonists use alien tech to morph into animals, but while in morph, they can communicate telepathically.)\n", + "> \n", + "\n", + ">> **u/Krossfireo** [+14] *\n", + ">> \n", + ">> Have you been reading rational!Animorphs as well?\n", + ">> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+10] *\n", + ">>> \n", + ">>> YES! I grew up on Animorphs and I'm waiting with bated breath for the next installment of that story from Dabien.\n", + ">>> \n", + "\n", + ">>>> **u/Krossfireo** [+7] *\n", + ">>>> \n", + ">>>> It's one of my favorite fanfics, partially because it's not a super explored space\n", + ">>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+9] *\n", + ">>>>> \n", + ">>>>> I find it odd that almost nobody I know has read Animorphs, otherwise I'd tell more people about the fanfic.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/netokoff** [+7] *\n", + ">>>>>> \n", + ">>>>>> Woah hold on. There is an Animorph fanfiction?\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/None** [+4] *\n", + ">>>>>>> \n", + ">>>>>>> [Here you go](https://www.fanfiction.net/s/11090259/1/r-Animorphs-The-Reckoning)\n", + ">>>>>>> TK17 does an incredible job writing human characters that make mistakes, but are *really really smart*. Also, the aliens are alien.\n", + ">>>>>>> 9.5/10, Highly recommended reading.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+3] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> I'm actually holding off until it's done, for fear of having one more story that I need to constantly check for updates. Didn't come close to reading all of canon, but I read a bunch of them.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/OutOfNiceUsernames** [+2] *fear of last pages**\n", + ">>>>>>>>> \n", + ">>>>>>>>> Which ones would you recommend reading? I once had a mind of starting on that series, but it had so many titles that seemed to be ghost-written fillers that I gave up.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> I'd say read books 1--20ish. The author got pregnant during the series run and so eventually hired ghost-writers, but the beginning is really strong. Meanwhile, go on the Animorphs reddit for more information about which ones to skip.\n", + ">>>>>>>>>> Here's a start:\n", + ">>>>>>>>>> https://www.reddit.com/r/Animorphs/comments/3dj2ts/which_books_would_you_recommend_a_friend_to_skip/\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>> **u/TheTrikki** [+2] *\n", + ">>>>>>>> \n", + ">>>>>>>> Do you need to know the original series in order to enjoy this?\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> I feel you'd love the story even without reading the source material first. I'm biased, having grown up on the series, but a discussion in this subreddit described it as among the best introductions to rational fiction.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>> \n", + ">>>>>>> Yes, and it's rationalist and *really* good. I hope you're ~~binging~~ reading it at this very moment. ;)\n", + ">>>>>>> \n", + "\n", + ">>>>>> **u/Cuz_Im_TFK** [+3] *\n", + ">>>>>> \n", + ">>>>>> I knew it existed when growing up and would see it at Barnes & Noble whenever I went, but I just never picked it up. Kinda disappointed about that now since I've heard such good things about this fic.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>> \n", + ">>>>>>> The first two or three dozen Animorphs were great and have aged pretty well. They're a fast read too. I highly recommend the series if you're inclined.\n", + ">>>>>>> \n", + "\n", + ">>> **u/TimTravel** [+4] *\n", + ">>> \n", + ">>> I have! I'm actually behind a few chapters but I love it.\n", + ">>> \n", + "\n", + "> **u/Bludflag** [+13] *\n", + "> \n", + "> >publically\n", + "> [That should be *publicly*.](http://imgur.com/a/Xj4jU)\n", + "> [Quotation marks.](http://i.imgur.com/da4y8Oj.png?1)\n", + "> Ellipses generally have a space on both sides, although when a sentence ends with an ellipsis, you don’t have one after it. E.g.:\n", + "> >“I see,” I said. “Um. What are you doing here?”\n", + "> >“I am your batman.”\n", + "> >“My . . .”\n", + "> >“Not the notional hero,” Sith said, a bit of a growl in his voice. “Your batman. Your orderly.”\n", + "> >“Orderly . . .” I frowned. “Wait. You work for me?”\n", + "> http://practicaltypography.com/ellipses.html\n", + "> Notably, *CMOS* dictates an ellipsis that has a space between the periods themselves rather than supporting the preformatted glyph which you use (Word AutoCorrect).\n", + "> [Phrasal adjectives.](http://imgur.com/a/f59Jq)\n", + "> Oh, and em dashes are the preferred option in AmE publishing—no space on either side. AmE also uses it to show interrupted text, whether internal thoughts or dialogue.\n", + "> >“I know exactly what role she has in mind for me, Sir Knight. I am to”—her mouth twisted—“be at your convenience.”\n", + "> >Did you ever read any Spider-Man comics when you were—”\n", + "> Found out you were going to edit the entire story and sell it as a book—here’s some useful advice for starting out.\n", + "> On a side note, [*forwards*](http://i.imgur.com/lqUz2TJ.png?1) is generally not used in AmE.\n", + "> I trust the regulars are already penning down the typos, so I’ll leave that to them.\n", + "> \n", + "\n", + ">> **u/TimTravel** [+10] *\n", + ">> \n", + ">> I've never seen ellipses separated in any book or newspaper.\n", + ">> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+11] *\n", + ">>> \n", + ">>> CMOS asks for the ellipsis to be separated by spaces because the pre-formatted ellipsis glyph may show up as another character depending on platform. They prefer writers to use . . ., then an editor can do a search-replace on the document, replacing all . . . with three periods surrounded by two non-breaking spaces.\n", + ">>> In reality, this is not considered the best way to make an ellipse by many typographers, who believe that an ellipse should be three dots separated by *thinspaces*. To not have spaces makes it feel to scrunched together, but it doesn't look as crazily wide as . . . either.\n", + ">>> >For manuscripts, inserting an ellipsis character is a workable method, but it is not our preferred method. It is easy enough for a publisher to search for this unique character and replace it with the recommended three periods plus two nonbreaking spaces (. . .). But in addition to this extra step, there is also the potential for character-mapping problems (the ellipsis could appear as some other character) across software platforms—an added inconvenience. So type three spaced dots, like this . . . or, at the end of a grammatical sentence, like this. . . . If you know how, use two nonbreaking spaces to keep the three dots—or the last three of four—from breaking across a line.\n", + ">>> \n", + "\n", + ">>>> **u/TimTravel** [+1] *\n", + ">>>> \n", + ">>>> Oh, I see. Thanks for clarifying.\n", + ">>>> \n", + "\n", + ">>>> **u/renegadeduck** [+1] *picky but enthusiastic**\n", + ">>>> \n", + ">>>> Ew. This is like making an em dash out of two hyphens. Use the character that's designed for that purpose and let the typographers do their job.\n", + ">>>> The argument about not recognizing the character correctly is nonsense; they're already recommending the use of a non-ASCII character. Anything non-ASCII could be recognized incorrectly if the document is opened with the wrong character set. (Which is why you should always use UTF-8.)\n", + ">>>> The problem of “…” being rendered incorrectly is a matter of font choice. It's rendered poorly in Verdana, but it looks good in Helvetica and Times.\n", + ">>>> (I realize I'm effectively arguing with CMOS here.)\n", + ">>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>> \n", + ">>>>> > . . . and let the typographers do their job.\n", + ">>>>> >(I realize I'm effectively arguing with CMOS here.)\n", + ">>>>> I agree with you on this. I'd rather use the character, ensure UTF-8 encoding, and be done with it.\n", + ">>>>> Also, if one is not using a word processor, many are not even aware of being able to input these special characters. FYI everybody: \n", + ">>>>> Character | Alt-Code\n", + ">>>>> :-: | :-:\n", + ">>>>> – | 0150\n", + ">>>>> —| 0151\n", + ">>>>> … | 0133\n", + ">>>>> On that note, I'd love for every keyboard to include the endash, endash, and ellipsis. /rant\n", + ">>>>> \n", + "\n", + ">>>>>> **u/renegadeduck** [+3] *picky but enthusiastic**\n", + ">>>>>> \n", + ">>>>>> > On that note, I'd love for every keyboard to include the endash, endash, and ellipsis. /rant\n", + ">>>>>> It's not useful to you, but it might be to others. On a Mac:\n", + ">>>>>> Character | Key combination\n", + ">>>>>> ----|----\n", + ">>>>>> – | option + hyphen\n", + ">>>>>> — | option + shift + hyphen\n", + ">>>>>> … | option + semicolon\n", + ">>>>>> Linux GUIs have similar combinations, or such combinations can be set up.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/Bludflag** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> https://www.smashingmagazine.com/2009/04/typography-keyboard-layout-download-now/\n", + ">>>>>>> Eat dust, old man. :v\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> very nice\n", + ">>>>>>>> \n", + "\n", + ">> **u/Agnoman** [+3] *\n", + ">> \n", + ">> I love me some Dresen Files.\n", + ">> \n", + "\n", + ">>> **u/Bludflag** [+1] *\n", + ">>> \n", + ">>> I had it on hand and it has approximately 400 gazillion beta readers and New American Library (a division of Penguin Group) behind it. The only mistake in it, IIRC, is how a scene got deleted by accident so stuff got confusing:\n", + ">>> >>**The first one has to do with Harry’s amulet.**\n", + ">>> >Okay, yes, Harry’s amulet, right.\n", + ">>> >>We saw it at the birthday party and never again … did it survive the circle on Demonreach?\n", + ">>> >Oh yes.\n", + ">>> >>**Unintelligible, something about why it wasn’t mentioned at all later*\n", + ">>> >I believe it was, he was with his gear, right, he took his gear off and he handed it to Michael [ed: Yes, he says Michael here]. Did I not specifically mention…?\n", + ">>> >>**Audience confirms he didn’t mention it**\n", + ">>> >**Unintelligible** although if that wasn’t written, that was an oversight during the editing process, which was a little crunched. I think the post-production on that was, from start to finish, I think it was 15 days, so there was a lot of back and forth and a lot of me not sleeping during the process.\n", + ">>> >>**Audience laughter**\n", + ">>> \n", + "\n", + ">> **u/throwawayIWGWPC** [+2] *\n", + ">> \n", + ">> Yes, thanks for this.\n", + ">> Where did you hear the author is going to edit and sell the book?\n", + ">> /u/nobody103, I'd be willing to help, and I'm familiar with the above-discussed topics and some basic typography.\n", + ">> \n", + "\n", + ">>> **u/nobody103** [+5] *\n", + ">>> \n", + ">>> I've said in the past that I'll only start looking into publishing the story once it is done, and I remain committed to that. I want to finish the story first. In addition, I have heard that publishers make problems for authors that want to publish stories that already exist on the internet. Since I have no intention of taking down the free version of the story from the the net, that might be a problem. \n", + ">>> Anyway, I suspect publishing MoL is going to be a long and somewhat frustrating process, so I don't want to deal with it at the moment. I'll gladly contact you for advice once I'm ready to move forwards with it, though.\n", + ">>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>> \n", + ">>>> >I have heard that publishers make problems for authors that want to publish stories that already exist on the internet.\n", + ">>>> Sounds good. Once the time comes to publish, I'm sure the community would love to help, myself included.\n", + ">>>> Just as some food for thought, the author Mooderino who writes the online serial [How To Avoid Death On A Daily Basis](http://www.fictiongrill.com/how-to-avoid-death-on-a-daily-basis/) has been publishing this series as he finishes each arc. He's finished four story arcs so far, so he may have some ideas of how the process works. The books are available on Amazon kindle as well as two sites I haven't heard of: Kobo and Smashwords.\n", + ">>>> \n", + "\n", + ">>>> **u/Dwood15** [+1] *\n", + ">>>> \n", + ">>>> > Since I have no intention of taking down the free version of the story from the the net, that might be a problem. \n", + ">>>> Eh, you could probably put it on the Amazon Kindle store. If your story had a larger outreach you could end up like the Worm author and get into talks of tv shows, lol.\n", + ">>>> \n", + "\n", + ">>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>> \n", + ">>>> I don't have much advice, but from what I understand, most publishers won't touch a debut novel over about 100k words, tops. Each arc is around 200k, I believe. And it wouldn't be right to chop huge segments out of a story like this, with so much rich world-building. So that could be problematic. :(\n", + ">>>> At least, dead tree publishers. Publishing as an e-book might have more flexibility. Except it's already possible to make an e-book for free. But it wouldn't hurt to try, and I'd be tempted to buy it despite having the free version.\n", + ">>>> Actually, my only real hesitation would be, not the money, but the fact that I'd like to make a version with all strong language trimmed or substituted. It's not worse than a lot of other stories, but I'd really like an \"airline version\". Would definitely pay for that.\n", + ">>>> \n", + "\n", + ">>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>> \n", + ">>>>> Incidentally, I'm currently [creating and revising](https://www.reddit.com/r/motheroflearning/comments/5uegsp/airline_version/) the aforementioned airline version, mostly for my own use and a couple of family members at this point.\n", + ">>>>> \n", + "\n", + ">>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>> \n", + ">>> > familiar the above topics\n", + ">>> You mean \"familiar *with*\"?\n", + ">>> :D I'd be quite interested in buying it.\n", + ">>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>> \n", + ">>>> Thanks. I accidentally a word. ;)\n", + ">>>> \n", + "\n", + ">>> **u/Bludflag** [+1] *\n", + ">>> \n", + ">>> It’s been answered, but he said that on chapter 40 on his Patreon.\n", + ">>> EDIT: Wanted to clarify, but I can help somewhat. Literature I have: [*Garner’s Modern English Usage*](https://en.wikipedia.org/wiki/Garner%27s_Modern_English_Usage), [*Chicago Manual of Style* PDF](https://en.wikipedia.org/wiki/The_Chicago_Manual_of_Style), and [*New Hart’s Rules*](https://en.wikipedia.org/wiki/Hart's_Rules).\n", + ">>> I also have *A Few Notes on Book Design*, but that’s more of a thing for people who don’t have the aforementioned books.\n", + ">>> Aside from that, I’m also familiar with typography to an extent. Not really a professional, but oh well. Probably the best I can offer on that is the idea of [rearranging your keyboard](https://www.youtube.com/watch?v=O9Gai7gRb5k) so you can edit it on your convenience. There’s an [existing layout](https://www.smashingmagazine.com/2009/04/typography-keyboard-layout-download-now/), but it uses a QWERTY keyboard—I somehow doubt that’ll work for you when you have a QWERTZ keyboard.\n", + ">>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>> \n", + ">>>> I usually use LaTeX if I need to make something nicely formatted, which takes care of the characters for me. I don't know if publishing companies would accept that kind of file though or the compiled PDF. I've never looked into it, mostly because I've never finished anything publishable.\n", + ">>>> \n", + "\n", + ">>>>> **u/Bludflag** [+1] *\n", + ">>>>> \n", + ">>>>> Literally how do you even manage?\n", + ">>>>> Anyway, I hate the font choices, so I simply use Adobe InDesign for making PDF documents (and Adobe Acrobat for headers and footers because I’m a n00b at master pages).\n", + ">>>>> Like, LaTeX is all about doing the formatting on its own while the user has less input (adding a font is OMGWTF in LaTeX, IIRC).\n", + ">>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>> \n", + ">>>>>> >Literally how do you even manage?\n", + ">>>>>> Templates. If you have a style files that you just add to over time, you eventually have a lot less to figure out. My template had a font section, so once I figured it out once, I'd just change the font for that section and it'd be okay. Sometimes, certain fonts require certain packages, so you just keep font and package pairs commented out for when you need them.\n", + ">>>>>> > LaTeX is all about doing the formatting on its own while the user has less input\n", + ">>>>>> I think LaTeX takes that route because most people don't know typography well enough to make those decisions, and it tends to do a really good job of it—certainly better than MS Word. At the same time, it gives you the control to make the decisions where needed, albeit using a forty-year-old markup language.\n", + ">>>>>> Anyhow, changing fonts can be annoying—it depends on your pain tolerance certainly—but I didn't find it too bad. I remember making a few resumes in LaTeX and then spent an hour recompiling with different fonts.\n", + ">>>>>> I've never used InDesign, but I'd like to play with it sometime.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/Bludflag** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> > I've never used InDesign, but I'd like to play with it sometime.\n", + ">>>>>>> http://imgur.com/L4Gn7sY\n", + ">>>>>>> That is all.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> All them space widths . . . \\drool\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/Bludflag** [+1] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> As an example of what a complete n00b can do with it: https://www.docdroid.net/036pZyi/swords-and-sorcery-prologue.pdf.html\n", + ">>>>>>>>> And yeah, it’s cool beans for special characters. You can even see invisible characters (space, paragraph marks, indents, non-breaking space, etc.) in it, which is a major boon when cleaning up the file.\n", + ">>>>>>>>> That would be why I prefer it, at least.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Very nice. And it's a hell of a lot easier than LaTeX.\n", + ">>>>>>>>>> P.S. The sample isn't yours is it? Hope i'm not being a jerk, but the margins look tiny and centering is a bit off. Other than that, it looks real nice.\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>>> **u/Bludflag** [+1] *\n", + ">>>>>>>>>>> \n", + ">>>>>>>>>>> Yeah, I did the thing, but I’m not really an expert on InDesign. It’s got a lot of options, so looking for a specific one is a pain.\n", + ">>>>>>>>>>> It’s just an experiment for now—I’ll look up tutorials to make it better when I have less school stuff to look forward to. \\^_\\^\n", + ">>>>>>>>>>> \n", + "\n", + ">>>>>>>>>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>>>>>>>>> \n", + ">>>>>>>>>>>> :D Yeah, programs like that have so much stuff going on\n", + ">>>>>>>>>>>> \n", + "\n", + "> **u/Mountebank** [+13] *\n", + "> \n", + "> What exactly is the limitation on teleportation in this setting? Zorian is able to go anywhere in the country it seems, so long distances isn't it. If he's limited by only being able to teleport to places that he's already been before, then he could make the trip to the other continent in stages across restarts. Better yet, pay someone to teleport the two of them.\n", + "> \n", + "\n", + ">> **u/Tur4** [+10] *\n", + ">> \n", + ">> I was thinking about this. It should be easy to find someone to take them there thats been there before if the only issue is that neither of them have been to koth. But because they haven't done that there must be something else at issue. Otherwise Daimon, a avery skilled wizard who clearly knows how to teleport would be coming back frequently from koth to visit or whatever but it sounds like he hasn't been back in some time in the story.\n", + ">> My only thought is there might be a distance limit to teleporting and since its across an ocean there are not relay locations to teleport in between. This is backed up by the discussion regarding how it would be hard to teleport an entire army under the town from a great distance, then they found those gates that solved the problem. \n", + ">> My own theory to how he gets to koth is that he gave his mom an anchor stone to take to Koth that way he could teleport to that. That said, a Bakora gate would also solve the problem though we haven't seen any evidence he has figured those out. But we do know he knows how to make teleport anchor stones.\n", + ">> \n", + "\n", + ">>> **u/thrawnca** [+12] *Carbon-based biped**\n", + ">>> \n", + ">>> The anchor stone is a clever idea, except, will his parents actually reach Koth promptly?\n", + ">>> \n", + "\n", + ">>>> **u/Tur4** [+11] *\n", + ">>>> \n", + ">>>> We know they are leaving the day Zorian wakes up to go to koth. Seems they were waiting for him to go to school before departing on their trip. Zach mentions in this chapter it will take the entire month to travel to Koth. That was another reason I thought of this. The time line fits.\n", + ">>>> \n", + "\n", + ">>>>> **u/Xtraordinaire** [+11] *Team Glimglam**\n", + ">>>>> \n", + ">>>>> I think this is just a set up for some shenanigans at the end of the month, where Zorian travels to Koth and *forgets* that his parents are arriving too.\n", + ">>>>> \"Hey son, how come you're not in school?!\"\n", + ">>>>> \n", + "\n", + ">> **u/cretan_bull** [+11] *\n", + ">> \n", + ">> Distances are a limitation:\n", + ">> ###[Chapter 45: Fine Structures](https://www.fictionpress.com/s/2961893/45/Mother-of-Learning)\n", + ">> > [Some of this doesn't make any sense,] Zorian complained. [According to you, the Ibasans are transporting their forces straight from Ulquaan Ibasa to Fort Oroklo, then from Fort Oroklo to some unknown point in the Sarokian Highlands, and then from there to beneath Cyoria.]\n", + ">> >[Yes, what of it?]\n", + ">> >[That's not enough stops for an effective teleportation chain,] Zorian said. [Only two stop points for a journey of such distance, with the final destination point being deep underground to boot? There is no way that's really what's happening. If they were sending letters or small packages maybe, but no way could you transport an army like that. Even if Quatach-Ichl is the best mass teleporter in the whole damn world, the mana costs for such long jumps would be completely impractical on that scale.]\n", + ">> >Admittedly, such a small number of stops would do much to explain how they could transport such an army through Eldemar territory without being discovered by Eldemar, but…\n", + ">> >[They're not teleporting in the manner we've seen you do it,] Memory of Sublime Glories noted. [They are using some kind of stone construct to open a dimensional passage between two points. Like a door to another land.]\n", + ">> As for destination, I believe one merely needs some way of divining the target location sufficiently accurately. Having been somewhere before should make that easier, but I do not think it should be a strict requirement for someone of Zorian's skill.\n", + ">> \n", + "\n", + ">> **u/AKAAkira** [+1] *\n", + ">> \n", + ">> Along with the distance thing others brought up, maybe it's also possible that there're some kind of wards being maintained along borders to discourage sneaking across?\n", + ">> Though maybe implementation of something like that is a bit tricky. Zorian said before that there are three steps to teleporting - the divination, the dimensional barrier, and I presume the actual transportation. None of of these are the kind of things that can be prevented outright if you limit the wards' area of effect, so if an anti-border-crossing ward exists it'll have to be country-wide. Otherwise, countries could just place detection/prevention wards where they can along the border and physically maintain a presence in border villages to catch anyone who sneaked through.\n", + ">> \n", + "\n", + "> **u/vallar57** [+7] *Unseen University: Faculty of High-Energy Magic**\n", + "> \n", + "> Zorian's simulacrum used Mischief! It's super-effective!\n", + "> \n", + "\n", + "> **u/-Fender-** [+8] *\n", + "> \n", + "> #Typo thread!\n", + "> >And while Zorian had never been, now was likely to ever be [...]\n", + "> \"had never been, **nor** was likely to ever [...]\"\n", + "> >The regain his wits quickly though, [...]\n", + "> \"**He regained** his wits [...]\"\n", + "> >All he could do was given them a list of better alchemists [...]\n", + "> \"All he could do was **give** them [...]\"\n", + "> **OR**\n", + "> \"he could do was **hand** them [...]\"\n", + "> >[...] it did inspire him to take his mental abilities in new direction.\n", + "> \"[...] his mental abilities in **a** new direction.\n", + "> **OR**\n", + "> \"[...] his mental abilities in new **directions**.\n", + "> >how to hire unscrupulous mercenaries without getting ripped off or in jail.\n", + "> \"[...] getting ripped off or **sent to** jail.\"\n", + "> >Then he took the finished designs and gave to same people in the next restart\n", + "> \"[...] the finished designs and gave **them** to the same people [...]\"\n", + "> >They probably though he had studied ahead [...]\n", + "> \"They probably **thought** he had [...]\n", + "> >[...] dimensional gates and haste himself, so he at least he accomplished something.\n", + "> *One of the \"he\" needs to be removed. Either work, so it's only a matter of preference whichever one you choose.*\n", + "> \n", + "\n", + ">> **u/thrawnca** [+5] *Carbon-based biped**\n", + ">> \n", + ">> making sure it was blundering/making sure it wasn't blundering\n", + ">> haven't managed to accomplish/hadn't managed to accomplish\n", + ">> use it entangle/use it to entangle\n", + ">> and reel him/and reel it\n", + ">> there was no publically available/there were no publicly available\n", + ">> pseudo-attack and/pseudo-attack, and\n", + ">> few more clarification/few more clarifications\n", + ">> other people's mind/other people's minds\n", + ">> four session/four sessions\n", + ">> couldn't help notice/couldn't help but notice\n", + ">> You've established link with the Cyoria's/You've established links with Cyoria's\n", + ">> knowledge how to hire/knowledge of how to hire\n", + ">> can only last/could only last\n", + ">> those Black Room/those Black Rooms\n", + ">> responded with by/responded by\n", + ">> commonly possess/commonly possessed\n", + ">> Sovereign gate/Sovereign Gate\n", + ">> done their own attempts/made their own attempts\n", + ">> \n", + "\n", + ">>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>> \n", + ">>> heart of sphere/heart of the sphere\n", + ">>> did managed to/did manage to\n", + ">>> being spent back/being sent back\n", + ">>> the Eldemar's/Eldemar's\n", + ">>> As for Zorian he did/As for Zorian, he did\n", + ">>> I had enough of this/I've had enough of this\n", + ">>> in jungles of Koth/in the jungles of Koth\n", + ">>> \n", + "\n", + ">>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>> \n", + ">>> using them golem's/using the golem's\n", + ">>> \n", + "\n", + ">> **u/throwawayIWGWPC** [+1] *\n", + ">> \n", + ">> 0. which attack it can tank\n", + ">> which attack it **could** tank\n", + ">> \n", + "\n", + "> **u/crivtox** [+8] *Closed Time Loop Enthusiast**\n", + "> \n", + "> Maybe the simulacrum can steal the eggs?the spider seems to be ignoring him so maybe he can steal the eggs before it notices him\n", + "> \n", + "\n", + ">> **u/bludvein** [+12] *\n", + ">> \n", + ">> The spider is ignoring it because it knows on some level that the simulacrum is a trap and not the main threat. Trying to remove the eggs would still have the simulacrum meeting the business end of a pissed off ninja tank spider.\n", + ">> \n", + "\n", + ">>> **u/DR_Hero** [+9] *\n", + ">>> \n", + ">>> It really makes you think. Did Silverlake know the simulacrum spell and bait Greyhunter before?\n", + ">>> \n", + "\n", + ">>>> **u/OutOfNiceUsernames** [+3] *fear of last pages**\n", + ">>>> \n", + ">>>> It would be neat if the grey spider was a [golden man](https://en.wikipedia.org/wiki/The_Golden_Man) [expy.](http://tvtropes.org/pmwiki/pmwiki.php/Main/Expy)\n", + ">>>> \n", + "\n", + ">> **u/Saffrin-chan** [+5] *\n", + ">> \n", + ">> The eggs are on the spiders underside. Considering that the Grey Hunter destroyed the Golems that tried to grapple with it, I think it would stop ignoring the simulacrum if it tried to directly take the eggs from its body.\n", + ">> \n", + "\n", + ">> **u/Krossfireo** [+3] *\n", + ">> \n", + ">> It seemed to not attack the simulacrum since Zorian was in range of it, maybe it would attack the simulacrum if (the real) Zorian wasn't in range\n", + ">> \n", + "\n", + ">> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">> \n", + ">> Did you just say \"before it notices him\"?\n", + ">> Seriously, is there *anything* that monster doesn't notice?\n", + ">> \n", + "\n", + ">>> **u/crivtox** [+0] *Closed Time Loop Enthusiast**\n", + ">>> \n", + ">>> well it(probably) doesn't notice neutrinos so yes there is\n", + ">>> \n", + "\n", + "> **u/Marthinwurer** [+10] *\n", + "> \n", + "> I'm surprised that no one has been talking about the simulacrum's conversation with Neolu. If I'm remembering correctly, she's acting differently than she has before in previous restarts.\n", + "> \n", + "\n", + ">> **u/Menolith** [+26] *Unworthy Opponent**\n", + ">> \n", + ">> I think that's because Simulacrum #1 was the first one created that day since Zorian wants to wipe them daily. The ones which came before him probably caused Neolu to diverge.\n", + ">> \n", + "\n", + ">> **u/throwawayIWGWPC** [+17] *\n", + ">> \n", + ">> It seems Zorian has been using a simulacrum to attend class for at least a few days if not longer. It's likely a previous simulacrum noticed Neolu's interest and decided to mix things up on the off-chance that Zorian has to deal with the aftermath. It's harmless enough and will annoy Zorian enough that the troll that lives in Zorian and all his copies can't resist. ;)\n", + ">> \n", + "\n", + ">>> **u/ZeroNihilist** [+11] *\n", + ">>> \n", + ">>> It isn't 100% harmless, and I suspect it may have minor ramifications.\n", + ">>> If you have N divergent copies of yourself each revealing slightly different information to somebody as a joke, there's no guarantee those N bits of (mis)information won't allow the target to figure out something true.\n", + ">>> This simulacrum made a joke about having a time machine. If the next makes a joke about actually being 100 years old, it provides a clearer picture for Neolu. And since none of them are telling Zorian-prime, none of the simulacra know whether they've collectively crossed a line.\n", + ">>> To put it another way, if 100 witnesses each tell a fraction of the truth with no coordination, it will be possible to extract a much more accurate answer than any one witness revealed. Even if they've all got a motive to be deceitful, they'll all tell their fragment of truth in a slightly different way.\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+3] *Carbon-based biped**\n", + ">>>> \n", + ">>>> Well, there's no chance of accumulating 100 witnesses in this case, of course.\n", + ">>>> And really, even if she figures it out - meh. They can ignore her, or recruit her. Still harmless.\n", + ">>>> \n", + "\n", + ">>>>> **u/possiblylefthanded** [+1] *\n", + ">>>>> \n", + ">>>>> And what if she's red robe?\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> Then she would have identified Zorian as a time traveler and dispatched him long ago, when he first started showing signs of improvement and growth.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/possiblylefthanded** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> That assumes you know her goal, and that the goal is inimical to Zorian's development.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> I assume that RR would have done *something* about discovering another time traveler, as happened with the aranea. S/he was not content to just ignore such a development.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/possiblylefthanded** [+1] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> Well, from what we know, they had a change of plans and left the room.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Yes, but my point is, well before that occurred, Neolu had ample opportunities to notice that Zorian was now topping every class. Yet she did nothing. She didn't even behave differently; Zorian was watching for that at one point.\n", + ">>>>>>>>>> \n", + "\n", + ">>>> **u/OutOfNiceUsernames** [+3] *fear of last pages**\n", + ">>>> \n", + ">>>> >Well… he wasn't the first simulacrum that was sent on this mission. And apparently one of the previous simulacrums was similarly bored out of his skull here and decided to go off the script and befriend her. And then never bothered to inform the original about it. Simulacrum number two didn't intend to inform the original either. The whole thing was harmless and imagining the original's reaction when he finally found out was kind of amusing.\n", + ">>>> I think Zorian is demonstrating some minor IdiotBall \\ blunder-level behaviour regarding his management of the clones. Even after that grey spider clone sent him feedback on how quickly and dramatically clones’ thought patterns can diverge from the original, Zorian still didn’t establish some system of check-up and “quality control” on the clones’ experiences and thoughts before dismissing them. \n", + ">>>> He just arbitrarily decided that <24h lifespan should be safe enough and went with it.\n", + ">>>> \n", + "\n", + ">>>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>>> \n", + ">>>>> I think doing a factory reset every 24 hours is probably sufficient quality control, but I do wish he treated his simulacra more like his equals instead of his servants. It's all very well for the original to be excited about sending someone *else* to be torn apart by the murder-spider, but he needs to remember that simulacra won't like doing anything that he would dislike doing *himself*.\n", + ">>>>> Which is not to say that he should stop sending them on potentially lethal or boring missions. The ability to copy himself is just too valuable to pass up. But a little more consideration and sympathy might go a long way.\n", + ">>>>> Consider: it was entirely foreseeable that when actually faced with the expectation of being torn apart by a super-spider, he would be scared. So he could have planned ways to mitigate that. Real-time memory uploads and a promise to promptly re-cast the spell afterward. Or letting it do something fun first, so it resented its existence less. Or planning a big victory party, so it feels like there's something worth being dispelled for, something to achieve. After all, these are copies of himself; it makes sense to care about their happiness.\n", + ">>>>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>> \n", + ">>>> I agree with you on this, but I think the effect is mitigated. Each \"witness\" is a copy of Zorian Prime from that morning. Zorian is pretty discrete and private, so his simulacra shouldn't get too crazy with things. Things might spiral out of control a little, but it's only a month until the slate's wiped clean.\n", + ">>>> Plus, Zorian knows that Zach has convinced Neolu that he's a time-traveler in the past and she was chill about it. That's probably why Simulacrum!Zorian is comfortable trolling Prime!Zorian with Neolu.\n", + ">>>> \n", + "\n", + ">>>> **u/Tommy2255** [+1] *\n", + ">>>> \n", + ">>>> If there's ever any indication of it becoming an issue, then that simulcrum is going to think \"dammit, past me, what were you thinking?\" and tell Zorian Prime so that the situation can actually be dealt with. These are very slight variations of the original independently deciding that it's a harmless joke. It's a situation that would be very difficult to snowball into a major issue without noticing.\n", + ">>>> \n", + "\n", + ">> **u/Cedrices_Diggory** [+5] *\n", + ">> \n", + ">> That's because Neolu is Red Robe.\n", + ">> \n", + "\n", + ">>> **u/Bighomer** [+7] *\n", + ">>> \n", + ">>> Now that's ridiculous! Clearly Red Robe is actually Kirielle.\n", + ">>> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+1] *\n", + ">>> \n", + ">>> Mystery solved.\n", + ">>> \n", + "\n", + ">> **u/DerSaidin** [+1] *\n", + ">> \n", + ">> Zorian simulacrum is in thinking: YOLO, lets spend some time with the ladies ( ͡° ͜ʖ ͡°)\n", + ">> \n", + "\n", + "> **u/melmonella** [+9] *Tremble, o ye mighty, for a new age is upon you**\n", + "> \n", + "> So, we know that one part of the Key is held by our undead supermage friend, one part is somewhere within a ridiculously well-defended encampment filled with traps and with a small army of battlemages on short dial (aka treasury), one is somewhere deep within the Xlotic desert, one is located within Koth jungles and finally one is on Blantyrre. Here is what I think:\n", + "> * Crown will probably be either the last or the first part of the Key they will collect in the final restart. Collecting it first would involve first spying on QI, finding out where he is certainly located at a set time, and then catching him off-quard while he doesn't have his stack of buffs (haste, all his shields, likely perception magic, contingency teleportation, etc) up. This is best done as early in the restart as possible, to maximise the element of surprise (as invasion draws near QI will likely grow more and more paranoid). On the other hand, collecting it last would probably probably involve defeating QI during the invasion, if finding him before that point proves troublesome. Now, I can't guess how that would work, but I imagine it would involve a really big magical cannon that would be able to launch a projectile with similar properties to that coin Kael developed. It would have to be big because that projectile would have to be moving fast enough that QI wouldn't be able to dodge, and magical enough that it would break straight through all his shields.\n", + "> * Taking dagger might be attempted in two different ways. One way to do that is to go at it all stealthy-like, sneak into the treasury and nib it without triggering the alarms. Personally, I don't think that is very likely, as the treasury seems incredibly well-defended. Alternatively, they could break through with brutal force, and then it should probably be the last part of the Key to get-as we have seen, otherwise local military won't let them do anything for the rest of the restart.\n", + "> * We obviously don't know anything about the other parts of the key, but I think that the one on Koth will involve Damien, one in Xlotic will involve those wasp-creatures nobody103 wrote about on his worldbuilding blog, and finally one on Blantyrre will be in the hands of the lizardpeople. Personally, I don't see \"you need to search a whole desert to find it\" as much of an obstacle to them, since they could probably use a combination of simulacra and polymorph potions to swiftly search for it. Turn into an eagle->fly around triggering the key-searching part of the marker once every couple seconds->do that with 10 simulacra simultaneously and you can cover a whole lot of ground in a day. For example, Homing Racing Pigeons have horisontal flight speed of 177 km/h, or about 50m/s. Assuming marker can ping the key from 200 meters away, that's 20 000 square meters covered per second. I think that with the use of magical drugs and potions you should be able to make them fly for 16 hours a day, for a total of about a billion square meters covered in a day. You could cover something the size of sahara desert pretty quickly like that.\n", + "> \n", + "\n", + ">> **u/Xtraordinaire** [+2] *Team Glimglam**\n", + ">> \n", + ">> Good idea with the pigeons, one problem: simulacrum has no soul and therefore no key detector.\n", + ">> \n", + "\n", + ">>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>> \n", + ">>> Then you need one really fast pigeon. A dragon-based potion, perhaps?\n", + ">>> \n", + "\n", + ">>>> **u/Xtraordinaire** [+4] *Team Glimglam**\n", + ">>>> \n", + ">>>> Pigeons carrying miniature gates that are constantly open to a room with real Zorian on detection duty.\n", + ">>>> But I think regular paid intel services would suffice instead of such brute force.\n", + ">>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+2] *\n", + ">>>>> \n", + ">>>>> >Pigeons carrying miniature gates that are constantly open to a room with real Zorian on detection duty.\n", + ">>>>> That's brilliant!\n", + ">>>>> Zorian could hire a team of trained pigeons—no need to make simulaca. Then he gets a team of mages who can all cast and maintain a gate spell. If they can anchor the gates to the birds somehow so each gate follows a pigeon, they could essentially cover large swaths of land at decent speeds.\n", + ">>>>> And maybe some aranea could help too, allowing them to control a ton of pigeons via relays.\n", + ">>>>> It would be one hell of a circus to pull it off.\n", + ">>>>> \n", + "\n", + ">>>>> **u/waylandertheslayer** [+2] *\n", + ">>>>> \n", + ">>>>> > Pigeons carrying miniature gates that are constantly open to a room with real Zorian on detection duty.\n", + ">>>>> If he can set up that, then why not go for the full Khepri defence and have a moving screen of miniature gates around him all the time? Hell, with his mind magic and access to an efficient way to generate moving gates that he can cast through, Zorian would basically be Khepri-lite in addition to all his other talents.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/melmonella** [+2] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>> \n", + ">>>>>> Because you never go full Khepri. That way lies madness and benny hill themes.\n", + ">>>>>> \n", + "\n", + ">>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>> \n", + ">>>>> Intel services have no way of finding the key in the middle of a desert that I am aware of.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/Xtraordinaire** [+1] *Team Glimglam**\n", + ">>>>>> \n", + ">>>>>> I mean the keys are not going to be just lying in the sand. They are Most likely to wind up in a treasury of some local power or at least at a site where such local power once resided. This is far from impossible to locate with non-magical means. Zorian will have to check it out, of course, but that would narrow the search down to several thousands points of interest as opposed to the entire continent divided by sub 1km^2 patches.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>>>>> \n", + ">>>>>>> Great. We'll have our mind-controlled army of telepathic relay-carrying, dimensional gate-dragging pigeons investigate those points of interest. Let's teach the pigeons calculus while we're at it. We'll find the keys by dinner.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/melmonella** [+2] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>>>>> \n", + ">>>>>>>> And that's how Gray Goo scenarios start.\n", + ">>>>>>>> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+1] *\n", + ">>> \n", + ">>> I think the pigeons would work. The simulacra are connected to the soul for the purpose of drawing mana. It's possible the simulacra also have access to the soul marker and its key detector.\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>> \n", + ">>>> I don't think the pigeons would work. Simulacra are connected to Zorian's soul, yes, but the soul stays in the original body. I suspect it will only detect Key pieces close to the original.\n", + ">>>> \n", + "\n", + ">>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>> \n", + ">>>>> That's possible, but not necessarily true. \n", + ">>>>> First of all, can simulacra use the key detector at all?\n", + ">>>>> Second, where does the soul reside?\n", + ">>>>> If the soul resides inside a person's body, one might expect simulacra to experience a distance-related time-delay when using mana.\n", + ">>>>> If the soul resides in a parallel dimension meant to store soul information, then that dimension does not have to map the distances of the spatial dimension—like how a holographic card does not preserve the distance of the hologram it creates.\n", + ">>>>> This would mean that even simulacra could use the key detector if they indeed have access to it in the first place.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> The author confirmed my speculation elsewhere in this thread...\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> Good to know. ♥\n", + ">>>>>>> \n", + "\n", + ">> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">> \n", + ">> Actually I think the lich-banishing bullet probably wouldn't need to pass through shields. The lich probably doesn't keep up shields when not under attack, because he's almost indestructible anyway. So if your projectile is fast enough that he can't react, I think that's all you need to snipe him.\n", + ">> \n", + "\n", + ">>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>> \n", + ">>> Are you really going to risk it?\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>> \n", + ">>>> Assuming you try it near the end of the restart, what's the worst that could happen?\n", + ">>>> \n", + "\n", + ">>>>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>>>> \n", + ">>>>> You waste your cannon plan (and thus a whole restart) when bullet glances off his shields?\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> In chapter 60, the lich shielded himself or dodged whenever he was attacked. So presumably he doesn't keep shields up continuously when not in combat.\n", + ">>>>>> I doubt that a cannon of any caliber could penetrate them anyway. At least, not in a single shot - and even if it could, the discharge of energy on impact would surely destroy the projectile. And you're unlikely to get a second shot.\n", + ">>>>>> Catching him with his shields down seems to me like the only way. Except for beating him in pitched battle. Which they still haven't done. It's all very well to make him flee and shore up other parts of the invasion, but that's a very different order to actually destroying his body - and preserving the crown in the process. He's like the murder-spider, except a hundred times worse; even an army couldn't really hurt him. The worst thing that happened to him was having his arms cut off, and he just stuck them back on. And continued to kill off dozens of soldiers.\n", + ">>>>>> No doubt the Lord British postulate applies, but for ZZ's purposes, the only practical solution is to catch him unaware and unshielded.\n", + ">>>>>> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+1] *\n", + ">>> \n", + ">>> Ch 29: Enchanting firearms\n", + ">>> >Firearms were notoriously tricky to enhance with magic. Like all ranged weapons, they had the problem that you could only enchant the device to be more accurate and durable, and if you wanted the projectile to have any sort of magical effect upon striking the target you had to enchant the projectile itself. Bullets were unfortunately very hard to enchant, being much smaller than arrows and crossbow bolts and usually made from some very magically unsuitable materials. You also couldn't touch the bullet to channel mana into it once it was already in the gun… though maybe if he installed some crystal mana channels into the gun via alteration…\n", + ">>> For a complicated enchantment like what Kael put on that coin, it may be difficult to make the \"coin cannon\" work. But Zorian is good at spell formula and can recruit a small team of researchers. They definitely should explore the tactic. If they can fire the gun before QI can cast a haste spell, they should be fine.\n", + ">>> \n", + "\n", + ">> **u/throwawayIWGWPC** [+1] *\n", + ">> \n", + ">> That's a good assumption: Zorian's simulacra should be able to check for the location of keys.\n", + ">> One issue, however, is how do simulacra respond to polyjuice? They aren't made of human material; we can't assume the potion will work on them in it's normal form—in fact, I'd guess the potion wouldn't work. That's not to say a *modified* polyjuice potion couldn't do the job, but Zorian might have to recruit a few alchemists to work on that problem.\n", + ">> \n", + "\n", + ">>> **u/nobody103** [+3] *\n", + ">>> \n", + ">>> As you guessed, a simulacrum cannot drink potions. Well, they technically can, but it would be useless. You need a real body to benefit from that.\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+3] *Carbon-based biped**\n", + ">>>> \n", + ">>>> I'm guessing also that the Key detection is tied to the physical location of his soul, which remains with the original body?\n", + ">>>> \n", + "\n", + ">>>>> **u/nobody103** [+3] *\n", + ">>>>> \n", + ">>>>> Yes.\n", + ">>>>> \n", + "\n", + ">>> **u/melmonella** [+1] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>> \n", + ">>> He is already learning alchemy. It's just a matter of time.\n", + ">>> \n", + "\n", + "> **u/InsaneBranch** [+15] *\n", + "> \n", + "> Zorian used shadow clone jutsu! Now to learn mass shadow clone jutsu ...\n", + "> \n", + "\n", + "> **u/Tommy2255** [+7] *\n", + "> \n", + "> No wonder simulcra are forbidden magic. Necromancy and blood magic and mind magic can be used for unspeakable evil, but that's nothing compared to the ultimate humiliation: trolling yourself.\n", + "> \n", + "\n", + "> **u/narfanator** [+5] *\n", + "> \n", + "> So, what's the timing involved in the pipeline for a simalcrum memory packet? Ex: If a simalcrum sends over a full day's memories, how long does it take to a) make the memory packet b) send the packet c) for ZorianPrime to absorb the packet?\n", + "> It does seem like Zorian is using them to good effect (clone per job!), but I'm still curious as to what the improvement ratio ends up being.\n", + "> (Does the author hang out here at all?)\n", + "> \n", + "\n", + ">> **u/cathemeralman** [+10] *\n", + ">> \n", + ">> Nobody103 pops in occasionally, but rarely responds to questions posted on reddit. He responds to almost all comments on his [patreon page](https://www.patreon.com/nobody103) and [worldbuilding blog](https://motheroflearninguniverse.wordpress.com/) though.\n", + ">> \n", + "\n", + ">> **u/throwawayIWGWPC** [+3] *\n", + ">> \n", + ">> > (Does the author hang out here at all?)\n", + ">> Yep, he comes around. He's Croatian and it's currently 3 AM for him, so he may be around in the next day or so.\n", + ">> \n", + "\n", + ">> **u/None** [+2] *\n", + ">> \n", + ">> Yeah I was thinking that, it seems silly to not absorb their memories a the end of the day if its possible, and it softens the dying part as well\n", + ">> \n", + "\n", + "> **u/crivtox** [+3] *Closed Time Loop Enthusiast**\n", + "> \n", + "> This is the shadow cl..... I mean simulacrum spell\n", + "> \n", + "\n", + "> **u/Fomalhaut-b** [+4] *\n", + "> \n", + "> Hi, there. I'm new to this series. I've just had a huge binge read of Mother of Learning. It's great. I'm going to have to read it all again from the start. There's so much.\n", + "> The simulacrum perspective is really good stuff as it picks up on Zorian's questionable status as a copy. Nice that this is being explored, and I like that it's adding a new PoV. Potential for extra runtime and replace his need for Black Rooms.\n", + "> Nice that there are so many body/soul options that could all be possible escape exits from the Sovereign Gate. I have a hunch that Lich and Mayor Necromancer could become allies, or at least tools, for the duo's exit. This is tipped off by Red Robe's quick escape, and I think they may have to reconstruct RR pathway to get out.\n", + "> Still wondering if/when the story will circle back on the soul alteration that started this story. This is so mysterious to me as the story has established that Shifters get benefits from having animal souls within them and inherit special abilities from that infusion. Did Zach get something from Zorian? Such as an improved his Shaping ability? Did Zorian get more that the Marker? \n", + "> Speculation: If Zack carried Zorian's soul outside of the Gate with him, he has enough mana to manifest Zorian in a simulacrum. Don't know if the magic system supports this sort of thing. I'd like to see more Zorian's internal conflict over having to \"kill\" his true self played out in his simulacrums. \n", + "> I miss those damn cute spiders.\n", + "> \n", + "\n", + ">> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">> \n", + ">> There's no indication of Zach or Zorian picking up anything except the marker, but it would be hard to tell. Zorian's mana reserves might well grow a little bit more than he'd expect, but he doesn't have any precise way to measure that, since his magic missiles are way more efficient than when he started measuring.\n", + ">> The author has confirmed on his [blog]( https://motheroflearninguniverse.wordpress.com/2016/08/07/golems-and-undead/#comments) that you could make a simulacrum of someone else, but you would need soul sight, not just personal soul awareness.\n", + ">> Of course the lich will become a tool of escape - or, at least, they'll take such a tool off his head. To actually recruit him, though, would unbalance the story. If he said to pack up and go home, or to massacre the cultists before they complete the ritual, the Ibasans would do it.\n", + ">> Sudomir also isn't likely to become an ally, but they will probably take the opportunity to disrupt the invaders' preparation by toppling him.\n", + ">> \n", + "\n", + ">>> **u/Fomalhaut-b** [+1] *\n", + ">>> \n", + ">>> Hey, thanks! There's clues sprinkled around this story, and it's a lot of fun trying to piece them all together.\n", + ">>> I think Red Robe is an ally! I don't think he came from inside the loop- I think he is Zach's mage trainer and the one that put him into the Gate before the story started. He either entered the gate with Zach and a copy of his marker, or he knew he was copied into the Sovereign Gate, and was given a marker by Zach once inside. It's plausible.\n", + ">>> I'm concerned for Zorian. It doesn't currently seem possible that he can exit the simulation without doing something drastic. I really enjoy how the author has so much restraint in defining Zorian's character growth. It's refreshing to read a coming-of-age story that isn't littered with false drama, and I have my fingers crossed that Zorian will remain both credible and consistent.\n", + ">>> I'm looking forward to meeting Damien as it has so much potential for Zorian to get over his old hang ups. Damien, being older and having excelled, seems to be a parallel to Timelooped Zorian and his irl self. If Timelooped Zorian somehow exits the gate, I think Zorian Prime would be feel incredibly inferior to him for the same reasons that he feel inferior to Damien. Not sure how that going to play out so I'll be here for the next chapter.\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+2] *Carbon-based biped**\n", + ">>>> \n", + ">>>> Red Robe as Zach's trainer doesn't work for me.\n", + ">>>> - He criticised Zach's failure to shield himself from divination. A trainer would have told Zach to remedy the failure, years ago, or decades.\n", + ">>>> - He approached Zach as an enemy, assaulting him to get access to his mind. If he were any kind of ally of Zach, he would have just asked. We know Zach was lonely and jumped at the chance of companions.\n", + ">>>> - He's apparently a cultist, based on his easy access to the robe, and they're bad news.\n", + ">>>> - He didn't try to help Zach recover his memories. Either he did the wipe himself - probably, with his unstructured mind magic - or he didn't mind that someone else did it.\n", + ">>>> \n", + "\n", + ">>>>> **u/Fomalhaut-b** [+1] *\n", + ">>>>> \n", + ">>>>> All very good points. \n", + ">>>>> What baffles me is how Zach got into the Sovereign Gate, and for what purpose? What are your thoughts on this?\n", + ">>>>> It seem that the Gate activates once every 400 years, and may be tied directly to the Noveda bloodline. Otherwise, why put him in there. The same astrological conjunction that occurs is also the best time for summoning the Primordial, so maybe the SGate is a divine safety net against such an event. Possibly there's a reason that's yet to be revealed that Zach *need* to be at peak mana. Zach's fantastic stats aren't as relevant in the final battle as strategy, though this could be story bias towards Zorian. \n", + ">>>>> I agree that RR is the one that mind wiped Zach. On top of that, Zach has a compulsion to prevent anyone from undoing this. To me this indicates that there is a plot twist hidden inside- as the amnesia trope is often used to conceal information such as this. What does Zach's amnesia achieve?\n", + ">>>>> RR is a covert agent that infiltrated the invasion force, and used it to hammer Zach until Zach matured and found way to defeat it. After that, RR collected the five keys- four that he has access to because he is an agent of the Crown, and the fifth he can get from Quatach-Ichl due to this previous reconnaissance. Why did RR leave at that point? \n", + ">>>>> Zorian speculates that RR feared multiple time traveler. I think it's because the purpose of the Timeloop was completed. A solution to the invasion had been found- an alliance with the Arenae can foil the invasion without any input from Zach. Furthermore, the control conditions had become polluted with (seemingly) additional time travellers that were corrupting Zach.\n", + ">>>>> Maybe RR departure should have ejected Zach, but Zach's tie to Zorian has anchored him from leaving. Zorian is the spanner in the works.\n", + ">>>>> I think it's highly likely that the Zach has a lot of safeguards around him that will allow him to exit, and these are going to be the obstacle to Zorian's survival.\n", + ">>>>> \n", + "\n", + ">>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>> \n", + ">>>>>> > Zach has a lot of safeguards around him that will allow him to exit\n", + ">>>>>> The Guardian wouldn't allow Zach to exit. The Gate is barred.\n", + ">>>>>> On the other hand, since it previously was not barred, RR would not have needed to collect the Key.\n", + ">>>>>> > Zorian is the spanner in the works\n", + ">>>>>> The loop remains, not just because of Zorian, but also because of Zach. It can't end while there is a Controller inside.\n", + ">>>>>> > an alliance with the aranea can foil the invasion\n", + ">>>>>> If RR planned to ally with the aranea, he wouldn't have bothered to hunt them down and evict them from the loop. He would have simply exited, or else spent some time actually working with them.\n", + ">>>>>> And he ambushed and attacked Zach twice before leaving. He's no ally.\n", + ">>>>>> > may be tied to the Noveda bloodline\n", + ">>>>>> I don't see any evidence for that. Whoever marked him and started the Gate may have seen his undeveloped potential - speculation only - but there's no indication that Noveda in general have any affinity with the Gate.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/throwawayIWGWPC** [+3] *\n", + ">>>>>>> \n", + ">>>>>>> >> may be tied to the Noveda bloodline\n", + ">>>>>>> > I don't see any evidence for that.\n", + ">>>>>>> That the Gate was among the Noveda treasures is weak evidence, but evidence nonetheless.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> OK, there is that correlation.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/Fomalhaut-b** [+1] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> > Gate was among the Noveda treasures\n", + ">>>>>>>>> That was what stuck in my mind.\n", + ">>>>>>>>> The gate was no longer in Zach's possession- having been sold/donated. I find it curious that Zach is the controller of the Gate if he had no access to it.\n", + ">>>>>>>>> This is what leads me to think that RR secured vicarious access to the Sovereign Gate through Zach by being the one to initiate it.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> You don't need to come in contact with the Gate to be the Controller. You just need to be marked.\n", + ">>>>>>>>>> And activating the Gate doesn't give you a mark, either. Remember how the Guardian said that the purpose of the Gate was between the Controller and whoever marked them, then corrected itself to say it's really up to the Controller, since nothing stops them from doing as they please?\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>> **u/Fomalhaut-b** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> > the Gate was among the Noveda treasures\n", + ">>>>>>>> Thanks. That's what chiefly stuck out to me. \n", + ">>>>>>>> In addition, the Noveda bloodline ability is only loosely described as a capacity for high mana. Hardly unique, as others have been mentioned to have this (e.g. Damien, Fortov) though not as absurdly high as Zach.\n", + ">>>>>>>> It was also pointed out (somewhere!) that Zach's high mana, and slow shaping maturation, was something that would keenly benefit from Black Room time dilation. The Sovereign Gate is a perfect aid for him to capitalise on these qualities, if indeed his bloodline are the \"chosen ones\".\n", + ">>>>>>>> Doesn't explain why the keys are scattered everywhere. \n", + ">>>>>>>> Qualith Ichl may have answers- if he's 1000 years old he's lived through two activations of the Sovereign Gate, and if the Planar alignments are evenly spaced at 400 years apart. We know from the Ghost Serpent that some entities undoubtably know of the Sovereign Gate's function. This is a massive can of worms- there are people copied inside the gate could keenly know the scenario, and may want a way out. May not be a plot point- The Gate may be too esoteric for anyone to operate, and a true Noveda family secret expunged from or buried in Zach's compromised mind.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>>> \n", + ">>>>>>>>> Meeting someone else who already knows about the Gate (besides the Ghost Serpent, that is) could be quite interesting.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> > In addition, the Noveda bloodline ability is only loosely described as a capacity for high mana.\n", + ">>>>>>>>> I still have my doubts about it being a bloodline. Zach said:\n", + ">>>>>>>>> > \"No one I consulted about [having a large mana pool yet good shaping skills] has any idea how that is possible. Most people think it's some kind of undocumented bloodline of the Noveda.\"\n", + ">>>>>>>>> My pet hypothesis is that Zach's strange abilities are part of the whatever ritual gave Zach the loop marker. Like you said, the loop is the perfect environment for a huge mana pool in exchange for slow shaping maturation.\n", + ">>>>>>>>> If Zach's abilities are the result of a bloodline that only pops up every once in a while, it's a *huge* coincidence that the bloodline happened to manifest in the same generation that gets to use the Sovereign Gate. So, my guess is that Zach's abilities and the Sovereign Gate are intimately linked. Either the bloodline is somehow a once in 400-years thing or it's a part of the loop marking ritual. Or maybe it's a second ritual done in addition to the ritual that gave Zach the marker—and that's why Zorian didn't get the mana reserves boost when he got the soul marker.\n", + ">>>>>>>>> ---\n", + ">>>>>>>>> As for Quatach-Ichl, I would freaking *love* for ZZ to spend a couple restarts chatting his ear (skull?) off; he must be a fascinating person to talk to. Sadly, I doubt QI would give ZZ the time of day unless QI knew they were loopers, and if QI knew they were loopers, I'm pretty sure he'd find some way to make them into lab rats.\n", + ">>>>>>>>> I'm really disappointed that ZZ aren't fighting QI at the end of every restart, trying to find ways to beat him. And if they could eventually disable him to the point where Simulacrum!Zorian could access QI's mind . . . hoh boi, would that be interesting.\n", + ">>>>>>>>> (I say Simulacrum!Zorian because personally invading the mind of a 1000-year-old lich has NOPE written all over it.)\n", + ">>>>>>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>> \n", + ">>>>>> I'm happy to see newcomers to the discussion! I love that we can discuss the book with dozens of others after every chapter release.\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/Fomalhaut-b** [+1] *\n", + ">>>>>>> \n", + ">>>>>>> I'm re-reading it now. A good time travel story has a lot more to give the second time around. So many details grow in relevance.\n", + ">>>>>>> This story has such a sweet cast. Zorian's sardonic wit is very entertaining.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>>>> \n", + ">>>>>>>> Yes, absolutely. I've reread it once so far and enjoyed it all the more the second time around. There are so many details and hints about the mechanics of the world that are later revealed.\n", + ">>>>>>>> \n", + "\n", + "> **u/Green0Photon** [+3] *Student in Cyoria, Minmay, and Ranvar**\n", + "> \n", + "> Unlikely but possible note on rogue simulacrums: Can you steal a soul? Considering simulacrums don't have souls, that means it's only how your magic works that's the difference. Imagine the Matriarch's packet and instead just copy your whole mind over and delete the other one. I think of it as an unstructured mind magic thing, but that would be too hard. So imagine that the simulacrum spell creates a blank mental construct, and part of that is copying your mind over. It would be \"simple\" to change it to overwrite someone else's mind then, right?\n", + "> \n", + "\n", + ">> **u/crivtox** [+3] *Closed Time Loop Enthusiast**\n", + ">> \n", + ">> stealing souls to power simulacrums seems easier than modifying the spell to take over people.I can imagine a necromancer premiering an army of simulacrums this way, it probably doesn't happen because you can't really trust the simulacrum in all situations , maybe whith mind magic like zorian's you can become a coordinated hive mind\n", + ">> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+2] *\n", + ">>> \n", + ">>> I'm curious to what extent a mind packet could transfer *personality* itself. In the story, mind packets have been used to store a bit of data, but to rewrite a person's entire being with your personality? That's got to take a true mind magic master.\n", + ">>> \n", + "\n", + ">>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>> \n", + ">>> You can't power a simulacrum with someone else's soul; the author has confirmed.\n", + ">>> \n", + "\n", + ">>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>> \n", + ">>>> Can you quote that?\n", + ">>>> A simulacrum is a sort of construct. I'm sure using a soul as a battery for a simulacrum wouldn't work—the soul still has to integrate the raw mana into the prime!caster's soul. However, changing the simulacrum's soul anchor to another person's soul may be doable.\n", + ">>>> \n", + "\n", + ">>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>> \n", + ">>>>> It's on the [world-building blog](https://motheroflearninguniverse.wordpress.com/2016/08/07/golems-and-undead/#comments)\n", + ">>>>> \n", + "\n", + ">>>>>> **u/throwawayIWGWPC** [+1] *\n", + ">>>>>> \n", + ">>>>>> Okay, it seems that changing a simulacrum's soul anchor is just not doable; maybe the ectoplasmic container disintegrates if the connection to the soul is broken. This reminds me of an interesting question:\n", + ">>>>>> /u/nobody103: If a person makes a simulacrum and then dies, what happens to the simulacrum?\n", + ">>>>>> \n", + "\n", + ">>>>>>> **u/nobody103** [+2] *\n", + ">>>>>>> \n", + ">>>>>>> They lose the soul that powers them (it moves on to the afterlife) and are thereafter living on borrowed time.\n", + ">>>>>>> \n", + "\n", + ">>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>> \n", + ">>>>>>>> Really? I'm surprised they get any time at all. The ectoplasmic shell imposes a continual mana cost, doesn't it? Without a source of mana, I would have expected them to dissipate as quickly as the skeleton pirate wards.\n", + ">>>>>>>> \n", + "\n", + ">>>>>>>>> **u/nobody103** [+2] *\n", + ">>>>>>>>> \n", + ">>>>>>>>> Their maintenance costs aren't as severe as those of the pirate ship wards (ectoplasm isn't *that* unstable), or else how would Zorian maintain them for any length of time? The simulacrums could linger on for a couple of hours, unable to cast anything and steadily losing cohesion.\n", + ">>>>>>>>> \n", + "\n", + ">>>>>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>>>>> \n", + ">>>>>>>>>> Could they cast spells from raw ambient mana during that period?\n", + ">>>>>>>>>> Also, the soul lingers with the body for a short time, yes? Could the simulacrum use that time to anchor the soul to something, effectively becoming a lich?\n", + ">>>>>>>>>> \n", + "\n", + ">>>>>>>>>>> **u/nobody103** [+3] *\n", + ">>>>>>>>>>> \n", + ">>>>>>>>>>> Once the soul is gone, they cannot cast anything at all.\n", + ">>>>>>>>>>> Yes, provided the body was not totally destroyed, the soul would linger on the material plane for a while, and the simulacrum would have the chance to claim the soul if they knew how (if the original was a necromancer, in other words).\n", + ">>>>>>>>>>> \n", + "\n", + ">>>>>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>>>>> \n", + ">>>>>>> We know that the soul remains for a short time and then passes on. I'm betting that the simulacrum disperses when that happens.\n", + ">>>>>>> Unless you take it a step further, binding your soul to something so it doesn't pass on, and congratulations, you're a lich!\n", + ">>>>>>> \n", + "\n", + "> **u/Kylinger** [+4] *\n", + "> \n", + "> As for getting the dagger, wouldn't it be easier to bring someone with the authority to access the dagger into the loop temporarily to convince them to help/mind magic them into helping him? I assume *someone* is allowed to access the vault, even if the only person who can is the king.\n", + "> \n", + "\n", + ">> **u/FuguofAnotherWorld** [+2] *Roll the Dice on Fate**\n", + ">> \n", + ">> Telling the king or other high-up mages is risky: they might try to hunt you down and change your memories/soul to get in on the loop in the hopes of getting out of the restarts, and they have significant resources to try such things.\n", + ">> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+2] *\n", + ">>> \n", + ">>> Yeah, if a Royal hit squad was giving Z&Z trouble, imagine the fallout if the king thought he could enter a time loop. He'd throw everything at them with all the speed and subtlety possible—which may result in capture before Zorian can flip the soul marker switch and restart everything.\n", + ">>> \n", + "\n", + "> **u/ansible** [+4] *The Culture**\n", + "> \n", + "> So, assuming they do successfully get out of the time loop...\n", + "> What's the plan for living the actual month in question? Obviously they're making notes to quickly generate a lot of cash. So they'll go after the mana crystals again.\n", + "> They've got to assume that the minute they exit the loop, Red Robe is coming after both of them.\n", + "> Right before the end, maybe they should have a practice month to play out exactly how they want to handle the real world.\n", + "> \n", + "\n", + ">> **u/bludvein** [+7] *\n", + ">> \n", + ">> On the contrary, Red Robe will be totally ignorant of their existence. From his perspective they should already be a done deal when he left the loop. They could make a fake corpse for Zach just in case RR tries to confirm and then totally take him by surprise.\n", + ">> Practice would be unreliable in this situation. The best chance for practice already left when RR quit, and the invasion and the city plays completely differently due to no inside knowledge and monster incursions already putting the city on high alert.\n", + ">> \n", + "\n", + ">>> **u/throwawayIWGWPC** [+6] *\n", + ">>> \n", + ">>> What's worse, outside the loop, the invasion should have access to the divine plane, so demon summoning may be a thing.\n", + ">>> But I bet Zorian on his own could defeat RR at this point, and with Zach's help, I think it'd be a done deal.\n", + ">>> The intel they *really* need is: Who is RR, where is he going to be, and can they ambush him? If they can bring along Alanic and Xvim, RR is toast. I'm sure something will throw a wretch in all that though.\n", + ">>> \n", + "\n", + ">>> **u/melmonella** [+3] *Tremble, o ye mighty, for a new age is upon you**\n", + ">>> \n", + ">>> And the total lack of demons.\n", + ">>> \n", + "\n", + ">> **u/thrawnca** [+3] *Carbon-based biped**\n", + ">> \n", + ">> I think their most important goal should be to protect the shifter children.\n", + ">> If the primordial gets out, then the nation, maybe the continent, is toast. If they interrupt the summoning halfway through, *they* are toast, and potentially the whole city, depending on exactly how widespread the effects are. So they should guard shifter children and stop the ritual from becoming feasible. Unless they were kidnapped before the loop started.\n", + ">> \n", + "\n", + ">>> **u/None** [+2] *\n", + ">>> \n", + ">>> [deleted]\n", + ">>> \n", + "\n", + ">>>> **u/thrawnca** [+1] *Carbon-based biped**\n", + ">>>> \n", + ">>>> Well, if you're OK with \"unethical\", then they could get hold of a necromancer and make simulacra of the children to leave in their place.\n", + ">>>> \n", + "\n", + ">> **u/Tommy2255** [+3] *\n", + ">> \n", + ">> Tell Alanic about Iasku Mansion. That pulls the entire invasion completely off-schedule and off-plan, the trial run happened while Red Robe was already out of the loop so most of his foresight is useless, and the reintroduction of access to extraplanar help is much less of a factor when dealing with a necromancer than it is when dealing with cultists.\n", + ">> \n", + "\n", + "> **u/OchreOgre_AugerAugur** [+5] *\n", + "> \n", + "> Now that Zorian has simulacrum reasonably mastered, time to learn Summon Grey Hunter/s.\n", + "> \n", + "\n", + "> **u/noggin-scratcher** [+1] *I am a happy tree**\n", + "> \n", + "> Behind on my reading and late to the discussion, but I have to point out...\n", + "> > Well, unless Xvim was secretly hiding something of crucial importance from him, but Zorian kind of doubted that.\n", + "> Sure doesn't sound like any kind of suspicious foreshadowing going on here... if Zorian \"kind of doubts\" that Xvim is hiding anything important then that's that settled.\n", + "> \n", + "\n", "---\n", "\n", "\n" @@ -897,17 +2813,6 @@ " f.write_text(json.dumps(comments, indent=2))" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "6d102e3d", - "metadata": {}, - "outputs": [], - "source": [ - "comments = list(submission.comments)\n", - "len(comments)" - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/nbs/mjc_004_process.ipynb b/nbs/mjc_004_process.ipynb index 59ac9214..f481cd30 100644 --- a/nbs/mjc_004_process.ipynb +++ b/nbs/mjc_004_process.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -17,16 +17,57 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# We will get a list of title from markdown links\n", + "from collections import defaultdict\n", + "import re\n", + "titles_md = defaultdict(list)\n", + "\n", + "\n", + "title_blocklist = ['patron', 'here', 'link', 'this', 'delete', 'this one', 'vote', 'image', 'comic explanation', 'this link', 'this thread', 'redact', '(link)', 'this post', 'CLICK THIS LINK', \"here's\", 'wiki']\n", + " \n", + "\n", + "def remember_md_link_titles(markdown_text):\n", + " # Regular expression to match markdown links\n", + " markdown_link_pattern = re.compile(r'\\[([^\\]]+)\\]\\((http[s]?://[^\\)]+)\\)')\n", + "\n", + " # Find all markdown links\n", + " for match in markdown_link_pattern.findall(markdown_text):\n", + " title, url = match\n", + " # tidy title of * / _ and remove leading/trailing whitespace\n", + " title = title.strip().strip('*').strip('_')\n", + "\n", + " if len(title)<3:\n", + " continue\n", + "\n", + " if title.startswith('http'):\n", + " continue\n", + " if title.startswith('^'):\n", + " continue\n", + "\n", + " if title.lower() in title_blocklist:\n", + " continue\n", + "\n", + "\n", + " titles_md[url].append(title)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1074" + "5588" ] }, - "execution_count": 2, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -38,16 +79,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "7459" + "25710" ] }, - "execution_count": 3, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -56,15 +97,24 @@ "\n", "def extract_links_re(s:str):\n", " return re.findall(r'\\[.*?\\]\\((.*?)\\)', s)\n", + "\n", + "\n", + "\n", "from collections import defaultdict\n", "karma = defaultdict(int) # track score\n", "gossip = defaultdict(list) # track number and content of comments... FIXME should include subcomments?\n", + "\n", + "banned_suffixes = ['jpeg', 'png', 'jpg']\n", + "\n", "data = []\n", "for f in fs:\n", " s = json.loads(f.open().read())\n", "\n", " for comment in s['comments']:\n", - " links = extract_links_re(comment['body'])\n", + " text = comment['body']\n", + " links = extract_links_re(text)\n", + " links = [l for l in links if not any(l.endswith(s) for s in banned_suffixes)]\n", + " remember_md_link_titles(text)\n", " for l in links:\n", " karma[l] += comment['score'] / len(links)\n", " gossip[l].append(comment['body'])\n", @@ -75,93 +125,107 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 4, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "https://redact.dev 139.000000\n", - "https://www.royalroad.com/fiction/81002/the-years-of-apocalypse-a-time-loop-progression 117.305556\n", - "https://www.fanfiction.net/s/10677106/1/Seventh-Horcrux 97.312500\n", - "https://www.youtube.com/watch?v=OfJRm0WssOE 97.000000\n", - "https://www.royalroad.com/fiction/41330/virtuous-sons-a-greco-roman-xianxia 86.500000\n", - "https://www.royalroad.com/fiction/21410/super-minion 84.116667\n", - "http://unsongbook.com/ 70.909091\n", - "https://www.royalroad.com/fiction/50836/to-the-far-shore 68.000000\n", - "http://www.bay12games.com/dwarves/ 68.000000\n", - "https://cdn.discordapp.com/attachments/618861167640576021/704019068188885042/Inspirational_Gimel_Meme.png 67.000000\n", - "https://patreon.com/alexanderwales 63.000000\n", - "https://www.royalroad.com/fiction/26727/arkendrithyst 61.055556\n", - "https://worm.fandom.com/wiki/Entity 60.000000\n", - "https://archiveofourown.org/works/3451040/chapters/7569143 58.100000\n", - "https://twigserial.wordpress.com/ 56.000000\n", - "https://tvtropes.org/pmwiki/pmwiki.php/Main/StraightMan 54.000000\n", - "https://en.wikipedia.org/wiki/Face_(sociological_concept\\ 52.000000\n", - "https://archiveofourown.org/works/11478249/chapters/25740126 50.988889\n", - "https://parahumans.wordpress.com/2011/08/27/agitation-3-6/ 49.000000\n", - "https://www.royalroad.com/fiction/40182/only-villains-do-that 48.972222\n", - "https://forums.spacebattles.com/threads/a-young-girls-game-of-thrones.1095557/ 48.338798\n", - "https://www.royalroad.com/fiction/65801/slumrat-rising 47.625000\n", - "https://docs.google.com/spreadsheets/d/1PaLrwVYgxp_SYHtkred7ybpSJPHL88lf4zB0zMKmk1E/edit?usp=sharing 47.000000\n", - "https://archiveofourown.org/works/777002/chapters/1461984 47.000000\n", - "https://derinstories.com/2022/06/04/001-the-problem-with-the-javelin-program/ 46.500000\n", - "https://www.fanfiction.net/s/5193644/1/Time-Braid 46.181331\n", - "https://www.reddit.com/r/rational/comments/9esous/the_asteroid_strike_unconceivable_threats_in/ 46.000000\n", - "https://www.royalroad.com/fiction/46901/the-last-orellen 45.394872\n", - "https://www.royalroad.com/fiction/41852/the-last-ship-in-suzhou 45.000000\n", - "https://www.reddit.com/r/Parahumans/comments/5yfs9d/weve_got_worm_podcast_episode_1_arc_1_gestation/?st=ja74s1v5&sh=73ec3102 45.000000\n", - "http://pastebin.com/eb1iCVuN 44.000000\n", - "https://www.reddit.com/r/rational/comments/7x3ifv/rtwip_worth_the_candle_ch_76_date_night_start/du56bh2/ 43.000000\n", - "https://docs.google.com/document/d/1SddGHeVfcVa5SCDHHTOA4RlKwnef-Q6IMw_Jqw9I0Mw/ 43.000000\n", - "https://www.royalroad.com/fiction/83315/systema-delenda-est 42.250000\n", - "https://www.royalroad.com/fiction/57011/industrial-strength-magic 41.685897\n", - "https://www.royalroad.com/fiction/15925/the-daily-grind 41.200000\n", - "https://www.reddit.com/r/HPMOR/comments/gqoal1/story_contest_you_have_compiled_your_code_and_the/ 41.000000\n", - "https://www.d20pfsrd.com/equipment/goods-and-services/herbs-oils-other-substances 41.000000\n", - "https://forums.sufficientvelocity.com/threads/marked-for-death-a-rational-naruto-quest.24481/ 40.222024\n", - "http://pokemonshowdown.com/ 40.000000\n", - "http://sirpoley.tumblr.com/post/174889362674/next-hpn20-chapter-by-end-of-june 40.000000\n", - "https://archiveofourown.org/works/7127255 40.000000\n", - "https://tcthrone.wordpress.com/ 39.000000\n", - "https://practicalguidetoevil.wordpress.com/2018/11/02/interlude-apogee/ 39.000000\n", - "https://www.goodreads.com/book/show/25326486-orconomics 38.000000\n", - "https://www.royalroad.com/fiction/41618/mark-of-the-fool 37.913793\n", - "https://slatestarcodex.com/2015/06/02/and-i-show-you-how-deep-the-rabbit-hole-goes/ 37.833333\n", - "https://www.royalroad.com/fiction/28601/arrogant-young-master-template-a-variation-4 37.750000\n", - "https://archiveofourown.org/works/6178036/chapters/14154868 37.416667\n", - "https://www.webnovel.com/book/oh-my-god!-earthlings-are-insane!_17778080505851905 37.000000\n", - "dtype: float64" + "16102" ] }, - "execution_count": 4, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.Series(karma).sort_values(ascending=False).head(50)" + "len(titles_md)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(6090,)" + "https://www.patreon.com/alexanderwales 320.500000\n", + "https://redact.dev/home 201.000000\n", + "https://archiveofourown.org/works/11478249/chapters/25740126 188.451984\n", + "https://www.fanfiction.net/s/10677106/1/Seventh-Horcrux 182.772817\n", + "https://docs.google.com/spreadsheets/d/1PaLrwVYgxp_SYHtkred7ybpSJPHL88lf4zB0zMKmk1E/edit?usp=sharing 160.000000\n", + "https://redact.dev 150.000000\n", + "https://twigserial.wordpress.com/ 139.732955\n", + "http://topwebfiction.com/vote.php?for=a-practical-guide-to-evil 137.583333\n", + "https://www.fictionpress.com/s/2961893/1/Mother-of-Learning 135.649270\n", + "https://www.royalroad.com/fiction/25225/delve 134.377273\n", + "https://www.royalroad.com/fiction/40182/only-villains-do-that 129.472222\n", + "https://archiveofourown.org/works/6178036/chapters/14154868 117.523810\n", + "https://www.royalroad.com/fiction/81002/the-years-of-apocalypse-a-time-loop-progression 117.305556\n", + "https://www.fanfiction.net/s/5193644/1/Time-Braid 114.317045\n", + "https://www.royalroad.com/fiction/21410/super-minion 109.388384\n", + "https://imgur.com/t3edwYW 108.000000\n", + "https://www.fanfiction.net/s/10360716/1/The-Metropolitan-Man 107.142972\n", + "https://forums.sufficientvelocity.com/threads/dungeon-keeper-ami-sailor-moon-dungeon-keeper-story-only-thread.30066/ 104.536364\n", + "https://en.wikipedia.org/wiki/Magic_realism 104.000000\n", + "https://www.fanfiction.net/s/9658524/1/Branches-on-the-Tree-of-Time 101.860143\n", + "http://unsongbook.com/ 100.361742\n", + "https://www.reddit.com/r/rational/comments/d1kmb6/rt_hf_mother_of_learning_chapter_102_giants/ezmzda1/ 97.000000\n", + "https://www.youtube.com/watch?v=OfJRm0WssOE 97.000000\n", + "https://pithserial.com/ 97.000000\n", + "https://www.royalroad.com/fiction/26727/arkendrithyst 96.888889\n", + "https://www.fanfiction.net/s/5193644 94.976914\n", + "http://yudkowsky.tumblr.com/writing 92.000000\n", + "https://wertifloke.wordpress.com/2015/01/25/chapter-1/ 89.753878\n", + "https://discord.gg/sM99CF3 89.672619\n", + "https://media1.tenor.com/images/5781053f05a498a9d65ac8d70f00f99e/tenor.gif?itemid=4899021 89.000000\n", + "https://www.royalroad.com/fiction/41330/virtuous-sons-a-greco-roman-xianxia 88.500000\n", + "https://forums.sufficientvelocity.com/threads/warhammer-fantasy-divided-loyalties-an-advisors-quest.44838/ 88.471264\n", + "http://rationalreads.com/ 85.833333\n", + "https://parahumans.wordpress.com/ 84.739340\n", + "https://docs.google.com/document/d/1EUSMDHdRdbvQJii5uoSezbjtvJpxdF6Da8zqvuW42bg/edit?usp=sharing 84.482143\n", + "https://www.royalroad.com/fiction/46901/the-last-orellen 83.394872\n", + "https://www.fanfiction.net/s/7406866/1/To-the-Stars 81.979167\n", + "https://www.royalroad.com/fiction/40290/demesne 81.904762\n", + "https://qntm.org/ra 80.233333\n", + "https://www.royalroad.com/fiction/50836/to-the-far-shore 80.000000\n", + "http://slatestarcodex.com/2015/03/26/high-energy-ethics/ 79.000000\n", + "http://lesswrong.com/lw/1pz/the_ai_in_a_box_boxes_you/ 79.000000\n", + "https://forums.sufficientvelocity.com/threads/with-this-ring-young-justice-si-story-only.25076/ 78.557071\n", + "https://zalbert.net/octo/ 78.444444\n", + "https://archiveofourown.org/works/20177950/chapters/47807593 78.142857\n", + "https://www.royalroad.com/fiction/28601/arrogant-young-master-template-a-variation-4 78.077273\n", + "http://www.scp-wiki.net/we-need-to-talk-about-fifty-five 76.700000\n", + "https://www.reddit.com/r/rational/comments/9r5sc8/rt_worth_the_candle_ch_127128_housebook/e8eh7li/ 76.000000\n", + "https://en.wikipedia.org/wiki/Planck_time 76.000000\n", + "http://archiveofourown.org/works/11478249?view_full_work=true 76.000000\n", + "dtype: float64" ] }, - "execution_count": 5, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# QC top links\n", + "pd.Series(karma).sort_values(ascending=False).head(50)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(19424,)" + ] + }, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -173,27 +237,27 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "13 https://www.royalroad.com/fiction/21410/super-...\n", - "12 http://www.np.reddit.com/r/autowikibot/comment...\n", - "12 http://www.np.reddit.com/r/autowikibot/wiki/index\n", - "12 https://www.fanfiction.net/s/5193644\n", - "12 https://www.royalroad.com/fiction/26727/arkend...\n", + "54 http://topwebfiction.com/vote.php?for=a-practi...\n", + "41 https://www.fanfiction.net/s/5193644\n", + "37 https://www.fictionpress.com/s/2961893/1/Mothe...\n", + "31 https://archiveofourown.org/works/11478249/cha...\n", + "28 https://twigserial.wordpress.com/\n", " ... \n", - "2 https://i.imgur.com/ySl1dFj.png\n", - "2 https://www.royalroad.com/fiction/68630/dark-l...\n", - "2 https://www.royalroad.com/fiction/40920/the-pa...\n", - "2 https://www.royalroad.com/fiction/32807/dark-s...\n", - "2 https://www.royalroad.com/fiction/32411/bens-d...\n", - "Length: 606, dtype: object" + "2 https://forums.spacebattles.com/threads/the-sa...\n", + "2 https://www.royalroad.com/fiction/54046/final-...\n", + "2 http://slatestarcodex.com/2017/06/21/against-m...\n", + "2 http://www.webtoons.com/en/romance/always-huma...\n", + "2 https://www.fanfiction.net/s/7977390/1/Life-in...\n", + "Length: 1899, dtype: object" ] }, - "execution_count": 17, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -201,7 +265,12 @@ "source": [ "blocklist = [\n", "# 'reddit',\n", - " 'redact', 'pastebin', 'wikipedia', 'docs.google', 'discord','tvtropes.org', 'ask_wikibot']\n", + " 'redact', 'pastebin', 'wikipedia', 'docs.google', 'discord','tvtropes.org', 'ask_wikibot', 'autowiki', 'banned',\n", + " # pateron.com ?\n", + " 'reddit.com/user/', 'xkcd',\n", + "\n", + " \n", + " ]\n", "\n", "allowlist = ['hfy']\n", "df_links = df_links[~df_links.index.str.contains('|'.join(blocklist), regex=True) | df_links.index.str.contains('|'.join(allowlist), regex=True)]\n", @@ -221,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -230,13 +299,13 @@ "" ] }, - "execution_count": 18, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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cFG+I+sAAMwTsUd0AACA+QgdAABgLEIHAAAYi9ABAADGInQAAICxCB0AAGCsiA0dLhgIAID5IjZ0uGAgAADmi9jQAQAA5iN0AACAsQgdAABgLEIHAAAYi9ABAADGInQAAICxCB0AAGAsQgcAABgrYkOHKyMDAGC+iA0drowMAID5IjZ0AACA+QgdAABgLEIHAAAYi9ABAADGInQAAICxCB0AAGAsQgcAABiL0AEAAMYidAAAgLEIHQAAYCxCBwAAGCtiQ4ebegIAYL6IDR1u6gkAgPkiNnQAAID5CB0AAGAsQgcAABiL0AEAAMYidAAAgLEIHQAAYCxCBwAAGIvQAQAAxiJ0AACAsWyFzueff+70HAAAAI6zFTrXXnutxo4dqz/84Q86c+aM0zMBAAA4wlboVFdX68Ybb1RRUZGSkpL085//XJWVlU7PBgAA0Cm2QicrK0vPP/+86uvrtXLlSjU0NGj06NEaMmSISktLdfz4cafnBAAAuGydOhk5JiZGU6ZM0dq1a7V48WLt379fjz76qFJTUzVjxgw1NDQ4NScAAMBl61TobN++Xb/85S+VnJys0tJSPfroo/rss8+0efNm1dfX66677nJqTsf5fD5lZGQoJyfH7VEAAEAXibHzh0pLS7Vq1Srt2bNHEyZM0KuvvqoJEyYoKurrbho0aJBWr16ttLQ0J2d1lNfrldfrld/vV0JCgtvjAACALmArdJYvX65Zs2bpgQceUHJy8nnf079/f7388sudGg4AAKAzbIXOvn37vvM9sbGxKigosLM8AACAI2ydo7Nq1SqtXbv2nO1r167VK6+80umhAAAAnGArdEpKStSvX79ztvfv31/PPvtsp4cCAABwgq3QOXz4sAYNGnTO9quvvlqHDx/u9FAAAABOsBU6/fv318cff3zO9l27dqlv376dHgoAAMAJtkLn3nvv1UMPPaSKigoFAgEFAgG99957Kiws1D333OP0jAAAALbY+tbVU089pYMHD2rcuHGKifl6iWAwqBkzZnCODgAACBm2Qic2NlZr1qzRU089pV27dqlHjx4aOnSorr76aqfnAwAAsM1W6Hzjuuuu03XXXefULAAAAI6yFTqBQECrV69WeXm5jh07pmAw2OH19957z5HhAAAAOsNW6BQWFmr16tXKz8/XkCFD5PF4nJ4LgEPSijc4ss7BRfmOrAMA3ydbofPGG2/ozTff1IQJE5yeBwAAwDG2vl4eGxura6+91ulZAAAAHGUrdB555BE9//zzsizL6XkAAAAcY+ujqw8++EAVFRXauHGjBg8erG7dunV4fd26dY4MBwAA0Bm2QueKK67Q5MmTnZ4FAADAUbZCZ9WqVU7PAQAA4Dhb5+hI0ldffaUtW7bopZde0qlTpyRJ9fX1am5udmw4AACAzrB1ROfQoUO64447dPjwYbW2tuonP/mJ4uPjtXjxYrW2tqqsrMzpOQEAAC6brSM6hYWFys7O1pdffqkePXq0b588ebLKy8sdGw4AAKAzbB3R+cc//qF//vOfio2N7bA9LS1NR48edWQwAACAzrJ1RCcYDCoQCJyz/ciRI4qPj+/0UN8Hn8+njIwM5eTkuD0KAADoIrZC5/bbb9eyZcvan3s8HjU3N2vhwoVhc1sIr9er2tpaVVVVuT0KAADoIrY+ulq6dKnGjx+vjIwMnTlzRvfdd5/27dunfv366fXXX3d6RgAAAFtshc6AAQO0a9cuvfHGG/r444/V3Nys2bNna9q0aR1OTgYAAHCTrdCRpJiYGE2fPt3JWQAAABxlK3ReffXVi74+Y8YMW8MAAAA4yVboFBYWdnje1tam06dPKzY2Vj179iR0AABASLD1rasvv/yyw6O5uVl79uzR6NGjORkZAACEDNv3uvq29PR0LVq06JyjPQAAAG5xLHSkr09Qrq+vd3JJAAAA22ydo/P22293eG5ZlhoaGvTiiy9q1KhRjgwGAADQWbZCZ9KkSR2eezwe/fCHP9Rtt92mpUuXOjEXAABAp9kKnWAw6PQcAAAAjnP0HB0AAIBQYuuITlFR0SW/t7S01M6PAAAA6DRbobNz507t3LlTbW1tuv766yVJe/fuVXR0tG6++eb293k8HmemBAAAsMFW6EycOFHx8fF65ZVXdOWVV0r6+iKCM2fO1K233qpHHnnE0SGB70Na8QZH1jm4KN+RdUzGvgbwfbF1js7SpUtVUlLSHjmSdOWVV+rpp5/mW1cAACBk2Aodv9+v48ePn7P9+PHjOnXqVKeHAgAAcIKt0Jk8ebJmzpypdevW6ciRIzpy5Ij+/Oc/a/bs2ZoyZYrTMwIAANhi6xydsrIyPfroo7rvvvvU1tb29UIxMZo9e7aee+45RwcEAACwy1bo9OzZU7/97W/13HPP6bPPPpMkXXPNNerVq5ejwwEAAHRGpy4Y2NDQoIaGBqWnp6tXr16yLMupuQAAADrNVuj897//1bhx43TddddpwoQJamhokCTNnj2br5YDAICQYSt0Hn74YXXr1k2HDx9Wz54927dPnTpVmzZtcmw4AACAzrB1js67776rv/3tbxowYECH7enp6Tp06JAjgwEAAHSWrSM6LS0tHY7kfOPEiROKi4vr9FAAAABOsBU6t956q1599dX25x6PR8FgUEuWLNHYsWMdGw4AAKAzbH10tWTJEo0bN07bt2/X2bNn9dhjj+nf//63Tpw4oQ8//NDpGQEAAGyxdURnyJAh2rt3r0aPHq277rpLLS0tmjJlinbu3KlrrrnG6RkBAABsuewjOm1tbbrjjjtUVlamJ554oitmAgAAcMRlH9Hp1q2bPv74466YBQAAwFG2PrqaPn26Xn75ZadnAQAAcJStk5G/+uorrVy5Ulu2bNGwYcPOucdVaWmpI8MBAAB0xmWFzueff660tDTt3r1bN998syRp7969Hd7j8Xicm+4STZ48WX//+981btw4/elPf/refz4AAAhNlxU66enpamhoUEVFhaSvb/nwwgsvKDExsUuGu1SFhYWaNWuWXnnlFVfnAAAAoeWyztH59t3JN27cqJaWFkcHsmPMmDGKj493ewwAABBibJ2M/I1vh48dW7du1cSJE5WSkiKPx6P169ef8x6fz6e0tDR1795dI0aMUGVlZad/LgAAMN9lhY7H4znnHJzOnpPT0tKizMxM+Xy+876+Zs0aFRUVaeHChaqurlZmZqbGjx+vY8eO2fp5ra2t8vv9HR4AAMBMl3WOjmVZeuCBB9pv3HnmzBn94he/OOdbV+vWrbvkNfPy8pSXl3fB10tLS/Xggw9q5syZkqSysjJt2LBBK1euVHFx8eWML0kqKSnRk08+edl/DgAAhJ/LCp2CgoIOz6dPn+7oMN929uxZ7dixQ/PmzWvfFhUVpdzcXG3bts3WmvPmzVNRUVH7c7/fr9TU1E7PCgAAQs9lhc6qVau6ao7z+uKLLxQIBM75VldiYqI+/fTT9ue5ubnatWuXWlpaNGDAAK1du1YjR44875pxcXHtR6QAAIDZbF0wMNRs2bLF7REAAEAI6tS3rrpav379FB0draampg7bm5qalJSU5NJUAAAgXIR06MTGxmrYsGEqLy9v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", + "image/png": "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551atGiR/77L5VJLS4uKi4v5WggAABA2Anrr6rnnnlNeXp5SU1N19uxZ3XfffTp48KASEhL06quv2j0jAABAQAIKnUGDBmn37t1asWKF9uzZo5aWFs2ePVv3339/h5OTwxmfjAwAgPlcVoR/YdWFT0ZuampSr169bN13StEaW/cXLo4smOz0CACACHelr98BHdFZvnz5Nz4+c+bMQHYLAABgq4BCZ968eR3unzt3Tp9//rliYmLUo0cPQgcAAISFgK66+uyzzzrcWlpatH//fo0bN46TkQEAQNgI+Luuvm748OFasGDBRUd7AAAAnGJb6EhSdHS0amtr7dwlAABAwAI6R+fvf/97h/uWZamurk5LlizRrbfeastgCF92XU3G1VsAgFALKHTuueeeDvddLpeuv/563XHHHXruuefsmAsAACBoAYWOz+ezew4AAADb2XqODgAAQDgJ6IhOYWHhFT+3tLQ0kB8BAAAQtIBCZ9euXdq1a5fOnTunkSNHSpIOHDigLl266JZbbvE/z+Vy2TMlAABAAAIKnSlTpiguLk6vvPKK+vTpI+n8hwjOmjVL48eP1+OPP27rkKHAl3oCAGC+gL7Uc+DAgVq3bp1GjRrVYfvevXt15513dqrP0uFLPZ3D5eUAgEBd6et3QCcjNzc368SJExdtP3HihM6cORPILgEAAGwXUOhMmzZNs2bN0uuvv65PP/1Un376qf76179q9uzZmj59ut0zAgAABCSgc3TKysr0xBNP6L777tO5c+fO7yg6WrNnz9bChQttHRAAACBQAYVOjx499Ic//EELFy7U4cOHJUk33HCDevbsaetwAAAAwQjqAwPr6upUV1en4cOHq2fPngrgvGYAAICQCSh0/vvf/2rixIkaMWKEJk2apLq6OknS7NmzO8Wl5QAAIDIEFDqPPfaYunbtqmPHjqlHjx7+7TNmzNBbb71l23AAAADBCOgcnXXr1ulf//qXBg0a1GH78OHDdfToUVsGAwAACFZAR3RaW1s7HMm54NSpU4qNjQ16KAAAADsEFDrjx4/X8uXL/fddLpd8Pp+effZZTZgwwbbhAAAAghHQW1fPPvusJk6cqB07dqi9vV1PPvmkPvroI506dUrvvfee3TMCAAAEJKAjOqNHj9aBAwc0btw4TZ06Va2trZo+fbp27dqlG264we4ZAQAAAnLVR3TO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", "text/plain": [ "
" ] @@ -251,7 +320,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -262,12 +331,24 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Get title" + "# Get title\n", + "\n", + "This is hard as it's an adverserial web scraping problem, I'll use a mix of methods (from the markdown, requests, url)" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from anycache import anycache\n", + "f_cache = Path('../outputs/.anycache')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -277,56 +358,51 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'Super Minion | Royal Road'" + "('http://topwebfiction.com/vote.php?for=a-practical-guide-to-evil',\n", + " 'Vote for A Practical Guide to Evil on TopWebFiction!')" ] }, - "execution_count": 21, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from anycache import anycache\n", - "f_cache = Path('../outputs/.anycache')\n", + "# dedup using title\n", + "# TODO add comments\n", + "df3 = df2.groupby('title').sum().sort_values('score', ascending=False)\n", + "df3x\n", "\n", "from pathlib import Path\n", - "import requests\n", "from bs4 import BeautifulSoup\n", - "from requests.adapters import HTTPAdapter\n", - "from requests.packages.urllib3.util.retry import Retry\n", + "import cloudscraper\n", + "\n", "\n", "f_cache = Path('../outputs/.anycache')\n", "\n", - "def requests_retry_session(\n", - " retries=3,\n", - " backoff_factor=0.3,\n", - " status_forcelist=(500, 502, 504),\n", - " session=None,\n", - "):\n", - " session = session or requests.Session()\n", - " retry = Retry(\n", - " total=retries,\n", - " read=retries,\n", - " connect=retries,\n", - " backoff_factor=backoff_factor,\n", - " status_forcelist=status_forcelist,\n", - " )\n", - " adapter = HTTPAdapter(max_retries=retry)\n", - " session.mount('http://', adapter)\n", - " session.mount('https://', adapter)\n", - " return session\n", "\n", - "session = requests_retry_session()\n", - "session.headers['User-Agent'] = 'Mozilla/5.0'\n", + "session = cloudscraper.create_scraper()\n", + "\n", + "\n", + "def get_title_md(url):\n", + " if url in titles_md:\n", + " s = pd.Series(titles_md[url])\n", + " return s.value_counts().index[0] # return most common title\n", + " return url\n", "\n", "@anycache(f_cache)\n", "def get_title(url):\n", + " # first check if it's in the cache\n", + " if url in titles_md:\n", + " return get_title_md(url)\n", + "\n", + " # try scraping from the web\n", " try:\n", " r = session.get(url, timeout=5, allow_redirects=True)\n", " r.raise_for_status()\n", @@ -334,43 +410,34 @@ " title = soup.title.text.strip()\n", " return title\n", " except Exception as e:\n", + "\n", + " # if that doesn't work, does the end of the url contain a slugged title?\n", + " # e.g. https://www.fanfiction.net/s/5193644/harry-potter-and-the-methods-of-rationality\n", + " slugged_title = url.split('/')[-1].replace('-', ' ')\n", + " if ' ' in slugged_title:\n", + " return slugged_title\n", + " \n", " raise e \n", "\n", "url = df_links.index[0]\n", "r = get_title(url)\n", - "r\n" + "url, r\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "FIXME:\n", - "- banned from fanfiction.net\n", - "- https://www.fictionpress.com" - ] - }, - { - "cell_type": "code", - "execution_count": 23, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4157bcc24fb34755b42447bc770040ce", + "model_id": "30cc25156baa4fdbb9601d74374ce9b2", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/606 [00:00: Failed to establish a new connection: [Errno 111] Connection refused'))\n", - "failed to get title for https://www.fanfiction.net/s/7613196/1/The-Pureblood-Pretense: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/7613196/1/The-Pureblood-Pretense\n", - "failed to get title for https://www.fanfiction.net/s/12539731/1/Kaleidoscope: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/12539731/1/Kaleidoscope\n", - "failed to get title for https://www.fanfiction.net/s/10360716/1/The-Metropolitan-Man: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/10360716/1/The-Metropolitan-Man\n", - "failed to get title for https://www.fanfiction.net/s/9658524/1/Branches-on-the-Tree-of-Time: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/9658524/1/Branches-on-the-Tree-of-Time\n", - "failed to get title for https://www.fictionpress.com/s/3238329/1/A-Hero-s-War: 403 Client Error: Forbidden for url: https://www.fictionpress.com/s/3238329/1/A-Hero-s-War\n", - "failed to get title for https://www.fanfiction.net/s/10898868/1/Professor-Arc: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/10898868/1/Professor-Arc\n", - "failed to get title for https://www.novelupdates.com/series/terror-infinity/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/terror-infinity/\n", - "failed to get title for https://www.fimfiction.net/story/62074/friendship-is-optimal: 403 Client Error: Forbidden for url: https://www.fimfiction.net/story/62074/friendship-is-optimal\n", - "failed to get title for https://www.fanfiction.net/u/6272865/Coeur-Al-Aran: 403 Client Error: Forbidden for url: https://www.fanfiction.net/u/6272865/Coeur-Al-Aran\n", - "failed to get title for http://rationalreads.com/: 404 Client Error: Not Found for url: http://rationalreads.com/\n", - "failed to get title for https://www.fanfiction.net/s/7305950/1/The-Empty-Cage: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/7305950/1/The-Empty-Cage\n", - "failed to get title for http://www.np.reddit.com/r/autowikiabot/wiki/index: HTTPSConnectionPool(host='www.np.reddit.com', port=443): Max retries exceeded with url: /r/autowikiabot/wiki/index (Caused by SSLError(SSLCertVerificationError(1, \"[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'www.np.reddit.com'. (_ssl.c:1007)\")))\n", - "failed to get title for https://www.novelupdates.com/series/emperor-of-solo-play/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/emperor-of-solo-play/\n", - "failed to get title for https://www.fanfiction.net/s/10264082/1/What-Doesn-t-Kill-You: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/10264082/1/What-Doesn-t-Kill-You\n", - "failed to get title for https://www.fanfiction.net/s/8324961/1/Magical-Me: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/8324961/1/Magical-Me\n", - "failed to get title for https://www.fanfiction.net/s/10820443/1/An-Imago-of-Rust-and-Crimson: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/10820443/1/An-Imago-of-Rust-and-Crimson\n", - "failed to get title for https://www.fanfiction.net/s/12904733/1/Man-off-the-Moon: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/12904733/1/Man-off-the-Moon\n", - "failed to get title for https://www.fanfiction.net/s/5792734/1/Sleeping-with-the-Girls-Vol-I-Fictional-Reality: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/5792734/1/Sleeping-with-the-Girls-Vol-I-Fictional-Reality\n", - "failed to get title for https://www.fanfiction.net/s/9311012/1/Lighting-Up-the-Dark: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/9311012/1/Lighting-Up-the-Dark\n", - "failed to get title for https://www.fanfiction.net/s/3886999/1/Shinji-and-Warhammer40k: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/3886999/1/Shinji-and-Warhammer40k\n", - "failed to get title for https://www.novelupdates.com/series/reincarnator/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/reincarnator/\n", - "failed to get title for https://www.fanfiction.net/s/10629488/1/Blood-Crest: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/10629488/1/Blood-Crest\n", - "failed to get title for https://www.novelupdates.com/series/dungeon-hunter/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/dungeon-hunter/\n", - "failed to get title for https://www.fanfiction.net/s/3401052/1/A-Black-Comedy: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/3401052/1/A-Black-Comedy\n", - "failed to get title for https://www.fanfiction.net/s/11090259/1/r-Animorphs-The-Reckoning: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/11090259/1/r-Animorphs-The-Reckoning\n", - "failed to get title for https://www.fanfiction.net/s/11228999/1/Fargo: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/11228999/1/Fargo\n", - "failed to get title for https://www.fanfiction.net/s/12825305/1/The-Longest-Day: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/12825305/1/The-Longest-Day\n", - "failed to get title for https://www.fimfiction.net/story/19198/background-pony: 403 Client Error: Forbidden for url: https://www.fimfiction.net/story/19198/background-pony\n", - "failed to get title for https://www.fanfiction.net/s/14161843/1/Serial-Meddling: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/14161843/1/Serial-Meddling\n", - "failed to get title for https://www.fanfiction.net/s/11730208/1/Darth-Vader-Hero-of-Naboo: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/11730208/1/Darth-Vader-Hero-of-Naboo\n", - "failed to get title for http://helpedit.com/: 403 Client Error: Forbidden for url: https://www.hugedomains.com/domain_profile.cfm?d=helpedit.com\n", - "failed to get title for https://www.royalroad.com/fiction/43761/an-infinite-recursion-of-time: 404 Client Error: Not Found for url: https://www.royalroad.com/fiction/43761/an-infinite-recursion-of-time\n", - "failed to get title for https://www.novelupdates.com/series/the-path-toward-heaven/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/the-path-toward-heaven/\n", - "failed to get title for https://www.novelupdates.com/series/ze-tian-ji/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/ze-tian-ji/\n", - "failed to get title for https://www.novelupdates.com/series/joy-of-life/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/joy-of-life/\n", - "failed to get title for https://www.novelupdates.com/series/nightfall/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/nightfall/\n", - "failed to get title for https://www.novelupdates.com/series/once-upon-a-time-there-was-a-spirit-sword-mountain/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/once-upon-a-time-there-was-a-spirit-sword-mountain/\n", - "failed to get title for https://www.novelupdates.com/series/tai-sui/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/tai-sui/\n", - "failed to get title for https://www.novelupdates.com/series/the-sword-dynasty/: 403 Client Error: Forbidden for url: https://www.novelupdates.com/series/the-sword-dynasty/\n", - "failed to get title for http://delphicserial.com/2017/10/21/ch01/: HTTPConnectionPool(host='delphicserial.com', port=80): Max retries exceeded with url: /2017/10/21/ch01/ (Caused by NameResolutionError(\": Failed to resolve 'delphicserial.com' ([Errno -2] Name or service not known)\"))\n", - "failed to get title for https://www.fanfiction.net/s/11861559/1/Wearing-Robert-s-Crown: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/11861559/1/Wearing-Robert-s-Crown\n", - "failed to get title for https://forum.questionablequesting.com/threads/swiss-arms-historical-si-gamer.16757/: 403 Client Error: Forbidden for url: https://forum.questionablequesting.com/threads/swiss-arms-historical-si-gamer.16757/\n", - "failed to get title for https://reaperscans.com/novels/5172-the-divine-hunter: 404 Client Error: Not Found for url: https://reaperscans.com/novels/5172-the-divine-hunter\n", - "failed to get title for https://zerohplovecraft.wordpress.com/2018/05/11/the-gig-economy-2/: 410 Client Error: Gone for url: https://zerohplovecraft.wordpress.com/2018/05/11/the-gig-economy-2/\n", - "failed to get title for http://www.alexanderwales.com/WorththeCandle.pdf: 404 Client Error: Not Found for url: https://alexanderwales.com/WorththeCandle.pdf\n", - "failed to get title for https://www.fanfiction.net/s/8163784/1/The-Well-Groomed-Mind: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/8163784/1/The-Well-Groomed-Mind\n", - "failed to get title for https://www.fanfiction.net/s/8654967/1/: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/8654967/1/\n", - "failed to get title for https://www.fanfiction.net/s/4976492/1/: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/4976492/1/\n", - "failed to get title for https://www.fanfiction.net/s/12825305/2/The-Longest-Day: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/12825305/2/The-Longest-Day\n", - "failed to get title for https://www.kickstarter.com/projects/biggerworldsgames/star-chart-a-2-8-player-constellation-matching-card-game?ref=ba96uw: 403 Client Error: Forbidden for url: https://www.kickstarter.com/projects/biggerworldsgames/star-chart-a-2-8-player-constellation-matching-card-game?ref=ba96uw\n", - "failed to get title for https://www.fanfiction.net/s/3964606/1/Alexandra-Quick-and-the-Thorn-Circle: 403 Client Error: Forbidden for url: https://www.fanfiction.net/s/3964606/1/Alexandra-Quick-and-the-Thorn-Circle\n" + "failed to get title for http://delphicserial.com/2017/10/21/ch01/: HTTPConnectionPool(host='delphicserial.com', port=80): Max retries exceeded with url: /2017/10/21/ch01/ (Caused by NameResolutionError(\": Failed to resolve 'delphicserial.com' ([Errno -2] Name or service not known)\"))\n", + "failed to get title for https://np.reddit.com/r/youtubot/wiki/index: 404 Client Error: Not Found for url: https://np.reddit.com/r/youtubot/wiki/index\n", + "failed to get title for http://webfictionguide.com/listings/game-by-god-sludge-reformation/: 410 Client Error: Gone for url: http://webfictionguide.com/listings/game-by-god-sludge-reformation/\n", + "failed to get title for https://www.biorxiv.org/content/biorxiv/early/2016/05/26/055699.full.pdf: 'NoneType' object has no attribute 'text'\n", + "failed to get title for http://www.epubsbook.com/2015/3975.html: HTTPConnectionPool(host='www.epubsbook.com', port=80): Max retries exceeded with url: /2015/3975.html (Caused by NameResolutionError(\": Failed to resolve 'www.epubsbook.com' ([Errno -2] Name or service not known)\"))\n", + "failed to get title for https://archiveofourown.org/works/11478249/chapters/27276375: 403 Client Error: Forbidden for url: https://archiveofourown.org/works/11478249/chapters/27276375\n" ] }, { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[23], line 5\u001b[0m\n\u001b[1;32m 3\u001b[0m url \u001b[38;5;241m=\u001b[39m df_links\u001b[38;5;241m.\u001b[39mindex[i]\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m----> 5\u001b[0m title \u001b[38;5;241m=\u001b[39m \u001b[43mget_title\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfailed to get title for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/anycache/__init__.py:220\u001b[0m, in \u001b[0;36mAnyCache.anycache..decorator..wrapped\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m funcinfo \u001b[38;5;241m=\u001b[39m _FuncInfo(func, args, kwargs, depfilefunc)\n\u001b[0;32m--> 220\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_anycache\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfuncinfo\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 221\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/anycache/__init__.py:331\u001b[0m, in \u001b[0;36mAnyCache._anycache\u001b[0;34m(self, funcinfo)\u001b[0m\n\u001b[1;32m 329\u001b[0m func, args, kwargs, depfilefunc \u001b[38;5;241m=\u001b[39m funcinfo\n\u001b[1;32m 330\u001b[0m \u001b[38;5;66;03m# execute\u001b[39;00m\n\u001b[0;32m--> 331\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;66;03m# deps\u001b[39;00m\n\u001b[1;32m 333\u001b[0m deps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(depfilefunc(result, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)) \u001b[38;5;28;01mif\u001b[39;00m depfilefunc \u001b[38;5;28;01melse\u001b[39;00m []\n", - "Cell \u001b[0;32mIn[21], line 37\u001b[0m, in \u001b[0;36mget_title\u001b[0;34m(url)\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;129m@anycache\u001b[39m(f_cache)\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_title\u001b[39m(url):\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 37\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mallow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 38\u001b[0m r\u001b[38;5;241m.\u001b[39mraise_for_status()\n\u001b[1;32m 39\u001b[0m soup \u001b[38;5;241m=\u001b[39m BeautifulSoup(r\u001b[38;5;241m.\u001b[39mtext, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhtml.parser\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/requests/sessions.py:602\u001b[0m, in \u001b[0;36mSession.get\u001b[0;34m(self, url, **kwargs)\u001b[0m\n\u001b[1;32m 594\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a GET request. Returns :class:`Response` object.\u001b[39;00m\n\u001b[1;32m 595\u001b[0m \n\u001b[1;32m 596\u001b[0m \u001b[38;5;124;03m:param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[1;32m 597\u001b[0m \u001b[38;5;124;03m:param \\*\\*kwargs: Optional arguments that ``request`` takes.\u001b[39;00m\n\u001b[1;32m 598\u001b[0m \u001b[38;5;124;03m:rtype: requests.Response\u001b[39;00m\n\u001b[1;32m 599\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 601\u001b[0m kwargs\u001b[38;5;241m.\u001b[39msetdefault(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 602\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mGET\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/requests/sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[1;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[1;32m 587\u001b[0m }\n\u001b[1;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[0;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/requests/sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[1;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[0;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[1;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/requests/adapters.py:667\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 664\u001b[0m timeout \u001b[38;5;241m=\u001b[39m TimeoutSauce(connect\u001b[38;5;241m=\u001b[39mtimeout, read\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 667\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 682\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request\u001b[38;5;241m=\u001b[39mrequest)\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/urllib3/connectionpool.py:789\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m 786\u001b[0m response_conn \u001b[38;5;241m=\u001b[39m conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 788\u001b[0m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[0;32m--> 789\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 790\u001b[0m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 791\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 792\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 793\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 794\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 795\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 796\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 797\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 798\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 799\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 800\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 801\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 802\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 804\u001b[0m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[1;32m 805\u001b[0m clean_exit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/urllib3/connectionpool.py:536\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[1;32m 535\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 536\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 538\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_raise_timeout(err\u001b[38;5;241m=\u001b[39me, url\u001b[38;5;241m=\u001b[39murl, timeout_value\u001b[38;5;241m=\u001b[39mread_timeout)\n", - "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/rrational/.venv/lib/python3.10/site-packages/urllib3/connection.py:464\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 461\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mresponse\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m HTTPResponse\n\u001b[1;32m 463\u001b[0m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[0;32m--> 464\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 466\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 467\u001b[0m assert_header_parsing(httplib_response\u001b[38;5;241m.\u001b[39mmsg)\n", - "File \u001b[0;32m/usr/lib/python3.10/http/client.py:1375\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1373\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1374\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1375\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1376\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[1;32m 1377\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n", - "File \u001b[0;32m/usr/lib/python3.10/http/client.py:318\u001b[0m, in \u001b[0;36mHTTPResponse.begin\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 316\u001b[0m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 318\u001b[0m version, status, reason \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m status \u001b[38;5;241m!=\u001b[39m CONTINUE:\n\u001b[1;32m 320\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "File \u001b[0;32m/usr/lib/python3.10/http/client.py:279\u001b[0m, in \u001b[0;36mHTTPResponse._read_status\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 279\u001b[0m line \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreadline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_MAXLINE\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miso-8859-1\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 280\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) \u001b[38;5;241m>\u001b[39m _MAXLINE:\n\u001b[1;32m 281\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstatus line\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m/usr/lib/python3.10/socket.py:705\u001b[0m, in \u001b[0;36mSocketIO.readinto\u001b[0;34m(self, b)\u001b[0m\n\u001b[1;32m 703\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 704\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 705\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 706\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[1;32m 707\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_timeout_occurred \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
urltitlescorecommentsnum_comments
0http://topwebfiction.com/vote.php?for=a-practi...Vote for A Practical Guide to Evil on TopWebFi...137.583333[[Vote for A Practical Guide to Evil on TopWeb...54
1https://www.fanfiction.net/s/5193644Time Braid94.976914[* [*Waves Arisen*](https://wertifloke.wordpre...41
2https://www.fictionpress.com/s/2961893/1/Mothe...Mother of Learning135.649270[And [Mother of Learning](https://www.fictionp...37
3https://archiveofourown.org/works/11478249/cha...Worth the Candle188.451984[>>interestingly blend ...\\n\\n>`[g]`enres\\n\\n>...31
4https://twigserial.wordpress.com/Twig139.732955[The protagonist of [Twig](https://twigserial....28
..................
1894https://forums.spacebattles.com/threads/the-sa...The Saga of the Runt3.333333[Here's a few more:\\n\\n- [Threefold (Youjo Sen...2
1895https://www.royalroad.com/fiction/54046/final-...FINAL Core5.333333[I really enjoy [Dungeon Without a System](htt...2
1896http://slatestarcodex.com/2017/06/21/against-m...Against Murderism1.757576[**Here's a sneak peek of [/r/slatestarcodex](...2
1897http://www.webtoons.com/en/romance/always-huma...Always Human17.000000[I recently finished reading the webcomic [Alw...2
1898https://www.fanfiction.net/s/7977390/1/Life-in...Life in Konoha's ANBU1.333333[[Lighting Up the Dark](https://www.reddit.com...2
\n", + "

1899 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " url \\\n", + "0 http://topwebfiction.com/vote.php?for=a-practi... \n", + "1 https://www.fanfiction.net/s/5193644 \n", + "2 https://www.fictionpress.com/s/2961893/1/Mothe... \n", + "3 https://archiveofourown.org/works/11478249/cha... \n", + "4 https://twigserial.wordpress.com/ \n", + "... ... \n", + "1894 https://forums.spacebattles.com/threads/the-sa... \n", + "1895 https://www.royalroad.com/fiction/54046/final-... \n", + "1896 http://slatestarcodex.com/2017/06/21/against-m... \n", + "1897 http://www.webtoons.com/en/romance/always-huma... \n", + "1898 https://www.fanfiction.net/s/7977390/1/Life-in... \n", + "\n", + " title score \\\n", + "0 Vote for A Practical Guide to Evil on TopWebFi... 137.583333 \n", + "1 Time Braid 94.976914 \n", + "2 Mother of Learning 135.649270 \n", + "3 Worth the Candle 188.451984 \n", + "4 Twig 139.732955 \n", + "... ... ... \n", + "1894 The Saga of the Runt 3.333333 \n", + "1895 FINAL Core 5.333333 \n", + "1896 Against Murderism 1.757576 \n", + "1897 Always Human 17.000000 \n", + "1898 Life in Konoha's ANBU 1.333333 \n", + "\n", + " comments num_comments \n", + "0 [[Vote for A Practical Guide to Evil on TopWeb... 54 \n", + "1 [* [*Waves Arisen*](https://wertifloke.wordpre... 41 \n", + "2 [And [Mother of Learning](https://www.fictionp... 37 \n", + "3 [>>interestingly blend ...\\n\\n>`[g]`enres\\n\\n>... 31 \n", + "4 [The protagonist of [Twig](https://twigserial.... 28 \n", + "... ... ... \n", + "1894 [Here's a few more:\\n\\n- [Threefold (Youjo Sen... 2 \n", + "1895 [I really enjoy [Dungeon Without a System](htt... 2 \n", + "1896 [**Here's a sneak peek of [/r/slatestarcodex](... 2 \n", + "1897 [I recently finished reading the webcomic [Alw... 2 \n", + "1898 [[Lighting Up the Dark](https://www.reddit.com... 2 \n", + "\n", + "[1899 rows x 5 columns]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -502,13 +645,261 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Time Braid 63\n", + "Vote for A Practical Guide to Evil on TopWebFiction! 53\n", + "Mother of Learning 48\n", + "Worm 42\n", + "Worth the Candle 41\n", + "Twig 40\n", + "on the #pokengineering channel of the /r/rational Discord server 30\n", + "Handy discussion links and previous threads here 28\n", + "Statistics 27\n", + "Stop Replying 27\n", + "xkcd.com 27\n", + "xkcd sub 27\n", + "Problems/Bugs? 27\n", + "With This Ring 27\n", + "Pact 23\n", + "What is this? 22\n", + "The Waves Arisen 22\n", + "immersive sim 22\n", + "hopefully rational 22\n", + "Harry Potter and the Natural 20 21\n", + "The Metropolitan Man 21\n", + "A Hero's War 21\n", + "Seventh Horcrux 20\n", + "Marked for Death 20\n", + "The Last Angel 19\n", + "Pale 19\n", + "Source 19\n", + "A Practical Guide to Evil 18\n", + "CLICK THIS LINK 18\n", + "Super Minion 18\n", + "Cordyceps 18\n", + "top posts 18\n", + "Unsong 18\n", + "Delve 18\n", + "Ward 17\n", + "Branches on the Tree of Time 17\n", + "The Wandering Inn 17\n", + "Purple Days 17\n", + "Sanitize 17\n", + "Shadows of the Limelight 16\n", + "Wikipedia 15\n", + "Dungeon Keeper Ami 15\n", + "The Games We Play 15\n", + "Patreon 15\n", + "A Young Woman's Political Record 15\n", + "here. 14\n", + "First Chapter 14\n", + "this comment 14\n", + "Hard Reset 14\n", + "Friendship is Optimal 14\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# dedup using title\n", - "# TODO add comments\n", - "df3 = df2.groupby('title').sum().sort_values('score', ascending=False)\n", + "# QC: get top markdown titles\n", + "import itertools\n", + "l = sorted(itertools.chain(*titles_md.values()))\n", + "pd.Series(l).value_counts().head(50)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
scorenum_commentscommentsurl
title
Patreon413.00000017[[Patreon](https://www.patreon.com/alexanderwa...https://www.patreon.com/Delphic\\nhttps://www.p...
Worth the Candle360.97365160[>>interestingly blend ...\\n\\n>`[g]`enres\\n\\n>...http://archiveofourown.org/works/11478249?view...
Worm274.32926744[[Kitty Cat Kill Sat](https://www.royalroad.co...https://parahumans.wordpress.com/2011/06/11/1-...
Time Braid209.29395965[* [*Waves Arisen*](https://wertifloke.wordpre...https://www.fanfiction.net/s/5193644/1/Time-Br...
Twig198.47166936[The protagonist of [Twig](https://twigserial....https://twigserial.wordpress.com/2014/12/24/ta...
...............
Chapter 10: Have You Heard, Part 20.2495504[ \\nPrevious Chapters:\\n\\n[Chapter 1: One Smal...https://www.fanfiction.net/s/12825305/10/The-L...
Chapter 11: Endgame0.1781223[ \\nPrevious Chapters:\\n\\n[Chapter 1: One Smal...https://www.fanfiction.net/s/12825305/11/The-L...
Chapter 13: Who Lives, Who Dies, Who Tells Your Story0.1702793[Previous Chapters:\\n\\n[Chapter 1: One Small T...https://www.fanfiction.net/s/12825305/13/The-L...
Izzy0.1538462[#####&#009;\\n\\n######&#009;\\n\\n####&#009;\\n [...https://sluggy.wikia.com/wiki/Izzy
a children's book from the early 1900s-3.0000002[Didn't someone invent \"ze\" and \"zir\" for just...http://www.gutenberg.org/ebooks/17314
\n", + "

1644 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " score num_comments \\\n", + "title \n", + "Patreon 413.000000 17 \n", + "Worth the Candle 360.973651 60 \n", + "Worm 274.329267 44 \n", + "Time Braid 209.293959 65 \n", + "Twig 198.471669 36 \n", + "... ... ... \n", + "Chapter 10: Have You Heard, Part 2 0.249550 4 \n", + "Chapter 11: Endgame 0.178122 3 \n", + "Chapter 13: Who Lives, Who Dies, Who Tells Your... 0.170279 3 \n", + "Izzy 0.153846 2 \n", + "a children's book from the early 1900s -3.000000 2 \n", + "\n", + " comments \\\n", + "title \n", + "Patreon [[Patreon](https://www.patreon.com/alexanderwa... \n", + "Worth the Candle [>>interestingly blend ...\\n\\n>`[g]`enres\\n\\n>... \n", + "Worm [[Kitty Cat Kill Sat](https://www.royalroad.co... \n", + "Time Braid [* [*Waves Arisen*](https://wertifloke.wordpre... \n", + "Twig [The protagonist of [Twig](https://twigserial.... \n", + "... ... \n", + "Chapter 10: Have You Heard, Part 2 [ \\nPrevious Chapters:\\n\\n[Chapter 1: One Smal... \n", + "Chapter 11: Endgame [ \\nPrevious Chapters:\\n\\n[Chapter 1: One Smal... \n", + "Chapter 13: Who Lives, Who Dies, Who Tells Your... [Previous Chapters:\\n\\n[Chapter 1: One Small T... \n", + "Izzy [##### \\n\\n###### \\n\\n#### \\n [... \n", + "a children's book from the early 1900s [Didn't someone invent \"ze\" and \"zir\" for just... \n", + "\n", + " url \n", + "title \n", + "Patreon https://www.patreon.com/Delphic\\nhttps://www.p... \n", + "Worth the Candle http://archiveofourown.org/works/11478249?view... \n", + "Worm https://parahumans.wordpress.com/2011/06/11/1-... \n", + "Time Braid https://www.fanfiction.net/s/5193644/1/Time-Br... \n", + "Twig https://twigserial.wordpress.com/2014/12/24/ta... \n", + "... ... \n", + "Chapter 10: Have You Heard, Part 2 https://www.fanfiction.net/s/12825305/10/The-L... \n", + "Chapter 11: Endgame https://www.fanfiction.net/s/12825305/11/The-L... \n", + "Chapter 13: Who Lives, Who Dies, Who Tells Your... https://www.fanfiction.net/s/12825305/13/The-L... \n", + "Izzy https://sluggy.wikia.com/wiki/Izzy \n", + "a children's book from the early 1900s http://www.gutenberg.org/ebooks/17314 \n", + "\n", + "[1644 rows x 4 columns]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# join by title\n", + "\n", + "def join_uniq(x:list[str]):\n", + " return '\\n'.join(set(x))\n", + "\n", + "def chain_lists(x:list[list[str]]):\n", + " return [item for sublist in x for item in sublist]\n", + "\n", + "df3 = df2.groupby('title').agg({'score': 'sum', 'num_comments': 'sum', 'comments': chain_lists, 'url': join_uniq\n", + " }).sort_values('score', ascending=False)\n", "df3" ] }, @@ -516,7 +907,18 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "((1899, 5), (1699, 4))" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df2.shape, df3.shape" ] @@ -536,6 +938,157 @@ "cell_type": "markdown", "metadata": {}, "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import dotenv\n", + "dotenv.load_dotenv()\n", + "from openai import OpenAI\n", + "client = OpenAI()\n", + "\n", + "import tiktoken\n", + "enc = tiktoken.encoding_for_model(\"gpt-4o-mini\")\n", + "cost = 0.150 / 1e6" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "def get_context(title:str):\n", + " # from comments\n", + " # return df3.loc[title].comments\n", + "\n", + " # or I could just all markdowns with\n", + " fs = sorted(Path('../data/cache2').glob('*.md'))\n", + " s = ''\n", + " for f in fs:\n", + " ss = f.open().read()\n", + " if title in ss:\n", + " i = ss.index(title)\n", + " context = 600\n", + " ss = ss[max(0, i-context):i+context]\n", + " s += ss\n", + " return s\n", + "\n", + "from pydantic import BaseModel\n", + "from typing import List, Optional, Dict\n", + "\n", + "class FictionInfo(BaseModel):\n", + " name: str\n", + " description: str\n", + " tags: List[str]\n", + " rating: Optional[float]\n", + " sentiment: Optional[str]\n", + " reviews: List[str]\n", + "\n", + "f_cache = Path('../outputs/.anycache2')\n", + "@anycache(f_cache)\n", + "def get_summary(name:str, context:str):\n", + " chat_completion = client.beta.chat.completions.parse(\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": \"You are Gwern Branwern, a librarian who specializes in rational fiction. You are summarising community reccomendations into a structured form.\"},\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": f\"\"\"For u/gwern please summarize information about {name}. For the rating, give your own impression of the user sentiment with a rating out of 10. For the reviews tell us what users think of it and why the reccomend or disreccomend it.\n", + "\n", + "### Context:\n", + "\n", + "{context}\"\"\"\n", + " }\n", + " ],\n", + " model=\"gpt-4o-mini\",\n", + " response_format=FictionInfo,\n", + " )\n", + " \n", + " return chat_completion.choices[0].message.parsed.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1b2440c5f0704c5ea0f1d8398a8c8773", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/100 [00:00=1.12.0" astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +[[package]] +name = "attrs" +version = "24.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +files = [ + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +optional = false +python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + +[package.extras] +tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] + [[package]] name = "beautifulsoup4" version = "4.12.3" @@ -169,6 +216,17 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + [[package]] name = "charset-normalizer" version = "3.3.2" @@ -268,6 +326,22 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "cloudscraper" +version = "1.2.71" +description = "A Python module to bypass Cloudflare's anti-bot page." +optional = false +python-versions = "*" +files = [ + {file = "cloudscraper-1.2.71-py2.py3-none-any.whl", hash = "sha256:76f50ca529ed2279e220837befdec892626f9511708e200d48d5bb76ded679b0"}, + {file = "cloudscraper-1.2.71.tar.gz", hash = "sha256:429c6e8aa6916d5bad5c8a5eac50f3ea53c9ac22616f6cb21b18dcc71517d0d3"}, +] + +[package.dependencies] +pyparsing = ">=2.4.7" +requests = ">=2.9.2" +requests-toolbelt = ">=0.9.1" + [[package]] name = "colorama" version = "0.4.6" @@ -380,6 +454,17 @@ mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pil test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + [[package]] name = "cycler" version = "0.12.1" @@ -452,6 +537,20 @@ files = [ graph = ["objgraph (>=1.7.2)"] profile = ["gprof2dot (>=2022.7.29)"] +[[package]] +name = "ebooklib" +version = "0.18" +description = "Ebook library which can handle EPUB2/EPUB3 and Kindle format" +optional = false +python-versions = "*" +files = [ + {file = "EbookLib-0.18.tar.gz", hash = "sha256:38562643a7bc94d9bf56e9930b4927e4e93b5d1d0917f697a6454db5a1c1a533"}, +] + +[package.dependencies] +lxml = "*" +six = "*" + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -561,6 +660,105 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "grpcio" +version = "1.68.1" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.68.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:d35740e3f45f60f3c37b1e6f2f4702c23867b9ce21c6410254c9c682237da68d"}, + {file = "grpcio-1.68.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:d99abcd61760ebb34bdff37e5a3ba333c5cc09feda8c1ad42547bea0416ada78"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f8261fa2a5f679abeb2a0a93ad056d765cdca1c47745eda3f2d87f874ff4b8c9"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0feb02205a27caca128627bd1df4ee7212db051019a9afa76f4bb6a1a80ca95e"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:919d7f18f63bcad3a0f81146188e90274fde800a94e35d42ffe9eadf6a9a6330"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:963cc8d7d79b12c56008aabd8b457f400952dbea8997dd185f155e2f228db079"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ccf2ebd2de2d6661e2520dae293298a3803a98ebfc099275f113ce1f6c2a80f1"}, + {file = "grpcio-1.68.1-cp310-cp310-win32.whl", hash = "sha256:2cc1fd04af8399971bcd4f43bd98c22d01029ea2e56e69c34daf2bf8470e47f5"}, + {file = "grpcio-1.68.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2e743e51cb964b4975de572aa8fb95b633f496f9fcb5e257893df3be854746"}, + {file = "grpcio-1.68.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:55857c71641064f01ff0541a1776bfe04a59db5558e82897d35a7793e525774c"}, + {file = "grpcio-1.68.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4b177f5547f1b995826ef529d2eef89cca2f830dd8b2c99ffd5fde4da734ba73"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3522c77d7e6606d6665ec8d50e867f13f946a4e00c7df46768f1c85089eae515"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d1fae6bbf0816415b81db1e82fb3bf56f7857273c84dcbe68cbe046e58e1ccd"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298ee7f80e26f9483f0b6f94cc0a046caf54400a11b644713bb5b3d8eb387600"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb5780e2e740b6b4f2d208e90453591036ff80c02cc605fea1af8e6fc6b1bbe"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ddda1aa22495d8acd9dfbafff2866438d12faec4d024ebc2e656784d96328ad0"}, + {file = "grpcio-1.68.1-cp311-cp311-win32.whl", hash = "sha256:b33bd114fa5a83f03ec6b7b262ef9f5cac549d4126f1dc702078767b10c46ed9"}, + {file = "grpcio-1.68.1-cp311-cp311-win_amd64.whl", hash = "sha256:7f20ebec257af55694d8f993e162ddf0d36bd82d4e57f74b31c67b3c6d63d8b2"}, + {file = "grpcio-1.68.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:8829924fffb25386995a31998ccbbeaa7367223e647e0122043dfc485a87c666"}, + {file = "grpcio-1.68.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3aed6544e4d523cd6b3119b0916cef3d15ef2da51e088211e4d1eb91a6c7f4f1"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:4efac5481c696d5cb124ff1c119a78bddbfdd13fc499e3bc0ca81e95fc573684"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ab2d912ca39c51f46baf2a0d92aa265aa96b2443266fc50d234fa88bf877d8e"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c87ce2a97434dffe7327a4071839ab8e8bffd0054cc74cbe971fba98aedd60"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e4842e4872ae4ae0f5497bf60a0498fa778c192cc7a9e87877abd2814aca9475"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:255b1635b0ed81e9f91da4fcc8d43b7ea5520090b9a9ad9340d147066d1d3613"}, + {file = "grpcio-1.68.1-cp312-cp312-win32.whl", hash = "sha256:7dfc914cc31c906297b30463dde0b9be48e36939575eaf2a0a22a8096e69afe5"}, + {file = "grpcio-1.68.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0c8ddabef9c8f41617f213e527254c41e8b96ea9d387c632af878d05db9229c"}, + {file = "grpcio-1.68.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:a47faedc9ea2e7a3b6569795c040aae5895a19dde0c728a48d3c5d7995fda385"}, + {file = "grpcio-1.68.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:390eee4225a661c5cd133c09f5da1ee3c84498dc265fd292a6912b65c421c78c"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:66a24f3d45c33550703f0abb8b656515b0ab777970fa275693a2f6dc8e35f1c1"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c08079b4934b0bf0a8847f42c197b1d12cba6495a3d43febd7e99ecd1cdc8d54"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8720c25cd9ac25dd04ee02b69256d0ce35bf8a0f29e20577427355272230965a"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:04cfd68bf4f38f5bb959ee2361a7546916bd9a50f78617a346b3aeb2b42e2161"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c28848761a6520c5c6071d2904a18d339a796ebe6b800adc8b3f474c5ce3c3ad"}, + {file = "grpcio-1.68.1-cp313-cp313-win32.whl", hash = "sha256:77d65165fc35cff6e954e7fd4229e05ec76102d4406d4576528d3a3635fc6172"}, + {file = "grpcio-1.68.1-cp313-cp313-win_amd64.whl", hash = "sha256:a8040f85dcb9830d8bbb033ae66d272614cec6faceee88d37a88a9bd1a7a704e"}, + {file = "grpcio-1.68.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:eeb38ff04ab6e5756a2aef6ad8d94e89bb4a51ef96e20f45c44ba190fa0bcaad"}, + {file = "grpcio-1.68.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a3869a6661ec8f81d93f4597da50336718bde9eb13267a699ac7e0a1d6d0bea"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2c4cec6177bf325eb6faa6bd834d2ff6aa8bb3b29012cceb4937b86f8b74323c"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12941d533f3cd45d46f202e3667be8ebf6bcb3573629c7ec12c3e211d99cfccf"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80af6f1e69c5e68a2be529990684abdd31ed6622e988bf18850075c81bb1ad6e"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e8dbe3e00771bfe3d04feed8210fc6617006d06d9a2679b74605b9fed3e8362c"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83bbf5807dc3ee94ce1de2dfe8a356e1d74101e4b9d7aa8c720cc4818a34aded"}, + {file = "grpcio-1.68.1-cp38-cp38-win32.whl", hash = "sha256:8cb620037a2fd9eeee97b4531880e439ebfcd6d7d78f2e7dcc3726428ab5ef63"}, + {file = "grpcio-1.68.1-cp38-cp38-win_amd64.whl", hash = "sha256:52fbf85aa71263380d330f4fce9f013c0798242e31ede05fcee7fbe40ccfc20d"}, + {file = "grpcio-1.68.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb400138e73969eb5e0535d1d06cae6a6f7a15f2cc74add320e2130b8179211a"}, + {file = "grpcio-1.68.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a1b988b40f2fd9de5c820f3a701a43339d8dcf2cb2f1ca137e2c02671cc83ac1"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:96f473cdacfdd506008a5d7579c9f6a7ff245a9ade92c3c0265eb76cc591914f"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37ea3be171f3cf3e7b7e412a98b77685eba9d4fd67421f4a34686a63a65d99f9"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ceb56c4285754e33bb3c2fa777d055e96e6932351a3082ce3559be47f8024f0"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dffd29a2961f3263a16d73945b57cd44a8fd0b235740cb14056f0612329b345e"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:025f790c056815b3bf53da850dd70ebb849fd755a4b1ac822cb65cd631e37d43"}, + {file = "grpcio-1.68.1-cp39-cp39-win32.whl", hash = "sha256:1098f03dedc3b9810810568060dea4ac0822b4062f537b0f53aa015269be0a76"}, + {file = "grpcio-1.68.1-cp39-cp39-win_amd64.whl", hash = "sha256:334ab917792904245a028f10e803fcd5b6f36a7b2173a820c0b5b076555825e1"}, + {file = "grpcio-1.68.1.tar.gz", hash = "sha256:44a8502dd5de653ae6a73e2de50a401d84184f0331d0ac3daeb044e66d5c5054"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.68.1)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + [[package]] name = "idna" version = "3.8" @@ -683,6 +881,22 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +[[package]] +name = "js2py" +version = "0.74" +description = "JavaScript to Python Translator & JavaScript interpreter written in 100% pure Python." +optional = false +python-versions = "*" +files = [ + {file = "Js2Py-0.74-py3-none-any.whl", hash = "sha256:40a508a79e2f8d624e3f2e604f90a1e6f46ac75b416d7f4745939ff4a2e95e09"}, + {file = "Js2Py-0.74.tar.gz", hash = "sha256:39f3a6aa8469180efba3c8677271df27c31332fd1b471df1af2af58b87b8972f"}, +] + +[package.dependencies] +pyjsparser = ">=2.5.1" +six = ">=1.10" +tzlocal = ">=1.2" + [[package]] name = "jupyter-client" version = "8.6.2" @@ -849,6 +1063,43 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "lightnovel-crawler" +version = "3.7.2" +description = "An app to download novels from online sources and generate e-books." +optional = false +python-versions = ">=3.8" +files = [ + {file = "lightnovel_crawler-3.7.2-py3-none-any.whl", hash = "sha256:a2ab5bfd8cf113916668886373d88214b7285298c42c216c29735cdf15a887e1"}, +] + +[package.dependencies] +ascii = "*" +base58 = ">=2.1.1,<2.2.0" +beautifulsoup4 = ">=4.8.0,<5.0.0" +cloudscraper = ">=1.2.71" +colorama = ">=0.4.0,<0.5.0" +ebooklib = ">=0.17.0,<1.0.0" +html5lib = ">=1.1,<2.0" +js2py = ">=0.71" +lxml = ">=4.0.0,<5.0.0" +packaging = "*" +pillow = ">=6.0.0" +prompt-toolkit = ">=3.0,<4.0" +pycryptodome = ">=3.0.0,<4.0.0" +pyease-grpc = ">=1.6.0" +python-box = ">=6.0.0,<8.0.0" +python-dotenv = ">=0.15.0,<2.0.0" +python-slugify = ">=4.0.0,<9.0.0" +questionary = ">=1.6.0" +readability-lxml = ">=0.8.0,<1.0.0" +regex = "*" +requests = ">=2.20.0,<3.0.0" +selenium = ">=3.141.0" +tqdm = ">=4.60,<5.0" +undetected-chromedriver = ">=3.5.3" +webdriver-manager = "*" + [[package]] name = "loguru" version = "0.7.2" @@ -867,6 +1118,114 @@ win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] +[[package]] +name = "lxml" +version = "4.9.4" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e214025e23db238805a600f1f37bf9f9a15413c7bf5f9d6ae194f84980c78722"}, + {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ec53a09aee61d45e7dbe7e91252ff0491b6b5fee3d85b2d45b173d8ab453efc1"}, + {file = "lxml-4.9.4-cp27-cp27m-win32.whl", hash = "sha256:7d1d6c9e74c70ddf524e3c09d9dc0522aba9370708c2cb58680ea40174800013"}, + {file = "lxml-4.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:cb53669442895763e61df5c995f0e8361b61662f26c1b04ee82899c2789c8f69"}, + {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:647bfe88b1997d7ae8d45dabc7c868d8cb0c8412a6e730a7651050b8c7289cf2"}, + {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d973729ce04784906a19108054e1fd476bc85279a403ea1a72fdb051c76fa48"}, + {file = "lxml-4.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:056a17eaaf3da87a05523472ae84246f87ac2f29a53306466c22e60282e54ff8"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aaa5c173a26960fe67daa69aa93d6d6a1cd714a6eb13802d4e4bd1d24a530644"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:647459b23594f370c1c01768edaa0ba0959afc39caeeb793b43158bb9bb6a663"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bdd9abccd0927673cffe601d2c6cdad1c9321bf3437a2f507d6b037ef91ea307"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:00e91573183ad273e242db5585b52670eddf92bacad095ce25c1e682da14ed91"}, + {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a602ed9bd2c7d85bd58592c28e101bd9ff9c718fbde06545a70945ffd5d11868"}, + {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de362ac8bc962408ad8fae28f3967ce1a262b5d63ab8cefb42662566737f1dc7"}, + {file = "lxml-4.9.4-cp310-cp310-win32.whl", hash = "sha256:33714fcf5af4ff7e70a49731a7cc8fd9ce910b9ac194f66eaa18c3cc0a4c02be"}, + {file = "lxml-4.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:d3caa09e613ece43ac292fbed513a4bce170681a447d25ffcbc1b647d45a39c5"}, + {file = "lxml-4.9.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:359a8b09d712df27849e0bcb62c6a3404e780b274b0b7e4c39a88826d1926c28"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:43498ea734ccdfb92e1886dfedaebeb81178a241d39a79d5351ba2b671bff2b2"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4855161013dfb2b762e02b3f4d4a21cc7c6aec13c69e3bffbf5022b3e708dd97"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c71b5b860c5215fdbaa56f715bc218e45a98477f816b46cfde4a84d25b13274e"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9a2b5915c333e4364367140443b59f09feae42184459b913f0f41b9fed55794a"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d82411dbf4d3127b6cde7da0f9373e37ad3a43e89ef374965465928f01c2b979"}, + {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:273473d34462ae6e97c0f4e517bd1bf9588aa67a1d47d93f760a1282640e24ac"}, + {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:389d2b2e543b27962990ab529ac6720c3dded588cc6d0f6557eec153305a3622"}, + {file = "lxml-4.9.4-cp311-cp311-win32.whl", hash = "sha256:8aecb5a7f6f7f8fe9cac0bcadd39efaca8bbf8d1bf242e9f175cbe4c925116c3"}, + {file = "lxml-4.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:c7721a3ef41591341388bb2265395ce522aba52f969d33dacd822da8f018aff8"}, + {file = "lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8"}, + {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229"}, + {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, + {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, + {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, + {file = "lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b"}, + {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, + {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, + {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, + {file = "lxml-4.9.4-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:5557461f83bb7cc718bc9ee1f7156d50e31747e5b38d79cf40f79ab1447afd2d"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:fdb325b7fba1e2c40b9b1db407f85642e32404131c08480dd652110fc908561b"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d74d4a3c4b8f7a1f676cedf8e84bcc57705a6d7925e6daef7a1e54ae543a197"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ac7674d1638df129d9cb4503d20ffc3922bd463c865ef3cb412f2c926108e9a4"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:ddd92e18b783aeb86ad2132d84a4b795fc5ec612e3545c1b687e7747e66e2b53"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bd9ac6e44f2db368ef8986f3989a4cad3de4cd55dbdda536e253000c801bcc7"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bc354b1393dce46026ab13075f77b30e40b61b1a53e852e99d3cc5dd1af4bc85"}, + {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f836f39678cb47c9541f04d8ed4545719dc31ad850bf1832d6b4171e30d65d23"}, + {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9c131447768ed7bc05a02553d939e7f0e807e533441901dd504e217b76307745"}, + {file = "lxml-4.9.4-cp36-cp36m-win32.whl", hash = "sha256:bafa65e3acae612a7799ada439bd202403414ebe23f52e5b17f6ffc2eb98c2be"}, + {file = "lxml-4.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6197c3f3c0b960ad033b9b7d611db11285bb461fc6b802c1dd50d04ad715c225"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:7b378847a09d6bd46047f5f3599cdc64fcb4cc5a5a2dd0a2af610361fbe77b16"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:1343df4e2e6e51182aad12162b23b0a4b3fd77f17527a78c53f0f23573663545"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6dbdacf5752fbd78ccdb434698230c4f0f95df7dd956d5f205b5ed6911a1367c"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:506becdf2ecaebaf7f7995f776394fcc8bd8a78022772de66677c84fb02dd33d"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca8e44b5ba3edb682ea4e6185b49661fc22b230cf811b9c13963c9f982d1d964"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9d9d5726474cbbef279fd709008f91a49c4f758bec9c062dfbba88eab00e3ff9"}, + {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bbdd69e20fe2943b51e2841fc1e6a3c1de460d630f65bde12452d8c97209464d"}, + {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8671622256a0859f5089cbe0ce4693c2af407bc053dcc99aadff7f5310b4aa02"}, + {file = "lxml-4.9.4-cp37-cp37m-win32.whl", hash = "sha256:dd4fda67f5faaef4f9ee5383435048ee3e11ad996901225ad7615bc92245bc8e"}, + {file = "lxml-4.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6bee9c2e501d835f91460b2c904bc359f8433e96799f5c2ff20feebd9bb1e590"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:1f10f250430a4caf84115b1e0f23f3615566ca2369d1962f82bef40dd99cd81a"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b505f2bbff50d261176e67be24e8909e54b5d9d08b12d4946344066d66b3e43"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1449f9451cd53e0fd0a7ec2ff5ede4686add13ac7a7bfa6988ff6d75cff3ebe2"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4ece9cca4cd1c8ba889bfa67eae7f21d0d1a2e715b4d5045395113361e8c533d"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59bb5979f9941c61e907ee571732219fa4774d5a18f3fa5ff2df963f5dfaa6bc"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b1980dbcaad634fe78e710c8587383e6e3f61dbe146bcbfd13a9c8ab2d7b1192"}, + {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9ae6c3363261021144121427b1552b29e7b59de9d6a75bf51e03bc072efb3c37"}, + {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bcee502c649fa6351b44bb014b98c09cb00982a475a1912a9881ca28ab4f9cd9"}, + {file = "lxml-4.9.4-cp38-cp38-win32.whl", hash = "sha256:a8edae5253efa75c2fc79a90068fe540b197d1c7ab5803b800fccfe240eed33c"}, + {file = "lxml-4.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:701847a7aaefef121c5c0d855b2affa5f9bd45196ef00266724a80e439220e46"}, + {file = "lxml-4.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:f610d980e3fccf4394ab3806de6065682982f3d27c12d4ce3ee46a8183d64a6a"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aa9b5abd07f71b081a33115d9758ef6077924082055005808f68feccb27616bd"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:365005e8b0718ea6d64b374423e870648ab47c3a905356ab6e5a5ff03962b9a9"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:16b9ec51cc2feab009e800f2c6327338d6ee4e752c76e95a35c4465e80390ccd"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a905affe76f1802edcac554e3ccf68188bea16546071d7583fb1b693f9cf756b"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd814847901df6e8de13ce69b84c31fc9b3fb591224d6762d0b256d510cbf382"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91bbf398ac8bb7d65a5a52127407c05f75a18d7015a270fdd94bbcb04e65d573"}, + {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f99768232f036b4776ce419d3244a04fe83784bce871b16d2c2e984c7fcea847"}, + {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bb5bd6212eb0edfd1e8f254585290ea1dadc3687dd8fd5e2fd9a87c31915cdab"}, + {file = "lxml-4.9.4-cp39-cp39-win32.whl", hash = "sha256:88f7c383071981c74ec1998ba9b437659e4fd02a3c4a4d3efc16774eb108d0ec"}, + {file = "lxml-4.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:936e8880cc00f839aa4173f94466a8406a96ddce814651075f95837316369899"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:f6c35b2f87c004270fa2e703b872fcc984d714d430b305145c39d53074e1ffe0"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:606d445feeb0856c2b424405236a01c71af7c97e5fe42fbc778634faef2b47e4"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1bdcbebd4e13446a14de4dd1825f1e778e099f17f79718b4aeaf2403624b0f7"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0a08c89b23117049ba171bf51d2f9c5f3abf507d65d016d6e0fa2f37e18c0fc5"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:232fd30903d3123be4c435fb5159938c6225ee8607b635a4d3fca847003134ba"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:231142459d32779b209aa4b4d460b175cadd604fed856f25c1571a9d78114771"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:520486f27f1d4ce9654154b4494cf9307b495527f3a2908ad4cb48e4f7ed7ef7"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:562778586949be7e0d7435fcb24aca4810913771f845d99145a6cee64d5b67ca"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a9e7c6d89c77bb2770c9491d988f26a4b161d05c8ca58f63fb1f1b6b9a74be45"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:786d6b57026e7e04d184313c1359ac3d68002c33e4b1042ca58c362f1d09ff58"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95ae6c5a196e2f239150aa4a479967351df7f44800c93e5a975ec726fef005e2"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9b556596c49fa1232b0fff4b0e69b9d4083a502e60e404b44341e2f8fb7187f5"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:cc02c06e9e320869d7d1bd323df6dd4281e78ac2e7f8526835d3d48c69060683"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:857d6565f9aa3464764c2cb6a2e3c2e75e1970e877c188f4aeae45954a314e0c"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c42ae7e010d7d6bc51875d768110c10e8a59494855c3d4c348b068f5fb81fdcd"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f10250bb190fb0742e3e1958dd5c100524c2cc5096c67c8da51233f7448dc137"}, + {file = "lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (==0.29.37)"] + [[package]] name = "markdown" version = "3.7" @@ -1026,6 +1385,20 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + [[package]] name = "packaging" version = "24.1" @@ -1309,6 +1682,26 @@ files = [ [package.dependencies] wcwidth = "*" +[[package]] +name = "protobuf" +version = "5.29.2" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.29.2-cp310-abi3-win32.whl", hash = "sha256:c12ba8249f5624300cf51c3d0bfe5be71a60c63e4dcf51ffe9a68771d958c851"}, + {file = "protobuf-5.29.2-cp310-abi3-win_amd64.whl", hash = "sha256:842de6d9241134a973aab719ab42b008a18a90f9f07f06ba480df268f86432f9"}, + {file = "protobuf-5.29.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a0c53d78383c851bfa97eb42e3703aefdc96d2036a41482ffd55dc5f529466eb"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:494229ecd8c9009dd71eda5fd57528395d1eacdf307dbece6c12ad0dd09e912e"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b6b0d416bbbb9d4fbf9d0561dbfc4e324fd522f61f7af0fe0f282ab67b22477e"}, + {file = "protobuf-5.29.2-cp38-cp38-win32.whl", hash = "sha256:e621a98c0201a7c8afe89d9646859859be97cb22b8bf1d8eacfd90d5bda2eb19"}, + {file = "protobuf-5.29.2-cp38-cp38-win_amd64.whl", hash = "sha256:13d6d617a2a9e0e82a88113d7191a1baa1e42c2cc6f5f1398d3b054c8e7e714a"}, + {file = "protobuf-5.29.2-cp39-cp39-win32.whl", hash = "sha256:36000f97ea1e76e8398a3f02936aac2a5d2b111aae9920ec1b769fc4a222c4d9"}, + {file = "protobuf-5.29.2-cp39-cp39-win_amd64.whl", hash = "sha256:2d2e674c58a06311c8e99e74be43e7f3a8d1e2b2fdf845eaa347fbd866f23355"}, + {file = "protobuf-5.29.2-py3-none-any.whl", hash = "sha256:fde4554c0e578a5a0bcc9a276339594848d1e89f9ea47b4427c80e5d72f90181"}, + {file = "protobuf-5.29.2.tar.gz", hash = "sha256:b2cc8e8bb7c9326996f0e160137b0861f1a82162502658df2951209d0cb0309e"}, +] + [[package]] name = "psutil" version = "6.0.0" @@ -1385,6 +1778,47 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pycryptodome" +version = "3.21.0" +description = "Cryptographic library for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ba4cc304eac4d4d458f508d4955a88ba25026890e8abff9b60404f76a62c55e"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cb087b8612c8a1a14cf37dd754685be9a8d9869bed2ffaaceb04850a8aeef7e"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:26412b21df30b2861424a6c6d5b1d8ca8107612a4cfa4d0183e71c5d200fb34a"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-win32.whl", hash = "sha256:cc2269ab4bce40b027b49663d61d816903a4bd90ad88cb99ed561aadb3888dd3"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0fa0a05a6a697ccbf2a12cec3d6d2650b50881899b845fac6e87416f8cb7e87d"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6cce52e196a5f1d6797ff7946cdff2038d3b5f0aba4a43cb6bf46b575fd1b5bb"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a915597ffccabe902e7090e199a7bf7a381c5506a747d5e9d27ba55197a2c568"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e74c522d630766b03a836c15bff77cb657c5fdf098abf8b1ada2aebc7d0819"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:a3804675283f4764a02db05f5191eb8fec2bb6ca34d466167fc78a5f05bbe6b3"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53"}, + {file = "pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca"}, + {file = "pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d5ebe0763c982f069d3877832254f64974139f4f9655058452603ff559c482e8"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee86cbde706be13f2dec5a42b52b1c1d1cbb90c8e405c68d0755134735c8dc6"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fd54003ec3ce4e0f16c484a10bc5d8b9bd77fa662a12b85779a2d2d85d67ee0"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5dfafca172933506773482b0e18f0cd766fd3920bd03ec85a283df90d8a17bc6"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:590ef0898a4b0a15485b05210b4a1c9de8806d3ad3d47f74ab1dc07c67a6827f"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35e442630bc4bc2e1878482d6f59ea22e280d7121d7adeaedba58c23ab6386b"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff99f952db3db2fbe98a0b355175f93ec334ba3d01bbde25ad3a5a33abc02b58"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8acd7d34af70ee63f9a849f957558e49a98f8f1634f86a59d2be62bb8e93f71c"}, + {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"}, +] + [[package]] name = "pydocstyle" version = "6.3.0" @@ -1402,6 +1836,21 @@ snowballstemmer = ">=2.2.0" [package.extras] toml = ["tomli (>=1.2.3)"] +[[package]] +name = "pyease-grpc" +version = "1.7.0" +description = "Easy gRPC-web client in python" +optional = false +python-versions = "*" +files = [ + {file = "pyease_grpc-1.7.0-py3-none-any.whl", hash = "sha256:279047e03f21f4b65ebe251d527504a8f64d84ccfa028b50bba0e7315321f05e"}, +] + +[package.dependencies] +grpcio = "*" +protobuf = ">=3.19.0" +requests = ">=2.25.0" + [[package]] name = "pyflakes" version = "3.2.0" @@ -1427,6 +1876,17 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyjsparser" +version = "2.7.1" +description = "Fast javascript parser (based on esprima.js)" +optional = false +python-versions = "*" +files = [ + {file = "pyjsparser-2.7.1-py2-none-any.whl", hash = "sha256:2b12842df98d83f65934e0772fa4a5d8b123b3bc79f1af1789172ac70265dd21"}, + {file = "pyjsparser-2.7.1.tar.gz", hash = "sha256:be60da6b778cc5a5296a69d8e7d614f1f870faf94e1b1b6ac591f2ad5d729579"}, +] + [[package]] name = "pylama" version = "8.4.1" @@ -1468,6 +1928,53 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "python-box" +version = "7.3.0" +description = "Advanced Python dictionaries with dot notation access" +optional = false +python-versions = ">=3.9" +files = [ + {file = "python_box-7.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2131477ed02aa3609b348dad0697b70d84968d6440387898bb9075f461ef9bf"}, + {file = "python_box-7.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3284cf583476af63c4f24168b6e1307503322dccd9b3dc2c924f5e69f79e7ab5"}, + {file = "python_box-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:2718cf4c8dcc091d1c56a1a297804ab7973271391a2d2d34d37740820bbd1fda"}, + {file = "python_box-7.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e40fe08b218b3d07a50d6eb1c62edce8d0636d6bd1e563907bc86018a78e5826"}, + {file = "python_box-7.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd13e2b964ed527e03409cb1fb386d8723e0e69caf0f507af60d64102c13d363"}, + {file = "python_box-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d661fb9c6ff6c730b53fe859754624baa14e37ee3d593525382b20194efad367"}, + {file = "python_box-7.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6c3809f78f7c829e45626990a891d93214748938b9c0236dc6d0f2e8c400d325"}, + {file = "python_box-7.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c233b94bf3b95d7d9dc01ed1ee5636800174345810b319eb87219b760edbb54f"}, + {file = "python_box-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a22cc82e78225a419c4da02f53d6beb5c5cbd2fe5f63c13dab81e4f27b8c929"}, + {file = "python_box-7.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1f7b93c5ab4027b12ba67baffa8db903557e557250e01b91226d7a1b9688cf77"}, + {file = "python_box-7.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71ed234c1cff7f7197103bb11d98559032c0beac34db0c62dd5bd53e2b2a6963"}, + {file = "python_box-7.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1144c9e5d40a2cbe34d1ec9a13abfc557e8e9e2fbf15f14314c87b6113de178f"}, + {file = "python_box-7.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:df77730baabf45b1682ead1c470e84a530f8ceb0295263a89f0ebc04ef7f363c"}, + {file = "python_box-7.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36bef944e61672b300c1d56d16db8a43ee4af9ab5678492a5e003368d2c64a6e"}, + {file = "python_box-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b35a2262a4e1ccfba90ce8e2018aa367f8a46a519632884006fa3153b266f184"}, + {file = "python_box-7.3.0-py3-none-any.whl", hash = "sha256:b1139bffe91bd317fd686c4c29ffc84115c1967af14112c5c4a8ac51937d530c"}, + {file = "python_box-7.3.0.tar.gz", hash = "sha256:39a85ba457d07122226ca60597882d763549713ab56ac7d55da41c4ad0e89a05"}, +] + +[package.extras] +all = ["msgpack", "ruamel.yaml (>=0.17)", "toml"] +msgpack = ["msgpack"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml (>=0.17)"] +toml = ["toml"] +tomli = ["tomli", "tomli-w"] +yaml = ["ruamel.yaml (>=0.17)"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1496,6 +2003,23 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + [[package]] name = "pytz" version = "2024.1" @@ -1651,6 +2175,145 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} +[[package]] +name = "questionary" +version = "1.10.0" +description = "Python library to build pretty command line user prompts ⭐️" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "questionary-1.10.0-py3-none-any.whl", hash = "sha256:fecfcc8cca110fda9d561cb83f1e97ecbb93c613ff857f655818839dac74ce90"}, + {file = "questionary-1.10.0.tar.gz", hash = "sha256:600d3aefecce26d48d97eee936fdb66e4bc27f934c3ab6dd1e292c4f43946d90"}, +] + +[package.dependencies] +prompt_toolkit = ">=2.0,<4.0" + +[package.extras] +docs = ["Sphinx (>=3.3,<4.0)", "sphinx-autobuild (>=2020.9.1,<2021.0.0)", "sphinx-autodoc-typehints (>=1.11.1,<2.0.0)", "sphinx-copybutton (>=0.3.1,<0.4.0)", "sphinx-rtd-theme (>=0.5.0,<0.6.0)"] + +[[package]] +name = "readability-lxml" +version = "0.8.1" +description = "fast html to text parser (article readability tool) with python 3 support" +optional = false +python-versions = "*" +files = [ + {file = "readability-lxml-0.8.1.tar.gz", hash = "sha256:e51fea56b5909aaf886d307d48e79e096293255afa567b7d08bca94d25b1a4e1"}, + {file = "readability_lxml-0.8.1-py3-none-any.whl", hash = "sha256:e0d366a21b1bd6cca17de71a4e6ea16fcfaa8b0a5b4004e39e2c7eff884e6305"}, +] + +[package.dependencies] +chardet = "*" +cssselect = "*" +lxml = "*" + +[package.extras] +test = ["timeout-decorator"] + +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] + [[package]] name = "requests" version = "2.32.3" @@ -1672,6 +2335,20 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "ruff" version = "0.1.15" @@ -1698,6 +2375,25 @@ files = [ {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, ] +[[package]] +name = "selenium" +version = "4.27.1" +description = "Official Python bindings for Selenium WebDriver" +optional = false +python-versions = ">=3.8" +files = [ + {file = "selenium-4.27.1-py3-none-any.whl", hash = "sha256:b89b1f62b5cfe8025868556fe82360d6b649d464f75d2655cb966c8f8447ea18"}, + {file = "selenium-4.27.1.tar.gz", hash = "sha256:5296c425a75ff1b44d0d5199042b36a6d1ef76c04fb775b97b40be739a9caae2"}, +] + +[package.dependencies] +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +typing_extensions = ">=4.9,<5.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} +websocket-client = ">=1.8,<2.0" + [[package]] name = "six" version = "1.16.0" @@ -1709,6 +2405,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "snowballstemmer" version = "2.2.0" @@ -1720,6 +2427,17 @@ files = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + [[package]] name = "soupsieve" version = "2.6" @@ -1750,6 +2468,64 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + +[[package]] +name = "tiktoken" +version = "0.8.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, + {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, + {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, + {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, + {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, + {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, + {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, + {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, + {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, + {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, + {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, + {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + [[package]] name = "tornado" version = "6.4.1" @@ -1805,6 +2581,42 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "trio" +version = "0.27.0" +description = "A friendly Python library for async concurrency and I/O" +optional = false +python-versions = ">=3.8" +files = [ + {file = "trio-0.27.0-py3-none-any.whl", hash = "sha256:68eabbcf8f457d925df62da780eff15ff5dc68fd6b367e2dde59f7aaf2a0b884"}, + {file = "trio-0.27.0.tar.gz", hash = "sha256:1dcc95ab1726b2da054afea8fd761af74bad79bd52381b84eae408e983c76831"}, +] + +[package.dependencies] +attrs = ">=23.2.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = "*" +outcome = "*" +sniffio = ">=1.3.0" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.11.1" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"}, + {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +trio = ">=0.11" +wsproto = ">=0.14" + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1827,6 +2639,38 @@ files = [ {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "undetected-chromedriver" +version = "3.5.5" +description = "('Selenium.webdriver.Chrome replacement with compatiblity for Brave, and other Chromium based browsers.', 'Not triggered by CloudFlare/Imperva/hCaptcha and such.', 'NOTE: results may vary due to many factors. No guarantees are given, except for ongoing efforts in understanding detection algorithms.')" +optional = false +python-versions = "*" +files = [ + {file = "undetected-chromedriver-3.5.5.tar.gz", hash = "sha256:9f945e1435005247abe17de316bcfda85b284a4177fd5f25167c78ced33b65ec"}, +] + +[package.dependencies] +requests = "*" +selenium = ">=4.9.0" +websockets = "*" + [[package]] name = "update-checker" version = "0.18.0" @@ -1857,6 +2701,9 @@ files = [ {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] +[package.dependencies] +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] @@ -1874,6 +2721,33 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "webdriver-manager" +version = "4.0.2" +description = "Library provides the way to automatically manage drivers for different browsers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "webdriver_manager-4.0.2-py2.py3-none-any.whl", hash = "sha256:75908d92ecc45ff2b9953614459c633db8f9aa1ff30181cefe8696e312908129"}, + {file = "webdriver_manager-4.0.2.tar.gz", hash = "sha256:efedf428f92fd6d5c924a0d054e6d1322dd77aab790e834ee767af392b35590f"}, +] + +[package.dependencies] +packaging = "*" +python-dotenv = "*" +requests = "*" + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + [[package]] name = "websocket-client" version = "1.8.0" @@ -1890,6 +2764,84 @@ docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "14.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, +] + [[package]] name = "widgetsnbextension" version = "4.0.13" @@ -1915,7 +2867,21 @@ files = [ [package.extras] dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "651df152e86c6473c53b53c6cb3ad7648fb4a13e75e0578f677b19eb9740c478" +content-hash = "ee75fd2fea7b3c6794965877dcd16caf2b57414f87550f98d475316ffce60ded" diff --git a/pyproject.toml b/pyproject.toml index 52cfcac2..25770457 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,9 @@ praw = "^7.7.1" markdown = "^3.7" bs4 = "^0.0.2" anycache = "^2.2.0" +# lightnovel-crawler = "^3.7.2" +tiktoken = "^0.8.0" +cloudscraper = "^1.2.71" [[tool.poetry.source]] # pytorch cuda needs to compe from another source https://python-poetry.org/docs/dependency-specification/#source-dependencies