OpdsFeed(metadata=OpdsFeedMetadata(identifier=null, type=null, title=OPDS 2.0 Test Catalog, subtitle=null, modified=null, description=null, itemsPerPage=null, currentPage=null, numberOfItems=null), links=[ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=[self], type=application/opds+json, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], publications=[OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Moby-Dick), sortAs=null, subtitle=null, identifier=http://www.feedbooks.com/book/54/moby-dick, modified=2018-04-23T23:18:00Z, published=1851-01-01, language=[en], author=[ReadiumContributorObject(name=Herman Melville, identifier=null, sortAs=Melville, Herman, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Moby-Dick is an 1851 novel by Herman Melville. The story tells the adventures of the wandering sailor Ishmael and his voyage on the whaling ship Pequod, commanded by Captain Ahab. Ishmael soon learns that Ahab seeks one specific whale, Moby-Dick, a white whale of tremendous size and ferocity. Comparatively few whaling ships know of Moby-Dick, and fewer yet have encountered him. In a previous encounter, the whale destroyed Ahab's boat and bit off his leg. Ahab intends to exact revenge., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/moby/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/moby/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/moby/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Le Mystère de la chambre jaune), sortAs=LangMapStringValue(value=Mystère de la chambre jaune, Le), subtitle=null, identifier=http://fr.feedbooks.com/book/588/le-myst%C3%A8re-de-la-chambre-jaune, modified=2018-04-23T22:32:00Z, published=1907-01-01, language=[fr], author=[ReadiumContributorObject(name=Gaston Leroux, identifier=null, sortAs=Leroux, Gaston, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Imaginez-vous devant un coffre fort fermé, où vous entendriez quelqu'un crier à l'aide , vous ouvrez et, vous ne trouvez que la victime. Par où l'assassin est-il parti ? C'est le Mystère de la chambre jaune... La plus célèbre des aventures de Rouletabille..., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/chambrejaune/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/chambrejaune/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/chambrejaune/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null)], navigation=[ReadiumLink(href=https://test.opds.io/2.0/navigation.json, rel=null, type=application/opds+json, title=Explore (Navigation Feed), templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/publications.json, rel=null, type=application/opds+json, title=French Books (Publications Feed), templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=Third Link, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=Fourth Link, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=Fifth Link, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=Sixth Link, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=Seventh Link, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=Eight Link, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], facets=null, groups=[OpdsGroup(metadata=OpdsFeedMetadata(identifier=null, type=null, title=French Classics, subtitle=null, modified=null, description=null, itemsPerPage=null, currentPage=null, numberOfItems=5), links=[ReadiumLink(href=https://test.opds.io/2.0/publications.json, rel=[self], type=application/opds+json, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], navigation=null, publications=[OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Voyage au centre de la Terre), sortAs=null, subtitle=null, identifier=http://fr.feedbooks.com/book/1474/voyage-au-centre-de-la-terre, modified=2018-04-23T22:15:00Z, published=1864-01-01, language=[fr], author=[ReadiumContributorObject(name=Jules Verne, identifier=null, sortAs=Verne, Jules, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=[ReadiumSubjectObject(name=LangMapStringValue(value=Science Fiction), sortAs=null, code=FBFIC028000, scheme=null, links=null), ReadiumSubjectObject(name=LangMapStringValue(value=Action & Aventure), sortAs=null, code=FBFIC002000, scheme=null, links=null)], description=Le professeur Lidenbrock trouve un document dans lequel il apprend l'existence d'un volcan éteint dont la cheminée pourrait le conduire jusqu'au centre de la Terre. Accompagné de son neveu Axel et du guide Hans, il se rend au volcan Sneffels, en Islande, et s'engouffre dans les entrailles de la Terre. Ils ne tarderont pas à faire d'étonnantes découvertes..., numberOfPages=251, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/centredelaterre/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/centredelaterre/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=110, width=146, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/centredelaterre/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=346, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Le Rouge et le Noir), sortAs=LangMapStringValue(value=Rouge et le Noir, Le), subtitle=LangMapStringValue(value=Chronique du XIXe siècle), identifier=http://fr.feedbooks.com/book/220/le-rouge-et-le-noir, modified=2018-04-23T22:25:00Z, published=1834-01-01, language=[fr], author=[ReadiumContributorStringValue(value=Stendhal)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Au rouge des armes, Julien Sorel préfèrera le noir des ordres. Au cours de son ascension sociale, deux femmes se singularisent, comme pour figurer les deux penchants de son caractère : Madame de Rênal - le rêve, l'aspiration à un bonheur pur et simple - et Mathilde de La Mole - l'énergie, l'action brillante et fébrile. A ces composantes stendhaliennes (conception de la vie qui dépasse la stratégie narrative pour s'étendre à l'existence de l'auteur) correspondent deux facettes stylistiques : la sobriété et la restriction du champ de vision., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/rougenoir/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/rougenoir/small.jpg, rel=[http://opds-spec.org/image/thumbnail], type=image/jpeg, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/rougenoir/normal.jpg, rel=[http://opds-spec.org/image], type=image/jpeg, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Le Mystère de la chambre jaune), sortAs=LangMapStringValue(value=Mystère de la chambre jaune, Le), subtitle=null, identifier=http://fr.feedbooks.com/book/588/le-myst%C3%A8re-de-la-chambre-jaune, modified=2018-04-23T22:32:00Z, published=1907-01-01, language=[fr], author=[ReadiumContributorObject(name=Gaston Leroux, identifier=null, sortAs=Leroux, Gaston, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Imaginez-vous devant un coffre fort fermé, où vous entendriez quelqu'un crier à l'aide , vous ouvrez et, vous ne trouvez que la victime. Par où l'assassin est-il parti ? C'est le Mystère de la chambre jaune... La plus célèbre des aventures de Rouletabille..., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/chambrejaune/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/chambrejaune/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/chambrejaune/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Madame Bovary), sortAs=null, subtitle=null, identifier=http://fr.feedbooks.com/book/386/madame-bovary, modified=2018-04-23T22:53:00Z, published=1857-01-01, language=[fr], author=[ReadiumContributorObject(name=Gustave Flaubert, identifier=null, sortAs=Flaubert, Gustave, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Charles Bovary, après avoir suivi ses études dans un lycée de province, s'établit comme officier de santé et se marie à une riche veuve. À la mort de celle-ci, Charles épouse une jeune femme, Emma Rouault, élevée dans un couvent, vivant à la ferme avec son père (un riche fermier, patient du jeune médecin). Emma se laisse séduire par Charles et se marie avec lui. Fascinée par ses lectures romantiques, elle rêve d’une nouvelle vie, en compagnie de son nouveau mari., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/bovary/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/bovary/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/bovary/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Du côté de chez Swann), sortAs=null, subtitle=null, identifier=http://fr.feedbooks.com/book/4/du-c%C3%B4t%C3%A9-de-chez-swann, modified=2018-04-23T22:56:00Z, published=1913-01-01, language=[fr], author=[ReadiumContributorObject(name=Marcel Proust, identifier=null, sortAs=Proust, Marcel, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Du côté de chez Swann est un roman de Marcel Proust, c'est le premier volume de À la recherche du temps perdu. Il est composé de trois parties, dont les titres sont : Combray, Un amour de Swann et Nom de pays : le nom., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/swann/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/swann/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/swann/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null)]), OpdsGroup(metadata=OpdsFeedMetadata(identifier=null, type=null, title=More Navigation, subtitle=null, modified=null, description=null, itemsPerPage=null, currentPage=null, numberOfItems=null), links=null, navigation=[ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=French Books, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/2.0/home.json, rel=null, type=application/opds+json, title=English Books, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], publications=null), OpdsGroup(metadata=OpdsFeedMetadata(identifier=null, type=null, title=English Classics, subtitle=null, modified=null, description=null, itemsPerPage=null, currentPage=null, numberOfItems=3), links=null, navigation=null, publications=[OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Moby-Dick), sortAs=null, subtitle=null, identifier=http://www.feedbooks.com/book/54/moby-dick, modified=2018-04-23T23:18:00Z, published=1851-01-01, language=[en], author=[ReadiumContributorObject(name=Herman Melville, identifier=null, sortAs=Melville, Herman, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Moby-Dick is an 1851 novel by Herman Melville. The story tells the adventures of the wandering sailor Ishmael and his voyage on the whaling ship Pequod, commanded by Captain Ahab. Ishmael soon learns that Ahab seeks one specific whale, Moby-Dick, a white whale of tremendous size and ferocity. Comparatively few whaling ships know of Moby-Dick, and fewer yet have encountered him. In a previous encounter, the whale destroyed Ahab's boat and bit off his leg. Ahab intends to exact revenge., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/moby/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/moby/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/moby/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Romeo and Juliet), sortAs=null, subtitle=null, identifier=http://www.feedbooks.com/book/2936/romeo-and-juliet, modified=2018-05-04T19:28:00Z, published=1597-01-01, language=[en], author=[ReadiumContributorObject(name=William Shakespeare, identifier=null, sortAs=Shakespeare, William, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Romeo and Juliet is a tragic play written early in the career of William Shakespeare about two teenage star-cross'd lovers whose untimely deaths ultimately unite their feuding households. It was among Shakespeare's most popular plays during his lifetime and, along with Hamlet, is one of his most frequently performed plays. Today, the title characters are regarded as archetypal young lovers., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/romeo/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/romeo/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/romeo/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null), OpdsPublication(metadata=ReadiumMetadata(type=http://schema.org/Book, title=LangMapStringValue(value=Jane Eyre), sortAs=null, subtitle=null, identifier=http://www.feedbooks.com/book/144/jane-eyre, modified=2018-05-04T19:32:00Z, published=1847-01-01, language=[en], author=[ReadiumContributorObject(name=Charlotte Brontë, identifier=null, sortAs=Brontë, Charlotte, links=null)], translator=null, editor=null, artist=null, illustrator=null, letterer=null, penciler=null, colorist=null, inker=null, narrator=null, contributor=null, publisher=[ReadiumContributorStringValue(value=Feedbooks)], imprint=null, subject=null, description=Jane Eyre, the story of a young girl and her passage into adulthood, was an immediate commercial success at the time of its original publication in 1847. Its representation of the underside of domestic life and the hypocrisy behind religious enthusiasm drew both praise and bitter criticism, while Charlotte Brontë's striking expose of poor living conditions for children in charity schools as well as her poignant portrayal of the limitations faced by women who worked as governesses sparked great controversy and social debate. Jane Eyre, Brontë's best-known novel, remains an extraordinary coming-of-age narrative, and one of the great classics of literature., numberOfPages=null, duration=null), links=[ReadiumLink(href=https://test.opds.io/assets/eyre/file.epub, rel=[http://opds-spec.org/acquisition/open-access], type=application/epub+zip, title=null, templated=null, properties=null, height=null, width=null, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], images=[ReadiumLink(href=https://test.opds.io/assets/eyre/small.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=169, width=110, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null), ReadiumLink(href=https://test.opds.io/assets/eyre/normal.jpg, rel=null, type=image/jpeg, title=null, templated=null, properties=null, height=400, width=260, size=null, bitrate=null, duration=null, language=null, alternate=null, children=null, subcollections=null)], readingOrder=null, resources=null, toc=null)])]) 2025-09-20 04:32:35.372 [Test worker @coroutine#1] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off. |2025-09-20 04:32:35.480 [Test worker @coroutine#1] INFO io.ktor.server.Application - Application started in 1.319 seconds. 2025-09-20 04:32:35.595 [DefaultDispatcher-worker-1 @coroutine#7] INFO io.ktor.server.Application - Responding at http://0.0.0.0:44611  Test running on port 35151  2025-09-20 04:32:37.805 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off.  o2025-09-20 04:32:37.831 [Test worker] INFO io.ktor.server.Application - Application started in 0.026 seconds.  2025-09-20 04:32:37.835 [DefaultDispatcher-worker-3 @coroutine#14] INFO io.ktor.server.Application - Responding at http://0.0.0.0:35151  2025-09-20 04:32:37.875 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:37.876 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/appmanifest.json.  2025-09-20 04:32:37.876 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:37.997 [eventLoopGroupProxy-7-1 @call-handler#20] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.045 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.046 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.046 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.050 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/appmanifest.json.  2025-09-20 04:32:38.051 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:38.053 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.053 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/appmanifest.json.  2025-09-20 04:32:38.053 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.056 [eventLoopGroupProxy-7-1 @call-handler#26] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.060 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.060 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.060 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.061 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.062 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/appmanifest.json.  2025-09-20 04:32:38.062 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.064 [eventLoopGroupProxy-7-1 @call-handler#29] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.067 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.067 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.067 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/appmanifest.json  2025-09-20 04:32:38.072 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/appmanifest.json to class kotlinx.io.Source  2025-09-20 04:32:38.117 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/app.html  2025-09-20 04:32:38.118 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/app.html.  2025-09-20 04:32:38.118 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/app.html  2025-09-20 04:32:38.125 [eventLoopGroupProxy-7-1 @call-handler#34] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.128 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/app.html  2025-09-20 04:32:38.129 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/app.html  2025-09-20 04:32:38.129 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/app.html  2025-09-20 04:32:38.130 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/app.html.  2025-09-20 04:32:38.130 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/app.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:38.132 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/app.html  2025-09-20 04:32:38.132 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/app.html.  2025-09-20 04:32:38.132 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/app.html  2025-09-20 04:32:38.134 [eventLoopGroupProxy-7-1 @call-handler#40] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.141 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/app.html  2025-09-20 04:32:38.142 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/app.html  2025-09-20 04:32:38.142 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/app.html  2025-09-20 04:32:38.142 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.143 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.143 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/index.json  2025-09-20 04:32:38.145 [eventLoopGroupProxy-7-1 @call-handler#43] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.147 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.147 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/index.json  2025-09-20 04:32:38.147 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.148 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.148 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:38.149 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.149 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.149 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/index.json  2025-09-20 04:32:38.151 [eventLoopGroupProxy-7-1 @call-handler#49] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.153 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.153 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/index.json  2025-09-20 04:32:38.153 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.154 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.154 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.154 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/index.json  2025-09-20 04:32:38.156 [eventLoopGroupProxy-7-1 @call-handler#52] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.158 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.158 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/index.json  2025-09-20 04:32:38.158 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.159 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.159 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:38.159 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.160 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.160 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/index.json  2025-09-20 04:32:38.162 [eventLoopGroupProxy-7-1 @call-handler#58] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.164 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.164 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/index.json  2025-09-20 04:32:38.164 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.165 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.165 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/index.json.  2025-09-20 04:32:38.165 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/index.json  2025-09-20 04:32:38.167 [eventLoopGroupProxy-7-1 @call-handler#61] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:38.170 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.170 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/index.json  2025-09-20 04:32:38.170 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/index.json  2025-09-20 04:32:38.171 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/index.json to class kotlinx.io.Source  oWARN: http://localhost:35151/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon    DEBUG: http://localhost:35151/resources/index.json Skipping link as it has already been visited: http://localhost:35151/resources/index.json    2025-09-20 04:32:41.081 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.081 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/grade1.json.  2025-09-20 04:32:41.081 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.083 [eventLoopGroupProxy-7-1 @call-handler#66] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.085 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.085 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.085 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.085 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/grade1.json.  2025-09-20 04:32:41.085 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.086 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.086 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/grade1.json.  2025-09-20 04:32:41.086 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.087 [eventLoopGroupProxy-7-1 @call-handler#72] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.089 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.089 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.089 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.089 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.089 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/grade1.json.  2025-09-20 04:32:41.089 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.091 [eventLoopGroupProxy-7-1 @call-handler#75] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.092 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.092 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.092 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/grade1.json  2025-09-20 04:32:41.092 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/grade1.json to class kotlinx.io.Source  DEBUG: http://localhost:35151/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001    2025-09-20 04:32:41.104 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.105 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:41.105 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.106 [eventLoopGroupProxy-7-1 @call-handler#80] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.108 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:41.109 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.111 [eventLoopGroupProxy-7-1 @call-handler#86] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.113 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.113 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.113 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.113 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.113 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.113 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.115 [eventLoopGroupProxy-7-1 @call-handler#89] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.116 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.116 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.116 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.117 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.117 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.117 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.117 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.117 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.118 [eventLoopGroupProxy-7-1 @call-handler#95] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.120 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.120 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.120 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.180 [eventLoopGroupProxy-7-2 @call-handler#99] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  DEBUG: http://localhost:35151/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35151/resources/grade1/grade1.json    2025-09-20 04:32:41.215 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.215 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:41.215 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.217 [eventLoopGroupProxy-7-1 @call-handler#103] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.219 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.219 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.219 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.219 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:41.219 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.219 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.220 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:41.220 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.221 [eventLoopGroupProxy-7-1 @call-handler#109] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.222 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.222 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.222 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.223 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.223 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:41.223 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.224 [eventLoopGroupProxy-7-1 @call-handler#112] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.226 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.226 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.226 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:41.226 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source  DEBUG: http://localhost:35151/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001    2025-09-20 04:32:41.280 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.280 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:41.280 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.282 [eventLoopGroupProxy-7-1 @call-handler#117] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.284 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:41.285 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.286 [eventLoopGroupProxy-7-1 @call-handler#123] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.287 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.287 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.287 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/cover.png  2025-09-20 04:32:41.288 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.288 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.288 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.289 [eventLoopGroupProxy-7-1 @call-handler#126] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.291 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.292 [eventLoopGroupProxy-7-1 @call-handler#132] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.294 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.294 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.294 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.297 [eventLoopGroupProxy-7-3 @call-handler#136] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.300 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.300 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/audio.ogg.  2025-09-20 04:32:41.300 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.302 [eventLoopGroupProxy-7-1 @call-handler#140] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.304 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.305 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.305 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.305 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/audio.ogg.  2025-09-20 04:32:41.305 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/audio.ogg to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.306 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.306 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/audio.ogg.  2025-09-20 04:32:41.306 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.307 [eventLoopGroupProxy-7-1 @call-handler#146] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.309 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.309 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.309 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:41.309 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.309 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/video.mp4.  2025-09-20 04:32:41.309 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.310 [eventLoopGroupProxy-7-1 @call-handler#149] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.312 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.312 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.312 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.312 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/video.mp4.  2025-09-20 04:32:41.312 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/video.mp4 to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.319 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.319 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/video.mp4.  2025-09-20 04:32:41.319 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.321 [eventLoopGroupProxy-7-1 @call-handler#155] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.322 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.322 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.322 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:41.323 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.323 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/script.js.  2025-09-20 04:32:41.323 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.324 [eventLoopGroupProxy-7-1 @call-handler#158] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.325 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.325 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.325 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.326 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/script.js.  2025-09-20 04:32:41.326 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/script.js to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.326 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.326 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/script.js.  2025-09-20 04:32:41.326 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.327 [eventLoopGroupProxy-7-1 @call-handler#164] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.328 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.328 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/script.js  2025-09-20 04:32:41.328 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/script.js  DEBUG: http://localhost:35151/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:35151/resources/grade1/lesson001/lesson001.json    2025-09-20 04:32:41.329 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.329 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.329 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.330 [eventLoopGroupProxy-7-1 @call-handler#167] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.342 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.342 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.342 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.342 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.343 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35151/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:41.344 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.344 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35151/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:41.344 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.346 [eventLoopGroupProxy-7-1 @call-handler#173] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:41.347 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.347 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35151/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:41.347 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35151/resources/grade1/lesson001/lesson001.html  DEBUG: http://localhost:35151/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35151/resources/grade1/lesson001/lesson001.html    DEBUG: http://localhost:35151/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35151/resources/grade1/lesson001/lesson001.json    Test running on port 35977  2025-09-20 04:32:43.446 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off.  o2025-09-20 04:32:43.447 [Test worker] INFO io.ktor.server.Application - Application started in 0.001 seconds.  2025-09-20 04:32:43.466 [DefaultDispatcher-worker-3 @coroutine#177] INFO io.ktor.server.Application - Responding at http://0.0.0.0:35977  2025-09-20 04:32:43.469 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.469 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/appmanifest.json.  2025-09-20 04:32:43.469 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.490 [eventLoopGroupProxy-10-1 @call-handler#183] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.498 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.499 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.499 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/appmanifest.json  ERROR: http://localhost:35977/resources/appmanifest.json Link to http://localhost:35977/resources/appmanifest.json: No last-modified or etag header found    2025-09-20 04:32:43.499 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/appmanifest.json.  2025-09-20 04:32:43.499 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.500 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.500 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/appmanifest.json.  2025-09-20 04:32:43.500 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.502 [eventLoopGroupProxy-10-1 @call-handler#189] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.512 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.512 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.512 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/appmanifest.json  2025-09-20 04:32:43.514 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/appmanifest.json to class kotlinx.io.Source  2025-09-20 04:32:43.543 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/app.html  2025-09-20 04:32:43.543 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/app.html.  2025-09-20 04:32:43.544 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/app.html  2025-09-20 04:32:43.545 [eventLoopGroupProxy-10-1 @call-handler#194] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.567 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/app.html  2025-09-20 04:32:43.567 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/app.html  2025-09-20 04:32:43.567 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/app.html  ERROR: http://localhost:35977/resources/appmanifest.json Link to http://localhost:35977/resources/app.html: No last-modified or etag header found    2025-09-20 04:32:43.568 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/app.html.  2025-09-20 04:32:43.568 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/app.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.568 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.568 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/index.json.  2025-09-20 04:32:43.568 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/index.json  2025-09-20 04:32:43.573 [eventLoopGroupProxy-10-1 @call-handler#200] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.587 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.587 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/index.json  2025-09-20 04:32:43.587 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/index.json  ERROR: http://localhost:35977/resources/appmanifest.json Link to http://localhost:35977/resources/index.json: No last-modified or etag header found    2025-09-20 04:32:43.588 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/index.json.  2025-09-20 04:32:43.588 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.588 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.589 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/index.json.  2025-09-20 04:32:43.589 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/index.json  2025-09-20 04:32:43.590 [eventLoopGroupProxy-10-1 @call-handler#206] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.601 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.601 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/index.json  2025-09-20 04:32:43.601 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/index.json  ERROR: http://localhost:35977/resources/appmanifest.json Link to http://localhost:35977/resources/index.json: No last-modified or etag header found    2025-09-20 04:32:43.602 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/index.json.  2025-09-20 04:32:43.602 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.602 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.602 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/index.json.  2025-09-20 04:32:43.602 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/index.json  2025-09-20 04:32:43.604 [eventLoopGroupProxy-10-1 @call-handler#212] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.612 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.612 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/index.json  2025-09-20 04:32:43.613 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/index.json  2025-09-20 04:32:43.613 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/index.json to class kotlinx.io.Source  oWARN: http://localhost:35977/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon    DEBUG: http://localhost:35977/resources/index.json Skipping link as it has already been visited: http://localhost:35977/resources/index.json    2025-09-20 04:32:43.780 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.780 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/grade1.json.  2025-09-20 04:32:43.783 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.786 [eventLoopGroupProxy-10-1 @call-handler#217] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.792 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.792 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.793 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/grade1.json  ERROR: http://localhost:35977/resources/index.json Link to http://localhost:35977/resources/grade1/grade1.json: No last-modified or etag header found    2025-09-20 04:32:43.793 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/grade1.json.  2025-09-20 04:32:43.793 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.793 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.793 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/grade1.json.  2025-09-20 04:32:43.793 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.799 [eventLoopGroupProxy-10-1 @call-handler#223] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.802 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.802 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.802 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/grade1.json  2025-09-20 04:32:43.802 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/grade1.json to class kotlinx.io.Source  DEBUG: http://localhost:35977/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001    2025-09-20 04:32:43.808 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:43.808 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:43.808 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:43.817 [eventLoopGroupProxy-10-1 @call-handler#228] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.823 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:43.824 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:43.824 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/cover.png  ERROR: http://localhost:35977/resources/grade1/grade1.json Link to http://localhost:35977/resources/grade1/lesson001/cover.png: No last-modified or etag header found    2025-09-20 04:32:43.824 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:43.824 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.825 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:43.825 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:43.828 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:43.832 [eventLoopGroupProxy-10-1 @call-handler#234] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.836 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:43.836 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:43.836 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/lesson001.html  ERROR: http://localhost:35977/resources/grade1/grade1.json Link to http://localhost:35977/resources/grade1/lesson001/lesson001.html: No last-modified or etag header found    2025-09-20 04:32:43.836 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:43.836 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.845 [eventLoopGroupProxy-10-2 @call-handler#241] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  DEBUG: http://localhost:35977/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35977/resources/grade1/grade1.json    2025-09-20 04:32:43.859 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.859 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:43.859 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.865 [eventLoopGroupProxy-10-1 @call-handler#245] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.878 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/lesson001.json  ERROR: http://localhost:35977/resources/grade1/grade1.json Link to http://localhost:35977/resources/grade1/lesson001/lesson001.json: No last-modified or etag header found    2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:43.879 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.884 [eventLoopGroupProxy-10-1 @call-handler#251] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:43.886 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.886 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.886 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:43.887 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source  DEBUG: http://localhost:35977/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001    2025-09-20 04:32:44.004 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:44.004 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:44.004 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:44.008 [eventLoopGroupProxy-10-1 @call-handler#256] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.027 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:44.028 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/cover.png  2025-09-20 04:32:44.028 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/cover.png  ERROR: http://localhost:35977/resources/grade1/lesson001/lesson001.json Link to http://localhost:35977/resources/grade1/lesson001/cover.png: No last-modified or etag header found    2025-09-20 04:32:44.028 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:44.028 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:44.031 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.031 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:44.031 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.039 [eventLoopGroupProxy-10-1 @call-handler#262] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.050 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.050 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.051 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/lesson001.html  ERROR: http://localhost:35977/resources/grade1/lesson001/lesson001.json Link to http://localhost:35977/resources/grade1/lesson001/lesson001.html: No last-modified or etag header found    2025-09-20 04:32:44.051 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:44.051 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:44.069 [eventLoopGroupProxy-10-3 @call-handler#269] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.082 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:44.082 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/audio.ogg.  2025-09-20 04:32:44.082 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:44.092 [eventLoopGroupProxy-10-1 @call-handler#273] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.098 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:44.099 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:44.099 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/audio.ogg  ERROR: http://localhost:35977/resources/grade1/lesson001/lesson001.json Link to http://localhost:35977/resources/grade1/lesson001/audio.ogg: No last-modified or etag header found    2025-09-20 04:32:44.100 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/audio.ogg.  2025-09-20 04:32:44.100 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/audio.ogg to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:44.100 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:44.100 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/video.mp4.  2025-09-20 04:32:44.100 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:44.102 [eventLoopGroupProxy-10-1 @call-handler#279] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.115 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:44.116 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:44.116 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/video.mp4  ERROR: http://localhost:35977/resources/grade1/lesson001/lesson001.json Link to http://localhost:35977/resources/grade1/lesson001/video.mp4: No last-modified or etag header found    2025-09-20 04:32:44.116 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/video.mp4.  2025-09-20 04:32:44.116 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/video.mp4 to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:44.138 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/script.js  2025-09-20 04:32:44.139 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/script.js.  2025-09-20 04:32:44.139 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/script.js  2025-09-20 04:32:44.146 [eventLoopGroupProxy-10-1 @call-handler#285] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.150 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/script.js  2025-09-20 04:32:44.151 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/script.js  2025-09-20 04:32:44.151 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/script.js  ERROR: http://localhost:35977/resources/grade1/lesson001/lesson001.json Link to http://localhost:35977/resources/grade1/lesson001/script.js: No last-modified or etag header found    2025-09-20 04:32:44.151 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/script.js.  2025-09-20 04:32:44.151 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/script.js to class io.ktor.utils.io.ByteReadChannel  DEBUG: http://localhost:35977/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:35977/resources/grade1/lesson001/lesson001.json    2025-09-20 04:32:44.158 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.159 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:44.159 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.167 [eventLoopGroupProxy-10-1 @call-handler#291] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:44.189 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.189 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35977/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:44.189 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35977/resources/grade1/lesson001/lesson001.html  ERROR: http://localhost:35977/resources/grade1/lesson001/lesson001.json Link to http://localhost:35977/resources/grade1/lesson001/lesson001.html: No last-modified or etag header found    2025-09-20 04:32:44.190 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35977/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:44.190 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35977/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  DEBUG: http://localhost:35977/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35977/resources/grade1/lesson001/lesson001.html    DEBUG: http://localhost:35977/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35977/resources/grade1/lesson001/lesson001.json    Test running on port 34823  2025-09-20 04:32:46.231 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off.  m2025-09-20 04:32:46.231 [Test worker] INFO io.ktor.server.Application - Application started in 0.0 seconds.  2025-09-20 04:32:46.233 [DefaultDispatcher-worker-9 @coroutine#298] INFO io.ktor.server.Application - Responding at http://0.0.0.0:34823  2025-09-20 04:32:46.234 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.234 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/appmanifest.json.  2025-09-20 04:32:46.234 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.236 [eventLoopGroupProxy-13-1 @call-handler#304] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/appmanifest.json.  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/appmanifest.json.  2025-09-20 04:32:46.237 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.238 [eventLoopGroupProxy-13-1 @call-handler#310] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.239 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.239 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.239 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.239 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.239 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/appmanifest.json.  2025-09-20 04:32:46.239 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.240 [eventLoopGroupProxy-13-1 @call-handler#313] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.240 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.240 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.240 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/appmanifest.json  2025-09-20 04:32:46.240 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/appmanifest.json to class kotlinx.io.Source  2025-09-20 04:32:46.245 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/app.html  2025-09-20 04:32:46.246 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/app.html.  2025-09-20 04:32:46.246 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/app.html  2025-09-20 04:32:46.250 [eventLoopGroupProxy-13-1 @call-handler#318] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.253 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/app.html  2025-09-20 04:32:46.253 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/app.html  2025-09-20 04:32:46.253 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/app.html  2025-09-20 04:32:46.254 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/app.html.  2025-09-20 04:32:46.254 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/app.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.254 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/app.html  2025-09-20 04:32:46.254 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/app.html.  2025-09-20 04:32:46.254 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/app.html  2025-09-20 04:32:46.256 [eventLoopGroupProxy-13-1 @call-handler#324] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.257 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/app.html  2025-09-20 04:32:46.257 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/app.html  2025-09-20 04:32:46.257 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/app.html  2025-09-20 04:32:46.257 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.257 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.257 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/index.json  2025-09-20 04:32:46.258 [eventLoopGroupProxy-13-1 @call-handler#327] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/index.json  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.259 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/index.json  2025-09-20 04:32:46.260 [eventLoopGroupProxy-13-1 @call-handler#333] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.261 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.261 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/index.json  2025-09-20 04:32:46.261 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.261 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.261 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.261 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/index.json  2025-09-20 04:32:46.262 [eventLoopGroupProxy-13-1 @call-handler#336] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/index.json  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.263 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/index.json  2025-09-20 04:32:46.264 [eventLoopGroupProxy-13-1 @call-handler#342] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.265 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.265 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/index.json  2025-09-20 04:32:46.265 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.265 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.265 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/index.json.  2025-09-20 04:32:46.265 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/index.json  2025-09-20 04:32:46.266 [eventLoopGroupProxy-13-1 @call-handler#345] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.267 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.267 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/index.json  2025-09-20 04:32:46.267 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/index.json  2025-09-20 04:32:46.267 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/index.json to class kotlinx.io.Source  oWARN: http://localhost:34823/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon    DEBUG: http://localhost:34823/resources/index.json Skipping link as it has already been visited: http://localhost:34823/resources/index.json    2025-09-20 04:32:46.336 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.336 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/grade1.json.  2025-09-20 04:32:46.336 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.337 [eventLoopGroupProxy-13-1 @call-handler#350] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.338 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/grade1.json.  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/grade1.json.  2025-09-20 04:32:46.339 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.340 [eventLoopGroupProxy-13-1 @call-handler#356] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.341 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.341 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.341 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.342 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.342 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/grade1.json.  2025-09-20 04:32:46.342 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.343 [eventLoopGroupProxy-13-1 @call-handler#359] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.343 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.343 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.343 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/grade1.json  2025-09-20 04:32:46.344 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/grade1.json to class kotlinx.io.Source  DEBUG: http://localhost:34823/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001    2025-09-20 04:32:46.345 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/cover-small.jpg  2025-09-20 04:32:46.345 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/cover-small.jpg.  2025-09-20 04:32:46.345 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/cover-small.jpg  2025-09-20 04:32:46.347 [eventLoopGroupProxy-13-1 @call-handler#364] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, cover-small.jpg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.348 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/cover-small.jpg  2025-09-20 04:32:46.348 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/cover-small.jpg  2025-09-20 04:32:46.348 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/cover-small.jpg  ERROR: http://localhost:34823/resources/grade1/grade1.json Link to http://localhost:34823/resources/grade1/cover-small.jpg: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:46.349 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/cover-small.jpg to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.349 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.349 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.349 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.350 [eventLoopGroupProxy-13-1 @call-handler#368] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.351 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.352 [eventLoopGroupProxy-13-1 @call-handler#374] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.353 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.353 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.353 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.356 [eventLoopGroupProxy-13-2 @call-handler#378] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  DEBUG: http://localhost:34823/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:34823/resources/grade1/grade1.json    2025-09-20 04:32:46.359 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.359 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:46.359 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.361 [eventLoopGroupProxy-13-1 @call-handler#382] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:46.362 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.363 [eventLoopGroupProxy-13-1 @call-handler#388] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.364 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.364 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.364 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.364 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.364 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:46.364 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.365 [eventLoopGroupProxy-13-1 @call-handler#391] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.366 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.366 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.366 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:46.366 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source  DEBUG: http://localhost:34823/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001    2025-09-20 04:32:46.396 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.396 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:46.396 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.397 [eventLoopGroupProxy-13-1 @call-handler#396] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:46.398 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.399 [eventLoopGroupProxy-13-1 @call-handler#402] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.400 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.400 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.400 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/cover.png  2025-09-20 04:32:46.400 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.400 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.400 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.401 [eventLoopGroupProxy-13-1 @call-handler#405] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.401 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.401 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.401 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.402 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.402 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.402 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.402 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.402 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.402 [eventLoopGroupProxy-13-1 @call-handler#411] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.403 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.403 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.403 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.405 [eventLoopGroupProxy-13-3 @call-handler#415] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  sERROR: http://localhost:34823/resources/grade1/lesson001/lesson001.json The manifest which is discovered using the  discovery process as per the Readium spec ( https://github.com/readium/webpub-manifest?tab=readme-ov-file#5-discovering-a-manifest )  /MUST contain a list of all resources required.    DEBUG: http://localhost:34823/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:34823/resources/grade1/lesson001/lesson001.json    2025-09-20 04:32:46.407 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.407 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.407 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.408 [eventLoopGroupProxy-13-1 @call-handler#419] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:34823/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:34823/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:46.409 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.410 [eventLoopGroupProxy-13-1 @call-handler#425] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:46.410 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.410 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:34823/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:46.410 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:34823/resources/grade1/lesson001/lesson001.html  DEBUG: http://localhost:34823/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:34823/resources/grade1/lesson001/lesson001.html    DEBUG: http://localhost:34823/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:34823/resources/grade1/lesson001/lesson001.json    Test running on port 35029  2025-09-20 04:32:48.458 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off.  o2025-09-20 04:32:48.463 [Test worker] INFO io.ktor.server.Application - Application started in 0.005 seconds.  2025-09-20 04:32:48.472 [DefaultDispatcher-worker-10 @coroutine#429] INFO io.ktor.server.Application - Responding at http://0.0.0.0:35029  2025-09-20 04:32:48.475 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.475 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/appmanifest.json.  2025-09-20 04:32:48.475 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.489 [eventLoopGroupProxy-16-1 @call-handler#435] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.495 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.495 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.495 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.495 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/appmanifest.json.  2025-09-20 04:32:48.495 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.498 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.498 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/appmanifest.json.  2025-09-20 04:32:48.498 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.499 [eventLoopGroupProxy-16-1 @call-handler#441] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.500 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.500 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.500 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.501 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.501 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/appmanifest.json.  2025-09-20 04:32:48.501 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.504 [eventLoopGroupProxy-16-1 @call-handler#444] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.507 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.507 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.507 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/appmanifest.json  2025-09-20 04:32:48.507 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/appmanifest.json to class kotlinx.io.Source  2025-09-20 04:32:48.523 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/app.html  2025-09-20 04:32:48.524 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/app.html.  2025-09-20 04:32:48.524 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/app.html  2025-09-20 04:32:48.525 [eventLoopGroupProxy-16-1 @call-handler#449] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.531 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/app.html  2025-09-20 04:32:48.531 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/app.html  2025-09-20 04:32:48.531 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/app.html  2025-09-20 04:32:48.532 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/app.html.  2025-09-20 04:32:48.532 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/app.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.532 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/app.html  2025-09-20 04:32:48.532 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/app.html.  2025-09-20 04:32:48.532 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/app.html  2025-09-20 04:32:48.537 [eventLoopGroupProxy-16-1 @call-handler#455] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.538 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/app.html  2025-09-20 04:32:48.538 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/app.html  2025-09-20 04:32:48.538 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/app.html  2025-09-20 04:32:48.539 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.539 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.539 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/index.json  2025-09-20 04:32:48.540 [eventLoopGroupProxy-16-1 @call-handler#458] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.544 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.544 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/index.json  2025-09-20 04:32:48.544 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.545 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.545 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.545 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.545 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.545 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/index.json  2025-09-20 04:32:48.546 [eventLoopGroupProxy-16-1 @call-handler#464] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.547 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.547 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/index.json  2025-09-20 04:32:48.547 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.548 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.548 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.548 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/index.json  2025-09-20 04:32:48.554 [eventLoopGroupProxy-16-1 @call-handler#467] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.561 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.561 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/index.json  2025-09-20 04:32:48.561 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.562 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.562 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.562 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.562 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.562 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/index.json  2025-09-20 04:32:48.571 [eventLoopGroupProxy-16-1 @call-handler#473] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.577 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.577 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/index.json  2025-09-20 04:32:48.577 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.577 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.577 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/index.json.  2025-09-20 04:32:48.577 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/index.json  2025-09-20 04:32:48.586 [eventLoopGroupProxy-16-1 @call-handler#476] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.599 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.599 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/index.json  2025-09-20 04:32:48.599 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/index.json  2025-09-20 04:32:48.599 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/index.json to class kotlinx.io.Source  oWARN: http://localhost:35029/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon    DEBUG: http://localhost:35029/resources/index.json Skipping link as it has already been visited: http://localhost:35029/resources/index.json    2025-09-20 04:32:48.713 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.714 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/grade1.json.  2025-09-20 04:32:48.714 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.719 [eventLoopGroupProxy-16-1 @call-handler#481] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.730 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.730 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.730 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.731 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/grade1.json.  2025-09-20 04:32:48.731 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.731 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.731 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/grade1.json.  2025-09-20 04:32:48.731 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.732 [eventLoopGroupProxy-16-1 @call-handler#487] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.734 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.734 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.734 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.734 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.734 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/grade1.json.  2025-09-20 04:32:48.734 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.735 [eventLoopGroupProxy-16-1 @call-handler#490] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.738 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.738 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.738 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/grade1.json  2025-09-20 04:32:48.738 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/grade1.json to class kotlinx.io.Source  DEBUG: http://localhost:35029/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001    2025-09-20 04:32:48.740 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/cover-small.jpg  2025-09-20 04:32:48.740 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/cover-small.jpg.  2025-09-20 04:32:48.740 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/cover-small.jpg  2025-09-20 04:32:48.743 [eventLoopGroupProxy-16-1 @call-handler#495] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, cover-small.jpg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.749 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/cover-small.jpg  2025-09-20 04:32:48.749 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/cover-small.jpg  2025-09-20 04:32:48.749 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/cover-small.jpg  ERROR: http://localhost:35029/resources/grade1/grade1.json Link to http://localhost:35029/resources/grade1/cover-small.jpg: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:48.750 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/cover-small.jpg to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.750 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.750 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.750 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.752 [eventLoopGroupProxy-16-1 @call-handler#499] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.757 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.757 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.757 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.758 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.758 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.758 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.758 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.759 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.761 [eventLoopGroupProxy-16-1 @call-handler#505] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.766 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.766 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.766 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.779 [eventLoopGroupProxy-16-2 @call-handler#509] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  DEBUG: http://localhost:35029/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35029/resources/grade1/grade1.json    2025-09-20 04:32:48.783 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.783 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:48.783 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.784 [eventLoopGroupProxy-16-1 @call-handler#513] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:48.786 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.787 [eventLoopGroupProxy-16-1 @call-handler#519] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.788 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.788 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.788 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.789 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.789 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:48.789 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.790 [eventLoopGroupProxy-16-1 @call-handler#522] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.790 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.791 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.792 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:48.792 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source  DEBUG: http://localhost:35029/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001    2025-09-20 04:32:48.887 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/cover.png  2025-09-20 04:32:48.888 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:48.888 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/cover.png  2025-09-20 04:32:48.889 [eventLoopGroupProxy-16-1 @call-handler#527] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.891 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/cover.png  2025-09-20 04:32:48.891 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/cover.png  2025-09-20 04:32:48.891 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/cover.png  ERROR: http://localhost:35029/resources/grade1/lesson001/lesson001.json Link to http://localhost:35029/resources/grade1/lesson001/cover.png: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:48.891 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.892 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.892 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.892 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.892 [eventLoopGroupProxy-16-1 @call-handler#531] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.896 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.897 [eventLoopGroupProxy-16-1 @call-handler#537] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.898 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.899 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.899 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.915 [eventLoopGroupProxy-16-3 @call-handler#541] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.924 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:48.925 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/audio.ogg.  2025-09-20 04:32:48.925 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:48.929 [eventLoopGroupProxy-16-1 @call-handler#545] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.931 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:48.931 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/audio.ogg  2025-09-20 04:32:48.932 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/audio.ogg  ERROR: http://localhost:35029/resources/grade1/lesson001/lesson001.json Link to http://localhost:35029/resources/grade1/lesson001/audio.ogg: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:48.936 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/audio.ogg to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.937 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:48.937 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/video.mp4.  2025-09-20 04:32:48.937 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:48.938 [eventLoopGroupProxy-16-1 @call-handler#549] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.941 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:48.941 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/video.mp4  2025-09-20 04:32:48.941 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/video.mp4  ERROR: http://localhost:35029/resources/grade1/lesson001/lesson001.json Link to http://localhost:35029/resources/grade1/lesson001/video.mp4: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:48.942 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/video.mp4 to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.942 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/script.js  2025-09-20 04:32:48.942 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/script.js.  2025-09-20 04:32:48.942 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/script.js  2025-09-20 04:32:48.946 [eventLoopGroupProxy-16-1 @call-handler#553] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.948 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/script.js  2025-09-20 04:32:48.952 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/script.js  2025-09-20 04:32:48.952 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/script.js  ERROR: http://localhost:35029/resources/grade1/lesson001/lesson001.json Link to http://localhost:35029/resources/grade1/lesson001/script.js: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:48.953 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/script.js to class io.ktor.utils.io.ByteReadChannel  DEBUG: http://localhost:35029/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:35029/resources/grade1/lesson001/lesson001.json    2025-09-20 04:32:48.953 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.953 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.953 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.954 [eventLoopGroupProxy-16-1 @call-handler#557] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35029/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35029/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:48.956 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.957 [eventLoopGroupProxy-16-1 @call-handler#563] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:48.968 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.968 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35029/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:48.968 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35029/resources/grade1/lesson001/lesson001.html  DEBUG: http://localhost:35029/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35029/resources/grade1/lesson001/lesson001.html    DEBUG: http://localhost:35029/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35029/resources/grade1/lesson001/lesson001.json    Test running on port 35001  2025-09-20 04:32:51.069 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off.  m2025-09-20 04:32:51.069 [Test worker] INFO io.ktor.server.Application - Application started in 0.0 seconds.  2025-09-20 04:32:51.076 [DefaultDispatcher-worker-1 @coroutine#567] INFO io.ktor.server.Application - Responding at http://0.0.0.0:35001  2025-09-20 04:32:51.077 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.077 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/appmanifest.json.  2025-09-20 04:32:51.077 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.091 [eventLoopGroupProxy-19-1 @call-handler#573] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.094 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.094 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.094 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.095 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/appmanifest.json.  2025-09-20 04:32:51.095 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.095 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.095 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/appmanifest.json.  2025-09-20 04:32:51.095 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.102 [eventLoopGroupProxy-19-1 @call-handler#579] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.105 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.105 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.105 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.105 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.105 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/appmanifest.json.  2025-09-20 04:32:51.105 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.108 [eventLoopGroupProxy-19-1 @call-handler#582] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  y SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.112 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.112 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.112 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/appmanifest.json  2025-09-20 04:32:51.113 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/appmanifest.json to class kotlinx.io.Source  2025-09-20 04:32:51.131 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/app.html  2025-09-20 04:32:51.131 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/app.html.  2025-09-20 04:32:51.131 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/app.html  2025-09-20 04:32:51.133 [eventLoopGroupProxy-19-1 @call-handler#587] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.138 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/app.html  2025-09-20 04:32:51.138 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/app.html  2025-09-20 04:32:51.138 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/app.html  2025-09-20 04:32:51.138 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/app.html.  2025-09-20 04:32:51.138 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/app.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.139 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/app.html  2025-09-20 04:32:51.139 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/app.html.  2025-09-20 04:32:51.139 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/app.html  2025-09-20 04:32:51.143 [eventLoopGroupProxy-19-1 @call-handler#593] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  q SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.147 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/app.html  2025-09-20 04:32:51.147 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/app.html  2025-09-20 04:32:51.147 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/app.html  2025-09-20 04:32:51.148 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.148 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.148 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/index.json  2025-09-20 04:32:51.150 [eventLoopGroupProxy-19-1 @call-handler#596] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/index.json  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.152 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/index.json  2025-09-20 04:32:51.158 [eventLoopGroupProxy-19-1 @call-handler#602] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.160 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.160 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/index.json  2025-09-20 04:32:51.160 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.161 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.161 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.161 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/index.json  2025-09-20 04:32:51.162 [eventLoopGroupProxy-19-1 @call-handler#605] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/index.json  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/index.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.163 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/index.json  2025-09-20 04:32:51.164 [eventLoopGroupProxy-19-1 @call-handler#611] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.164 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.164 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/index.json  2025-09-20 04:32:51.164 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.165 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.165 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/index.json.  2025-09-20 04:32:51.165 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/index.json  2025-09-20 04:32:51.165 [eventLoopGroupProxy-19-1 @call-handler#614] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  s SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.166 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.166 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/index.json  2025-09-20 04:32:51.166 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/index.json  2025-09-20 04:32:51.166 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/index.json to class kotlinx.io.Source  oWARN: http://localhost:35001/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon    DEBUG: http://localhost:35001/resources/index.json Skipping link as it has already been visited: http://localhost:35001/resources/index.json    2025-09-20 04:32:51.212 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.212 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/grade1.json.  2025-09-20 04:32:51.212 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.213 [eventLoopGroupProxy-19-1 @call-handler#619] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/grade1.json.  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/grade1.json.  2025-09-20 04:32:51.214 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.214 [eventLoopGroupProxy-19-1 @call-handler#625] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.215 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.215 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.215 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.215 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.215 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/grade1.json.  2025-09-20 04:32:51.215 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.216 [eventLoopGroupProxy-19-1 @call-handler#628] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:  | SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.216 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.216 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.216 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/grade1.json  2025-09-20 04:32:51.216 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/grade1.json to class kotlinx.io.Source  DEBUG: http://localhost:35001/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001    2025-09-20 04:32:51.217 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/cover-small.jpg  2025-09-20 04:32:51.217 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/cover-small.jpg.  2025-09-20 04:32:51.217 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/cover-small.jpg  2025-09-20 04:32:51.218 [eventLoopGroupProxy-19-1 @call-handler#633] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, cover-small.jpg]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.218 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/cover-small.jpg  2025-09-20 04:32:51.218 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/cover-small.jpg  2025-09-20 04:32:51.218 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/cover-small.jpg  ERROR: http://localhost:35001/resources/grade1/grade1.json Link to http://localhost:35001/resources/grade1/cover-small.jpg: Response status code not HTTP OK/200. Got: 404    2025-09-20 04:32:51.219 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/cover-small.jpg to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.219 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.219 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.219 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.219 [eventLoopGroupProxy-19-1 @call-handler#637] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.220 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.221 [eventLoopGroupProxy-19-1 @call-handler#643] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.223 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.223 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.223 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.225 [eventLoopGroupProxy-19-2 @call-handler#647] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  ERROR: http://localhost:35001/resources/grade1/grade1.json Manifest not discovered for learning resource ID URL: http://localhost:35001/resources/grade1/lesson001/lesson001.html .Readium publication manifest must be discoverable using a linktag in HTML or Link header for the learning resource ID URL as per https://github.com/readium/webpub-manifest?tab=readme-ov-file#5-discovering-a-manifest    DEBUG: http://localhost:35001/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35001/resources/grade1/grade1.json    2025-09-20 04:32:51.227 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.227 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:51.227 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.228 [eventLoopGroupProxy-19-1 @call-handler#651] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.229 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.229 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.229 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.229 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:51.229 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.230 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.230 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:51.230 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.230 [eventLoopGroupProxy-19-1 @call-handler#657] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.231 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.231 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.231 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.231 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.231 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.json.  2025-09-20 04:32:51.231 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.231 [eventLoopGroupProxy-19-1 @call-handler#660] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.232 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.232 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.232 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.json  2025-09-20 04:32:51.232 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source  DEBUG: http://localhost:35001/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001    2025-09-20 04:32:51.284 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.284 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:51.284 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.292 [eventLoopGroupProxy-19-1 @call-handler#665] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/cover.png.  2025-09-20 04:32:51.297 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.299 [eventLoopGroupProxy-19-1 @call-handler#671] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.304 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.304 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.304 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/cover.png  2025-09-20 04:32:51.305 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.305 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.305 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.306 [eventLoopGroupProxy-19-1 @call-handler#674] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.310 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.310 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.310 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.311 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.311 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.311 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.311 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.311 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.312 [eventLoopGroupProxy-19-1 @call-handler#680] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.313 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.314 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.314 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.331 [eventLoopGroupProxy-19-3 @call-handler#684] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  ERROR: http://localhost:35001/resources/grade1/lesson001/lesson001.json Manifest not discovered for learning resource ID URL: http://localhost:35001/resources/grade1/lesson001/lesson001.html .Readium publication manifest must be discoverable using a linktag in HTML or Link header for the learning resource ID URL as per https://github.com/readium/webpub-manifest?tab=readme-ov-file#5-discovering-a-manifest    DEBUG: http://localhost:35001/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:35001/resources/grade1/lesson001/lesson001.json    2025-09-20 04:32:51.336 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.336 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.336 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.338 [eventLoopGroupProxy-19-1 @call-handler#688] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.344 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.344 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.344 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.348 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.348 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:35001/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel  2025-09-20 04:32:51.352 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.352 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:35001/resources/grade1/lesson001/lesson001.html.  2025-09-20 04:32:51.352 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.357 [eventLoopGroupProxy-19-1 @call-handler#694] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html]  /, segment:0 -> SUCCESS @ /  < /(staticContent), segment:0 -> SUCCESS @ /(staticContent)  R /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources   /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}  | /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET)  Matched routes:  F "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)"  Routing resolve result:   SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET)  2025-09-20 04:32:51.361 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.361 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:35001/resources/grade1/lesson001/lesson001.html  2025-09-20 04:32:51.361 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:35001/resources/grade1/lesson001/lesson001.html  DEBUG: http://localhost:35001/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:35001/resources/grade1/lesson001/lesson001.html