From 3b2e10b7aa5ee53eae3b9c6e94b3c47d76ab4e49 Mon Sep 17 00:00:00 2001 From: Koen <koen@pop-os.localdomain> Date: Tue, 19 Sep 2023 14:40:58 +0200 Subject: [PATCH] Ported changes from Hotfix. --- YoutubeConfig.json | 2 +- YoutubeScript.js | 70 +++++++++++--- diff | 235 +++++++++++++++++++++++++++++++++++++++++++++ twitch.png | Bin 0 -> 36314 bytes 4 files changed, 291 insertions(+), 16 deletions(-) create mode 100644 diff create mode 100644 twitch.png diff --git a/YoutubeConfig.json b/YoutubeConfig.json index 79a07ca..43da9ba 100644 --- a/YoutubeConfig.json +++ b/YoutubeConfig.json @@ -7,7 +7,7 @@ "sourceUrl": "https://plugins.grayjay.app/Youtube/YoutubeConfig.json", "repositoryUrl": "https://futo.org", "scriptUrl": "./YoutubeScript.js", - "version": 113, + "version": 118, "iconUrl": "./youtube.png", "id": "35ae969a-a7db-11ed-afa1-0242ac120002", diff --git a/YoutubeScript.js b/YoutubeScript.js index 8a3f795..0c43e9f 100644 --- a/YoutubeScript.js +++ b/YoutubeScript.js @@ -17,7 +17,7 @@ const URL_SUBSCRIPTIONS_M = "https://m.youtube.com/feed/subscriptions"; const URL_PLAYLIST = "https://youtube.com/playlist?list="; const URL_PLAYLISTS_M = "https://m.youtube.com/feed/library"; -const URL_LIVE_CHAT_HTML = "https://www.youtube.com/live_chat"; +const URL_LIVE_CHAT_HTML = "https://www.youtube.com/live_chat?v="; const URL_LIVE_CHAT = "https://www.youtube.com/youtubei/v1/live_chat/get_live_chat"; const URL_WATCHTIME = "https://www.youtube.com/api/stats/watchtime"; @@ -427,13 +427,29 @@ source.getContentDetails = (url, useAuth) => { return finalResult; }; +source.getLiveChatWindow = function(url) { + const id = extractVideoIDFromUrl(url); + if(!id) + throw new ScriptException("No valid id found"); + + const chatUrl = URL_LIVE_CHAT_HTML + id; + const chatHtmlResp = http.GET(chatUrl, {}, false); + if(!chatHtmlResp.isOk) + return null; + else { + return { + url: chatUrl, + removeElements: [ "yt-live-chat-header-renderer", "#ticker" ] + }; + } +} source.getLiveEvents = function(url) { const id = extractVideoIDFromUrl(url); if(!id) throw new ScriptException("No valid id found"); - const chatHtmlResp = http.GET(URL_LIVE_CHAT_HTML + "?v=" + id, {}, false); + const chatHtmlResp = http.GET(URL_LIVE_CHAT_HTML + id, {}, false); if(!chatHtmlResp.isOk) throw new ScriptException("Failed to get chat html"); const chatHtml = chatHtmlResp.body; @@ -473,6 +489,9 @@ class YoutubePlaybackTracker extends PlaybackTracker { this.watchUrl = playerData.playbackTracking?.videostatsWatchtimeUrl?.baseUrl; this.playbackUrl = playerData.playbackTracking?.videostatsPlaybackUrl?.baseUrl; + if(!this.playbackUrl || !this.watchUrl) + throw new ScriptException("Playback tracking unavailable"); + this.playbackUrlBase = this.playbackUrl.substring(0, this.playbackUrl.indexOf("?")); this.watchUrlBase = this.watchUrl.substring(0, this.watchUrl.indexOf("?")); this.watchParams = parseQueryString(this.watchUrl); @@ -1528,7 +1547,7 @@ function requestInitialData(url, useMobile = false, useAuth = false) { const initialData = getInitialData(html); return initialData; } - else throw new ScriptException("Failed to request page [" + resp.code + "]"); + else throw new ScriptException("Failed to request page [" + resp.code + "]\n" + url + "\n"); } function requestClientConfig(useMobile = false, useAuth = false) { let headers = { @@ -1754,9 +1773,13 @@ function extractChannelListSubMenuAvatarRenderer_AuthorLink(renderer) { * @returns {String[]} Urls */ function extractChannelListSubMenuAvatarRenderer_URL(renderer) { - const url = renderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ? + const canonicalUrl = renderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ? URL_BASE + renderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl : null; + const idUrl = renderer?.navigationEndpoint?.browseEndpoint?.browseId ? + URL_BASE + "/channel/" + renderer.navigationEndpoint.browseEndpoint.browseId : + null; + const url = idUrl ?? canonicalUrl; if(!url) return null; else @@ -1848,6 +1871,13 @@ function extractChannel_PlatformChannel(initialData, sourceUrl = null) { const bannerTargetWidth = 1080; const banner = (banners && banners.length > 0) ? banners.sort((a,b)=>Math.abs(a.width - bannerTargetWidth) - Math.abs(b.width - bannerTargetWidth))[0] : { url: "" }; + const idUrl = headerRenderer?.navigationEndpoint?.browseEndpoint?.browseId ? + URL_BASE + "/channel/" + headerRenderer.navigationEndpoint.browseEndpoint.browseId : + null; + const canonicalUrl = headerRenderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ? + URL_BASE + headerRenderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl : + null; + return new PlatformChannel({ id: new PlatformID(PLATFORM, headerRenderer.channelId, config.id, PLATFORM_CLAIMTYPE), name: headerRenderer.title ?? "", @@ -1855,7 +1885,8 @@ function extractChannel_PlatformChannel(initialData, sourceUrl = null) { banner: banner.url, subscribers: Math.max(0, extractHumanNumber_Integer(extractText_String(headerRenderer.subscriberCountText))), description: "", - url: URL_BASE + headerRenderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl, + url: idUrl, + urlAlternatives: [idUrl, canonicalUrl], links: {} }); } @@ -2093,10 +2124,11 @@ function extractVideoPage_VideoDetails(initialData, initialPlayerData, contextDa if(!video.datetime || video.datetime <= 0) { let date = 0; + if (date <= 0 && renderer.relativeDateText?.simpleText) + date = extractAgoText_Timestamp(renderer.relativeDateText.simpleText); if(date <= 0 && renderer.dateText?.simpleText) date = extractDate_Timestamp(renderer.dateText.simpleText); - if(date <= 0 && renderer.relativeDateText?.simpleText) - date = extractAgoText_Timestamp(renderer.relativeDateText.simpleText); + video.datetime = date; } }, @@ -2150,9 +2182,10 @@ function extractVideoOwnerRenderer_AuthorLink(renderer) { if(renderer.subscriberCountText) subscribers = extractHumanNumber_Integer(extractText_String(renderer.subscriberCountText)); - return new PlatformAuthorLink(new PlatformID(PLATFORM, renderer?.navigationEndpoint?.browseEndpoint?.browseId, config.id, PLATFORM_CLAIMTYPE), + const id = renderer?.navigationEndpoint?.browseEndpoint?.browseId; + return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), extractRuns_String(renderer.title.runs), - extractRuns_Url(renderer.title.runs), + (!id) ? extractRuns_Url(renderer.title.runs) : URL_BASE + "/channel/" + id, bestThumbnail, subscribers); } @@ -2537,6 +2570,10 @@ function extractVideoWithContextRenderer_Video(videoRenderer, contextData) { x.thumbnailOverlayTimeStatusRenderer?.accessibility?.accessibilityData?.label == "LIVE"); let isLive = liveBadges != null && liveBadges.length > 0; + let plannedDate = null; + if(videoRenderer.upcomingEventData?.startTime) + plannedDate = parseInt(videoRenderer.upcomingEventData.startTime); + //if(!isLive && !videoRenderer.publishedTimeText?.simpleText) // return null; //Not a normal video @@ -2557,20 +2594,20 @@ function extractVideoWithContextRenderer_Video(videoRenderer, contextData) { const title = (videoRenderer.headline) ? extractText_String(videoRenderer.headline) : extractText_String(videoRenderer.title); - if(isLive) + if (isLive) { return new PlatformVideo({ id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id), name: title, thumbnails: extractThumbnail_Thumbnails(videoRenderer.thumbnail), author: author, - uploadDate: parseInt(new Date().getTime()/1000), + uploadDate: plannedDate ?? parseInt(new Date().getTime() / 1000), duration: 0, viewCount: viewCount, url: URL_BASE + "/watch?v=" + videoRenderer.videoId, isLive: true, extractType: "VideoWithContext" }); - else + } else { return new PlatformVideo({ id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id), name: title, @@ -2583,6 +2620,7 @@ function extractVideoWithContextRenderer_Video(videoRenderer, contextData) { isLive: false, extractType: "VideoWithContext" }); + } } function extractVideoRenderer_Video(videoRenderer, contextData) { @@ -2733,7 +2771,7 @@ function extractVideoWithContextRenderer_AuthorLink(videoRenderer) { const thumbUrl = channelThumbs && channelThumbs.length > 0 ? channelThumbs[0].url : null; let channelUrl = videoRenderer.channelThumbnail?.channelThumbnailWithLinkRenderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl; if(channelUrl) channelUrl = URL_BASE + channelUrl; - + if (id) channelUrl = URL_BASE + "/channel/" + id; return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl); } function extractVideoRenderer_AuthorLink(videoRenderer) { @@ -2741,7 +2779,7 @@ function extractVideoRenderer_AuthorLink(videoRenderer) { const name = extractRuns_String(videoRenderer.ownerText.runs); const channelIcon = videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer; const thumbUrl = channelIcon.thumbnail.thumbnails[0].url; - const channelUrl = extractRuns_Url(videoRenderer.ownerText.runs); + const channelUrl = (!id) ? extractRuns_Url(videoRenderer.ownerText.runs) : URL_BASE + "/channel/" + id; return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl); } @@ -2828,7 +2866,9 @@ function extractNavigationEndpoint_Url(navEndpoint, baseUrl) { if(!baseUrl) baseUrl = URL_BASE; if(!navEndpoint) - return null; + return null; + if(navEndpoint?.browseEndpoint?.browseId && navEndpoint?.browseEndpoint?.canonicalBaseUrl && navEndpoint.browseEndpoint.canonicalBaseUrl.startsWith("/@")) + return baseUrl + "/channel/" + navEndpoint?.browseEndpoint?.browseId; if(navEndpoint?.browseEndpoint?.canonicalBaseUrl) return baseUrl + navEndpoint?.browseEndpoint?.canonicalBaseUrl; if(navEndpoint.commandMetadata?.webCommandMetadata?.url) diff --git a/diff b/diff new file mode 100644 index 0000000..7f1af63 --- /dev/null +++ b/diff @@ -0,0 +1,235 @@ +--- YoutubeScript.js 2023-09-19 14:30:36.635400711 +0200 ++++ ../../old/Youtube/YoutubeScript.js 2023-09-19 13:50:05.107878724 +0200 +@@ -32,7 +32,6 @@ + const CIPHER_TEST_SUFFIX = "/player_ias.vflset/en_US/base.js"; + + const PLATFORM = "YouTube"; +-const PLATFORM_CLAIMTYPE = 2; + + const BROWSE_TRENDING = "FEtrending"; + const BROWSE_WHAT_TO_WATCH = "FEwhat_to_watch"; +@@ -278,27 +277,6 @@ + throw new ScriptException("No search tab found"); + } + +-source.getChannelUrlByClaim = (claimType, claimValues) => { +- const values = claimValues.values(); +- if (values.length == 0) +- return null; +- const atName = values.find(x => x.startsWith("@")); +- if (atName) +- return URL_BASE + "/" + atName; +- else +- return URL_BASE + "/channel/" + values[0]; +-}; +-source.getChannelTemplateByClaimMap = () => { +- return { +- //Youtube +- 2: { +- 0: URL_BASE + "/{{CLAIMVALUE}}", +- 1: URL_BASE + "/channel/{{CLAIMVALUE}}", +- } +- }; +-}; +- +- + //Video + source.isContentDetailsUrl = (url) => { + return REGEX_VIDEO_URL_DESKTOP.test(url) || REGEX_VIDEO_URL_SHARE.test(url) || REGEX_VIDEO_URL_SHARE_LIVE.test(url) || REGEX_VIDEO_URL_SHORT.test(url); +@@ -427,6 +405,7 @@ + + return finalResult; + }; ++ + source.getLiveChatWindow = function(url) { + const id = extractVideoIDFromUrl(url); + if(!id) +@@ -491,7 +470,6 @@ + this.playbackUrl = playerData.playbackTracking?.videostatsPlaybackUrl?.baseUrl; + if(!this.playbackUrl || !this.watchUrl) + throw new ScriptException("Playback tracking unavailable"); +- + this.playbackUrlBase = this.playbackUrl.substring(0, this.playbackUrl.indexOf("?")); + this.watchUrlBase = this.watchUrl.substring(0, this.watchUrl.indexOf("?")); + this.watchParams = parseQueryString(this.watchUrl); +@@ -672,7 +650,7 @@ + const initialData = requestInitialData(url, false, useAuth); + const channel = extractChannel_PlatformChannel(initialData, url); + const contextData = { +- authorLink: new PlatformAuthorLink(new PlatformID(PLATFORM, channel.id.value, config.id, PLATFORM_CLAIMTYPE), channel.name, channel.url, channel.thumbnail) ++ authorLink: new PlatformAuthorLink(new PlatformID(PLATFORM, channel.id.value, config.id), channel.name, channel.url, channel.thumbnail) + }; + const tabs = extractPage_Tabs(initialData, contextData); + +@@ -1766,7 +1744,7 @@ + if(!url || !name) + return null; + else +- return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config?.id, PLATFORM_CLAIMTYPE), name, url, thumbnail); ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config?.id), name, url, thumbnail); + } + /** + * Extract Subscription channels from a submenu obtained from subscriptionsPage +@@ -1828,7 +1806,7 @@ + const url = guideEntryRenderer.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ? + URL_BASE + guideEntryRenderer.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl : null; + +- return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id, PLATFORM_CLAIMTYPE), name, url, thumbnail); ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id), name, url, thumbnail); + } + + /** +@@ -1870,7 +1848,7 @@ + const banners = headerRenderer.banner?.thumbnails; + const bannerTargetWidth = 1080; + const banner = (banners && banners.length > 0) ? banners.sort((a,b)=>Math.abs(a.width - bannerTargetWidth) - Math.abs(b.width - bannerTargetWidth))[0] : { url: "" }; +- ++ + const idUrl = headerRenderer?.navigationEndpoint?.browseEndpoint?.browseId ? + URL_BASE + "/channel/" + headerRenderer.navigationEndpoint.browseEndpoint.browseId : + null; +@@ -1879,7 +1857,7 @@ + null; + + return new PlatformChannel({ +- id: new PlatformID(PLATFORM, headerRenderer.channelId, config.id, PLATFORM_CLAIMTYPE), ++ id: new PlatformID(PLATFORM, headerRenderer.channelId, config.id), + name: headerRenderer.title ?? "", + thumbnail: thumbnail.url, + banner: banner.url, +@@ -1943,7 +1921,7 @@ + id: new PlatformID(PLATFORM, videoDetails.videoId, config.id), + name: videoDetails.title, + thumbnails: new Thumbnails(videoDetails.thumbnail?.thumbnails.map(x=>new Thumbnail(x.url, x.height)) ?? []), +- author: new PlatformAuthorLink(new PlatformID(PLATFORM, videoDetails.channelId, config.id, PLATFORM_CLAIMTYPE), videoDetails.author, URL_BASE + "/channel/" + videoDetails.channelId, null), ++ author: new PlatformAuthorLink(new PlatformID(PLATFORM, videoDetails.channelId, config.id), videoDetails.author, URL_BASE + "/channel/" + videoDetails.channelId, null), + duration: parseInt(videoDetails.lengthSeconds), + viewCount: parseInt(videoDetails.viewCount), + url: contextData.url, +@@ -2124,11 +2102,10 @@ + if(!video.datetime || video.datetime <= 0) { + let date = 0; + +- if (date <= 0 && renderer.relativeDateText?.simpleText) ++ if(date <= 0 && renderer.relativeDateText?.simpleText) + date = extractAgoText_Timestamp(renderer.relativeDateText.simpleText); + if(date <= 0 && renderer.dateText?.simpleText) + date = extractDate_Timestamp(renderer.dateText.simpleText); +- + video.datetime = date; + } + }, +@@ -2183,7 +2160,8 @@ + subscribers = extractHumanNumber_Integer(extractText_String(renderer.subscriberCountText)); + + const id = renderer?.navigationEndpoint?.browseEndpoint?.browseId; +- return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), ++ ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), + extractRuns_String(renderer.title.runs), + (!id) ? extractRuns_Url(renderer.title.runs) : URL_BASE + "/channel/" + id, + bestThumbnail, +@@ -2570,10 +2548,10 @@ + x.thumbnailOverlayTimeStatusRenderer?.accessibility?.accessibilityData?.label == "LIVE"); + let isLive = liveBadges != null && liveBadges.length > 0; + ++ + let plannedDate = null; + if(videoRenderer.upcomingEventData?.startTime) + plannedDate = parseInt(videoRenderer.upcomingEventData.startTime); +- + //if(!isLive && !videoRenderer.publishedTimeText?.simpleText) + // return null; //Not a normal video + +@@ -2594,19 +2572,21 @@ + + const title = (videoRenderer.headline) ? extractText_String(videoRenderer.headline) : extractText_String(videoRenderer.title); + +- if (isLive) { ++ if(isLive) { + return new PlatformVideo({ + id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id), + name: title, + thumbnails: extractThumbnail_Thumbnails(videoRenderer.thumbnail), + author: author, +- uploadDate: plannedDate ?? parseInt(new Date().getTime()/1000), duration: 0, ++ uploadDate: plannedDate ?? parseInt(new Date().getTime()/1000), ++ duration: 0, + viewCount: viewCount, + url: URL_BASE + "/watch?v=" + videoRenderer.videoId, + isLive: true, + extractType: "VideoWithContext" + }); +- } else { ++ } ++ else + return new PlatformVideo({ + id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id), + name: title, +@@ -2619,7 +2599,6 @@ + isLive: false, + extractType: "VideoWithContext" + }); +- } + } + function extractVideoRenderer_Video(videoRenderer, contextData) { + +@@ -2733,7 +2712,7 @@ + + const subscribers = extractHumanNumber_Integer(extractText_String(channelRenderer.videoCountText)); + +- return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl, subscribers); ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl, subscribers); + } + + function extractRuns_AuthorLink(runs) { +@@ -2745,7 +2724,7 @@ + const channelUrl = extractNavigationEndpoint_Url(runs[0]?.navigationEndpoint); + const thumbUrl = null; + +- return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl ?? ""); ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl ?? ""); + } + + function extractThumbnail_Thumbnails(thumbnail) { +@@ -2770,8 +2749,9 @@ + const thumbUrl = channelThumbs && channelThumbs.length > 0 ? channelThumbs[0].url : null; + let channelUrl = videoRenderer.channelThumbnail?.channelThumbnailWithLinkRenderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl; + if(channelUrl) channelUrl = URL_BASE + channelUrl; +- if (id) channelUrl = URL_BASE + "/channel/" + id; +- return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl); ++ if(id) channelUrl = URL_BASE + "/channel/" + id; ++ ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl); + } + function extractVideoRenderer_AuthorLink(videoRenderer) { + const id = videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer?.navigationEndpoint?.browseEndpoint?.browseId; +@@ -2780,7 +2760,7 @@ + const thumbUrl = channelIcon.thumbnail.thumbnails[0].url; + const channelUrl = (!id) ? extractRuns_Url(videoRenderer.ownerText.runs) : URL_BASE + "/channel/" + id; + +- return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl); ++ return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl); + } + function extractCommentRenderer_Comment(contextUrl, commentRenderer, replyCount, replyContinuation) { + const authorName = commentRenderer.authorText?.simpleText ?? ""; +@@ -2791,7 +2771,7 @@ + ); + return new YTComment({ + contextUrl: contextUrl, +- author: new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id, PLATFORM_CLAIMTYPE), authorName, URL_BASE + authorEndpoint, authorThumbnail), ++ author: new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id), authorName, URL_BASE + authorEndpoint, authorThumbnail), + message: extractRuns_String(commentRenderer.contentText?.runs) ?? "", + rating: new RatingLikes(commentRenderer?.voteCount?.simpleText ? extractHumanNumber_Integer(commentRenderer.voteCount.simpleText) : 0), + date: (commentRenderer.publishedTimeText?.runs ? extractAgoTextRuns_Timestamp(commentRenderer.publishedTimeText.runs) : 0), +@@ -2865,8 +2845,8 @@ + if(!baseUrl) + baseUrl = URL_BASE; + if(!navEndpoint) +- return null; +- if(navEndpoint?.browseEndpoint?.browseId && navEndpoint?.browseEndpoint?.canonicalBaseUrl && navEndpoint.browseEndpoint.canonicalBaseUrl.startsWith("/@")) ++ return null; ++ if(navEndpoint?.browseEndpoint?.browseId && navEndpoint?.browseEndpoint?.canonicalBaseUrl && navEndpoint.browseEndpoint.canonicalBaseUrl.startsWith("/@")); + return baseUrl + "/channel/" + navEndpoint?.browseEndpoint?.browseId; + if(navEndpoint?.browseEndpoint?.canonicalBaseUrl) + return baseUrl + navEndpoint?.browseEndpoint?.canonicalBaseUrl; diff --git a/twitch.png b/twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..73aec0e61f1ae4794b3ac9bd5d0370300d74fd24 GIT binary patch literal 36314 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 LmY!Y`^Z9=PAMr$+ literal 0 HcmV?d00001 -- GitLab