From e608811e5f5615416241e67561671330097092cb Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 30 Jul 2024 01:55:24 +0200 Subject: [PATCH 01/12] feat!: add TV client --- cli/src/main.rs | 23 +- codegen/src/download_testfiles.rs | 3 +- downloader/src/lib.rs | 77 +- src/client/mod.rs | 90 +- src/client/player.rs | 11 +- src/client/response/player.rs | 8 +- ...layer__tests__map_player_data_android.snap | 10 +- ...layer__tests__map_player_data_desktop.snap | 10 +- ...__tests__map_player_data_desktopmusic.snap | 10 +- ...t__player__tests__map_player_data_ios.snap | 10 +- ...nt__player__tests__map_player_data_tv.snap | 518 +++ ...__tests__map_player_data_tvhtml5embed.snap | 10 +- src/model/mod.rs | 10 +- src/model/traits.rs | 25 +- testfiles/player/tv_video.json | 3150 +++++++++++++++++ testfiles/player_model/hdr.json | 3 +- testfiles/player_model/multilanguage.json | 6 +- tests/youtube.rs | 45 +- 18 files changed, 3887 insertions(+), 132 deletions(-) create mode 100644 src/client/snapshots/rustypipe__client__player__tests__map_player_data_tv.snap create mode 100644 testfiles/player/tv_video.json diff --git a/cli/src/main.rs b/cli/src/main.rs index 5011a13..484c51b 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,6 +1,6 @@ #![warn(clippy::todo, clippy::dbg_macro)] -use std::{path::PathBuf, str::FromStr}; +use std::{path::PathBuf, str::FromStr, time::Duration}; use clap::{Parser, Subcommand, ValueEnum}; use futures::stream::{self, StreamExt}; @@ -10,7 +10,7 @@ use rustypipe::{ model::{UrlTarget, VideoId, YouTubeItem}, param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; -use rustypipe_downloader::{DownloadQuery, DownloaderBuilder}; +use rustypipe_downloader::{DownloadError, DownloadQuery, DownloaderBuilder}; use serde::Serialize; use tracing::level_filters::LevelFilter; use tracing_subscriber::{fmt::MakeWriter, EnvFilter}; @@ -236,6 +236,7 @@ enum MusicSearchCategory { enum PlayerType { Desktop, Tv, + TvEmbed, Android, Ios, } @@ -286,7 +287,8 @@ impl From for ClientType { fn from(value: PlayerType) -> Self { match value { PlayerType::Desktop => Self::Desktop, - PlayerType::Tv => Self::TvHtml5Embed, + PlayerType::TvEmbed => Self::TvHtml5Embed, + PlayerType::Tv => Self::Tv, PlayerType::Android => Self::Android, PlayerType::Ios => Self::Ios, } @@ -324,7 +326,7 @@ async fn download_video( } } let dl = DownloaderBuilder::new() - .client(rp) + .rustypipe(rp) .stream_filter(filter) .progress_bar(multi) .build(); @@ -356,7 +358,7 @@ async fn download_videos( } } let dl = DownloaderBuilder::new() - .client(rp) + .rustypipe(rp) .stream_filter(filter) .progress_bar(multi.clone()) .path_precheck() @@ -388,10 +390,11 @@ async fn download_videos( async move { if let Err(e) = q.download().await { - tracing::error!("[{id}]: {e}"); - } else { - main.inc(1); + if !matches!(e, DownloadError::Exists(_)) { + tracing::error!("[{id}]: {e}"); + } } + main.inc(1); } }) .await; @@ -433,7 +436,9 @@ async fn main() { .with_writer(ProgWriter(multi.clone())) .init(); - let mut rp = RustyPipe::builder().visitor_data_opt(cli.vdata); + let mut rp = RustyPipe::builder() + .visitor_data_opt(cli.vdata) + .timeout(Duration::from_secs(15)); if cli.report { rp = rp.report(); } else { diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 9fafa11..d5fd42e 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -66,9 +66,10 @@ pub async fn download_testfiles() { music_genre().await; } -const CLIENT_TYPES: [ClientType; 5] = [ +const CLIENT_TYPES: [ClientType; 6] = [ ClientType::Desktop, ClientType::DesktopMusic, + ClientType::Tv, ClientType::TvHtml5Embed, ClientType::Android, ClientType::Ios, diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 0429ef2..6e9cfdf 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -34,7 +34,7 @@ use tokio::{ process::Command, }; -use util::DownloadError; +pub use util::DownloadError; type Result = core::result::Result; @@ -64,6 +64,8 @@ pub struct DownloaderBuilder { struct DownloaderInner { /// YT client rp: RustyPipe, + /// HTTP client + http: Client, /// Path to the ffmpeg binary ffmpeg: String, /// Global progress @@ -217,7 +219,7 @@ impl DownloaderBuilder { /// Use a custom [`RustyPipe`] client #[must_use] - pub fn client(mut self, rp: &RustyPipe) -> Self { + pub fn rustypipe(mut self, rp: &RustyPipe) -> Self { self.rp = Some(rp.clone()); self } @@ -277,9 +279,20 @@ impl DownloaderBuilder { /// Create a new, configured [`Downloader`] instance pub fn build(self) -> Downloader { + self.build_with_client( + Client::builder() + .timeout(Duration::from_secs(20)) + .build() + .expect("http client"), + ) + } + + /// Create a new, configured [`Downloader`] instance using a custom Reqwest [`Client`] + pub fn build_with_client(self, http_client: Client) -> Downloader { Downloader { i: Arc::new(DownloaderInner { rp: self.rp.unwrap_or_default(), + http: http_client, ffmpeg: self.ffmpeg, multi: self.multi, filter: self.filter, @@ -300,7 +313,7 @@ impl Default for Downloader { impl Downloader { /// Create a new [`Downloader`] using the given [`RustyPipe`] instance pub fn new(rp: &RustyPipe) -> Self { - DownloaderBuilder::new().client(rp).build() + DownloaderBuilder::new().rustypipe(rp).build() } /// Create a new [`DownloaderBuilder`] @@ -442,7 +455,7 @@ impl DownloadQuery { let err = match self.download_attempt(&pb, n).await { Ok(res) => return Ok(res), Err(DownloadError::Http(e)) => { - if e.status() != Some(StatusCode::FORBIDDEN) { + if !e.is_timeout() && e.status() != Some(StatusCode::FORBIDDEN) { return Err(DownloadError::Http(e)); } DownloadError::Http(e) @@ -521,7 +534,24 @@ impl DownloadQuery { }, }; - let pv = DownloadVideo::from_video(&player_data); + let (name, details) = match &player_data.details.name { + Some(n) => (n.to_owned(), None), + None => { + let details = self.dl.i.rp.query().video_details(&self.video.id).await?; + (details.name.to_owned(), Some(details)) + } + }; + + let pv = DownloadVideo { + id: player_data.details.id.to_owned(), + name: Some(name.to_owned()), + channel_id: Some(player_data.details.channel_id.to_owned()), + channel_name: player_data + .details + .channel_name + .clone() + .or(details.map(|d| d.channel.name)), + }; let output_path = self.dest.get_dest_path(&pv).with_extension(extension); if output_path.exists() { @@ -551,22 +581,12 @@ impl DownloadQuery { } if let Some(pb) = pb { - pb.set_message(format!( - "Downloading {}{}", - player_data.name(), - attempt_suffix - )) + pb.set_message(format!("Downloading {name}{attempt_suffix}")) } - download_streams( - &downloads, - self.dl.i.rp.http_client(), - &user_agent, - pb.clone(), - ) - .await?; + download_streams(&downloads, &self.dl.i.http, &user_agent, pb.clone()).await?; if let Some(pb) = &pb { - pb.set_message(format!("Converting {}", player_data.name())); + pb.set_message(format!("Converting {name}")); pb.set_style( ProgressStyle::with_template("{msg}\n{spinner:.green} [{elapsed_precise}]") .unwrap(), @@ -574,13 +594,7 @@ impl DownloadQuery { pb.enable_steady_tick(Duration::from_millis(500)); } - convert_streams( - &downloads, - &output_path, - &self.dl.i.ffmpeg, - player_data.name(), - ) - .await?; + convert_streams(&downloads, &output_path, &self.dl.i.ffmpeg, &name).await?; if let Some(pb) = pb { pb.disable_steady_tick(); } @@ -787,6 +801,12 @@ async fn download_chunks_by_header( .await? .error_for_status()?; + if res.content_length().unwrap_or_default() == 0 { + return Err(DownloadError::Progressive( + format!("empty chunk {}-{}", range.start, range.end).into(), + )); + } + // Content-Range: bytes 0-100/451368980 let cr_header = res .headers() @@ -859,7 +879,12 @@ async fn download_chunks_by_param( .await? .error_for_status()?; - let clen = res.content_length().unwrap(); + let clen = res.content_length().unwrap_or_default(); + if clen == 0 { + return Err(DownloadError::Progressive( + format!("empty chunk {}-{}", range.start, range.end).into(), + )); + } tracing::debug!("Retrieving chunks..."); let mut stream = res.bytes_stream(); diff --git a/src/client/mod.rs b/src/client/mod.rs index e6761e8..a8bd5d4 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -61,6 +61,8 @@ pub enum ClientType { /// /// can access age-restricted videos, cannot access non-embeddable videos TvHtml5Embed, + /// Client used by youtube.com/tv + Tv, /// Client used by the Android app /// /// no obfuscated stream URLs, includes lower resolution audio streams @@ -74,7 +76,10 @@ pub enum ClientType { impl ClientType { fn is_web(self) -> bool { match self { - ClientType::Desktop | ClientType::DesktopMusic | ClientType::TvHtml5Embed => true, + ClientType::Desktop + | ClientType::DesktopMusic + | ClientType::TvHtml5Embed + | ClientType::Tv => true, ClientType::Android | ClientType::Ios => false, } } @@ -183,6 +188,7 @@ struct QContinuation<'a> { } const DEFAULT_UA: &str = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"; +const TV_UA: &str = "Mozilla/5.0 (SMART-TV; Linux; Tizen 5.0) AppleWebKit/538.1 (KHTML, like Gecko) Version/5.0 NativeTVAds Safari/538.1"; const CONSENT_COOKIE: &str = "SOCS=CAISAiAD"; @@ -191,12 +197,14 @@ const YOUTUBEI_V1_GAPIS_URL: &str = "https://youtubei.googleapis.com/youtubei/v1 const YOUTUBE_MUSIC_V1_URL: &str = "https://music.youtube.com/youtubei/v1/"; const YOUTUBE_HOME_URL: &str = "https://www.youtube.com/"; const YOUTUBE_MUSIC_HOME_URL: &str = "https://music.youtube.com/"; +const YOUTUBE_TV_URL: &str = "https://www.youtube.com/tv"; const DISABLE_PRETTY_PRINT_PARAMETER: &str = "prettyPrint=false"; // Desktop client const DESKTOP_CLIENT_VERSION: &str = "2.20230126.00.00"; const TVHTML5_CLIENT_VERSION: &str = "2.0"; +const TV_CLIENT_VERSION: &str = "7.20240724.13.00"; const DESKTOP_MUSIC_CLIENT_VERSION: &str = "1.20230123.01.01"; // Mobile client @@ -454,7 +462,7 @@ impl RustyPipeBuilder { self.build_with_client(ClientBuilder::new()) } - /// Create a new, configured RustyPipe instance using a Reqwest client builder. + /// Create a new, configured RustyPipe instance using a Reqwest [`ClientBuilder`]. pub fn build_with_client(self, mut client_builder: ClientBuilder) -> Result { let user_agent = self .user_agent @@ -717,31 +725,33 @@ impl RustyPipe { } } - /// Get the internal HTTP client - /// - /// Can be used for downloading videos or custom YT requests. - #[must_use] - pub fn http_client(&self) -> &Client { - &self.inner.http - } - /// Execute the given http request. async fn http_request(&self, request: &Request) -> Result { let mut last_resp = None; for n in 0..=self.inner.n_http_retries { - let resp = self - .inner - .http - .execute(request.try_clone().unwrap()) - .await?; + let resp = self.inner.http.execute(request.try_clone().unwrap()).await; - let status = resp.status(); - // Immediately return in case of success or unrecoverable status code - if status.is_success() - || (!status.is_server_error() && status != StatusCode::TOO_MANY_REQUESTS) - { - return Ok(resp); - } + let err = match resp { + Ok(resp) => { + let status = resp.status(); + // Immediately return in case of success or unrecoverable status code + if status.is_success() + || (!status.is_server_error() && status != StatusCode::TOO_MANY_REQUESTS) + { + return Ok(resp); + } + last_resp = Some(Ok(resp)); + status.to_string() + } + Err(e) => { + // Retry in case of a timeout error + if !e.is_timeout() { + return Err(e); + } + last_resp = Some(Err(e)); + "timeout".to_string() + } + }; // Retry in case of a recoverable status code (server err, too many requests) if n != self.inner.n_http_retries { @@ -749,15 +759,13 @@ impl RustyPipe { tracing::warn!( "Retry attempt #{}. Error: {}. Waiting {} ms", n + 1, - status, + err, ms ); tokio::time::sleep(Duration::from_millis(ms.into())).await; } - - last_resp = Some(resp); } - Ok(last_resp.unwrap()) + last_resp.unwrap() } /// Execute the given http request, returning an error in case of a @@ -1098,6 +1106,7 @@ impl RustyPipeQuery { ClientType::Desktop | ClientType::DesktopMusic | ClientType::TvHtml5Embed => { Cow::Borrowed(&self.client.inner.user_agent) } + ClientType::Tv => TV_UA.into(), ClientType::Android => format!( "com.google.android.youtube/{} (Linux; U; Android 12; {}) gzip", MOBILE_CLIENT_VERSION, self.opts.country @@ -1178,6 +1187,24 @@ impl RustyPipeQuery { embed_url: YOUTUBE_HOME_URL, }), }, + ClientType::Tv => YTContext { + client: ClientInfo { + client_name: "TVHTML5", + client_version: Cow::Borrowed(TV_CLIENT_VERSION), + client_screen: Some("WATCH"), + platform: "TV", + device_model: Some("SmartTV"), + visitor_data, + hl, + gl, + ..Default::default() + }, + request: Some(RequestYT::default()), + user: User::default(), + third_party: Some(ThirdParty { + embed_url: YOUTUBE_TV_URL, + }), + }, ClientType::Android => YTContext { client: ClientInfo { client_name: "ANDROID", @@ -1266,6 +1293,17 @@ impl RustyPipeQuery { .header(header::REFERER, YOUTUBE_HOME_URL) .header("X-YouTube-Client-Name", "1") .header("X-YouTube-Client-Version", TVHTML5_CLIENT_VERSION), + ClientType::Tv => self + .client + .inner + .http + .post(format!( + "{YOUTUBEI_V1_URL}{endpoint}?{DISABLE_PRETTY_PRINT_PARAMETER}" + )) + .header(header::ORIGIN, YOUTUBE_HOME_URL) + .header(header::REFERER, YOUTUBE_TV_URL) + .header("X-YouTube-Client-Name", "7") + .header("X-YouTube-Client-Version", TV_CLIENT_VERSION), ClientType::Android => self .client .inner diff --git a/src/client/player.rs b/src/client/player.rs index 8cccc97..b763bb5 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -13,8 +13,8 @@ use crate::{ deobfuscate::Deobfuscator, error::{internal::DeobfError, Error, ExtractionError, UnavailabilityReason}, model::{ - traits::QualityOrd, AudioCodec, AudioFormat, AudioStream, AudioTrack, ChannelId, Frameset, - Subtitle, VideoCodec, VideoFormat, VideoPlayer, VideoPlayerDetails, VideoStream, + traits::QualityOrd, AudioCodec, AudioFormat, AudioStream, AudioTrack, Frameset, Subtitle, + VideoCodec, VideoFormat, VideoPlayer, VideoPlayerDetails, VideoStream, }, util, }; @@ -265,10 +265,8 @@ impl MapResponse for response::Player { description: video_details.short_description, duration: video_details.length_seconds, thumbnail: video_details.thumbnail.into(), - channel: ChannelId { - id: video_details.channel_id, - name: video_details.author, - }, + channel_id: video_details.channel_id, + channel_name: video_details.author, view_count: video_details.view_count, keywords: video_details.keywords, is_live, @@ -737,6 +735,7 @@ mod tests { #[rstest] #[case::desktop(ClientType::Desktop)] #[case::desktop_music(ClientType::DesktopMusic)] + #[case::tv(ClientType::Tv)] #[case::tv_html5_embed(ClientType::TvHtml5Embed)] #[case::android(ClientType::Android)] #[case::ios(ClientType::Ios)] diff --git a/src/client/response/player.rs b/src/client/response/player.rs index f3ae15e..fa9a295 100644 --- a/src/client/response/player.rs +++ b/src/client/response/player.rs @@ -236,7 +236,7 @@ pub(crate) struct CaptionTrack { #[serde(rename_all = "camelCase")] pub(crate) struct VideoDetails { pub video_id: String, - pub title: String, + pub title: Option, #[serde_as(as = "DisplayFromStr")] pub length_seconds: u32, #[serde(default)] @@ -245,9 +245,9 @@ pub(crate) struct VideoDetails { pub short_description: Option, #[serde(default)] pub thumbnail: Thumbnails, - #[serde_as(as = "DisplayFromStr")] - pub view_count: u64, - pub author: String, + #[serde_as(as = "Option")] + pub view_count: Option, + pub author: Option, pub is_live_content: bool, } diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap index 02798cc..5875d9f 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap @@ -5,7 +5,7 @@ expression: map_res.c VideoPlayer( details: VideoPlayerDetails( id: "pPvd8UxmSbQ", - name: "Inspiring Cinematic Uplifting (Creative Commons)", + name: Some("Inspiring Cinematic Uplifting (Creative Commons)"), description: Some("► Download Music: http://bit.ly/2QLufeh\nImportant to know! You can download this track for free through Patreon. You will pay only for new tracks! So join others and let\'s make next track together!\n\n► MORE MUSIC: Become my patron and get access to all our music from Patreon library. More Info here: http://bit.ly/2JJDFHb\n\n► Additional edit versions of this track you can download here: http://bit.ly/2WdRinT (5 versions)\n--------------------- \n\n►DESCRIPTION:\nInspiring Cinematic Uplifting Trailer Background - epic music for trailer video project with powerful drums, energetic orchestra and gentle piano melody. This motivational cinematic theme will work as perfect background for beautiful epic moments, landscapes, nature, drone video, motivational products and achievements.\n--------------------- \n\n► LICENSE:\n● If you need a license for your project, you can purchase it here: \nhttps://1.envato.market/ajicu (Audiojungle)\nhttps://bit.ly/3fWZZuI (Pond5)\n--------------------- \n\n► LISTEN ON:\n● Spotify - https://spoti.fi/2sHm3UH\n● Apple Music - https://apple.co/3qBjbUO\n--------------------- \n\n► SUBSCRIBE FOR MORE: \nPatreon: http://bit.ly/2JJDFHb\nYoutube: http://bit.ly/2AYBzfA\nFacebook: http://bit.ly/2T6dTx5\nInstagram: http://bit.ly/2BHJ8rB\nTwitter: http://bit.ly/2MwtOlT\nSoundCloud: http://bit.ly/2IwVVmt\nAudiojungle: https://1.envato.market/ajrsm\nPond5: https://bit.ly/2TLi1rW\n--------------------- \n►Photo by Vittorio Staffolani from Pexels\n--------------------- \n\nFAQ:\n\n► Can I use this music in my videos? \n● Sure! Just download this track and you are ready to use it! We only ask to credit us. \n-------------------- \n\n► What is \"Creative Commons\"? \nCreative Commons is a system that allows you to legally use “some rights reserved” music, movies, images, and other content — all for free. Licensees may copy, distribute, display and perform the work and make derivative works and remixes based on it only if they give the author or licensor the credits.\n-------------------- \n\n► Will I have any copyright issues with this track?\n● No, you should not have any copyright problems with this track!\n-------------------- \n\n► Is it necessary to become your patron?\n● No it\'s not necessary. But we recommend you to become our patron because you will get access to huge library of music. You will download only highest quality files. You will find additional edited versions of every track. You always be tuned with our news. You will find music not only from Roman Senyk but also from another talented authors.\n-------------------- \n\n► Why I received a copyright claim when I used this track?\n● Do not panic! This is very common situation. Content ID fingerprint system can mismatch our music. Just dispute the claim by showing our original track. Or send us the link to your video (romansenykmusic@gmail.com) and attach some screenshot with claim information. Claim will be released until 24 hours!\n\n► How to credit you in my video?\n● Just add to the description of your project information about Author, Name of Song and the link to our original track. Or copy and paste:\n\nMusic Info: Inspiring Cinematic Uplifting by RomanSenykMusic.\nMusic Link: https://youtu.be/pPvd8UxmSbQ\n--------------------- \n\n► If you have any questions, you can write in the comments for this video or by email: romansenykmusic@gmail.com\n--------------------- \n\nStay tuned! The best is yet to come! \nThanks For Listening!\nRoman Senyk"), duration: 163, thumbnail: [ @@ -30,11 +30,9 @@ VideoPlayer( height: 480, ), ], - channel: ChannelId( - id: "UCbxxEi-ImPlbLx5F-fHetEg", - name: "RomanSenykMusic - Royalty Free Music", - ), - view_count: 426567, + channel_id: "UCbxxEi-ImPlbLx5F-fHetEg", + channel_name: Some("RomanSenykMusic - Royalty Free Music"), + view_count: Some(426567), keywords: [ "no copyright music", "background music", diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap index ec4ae26..97fdd93 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap @@ -5,7 +5,7 @@ expression: map_res.c VideoPlayer( details: VideoPlayerDetails( id: "pPvd8UxmSbQ", - name: "Inspiring Cinematic Uplifting (Creative Commons)", + name: Some("Inspiring Cinematic Uplifting (Creative Commons)"), description: Some("► Download Music: http://bit.ly/2QLufeh\nImportant to know! You can download this track for free through Patreon. You will pay only for new tracks! So join others and let\'s make next track together!\n\n► MORE MUSIC: Become my patron and get access to all our music from Patreon library. More Info here: http://bit.ly/2JJDFHb\n\n► Additional edit versions of this track you can download here: http://bit.ly/2WdRinT (5 versions)\n--------------------- \n\n►DESCRIPTION:\nInspiring Cinematic Uplifting Trailer Background - epic music for trailer video project with powerful drums, energetic orchestra and gentle piano melody. This motivational cinematic theme will work as perfect background for beautiful epic moments, landscapes, nature, drone video, motivational products and achievements.\n--------------------- \n\n► LICENSE:\n● If you need a license for your project, you can purchase it here: \nhttps://1.envato.market/ajicu (Audiojungle)\nhttps://bit.ly/3fWZZuI (Pond5)\n--------------------- \n\n► LISTEN ON:\n● Spotify - https://spoti.fi/2sHm3UH\n● Apple Music - https://apple.co/3qBjbUO\n--------------------- \n\n► SUBSCRIBE FOR MORE: \nPatreon: http://bit.ly/2JJDFHb\nYoutube: http://bit.ly/2AYBzfA\nFacebook: http://bit.ly/2T6dTx5\nInstagram: http://bit.ly/2BHJ8rB\nTwitter: http://bit.ly/2MwtOlT\nSoundCloud: http://bit.ly/2IwVVmt\nAudiojungle: https://1.envato.market/ajrsm\nPond5: https://bit.ly/2TLi1rW\n--------------------- \n►Photo by Vittorio Staffolani from Pexels\n--------------------- \n\nFAQ:\n\n► Can I use this music in my videos? \n● Sure! Just download this track and you are ready to use it! We only ask to credit us. \n-------------------- \n\n► What is \"Creative Commons\"? \nCreative Commons is a system that allows you to legally use “some rights reserved” music, movies, images, and other content — all for free. Licensees may copy, distribute, display and perform the work and make derivative works and remixes based on it only if they give the author or licensor the credits.\n-------------------- \n\n► Will I have any copyright issues with this track?\n● No, you should not have any copyright problems with this track!\n-------------------- \n\n► Is it necessary to become your patron?\n● No it\'s not necessary. But we recommend you to become our patron because you will get access to huge library of music. You will download only highest quality files. You will find additional edited versions of every track. You always be tuned with our news. You will find music not only from Roman Senyk but also from another talented authors.\n-------------------- \n\n► Why I received a copyright claim when I used this track?\n● Do not panic! This is very common situation. Content ID fingerprint system can mismatch our music. Just dispute the claim by showing our original track. Or send us the link to your video (romansenykmusic@gmail.com) and attach some screenshot with claim information. Claim will be released until 24 hours!\n\n► How to credit you in my video?\n● Just add to the description of your project information about Author, Name of Song and the link to our original track. Or copy and paste:\n\nMusic Info: Inspiring Cinematic Uplifting by RomanSenykMusic.\nMusic Link: https://youtu.be/pPvd8UxmSbQ\n--------------------- \n\n► If you have any questions, you can write in the comments for this video or by email: romansenykmusic@gmail.com\n--------------------- \n\nStay tuned! The best is yet to come! \nThanks For Listening!\nRoman Senyk"), duration: 163, thumbnail: [ @@ -35,11 +35,9 @@ VideoPlayer( height: 1080, ), ], - channel: ChannelId( - id: "UCbxxEi-ImPlbLx5F-fHetEg", - name: "RomanSenykMusic - Royalty Free Music", - ), - view_count: 426567, + channel_id: "UCbxxEi-ImPlbLx5F-fHetEg", + channel_name: Some("RomanSenykMusic - Royalty Free Music"), + view_count: Some(426567), keywords: [ "no copyright music", "background music", diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap index 8ea0e63..8a2e061 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap @@ -5,7 +5,7 @@ expression: map_res.c VideoPlayer( details: VideoPlayerDetails( id: "pPvd8UxmSbQ", - name: "Inspiring Cinematic Uplifting", + name: Some("Inspiring Cinematic Uplifting"), description: None, duration: 163, thumbnail: [ @@ -25,11 +25,9 @@ VideoPlayer( height: 480, ), ], - channel: ChannelId( - id: "UCbxxEi-ImPlbLx5F-fHetEg", - name: "Romansenykmusic", - ), - view_count: 426583, + channel_id: "UCbxxEi-ImPlbLx5F-fHetEg", + channel_name: Some("Romansenykmusic"), + view_count: Some(426583), keywords: [], is_live: false, is_live_content: false, diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap index dcad31b..3156f55 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap @@ -5,7 +5,7 @@ expression: map_res.c VideoPlayer( details: VideoPlayerDetails( id: "pPvd8UxmSbQ", - name: "Inspiring Cinematic Uplifting (Creative Commons)", + name: Some("Inspiring Cinematic Uplifting (Creative Commons)"), description: Some("► Download Music: http://bit.ly/2QLufeh\nImportant to know! You can download this track for free through Patreon. You will pay only for new tracks! So join others and let\'s make next track together!\n\n► MORE MUSIC: Become my patron and get access to all our music from Patreon library. More Info here: http://bit.ly/2JJDFHb\n\n► Additional edit versions of this track you can download here: http://bit.ly/2WdRinT (5 versions)\n--------------------- \n\n►DESCRIPTION:\nInspiring Cinematic Uplifting Trailer Background - epic music for trailer video project with powerful drums, energetic orchestra and gentle piano melody. This motivational cinematic theme will work as perfect background for beautiful epic moments, landscapes, nature, drone video, motivational products and achievements.\n--------------------- \n\n► LICENSE:\n● If you need a license for your project, you can purchase it here: \nhttps://1.envato.market/ajicu (Audiojungle)\nhttps://bit.ly/3fWZZuI (Pond5)\n--------------------- \n\n► LISTEN ON:\n● Spotify - https://spoti.fi/2sHm3UH\n● Apple Music - https://apple.co/3qBjbUO\n--------------------- \n\n► SUBSCRIBE FOR MORE: \nPatreon: http://bit.ly/2JJDFHb\nYoutube: http://bit.ly/2AYBzfA\nFacebook: http://bit.ly/2T6dTx5\nInstagram: http://bit.ly/2BHJ8rB\nTwitter: http://bit.ly/2MwtOlT\nSoundCloud: http://bit.ly/2IwVVmt\nAudiojungle: https://1.envato.market/ajrsm\nPond5: https://bit.ly/2TLi1rW\n--------------------- \n►Photo by Vittorio Staffolani from Pexels\n--------------------- \n\nFAQ:\n\n► Can I use this music in my videos? \n● Sure! Just download this track and you are ready to use it! We only ask to credit us. \n-------------------- \n\n► What is \"Creative Commons\"? \nCreative Commons is a system that allows you to legally use “some rights reserved” music, movies, images, and other content — all for free. Licensees may copy, distribute, display and perform the work and make derivative works and remixes based on it only if they give the author or licensor the credits.\n-------------------- \n\n► Will I have any copyright issues with this track?\n● No, you should not have any copyright problems with this track!\n-------------------- \n\n► Is it necessary to become your patron?\n● No it\'s not necessary. But we recommend you to become our patron because you will get access to huge library of music. You will download only highest quality files. You will find additional edited versions of every track. You always be tuned with our news. You will find music not only from Roman Senyk but also from another talented authors.\n-------------------- \n\n► Why I received a copyright claim when I used this track?\n● Do not panic! This is very common situation. Content ID fingerprint system can mismatch our music. Just dispute the claim by showing our original track. Or send us the link to your video (romansenykmusic@gmail.com) and attach some screenshot with claim information. Claim will be released until 24 hours!\n\n► How to credit you in my video?\n● Just add to the description of your project information about Author, Name of Song and the link to our original track. Or copy and paste:\n\nMusic Info: Inspiring Cinematic Uplifting by RomanSenykMusic.\nMusic Link: https://youtu.be/pPvd8UxmSbQ\n--------------------- \n\n► If you have any questions, you can write in the comments for this video or by email: romansenykmusic@gmail.com\n--------------------- \n\nStay tuned! The best is yet to come! \nThanks For Listening!\nRoman Senyk"), duration: 163, thumbnail: [ @@ -25,11 +25,9 @@ VideoPlayer( height: 480, ), ], - channel: ChannelId( - id: "UCbxxEi-ImPlbLx5F-fHetEg", - name: "RomanSenykMusic - Royalty Free Music", - ), - view_count: 426567, + channel_id: "UCbxxEi-ImPlbLx5F-fHetEg", + channel_name: Some("RomanSenykMusic - Royalty Free Music"), + view_count: Some(426567), keywords: [ "no copyright music", "background music", diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tv.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tv.snap new file mode 100644 index 0000000..0fba144 --- /dev/null +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tv.snap @@ -0,0 +1,518 @@ +--- +source: src/client/player.rs +expression: map_res.c +--- +VideoPlayer( + details: VideoPlayerDetails( + id: "pPvd8UxmSbQ", + name: None, + description: None, + duration: 163, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/pPvd8UxmSbQ/hqdefault.jpg", + width: 480, + height: 360, + ), + ], + channel_id: "UCbxxEi-ImPlbLx5F-fHetEg", + channel_name: None, + view_count: None, + keywords: [], + is_live: false, + is_live_content: false, + ), + video_streams: [ + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IT4iUCpJNJWUitTMgIi6njuKSsi3MNed1Szyf0qysTX0v1Nf6AyCvjIGbek5Fn50kuBrGtRJ5q&c=TVHTML5&clen=10262148&dur=163.096&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=18&lmt=1700885551970466&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=BMzwItzIOB1HhmG&ns=YmgbZhlLp0C-9ilsQWGAyUAQ&pl=26&ratebypass=yes&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgUah4qH8RqPzmo75ExCWSiRYlUlsAk0v9gl638LitVNICICxFs5lK3CsmOAja0bsXavXkyykzpdhHZKGXOZQYT1f8&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&svpuc=1&txp=1318224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 18, + bitrate: 503574, + average_bitrate: 503367, + size: Some(10262148), + index_range: None, + init_range: None, + duration_ms: Some(163096), + width: 640, + height: 360, + fps: 30, + quality: "360p", + hdr: false, + mime: "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"", + format: mp4, + codec: avc1, + ), + ], + video_only_streams: [ + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2273274&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=160&keepalive=yes&lmt=1705967288821438&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgb8eXnQ6MSJ3PuvFVBdYIWTnFobH8mTC9zbZpBNxLbBYCICkPLKEm3gNbW5HIFXs7bwF5rSqUKHHnXNK91qMslQog&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 160, + bitrate: 114816, + average_bitrate: 111551, + size: Some(2273274), + index_range: Some(Range( + start: 738, + end: 1165, + )), + init_range: Some(Range( + start: 0, + end: 737, + )), + duration_ms: Some(163029), + width: 256, + height: 144, + fps: 30, + quality: "144p", + hdr: false, + mime: "video/mp4; codecs=\"avc1.4d400c\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=1151892&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=278&keepalive=yes&lmt=1705966620402771&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAP4IybR7cZRpx7IX1ke6UIu_hdFZN3LOuHBDywg_xv5WAiB8_XEx8VhT9OlFxmM-cY0fl6-7GT9uj3clMIPDk2w7cA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 278, + bitrate: 70630, + average_bitrate: 56524, + size: Some(1151892), + index_range: Some(Range( + start: 218, + end: 767, + )), + init_range: Some(Range( + start: 0, + end: 217, + )), + duration_ms: Some(163029), + width: 256, + height: 144, + fps: 30, + quality: "144p", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=5026513&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=133&keepalive=yes&lmt=1705967298859029&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgPF0ms4OEe15BTjOFVCkvf52UeTUf0b62_pavCfEyGjcCIH-0AoxzyT8iioWFFaX7iYjqzzaUTpo8rgAPQ0uX8DJa&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 133, + bitrate: 257417, + average_bitrate: 246656, + size: Some(5026513), + index_range: Some(Range( + start: 739, + end: 1166, + )), + init_range: Some(Range( + start: 0, + end: 738, + )), + duration_ms: Some(163029), + width: 426, + height: 240, + fps: 30, + quality: "240p", + hdr: false, + mime: "video/mp4; codecs=\"avc1.4d4015\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2541351&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=242&keepalive=yes&lmt=1705966614837727&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgKj1JyMGwYtf16zLJsmbnizz5_v3jaZSa7-j-ls8-qzECIQDKUd50iIc52h7zOX50Hf1SkbV9h-hP4QHs-wkik1fk6Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 242, + bitrate: 149589, + average_bitrate: 124706, + size: Some(2541351), + index_range: Some(Range( + start: 219, + end: 768, + )), + init_range: Some(Range( + start: 0, + end: 218, + )), + duration_ms: Some(163029), + width: 426, + height: 240, + fps: 30, + quality: "240p", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=7810925&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=134&keepalive=yes&lmt=1705967286812435&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAJ92IgZgdk3_WLsfzJV_ZyrSFSbzpsoJh3DkRKDHbNxzAiEA9UbnVlXQ2S3BUimLmWC5TZQfhIkc-PlLnZ81fL0S5yA%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 134, + bitrate: 537902, + average_bitrate: 383290, + size: Some(7810925), + index_range: Some(Range( + start: 740, + end: 1167, + )), + init_range: Some(Range( + start: 0, + end: 739, + )), + duration_ms: Some(163029), + width: 640, + height: 360, + fps: 30, + quality: "360p", + hdr: false, + mime: "video/mp4; codecs=\"avc1.4d401e\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=4188954&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=243&keepalive=yes&lmt=1705966624121874&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgSCLGQvdZKNXym0zt7c3Yw_4e0J8-wNxtPagPRRn4dRoCIQCOj0IzalNG4EcowBIyK2LC6NLFDr8Zt6sNVkqPjw6lGg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 243, + bitrate: 248858, + average_bitrate: 205556, + size: Some(4188954), + index_range: Some(Range( + start: 220, + end: 770, + )), + init_range: Some(Range( + start: 0, + end: 219, + )), + duration_ms: Some(163029), + width: 640, + height: 360, + fps: 30, + quality: "360p", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=14723538&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=135&keepalive=yes&lmt=1705967282545273&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAM843wAa1e7Gc1S69gfXckm7hdgIKPXp0bUSh3hO6W5zAiEA-DDEPGsZBmF5N8VbPy75dhy3rLpE1F18KtWgmrUm2Pg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 135, + bitrate: 978945, + average_bitrate: 722499, + size: Some(14723538), + index_range: Some(Range( + start: 740, + end: 1167, + )), + init_range: Some(Range( + start: 0, + end: 739, + )), + duration_ms: Some(163029), + width: 854, + height: 480, + fps: 30, + quality: "480p", + hdr: false, + mime: "video/mp4; codecs=\"avc1.4d401f\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=7788899&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=244&keepalive=yes&lmt=1705966622098793&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAKGyn799bfkVHYE195sPmD60dCMppqJrBM0O-sjgYTzzAiAoBjkNAtL90sXw2YP9UTW9JrMhPSvPiBI_KiCVMJAkFQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 244, + bitrate: 467884, + average_bitrate: 382209, + size: Some(7788899), + index_range: Some(Range( + start: 220, + end: 770, + )), + init_range: Some(Range( + start: 0, + end: 219, + )), + duration_ms: Some(163029), + width: 854, + height: 480, + fps: 30, + quality: "480p", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=24616305&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=136&keepalive=yes&lmt=1705967307531372&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAM57L2Utesn4xVyT0HSwR9Khv_S-efx4uFAbCPkZFoRXAiEAtIu63-jF2_FZkOMmZAqGU3SRU9QgxoajRjBhMFwcOuk%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 136, + bitrate: 1560439, + average_bitrate: 1207947, + size: Some(24616305), + index_range: Some(Range( + start: 739, + end: 1166, + )), + init_range: Some(Range( + start: 0, + end: 738, + )), + duration_ms: Some(163029), + width: 1280, + height: 720, + fps: 30, + quality: "720p", + hdr: false, + mime: "video/mp4; codecs=\"avc1.4d401f\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=34544823&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=298&keepalive=yes&lmt=1705967092637061&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAIIGU41JunuODw9qIlSoYQcwkCYO6k9XOVlDn1Nxqnu7AiEAoiMOgYU8s8lp01fW0L86hHrSrtlvOLSI9XA50iyIGBc%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 298, + bitrate: 2188961, + average_bitrate: 1694973, + size: Some(34544823), + index_range: Some(Range( + start: 739, + end: 1166, + )), + init_range: Some(Range( + start: 0, + end: 738, + )), + duration_ms: Some(163046), + width: 1280, + height: 720, + fps: 60, + quality: "720p60", + hdr: false, + mime: "video/mp4; codecs=\"avc1.4d4020\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=14723992&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=247&keepalive=yes&lmt=1705966613897741&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAL-upITxk7r9FQL5F4WL0A6SjPw673qyyzmXIC48eKfTAiEAlkdkx7IFYtehbhKakbffvIebpPXRtxSgBWLl7WEHCrE%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 247, + bitrate: 929607, + average_bitrate: 722521, + size: Some(14723992), + index_range: Some(Range( + start: 220, + end: 770, + )), + init_range: Some(Range( + start: 0, + end: 219, + )), + duration_ms: Some(163029), + width: 1280, + height: 720, + fps: 30, + quality: "720p", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=30205331&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=302&keepalive=yes&lmt=1705966545733919&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAL428Az_BKxxff4FlH4WleHSy4Igq3mR71NuTMOc9xU3AiBN4lXfH9DklGaQUMnOT8wAhiMuzR73bW3cwr744TSoNA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 302, + bitrate: 2250391, + average_bitrate: 1482051, + size: Some(30205331), + index_range: Some(Range( + start: 219, + end: 786, + )), + init_range: Some(Range( + start: 0, + end: 218, + )), + duration_ms: Some(163046), + width: 1280, + height: 720, + fps: 60, + quality: "720p60", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=62057888&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=299&keepalive=yes&lmt=1705967093743693&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgBEemc0Cvd3KhNooNRblgX64_fjNSP30RmWDfFwDR7qYCIQCXpQ9FO0_X93ZHcyvRZCKX5gbJuusCReaRcJbRLFsM_g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 299, + bitrate: 3926810, + average_bitrate: 3044926, + size: Some(62057888), + index_range: Some(Range( + start: 740, + end: 1167, + )), + init_range: Some(Range( + start: 0, + end: 739, + )), + duration_ms: Some(163046), + width: 1920, + height: 1080, + fps: 60, + quality: "1080p60", + hdr: false, + mime: "video/mp4; codecs=\"avc1.64002a\"", + format: mp4, + codec: avc1, + ), + VideoStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=55300085&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=303&keepalive=yes&lmt=1705966651743358&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgTZlmOcsLYJ_a9SnVLehXnaoajtreQO97qawEIDPEi8sCIQDKFdtBWWMuQUb9X8H-x92B3q-y0g8TvAPanR95cfklXQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 303, + bitrate: 3473307, + average_bitrate: 2713348, + size: Some(55300085), + index_range: Some(Range( + start: 219, + end: 792, + )), + init_range: Some(Range( + start: 0, + end: 218, + )), + duration_ms: Some(163046), + width: 1920, + height: 1080, + fps: 60, + quality: "1080p60", + hdr: false, + mime: "video/webm; codecs=\"vp9\"", + format: webm, + codec: vp9, + ), + ], + audio_streams: [ + AudioStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=934750&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=249&keepalive=yes&lmt=1714877357172339&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAItfaWkRs94vqyae7GR4M1xHoQO2lduvNRFugRSf0h-IAiA9fdLOJMwPI8vAO2C13igyv2qGSpOlKQptS4sN6p5Ffw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 249, + bitrate: 53073, + average_bitrate: 45860, + size: 934750, + index_range: Some(Range( + start: 266, + end: 551, + )), + init_range: Some(Range( + start: 0, + end: 265, + )), + duration_ms: Some(163061), + mime: "audio/webm; codecs=\"opus\"", + format: webm, + codec: opus, + channels: Some(2), + loudness_db: Some(5.21), + track: None, + ), + AudioStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=1245582&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=250&keepalive=yes&lmt=1714877466693058&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgdJ1SjWwaloQecEblSIMFp2qFmpG_kKYZP1vX_M55dE0CIQCDSfa_FsaiFRcNL-1LRTgCIRSO7dj5vrpKR1Ya-KbmMw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 250, + bitrate: 71197, + average_bitrate: 61109, + size: 1245582, + index_range: Some(Range( + start: 266, + end: 551, + )), + init_range: Some(Range( + start: 0, + end: 265, + )), + duration_ms: Some(163061), + mime: "audio/webm; codecs=\"opus\"", + format: webm, + codec: opus, + channels: Some(2), + loudness_db: Some(5.21), + track: None, + ), + AudioStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2640283&dur=163.096&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=140&keepalive=yes&lmt=1705966477945761&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgSxdbLrbojMVJcyRzsI2TrzOf78LN28bWcsHpbs4QXDwCIHidfXoriWMHfuiktUCdzLuUmksU7r5vITdh6u0puNmx&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 140, + bitrate: 130268, + average_bitrate: 129508, + size: 2640283, + index_range: Some(Range( + start: 632, + end: 867, + )), + init_range: Some(Range( + start: 0, + end: 631, + )), + duration_ms: Some(163096), + mime: "audio/mp4; codecs=\"mp4a.40.2\"", + format: m4a, + codec: mp4a, + channels: Some(2), + loudness_db: Some(5.2200003), + track: None, + ), + AudioStream( + url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2480393&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=251&keepalive=yes&lmt=1714877359450110&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgO0jG-x2l6AF7tjryIX_oM3np78WgNDiseezppLfbQrgCIQCVLdpDhclKc8vQgWGzKXcqsAxgNl5S3MlLT8u1Jeok2A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D", + itag: 251, + bitrate: 140833, + average_bitrate: 121691, + size: 2480393, + index_range: Some(Range( + start: 266, + end: 551, + )), + init_range: Some(Range( + start: 0, + end: 265, + )), + duration_ms: Some(163061), + mime: "audio/webm; codecs=\"opus\"", + format: webm, + codec: opus, + channels: Some(2), + loudness_db: Some(5.21), + track: None, + ), + ], + subtitles: [ + Subtitle( + url: "https://www.youtube.com/api/timedtext?v=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&caps=asr&opi=112496729&exp=xbt&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1722321710&sparams=ip,ipbits,expire,v,ei,caps,opi,exp,xoaf&signature=7B002D0C2B79781E0E46F374D5BB53C6059A5252.E7B05ECC8D799DB96F3C21B727A0161E0032CDFA&key=yt8&lang=en", + lang: "en", + lang_name: "English", + auto_generated: false, + ), + ], + expires_in_seconds: 21540, + hls_manifest_url: None, + dash_manifest_url: None, + preview_frames: [ + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCsCT8Lprh2S0ptmCRsWH7VtDl3YQ", + frame_width: 48, + frame_height: 27, + page_count: 1, + total_count: 100, + duration_per_frame: 0, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L1/M$M.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLBXrdgfuYV1WLnTGXqZtSAUm8oZCA", + frame_width: 80, + frame_height: 45, + page_count: 1, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L2/M$M.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCRazj84zMuwJLaCCc_PiUakX_YdQ", + frame_width: 160, + frame_height: 90, + page_count: 4, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 5, + frames_per_page_y: 5, + ), + ], + client_type: tv, + visitor_data: Some("CgtrbXRsWU4wUEtXbyi-0aC1BjIKCgJERRIEEgAgZg%3D%3D"), +) diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap index ee018d8..0edfbfa 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap @@ -5,7 +5,7 @@ expression: map_res.c VideoPlayer( details: VideoPlayerDetails( id: "pPvd8UxmSbQ", - name: "Inspiring Cinematic Uplifting (Creative Commons)", + name: Some("Inspiring Cinematic Uplifting (Creative Commons)"), description: Some("► Download Music: http://bit.ly/2QLufeh\nImportant to know! You can download this track for free through Patreon. You will pay only for new tracks! So join others and let\'s make next track together!\n\n► MORE MUSIC: Become my patron and get access to all our music from Patreon library. More Info here: http://bit.ly/2JJDFHb\n\n► Additional edit versions of this track you can download here: http://bit.ly/2WdRinT (5 versions)\n--------------------- \n\n►DESCRIPTION:\nInspiring Cinematic Uplifting Trailer Background - epic music for trailer video project with powerful drums, energetic orchestra and gentle piano melody. This motivational cinematic theme will work as perfect background for beautiful epic moments, landscapes, nature, drone video, motivational products and achievements.\n--------------------- \n\n► LICENSE:\n● If you need a license for your project, you can purchase it here: \nhttps://1.envato.market/ajicu (Audiojungle)\nhttps://bit.ly/3fWZZuI (Pond5)\n--------------------- \n\n► LISTEN ON:\n● Spotify - https://spoti.fi/2sHm3UH\n● Apple Music - https://apple.co/3qBjbUO\n--------------------- \n\n► SUBSCRIBE FOR MORE: \nPatreon: http://bit.ly/2JJDFHb\nYoutube: http://bit.ly/2AYBzfA\nFacebook: http://bit.ly/2T6dTx5\nInstagram: http://bit.ly/2BHJ8rB\nTwitter: http://bit.ly/2MwtOlT\nSoundCloud: http://bit.ly/2IwVVmt\nAudiojungle: https://1.envato.market/ajrsm\nPond5: https://bit.ly/2TLi1rW\n--------------------- \n►Photo by Vittorio Staffolani from Pexels\n--------------------- \n\nFAQ:\n\n► Can I use this music in my videos? \n● Sure! Just download this track and you are ready to use it! We only ask to credit us. \n-------------------- \n\n► What is \"Creative Commons\"? \nCreative Commons is a system that allows you to legally use “some rights reserved” music, movies, images, and other content — all for free. Licensees may copy, distribute, display and perform the work and make derivative works and remixes based on it only if they give the author or licensor the credits.\n-------------------- \n\n► Will I have any copyright issues with this track?\n● No, you should not have any copyright problems with this track!\n-------------------- \n\n► Is it necessary to become your patron?\n● No it\'s not necessary. But we recommend you to become our patron because you will get access to huge library of music. You will download only highest quality files. You will find additional edited versions of every track. You always be tuned with our news. You will find music not only from Roman Senyk but also from another talented authors.\n-------------------- \n\n► Why I received a copyright claim when I used this track?\n● Do not panic! This is very common situation. Content ID fingerprint system can mismatch our music. Just dispute the claim by showing our original track. Or send us the link to your video (romansenykmusic@gmail.com) and attach some screenshot with claim information. Claim will be released until 24 hours!\n\n► How to credit you in my video?\n● Just add to the description of your project information about Author, Name of Song and the link to our original track. Or copy and paste:\n\nMusic Info: Inspiring Cinematic Uplifting by RomanSenykMusic.\nMusic Link: https://youtu.be/pPvd8UxmSbQ\n--------------------- \n\n► If you have any questions, you can write in the comments for this video or by email: romansenykmusic@gmail.com\n--------------------- \n\nStay tuned! The best is yet to come! \nThanks For Listening!\nRoman Senyk"), duration: 163, thumbnail: [ @@ -35,11 +35,9 @@ VideoPlayer( height: 1080, ), ], - channel: ChannelId( - id: "UCbxxEi-ImPlbLx5F-fHetEg", - name: "RomanSenykMusic - Royalty Free Music", - ), - view_count: 426567, + channel_id: "UCbxxEi-ImPlbLx5F-fHetEg", + channel_name: Some("RomanSenykMusic - Royalty Free Music"), + view_count: Some(426567), keywords: [ "no copyright music", "background music", diff --git a/src/model/mod.rs b/src/model/mod.rs index 99744ec..e54ab60 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -156,7 +156,7 @@ pub struct VideoPlayerDetails { /// Unique YouTube video ID pub id: String, /// Video title - pub name: String, + pub name: Option, /// Video description in plaintext format pub description: Option, /// Video duration in seconds @@ -165,10 +165,12 @@ pub struct VideoPlayerDetails { pub duration: u32, /// Video thumbnail pub thumbnail: Vec, - /// Channel of the video - pub channel: ChannelId, + /// Channel ID of the video + pub channel_id: String, + /// Channel name of the video + pub channel_name: Option, /// Number of views / current viewers in case of a livestream. - pub view_count: u64, + pub view_count: Option, /// List of words that describe the topic of the video pub keywords: Vec, /// True if the video is an active livestream diff --git a/src/model/traits.rs b/src/model/traits.rs index e493f4f..950de5d 100644 --- a/src/model/traits.rs +++ b/src/model/traits.rs @@ -233,6 +233,7 @@ macro_rules! yt_entity_owner_music { }; } +/* impl YtEntity for VideoPlayer { fn id(&self) -> &str { &self.details.id @@ -243,14 +244,33 @@ impl YtEntity for VideoPlayer { } fn channel_id(&self) -> Option<&str> { - Some(&self.details.channel.id) + Some(&self.details.channel_id) } fn channel_name(&self) -> Option<&str> { - Some(&self.details.channel.name) + self.details.channel_name.as_deref() } } +impl YtEntity for VideoPlayerDetails { + fn id(&self) -> &str { + &self.channel_id + } + + fn name(&self) -> &str { + &self.name + } + + fn channel_id(&self) -> Option<&str> { + Some(&self.channel_id) + } + + fn channel_name(&self) -> Option<&str> { + self.channel_name.as_deref() + } +} +*/ + impl YtEntity for Channel { fn id(&self) -> &str { &self.id @@ -269,7 +289,6 @@ impl YtEntity for Channel { } } -yt_entity_owner! {VideoPlayerDetails} yt_entity_owner_opt! {Playlist} yt_entity! {ChannelId} yt_entity_owner! {VideoDetails} diff --git a/testfiles/player/tv_video.json b/testfiles/player/tv_video.json new file mode 100644 index 0000000..d50167b --- /dev/null +++ b/testfiles/player/tv_video.json @@ -0,0 +1,3150 @@ +{ + "adBreakHeartbeatParams": "Q0FBJTNE", + "adPlacements": [ + { + "adPlacementRenderer": { + "adSlotLoggingData": { + "serializedSlotAdServingDataEntry": "ChMIhK_hvbbNhwMV4mxBAh1Ajg-_Gh8Y____________AVgDYhBYbUZTaGNKbXg2SWFhT0tZ" + }, + "config": { + "adPlacementConfig": { + "adTimeOffset": { + "offsetEndMilliseconds": "-1", + "offsetStartMilliseconds": "-1" + }, + "hideCueRangeMarker": false, + "kind": "AD_PLACEMENT_KIND_END" + } + }, + "renderer": { + "adBreakServiceRenderer": { + "getAdBreakUrl": "https://www.youtube.com/get_midroll_info?ei=viioZtTdKteHi9oPl42KsAg&m_pos=-1&token=AOmNmeXu52UnUG2QWIKbTcSU5IN7aRqAD7AnsGputWN5MjijreEB0a3_FqdUUcqrujBE8UFbNhaOeTK0_Cl0Ijyx4zKw2_wJ9lJUtspoyG47zJMGQ6-Xp3xepASy8pa2BmjiETHWLiDCsI1Vji3p7ag3Ofz8nfqwdPVn_tarHzGQk2iTVmkcg-nIWjHX-_LH7iiTjRyOtlPwKmbzkJ5BoYA4pb1_pUk04oVMIoxOYmBS1VqMtpUfeNV4gL4yTNsNRHMHAqXx-oBArC6hDp-Xd-mawCeCaEMmAZHUf-LG7wYT9Brd33MqT3lx6UvIgX3deBnYZbvWpkYjMKea6Kdxwis5QLKUkEnCjw&index=1&cpn=[CPN]&lact=[LACT]&vis=[VIS]&ad_block=[AD_BLOCK]&tsla=[TSLA]&bid=[BISCOTTI_ID]&dt=[DT]&flash=[FLASH]&frm=[FRM]&ca_type=[CA_TYPE]&u_tz=[U_TZ]&u_his=[U_HIS]&u_java=[U_JAVA]&u_h=[U_H]&u_w=[U_W]&u_ah=[U_AH]&u_aw=[U_AW]&u_cd=[U_CD]&u_nplug=[U_NPLUG]&u_nmime=[U_NMIME]&p_w=[P_W]&p_h=[P_H]&c=TVHTML5&cver=7.20240724.13.00&m_pos_ms=-1", + "prefetchMilliseconds": "10000" + } + } + } + } + ], + "adSlots": [ + { + "adSlotRenderer": { + "adSlotMetadata": { + "adSlotLoggingData": { + "serializedSlotAdServingDataEntry": "ChMIhK_hvbbNhwMV4mxBAh1Ajg-_GhgQAUgBWAFiEGhZaXp6VWxTSHZwVW5aVGU=" + }, + "slotId": "hYizzUlSHvpUnZTe", + "slotType": "SLOT_TYPE_PLAYER_BYTES", + "triggerEvent": "SLOT_TRIGGER_EVENT_BEFORE_CONTENT" + }, + "fulfillmentContent": { + "fulfilledLayout": { + "playerBytesAdLayoutRenderer": { + "adLayoutMetadata": { + "adLayoutLoggingData": { + "serializedAdServingDataEntry": "IBAwAjgGShMIhK_hvbbNhwMV4mxBAh1Ajg-_UgYQAUgBWAFoAXAs" + }, + "layoutId": "qLYvxrzZ3iSfwRkS", + "layoutType": "LAYOUT_TYPE_MEDIA" + }, + "layoutExitMuteTriggers": [ + { + "id": "67c0ba89-0000-2697-a1b9-14223bb5ae26", + "skipRequestedTrigger": { + "triggeringLayoutId": "bj8kp31ew2buiJZs" + } + } + ], + "layoutExitNormalTriggers": [ + { + "id": "67c0ba88-0000-2697-a1b9-14223bb5ae26", + "onLayoutSelfExitRequestedTrigger": { + "triggeringLayoutId": "qLYvxrzZ3iSfwRkS" + } + } + ], + "renderingContent": { + "instreamVideoAdRenderer": { + "adLayoutLoggingData": { + "serializedAdServingDataEntry": "IBAwAjgGShMIhK_hvbbNhwMV4mxBAh1Ajg-_UgYQAUgBWAFoAXAs" + }, + "csiParameters": [ + { + "key": "ad_at", + "value": "15_2" + } + ], + "elementId": "qLYvxrzZ3iSfwRkS", + "externalVideoId": "1AurP5pjb6Y", + "layoutId": "qLYvxrzZ3iSfwRkS", + "pings": { + "abandonPings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=video_abandon&ad_mt=%5BAD_MT%5D&ad_tos=%5BAD_TOS%5D&ad_wat=%5BAD_WAT%5D&final=%5BFINAL%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=22;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q;dc_oe=CgwIABUAAAAAHQAAAABIAFjddWiB9LK-AYIBNAoMCAAVAAAAAB0AAAAAEgwIABUAAAAAHQAAAAAiFAjyk8fwT6gCprCUmwOwAsfXjeUDQDuKAYoBaHR0cHM6Ly93d3cuYW1hem9uLmRlL3N0b3Jlcy9wYWdlLzk1NEFFNzAxLUZDOUEtNDUyRi1BQjUzLTg3QzNBNUVGNkU0OT9pbmdyZXNzPTImdmlzaXRJZD1hM2Y5YjYwOS0yOTdhLTQ1MDktOTA2ZS1kNjQ5ZmI4YTUwMjImcmVmXz1hc3RfYmxu?" + } + ], + "activeViewFullyViewableAudibleHalfDurationPings": [ + { + "baseUrl": "https://www.youtube.com/pcs/activeview?xai=AKAOjsuYvygzKdiimSKQnMRy2Y1aBUXaMkl9VlWBeRBhjHMe4hRGx3l1u1Lhk6PgQ7ucL6KC3uNKqeGQ1DX-BZZn5VFfxI86UlbnIcJn2sQRGSTU_CQcLbjM6pXKCFJaiIYptF8obGu3d4HPZaAheJsqM6gTdMqhbQDZ0Q&sig=Cg0ArKJSzC1Qew4CuMi_EAE&ad_cpn=%5BAD_CPN%5D&id=lidarv&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D&avgm=1" + }, + { + "baseUrl": "https://pagead2.googlesyndication.com/activeview_ext?id=lidarv&dc_pubid=2&dc_exteid=6023305135921294682&acvw=[VIEWABILITY]&gv=[GOOGLE_VIEWABILITY]&dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q&" + } + ], + "activeViewMeasurablePings": [ + { + "baseUrl": "https://www.youtube.com/pcs/activeview?xai=AKAOjsuYvygzKdiimSKQnMRy2Y1aBUXaMkl9VlWBeRBhjHMe4hRGx3l1u1Lhk6PgQ7ucL6KC3uNKqeGQ1DX-BZZn5VFfxI86UlbnIcJn2sQRGSTU_CQcLbjM6pXKCFJaiIYptF8obGu3d4HPZaAheJsqM6gTdMqhbQDZ0Q&sig=Cg0ArKJSzC1Qew4CuMi_EAE&ad_cpn=%5BAD_CPN%5D&id=lidarv&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D&avm=1" + }, + { + "baseUrl": "https://pagead2.googlesyndication.com/activeview_ext?id=lidarv&avm=1&dc_pubid=2&dc_exteid=6023305135921294682&acvw=[VIEWABILITY]&gv=[GOOGLE_VIEWABILITY]&dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q&" + } + ], + "activeViewTracking": { + "identifier": "2fdb9672-b24d-44e7-89dd-bb2380d0102e", + "trafficType": "ACTIVE_VIEW_TRAFFIC_TYPE_VIDEO" + }, + "activeViewViewablePings": [ + { + "baseUrl": "https://www.youtube.com/pcs/activeview?xai=AKAOjsuYvygzKdiimSKQnMRy2Y1aBUXaMkl9VlWBeRBhjHMe4hRGx3l1u1Lhk6PgQ7ucL6KC3uNKqeGQ1DX-BZZn5VFfxI86UlbnIcJn2sQRGSTU_CQcLbjM6pXKCFJaiIYptF8obGu3d4HPZaAheJsqM6gTdMqhbQDZ0Q&sig=Cg0ArKJSzC1Qew4CuMi_EAE&ad_cpn=%5BAD_CPN%5D&id=lidarv&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://pagead2.googlesyndication.com/activeview_ext?id=lidarv&dc_pubid=2&dc_exteid=6023305135921294682&acvw=[VIEWABILITY]&gv=[GOOGLE_VIEWABILITY]&dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q&" + } + ], + "clickthroughPings": [ + { + "baseUrl": "https://ad.doubleclick.net/ddm/trackclk/N1633547.2503905DBM-YOUTUBE/B32141750.399292929;dc_trk_aid=590851777;dc_trk_cid=217560393;dc_dbm_token=ALenVzUAAAA8CjQKDAgAFQAAAAAdAAAAABIMCAAVAAAAAB0AAAAAIhQI8pPH8E-oAqawlJsDsALH143lA0A7EPnOvZADLdvaf_mHXQGCW8FGOebj0Q==;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;ltd=;dc_tdv=1;dc_transparent=1;;ord=2078724836;dc_rui=1;dc_exteid=6219084455947688155;dc_av=0;dc_sk=0;dc_ctype=87;dc_eps=AHas8cByi8LQENSFYgdLQE02cdpUD8KkvsaR7gAU972qS_vYdcDWHOUHOoAWME2uq_nIE9dGk4G_lUNrC7l3D7xTFA;dc_pubid=2;dc_btype=3?gclid=EAIaIQobChMIhK_hvbbNhwMV4mxBAh1Ajg-_EAEYASAAEgJsmvD_BwE" + } + ], + "closePings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=adclose&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + } + ], + "completePings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=videoplaytime100&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=13;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q;dc_oe=CgwIABUAAAAAHQAAAABIAFjddWiB9LK-AYIBNAoMCAAVAAAAAB0AAAAAEgwIABUAAAAAHQAAAAAiFAjyk8fwT6gCprCUmwOwAsfXjeUDQDuKAYoBaHR0cHM6Ly93d3cuYW1hem9uLmRlL3N0b3Jlcy9wYWdlLzk1NEFFNzAxLUZDOUEtNDUyRi1BQjUzLTg3QzNBNUVGNkU0OT9pbmdyZXNzPTImdmlzaXRJZD1hM2Y5YjYwOS0yOTdhLTQ1MDktOTA2ZS1kNjQ5ZmI4YTUwMjImcmVmXz1hc3RfYmxu?" + } + ], + "errorPings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=videoplayfailed%5BERRORCODE%5D" + } + ], + "firstQuartilePings": [ + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=960584;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "fullscreenPings": [ + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=19;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "impressionPings": [ + { + "baseUrl": "https://ad.doubleclick.net/ddm/trackimp/N1633547.2503905DBM-YOUTUBE/B32141750.399292929;dc_trk_aid=590851777;dc_trk_cid=217560393;dc_dbm_token=ALenVzUAAAA8CjQKDAgAFQAAAAAdAAAAABIMCAAVAAAAAB0AAAAAIhQI8pPH8E-oAqawlJsDsALH143lA0A7EPnOvZADLdvaf_mHXQGCW8FGOebj0Q==;ord=1584798438;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;ltd=;dc_tdv=1;dc_rui=1;dc_exteid=6023305135921294682;dc_av=536;dc_sk=0;dc_ctype=87;dc_ref=http://www.youtube.com/video/pPvd8UxmSbQ;dc_eps=AHas8cByi8LQENSFYgdLQE02cdpUD8KkvsaR7gAU972qS_vYdcDWHOUHOoAWME2uq_nIE9dGk4G_lUNrC7l3D7xTFA;dc_pubid=2;dc_btype=23?gclid=EAIaIQobChMIhK_hvbbNhwMV4mxBAh1Ajg-_EAEYASAAEgJsmvD_BwE" + }, + { + "baseUrl": "https://www.youtube.com/pagead/adview?ai=CSODsviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEogNP0EGoGWEphKm2zAXuMFqKT-k5rj_lTq_4eqLXXh_fNB42OSq6scXOPRfDCe932D2dJxReIkY3y3mWs162f6lCoX0EhM3MNFywuPDXy8eWyatBkocJ-a3y9A-_WINkovnP-kxvVh-EpSXzSEVJIBKTjZ_sRmEnGmAv_sNHw2_9O8viQpFUa3ylJHFHmOVPPienp-3r4hNx1Evp3oMsDRq53GFTkFuKSXYREj2kKoHSZQ9r8Q_Zkqlx9GrmyB0EGYa_QP0jnnucYWCTWgouUab7FqeGTWv6969-YbFtfQ4bZjrRXD0N_pgmpjHDZFF95ltCgoTdfk3hf4kBq5ESC_I47_oVM-oLLvedgKuiVglXztxuIDIQF64nA4jZAXBtTuBg72L4C5HyROwUIKf6lwpmqC0FETCPrw1Pbv3H0N7XMVSjnVzw-CpNyHmJIrFbrz7F5cGuAYObSFdv0jU2s8fG0kSB1oERHOQCwGhyviuffgTSq3SYxy51vNiNGPiuZFLeY5tDuxFjmUF6o1liaOrDbarOMGcrlXBGrYxqO3IPS7ZrwAS_yJbw4ASIBfKTx_BPkgUECAMQBKAGV9gGBYAHjNzimAOQBwSoB-u2sQKoB_mxsQKoB4C6sQKoB-edsQKoB-idsQKoB-q3sQKoB6e1sQKoB--1sQKoB_C1sQKoB4KqsQKoB4QIqAeo0huoB7YHqAekmrECqAeRn7ECqAewm7ECqAeusbECqAfmvLECqAemqrECqAfmt7ECqAfKurECqAfswLECqAf9srECqAf3uLECqAf4uLECqAfbxbECqAeBxhuoB_yvsQKoB6vFG6gH49kbqAe3qbECqAeXurECqAfpq7ECkggLMUF1clA1cGpiNlnSCDAIgMGAEBABGF4yB6KCgOCfgA06DIDCgICAEICAgICAEEjZoNI1UBRY8P7gvbbNhwPyCB9jYS15dC1ob3N0LXB1Yi05MzQ4MTA1NjA1NTM1MzM0yAkZyAmxAaELwVo0H77w5FC6C0YIARABGAYgAigBMBBAB0gBYABoAHABiAEAmAEBogESCgAYACAAWAFgAHABqAIE2AIBqAEB2AEDgAIBiAIHqAIAtQKhdL5CsBO73bcYuBP___________8BsBQBwBWJgIBAkBYBqBYBihcYCAMYASABKAEwATgBQAFIAVABWAFgAnABoBcBuhcEKAAwANIXCRIC4k4YVyIBAA&sigh=RT6riC-jhQI&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&ad_cpn=%5BAD_CPN%5D&lact=%5BLACT%5D" + }, + { + "baseUrl": "https://www.youtube.com/api/stats/ads?ver=2&ns=1&event=2&device=7&content_v=pPvd8UxmSbQ&el=leanback&ei=viioZtTdKteHi9oPl42KsAg&devicever=7.20240724.13.00&bti=16047576&format=15_2_0&break_type=1&conn=[CONN]&cpn=[CPN]&lact=[LACT]&m_pos=0&mt=[MT]&p_h=[P_H]&p_w=[P_W]&rwt=[RWT]&sdkv=h.3.0.0&slot_pos=0&vis=[VIS]&vol=[VOL]&wt=[WT]&ad_cpn=[AD_CPN]&ad_id=%2C642615623253&ad_len=15000&ad_mt=[AD_MT]&ad_sys=YT%3AAdSense-Viral%2CAdSense-Viral&ad_v=1AurP5pjb6Y&aqi=viioZoTYLOLZhcIPwJy--As&ad_rmp=1&sli=1&slfs=1&loginael=1" + } + ], + "mutePings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=admute&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=16;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "pausePings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=adpause&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=15;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "resumePings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=adresume&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=17;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "rewindPings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=adrewind&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + } + ], + "secondQuartilePings": [ + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=18;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "startPings": [ + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=11;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "thirdQuartilePings": [ + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=960585;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ], + "unmutePings": [ + { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=adunmute&ad_mt=%5BAD_MT%5D&acvw=%5BVIEWABILITY%5D&gv=%5BGOOGLE_VIEWABILITY%5D" + }, + { + "baseUrl": "https://ade.googlesyndication.com/ddm/activity_ext/dc_pubid=2;dc_exteid=6023305135921294682;met=1;ecn1=1;etm1=0;eid1=149645;acvw=[VIEWABILITY];gv=[GOOGLE_VIEWABILITY];dc_eps=AHas8cCjm-RBWPebucHZvU1e-tGArdH0XoHBQYENAX3Vl_wAXLRA3Tepms5-odM4CZvmICkeg-q4ZbKHOPy80OIz6Q?" + } + ] + }, + "playerVars": "suppress_creator_endscreen=1&is_trueview_action=1&length_seconds=15&video_id=1AurP5pjb6Y&encoded_ad_playback_context=CA8QAioLcFB2ZDhVeG1TYlFCF3ZpaW9ab1RZTE9MWmhjSVB3SnktLUFzYAF1yvVwP4ABmHWKAycgEDACOAZKEwiEr-G9ts2HAxXibEECHUCOD79SBhABSAFYAWgBcCyQA9X8gPfZEg%253D%253D&ad_query_id=viioZoTYLOLZhcIPwJy--As&break_type=1&adformat=15_2&player_response=%7B%22responseContext%22%3A%7B%22serviceTrackingParams%22%3A%5B%7B%22service%22%3A%22GFEEDBACK%22%2C%22params%22%3A%5B%7B%22key%22%3A%22ipcc%22%2C%22value%22%3A%220%22%7D%2C%7B%22key%22%3A%22is_alc_surface%22%2C%22value%22%3A%22false%22%7D%2C%7B%22key%22%3A%22is_viewed_live%22%2C%22value%22%3A%22False%22%7D%2C%7B%22key%22%3A%22logged_in%22%2C%22value%22%3A%220%22%7D%2C%7B%22key%22%3A%22e%22%2C%22value%22%3A%229405981%2C23804281%2C23885487%2C23943651%2C23946420%2C23966208%2C23998056%2C24004644%2C24077241%2C24166867%2C24181174%2C24241378%2C24290971%2C24299875%2C24378828%2C24439361%2C24456089%2C24468724%2C24542367%2C24548629%2C24566687%2C39326848%2C39326916%2C51009781%2C51010235%2C51016856%2C51017346%2C51020570%2C51025415%2C51030101%2C51037342%2C51037351%2C51041512%2C51043998%2C51050361%2C51053689%2C51057842%2C51057855%2C51060353%2C51063643%2C51064835%2C51089007%2C51091331%2C51098297%2C51098299%2C51101049%2C51107657%2C51111738%2C51113658%2C51113661%2C51114642%2C51115164%2C51115184%2C51116067%2C51124104%2C51131427%2C51133103%2C51138233%2C51139379%2C51140712%2C51144925%2C51146484%2C51148688%2C51149607%2C51152050%2C51153492%2C51157838%2C51158470%2C51158514%2C51160545%2C51162170%2C51163637%2C51165467%2C51165568%2C51169118%2C51172672%2C51172686%2C51172691%2C51172700%2C51172709%2C51172714%2C51172721%2C51172730%2C51174143%2C51176511%2C51176608%2C51177818%2C51178312%2C51178327%2C51178340%2C51178770%2C51178982%2C51182274%2C51183909%2C51184022%2C51189826%2C51190057%2C51190075%2C51190078%2C51190085%2C51190200%2C51190211%2C51190220%2C51190229%2C51190652%2C51191447%2C51193717%2C51195231%2C51196181%2C51196808%2C51197687%2C51197690%2C51197697%2C51197704%2C51199193%2C51200251%2C51200260%2C51200293%2C51200298%2C51200569%2C51201352%2C51201365%2C51201372%2C51201383%2C51201430%2C51201435%2C51201440%2C51201449%2C51203200%2C51204329%2C51207176%2C51207193%2C51207200%2C51207207%2C51209049%2C51209172%2C51211864%2C51212456%2C51212466%2C51212555%2C51212571%2C51213807%2C51217274%2C51217504%2C51217581%2C51217769%2C51219800%2C51221011%2C51221152%2C51223962%2C51224747%2C51227263%2C51227776%2C51227881%2C51228202%2C51228349%2C51228352%2C51228765%2C51228774%2C51228781%2C51228796%2C51228803%2C51228812%2C51230478%2C51230492%2C51231813%2C51231864%2C51231866%2C51234844%2C51234852%2C51236017%2C51236253%2C51236268%2C51237841%2C51238486%2C51238569%2C51238737%2C51240629%2C51241028%2C51241600%2C51242448%2C51243941%2C51245246%2C51246266%2C51246283%2C51246303%2C51246799%2C51248255%2C51251436%2C51251509%2C51251850%22%7D%5D%7D%5D%2C%22maxAgeSeconds%22%3A0%7D%2C%22playabilityStatus%22%3A%7B%22status%22%3A%22OK%22%2C%22playableInEmbed%22%3Atrue%2C%22audioOnlyPlayability%22%3A%7B%22audioOnlyPlayabilityRenderer%22%3A%7B%22trackingParams%22%3A%22CAEQx2kiEwjcs%2B69ts2HAxXXw0IFHZeGAoY%3D%22%2C%22audioOnlyAvailability%22%3A%22FEATURE_AVAILABILITY_ALLOWED%22%7D%7D%2C%22miniplayer%22%3A%7B%22miniplayerRenderer%22%3A%7B%22playbackMode%22%3A%22PLAYBACK_MODE_ALLOW%22%7D%7D%2C%22contextParams%22%3A%22Q0FFU0FnZ0M%3D%22%7D%2C%22streamingData%22%3A%7B%22expiresInSeconds%22%3A21540%2C%22formats%22%3A%5B%7B%22itag%22%3A18%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D18%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671KHzb3hO4uznBYBETdQ0H1xPZ0ZRglmege7YqK22FHIVy5-9oNthvQ9_X5ZKBgVtRDhXEP-efX2%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3Dnd9nu0LM8JtDtlAo0brMUq0Q%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D729606%5Cu0026ratebypass%3Dyes%5Cu0026dur%3D15.069%5Cu0026lmt%3D1721310031613233%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5538434%5Cu0026n%3D83oaZkedBcQRjpu6p%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cratebypass%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRAIgRuKD4nbfQAcvF2lLtrzeXfZFPBqAUJ0pOEI8Uub1DOUCIGde1H0ZenNoU2mJ7cIXETDJkLxgF_rzJzlxvj2FLISX%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.42001E%2C+mp4a.40.2%5C%22%22%2C%22bitrate%22%3A388734%2C%22width%22%3A640%2C%22height%22%3A360%2C%22lastModified%22%3A1721310031613233%2C%22contentLength%22%3A729606%2C%22quality%22%3A%22medium%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22360p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A387341%2C%22audioQuality%22%3A%22AUDIO_QUALITY_LOW%22%2C%22approxDurationMs%22%3A15069%2C%22audioSampleRate%22%3A44100%2C%22audioChannels%22%3A2%7D%5D%2C%22adaptiveFormats%22%3A%5B%7B%22itag%22%3A137%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D137%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D2036683%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310625305104%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgBWAZWGfJLItDzAVtH7IsesaEKBs2kQx64EFnZ2r0r-ECIQCTXLR0Lcyb_eqo8EOOK7l8QoJpJa86E6E96Agmt2vevQ%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.640028%5C%22%22%2C%22bitrate%22%3A1380057%2C%22width%22%3A1920%2C%22height%22%3A1080%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A740%7D%2C%22indexRange%22%3A%7B%22start%22%3A741%2C%22end%22%3A808%7D%2C%22lastModified%22%3A1721310625305104%2C%22contentLength%22%3A2036683%2C%22quality%22%3A%22hd1080%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%221080p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A1085218%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A248%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D248%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D1410200%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721311087081599%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhALcFwvWdas7LGYcSS0Ii9MsWBQDKBTUelgrYG40GEMpQAiA0ZoK4Ts3GHtqotxhhGA6cuXXQtVUFZXkjB6KXrNZmWw%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fwebm%3B+codecs%3D%5C%22vp9%5C%22%22%2C%22bitrate%22%3A963122%2C%22width%22%3A1920%2C%22height%22%3A1080%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A218%7D%2C%22indexRange%22%3A%7B%22start%22%3A219%2C%22end%22%3A268%7D%2C%22lastModified%22%3A1721311087081599%2C%22contentLength%22%3A1410200%2C%22quality%22%3A%22hd1080%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%221080p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A751405%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A399%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D399%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D1002244%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310927233835%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5537434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhAKn_uZFh-NHhleycaxahvgBdeiT9hzLrlZkGR2t50TXJAiBm3ZFGC8dCzAMPnIVvHMExcyZsVKyiAEFTrnTaQOIkOQ%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22av01.0.08M.08%5C%22%22%2C%22bitrate%22%3A663133%2C%22width%22%3A1920%2C%22height%22%3A1080%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A699%7D%2C%22indexRange%22%3A%7B%22start%22%3A700%2C%22end%22%3A767%7D%2C%22lastModified%22%3A1721310927233835%2C%22contentLength%22%3A1002244%2C%22quality%22%3A%22hd1080%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%221080p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A534031%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A136%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D136%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D539761%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310628372416%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRAIgEgh1KXvgEF2vfFGSHSaUXKIReCky49g6uigGw6ws-lwCIAhqO4TAroewj45fqtfDsOo2ONBtSzaXvZzGaAgefYeK%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.4d401f%5C%22%22%2C%22bitrate%22%3A383784%2C%22width%22%3A1280%2C%22height%22%3A720%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A738%7D%2C%22indexRange%22%3A%7B%22start%22%3A739%2C%22end%22%3A806%7D%2C%22lastModified%22%3A1721310628372416%2C%22contentLength%22%3A539761%2C%22quality%22%3A%22hd720%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22720p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A287604%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A247%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D247%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D551600%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721311223382645%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRAIgfTa0vXZ8vgdSGRzQZ4WG8v22NrVJW3cbUUAri3ZnLsQCIAWEE3xAdMf15CvgXn3v1khjF6YcHl8Du3S-6TUVC5y1%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fwebm%3B+codecs%3D%5C%22vp9%5C%22%22%2C%22bitrate%22%3A391339%2C%22width%22%3A1280%2C%22height%22%3A720%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A218%7D%2C%22indexRange%22%3A%7B%22start%22%3A219%2C%22end%22%3A268%7D%2C%22lastModified%22%3A1721311223382645%2C%22contentLength%22%3A551600%2C%22quality%22%3A%22hd720%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22720p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A293912%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A398%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D398%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D599127%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310494875574%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5537434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRAIgSDy2dhDjQY8nlehC_jkoyDfUnuSMXzWTsXpF49bxDfsCIHS5gbNx1CaN8PB2SICWKSXYXL0SUpSv4UVcijO4TWRQ%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22av01.0.05M.08%5C%22%22%2C%22bitrate%22%3A389958%2C%22width%22%3A1280%2C%22height%22%3A720%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A699%7D%2C%22indexRange%22%3A%7B%22start%22%3A700%2C%22end%22%3A767%7D%2C%22lastModified%22%3A1721310494875574%2C%22contentLength%22%3A599127%2C%22quality%22%3A%22hd720%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22720p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A319236%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A135%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D135%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D304025%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310630368031%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgVg0KJTLeBU8Ks8GNHqMKb0ad9yIWQF4gGpzlpJASa4UCIQDEIxvqpS_2znOTrLHA-n4O2iNMolk0j0gMTOFSN9__qw%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.4d401e%5C%22%22%2C%22bitrate%22%3A216654%2C%22width%22%3A854%2C%22height%22%3A480%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A738%7D%2C%22indexRange%22%3A%7B%22start%22%3A739%2C%22end%22%3A806%7D%2C%22lastModified%22%3A1721310630368031%2C%22contentLength%22%3A304025%2C%22quality%22%3A%22large%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22480p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A161995%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A244%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D244%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D379990%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721311223530966%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhANHriMCIr3nzEdgDNdSbfG0f3sxY2s7E0wc5HGMilTj0AiAvHqNDJSBu1R0qn2Hubi7k6ZADVni-e23HaZmihuJ-kA%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fwebm%3B+codecs%3D%5C%22vp9%5C%22%22%2C%22bitrate%22%3A256800%2C%22width%22%3A854%2C%22height%22%3A480%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A218%7D%2C%22indexRange%22%3A%7B%22start%22%3A219%2C%22end%22%3A267%7D%2C%22lastModified%22%3A1721311223530966%2C%22contentLength%22%3A379990%2C%22quality%22%3A%22large%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22480p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A202472%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A397%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D397%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D353666%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310345621548%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5537434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRAIgFso4AAh8uhn1S1pjGIHqLW-reZeEZblvG7rBRps5HlYCIFHNYGHmzTWMhvDjB2__2-TnCWklj7SGwzrG3Q39i_Ib%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22av01.0.04M.08%5C%22%22%2C%22bitrate%22%3A228564%2C%22width%22%3A854%2C%22height%22%3A480%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A699%7D%2C%22indexRange%22%3A%7B%22start%22%3A700%2C%22end%22%3A767%7D%2C%22lastModified%22%3A1721310345621548%2C%22contentLength%22%3A353666%2C%22quality%22%3A%22large%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22480p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A188445%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A134%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D134%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D206317%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310628266079%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgF85HmJFhDM_8Rg5KAsNKnzKU6lceHGTdXgXJzKWxlP0CIQCbZ5dUxtIEUKPkDl2pz5xSbXQ-Vh030WCnwV6VeBfK3w%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.4d401e%5C%22%22%2C%22bitrate%22%3A147137%2C%22width%22%3A640%2C%22height%22%3A360%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A738%7D%2C%22indexRange%22%3A%7B%22start%22%3A739%2C%22end%22%3A806%7D%2C%22lastModified%22%3A1721310628266079%2C%22contentLength%22%3A206317%2C%22quality%22%3A%22medium%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22360p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A109933%2C%22highReplication%22%3Atrue%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A243%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D243%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D277857%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721311223535451%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhAPXU55dExXE2Vj6yn1MoL1w2AFSSwJetWdBaDtTUQ6fPAiBFmE-nXF5-7f5ki4PlcPHP_mAofbTvZX-DuVWRkf-eVw%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fwebm%3B+codecs%3D%5C%22vp9%5C%22%22%2C%22bitrate%22%3A186036%2C%22width%22%3A640%2C%22height%22%3A360%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A218%7D%2C%22indexRange%22%3A%7B%22start%22%3A219%2C%22end%22%3A267%7D%2C%22lastModified%22%3A1721311223535451%2C%22contentLength%22%3A277857%2C%22quality%22%3A%22medium%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22360p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A148052%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A396%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D396%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D234319%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310031574237%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5537434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgSa1EfQ6qrQujbRdpqGvVodU_YniNdG7tkHdKLh3DKZ0CIQDqb-dxQATvghfeuVeeMf8TY9ChnWM3wd_asrjEoyBjJQ%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22av01.0.01M.08%5C%22%22%2C%22bitrate%22%3A162403%2C%22width%22%3A640%2C%22height%22%3A360%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A699%7D%2C%22indexRange%22%3A%7B%22start%22%3A700%2C%22end%22%3A767%7D%2C%22lastModified%22%3A1721310031574237%2C%22contentLength%22%3A234319%2C%22quality%22%3A%22medium%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22360p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A124853%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A133%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D133%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D121250%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310628324527%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgF71zfUdMi4asadpfp3Z0wWstdc-iY8DJzT8KixKeMdECIQCjZczPyEuX_WjvgsSSn4pEJM3Bn8XXfuVTUACAIhScfQ%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.4d4015%5C%22%22%2C%22bitrate%22%3A84890%2C%22width%22%3A426%2C%22height%22%3A240%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A738%7D%2C%22indexRange%22%3A%7B%22start%22%3A739%2C%22end%22%3A806%7D%2C%22lastModified%22%3A1721310628324527%2C%22contentLength%22%3A121250%2C%22quality%22%3A%22small%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22240p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A64606%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A242%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D242%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D170497%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721311223441861%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhALzwmKU5NXn2YS9-5EOQo2gtbUUzCXV6rQCBMzyKlwpRAiAbIrMkr9ZDqCHGOqraaKjIGzZCQUW85Sp2pjUFAS2m_Q%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fwebm%3B+codecs%3D%5C%22vp9%5C%22%22%2C%22bitrate%22%3A114293%2C%22width%22%3A426%2C%22height%22%3A240%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A217%7D%2C%22indexRange%22%3A%7B%22start%22%3A218%2C%22end%22%3A266%7D%2C%22lastModified%22%3A1721311223441861%2C%22contentLength%22%3A170497%2C%22quality%22%3A%22small%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22240p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A90846%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A395%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D395%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D129531%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310210084707%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5537434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRAIgDstHQYtX1nfC4n91UPZTlfV4HelXvC_AQwNwh_yhIQUCIFD9yKerhR0c5PUsfg2hzQT3-0EYZ8TdaztlhHOp-wcl%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22av01.0.00M.08%5C%22%22%2C%22bitrate%22%3A83786%2C%22width%22%3A426%2C%22height%22%3A240%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A699%7D%2C%22indexRange%22%3A%7B%22start%22%3A700%2C%22end%22%3A767%7D%2C%22lastModified%22%3A1721310210084707%2C%22contentLength%22%3A129531%2C%22quality%22%3A%22small%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22240p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A69018%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A160%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D160%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D77987%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310628350238%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgXeZ4nDUWvoYfrohTeuXzycYlWqmKF3k9VipD88cP2FUCIQD7tVoDE5WUzKGHzqaHLAnlbZ-cVltkyNGfRqazogHO3w%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22avc1.4d400c%5C%22%22%2C%22bitrate%22%3A53937%2C%22width%22%3A256%2C%22height%22%3A144%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A737%7D%2C%22indexRange%22%3A%7B%22start%22%3A738%2C%22end%22%3A805%7D%2C%22lastModified%22%3A1721310628350238%2C%22contentLength%22%3A77987%2C%22quality%22%3A%22tiny%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22144p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A41554%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A278%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D278%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D149133%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721311223435017%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5535434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRgIhAJwqMZK4w9JxY5B_rcsMO5l4JNPcundD1gkzLo1Ev85xAiEA-XCcghGK4Z0Alvq7hGwXH6FywcepxCLnrQA8kJRjK-A%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fwebm%3B+codecs%3D%5C%22vp9%5C%22%22%2C%22bitrate%22%3A89160%2C%22width%22%3A256%2C%22height%22%3A144%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A217%7D%2C%22indexRange%22%3A%7B%22start%22%3A218%2C%22end%22%3A266%7D%2C%22lastModified%22%3A1721311223435017%2C%22contentLength%22%3A149133%2C%22quality%22%3A%22tiny%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22144p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A79463%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A394%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D394%5Cu0026aitags%3D133%252C134%252C135%252C136%252C137%252C160%252C242%252C243%252C244%252C247%252C248%252C278%252C394%252C395%252C396%252C397%252C398%252C399%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Dvideo%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D89534%5Cu0026dur%3D15.014%5Cu0026lmt%3D1721310033136007%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5537434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Caitags%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRgIhAOhLKebshdUCIRqNj4jzEN2forh9TdLBfJOzdqv1N60hAiEAgJzxEWli5y_R6_7rkRRKWo00H96baPMJYVlUApIOSR0%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22video%2Fmp4%3B+codecs%3D%5C%22av01.0.00M.08%5C%22%22%2C%22bitrate%22%3A62314%2C%22width%22%3A256%2C%22height%22%3A144%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A699%7D%2C%22indexRange%22%3A%7B%22start%22%3A700%2C%22end%22%3A767%7D%2C%22lastModified%22%3A1721310033136007%2C%22contentLength%22%3A89534%2C%22quality%22%3A%22tiny%22%2C%22fps%22%3A24%2C%22qualityLabel%22%3A%22144p%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A47706%2C%22colorInfo%22%3A%7B%22primaries%22%3A%22COLOR_PRIMARIES_BT709%22%2C%22transferCharacteristics%22%3A%22COLOR_TRANSFER_CHARACTERISTICS_BT709%22%2C%22matrixCoefficients%22%3A%22COLOR_MATRIX_COEFFICIENTS_BT709%22%7D%2C%22approxDurationMs%22%3A15014%7D%2C%7B%22itag%22%3A140%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D140%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Daudio%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D245341%5Cu0026dur%3D15.069%5Cu0026lmt%3D1721309718301812%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIgOLWeF99aysyix3uHwJUJ3Kef6a9RY7Zth_fx7d2-BhECIQDzceZB_nK3eI4RHjDQkv7TVSmvbUBUjbAzVgCxSxnSKg%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fmp4%3B+codecs%3D%5C%22mp4a.40.2%5C%22%22%2C%22bitrate%22%3A130409%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A722%7D%2C%22indexRange%22%3A%7B%22start%22%3A723%2C%22end%22%3A778%7D%2C%22lastModified%22%3A1721309718301812%2C%22contentLength%22%3A245341%2C%22quality%22%3A%22tiny%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A130249%2C%22highReplication%22%3Atrue%2C%22audioQuality%22%3A%22AUDIO_QUALITY_MEDIUM%22%2C%22approxDurationMs%22%3A15069%2C%22audioSampleRate%22%3A44100%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A-4.2199993%7D%2C%7B%22itag%22%3A140%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D140%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026xtags%3Ddrc%253D1%5Cu0026mime%3Daudio%252Fmp4%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D245451%5Cu0026dur%3D15.069%5Cu0026lmt%3D1721309722663557%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cxtags%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRgIhAOxR1D67tRFVzipC_wivNBo7LA5vdmCI88xjkRappCCMAiEAhi1195MAxxzUUtM2tVdnBLpflJE8tQI4i3n1JZIMRB0%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fmp4%3B+codecs%3D%5C%22mp4a.40.2%5C%22%22%2C%22bitrate%22%3A130411%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A722%7D%2C%22indexRange%22%3A%7B%22start%22%3A723%2C%22end%22%3A778%7D%2C%22lastModified%22%3A1721309722663557%2C%22contentLength%22%3A245451%2C%22quality%22%3A%22tiny%22%2C%22xtags%22%3A%22CggKA2RyYxIBMQ%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A130307%2C%22highReplication%22%3Atrue%2C%22audioQuality%22%3A%22AUDIO_QUALITY_MEDIUM%22%2C%22approxDurationMs%22%3A15069%2C%22audioSampleRate%22%3A44100%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A3.04%2C%22isDrc%22%3Atrue%7D%2C%7B%22itag%22%3A249%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D249%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Daudio%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D99397%5Cu0026dur%3D15.041%5Cu0026lmt%3D1721309742615061%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhAOdruOSFRPdrhBI6Srbpt180W-8QFZ1dLJZXhVYX1_SWAiBxo0O-Ytotqopzn5Ba4ry601sAg-r6ZV2GLP3u9dlxVQ%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fwebm%3B+codecs%3D%5C%22opus%5C%22%22%2C%22bitrate%22%3A53278%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A265%7D%2C%22indexRange%22%3A%7B%22start%22%3A266%2C%22end%22%3A299%7D%2C%22lastModified%22%3A1721309742615061%2C%22contentLength%22%3A99397%2C%22quality%22%3A%22tiny%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A52867%2C%22audioQuality%22%3A%22AUDIO_QUALITY_LOW%22%2C%22approxDurationMs%22%3A15041%2C%22audioSampleRate%22%3A48000%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A-4.2199993%7D%2C%7B%22itag%22%3A249%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D249%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026xtags%3Ddrc%253D1%5Cu0026mime%3Daudio%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D101284%5Cu0026dur%3D15.041%5Cu0026lmt%3D1721309732356301%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cxtags%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRgIhAKwUr1LV09-V4qaCwqRSNVPtwBg3hkI4T88YB1r_2rQpAiEAwHA5yKLrNg1psg5Y4qLnqfnq7mNjAB24qjD4cnesA_U%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fwebm%3B+codecs%3D%5C%22opus%5C%22%22%2C%22bitrate%22%3A54392%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A265%7D%2C%22indexRange%22%3A%7B%22start%22%3A266%2C%22end%22%3A299%7D%2C%22lastModified%22%3A1721309732356301%2C%22contentLength%22%3A101284%2C%22quality%22%3A%22tiny%22%2C%22xtags%22%3A%22CggKA2RyYxIBMQ%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A53870%2C%22audioQuality%22%3A%22AUDIO_QUALITY_LOW%22%2C%22approxDurationMs%22%3A15041%2C%22audioSampleRate%22%3A48000%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A3.04%2C%22isDrc%22%3Atrue%7D%2C%7B%22itag%22%3A250%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D250%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Daudio%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D134207%5Cu0026dur%3D15.041%5Cu0026lmt%3D1721309742619499%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhAIr-_c-0LJttfDbinbZ45pKvYBY66t3bU-ZmEf_erWmfAiA2en3o9yiKVrbfuuiMpCSe2RVYuyF2brTlt1Eo1jTLGw%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fwebm%3B+codecs%3D%5C%22opus%5C%22%22%2C%22bitrate%22%3A71398%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A265%7D%2C%22indexRange%22%3A%7B%22start%22%3A266%2C%22end%22%3A299%7D%2C%22lastModified%22%3A1721309742619499%2C%22contentLength%22%3A134207%2C%22quality%22%3A%22tiny%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A71381%2C%22audioQuality%22%3A%22AUDIO_QUALITY_LOW%22%2C%22approxDurationMs%22%3A15041%2C%22audioSampleRate%22%3A48000%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A-4.2199993%7D%2C%7B%22itag%22%3A250%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D250%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026xtags%3Ddrc%253D1%5Cu0026mime%3Daudio%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D135193%5Cu0026dur%3D15.041%5Cu0026lmt%3D1721309732360545%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cxtags%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRQIhAIC9cHl4zGYyjovJofRS1E1ZoRKw7drmkrhWV2epl_0kAiBvYxyplI3FyuQkq5CuYISeVAorEOeqDGGPAl1TWdRIOQ%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fwebm%3B+codecs%3D%5C%22opus%5C%22%22%2C%22bitrate%22%3A72172%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A265%7D%2C%22indexRange%22%3A%7B%22start%22%3A266%2C%22end%22%3A299%7D%2C%22lastModified%22%3A1721309732360545%2C%22contentLength%22%3A135193%2C%22quality%22%3A%22tiny%22%2C%22xtags%22%3A%22CggKA2RyYxIBMQ%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A71906%2C%22audioQuality%22%3A%22AUDIO_QUALITY_LOW%22%2C%22approxDurationMs%22%3A15041%2C%22audioSampleRate%22%3A48000%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A3.04%2C%22isDrc%22%3Atrue%7D%2C%7B%22itag%22%3A251%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D251%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026mime%3Daudio%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D252551%5Cu0026dur%3D15.041%5Cu0026lmt%3D1721309742615185%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRgIhAOC9jweqfmE2WcRni5NASl4Gcb3F2Op7vD4yLL8-dphwAiEAhYZvgb6t0G4EAUgzqgXu0Tk3nok9MD4IZRluwkCggiA%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fwebm%3B+codecs%3D%5C%22opus%5C%22%22%2C%22bitrate%22%3A139093%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A265%7D%2C%22indexRange%22%3A%7B%22start%22%3A266%2C%22end%22%3A299%7D%2C%22lastModified%22%3A1721309742615185%2C%22contentLength%22%3A252551%2C%22quality%22%3A%22tiny%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A134326%2C%22audioQuality%22%3A%22AUDIO_QUALITY_MEDIUM%22%2C%22approxDurationMs%22%3A15041%2C%22audioSampleRate%22%3A48000%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A-4.2199993%7D%2C%7B%22itag%22%3A251%2C%22url%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026itag%3D251%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026bui%3DAXc671ICTQW9za4L4fUvI6iB5Xb7eqfThgEChPCJdCVam18bfvfY9U9dJWBA8yxmehdpP6WumZUisN4c%5Cu0026vprv%3D1%5Cu0026svpuc%3D1%5Cu0026xtags%3Ddrc%253D1%5Cu0026mime%3Daudio%252Fwebm%5Cu0026ns%3DtkuggsHhRMGoMXpWHzLtizcQ%5Cu0026rqh%3D1%5Cu0026gir%3Dyes%5Cu0026clen%3D252857%5Cu0026dur%3D15.041%5Cu0026lmt%3D1721309732390912%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026lmw%3D1%5Cu0026c%3DTVHTML5%5Cu0026sefc%3D1%5Cu0026txp%3D5532434%5Cu0026n%3DiC9X4DjTIDghkZ-R2%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cxpc%252Cctier%252Cbui%252Cvprv%252Csvpuc%252Cxtags%252Cmime%252Cns%252Crqh%252Cgir%252Cclen%252Cdur%252Clmt%5Cu0026sig%3DAJfQdSswRgIhAPVNS5XIMzrd6gRoKV59M83rksSBoK7gI9EkVK7FSLoeAiEAy7CA8hvK0BBW7iAIoYCdWSF_e_v7hROQHu2BCi1DRVE%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%2C%22mimeType%22%3A%22audio%2Fwebm%3B+codecs%3D%5C%22opus%5C%22%22%2C%22bitrate%22%3A139163%2C%22initRange%22%3A%7B%22start%22%3A0%2C%22end%22%3A265%7D%2C%22indexRange%22%3A%7B%22start%22%3A266%2C%22end%22%3A299%7D%2C%22lastModified%22%3A1721309732390912%2C%22contentLength%22%3A252857%2C%22quality%22%3A%22tiny%22%2C%22xtags%22%3A%22CggKA2RyYxIBMQ%22%2C%22projectionType%22%3A%22RECTANGULAR%22%2C%22averageBitrate%22%3A134489%2C%22audioQuality%22%3A%22AUDIO_QUALITY_MEDIUM%22%2C%22approxDurationMs%22%3A15041%2C%22audioSampleRate%22%3A48000%2C%22audioChannels%22%3A2%2C%22loudnessDb%22%3A3.04%2C%22isDrc%22%3Atrue%7D%5D%2C%22serverAbrStreamingUrl%22%3A%22https%3A%2F%2Frr5---sn-h0jeln7e.googlevideo.com%2Fvideoplayback%3Fexpire%3D1722318110%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026ip%3D93.235.183.158%5Cu0026id%3Do-AOT151Lw5IRApOBym6QRDN4NqeNkLPOGW3TDb3_xVd7Q%5Cu0026source%3Dyoutube%5Cu0026requiressl%3Dyes%5Cu0026xpc%3DEgVo2aDSNQ%253D%253D%5Cu0026mh%3DRk%5Cu0026mm%3D31%252C26%5Cu0026mn%3Dsn-h0jeln7e%252Csn-4g5ednd7%5Cu0026ms%3Dau%252Conr%5Cu0026mv%3Dm%5Cu0026mvi%3D5%5Cu0026pl%3D26%5Cu0026ctier%3DL%5Cu0026initcwndbps%3D1957500%5Cu0026svpuc%3D1%5Cu0026ns%3DE0lVVmjjqga8OiDs_6sTbBsQ%5Cu0026sabr%3D1%5Cu0026rqh%3D1%5Cu0026mt%3D1722295996%5Cu0026fvip%3D2%5Cu0026keepalive%3Dyes%5Cu0026c%3DTVHTML5%5Cu0026smc%3D1%5Cu0026n%3DkaUeiGs600un_WlJB%5Cu0026sparams%3Dexpire%252Cei%252Cip%252Cid%252Csource%252Crequiressl%252Cxpc%252Cctier%252Csvpuc%252Cns%252Csabr%252Crqh%5Cu0026sig%3DAJfQdSswRQIhAMFYdEOnMd_tl7WiTtbQw48yysXykZ2-0bd7DsfEFpJMAiBkKWpQSXszNkwj2NobfXLWcNCtsu7eCnglikye6BCwKw%253D%253D%5Cu0026lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%5Cu0026lsig%3DAGtxev0wRAIgOkmRy7RSThJGxtogLFgCTlpda6qeKYWlqIfjdRZNQyQCIChab2SPRG2KMMf1cKKFsf9scaC0_ZGjJyNGxok41QsK%22%7D%2C%22playbackTracking%22%3A%7B%22videostatsPlaybackUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fplayback%3Fcl%3D655300395%5Cu0026docid%3D1AurP5pjb6Y%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026fexp%3D%5Cu0026ns%3Dyt%5Cu0026plid%3DAAYea2e7wPL_xoG0%5Cu0026referrer%3Dhttps%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DpPvd8UxmSbQ%5Cu0026adcontext%3DCAESEwiEr-G9ts2HAxXibEECHUCOD78gAigGMAE%5Cu0026adformat%3D15_2%5Cu0026aqi%3DviioZoTYLOLZhcIPwJy--As%5Cu0026autoplay%3D1%5Cu0026el%3Dadunit%5Cu0026len%3D16%5Cu0026of%3D-_xhI4eL4MjOL53E0nwGhA%5Cu0026vm%3DCAEQABgEOjJBSHFpSlRJZE44LUdLNk9FRVVoLUFZZFVvVVQtLTlRLVJ3MUFFR2VjQVFZejI3N0xlQWJcQU9BckJGdlF5TUdGNFU4NVVtcGFWS1dlUTk5RHVZbHdXckV0aDNqeERjd1BZME5qRkhaUHM3N29lT0JsQ2drbTNCLWswWnVRQkJjQzB1NjRBMDhGeG82blR3TDg%22%7D%2C%22videostatsDelayplayUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fdelayplay%3Fcl%3D655300395%5Cu0026docid%3D1AurP5pjb6Y%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026fexp%3D%5Cu0026ns%3Dyt%5Cu0026plid%3DAAYea2e7wPL_xoG0%5Cu0026referrer%3Dhttps%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DpPvd8UxmSbQ%5Cu0026adformat%3D15_2%5Cu0026aqi%3DviioZoTYLOLZhcIPwJy--As%5Cu0026autoplay%3D1%5Cu0026el%3Dadunit%5Cu0026is_ad%3D1%5Cu0026len%3D16%5Cu0026of%3D-_xhI4eL4MjOL53E0nwGhA%5Cu0026vm%3DCAEQABgEOjJBSHFpSlRJZE44LUdLNk9FRVVoLUFZZFVvVVQtLTlRLVJ3MUFFR2VjQVFZejI3N0xlQWJcQU9BckJGdlF5TUdGNFU4NVVtcGFWS1dlUTk5RHVZbHdXckV0aDNqeERjd1BZME5qRkhaUHM3N29lT0JsQ2drbTNCLWswWnVRQkJjQzB1NjRBMDhGeG82blR3TDg%22%7D%2C%22videostatsWatchtimeUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fwatchtime%3Fcl%3D655300395%5Cu0026docid%3D1AurP5pjb6Y%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026fexp%3D%5Cu0026ns%3Dyt%5Cu0026plid%3DAAYea2e7wPL_xoG0%5Cu0026referrer%3Dhttps%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DpPvd8UxmSbQ%5Cu0026adformat%3D15_2%5Cu0026aqi%3DviioZoTYLOLZhcIPwJy--As%5Cu0026autoplay%3D1%5Cu0026el%3Dadunit%5Cu0026is_ad%3D1%5Cu0026len%3D16%5Cu0026of%3D-_xhI4eL4MjOL53E0nwGhA%5Cu0026vm%3DCAEQABgEOjJBSHFpSlRJZE44LUdLNk9FRVVoLUFZZFVvVVQtLTlRLVJ3MUFFR2VjQVFZejI3N0xlQWJcQU9BckJGdlF5TUdGNFU4NVVtcGFWS1dlUTk5RHVZbHdXckV0aDNqeERjd1BZME5qRkhaUHM3N29lT0JsQ2drbTNCLWswWnVRQkJjQzB1NjRBMDhGeG82blR3TDg%22%7D%2C%22ptrackingUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fwww.youtube.com%2Fptracking%3Fcontent_v%3DpPvd8UxmSbQ%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026plid%3DAAYea2e7wPL_xoG0%5Cu0026pltype%3Dadhost%5Cu0026ptchn%3Dyoutube_host%5Cu0026ptk%3Dyoutube_host%5Cu0026video_id%3D1AurP5pjb6Y%22%7D%2C%22qoeUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fqoe%3Fadcontext%3DCAESEwiEr-G9ts2HAxXibEECHUCOD78gAigGMAE%5Cu0026adformat%3D15_2%5Cu0026cl%3D655300395%5Cu0026docid%3D1AurP5pjb6Y%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026event%3Dstreamingstats%5Cu0026fexp%3D%5Cu0026ns%3Dyt%5Cu0026plid%3DAAYea2e7wPL_xoG0%5Cu0026referrer%3Dhttps%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DpPvd8UxmSbQ%22%7D%2C%22atrUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fatr%3Fdocid%3D1AurP5pjb6Y%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026is_ad%3D1%5Cu0026len%3D16%5Cu0026ns%3Dyt%5Cu0026plid%3DAAYea2e7wPL_xoG0%5Cu0026ver%3D2%22%2C%22elapsedMediaTimeSeconds%22%3A5%7D%2C%22videostatsScheduledFlushWalltimeSeconds%22%3A%5B10%2C20%2C30%5D%2C%22videostatsDefaultFlushIntervalSeconds%22%3A40%2C%22youtubeRemarketingUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fwww.youtube.com%2Fpagead%2F1p-user-list%2F962985656%2F%3Fbackend%3Dinnertube%5Cu0026cname%3D7%5Cu0026cver%3D7_20190924%5Cu0026data%3Dbackend%253Dinnertube%253Bcname%253D7%253Bcver%253D7_20190924%253Bel%253Dadunit%253Bptype%253Df_adview%253Btype%253Dview%253Butuid%253D5ErFf0kKFKpaAbbSwXJBgg%253Butvid%253D1AurP5pjb6Y%5Cu0026ptype%3Df_adview%5Cu0026random%3D860714607%5Cu0026utuid%3D5ErFf0kKFKpaAbbSwXJBgg%22%2C%22elapsedMediaTimeSeconds%22%3A0%7D%2C%22googleRemarketingUrl%22%3A%7B%22baseUrl%22%3A%22https%3A%2F%2Fwww.google.com%2Fpagead%2F1p-user-list%2F962985656%2F%3Fbackend%3Dinnertube%5Cu0026cname%3D7%5Cu0026cver%3D7_20190924%5Cu0026data%3Dbackend%253Dinnertube%253Bcname%253D7%253Bcver%253D7_20190924%253Bel%253Dadunit%253Bptype%253Df_adview%253Btype%253Dview%253Butuid%253D5ErFf0kKFKpaAbbSwXJBgg%253Butvid%253D1AurP5pjb6Y%5Cu0026is_vtc%3D0%5Cu0026ptype%3Df_adview%5Cu0026random%3D459666337%5Cu0026utuid%3D5ErFf0kKFKpaAbbSwXJBgg%22%2C%22elapsedMediaTimeSeconds%22%3A0%7D%7D%2C%22captions%22%3A%7B%22playerCaptionsTracklistRenderer%22%3A%7B%22captionTracks%22%3A%5B%7B%22baseUrl%22%3A%22https%3A%2F%2Fwww.youtube.com%2Fapi%2Ftimedtext%3Fv%3D1AurP5pjb6Y%5Cu0026ei%3DviioZtzcOdeHi9oPl42KsAg%5Cu0026caps%3Dasr%5Cu0026opi%3D112496729%5Cu0026exp%3Dxbt%5Cu0026xoaf%3D5%5Cu0026hl%3Den%5Cu0026ip%3D0.0.0.0%5Cu0026ipbits%3D0%5Cu0026expire%3D1722321710%5Cu0026sparams%3Dip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cexp%2Cxoaf%5Cu0026signature%3D6F57249CD639A07ABEA7AA3D8BA368BD422D0514.B606931403FCB5CF4FCB7ECD681E3395D743B4BB%5Cu0026key%3Dyt8%5Cu0026kind%3Dasr%5Cu0026lang%3Dde%22%2C%22name%22%3A%7B%22simpleText%22%3A%22German+%28auto-generated%29%22%7D%2C%22vssId%22%3A%22a.de%22%2C%22languageCode%22%3A%22de%22%2C%22kind%22%3A%22asr%22%2C%22isTranslatable%22%3Atrue%2C%22trackName%22%3A%22%22%7D%5D%2C%22audioTracks%22%3A%5B%7B%22captionTrackIndices%22%3A%5B0%5D%7D%5D%2C%22translationLanguages%22%3A%5B%7B%22languageCode%22%3A%22en%22%2C%22languageName%22%3A%7B%22simpleText%22%3A%22English%22%7D%7D%5D%2C%22defaultAudioTrackIndex%22%3A0%2C%22defaultTranslationSourceTrackIndices%22%3A%5B0%5D%7D%7D%2C%22videoDetails%22%3A%7B%22videoId%22%3A%221AurP5pjb6Y%22%2C%22lengthSeconds%22%3A15%2C%22channelId%22%3A%22UC5ErFf0kKFKpaAbbSwXJBgg%22%2C%22isOwnerViewing%22%3Afalse%2C%22isCrawlable%22%3Atrue%2C%22thumbnail%22%3A%7B%22thumbnails%22%3A%5B%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F1AurP5pjb6Y%2Fhqdefault.jpg%3Fsqp%3D-oaymwEmCOADEOgC8quKqQMa8AEB-AH-CYAC0AWKAgwIABABGCkgZShSMA8%3D%5Cu0026rs%3DAOn4CLBmgTJBgabOVc5XVDgOEGh_P5qUfw%22%2C%22width%22%3A480%2C%22height%22%3A360%7D%5D%7D%2C%22allowRatings%22%3Afalse%2C%22isPrivate%22%3Afalse%2C%22isUnpluggedCorpus%22%3Afalse%2C%22isLiveContent%22%3Afalse%7D%2C%22playerConfig%22%3A%7B%22audioConfig%22%3A%7B%22loudnessDb%22%3A-4.2199993%2C%22perceptualLoudnessDb%22%3A-23.219999%2C%22enablePerFormatLoudness%22%3Atrue%7D%2C%22mediaCommonConfig%22%3A%7B%22dynamicReadaheadConfig%22%3A%7B%22maxReadAheadMediaTimeMs%22%3A120000%2C%22minReadAheadMediaTimeMs%22%3A15000%2C%22readAheadGrowthRateMs%22%3A1000%7D%2C%22mediaUstreamerRequestConfig%22%3A%7B%22videoPlaybackUstreamerConfig%22%3A%22CvwKCpcHCAAlAACAPy1SuF4%2FNQAAwD9YAWABaAFyFgoSbWZzMl9jbWZzX3YzXzJfMTA5GAB4j06gAQGoAQCQAgG4AgDIAgHaAroBELDqARioRiCgnAEoiCcwmHVwiCeAAfQDuAEB4AEDkAIBmAIMoAIBwAIB0AIC4AIB6AIEgAMCiAOIJ5gDAagDA8ADAcgDAdADAfgDAYAEAYgEAZAEAZgEAaAEAagEAcgEAdAEAdgEAeAEAOgEAfgEB4AFfYgFAbAFAbgFAcAFAcgFAdAFAdgFAeAF0A%2FoBQH4BdAPgAYBuAYBwAYB0AYB2AYB6AYB8AYB%2BAYBkAcBqAcB2AcB%2BLWR5QwB%2BgKeAi0AAIJCNQAAlkJIAWUAAIBAaMBwqAHQhgOwAeADuAEBzQEAAIA%2F8AEB%2FQEAAIA%2FhQKamRk%2BjQIAAIA%2FlQIAAAJCmAIBtQIAAIA%2FwALgA9ICEbD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEePEZaXF1e2gIFMjA6MDDgAnjoAugC9QIK16M7%2FQLNzMw9gAMBkAMBnQMK1yM9oAMBuAMByAMB2AMB5QNiSkRA7QMyyvM%2B8AMB%2FQNmZoY%2FhQQAAIBAmAQB1QQAACBB6ATwEPAEAb0Fo0Afu8UF308tP8gFAeAFAZgGAaAGAagGAbUGvTeGNb0GMzODQJAHAcAHAcgHAdUHAICdQ%2BUHAIAJRKEIAAAAAAAA8L%2BpCAAAAAAAAPC%2FsAjwAbgIAdgI8AHoCAGCAwCQAwGoAwGwAwPQAwHYAwHgA5BOuAQBygQcChMIwKkHEJh1GOgHJQAAAAAoADAAEODUAxjQD9IEDQoICLAJELAJIAEgiCfaBAsKBgjwLhDwLiCIJ%2BgEAfgEAYAFAYgFAZAFAagFAbAFAdAFAdgFAegFAfAFAYgGAZgGAagGgIACwAYByAYB0gYUCOgHEGQaDQiIJxUAAAA%2FHc3MTD%2BCBwoVAACAPxhkIJBOiAcBoAcBsAcBuAcBwAcB%2BAcBgAgBoAgBsAgBuAgB0ggGCAEQARgBmAkBqQkAAAAAAADwv7EJAAAAAAAA8L%2FICQHaCSRFRzRmTDl1Sm9tL2NWdklmNjg4bnB6c2t4SVQrMXl0N09POHXgCQGwCgHYCgHwCgGICwGYCwG4CwHICwHQCwHYCwHqCwSLBowG8AsB%2BAsBkAwBoAwBqAyQAbAMAbgMAcAMAdAMAeAMAegMAYANAaANAdANAeANAYgOAZAOAbAOAYinocoLARgBIAEyDAiJARCQpPri3bCHAzIMCPgBEP%2Fwkr%2FfsIcDMgwIjwMQq8b28t6whwMyDAiIARDAv7Xk3bCHAzIMCPcBEPWEkoDgsIcDMgwIjgMQtr%2FhpN2whwMyDAiHARCfpq%2Fl3bCHAzIMCPQBENaLm4DgsIcDMgwIjQMQrODL3dywhwMyDAiGARDfgK%2Fk3bCHAzIMCPMBENuum4DgsIcDMgwIjAMQ3enrx9uwhwMyDAiFARCvybLk3bCHAzIMCPIBEMXTlYDgsIcDMgwIiwMQ4577nNywhwMyDAigARCekrTk3bCHAzIMCJYCEImelYDgsIcDMgwIigMQh5PLyNuwhwMyDAiMARD0mLuy2rCHAzIcCIwBEIW1xbTasIcDGg5DZ2dLQTJSeVl4SUJNUTIMCPkBEJWUh77asIcDMhwI%2BQEQzYGVudqwhwMaDkNnZ0tBMlJ5WXhJQk1RMgwI%2BgEQ67aHvtqwhwMyHAj6ARDhopW52rCHAxoOQ2dnS0EyUnlZeElCTVEyDAj7ARCRlYe%2B2rCHAzIcCPsBEICQl7nasIcDGg5DZ2dLQTJSeVl4SUJNUToASABSJhoCZGUoADIYVUM1RXJGZjBrS0ZLcGFBYmJTd1hKQmdnOABAAFgAkMvTjw4BEkwAoRgLhjBFAiAtYDwIGPSYqn2neGXsTVmenWz%2BkBeGled0ZebIkJY3zwIhANIW7OzppmyObbstP%2BiLPW2MQ9Dk4snznI0qF94DBBFRGgJlaQ%3D%3D%22%7D%2C%22useServerDrivenAbr%22%3Afalse%2C%22serverPlaybackStartConfig%22%3A%7B%22enable%22%3Atrue%2C%22playbackStartPolicy%22%3A%7B%22startMinReadaheadPolicy%22%3A%5B%7B%22minReadaheadMs%22%3A1200%7D%5D%7D%7D%7D%2C%22webPlayerConfig%22%3A%7B%22useCobaltTvosDash%22%3Atrue%7D%7D%2C%22trackingParams%22%3A%22CAAQu2kiEwjcs%2B69ts2HAxXXw0IFHZeGAoY%3D%22%2C%22attestation%22%3A%7B%22playerAttestationRenderer%22%3A%7B%22challenge%22%3A%22a%3D6%5Cu0026a2%3D1%5Cu0026b%3DBWUKYLiKMIn1QxCC7rbRVCLRjjM%5Cu0026c%3D1722296510%5Cu0026d%3D7%5Cu0026e%3D1AurP5pjb6Y%5Cu0026c1a%3D1%5Cu0026hh%3DCgxPr7ShD8YOqxlzD-41UmEoSZr7utz3JBjT0ideeCk%22%2C%22botguardData%22%3A%7B%22program%22%3A%22cgK8i0evZvh443T%2B9PSEpUPka0Hvulw4wDLA7GFSihpx0HqEsQpL2jsl4lyLZ5C4YQsGj3LJZQtmhbIe%2B9zB9PZBJT2mM0%2BqOFgwX%2FQohuu0Hxwq%2FQlIIWvkLbYbnt1sK24b8EwkXN9HFhlrQgE8kOZatk%2FhA0UPrgGw59U8W8V5T1Uau2DcJ%2BMdmctNSX3lFEGigQga0TBgS6my%2Foy%2FiCyMs5E8U1q4QBsYqKRJBSN8anp6TDjgq%2FJcUof1eF8l0F5C7zR7egENqWvNRr%2Bvj4Al3sjhtm5TRMeLNcJK63rlKU%2Bv0vzHFfO2YPlKkOQSA4x83Zqhy1QpunTohXpjWPEEaMB9aZLT3dxwc9O6kz%2FlmB44xpBd2a1KXkbMRDJwIP9pa6UKLQS0CT1Rb9hzTltGnKHB7bYWbeBJSvb8CwNCEoW7nvB6inHkUAdYH4T4exOm9Gm6Df9t9EcKn6hf9QyN1e%2FOV0iznfcIg9Di8M7omzBosj1yaBkyz7RdvQLQBrVC1wdw%2FRcd7fpmz7sBbiHzaP0VzDzZe%2BhcIM76koG7BAfeYy%2FSjIdfjTSOHXgvNGvDwDUo%2Fr5InGFGBPpknFKDBYctko8Rux02qcBj5Zl2hVZSXEsmxpFv24u2mKoI3asa4FougNQ6dSZifOah3Qg1DyCJXAirH0CE4j5%2FXrXtPPpwJyZ5V5zyo1jTBksEXJa%2Fwq5bPG0FNQZ2%2FzlL7QKq%2FDhIXoqbFSVQE05t3AQgmlyUIMqwap8Vxkr5NE9AgpfUsjN6DXn7VuWOpsqsjkG3d83XmlJch%2FQgyTuJ5B42wWQuxzxXjyAM3v%2F%2BAxvs1dOHWShT5pjyxehXP4KeqDB6e9l5hLTqIVhnMnA9wDJbrLe%2F30hz1z6RuVJTc0lc7bLyl5fMIjPr0JxBlPgygaJVPmAVTsyIs9%2BV2zJ8YIzZiiuyLxM5wqjiCPoWezNvGUTu%2Ba%2FBFUq9eccF2z3xWbhnOW7YJ%2BZ%2BUQMb81DMjvc39V47O9RNZhLyvb7EXziVVJuLMMgc3mwdoJLVZxqOztu94HYdZHYB1AZ%2FkoVMZ0wPin9FJTT46ZtmQ7RwsvpJoxSQ07ssIM1TFWIokTR7j0w5HnROndArcSPwDm6mVxkXtqfMxTh%2FdBIbd0hHVB0eBMjoShqU2uZkFyqPuT3VsvvkOW%2BzOCAGY%2BUdvbQolAQWgH%2F1pdkYx5XQJjW9u1NLPDpt1W66uWU0y5xZzjv7CJV9Lc7HjoKN0LU%2BtFg7UWB6vsgic8OC%2BWWtt2iXF5FiBXkZiZn849cnTdaG99qozyyPOfI5gATe4UFmNWEd8NyprM%2BrcxesEJ5Hce2h14rsvcRx7u%2BieCzmGoXpJCzWt4atq2fE3SC0QB5lYqP0SRt14811wr5XZUjoKqbt1RgRnIw6NqaOeUZ%2Fx1%2BuvIZpnfubdIi4%2FD9oOoAuLIgEdQYOFd2ZTlh4IvWQdxaGvqT3nb%2BcL0k0i5NVarLrKURfLyEmc6CRwI5adUUhE6c7%2By5lujx0DN18QHlnnRRIF9fTbwq9SIwO9n%2FWG8h6Vf8TKK5zIcaHAiDcHgd15Q36VhwdIWyFRv3bHxlbCSdUQnSegn0TEn8blGLcbijKr32rKRqclK4wviNLRrQseimboqBzVgXYAcAmGHbGnqL87tovxd445LXi3Km6EN%2Bc9clOkhzy8oNznIJX5IWHv2ZG4fpcWm1UpsfZbESM03L4RbfJKUtDPflfm%2BzTiWVljls26cDqO2oLrmBhjmJ0bHaEWxoY57jZhB77uHd2tCLM3CzyMit2h2OJDloRCxS7%2BUYdO81h3ar07olGJG%2B%2FKiBZfosceQrOVwBMTyeXRbCegUeLoTuaMQUlyjQBJsHsqctKqDSyniycImEN%2BvnR2yarUQceEbLD73VA3hVR5%2FZWJkkdWT2xZ3Nq2VCBQhUCTHb%2FhZxCam%2FlIdw25fMFMmfwyIz0ZSvx8Y%2BaJHGaUNlIHx2TOUaWAHepGCFSA3sfcq9Q%2B4uYNnt%2ByzhUl6N1mayPErm76qUETD2ka2HvNGWthJQbU47kPxmpmkXIc3q8Rlk94ov0q3DbKdLT03OYChHYwrk8mccenTbMWz97nAR4fNlqbCPm6M687sE84g%2BL891baEEnNJvhp6%2FIoEEF5i0MjGO3wSxhoNwy%2Bk2MjQHSp5jtkyn8xn2tipCzzoEwuY0aA1vcQtri25q%2BGgZPtZ0S%2FcXkLrSXSjSZp%2BxEYHEKRyq1BVKt1iipDt6G182rVIQK5NU09NCbsR5myrGTJjtRpDKPJBVEVTrlnWuWS8Z2wMJE%2BHeALuBDXl3lZiVACiCHeJj1fPAmCsFzKObhfmxQZ92gE5Hx4NmKgxdB14UuPNZj2h22JcglIyk7SjBATt1fNARcFuuUWZcTWlMJ23fvK2NMAMTPvSnMujPPxRuzf%2Fd850seCfkjOu5%2BWS3RCnW%2BndmekzyozdK%2Fp4qgrh96MAZGqwCqwvxdUNktf4KAiaHGMoAZ5PtKodluZrjTEKLlWMbBzxFx0tlDi%2FipARI1lgBqN42L4Iv8vZcjLN%2BIqcHTen34bIrQELLzmYLOR5Xut0Fbxi6Km%2FS7IZ7WRZxvMtGVArMy5mChAY8gL0zjY5%2FPM6g976xs7csA%2FaS17fKde8dK60LMDDmWtkEoZy2O1Ui9sB53IeLWaUTkqbkVM5ezlXDgPd96c9XgZMwxV2xWxeBJIWmMrgYyzuTP2ZtJshtmKRyJa%2Folv3Fb641WkVO3f05ZYaPjNBBsQMUr%2BV5z2Ss7%2FrFvVeKiVdF%2B2WrM6a3D25kk9tz42hrYOc3aaA3mBqWlZTfkUGeoOxf%2FQyCNN98x%2BGcVKyHmDUpAUAOhkfauKv1AzBzhzxi0eO3rVpKd1IcJf9A1AN6SwmMoN%2Bpl4EOez8Sqd6ejcrEk4XP%2B1Q1KZEEbzDYfvLevnGZ5DYAigqU6RTEq%2FWF2GJ3Aazv%2BCLYMWpqn6TfdCiP575bak13yRrBcLJ3gvJYrjjPBo36UnElZuuMGA1fSno5cHqI%2Bo0GcJt8K1Rh8e6nThh1sZJtPY4VXkf%2BQZK%2BMuVZO1Xc6EeXt4mPlqAFmDWXLz9GjYt16v3D9Y4R3g22trJ5HkDo6xlggXBEeE85DtAuBkDf6WPCapt1bU3yjIjZi%2B0mEiBKUSgEdFzyCHSxq1QxC46Py1yTZiDKTrPiKuMz04%2B0%2FMTNjRLebojGUigyJQWFmcS%2BJPVTUaHQn3lXSLF76d5GnqdpE0bns2yScGINqg6khhBf6dzPOMhwGHdZTlHAIafNEiX0CUV0WAzlqiuSYUoQcaST7NsKQC02lhXhzIc3FmoAPyBInTCP8JD13Pr27yoNaEkhuryw7s%2Bx9ZAdxowty1wmh6ktHf7DhOsqSY2BAgoyCoelzgWVjF%2FnSoAB8D3P7p2gkkYn%2Frc5rf8oeNj%2FtNA2wL7sKWp9d%2BG81AMosRhejse4rHl4bLPGoqcEB8AysOaXPU0Web%2FV6U%2Fqu%2B2rdQWOWzFJrDSGybs3qM%2B0xpgsKoPnaic6uCOLDkKQxGV0p9VlMuIB1XblNVQo3LscaWGokCbAwCHiHGEQlUXtLigHDmNpY%2FZ67Ebmu4DGA1DcQRX%2FiJJR0176wluibHZPxgOhA2XBCrX1E3LrxC3xtMNkLe3z%2BJ8c0WV4J1vlXT313BPIKLALskNrE%2BXvBMTcm%2FBMi9MqAmOETbfHYQIxXfY1v0KRkNi9Fu9R76pd95hvnU%2FsQMq%2FGx3UhmBuFE97Nzzmw6XexwKBLIztAyrlAjSRYZIva6hk9fN7nRDbxX8EEwMmnvgkEf51%2FY8d2JuuS0d7%2FTbx5idcKQcD9%2FvK5O5AAQtMNRBiso7jYJg%2Ftjp1BrMzZJ0jl1vrNBNzAwbFcEE8%2BW3jBOvvkppnYqoLBO1uAoDEKzQb7MDcnrouDadDULNr1eliyB6VUMBaiBRzf5LzzCliyw2rffaN9%2FDWXuCUVhonUCyqAcTwNimMiHBHHXjh5Dr1IoeztSx%2FjonUVCCu9kDbXF8Sg1W%2BpxTg4pEv4xtXQxrU5uzubUDTEKTCSZZGJsB%2BX1Bvei8cZC%2F5YxfsRnOv%2BWie6SumzzCCgGHCNOhDlrKr5I3NvvAopPrPC9f1uNC42PTZH5V0kq%2F3BLjGWDy1x7hM5Pi%2FBx9SQQ4WWq5UpZYK5dCjxcKr0MbnvNoOv9CeijeoqmSAUaoHTmKldqWULuE8P0MThCuLDkfzrbfT35oeIMULmWRIbE4feSN1YD152wqQUsiJvI%2Bz3Qt14YsR1HJhHnKx%2F7jLzFITUYB4UHuNrTRSugt7w7c3ERxC%2FFXak1kro7tnUYlRan6U0kd538d8puUp9Ga9wfsIAp1L6RLgm6ycurKBrYO%2FXMWe6cQ88I0s%2FhWQbTC4M%2Fh0Ydibehx5VheFStARYwa9P5WUcvqiaCwuxLw9OjY84fbzaipHQtFvW8ospkwks6%2F36%2BZxG5Vf%2Fjo7RL4rUNtrGRV%2FI2CXxzpWm0dUp8T63Jyag6ScCfo1xaM0chr5IznYC%2B80TuH0YKnQsUlrSn%2FZJJTkvaD7a8%2Fzoc70ncYO8wmHCt6D6VAqvikxP7SBY5lzDTM8lsN8YRn9i8P3H4Rk%2FOFAiPdDrufzmFdh05hYOuqjjjoVAwitIvg5bH9UPQoUaHfOT4ELCeCD9WEkGBmJ4XJp%2BiHHaUpQzgTp%2FAI5rO1NdQTxfJhTcafATgNN72KgEhEQnxo3dMDuJ85wY13guL0xvtfyL%2B8s1epTPwXK3fFe2TWqneGk3SHp94VVo47ExOZNXsZDwIEe0s5n1yI9zsxkwJo94LNiwCHMHf6X9P0%2Ff5MuJAOwcRJoflE9AsjFmUI%2FTjsSnA31WMrjDTy%2FZozin5LjKTPgB%2FjC%2BxT8HjkNh2d3tNh8OjCZ83DJ%2Fvn%2FqVtE5oxKZsw44H48pf4VV1RBjMikVIIoQ3SY24hoA%2BOGnUuA1epMs1HoHatKLG1SQTAFKUVfPVQ1o%2BZTfQbkO3QEEw%2BB5jV2yt7Jlh1aUeS%2Bp9N6U8VNep4aRIIwjNJSVTAeBhVavNJOxEyy0iTyprpNQkUeDXuyAeecmgAr4CYTT0BhWvrmAiUdsapyeIUDoFI3vbpZBHcalaL%2B83ll3X%2B%2BS5fJcQ1z%2FIO%2BNl5tbxHS%2ByJj9YG8DWlsQt5h4e3rabAoZ2Xspj870IFpoVWiuVaf0tLrZdvbw5bqmieKFigMAv%2Bjq2EFaexgcyVcQmzlIBWjvHRc6LptaFkBn2kTA6M9LWJFxYsWF1AsQEt5QBBjVXTiF%2Beeq2eGG6ucyaTJMBUBwcsYx01R6HncoXJfMX5jFqk1Xn9dZfUBCtsoGjd25NLQReUGYYsrL%2BnRH%2Bde8tT3bGYcY%2Bf35BMmocF%2FAB53J%2FWQShLT67KpaAQxFvhi7qWYKZq%2BrxPShU9WSwEbF9Rs%2FFb0IBix%2BDOEFSo6ZKbF2K0jIYkSWog5SY9yBFPp5DcG5jtE3R1oQ0sbW67%2BVNgCmG%2FFSyvrhLrXDr6yoHkyy2uZWznlKC5QzEIUVBI7q2kSPNYTJNwf0HA8dAojk7i2uxZvVxsf1k5dAIWSAcQGJLGJs3zIP%2BDYhoUz7%2BbYmOtetn9wF0c3SdRJNPc3EmR6Ncz4tHP4MyQj7F95T3m3JwMkgFDsoBPRbvWLNafb6B2X%2FgC7591LW93oK0%2FuHLsrgaLWWNLUf2RDA02DJLJfNMwkzlfiGBM3Eec9VC3VNXMWMYk8bmGhppY0QJUy80pKcF3rL3lh77w2mDtwPmaMu3L1iX797XmB08uDvuGtU%2F8ahkD72Pr0AwnC9YEPKf7GCzBaFbPkM1EtOw4H81nw73lJx9a%2F2hTIhIHrvhmjL0BmvptwkYcLTo1vQigYuVC93x%2FuMAcSpTaUY%2FJLy4L%2F3gBHgyA4rcjaHwbJLTg0qgM0BRpHtaL7Fuclm%2BJ2tKarnXwmy%2FJ53P88buKF8M0WtR1DjkdgzYMQLrkKMBCw7AvW3ssQQa6Nl7AurFITVyFmaXd8JXHPo5Y1NarC3Ivt%2FRijag40xUs1ZExSjpCbWo9HBRNBQQYBNiCrJ2MFd61huzfYvCKuhv8lFTI%2Bj9UFi6RVPiInELHjQ6P9gU0sufrDR7IktTG0yrAqlu1a0AJn5KPwk5q7BrpDutXjWJwCeuLxFcmf53qCM5oxMRplbtCN7al4dnI%2B69mexDy3ZrYz8OSFy3HAlk6UFN7Juy8uyBz%2FdgbWKxDa9jmLUP5E9Q8AZkHrzNn8M3sopht9TOKOwBlA4oW%2BHlacKwaYZWqb%2Bb5xCJp86mop%2FN3%2FTOC%2FKcmqgxz31ycH1NeOIX%2BlTXCjvRUql4qJDFRqmziTjW7lPm8oQvMyyoF21TR05vpjigZXCbDrOZ%2Bjw%2BuuN3mLTx0hFVVO6Y3qAfC6vilP27mR5lanuNjXK18Ipn5sutI0gyxF9gzOhCOSda40BVKLVPvitdULKRTIol7Jk9yTiQ0Ka0ntlGUiw6c3%2BYjr547W9lsQFsupPyAU%2BS4%2B6Srm4m8XM4d%2F8Cdj2klEp8MjAXTBMXeGR6wNmn3KIkR9atZ91HymkS7IQhMVojX2Q0vfogdyUG39YhgNfOJWwzdn%2FOgA4p3Pe6%2FBBDND9D87je8CLWf4Tt4dCrq68Eifc65G040rP2%2F17guxvLhcDtxFoG6HCs%2B1%2BxdsSWvbW55cm1oDaNNCQVuHf%2BV2kCkUVZdnXfJXUWFYdeZQrCsEQ175fTEKIhK9MJwaq5jiNrz6h0%2F161sDgefa1cBFCuLbdGH6pJlesYrl0ck%2B1rXxclouNWwVnirym8w2tN0%2BsR0dx3UiqkI9%2BYsNuV873GBPqo68pvxsUdxxbzlNpO9EV2th7AnxsPkELEIWHJkK6sX%2F4ChmnNPkgJeUUddM2CtZk27efgvKJkWIU4wruZxetWjQjNo%2Bup67zKShKWXSENxUwLsTXJSyB7kTiV%2FyFCo6bOGSxc%2FJENJTYAHwdz0LTfwJl4%2BtaMhqEMnEAayAijCMXIoqs5Ya071EP3MiiuFPRYVJuFxq2xzvYrr5yMj3oLS2Y%2BGHU00wKNEzRIqbqjTcfDDd0cTnntGdIKb0s0Mh22tHvYnwUZTFRRf%2BIX5TrziVphFWj7f7HrTQGtBgZ7cgZuBVwyY24as4NFhTmYCWQPLmJ22IhRhfDU%2FJzOgJudkEZYSlSx7Ndp1ARGQr0aMg6RaRwPWBrqtksGXKbjScBI9KhY%2FgrAq0xOdrtBhsPndIascdWmWHzkCBGpK9jjCK2NWyVCdnipA0MNEe%2Fehhs9X8mefVd2lOgHu10av9hRTUoCTCHf4Qnk0VTRTnTBGzabYJPqeai7M8PHhznFdW5MsNUW7m0d15y0vQpS1vOOiImoTRMeH8mgBNuWH4UIyrplnknaPCb9CUxWTFraeRlFcph3jVsJu%2Bn06iAaa4AbbkQYP5Au7FC2Y%2BLpfup2zt62OXKE%2BXbu2O4jgC4f063C9iU6emNUaM%2FyEgtSTM3tKsodZfHqGIlQ7fLarTHGdBT8Wrd6%2Brb0Y164f6dm3%2FyvymUgOKOJKBnP3tVS7cNI2KQ3JjvlGckXR%2BodDmU%2FmVm1c64915fZSAlM8vXm1lt2h8uROCh32jMKma5gVKQKinmsyRGP2icBsqMY%2FU7sc%2BsjItmKbeHvqi6MvAdBu7EJJJFaxw9RqYq8am4zE3LYom5aKe3rW1mLaeLJOmwvBYz3Qq%2F30OxoO7C%2BWMbTxXLCF5EjIavx%2F6bDJLO5ZSx5hkbcn21kuQSCYBBoV4iv3CSr%2BjmV0dZOEMMMaqak8pbLtVvOpUJ69PqDu9HrHZ%2FgFE%2B2Kwl8DNMcEvX%2FGqIm8oDOOI0B3NABkdbaWfTDnA7o%2BU8Uy%2FHBJM9VeQEEkXjQ7f2rJp9IZVIl%2BGVnedOWN1r4tAN%2Fe48R%2F%2F5UVuumkngUcrrf1piM8ORNjTxwJRxdJAs40Ec8Bg%2F8CTFQQ0hAOwY2%2Bz5aJGKVNvDKsnXzgOT8pgKxshpMrlMnZwUMMJeP3p%2FHTgUZESrlYL1pH2i7l5V4CJZ8UcT6ozazuJCVS9kYEXvlX93EFD5sZiwmLNwPPHelp3123iLS5pvkQwgq4OFmnTSocEcyJdvqonvWipXTXdFdB2y30lvpqwBvQgtON9ijqTDy3W3m%2BgltRat7uVCMTHRhRiiGP8kvho8x1VnaK0qg15HuRmH6KD8T5FKu2x8UwnBGiGb5suUeoUbLkWTOmvnzDMRXz45%2F1ZlnijkcE3S4rizk2ek6HAf4fKJdYI4EIP7kpoBE6fRp9baUS23jKwycPVxECEWekjRBp1wjq4oo2dl5XZ8WUh%2FyWZ3W8P271czgvynPzWvBlAkoC0LCXmU%2BX9FdBPyXNpMaWdM6CI2FhRI2UAnQ4JnQ6sOMtyVWOtNQcXMHsXq6s1BC8v7Xmnp6PKMRWiVopaU8T2TiTf0GHYV%2FJRhzHljaBShOvFxP07LGCcON6iG5MMqERZ9tOqGx1O7PZ4vNI%2BMC4%2Fd98AdJyc3rC0Sguy8FIf2W8FRjul%2B9kdNSPobC7dKhO1LPKlNhiYGIcDGZ06%2FJb3Yp43%2FEvMH5JA%2F%2Fd8faLSEsTW8VDEGQks6c447LOYM9iln%2B31gkUl8LaCy4x5nZXDFEM93CL9aEjLtjMPU7rudw0MNVOhFVx5iVe%2FPeyjO0ZosWgjDL4LMjjKt8q%2BrFCD%2BlTSueW2nqc8R2iy7nP4b4msB5wKmADb2euA62wHzwvNvm7TMnezCMpzhJKKugHIrwBBicMNeZP3Kq4oB4C0%2BYkbiB3lZQJaGbcvOq0JjVbXpsnrE5JhPGOUyubo1qndSCIOczipgQuRd0F%2BinteF%2BRBnnU%2BEi%2Fl0lV8WDMUPtt6svmxv8RCI9CYe7dqX1JMBxj7c1bpaG1xnR8fE5AktEaMyn8iq8xlxWeH5wx3%2BDnxPaXUQ56XTX5QWZp5O94BgkBiGrzKQPgpVhgJic3C4YN2gT9Q8%2FAgg4S%2F%2Bm3JZDpb5MGyaF5oCSnYwZXDVH6Pmb8H5qO90cbuVOzpkrA3p%2FbNrQYKK06yHf6QCR5a602sr87el6bUuyssEU7geAMOwgOq8E%2F1cIIbBuXQhQAev21158YtEpw3DMZjsBAffl8CAZ0ks4zdVf%2BfMC4lsGSPdpuNXNz5%2BlOYZO6qS%2Btwu7OabH3JZFf0bwnT3otKJ9i604hP736Thf0TF4ymMQ6TWPX5quKlv7UBu5eWIRD7TIMadhH8%2F97nuCy0a0hS6HWdqFApLUCyyHoZYtRjEhmnE%2FYXh9y2S1jjOx4C2sOfVDapKAeRJGL0rpi%2BSaeoQRRqQLxEEIMWdc86c3Z8qPBXag%2BTLfxYv4Sj484HE2I9zcz9Y7RtaixF814%2BDrw2oEAt%2FluljurkIeUCm2VB14T5EEUQXt6QOvJeHPEmpJIdIQUZ5tXoxTrq8vpVISmXxQHARUXtsAqQFhzHgWXmLVh4bNm4REVXYRGjxGey6D%2Br%2BjDrMPyMP467T28oqwoGKfZHYVlsxPaosPmSBQ%2BJ6kN03AuaydroocELLpVJwQ3sLa9YIfRvsAidCmLR7KQ1yvE4roO8tsoVcKFmIyh1rSIhXM6L738vjL%2BLjeHxhfSYioidyUcHJkD63bicGsaSnHT4kMvBG2yIW0Ikl7xedg4LcYO0pL%2FyVpj7j8MJuaq0vO17Dltxv3r3zhruoNTW6fIq3mKXEijaVP1yXHifemWOrlAOWTu5g%2FXFQnCmoQDGy8HF%2Fl0NTbkDtcr5eEk5mRzeNhewc%2BegXPDOmziaUWaUfT4rQ9SvIi1AIvTp693mHFbgOsmljeDmnS5thrQsna90BYmK9gOs5iHkZdlRL%2BQMbPrdxQ4rYuG8kMngiWcOVLfmg%2FssUxxjZ2rmLHdH5id3rD7Q7HmiRDQNzIDvchx59sY3OXdxo2wmsuntFJP%2FxBUCbDA22KSFyUdW8OsOFPanswPkp4%2BuxX%2BCDr7CWtV4U%2Ff5vBnw%2FEKSFY2h297YAJ44QGzr3nZq1ckvK2nBeC%2FKVcW18GrLqTgMondzz3aCNRUgj%2FDTzX42j%2FPsNqhg58PIeSbABy1q2fJH3iClyR7p6Ep5j63nxYoJ4UceQyTzrCZljL0y2y8V0CklKH4CAsuazvEalttBuntjbumCn%2BnKAO6r72gtf3dZ%2BYbpDAnjkMYTB3DhIy1sl2B93bMFco8nIarnD4FF7p8mgG3S8CLSfm9rVcSBDlAESwvgEOBR73IpZrcfUEE7i%2B21wyPrqj2s3GnYDbJRsf9fmP4qWJLW2pEcxvt%2FPgsRY6Mgq2aoLezvrtZ737PZliKkC8oDNdbTO3qnhUaehijxpPfNtkPk%2FMU0Rh3sPARF1hub8%2BdxIvk7fRFFRJe0mW1CtjEDSnJzKzmaRCSug0MUvM%2FfZTk4%2BtejVnL1enzHoR2COtExRffnmsPtnU%2BZiCvOJ8lu0bpFHKJC60wxrQisUzqAtOREae1U1lSbYAg8USwSYmrMsDq6UpSkj3BhTzspWmelC0nE2LuYchuotjRDRJeSCURWo1jw17%2BD0RHb8IUe2hxccskG0Idp9uc%2BZa0kypEo1yYzsYW%2FYPpXXKdJe661K50BDj9y9Lg64ooS9d38ySUNhLHMUKh9qVMkiHYR0mRlpZTZm3rD7cVNi6hcDOKfO8Ajh55iyekSb%2FcX4JTwQZj02iAJXkAhXPCmVyfaZRpFGRaQajHllW0T%2BxaWTsbAcGXfd0WpmsFEWwGdlW%2Bk9g1UvngrGI%2FA28cPBoSBgFbBvH9npzj7u0pQB2Twl409Re7tS7JqDT%2BblNoZ4cxIIzsSoJoMBAssYhPDgHA4rAuzupw%2BPwSNfgLxYpWSUlvU9YDolurQzMCaCuCy67djXhgCiQ%2FsfCwsBrD8tmpkIzLzzHuWGqw3Zia3i%2BU5NUhWpB%2Be7WWqO5dsW7EE%2BD9wk2FzXrIA2sV8ONOrn3IGti3Wt2yVJ%2FtPPtNlhyJVWKH9oa4tWBQkyoG97ezRI67jiihUVDKk%2FQxBjcTaOXG1nHxipxwYbxL6BwQKtFGxo71PARlN7PqLy3YMKhaUuXXCGFucWIfMHTmJOfyN2e8soV6%2F9amSIAJA2F0kDwbhvZ8a2nfPPmB0kfZCzlOuPMInKCRQC%2BW6zenXIIA3PQWs6oRb72ZNw4mdulcJNMGfjv09hz%2F4%2FMl6QxDxIJiqLwkeXgkbqv0EFHtSDYzzuN6DFJ8nuzmx7ohvsbFJJAEtmAKHiPCXWBLv8Q4FDD1Lu33jdLCGGc51KkULSthLXsrSc1eZx0JsiG%2Fhhmju9HghlJnslLydUF5Dv1U2UmtKCbeyjaERsjgnYz3PxnwjrRW4H9PziF5jnh96nPMiydm8HX6veTg5MUp%2Fh8ZWAK1jm6umTOQgrtj0PdaGECcUOe9XZzhxPAXeSt9mcIT%2BdTqd4I39Sv4mmlyLBeTuCaTtORbsznjV9h0zMnAuPwSXdzsZZytRhR5ekC%2FHh7YWFho8bL1GcSuxa%2FiLNmM428coDBPZBWrMlGZEEck0bP8rimtonyDYP691rXbhpx%2FTw8C3McIC%2BgxZY%2BhjYUHmLwo%2BhoJtPzrEau02gyf2kXUi%2BmHstwjuwPg0RdmwK0WZ2LkFZo0yWbwDgm0uTM60FmjhDlFCe8Z9TSmR7aOz6oeMie1q0BOO6fqLCx62F5zEF0j2CK%2BMZIsuY%2BmHA8HDwGnNDAlH7r%2BIxWvCNJ98z5WJSCt1Xh00doC8%2FcCCN8ZxpE38maaay%2BkN47r8jokO2Z7zWC7xNP3km3JgOvnpBK2Ray9O2JLweEVzgucKfYMNiDnOQs3U79OT%2Bce67VBP98aBywgfB6dV46Bm8rmN5bysctL3OcOxB23ELGzTzWsVdz93NZdrM8s%2FOr6PD4JXVRAVCMbfv0D6Rvx%2BEKZLsGtJE6kjwdiWaRKd5fr8fvPjv%2BecBCv1oNwIzvY9JjC6iclk%2B%2Fd%2FzZ0eit6wQrRJfJ8zsnPJ0Yn%2B%2BxuOpXdxxmvGmAJ4Ke3wvW%2FunQISlkzj4L9iB6zF766Fqaco%2BU8vdAc%2FVIleTyw5mME5qY%2FU9p8%2BYmkLr2GeFzB80fhUllj6gt9zIyq1BWG20cPoHa4vxRngonZYQDlX795SFlgmdnKOX%2FgUPtBUmwmM1JBuRVnxiU%2F4nE4F2M2If1P9WBKElmYQXgt2eV0md%2FfWjPb%2FbCG5lPiFkCxXlsu36QW570N2R0Ix1zOOB37xk7MULED22CjWy2h7hrQM3EAF721B0TYWzfsPPs4hu50xYlqq3jnH7rEvX4yVRsuuyR1XWBzJqVraq8LWK9OP%2B2V036WqrgiS6GeZSQhUsmV5lE09skmN%2BI1%2Fy8YFfCcX1Nb393xvySBR5uzbN9JJeYuCxqyizkZP0i4%2Bkxqug9jUZ1laSfn90mXcyRtVKkgJo16riQL93lyKsZH14OkGksrVF1zFluQPSfQ1Ge2PjXlQ7APJMqVMPVmLY06FgRTt8QpYg%2BHDSW4dMg4FQBdTyuCAYMpL%2B6b9rItHASKXbR3WYLBdApsrURc363x017fAakVMobMyU9rnTj5LqI8V1AwLMzw3eIPL0N5momtwSMa2%2FJ5OFBairIoSmahVUdIRT0kg04apCo0%2FGVtNJP7jtNx0TU74s0PmuMFDfpizqk53UIpw7W4Mq9p9ssyCPrwM3tybbKRYkcol922D8s9YZW20Zmjb8EVA0hKjU5eA6mRgKZeQOWi7fuEBejOoKwdsKuhp3nIKq%2Buzn0D9VAUu7kr1QwOoFNEeS4qbT1KUYO9HqDAT0oS9D9%2BDyMUFbzvja8%2B7UR5sNHl623CRKqIDM%2FuDpe%2BnNev8pHVENsTM0mqvd%2FR9aV3v%2FrSCMDDfwkkP5HmTHaInywHhlUHlc1H1%2BJPJ7k7%2FdNIidBOnEkdhk3LIibX%2BcaRewWv65N1UPRR8BGCYZcA4Cnm7jQ4HykFx2nNOSlY1oI60LQoIolfPw7DNx4yoexmAegxDIz0yEq5SpcOAPkB0SmBvV%2B9FS%2BMKB28o9IvNJIvW7A77ni%2BLhFMDh94pEzOMxSkn0B4p3S9T9MZccwRw1m75Ah4liKqEfVsGwmWx5tYnFptDNkdzLsT%2BAfguVdCINp9a1lmV7M1nJc7saggC%2BvC0aaqT%2F8FixPYNfCe56nLM6XJvPivyWdCLqxeQl2RU2Rfr7Wm1LDKBUdnqN2nbLw%2FhaTJfXc27dnJUxzxqOsQYQKwR1WS1KT3MOJJaFVgNQ0XdKpBh8rA1ZCQ3BqTp6UVU7NMpPz%2FgTQmTNzl2WAQKhG6X2IE7QcWcZ67ARjF9cFiAecsMI%2FhWyybEpf3bHMMNG8BFKSqgoEd6zbDpSwT6cDG10SOifaUWmqqSZ%2BRe8HYuKazbiWGTjZ0fmKoYX50g%2BJLXQ3cov%2FH0odUSoxu%2B7WthOgyViRc9ivvTWejGMYaGJfh6Nmb5VU1LAUDS%2F4XIMI5Xi0YFPZRpW0okTNxnrzBk3iQz7AH6R%2Fgc0sesT9XIOISG%2FugwrMYrXlPEVv%2Bqrhv25WHS%2FxIhNHDslShJDbOCkD6dGVXOkTuv6c2bIECcfur6bSiQvfb79CcyXz%2BScRf7glzRYKLId47Si3LolY0bB9295bMGNyAib4uveLBJdt2cI%2FuxzuKwGZ5feZDOBHdG64Mi13mMLsN4bxuVNkrj%2FfpzuGd4nz2L3eaF%2B3w6MtHc8Eh2Rc7oMtiGZrDB6Di3BWTqxb64Q4D%2FnLq%2BctL5Hx9EJQYF3ZWWndkEH0Mb4qXIvcR5o15o2etpwLaV6ICIW12kHqnya4SOo0lbfwWqd5zWZ9Zsbjj6hMQx0u8zkb%2B%2FhnKbvjrd9OHix5jeNNqELpCHMNA7%2B%2BWrwt0Z7iv%2B6S7oUG52q%2F3GvzsWezS3wfilvYyxy2OqK48rPyB87ttMB17COlsUJR%2B0MqGPZDdxPkYG8UKKV5dJPQn0DnGkQS8V764WVmnH%2B9fJPOTS9%2Fiw2sDEtq1v3gTUHEjlp0YH4GXxSmRGDOpm1WS1yDUTDH9rmnpfsvdw2UanJh6MZXzFrsKpVFiKNcsd9wpMagMayn9ilYp0YJtn8frtPfvsoZjDk5h5rgYu2CiQwUpnmBgRTYUTEQl0fwEgyOT%2B2DQp%2BoHQZlDZ1d3VHD9KpsxUHTuBxve3FszpGNdyceS7EGgPmM2xtYMUf%2F7DrLE%2BAo%2FIj36TiK5lSACVv1nGghrqCZP%2ByxcFToa%2ByH2q6T%2FUT%2BD56aTdBh3gXTCYc1xAjurwFNqM0igN1I6nQZPvMkAjsCDE4w%2BiZA65M4drIKvqskLQBmrcjq%2Fe8yYumxjriIPUETB%2FOrI0UOxDBKPeFPQssSPOK9gpxNy7Ao3sM2v22JjwlcE8%2BENZPmCNwuUZIEoaJQk4R7%2BMqs87WTVoHYfhwyl11F8Xh%2FgPt8WCWO0aneBvKmVWMBm1Wav8ZVG6hXxM5YLVVGg3BtthrARORdYtNZVw9JSMt2%2BfTE7LHOMZHZ5Z92d64%2BRsZyf2EHZ4mJTdQpNz0dAyWlJbz8OnSX8kh0gkRb6sJ8DvipXNLcUCQPKqw2PbsiNlYX06%2F85Ewb2mdTyu8vGMrzreMXEY5SM5S3m27PjVpYCDAmeSdUqAdz6drV6syAv5deK2FKDcQItY%2BfvVLnRBCstFPo4j0dQgs8j%2Fdo2PNqbPmqs1evE7qaAqL4xKoD7eOy1%2BYxlZhAKfVqsNxpsRKgWZp3o713a3yf3T4QMKemuy%2F%2FkmnK8Z%2Bk5sRh8pItMzJgwA0nTVlSktdxUIWEhV%2FLff%2B%2BtJ7hyN8RRg0%2FbJFqRjqJnLU6OCT8eAjpgMkQxEz5CPu9VosCPMJT8zT7p%2Fd7XwxpLGtiMdsYgHQ4sVAk6YJtLlZsaQmxK2NKkKlJGCPFU2hjZz%2BYAeWWThFSCPBRVjoPK4aN%2FbQec%2BGW3a%2BwOOxJ%2BH58NvutBApgRCkJX3LKiwYHg2llLmkKjwgiQVDwyEWmk7bbOF3VSnZK%2B4ZRSlw46mz9ne962Uq8BJEsXI9asSpwQBRoEu8H1ykH8PQdcwrVGAgABltpVt23wwlQJKtigkVEfYpBsqMhDL7WMC4wNM6swXOt%2B4xgcizqL1fjO%2BE4v3Jh0dS7abrg7v%2BNAx5xYlIgU8VfPBeogv%2Fqgdsow6%2BaF0Kr%2BWkOfL1RgV5wSC6IU%2FEFsvIODcdYO3coBpufX6JVOfS%2FL2%2F6h557C3bxo%2FVeEnbYoz1jNLrTR5w9wPKlbQctCQJMYqTbVz0OYYbBVRrtjcrrkKcIJA5kJhR5mdj9NgpsRwNtMyobAOXREh%2FCjrSUvEHZ61ravMZLiIbWYivNBb4IM%2FXTiCWNAYJmjIRcKGsVwB3r35qHzL8Y1msEdsOoeA32pdEP31c6%2FSRyXgn%2B96nKu6U0fI5VeEVTSBB0tSqSs5kslYwr%2BaKxOAw%2BYxFMG%2FcKF6Aynr%2FRMYmKSfp0UTmOWRdYJ3EGlZ8L8ZksZASJPj6PtOQZVw%2F%2FXOwj63fyZawNoqBgZRZNNGLVLLtS0RVMKZM6nGkiyQ5Ji3mD2Q3OpRO0G5o921WLqlRvJNxdZKWA8L3N9Ehq2zp2%2F1CHp8T%2FIid3yEtkZN7NjMDfmLTM0CQJAQM9oIjbK2R30eIOqJ2LLUrOpK7yQtmK6bsT5x%2FZGHGTIOukF%2B6jyRe2Y5JZUMjby2LrZ2egcrU1e%2FZOPTSSg2qlYf%2BFpqQO9RdP%2Fc73MmAL6qeymkX7kBYIWRY6lfM7aO061xUDBv0M6USFyvecG3PAUuZ8VqFowUsZbomaynxOgOqngGZqWMA8ohYZAgDfEuQfSiJTmVpEF19iWVZIpdC5lUr%2FyM5Dg4mywraPbJrrjcq3Z3X%2FXpu2kDjdICjX2%2BEONnjbR1SRjUiV2ELmN6kiI39GxW%2FzdfLwMAfErwPQPnG2eJhup9ttEaRniS9a3j5HVQuBy16RKv%2F%2Bocqhsz7vZo2zYMwcxY5hLBuyulCAMK%2BAVTFLuZV1XALC0VKIRVdvtOF4ZGi1JmZiHbvkn7AF18myiciKt%2F1aWnDSZw0nNEULyRz4z%2FD82IbBuqpxcBUkUzSeZZnelZFDupqP%2BHNJRZkyChrjCR3XbdTq4EsX2t5RPifP7afOPe5OMru4d4UXEHFN9rpYc1wDD%2F7BhCSCSMckmawWbk7RJMSQiE8XeIOnqG%2B23G%2FWKW%2B3dnauN1CEbI7qyZuQJ%2B09ItgYDlkxS1%2BjeyPNuvZFcBtZFG89GuRqT428tXnVx75NhQ3tvwRQ4XBPKQYTD%2BO2OweIssXIHuj1w0eS2drLCvrC1PfaILJ%2BEaoiijF0bT%2FFueM65kEdIlqgDI9TwPhz8nZx62mBoJvwZ1LKWbZFwfzU1O9DOMAxNMK83s3sRqy7ayrkFvOk2l%2F5FxAzIOerljD1xqOAKjDGxsSm3YYsvaER6%2F4w1mdSrbMlFVdsy%2B%2B%2FphFA7Kbn91mYsHayNZX%2Bxg1pO%2BTFH6ZoAjExqUmnYuawu3YnHdxtI%2FGv%2F54DLyqIsBBAWDQkVDkEhafQ4ibvJ2nHKKghbjNnbZznsreWVXV%2BFNWGoLixv%2BLy61JFA2GIs2xO5ztfVY4tRGvcKdrtJeivNai55z4Rvnt0mGNf5tdTA1S6Uny98KPyn3LD%2FEsFHw8v4I%2Bez68go6wHo3wDgnwiWVm66r0Fx2XnvAlfkti1ac%2FADyLw%2BoDE9xl145RWovxU9ScseEft8lt0nxcrA9Hw7OS94NoCS54CB%2FqgEomX6hcLwxfq8o7GsiflR5WecUc3DBM4CjtRuVoDDhjegs%2BQEdurX88hYB%2FgWXwg8soqvWcuZ6RBCmMnrg2ep%2BQMjeFqCNNd0elUuSid2octGf0HbSl8p5QZhVVL8AveYfXzFfRgNTqPH4dhsjrwk6OG5cFZ8vtCRkYVUJNPk94Y4%2BCz9vs9YR8BNAB9K7GTswAP3kgLwzNzz5%2Fp3wQIKNHouOuCkeBIEPtV5XEph4X3%2F5J68mou5GF3tdjZrpSzNKUMKGkbUBzxQYjUto4lyppg4A%2FizZ2VXnB5anosOGMe9ECokkurHjLb%2FwL%2Fb%2BTNdqMrAnG7vEsAysrYzhoPZtWviGugDrbWY1mtbnoX7t0ZyugZnhmv7pNNLMc%2Byt%2Bxxpzhjttfsw%2FQWnyDdLPaLpHoM3twbp9BxeoLimIlfC3tAzIaFfXpSq5bj%2BFW%2BlQFYiOilGgfb%2F4rXfGCINuLc7ZZUihtgWnURBHOtTj7UQ2AYkBQT%2FITlG6OwQpIi%2F7vbKcFMjVQuSFl9iqRz7rYqDBVEtwPO2FxrS8ujPS4qzv8Ap6IXrROyh0zc46yicwe%2BUmko%2BWW0XoLxMMXmMgLfcUQWakCs1VBLgjXXTCmhVst8lxPeS6VIRHT6ehsLJsIYm3cclMiMrziOql9YVYR7MwzVAjU7tXFjIozBBg7szQ3zctVv%2FIKXHYwFboxxvAs5UopTeGvnyFphLE9E%2Bc5ZMBmIvbuGjtFAo9XASMPVger%2BdbsOds6enVRGCBYtDi70l%2FhPRRN00cmsisgqJq4O1MjfGKQ7L%2FPBULy%2BbT2A%2BqsuxS8sN4TDgbF9MxOsebxdK4zHlVTmZf0T766pTkFj9cQNq%2BOn%2BTv%2Bn5k2m1uuBWnhknFTNUw4VoEizPEVFoqOIm6HIzRfpq0CFBVgssqNvA839yN3gmFHzFnZb2k7zc4r2u7%2FyhkutgJeS8p9x7uAjqP57g63I0KulAXWdXUNsIOGHROAoSzF6FfisDZLzzAfHc5Ty3Z141azc%2BoYMP10c6Dap0QEzSEbNYYCChBqpifhELMt6yD7JImnPrHWxh%2FkfMWdCFVEehT3%2F3QKUO%2FdLelE4MUKm0yNQeXgT6FQDsC3ItfyKCtC3M1nXfowdEU8XzigLqSQ57APBpKlU%2Fifwx%2FsFa1IHH%2FvnCq8Ykzwsn%2BSyNEzC8JuruvUyD4ncKlITJSYcZslkAoIPLEgwDQZMF1ik%2BJ9ByDCIwpva%2FpiHJmFnKdDWgQr%2FkGcQrZx%2FepdDFTz360J%2FYy6fvTpzgFIoiTjJptW1OTU%2FpmkeMsLZTDHLvgkGuXyOqRYyVghPSn%2FzO2yPxYvpy3FNjOoZRcAtRV5MOiEmEr%2FcLvUNIjTI7J%2FbxBZ7S5zEE4pKQUAGB0dYTWpnaVwFFwvLzonnDlee6okbB4GFlRf8CpRzFKQ5tf9l%2FkpDackDt5qJf3Vj2qwVGwWN5hgQ5%2F1cctYU2xfchSynI%2B3DAK%2B9SrDwxPZTedd%2BshjpaMawxCApffXXXXfBbrcg3SZcl58pPo4mYwO%2BijwMl1WKfeHBRReNeWAdNSWKZ8N%2BJTSq2RiNnM7TRvIoyEZ827DQmClFdpmvR7OKZiiL4rovOyrpdtPPMBjmA8lLHsYXI9bSyozlzVKUpM13SriatpQudX7%2Fl6KSqDTJdxP9gkjWztG0ok4aZiDrl4or9lhm6Is2HuaB7FHeq2q%2FbGBVc8kvI4rq7A%2FJ0dwA9%2BJMWh6HCzkPsIEB7ppZdWh8myBisbTCi4b1XgYc%2FL77pUEyTjUVCkKVY9HzGt5jWj8u0bDmNcCmHKIJ%2BnL4BbJRxTHFtHLOFhdohNScbWOqtin%2FV9ObXjpozDAFAiGzW8%2BZMsEF5ic1jgTcnvMJbnQKi4v38RsB08CftKgynP1ffT8JtxCMrw4SjBU%2FDjuvz1zNygchKuUb4QOh8lcfEhgtP9rdIeBRPj8gVQP%2BST%2Bw6WKNZa6wyd%2FhUHtnk4tseLWF1iyfBuGhlttSYH%2BcUnxiDJ3NFcAJfaZw8fFNMZ5vR9fEcgYpPaK%2B5aZIT4K1NJ9vMpLC7Nar7hYcYeDZKouDANaeSbpcZIo6hVA3mv3revruZ%2B1jXoF3JF7cE16mojknQnFwYB9o%2FK1faEOSPngE51jtA0MRw6uFsQLQ%2BJMnb1OoCGjwpQE%2B2WxfYp%2F4Q261hLjxBC%2BXYon%2BmiYZh9vgRXi0NY6d3otzMaGQVpVnA7U7tEKAbLtETyWHKnqO2Tp1Z6A238R1apfvmvkdW9K8L3PiHEKiqHivkYJ%2BBBHJEcfds%2BrGUm1OpVnP4mI4rP9wAYnvNs3%2BcUm1XSlMgmMpWFPyRBFFcYeQnEzRtP9bXZfVJGx9%2Baf%2BM2XJgguOR1GdCvbzlLi7ElJIE4Rf5mmS8dOe5LorssSp1BTsBIVTcNGUYdoyN5oW%2FRbeNZLMbKVQrd31Q7MhwE4AoDDavjeGoazZtmlS7xoXsc7vafJodyCTIxRh1KCeZOlbv%2BDSU7H%2BB8oedAIz%2B%2FLeP%2B6WcGdoaN1qaNXz5quAnp5jvTVU2nRcwKd5L4q2larrfhK8ln4VMCRWTAHxEQJvdPfhLjsFIDFLo6VgouVLJVHdzz5TtJ8CLywDcMYIyXI%2FGfyrLpUcWS7k%2FCyLDsdnKPG0mzU8NILRx9%2F2DTqdU2A00eoTqfHntcs%2B%2B53ySwU3ilZKdu%2FsbLh3%2B%2BA2lO0XICvxF5UddAg8kGprIBhDqA7wpnrLrtg3stNyBf059O%2FFOeiszS1cOEXkqm1lsoA%3D%22%2C%22interpreterSafeUrl%22%3A%7B%22privateDoNotAccessOrElseTrustedResourceUrlWrappedValue%22%3A%22%2F%2Fwww.google.com%2Fjs%2Fth%2FC7Y4SiTzZmrcyV5UfQkVifmqs7JfR8xYeORdOpwzQYk.js%22%7D%2C%22serverEnvironment%22%3A1%7D%7D%7D%2C%22adBreakHeartbeatParams%22%3A%22Q0FBJTNE%22%7D", + "sodarExtensionData": { + "bgp": "", + "bgub": "", + "scs": "BUSGWviioZoTYLOLZhcIPwJy--AsAAAAAOAE", + "siub": "Eogomir0", + "upb": "y" + }, + "trackingParams": "CDAQ-fcBIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + } + } + } + }, + "slotEntryTrigger": { + "beforeContentVideoIdStartedTrigger": {}, + "id": "67c0ba8a-0000-2697-a1b9-14223bb5ae26" + }, + "slotExpirationTriggers": [ + { + "id": "67c0ba8c-0000-2697-a1b9-14223bb5ae26", + "slotIdExitedTrigger": { + "triggeringSlotId": "hYizzUlSHvpUnZTe" + } + }, + { + "id": "67c0ba8d-0000-2697-a1b9-14223bb5ae26", + "onNewPlaybackAfterContentVideoIdTrigger": {} + } + ], + "slotFulfillmentTriggers": [ + { + "id": "67c0ba8b-0000-2697-a1b9-14223bb5ae26", + "slotIdEnteredTrigger": { + "triggeringSlotId": "hYizzUlSHvpUnZTe" + } + } + ], + "trackingParams": "CC8QzOgNGAEiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + }, + { + "adSlotRenderer": { + "adSlotMetadata": { + "adSlotLoggingData": { + "serializedSlotAdServingDataEntry": "ChMIhK_hvbbNhwMV4mxBAh1Ajg-_GhgQAUgBWAFiEHltZ1FjemVqRjNiRnU1ZWU=" + }, + "slotId": "ymgQczejF3bFu5ee", + "slotType": "SLOT_TYPE_IN_PLAYER", + "triggerEvent": "SLOT_TRIGGER_EVENT_LAYOUT_ID_ENTERED", + "triggeringSourceLayoutId": "qLYvxrzZ3iSfwRkS" + }, + "fulfillmentContent": { + "fulfilledLayout": { + "inPlayerAdLayoutRenderer": { + "adLayoutMetadata": { + "adLayoutLoggingData": { + "serializedAdServingDataEntry": "IBAwAjgGShMIhK_hvbbNhwMV4mxBAh1Ajg-_UgYQAUgBWAFoAXAY" + }, + "layoutId": "bj8kp31ew2buiJZs", + "layoutType": "LAYOUT_TYPE_MEDIA_LAYOUT_PLAYER_OVERLAY" + }, + "layoutExitNormalTriggers": [ + { + "id": "67c0ba8e-0000-2697-a1b9-14223bb5ae26", + "layoutIdExitedTrigger": { + "triggeringLayoutId": "qLYvxrzZ3iSfwRkS" + } + } + ], + "renderingContent": { + "instreamAdPlayerOverlayRenderer": { + "adBadgeRenderer": { + "simpleAdBadgeRenderer": { + "isSponsoredBadge": true, + "styleType": "SIMPLE_AD_BADGE_STYLE_TYPE_STARK", + "text": { + "isTemplated": false, + "text": "Sponsored", + "trackingParams": "CC0Q474CIhMI1LTfvbbNhwMV18NCBR2XhgKG" + }, + "trackingParams": "CC0Q474CIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "adDurationMs": 15000, + "adDurationRemaining": { + "adDurationRemainingRenderer": { + "templatedCountdown": { + "templatedAdText": { + "isTemplated": true, + "text": "{FORMATTED_AD_DURATION_REMAINING}", + "trackingParams": "CCwQzr8CIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "trackingParams": "CCwQzr8CIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "adInfoRenderer": { + "adHoverTextButtonRenderer": { + "button": { + "buttonRenderer": { + "accessibilityData": { + "accessibilityData": { + "label": "About this ad" + } + }, + "command": { + "adInfoDialogChoiceEndpoint": { + "initialStatus": "AD_PERSONALIZATION_SETTING_OPT_IN", + "optInAction": { + "clickTrackingParams": "CAUQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "qrCodeRenderer": { + "command": { + "clickTrackingParams": "CB4Q1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG", + "entityUpdateCommand": { + "entityBatchUpdate": { + "mutations": [ + { + "entityKey": "EhY2N0YtOFh4T3VyVWFISHh6VU9lME13IKQDKAE%3D", + "payload": { + "qrCodeEntity": { + "command": { + "clickTrackingParams": "CCsQpZsIIhMI1LTfvbbNhwMV18NCBR2XhgKG", + "feedbackEndpoint": { + "feedbackToken": "AB9zfpIVD3A07lETKT87vHuI-Ap5-UfnWHXP356feNloxJVQ3xfhqX4MOX_D4Ym5swCo4yaO0LSMBP754giUYzUjAJjt4-Z-EkcOxAO3b1ojSoMsKV0c4Grmzz9P92WKMgbL9uCk6tzkwBoylKaD8QwF6cRQ5SC_vZdR2fg63t6mgPAxyv8kGbFIDZVjXkS1yThG_M1svOYjjtMI1tmTEWIjwFVCMgfQLTt68yUrbcYEE6aYx2nMpRLd0GWBDI1gx1OZrmWa5xC0NQ6GRl0b4yXLvn40FDrM-QBFHKZP4uVJo2qBJm7bqfmc99f28wVspsnt013oluYvT471c2qAZZ7kWstMQ8VXBKXv7IfREpZy3bAaWeh16pR3-h03zXYesUZwEyA1o8gNl9FE8AyuERvt2JV_avL7HfHySfmqUHHTZw3yaXm532rA-eWKmE6TyTjWs787wskH7iYDjjpBk1jvPXmupuY72u3F-ivGLa5mWCUxJ5Mh1EPSb_WAnlpsBSY0GBW41pefe9qA1u_hY6sdgGHKJxWeZO3yeGgr2gXgb9BK0B9QmKdTtc5DzGB2ntNTet5qTMm-MRIiXY8bdR2Axqu-cFz3vGqJ30CjsIOf7FJdtaX8_RmXOPtY38junPajkPXB2xE1QWX9GhyJB_aIaPU4cTiW0AfbF7FFS8pz7rQChoQNbDBsoXV4Ge-t4yg0X5I79X1NK9E7w1jxtOrdqc5Wsu96YarLDcKS0oat_Lh33pThCBv7Zxssl5cXTCl9atBiIdSYwKHNQ9G0JHaIxu2-eznQiimJvTbzKy7PJ1oerzli-QJ8icUTCps3GG7bXSoOGyh2JezNQLhj49D6yGLOfrFC8SWgoP879OBWWEnK8GXfJVJ64lwhFiCrPesSTMVuw7Hy0vl1mA0AD3yoAghlvavb4oa8iLUGAmnUnbCjY1bb84VOBaYh5PEuigkpmnJUD8MkQhf4JIbulXpT-Rd09gj4ESeNdU_dD5-0OCdAzg-R1jnFwFH0Zm7cAC1ZJQxUYvL4L1VF0aQmy94r4SM4foAX4yC03kLIpmL5PH1tRfGK4eHmoMcRe0p-Ag291B9w6BS9hSwiy0IcYBVdoOlLq8hE9DGUHaczKmFyP1sNjP-BW9cj_yqECIpEKAik0fLe-lxHR3KawSxJ2v39FS2x1JKLxcqib8JbZa9ezD6uMxI7U4ATu44ZWCkvsCijYfmoff450BuIWgAm2zCOIBEj10HpBRL_d8a05HarUxT9Oamq4V1_tttq-iZ9IMy8gJO5ddZAuS-Vv7kPigeOt9xgWgQ7ouAANHnF9Fo1TYgeIFIgFRJf-qoIVI9xk_ChcqCFo6iPzAW8YzpJ7zWCndqIajJGxgo2u6dYiJ8sFHCpjKjuAAXpnXpsSAM7EZlid1ygwBlNlALx-3FFlUfZm7JFpQNG7YEptDn0TX6GdjmaAsVS3ft41MoCultQ7pDcxSS-PncCsVZ7-OJbnkHxEHrgU3hqdsYyqo0ZIVbt-ndN8WTx2aem3FB359XfVmmzwtGBlbVxcxkw9MKAiJVHYW9E8sBQSPRlHbBjgIGaaFFpae2Z9w78OhVoZT-m4GZhsoHCzSUBtWzIW3q5mM65eb71AsDy7FBnq28NPx4HQe_0Z52hF2JatLinil_QmYJzqv8zTuBfSLMzSFBs1mRwu5iauZlkGhr-9woj30nGqmzNP3pDZGyQw0gcyEQz8IP3LfDoP6sU1nhUWqhvJuOHtXyfgaiYEMrWGEyJg-3HyjDUEEtCzeJDrpd6dQ7gOUvm4gsJsDRXJCDtq7azORFKyRtqdLS1R0MUNkfcUorO6u2yBfQT93f_xeTaav01FQj1r38ebGYPS68lcNTqbit2V10GXCdpZN8sQIQWk5Pj8j0DoAN6iCPX4nb54Cojzog6mFS7UwG-VOlxkVJHEthDHR95dEEF6mTusY54czNK7w0D42BtGjDOJ9WDLWUIndumxIMvCjkwdZ9URtwA-MhdPykjvs4nT_GslB01KUusamOa4QWIOyW37hXD2eK2RNXXJcv-FWuQ1iu_bQWe7qzTNsOKdPgjaCBAEpHDRmxjwnhZaeCKVdWidYGe4LA2VD1A638-DYmSxBzw_ITeGOaSTJ9PvhggYNAp3oYUhWi971NjPONvzbGdNmBbWxKom4AdoS-1Yn_GeHoq9lp-BpAzLWmIIo0drcLWwmBa_uaGVdOHS8joLevTSHmPNTB-uVsk_5mdSQfk6mkvNc5JdYICsHj0mExiR3VnW3QqeaJ7yhO7gJgzWPSnox9YqIKmTf8rRI_LAQTeoUu4qJ9f5TS771swgU7ZpSeM5euwGh7Lv9q048R-F3aJCjnmecSA20eeCSctMO5WAjpcjvhK5hobAz2lVTubVYqz87ljuhXwehP0-Av-Hswxf_Ps11uEIRNyoQiMT9UoUvHluqHllP3EHuJC36nTku1AwXiN4WjqmQQ08A4TGLSUzryj-ODXE9KCundW8EyOnJuQJzhoLqFPvfR4UIDAXI_Cp6n2sTQbjl1g7PYtzJgUCDNBx31Lp-MpFMhaYbfMfZH-8Ba6XzxR3DMGqO6HkNuyF3Yi0rPK1m4x6yhjILPo6EBThZWMAC9JCSJbCVDG1kjsQ7MMmWi8DZMDVudRvsSuazWgrGXXIfUmlgA2eril0x9CgHzAav6cdNQzbxTKmjPxPnszEHc6ZvTcnTUwgqj1MJmtum4Va8ICPEnIkwtcJQ3_xWnDxVFyjoD_JMzzyI8_Ir36pjXA7Ri8fXbfivPhkPB9L78kpKFx_GLKM7q4n_mGuXDEF-n-cLQ0SCUnvGxaN7Wul_ORCYtyjI7qAXgX9DOjLn-EPzdntcnddtNRsjN7XmvKYSvl9dIqO_fE-Nmg8nGpUovtMsvoo8cty130xajQLo-f0QyfmCpZ3TST0D27eHmqDRJ-iF77oZhN" + } + }, + "deleteEntityOnDismiss": true, + "label": { + "runs": [ + { + "text": "Or, use your mobile device to scan the following QR code:" + } + ] + }, + "labels": [ + { + "runs": [ + { + "text": "For info about this ad and to manage your ad preferences, visit" + } + ] + }, + { + "runs": [ + { + "text": "Loading...", + "textColor": 4293651435 + } + ] + } + ], + "qrEntityKey": "EhY2N0YtOFh4T3VyVWFISHh6VU9lME13IKQDKAE%3D", + "spinner": { + "delayMs": 200 + }, + "style": "QR_CODE_RENDERER_STYLE_ATA_SIDESHEET", + "trackingParams": "CCsQpZsIIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "type": "ENTITY_MUTATION_TYPE_REPLACE" + } + ] + } + } + }, + "deleteEntityOnDismiss": true, + "label": { + "runs": [ + { + "text": "Or, use your mobile device to scan the following QR code:" + } + ] + }, + "labels": [ + { + "runs": [ + { + "text": "For info about this ad and to manage your ad preferences, visit" + } + ] + }, + { + "runs": [ + { + "text": "Loading...", + "textColor": 4293651435 + } + ] + } + ], + "qrEntityKey": "EhY2N0YtOFh4T3VyVWFISHh6VU9lME13IKQDKAE%3D", + "spinner": { + "delayMs": 200 + }, + "style": "QR_CODE_RENDERER_STYLE_ATA_SIDESHEET", + "trackingParams": "CB4Q1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "footer": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "secondaryIcon": { + "iconType": "CHEVRON_RIGHT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CCQQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "onOpenCommand": { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=user_feedback_menu_interaction&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCUQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + }, + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=2&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Repetitive" + }, + "trackingParams": "CCoQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=8&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Inappropriate" + }, + "trackingParams": "CCkQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=7&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Irrelevant" + }, + "trackingParams": "CCgQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CCcQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CCcQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CCcQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CCcQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + } + ] + } + }, + "title": { + "runs": [ + { + "text": "Return to video" + } + ] + }, + "trackingParams": "CCcQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ], + "selectedIndex": 3 + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "subtitle": { + "runs": [ + { + "text": "What was wrong with this ad?" + } + ] + }, + "title": { + "runs": [ + { + "text": "Stop seeing this ad" + } + ] + } + } + }, + "trackingParams": "CCUQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CCYQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "BACK" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CCYQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CCUQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "title": { + "runs": [ + { + "text": "Stop seeing this ad" + } + ] + }, + "trackingParams": "CCQQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "secondaryIcon": { + "iconType": "CHEVRON_RIGHT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CCAQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CCMQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CCMQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "clickTrackingParams": "CCMQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Ad personalization from Google is now off for your YouTube app on this device." + } + ] + } + } + }, + "popupType": "TOAST" + } + }, + { + "adPersonalizationSettingChangeEndpoint": { + "serviceCommand": { + "clickTrackingParams": "CCMQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "feedbackEndpoint": { + "feedbackToken": "AB9zfpJNn9y6iX5doYUpXNqNeNiZ2Y1wB0MSXjCqps-YHZ6iM1gCebTl3e1w_wIZwnIAAmKDdD7L" + } + } + }, + "clickTrackingParams": "CCMQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + ] + } + }, + "title": { + "runs": [ + { + "text": "Turn Off" + } + ] + }, + "trackingParams": "CCMQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ] + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "content": [ + { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_BULLET_SENTENCE", + "title": { + "runs": [ + { + "text": "Google won't personalize ads on the YouTube app on this TV" + } + ] + } + } + }, + { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_BULLET_SENTENCE", + "title": { + "runs": [ + { + "text": "You'll still see ads, but they'll be less useful to you" + } + ] + } + } + }, + { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_BULLET_SENTENCE", + "title": { + "runs": [ + { + "text": "Ads you see may be based on the video you're watching and your general location" + } + ] + } + } + } + ], + "subtitle": { + "runs": [ + { + "text": "Here's what happens when you turn off personalization:" + } + ] + }, + "title": { + "runs": [ + { + "text": "Turn off ad personalization?" + } + ] + } + } + }, + "trackingParams": "CCEQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CCIQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "BACK" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CCIQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CCEQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "title": { + "runs": [ + { + "text": "Ad Personalization On" + } + ] + }, + "trackingParams": "CCAQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ] + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "title": { + "runs": [ + { + "text": "About this ad" + } + ] + } + } + }, + "trackingParams": "CB4Q1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CB8Q8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "DISMISSAL" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CB8Q8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CB4Q1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "optOutAction": { + "clickTrackingParams": "CAUQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "qrCodeRenderer": { + "command": { + "clickTrackingParams": "CBAQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG", + "entityUpdateCommand": { + "entityBatchUpdate": { + "mutations": [ + { + "entityKey": "EhY2M2ZTOE1WVS0yS2Ixa2xfZS1ITFhRIKQDKAE%3D", + "payload": { + "qrCodeEntity": { + "command": { + "clickTrackingParams": "CB0QpZsIIhMI1LTfvbbNhwMV18NCBR2XhgKG", + "feedbackEndpoint": { + "feedbackToken": "AB9zfpIYD4NTWPnVZcitmvJ6heXHWmGKtgv7NcY04iZsMqXk7jQ9Xi8eT8KbPQV-9suG22eY-B11kUbz9gDm6yWkqqWwNjKxBteDTNSNiHbxthTR02Tyai3AhdeGG3aPztj3IZrTwpJKbdBnrvqpeJvwcfnCwBgpV6QtRsUwfy79u0icoAmpUsDvciRZwT-0qau--P6ikyqIxnwe6No1cDilWl-BeFFqQAH8NNQql99dIUoGVmO-RCR3PhTGqbqhzPIOyz948l1--ujgB16jNsAftlHKRaNnr1i2eHYDJ4BPK78KL6pP-bnngHLq6R7A8HOlJukwJJSqSvbW1TkeBYwitStywizjtN2Ynn6Y2VHVqXoXy3fR8kr4xvfEpt5bOB0qks3wY3olEv88fkr9RuwZpNqyfCMXz_bae6Xpcctz-nPi0dFickBNZszmuEs8X-1U1WQHHVOoS4SJ8hyiIQSWuqFNzPRg1Y1jpMYG8V43XrpHygvDRZCQOdmdvloQogWWLmj-jpdMvvg9pY8a2QMmmFx3RARutwRR7vfeCceLP-0snVlpfl_EUt4RWaKqxHVuEPXZc3xRB-xmY1EkMHPZ__OIzNUnr1wKzcMn8Z9FUzFy16nrhx6H0W_5oyoFyHIuHL-EnuBlUoVsDRfGwX2pGdnLtweR6WcF3q0_f_eVAAaEEvOt8LPjDrnTTJP70CN_7g6-mCgy_9XtA3076bEkQju29p-ukbz_T5k9LJpnwgx5otemcHRQE0Yr4MA0dcunG9zM9XHZYpEuZ0vnl7mGVVJmVd9X3v7TJdaN4U8nMk9zFj-TfmethbcJi4kBBznsy0_TqvYDwys-GzoAX3lz19YUwtdyXo9SxmmnQEIRGZ2u4PBZwVuCvEYMc4NGlQYOzwSZWiF4MWANL-DEWfG8JMmQjzhpqSwaUoAXC_UvgWX7gqI9mQIAKsoq8052ZZtxHKuDcEiD8bVs_WyeiYNRRuOW5hcvIDVlMnItZV5BNQ7vfsJqchBdrC96nJMSpTC7dHHEJPxA4t84Rl3ysqyyXOP3NIND8WzpWf3y5Ej2fEK_kRJHuVlLqdbGxprMJRV70GEDadEak9v8Qdq35rdO4zEUkgEr_e4SddPx3OfEt2zDLEEOiW9eZUCsLygq0q_1xwYFng9YbMfJXV5ZRsiXqs5ueKxtd5ZhP0xu4JpHiCRZVHRCGCATcUwNPBh-nQB2c_f8ZdUuXob1CrAQZqsZVtCfEcm2UL38X1jZUbYM8-J0mlZKUky6LBsQji632gqXqkjzC9Q0HScd4WDHEWbkRvtL53yri6iZrwM0foU80254nQt-o6RdZwL1XyxNi-OefuhWnlBO1aIl2QEbps55-5kSiHhKOabtsAcXbmexKY1VImKex4aQlY-ePjuxklz3_HHgJJpxu54cw3Aq8iTkJyCbN3eEbT0XG3DMj6HGy1YK_cZAZryW12nwZ1YpjHlom6mq5sncTMh9tphrAdKWIYPvJHFWzAs304yIo87piF1VzfkY2QN2sxGfB-1_mjuA3J1Qobukum_M_T66jRxoXyaUKSkIjgBsoozJc1ftu41YkwgiMKiI5vJJZk1sgyete9ViIAfM7zlXpaXuCVsGX2HNejywNQ8Aw8uVg2MF6wABCGQP--CoUN_lFZaWr4mvvfW5dtkOLN_DiA7m4ex4MDU2SAz46OSRq95DcKjRMdfTOMo1TKjn8W0wZfWUWpHCQ48ogpIi2KL-EubcRCD7Gl60vld6ObNLKC_Gd8ZiH2Y8vWZzSXNs9Zb847f4vGDtZpmTiVPm0hkQnesmK-E8jC8cHPA5HfYckpxzIcEq7ybVehBmvmDJiN3ZocW7db1m3szRu8-iagmOBai09BgFp3_kKk6muuzsvfNIMOGYzX59fyWvKb0jdzyZ7poKlTOEV-CCsDEJimcYQGQD-W7hkCTZpHKn6BkJZFWVoEbhHT7rzSBfoAKTaFwDGFPH-IuvNHUOfgpwea2RkBtFs3BaH6-ch-Vw3lTx3EgyjUrC-dzceGc4o5WI_mEuosbTpKYbkb4-KA82qoMDrFzikJH-90UDzX8DVQvzaZ5P46Fao3wYuPeSjkYve3gMtAdi0qJ8bBwW8aECfGvcQyK0kUzQZiyhdafyCgWqXxfpIOShwWfB3MwYlMiDACEASIFAQm6Jo6EbnZM5jVxkM0CFxLRZyVWA79qhWMSWbBLinM8qow04X7lbzSQN3KHUk5GBk-6u8PZbzm5OxQAjLUdGtMa33w6WAM6lkMKUGEmUIELQu7KYvzO0Pm62xELpCq0t2M9w1K2zWhUFUAFxpR2BkRcU1Y2v9iFY1xUU-M2mSgBI9MoccrsFz3Lgy9OA5GiNDl46XbpJCjBsAokLDAXuQ_nhrOOMHjg9Tg5V1MPH3JVdVfFY-ZX80oggswR15z9SMzb_YvtpxMHz4cpVWUhPoWn0iYoxARryZCPExBoXJaRjwP2UbDzXWmctQJRTK2yfK5I9kaLrnqQxQ2Tkn_Y4F8E3AJfZlf0oQIto1vjeafCIx3idw-chRziw6McQWBqH69j5-yIlA-qOvIrDmonlYe239ofCx2ke-wG5IitMoeIiTbojYxJRlTfx811dbDTnVFfPYhJcH2O-yKYMiqg6uBNnwr-SOskE-e8YAC18EyCGtWFIKyaIiFDd7a5jQOTzMbI0mi4nK07gDnnVqj4S1gWsIdp5kWh20muX35CJ7BjKJ9m9mfSNJVqhE32SSJHXHHLnUSF3x8_WnqaMRoak4tL3HYN0xqh13ST8-Jgt9RuU-kAL2DNzgr9ENEHQBu2kfhJtZRfug-DjoeJT-u3_Xy54lWkZ2rMK54OGWfq-eemwohQfdJcvz1-q_-2-YlM5fNfIfJHnX4m1P1bBvxvrlX0H_vXo_FtgtS6LNnjFQPkUoMZpg2g34X6K8q8WIw7ZbyWiq9R4PSf8" + } + }, + "deleteEntityOnDismiss": true, + "label": { + "runs": [ + { + "text": "Or, use your mobile device to scan the following QR code:" + } + ] + }, + "labels": [ + { + "runs": [ + { + "text": "For info about this ad and to manage your ad preferences, visit" + } + ] + }, + { + "runs": [ + { + "text": "Loading...", + "textColor": 4293651435 + } + ] + } + ], + "qrEntityKey": "EhY2M2ZTOE1WVS0yS2Ixa2xfZS1ITFhRIKQDKAE%3D", + "spinner": { + "delayMs": 200 + }, + "style": "QR_CODE_RENDERER_STYLE_ATA_SIDESHEET", + "trackingParams": "CB0QpZsIIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "type": "ENTITY_MUTATION_TYPE_REPLACE" + } + ] + } + } + }, + "deleteEntityOnDismiss": true, + "label": { + "runs": [ + { + "text": "Or, use your mobile device to scan the following QR code:" + } + ] + }, + "labels": [ + { + "runs": [ + { + "text": "For info about this ad and to manage your ad preferences, visit" + } + ] + }, + { + "runs": [ + { + "text": "Loading...", + "textColor": 4293651435 + } + ] + } + ], + "qrEntityKey": "EhY2M2ZTOE1WVS0yS2Ixa2xfZS1ITFhRIKQDKAE%3D", + "spinner": { + "delayMs": 200 + }, + "style": "QR_CODE_RENDERER_STYLE_ATA_SIDESHEET", + "trackingParams": "CBAQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "footer": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "secondaryIcon": { + "iconType": "CHEVRON_RIGHT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CBYQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "onOpenCommand": { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=user_feedback_menu_interaction&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBcQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + }, + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=2&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Repetitive" + }, + "trackingParams": "CBwQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=8&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Inappropriate" + }, + "trackingParams": "CBsQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=7&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Irrelevant" + }, + "trackingParams": "CBoQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CBkQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CBkQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CBkQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CBkQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + } + ] + } + }, + "title": { + "runs": [ + { + "text": "Return to video" + } + ] + }, + "trackingParams": "CBkQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ], + "selectedIndex": 3 + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "subtitle": { + "runs": [ + { + "text": "What was wrong with this ad?" + } + ] + }, + "title": { + "runs": [ + { + "text": "Stop seeing this ad" + } + ] + } + } + }, + "trackingParams": "CBcQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CBgQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "BACK" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CBgQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CBcQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "title": { + "runs": [ + { + "text": "Stop seeing this ad" + } + ] + }, + "trackingParams": "CBYQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "secondaryIcon": { + "iconType": "CHEVRON_RIGHT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CBIQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CBUQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CBUQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "clickTrackingParams": "CBUQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Ad personalization from Google is now on for your YouTube app on this device." + } + ] + } + } + }, + "popupType": "TOAST" + } + }, + { + "adPersonalizationSettingChangeEndpoint": { + "serviceCommand": { + "clickTrackingParams": "CBUQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "feedbackEndpoint": { + "feedbackToken": "AB9zfpIU0yJiHSwPosyg9gE7uWt4xG6Xzs3oyAI0OxQE_yVOR60pJSY9GUhU93jZY4OpgF4hBQNT" + } + } + }, + "clickTrackingParams": "CBUQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + ] + } + }, + "title": { + "runs": [ + { + "text": "Turn On" + } + ] + }, + "trackingParams": "CBUQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ] + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "content": [ + { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_BULLET_SENTENCE", + "title": { + "runs": [ + { + "text": "Google will personalize ads on the YouTube app on this TV" + } + ] + } + } + }, + { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_BULLET_SENTENCE", + "title": { + "runs": [ + { + "text": "Ads will be more useful to you" + } + ] + } + } + }, + { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_BULLET_SENTENCE", + "title": { + "runs": [ + { + "text": "Ads may also be based on the video you're watching and your general location" + } + ] + } + } + } + ], + "subtitle": { + "runs": [ + { + "text": "Here's what happens when you turn on personalization:" + } + ] + }, + "title": { + "runs": [ + { + "text": "Turn on ad personalization?" + } + ] + } + } + }, + "trackingParams": "CBMQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CBQQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "BACK" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CBQQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CBMQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "title": { + "runs": [ + { + "text": "Ad Personalization Off" + } + ] + }, + "trackingParams": "CBIQp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ] + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "title": { + "runs": [ + { + "text": "About this ad" + } + ] + } + } + }, + "trackingParams": "CBAQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CBEQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "DISMISSAL" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CBEQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CBAQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "optUnknownAction": { + "clickTrackingParams": "CAUQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "qrCodeRenderer": { + "command": { + "clickTrackingParams": "CAYQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG", + "entityUpdateCommand": { + "entityBatchUpdate": { + "mutations": [ + { + "entityKey": "EhZoS1pNbnFFdS15ckpUbGUwT29JZEx3IKQDKAE%3D", + "payload": { + "qrCodeEntity": { + "command": { + "clickTrackingParams": "CA8QpZsIIhMI1LTfvbbNhwMV18NCBR2XhgKG", + "feedbackEndpoint": { + "feedbackToken": "AB9zfpLOskntj7kkon_-ECKBaiImdA43sTWnKrT8JprhxyAVpeo77fXaUJgItyJh9E9y8UBcbQaCPzVZyAnsmGuQMrwcFaYGir0Rl7E2dBb_82HnHHISB3tsH89hFiZIRk3I0wiXyDn4vG8BUa8Y_cvJxndYJKPyoag_t83T7p8-oKrtXVq0BBYEF-2_-fOwTgIwvYcOtts15jmqDFyngpZ47KyT9LooMFG6v5mb9LZff3BkeU2aKj9HfMiY44bRQfiqqJMpxzT7dGYdovv_NYMxq4J5iJR4q9xuH4hx6jvuSWLsE05SMTnOxlJ21wESzMCHJotlPEd8eq6FAfNOhaPctTuui2ViedRL4-jswWgFPqak6KTzpDF1bxZC50m0rwnDx-42oB1jJ7a-RycRlwUyOpobg9qRu6ErV1V5FtVNj10-UcQS58uZxMlgua7JeJe7iBtG_td4nnChDWWQL5pzjXk1xigkIN4DuRc-1FqB2JwKqCXeTCXfhrRxudHg5iCz0AQxJxbQ88O_fO4l-iv3lTVWfLgKF1IgAz1hpMhpmwXyTBQbjtjn7UywzcY8Gv83w2qA6BFOkEFvpdFJjRXdwqWrGu4Tsxtj7LcrIxwuYWkAmrdUmPuOCHQtmIVdbDHtrqHlek4XFP4u7na7iDwVS1fcsh5nfdxKKSyR5oE235FXJkfAlzY10Qo5AFLs2-JezserZ6s_pQJi3eQ5VAT-1IL-NRBKwPnpzTIjsPUMvO9Qgc2u665ggb1lTJ71VL9H8vo2AX2rruwjwhPfCEPNSYV9cHNmvL1ZW6y0C-_HwRzA2eKqgnxsCLxvN0IZMpxaz6v7V5JFiL9UrYG_U-eCBjWzX2hLPJZoKAnI96xMU6ODOSdBWOFiGQPSiDKNaC9104UPH7-oki9Wwq06_wmIFN8DWd2W8wMJTp0x2RoRcg1xO7liNGX1iQ9yEqHmlFexQLRPeyBuKqLHowuzGK_NkeBmxphBfHVXQl6vJwy-IQA3Z8_-tCy_MnJMh8YtTI_C-R4uEabPJykVB5KQIR9zCEBFnG_0dU8aMMyC8l5_A88XAEJz4w8j1sMHL3BVQEExFZ-oR4vXgzk0KXa4L5fFEFsMwTld8qGsCqLOpVo-rKfa-_rjXtAayo5ZN0Cy7sIgS_JyaQ8m3r-NKONDlxil2qLCYdeS9TX0xp_Miw-cKOxbwdio4FQQhsDU-7sCbfhap2W8c-_MnvgSr22HmAVJKRmDxQ3_zPsiHvgBhMbx29pBJEqSsZrfVvz1HvK9rvrH4fRExushQTzvaiQlYQSyBST3dGcDj7BjbxK2pbTVOrdEEVwQ0wrrhYSjm2QRU0TqREulfo5qUqyeIljkp0GILjTx_0ptcHYcBEjEYGxfuwVvdCMzEJNU6uZtwWiCPC9Kk3iWMKPlOmQAao8esn8UitVd1OGEpIFw_PRmlmSKFonfvQ6kGc9d5ILkYbZFvQ_LkqpX1KVYv8yKqAt-jIdXe_89xbrfTMvBzpso3ReR-6ZK35B4W2XoJhpZ17AN5uvgKHDcxojJDNNA38LPN3eBk8bkcgwx0BVrUFsdXNXzTQkardedMBIb_lV-EfZFmXylQOeJmgzetYHyhPeihVWnvDjPDChxoRwynqEQNQM-NKVG2dwh3A7RNyfKB6yCq254oP0Zeivi6RYzfwxNrZ5YVSQHpgmPLOkUlxSM-R4K6USdkGAvGABaOQZ_yZZbw2TE5jcFAYBh_Qn9J10h4bjtyvs7bKlNJ_Sa1l-jT_DG7MfP6YQ7NML5mR9BA1NoLo5uH96dyHY_3DwO3ij88uG5ZRAXLzr-6JIM6Sw86e2sBE_58oZ_BpRh620_I0DpLkwMxYtCqyrlDeS7K9h9qrY0vI9py4F3miAmP73idXIPT3Ytt0a1GCunsY1dZwJLaA0HbTgmfNDsjC6V4YjDadSiqhW7fQZ8L6Ja_FiHTp-XlUrCfB1hVIm9f4XIW-pOgc1QtLvnh6Io0xRAlxzw9E1RqbO3vOKzSovMSnEzkoBMwlaj8v1QjHaIoyd9mh8ZHD-K2Pxxun4wBjFXjd9NmnYUGBhxIU8YhzHQJ-TytGqxYCWUNR__12uC5xHjBxx_TivjzKathppi5rWCXbrwTfRGyTk12XNA1qVDTVCquIOvUokpamdFi-23CXl8apj9-Q4dyewPFHxwvk3IsGqZEKOs_tuYiyvuVdW8fpekyG_MD7Ego-6ScTUiwMN7cCI0c_0w07pJsbp2w13AtR986XZu6AF_1CTjKi_5Ii3ssvqUmyuG6leaaDK7DBbeL2riz7H9X4DkBXSD1zXo3zzuXy5uv-HJu9AsXUb1xV8yFYJbaIDRhBC3Tcl0m-ZXBbzQBjXsvTDQ1MYRBkB66L0kiifojigeOXEGTwQwgvAGtEQYU4musOKdW-pYOmCo3ePpbyM6MPdLbYI_3o9WwDleUlzgV9wsTka09ZQDgylofYVA8HBRGDCaHSdVNqtRNmQ7nJ8W8ayt7cBT8m3HzE6FH5U_enyR2_6fYO_CQBVAC3wq1hf1QPOXWcE6P-6CPI0dZmKs0y2-OWvBwWifCB5nIebR1RGx9a_INZ3aOTEl5aLjsjBFJtOBI-U-T5-Yp8wjiMdr_olzxVtlJsIrpUm6pBkgCAO4IbrjmGQylIQwrX6VM1EhSb44PTSkX4131uSGBnfe27fXa1b5HCSa7mmbwNq619-e6COlgc4hrE12Dhy83W865kEvNApdujy1NzbxxBFGHa18e1BhUDGmGxWLmXPpBoIvdHVVazbOm4RowpW8tWKmR8Cu-qdKF7sQNdzH7Gr0OC4G49yDasnz2f9Avqv7AgMUt4o0MmL6okAVmmIxOHNjU2nFrxSYb_X7Z1_xXCWZKSRxr0MO82_m5tKZkDrSArjfa0vENy3YPRPrE4wtMIW1KB7JOzJ1SILaEJxOCV8HFrqNebwA" + } + }, + "deleteEntityOnDismiss": true, + "label": { + "runs": [ + { + "text": "Or, use your mobile device to scan the following QR code:" + } + ] + }, + "labels": [ + { + "runs": [ + { + "text": "For info about this ad and to manage your ad preferences, visit" + } + ] + }, + { + "runs": [ + { + "text": "Loading...", + "textColor": 4293651435 + } + ] + } + ], + "qrEntityKey": "EhZoS1pNbnFFdS15ckpUbGUwT29JZEx3IKQDKAE%3D", + "spinner": { + "delayMs": 200 + }, + "style": "QR_CODE_RENDERER_STYLE_ATA_SIDESHEET", + "trackingParams": "CA8QpZsIIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "type": "ENTITY_MUTATION_TYPE_REPLACE" + } + ] + } + } + }, + "deleteEntityOnDismiss": true, + "label": { + "runs": [ + { + "text": "Or, use your mobile device to scan the following QR code:" + } + ] + }, + "labels": [ + { + "runs": [ + { + "text": "For info about this ad and to manage your ad preferences, visit" + } + ] + }, + { + "runs": [ + { + "text": "Loading...", + "textColor": 4293651435 + } + ] + } + ], + "qrEntityKey": "EhZoS1pNbnFFdS15ckpUbGUwT29JZEx3IKQDKAE%3D", + "spinner": { + "delayMs": 200 + }, + "style": "QR_CODE_RENDERER_STYLE_ATA_SIDESHEET", + "trackingParams": "CAYQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "footer": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "secondaryIcon": { + "iconType": "CHEVRON_RIGHT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CAgQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlaySectionRenderer": { + "onOpenCommand": { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=user_feedback_menu_interaction&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CAkQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + }, + "overlay": { + "overlayTwoPanelRenderer": { + "actionPanel": { + "overlayPanelRenderer": { + "content": { + "overlayPanelItemListRenderer": { + "items": [ + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=2&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Repetitive" + }, + "trackingParams": "CA4Qp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=8&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Inappropriate" + }, + "trackingParams": "CA0Qp0wYASITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=mute_survey_option&label_instance=7&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + }, + { + "clickTrackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==", + "openPopupAction": { + "popup": { + "overlayMessageRenderer": { + "style": "OVERLAY_MESSAGE_STYLE_TOAST", + "title": { + "runs": [ + { + "text": "Thanks for the feedback!" + } + ] + } + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "title": { + "simpleText": "Irrelevant" + }, + "trackingParams": "CAwQp0wYAiITCNS03722zYcDFdfDQgUdl4YChg==" + } + }, + { + "compactLinkRenderer": { + "serviceEndpoint": { + "clickTrackingParams": "CAsQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CAsQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "adPingingEndpoint": { + "baseUrl": "https://www.youtube.com/pagead/interaction/?ai=CDidjviioZoTYLOLZhcIPwJy--Avwt-LmeNX8gPfZErCQHxABIABglYKAgJgHggEXY2EtcHViLTYyMTk4MTE3NDcwNDkzNzGgAYykkrkoqQJzIH7huieyPqgDBKoEmwNP0EGoGWEpdjDmM8xKVoTi04kDlHylF_SyQJiUHkaEfiQMeHWFt9bWC0eJM9U2mX-oIwp1eBB98UPX8RyDe7dp-yhOvveIcQb4uPrropnLvbpGlr1N9pT0ygG0AJZwscfLv159UiWMpn3mXFZ3JCOEnMbgUXxTDWB24dBFt279OMjiQ7oNd3mPI3ECmOVPPia98pmnpXUijx-H0ptsSXfkjDoOwlahe3kcOyXrbvXFfg82qGDBm7xdsXzNpAMKNZ62VdRmiFDwf266EANxd7zLJ6mpD3Gl0bVOULdRPwQGEi3KXDoRyMU-phqGcnpU6UBp3pjLQk_nQ5UX4osKBvQl9bIJGLlFIeqagEaUcgdU3ZelTkgTFbtsVITDGN8ONaZ39H8YJaDtR-9KY-eglAhz43oJCynVuwEFaP2F1Si8VKnOD_xxQinZCsYL6wvjCV9F9LmvNI3Ekrvc0bqSTGowUUSB1HLhFCYLyGqQuAhdbkzTW3EW96OuvvWDxk1iwdEatpbc6TrrahvL105_qJvrM27b5xV3oMBMEVGgBlfYBgWAB4zc4pgDkAcEqAfrtrECqAf5sbECqAeAurECqAfnnbECqAfonbECqAfqt7ECqAentbECqAfvtbECqAfwtbECqAeCqrECqAeECKgHqNIbqAe2B6gHpJqxAqgHkZ-xAqgHsJuxAqgHrrGxAqgH5ryxAqgHpqqxAqgH5rexAqgHyrqxAqgH7MCxAqgH_bKxAqgH97ixAqgH-LixAqgH28WxAqgHgcYbqAf8r7ECqAfj2RuSCAsxQXVyUDVwamI2WdIIMAiAwYAQEAEYXjIHooKA4J-ADToMgMKAgIAQgICAgIAQSNmg0jVQFFjw_uC9ts2HA_IIH2NhLXl0LWhvc3QtcHViLTkzNDgxMDU2MDU1MzUzMzTICRnICbEBoQvBWjQfvvDkULoLPQgBEAEYBiACKAEwEEAHSAFgAGgAcAGIAQCYAQGiARIKABgAIABYAWAAcAGoAgTYAgGoAQHYAQOAAgGIAgewE7vdtxi4E____________wGwFAHAFYmAgECQFgGoFgGKFxgIAxgBIAEoATABOAFAAUgBUAFYAWACcAGgFwG6FwQoADAA&sigh=8EP4qP0LBbE&cid=CAASFeRo03wcfAXymZfqGaKXSiQY0VnmWg&label=ad_block&label_instance=1&cbt=Z2Nhs65hfpUI1fyA99kSEPKTx_BPGKawlJsDIg13d3cuYW1hem9uLmRlOKbfjdP55-qF1AFCF2NhLXB1Yi02MjE5ODExNzQ3MDQ5MzcxWFdgAKIBPgoLMUF1clA1cGpiNlkSC3BQdmQ4VXhtU2JRGiJhZnZfdXNlcl9pZF9ieHhFaS1JbVBsYkx4NUYtZkhldEVn" + }, + "clickTrackingParams": "CAsQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==" + }, + { + "clickTrackingParams": "CAsQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==", + "muteAdEndpoint": { + "type": "SKIP" + } + } + ] + } + }, + "title": { + "runs": [ + { + "text": "Return to video" + } + ] + }, + "trackingParams": "CAsQp0wYAyITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ], + "selectedIndex": 3 + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "subtitle": { + "runs": [ + { + "text": "What was wrong with this ad?" + } + ] + }, + "title": { + "runs": [ + { + "text": "Stop seeing this ad" + } + ] + } + } + }, + "trackingParams": "CAkQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CAoQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "BACK" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CAoQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CAkQ9sQLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + }, + "title": { + "runs": [ + { + "text": "Stop seeing this ad" + } + ] + }, + "trackingParams": "CAgQp0wYACITCNS03722zYcDFdfDQgUdl4YChg==" + } + } + ] + } + }, + "header": { + "overlayPanelHeaderRenderer": { + "title": { + "runs": [ + { + "text": "About this ad" + } + ] + } + } + }, + "trackingParams": "CAYQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "backButton": { + "buttonRenderer": { + "command": { + "clickTrackingParams": "CAcQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "POPUP_BACK" + } + }, + "icon": { + "iconType": "DISMISSAL" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "trackingParams": "CAcQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + } + }, + "trackingParams": "CAYQ1MsHIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "popupType": "FULLSCREEN_OVERLAY" + } + } + }, + "clickTrackingParams": "CAUQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + }, + "icon": { + "iconType": "INFO_OUTLINE" + }, + "isDisabled": false, + "size": "SIZE_DEFAULT", + "style": "STYLE_UNKNOWN", + "trackingParams": "CAUQ8FsiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + }, + "hoverText": { + "simpleText": "About this ad" + }, + "trackingParams": "CAQQs-4CIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "adLayoutLoggingData": { + "serializedAdServingDataEntry": "IBAwAjgGShMIhK_hvbbNhwMV4mxBAh1Ajg-_UgYQAUgBWAFoAXAY" + }, + "elementId": "bj8kp31ew2buiJZs", + "inPlayerLayoutId": "bj8kp31ew2buiJZs", + "skipAdTimerRenderer": { + "skipAdTimerRenderer": { + "expApplyUiIterationForTvaeUiOnLr": false, + "firstForcedWatchTimeMs": "15000", + "firstForcedWatchTimeRemainingMs": "15000", + "forcedWatchTimeRemainingMs": "15000", + "skippableWatchTimeMs": "0", + "skippableWatchTimeRemainingMs": "0", + "templatedCountdown": { + "simpleText": "{FORMATTED_AD_DURATION_REMAINING}" + }, + "trackingParams": "CAMQneoLIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "skipOrPreviewRenderer": { + "adPreviewRenderer": { + "staticPreview": { + "isTemplated": false, + "text": "Video plays soon", + "trackingParams": "CC4Q9_cBIhMI1LTfvbbNhwMV18NCBR2XhgKG" + }, + "thumbnail": { + "thumbnail": { + "thumbnails": [ + { + "height": 180, + "url": "https://i.ytimg.com/vi/pPvd8UxmSbQ/mqdefault.jpg", + "width": 320 + } + ] + }, + "trackingParams": "CC4Q9_cBIhMI1LTfvbbNhwMV18NCBR2XhgKG" + }, + "trackingParams": "CC4Q9_cBIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "trackingParams": "CAIQ-PcBIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + } + } + } + }, + "slotEntryTrigger": { + "id": "67c0ba8f-0000-2697-a1b9-14223bb5ae26", + "layoutIdEnteredTrigger": { + "triggeringLayoutId": "qLYvxrzZ3iSfwRkS" + } + }, + "slotExpirationTriggers": [ + { + "id": "67c0ba91-0000-2697-a1b9-14223bb5ae26", + "slotIdExitedTrigger": { + "triggeringSlotId": "ymgQczejF3bFu5ee" + } + }, + { + "id": "67c0ba92-0000-2697-a1b9-14223bb5ae26", + "onNewPlaybackAfterContentVideoIdTrigger": {} + } + ], + "slotFulfillmentTriggers": [ + { + "id": "67c0ba90-0000-2697-a1b9-14223bb5ae26", + "slotIdEnteredTrigger": { + "triggeringSlotId": "ymgQczejF3bFu5ee" + } + } + ], + "trackingParams": "CAEQzOgNGAIiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + } + ], + "attestation": { + "playerAttestationRenderer": { + "botguardData": { + "interpreterSafeUrl": { + "privateDoNotAccessOrElseTrustedResourceUrlWrappedValue": "//www.google.com/js/th/1AiCzlAXOvKBjKQ6-ZkwShm4tpQuZWMhqjO5xqGcWBk.js" + }, + "program": "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", + "serverEnvironment": 1 + }, + "challenge": "a=6&a2=1&b=BWUKYLiKMIn1QxCC7rbRVCLRjjM&c=1722296510&d=7&e=pPvd8UxmSbQ&c1a=1&hh=o8xyUdLt004xdyVkRKFN04amYuuKYQvLCofKhf7sHN4" + } + }, + "captions": { + "playerCaptionsTracklistRenderer": { + "audioTracks": [ + { + "captionTrackIndices": [0], + "captionsInitialState": "CAPTIONS_INITIAL_STATE_OFF_RECOMMENDED", + "defaultCaptionTrackIndex": 0, + "hasDefaultTrack": true, + "visibility": "UNKNOWN" + } + ], + "captionTracks": [ + { + "baseUrl": "https://www.youtube.com/api/timedtext?v=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&caps=asr&opi=112496729&exp=xbt&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1722321710&sparams=ip,ipbits,expire,v,ei,caps,opi,exp,xoaf&signature=7B002D0C2B79781E0E46F374D5BB53C6059A5252.E7B05ECC8D799DB96F3C21B727A0161E0032CDFA&key=yt8&lang=en", + "isTranslatable": true, + "languageCode": "en", + "name": { + "simpleText": "English" + }, + "trackName": "", + "vssId": ".en" + } + ], + "defaultAudioTrackIndex": 0, + "defaultTranslationSourceTrackIndices": [0], + "translationLanguages": [ + { + "languageCode": "ar", + "languageName": { + "simpleText": "Arabic" + } + }, + { + "languageCode": "zh-Hant", + "languageName": { + "simpleText": "Chinese (Traditional)" + } + }, + { + "languageCode": "nl", + "languageName": { + "simpleText": "Dutch" + } + }, + { + "languageCode": "fr", + "languageName": { + "simpleText": "French" + } + }, + { + "languageCode": "de", + "languageName": { + "simpleText": "German" + } + }, + { + "languageCode": "hi", + "languageName": { + "simpleText": "Hindi" + } + }, + { + "languageCode": "id", + "languageName": { + "simpleText": "Indonesian" + } + }, + { + "languageCode": "it", + "languageName": { + "simpleText": "Italian" + } + }, + { + "languageCode": "ja", + "languageName": { + "simpleText": "Japanese" + } + }, + { + "languageCode": "ko", + "languageName": { + "simpleText": "Korean" + } + }, + { + "languageCode": "pt", + "languageName": { + "simpleText": "Portuguese" + } + }, + { + "languageCode": "ru", + "languageName": { + "simpleText": "Russian" + } + }, + { + "languageCode": "es", + "languageName": { + "simpleText": "Spanish" + } + }, + { + "languageCode": "th", + "languageName": { + "simpleText": "Thai" + } + }, + { + "languageCode": "tr", + "languageName": { + "simpleText": "Turkish" + } + }, + { + "languageCode": "uk", + "languageName": { + "simpleText": "Ukrainian" + } + }, + { + "languageCode": "vi", + "languageName": { + "simpleText": "Vietnamese" + } + } + ] + } + }, + "endscreen": { + "endscreenRenderer": { + "elements": [ + { + "endscreenElementRenderer": { + "aspectRatio": 1.7777778, + "endMs": "163143", + "endpoint": { + "clickTrackingParams": "CDUQ8N4BGAAiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbki0k5njlL73_aQBmgEDELtp", + "commandMetadata": { + "interactionLoggingCommandMetadata": { + "loggingExpectations": { + "screenCreatedLoggingExpectations": { + "expectedParentScreens": [ + { + "screenVeType": 3832 + } + ] + } + } + } + }, + "watchEndpoint": { + "videoId": "c-XpTMGPQvI", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jeln7e.googlevideo.com/initplayback?source=youtube&oeis=1&c=TVHTML5&oad=3200&ovd=3200&oaad=3200&oavd=3200&ocs=700&oewis=1&oputc=1&ofpcc=1&msp=1&odepv=1&id=73e5e94cc18f42f2&ip=93.235.183.158&initcwndbps=2000000&mt=1722295996" + } + } + } + } + }, + "id": "c96fe9af-88f5-48b6-80e1-b20089987962", + "image": { + "thumbnails": [ + { + "height": 360, + "url": "https://i.ytimg.com/vi/c-XpTMGPQvI/hqdefault.jpg", + "width": 480 + } + ] + }, + "left": 0.10701755, + "metadata": { + "simpleText": "8,695,713 views" + }, + "startMs": "143143", + "style": "VIDEO", + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "style": "DEFAULT", + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 17 seconds" + } + }, + "simpleText": "2:17" + } + } + } + ], + "title": { + "accessibility": { + "accessibilityData": { + "label": "Epic Cinematic Dramatic Adventure Trailer (Creative Commons), video" + } + }, + "simpleText": "Epic Cinematic Dramatic Adventure Trailer (Creative Commons)" + }, + "top": 0.17757009, + "trackingParams": "CDUQ8N4BGAAiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "width": 0.322807 + } + }, + { + "endscreenElementRenderer": { + "aspectRatio": 1.7777778, + "endMs": "163143", + "endpoint": { + "clickTrackingParams": "CDQQ8N4BGAEiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbki0k5njlL73_aQBmgEDELtp", + "commandMetadata": { + "interactionLoggingCommandMetadata": { + "loggingExpectations": { + "screenCreatedLoggingExpectations": { + "expectedParentScreens": [ + { + "screenVeType": 3832 + } + ] + } + } + } + }, + "watchEndpoint": { + "videoId": "m0kU_Yhsjx4", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jeenld.googlevideo.com/initplayback?source=youtube&oeis=1&c=TVHTML5&oad=3200&ovd=3200&oaad=3200&oavd=3200&ocs=700&oewis=1&oputc=1&ofpcc=1&msp=1&odepv=1&id=9b4914fd886c8f1e&ip=93.235.183.158&initcwndbps=1957500&mt=1722295996" + } + } + } + } + }, + "id": "d383b93e-e1cd-4e90-a1e7-b11efc979325", + "image": { + "thumbnails": [ + { + "height": 360, + "url": "https://i.ytimg.com/vi/m0kU_Yhsjx4/hqdefault.jpg", + "width": 480 + } + ] + }, + "left": 0.5701754, + "metadata": { + "simpleText": "496,948 views" + }, + "startMs": "143143", + "style": "VIDEO", + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "style": "DEFAULT", + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 14 seconds" + } + }, + "simpleText": "2:14" + } + } + } + ], + "title": { + "accessibility": { + "accessibilityData": { + "label": "Inspiring Acoustic Uplifting Soft Background (Creative Commons), video" + } + }, + "simpleText": "Inspiring Acoustic Uplifting Soft Background (Creative Commons)" + }, + "top": 0.17757009, + "trackingParams": "CDQQ8N4BGAEiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "width": 0.322807 + } + }, + { + "endscreenElementRenderer": { + "aspectRatio": 1, + "callToAction": { + "simpleText": "VISIT CHANNEL" + }, + "dismiss": { + "simpleText": "CANCEL" + }, + "endMs": "163143", + "endpoint": { + "browseEndpoint": { + "browseId": "UCbxxEi-ImPlbLx5F-fHetEg" + }, + "clickTrackingParams": "CDIQ-N4BGAIiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbki0k5njlL73_aQB" + }, + "hovercardButton": { + "subscribeButtonRenderer": { + "buttonText": { + "runs": [ + { + "text": "SUBSCRIBE" + } + ] + }, + "channelId": "UCbxxEi-ImPlbLx5F-fHetEg", + "enabled": true, + "serviceEndpoints": [ + { + "authDeterminedCommand": { + "authenticatedCommand": { + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbg==", + "subscribeEndpoint": { + "channelIds": ["UCbxxEi-ImPlbLx5F-fHetEg"], + "params": "EgIIBBgA" + } + }, + "unauthenticatedCommand": { + "authRequiredCommand": { + "identityActionContext": { + "eventTrigger": "ACCOUNT_EVENT_TRIGGER_SUBSCRIBE", + "nextEndpoint": { + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "signalAction": { + "signal": "CLOSE_POPUP" + } + }, + { + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbg==", + "subscribeEndpoint": { + "channelIds": ["UCbxxEi-ImPlbLx5F-fHetEg"], + "params": "EgIIBBgA" + } + } + ] + } + } + } + }, + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + }, + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + }, + { + "clickTrackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbg==", + "unsubscribeEndpoint": { + "channelIds": ["UCbxxEi-ImPlbLx5F-fHetEg"], + "params": "CgIIBBgA" + } + } + ], + "showPreferences": false, + "subscribed": false, + "subscribedButtonText": { + "runs": [ + { + "text": "SUBSCRIBED" + } + ] + }, + "subscribedEntityKey": "EhhVQ2J4eEVpLUltUGxiTHg1Ri1mSGV0RWcgMygB", + "trackingParams": "CDMQmysiEwjUtN-9ts2HAxXXw0IFHZeGAoYyDGl2LWVuZHNjcmVlbg==", + "type": "FREE", + "unsubscribeButtonText": { + "runs": [ + { + "text": "UNSUBSCRIBE" + } + ] + }, + "unsubscribedButtonText": { + "runs": [ + { + "text": "SUBSCRIBE" + } + ] + } + } + }, + "icon": { + "thumbnails": [ + { + "url": "https://www.gstatic.com/youtube/img/annotations/youtube.png" + } + ] + }, + "id": "cfd53ffc-d06d-4671-a32a-4c647c432548", + "image": { + "thumbnails": [ + { + "height": 250, + "url": "https://yt3.ggpht.com/xr2VFIXCxe2bleK2UOtmiRgFdN-GYRza_jYgQ5b1no5QcRSg5qWPbSQGnzdtFviUlL_mTLm5=s250-c-k-c0x00ffffff-no-rj", + "width": 250 + }, + { + "height": 400, + "url": "https://yt3.ggpht.com/xr2VFIXCxe2bleK2UOtmiRgFdN-GYRza_jYgQ5b1no5QcRSg5qWPbSQGnzdtFviUlL_mTLm5=s400-c-k-c0x00ffffff-no-rj", + "width": 400 + } + ] + }, + "isSubscribe": true, + "left": 0.422807, + "metadata": { + "simpleText": "107K subscribers" + }, + "startMs": "143143", + "style": "CHANNEL", + "title": { + "accessibility": { + "accessibilityData": { + "label": "RomanSenykMusic - Royalty Free | Creative Commons, channel" + } + }, + "simpleText": "RomanSenykMusic - Royalty Free | Creative Commons" + }, + "top": 0.57320875, + "trackingParams": "CDIQ-N4BGAIiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "useClassicSubscribeButton": true, + "width": 0.15438597 + } + } + ], + "startMs": "143143", + "trackingParams": "CDEQ794BIhMI1LTfvbbNhwMV18NCBR2XhgKG" + } + }, + "frameworkUpdates": { + "entityBatchUpdate": { + "mutations": [ + { + "entityKey": "EhhVQ2J4eEVpLUltUGxiTHg1Ri1mSGV0RWcgMygB", + "payload": { + "subscriptionStateEntity": { + "key": "EhhVQ2J4eEVpLUltUGxiTHg1Ri1mSGV0RWcgMygB", + "subscribed": false + } + }, + "type": "ENTITY_MUTATION_TYPE_REPLACE" + } + ], + "timestamp": { + "nanos": 970784781, + "seconds": "1722296510" + } + } + }, + "playabilityStatus": { + "audioOnlyPlayability": { + "audioOnlyPlayabilityRenderer": { + "audioOnlyAvailability": "FEATURE_AVAILABILITY_ALLOWED", + "trackingParams": "CDYQx2kiEwjUtN-9ts2HAxXXw0IFHZeGAoY=" + } + }, + "contextParams": "Q0FFU0FnZ0I=", + "miniplayer": { + "miniplayerRenderer": { + "playbackMode": "PLAYBACK_MODE_ALLOW" + } + }, + "playableInEmbed": true, + "status": "OK" + }, + "playbackTracking": { + "atrUrl": { + "baseUrl": "https://s.youtube.com/api/stats/atr?docid=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&len=164&ns=yt&plid=AAYea2e4OfIKZgco&ver=2", + "elapsedMediaTimeSeconds": 5 + }, + "ptrackingUrl": { + "baseUrl": "https://www.youtube.com/ptracking?ei=viioZtTdKteHi9oPl42KsAg&oid=ukP4sqKpdSgLD4VOE55D1Q&plid=AAYea2e4OfIKZgco&pltype=content&ptchn=bxxEi-ImPlbLx5F-fHetEg&ptk=youtube_single&video_id=pPvd8UxmSbQ" + }, + "qoeUrl": { + "baseUrl": "https://s.youtube.com/api/stats/qoe?cl=655300395&docid=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&event=streamingstats&fexp=&ns=yt&plid=AAYea2e4OfIKZgco&referrer=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpPvd8UxmSbQ" + }, + "videostatsDefaultFlushIntervalSeconds": 40, + "videostatsDelayplayUrl": { + "baseUrl": "https://s.youtube.com/api/stats/delayplay?cl=655300395&docid=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&fexp=&ns=yt&plid=AAYea2e4OfIKZgco&referrer=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpPvd8UxmSbQ&el=leanback&len=164&of=eH1uGxeW-k-9Tf9uS34HDw&vm=CAIQARgEOjJBSHFpSlRMTXdEazJCZXdFY1lMc0tfLUF3THJsSVFXQ1RwbmlzbDBhWU5BQ180OGZ1Z2JiQU9BckJGdG8zb0ZzQ0VaTEgzbnN2d2pOSzdNY0tZRXp1cVNHcU9OTFhNYndTdzhpZE1YUmg1VEJEVENRX3VKRF9pV2V5NEczNVJvUHpmSHd4c21GZmEwdVJGbTRiWmNDUFG4AQE" + }, + "videostatsPlaybackUrl": { + "baseUrl": "https://s.youtube.com/api/stats/playback?cl=655300395&docid=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&fexp=&ns=yt&plid=AAYea2e4OfIKZgco&referrer=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpPvd8UxmSbQ&el=leanback&len=164&of=eH1uGxeW-k-9Tf9uS34HDw&vm=CAIQARgEOjJBSHFpSlRMTXdEazJCZXdFY1lMc0tfLUF3THJsSVFXQ1RwbmlzbDBhWU5BQ180OGZ1Z2JiQU9BckJGdG8zb0ZzQ0VaTEgzbnN2d2pOSzdNY0tZRXp1cVNHcU9OTFhNYndTdzhpZE1YUmg1VEJEVENRX3VKRF9pV2V5NEczNVJvUHpmSHd4c21GZmEwdVJGbTRiWmNDUFG4AQE" + }, + "videostatsScheduledFlushWalltimeSeconds": [10, 20, 30], + "videostatsWatchtimeUrl": { + "baseUrl": "https://s.youtube.com/api/stats/watchtime?cl=655300395&docid=pPvd8UxmSbQ&ei=viioZtTdKteHi9oPl42KsAg&fexp=&ns=yt&plid=AAYea2e4OfIKZgco&referrer=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpPvd8UxmSbQ&el=leanback&len=164&of=eH1uGxeW-k-9Tf9uS34HDw&vm=CAIQARgEOjJBSHFpSlRMTXdEazJCZXdFY1lMc0tfLUF3THJsSVFXQ1RwbmlzbDBhWU5BQ180OGZ1Z2JiQU9BckJGdG8zb0ZzQ0VaTEgzbnN2d2pOSzdNY0tZRXp1cVNHcU9OTFhNYndTdzhpZE1YUmg1VEJEVENRX3VKRF9pV2V5NEczNVJvUHpmSHd4c21GZmEwdVJGbTRiWmNDUFG4AQE" + }, + "youtubeRemarketingUrl": { + "baseUrl": "https://www.youtube.com/pagead/viewthroughconversion/962985656/?backend=innertube&cname=7&cver=7_20190924&foc_id=bxxEi-ImPlbLx5F-fHetEg&label=followon_view&ptype=no_rmkt&random=664274810", + "elapsedMediaTimeSeconds": 0 + } + }, + "playerConfig": { + "audioConfig": { + "enablePerFormatLoudness": true, + "loudnessDb": 5.2200003, + "perceptualLoudnessDb": -8.78 + }, + "mediaCommonConfig": { + "dynamicReadaheadConfig": { + "maxReadAheadMediaTimeMs": 120000, + "minReadAheadMediaTimeMs": 15000, + "readAheadGrowthRateMs": 1000 + }, + "mediaUstreamerRequestConfig": { + "videoPlaybackUstreamerConfig": "CswJCpcHCAAlAACAPy1SuF4_NQAAwD9YAWABaAFyFgoSbWZzMl9jbWZzX3YzXzJfMTA5GAB4j06gAQGoAQCQAgG4AgDIAgHaAroBELDqARioRiCgnAEoiCcwmHVwiCeAAfQDuAEB4AEDkAIBmAIMoAIBwAIB0AIC4AIB6AIEgAMCiAOIJ5gDAagDA8ADAcgDAdADAfgDAYAEAYgEAZAEAZgEAaAEAagEAcgEAdAEAdgEAeAEAOgEAfgEB4AFfYgFAbAFAbgFAcAFAcgFAdAFAdgFAeAF0A_oBQH4BdAPgAYBuAYBwAYB0AYB2AYB6AYB8AYB-AYBkAcBqAcB2AcB-LWR5QwB-gKeAi0AAIJCNQAAlkJIAWUAAIBAaMBwqAHQhgOwAeADuAEBzQEAAIA_8AEB_QEAAIA_hQKamRk-jQIAAIA_lQIAAAJCmAIBtQIAAIA_wALgA9ICEbD__________wEePEZaXF1e2gIFMjA6MDDgAnjoAugC9QIK16M7_QLNzMw9gAMBkAMBnQMK1yM9oAMBuAMByAMB2AMB5QNiSkRA7QMyyvM-8AMB_QNmZoY_hQQAAIBAmAQB1QQAACBB6ATwEPAEAb0Fo0Afu8UF308tP8gFAeAFAZgGAaAGAagGAbUGvTeGNb0GMzODQJAHAcAHAcgHAdUHAICdQ-UHAIAJRKEIAAAAAAAA8L-pCAAAAAAAAPC_sAjwAbgIAdgI8AHoCAGCAwCQAwGoAwGwAwPQAwHYAwHgA5BOuAQBygQcChMIwKkHEJh1GOgHJQAAAAAoADAAEODUAxjQD9IEDQoICLAJELAJIAEgiCfaBAsKBgjwLhDwLiCIJ-gEAfgEAYAFAYgFAZAFAagFAbAFAdAFAdgFAegFAfAFAYgGAZgGAagGgIACwAYByAYB0gYUCOgHEGQaDQiIJxUAAAA_Hc3MTD-CBwoVAACAPxhkIJBOiAcBoAcBsAcBuAcBwAcB-AcBgAgBoAgBsAgBuAgB0ggGCAEQARgBmAkBqQkAAAAAAADwv7EJAAAAAAAA8L_ICQHaCSRFRzRmTDl1Sm9tL2NWdklmNjg4bnB6c2t4SVQrMXl0N09POHXgCQGwCgHYCgHwCgGICwGYCwG4CwHICwHQCwHYCwHqCwSLBowG8AsB-AsBkAwBoAwBqAyQAbAMAbgMAcAMAdAMAeAMAegMAYANAaANAdANAeANAYgOAZAOAbAOAYinocoLARgBIAEyDAirAhDNgPzUlvKDAzIMCK8CEP64moKV8oMDMgwIiAEQ7Mj0upfygwMyDAj3ARCNxJTwlPKDAzIMCKoCEIW7uNSW8oMDMgwIrgIQn5LUz5TygwMyDAiHARD5xP-ul_KDAzIMCPQBEOmKifSU8oMDMgwIhgEQk_6DsZfygwMyDAjzARCSyIT1lPKDAzIMCIUBEJWg47aX8oMDMgwI8gEQ3_PN8JTygwMyDAigARC-zf6xl_KDAzIMCJYCENPIofOU8oMDMgwIjAEQodeqr5TygwMyDAj5ARDzzNT9v_WFAzIMCPoBEMKb8bHA9YUDMgwI-wEQ_s_f_r_1hQM6AEgAUiYaAmVuKAAyGFVDYnh4RWktSW1QbGJMeDVGLWZIZXRFZzgAQABYAJDL048OARJNAKEYC4YwRgIhAIj4Ug4dw_gq15NXvgcfXpI1Fm_fhmwl-4ad-rX3Ffg_AiEAkZDsUgoAGLOXIvWZlNyuyfu8HLWt-snFl3gkTiPo2acaAmVp" + }, + "serverPlaybackStartConfig": { + "enable": true, + "playbackStartPolicy": { + "startMinReadaheadPolicy": [ + { + "minReadaheadMs": 1200 + } + ] + } + }, + "useServerDrivenAbr": false + }, + "webPlayerConfig": { + "useCobaltTvosDash": true + } + }, + "responseContext": { + "maxAgeSeconds": 0, + "serviceTrackingParams": [ + { + "params": [ + { + "key": "ipcc", + "value": "0" + }, + { + "key": "is_alc_surface", + "value": "false" + }, + { + "key": "is_viewed_live", + "value": "False" + }, + { + "key": "logged_in", + "value": "0" + }, + { + "key": "e", + "value": "9405981,23804281,23885487,23943651,23946420,23966208,23998056,24004644,24077241,24166867,24181174,24241378,24290971,24299875,24378828,24439361,24456089,24468724,24542367,24548629,24566687,39326848,39326916,51009781,51010235,51016856,51017346,51020570,51025415,51030101,51037342,51037351,51041512,51043998,51050361,51053689,51057842,51057855,51060353,51063643,51064835,51089007,51091331,51098297,51098299,51101049,51107657,51111738,51113658,51113661,51114642,51115184,51116067,51124104,51131427,51133103,51138233,51139379,51140712,51144925,51146484,51148688,51149607,51152050,51153492,51157838,51158470,51158514,51160545,51162170,51163637,51165467,51165568,51169118,51172672,51172686,51172691,51172700,51172709,51172714,51172721,51172730,51174143,51176511,51176608,51177818,51178312,51178327,51178340,51178770,51178982,51182274,51183909,51184022,51189826,51190057,51190075,51190078,51190085,51190200,51190211,51190220,51190229,51190652,51191447,51193717,51195231,51196181,51196808,51197687,51197690,51197697,51197704,51199193,51200251,51200260,51200293,51200298,51200569,51201352,51201365,51201372,51201383,51201430,51201435,51201440,51201449,51203200,51204329,51207176,51207193,51207200,51207207,51209049,51209172,51211864,51212456,51212466,51212555,51212571,51213807,51217274,51217504,51217581,51217769,51219800,51221011,51221152,51223962,51224747,51227263,51227776,51227881,51228202,51228349,51228352,51228765,51228774,51228781,51228796,51228803,51228812,51230478,51230492,51231813,51231864,51234844,51234852,51236017,51236253,51236268,51237841,51238486,51238569,51238737,51240629,51241028,51241600,51242448,51243941,51245246,51246266,51246283,51246303,51246799,51248255,51251436,51251509,51251850" + } + ], + "service": "GFEEDBACK" + } + ], + "visitorData": "CgtrbXRsWU4wUEtXbyi-0aC1BjIKCgJERRIEEgAgZg%3D%3D" + }, + "storyboards": { + "playerStoryboardSpecRenderer": { + "recommendedLevel": 2, + "spec": "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L$L/$N.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==|48#27#100#10#10#0#default#rs$AOn4CLCsCT8Lprh2S0ptmCRsWH7VtDl3YQ|80#45#83#10#10#2000#M$M#rs$AOn4CLBXrdgfuYV1WLnTGXqZtSAUm8oZCA|160#90#83#5#5#2000#M$M#rs$AOn4CLCRazj84zMuwJLaCCc_PiUakX_YdQ" + } + }, + "streamingData": { + "adaptiveFormats": [ + { + "approxDurationMs": "163046", + "averageBitrate": 3044926, + "bitrate": 3926810, + "contentLength": "62057888", + "fps": 60, + "height": 1080, + "indexRange": { + "end": "1167", + "start": "740" + }, + "initRange": { + "end": "739", + "start": "0" + }, + "itag": 299, + "lastModified": "1705967093743693", + "mimeType": "video/mp4; codecs=\"avc1.64002a\"", + "projectionType": "RECTANGULAR", + "quality": "hd1080", + "qualityLabel": "1080p60", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=299&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=62057888&dur=163.046&lmt=1705967093743693&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgBEemc0Cvd3KhNooNRblgX64_fjNSP30RmWDfFwDR7qYCIQCXpQ9FO0_X93ZHcyvRZCKX5gbJuusCReaRcJbRLFsM_g%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 1920 + }, + { + "approxDurationMs": "163046", + "averageBitrate": 2713348, + "bitrate": 3473307, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "55300085", + "fps": 60, + "height": 1080, + "indexRange": { + "end": "792", + "start": "219" + }, + "initRange": { + "end": "218", + "start": "0" + }, + "itag": 303, + "lastModified": "1705966651743358", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "hd1080", + "qualityLabel": "1080p60", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=303&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=55300085&dur=163.046&lmt=1705966651743358&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgTZlmOcsLYJ_a9SnVLehXnaoajtreQO97qawEIDPEi8sCIQDKFdtBWWMuQUb9X8H-x92B3q-y0g8TvAPanR95cfklXQ%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 1920 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 1207947, + "bitrate": 1560439, + "contentLength": "24616305", + "fps": 30, + "height": 720, + "indexRange": { + "end": "1166", + "start": "739" + }, + "initRange": { + "end": "738", + "start": "0" + }, + "itag": 136, + "lastModified": "1705967307531372", + "mimeType": "video/mp4; codecs=\"avc1.4d401f\"", + "projectionType": "RECTANGULAR", + "quality": "hd720", + "qualityLabel": "720p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=136&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=24616305&dur=163.029&lmt=1705967307531372&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAM57L2Utesn4xVyT0HSwR9Khv_S-efx4uFAbCPkZFoRXAiEAtIu63-jF2_FZkOMmZAqGU3SRU9QgxoajRjBhMFwcOuk%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 1280 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 722521, + "bitrate": 929607, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "14723992", + "fps": 30, + "height": 720, + "indexRange": { + "end": "770", + "start": "220" + }, + "initRange": { + "end": "219", + "start": "0" + }, + "itag": 247, + "lastModified": "1705966613897741", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "hd720", + "qualityLabel": "720p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=247&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=14723992&dur=163.029&lmt=1705966613897741&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAL-upITxk7r9FQL5F4WL0A6SjPw673qyyzmXIC48eKfTAiEAlkdkx7IFYtehbhKakbffvIebpPXRtxSgBWLl7WEHCrE%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 1280 + }, + { + "approxDurationMs": "163046", + "averageBitrate": 1694973, + "bitrate": 2188961, + "contentLength": "34544823", + "fps": 60, + "height": 720, + "indexRange": { + "end": "1166", + "start": "739" + }, + "initRange": { + "end": "738", + "start": "0" + }, + "itag": 298, + "lastModified": "1705967092637061", + "mimeType": "video/mp4; codecs=\"avc1.4d4020\"", + "projectionType": "RECTANGULAR", + "quality": "hd720", + "qualityLabel": "720p60", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=298&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=34544823&dur=163.046&lmt=1705967092637061&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAIIGU41JunuODw9qIlSoYQcwkCYO6k9XOVlDn1Nxqnu7AiEAoiMOgYU8s8lp01fW0L86hHrSrtlvOLSI9XA50iyIGBc%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 1280 + }, + { + "approxDurationMs": "163046", + "averageBitrate": 1482051, + "bitrate": 2250391, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "30205331", + "fps": 60, + "height": 720, + "indexRange": { + "end": "786", + "start": "219" + }, + "initRange": { + "end": "218", + "start": "0" + }, + "itag": 302, + "lastModified": "1705966545733919", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "hd720", + "qualityLabel": "720p60", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=302&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=30205331&dur=163.046&lmt=1705966545733919&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAL428Az_BKxxff4FlH4WleHSy4Igq3mR71NuTMOc9xU3AiBN4lXfH9DklGaQUMnOT8wAhiMuzR73bW3cwr744TSoNA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 1280 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 722499, + "bitrate": 978945, + "contentLength": "14723538", + "fps": 30, + "height": 480, + "indexRange": { + "end": "1167", + "start": "740" + }, + "initRange": { + "end": "739", + "start": "0" + }, + "itag": 135, + "lastModified": "1705967282545273", + "mimeType": "video/mp4; codecs=\"avc1.4d401f\"", + "projectionType": "RECTANGULAR", + "quality": "large", + "qualityLabel": "480p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=135&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=14723538&dur=163.029&lmt=1705967282545273&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAM843wAa1e7Gc1S69gfXckm7hdgIKPXp0bUSh3hO6W5zAiEA-DDEPGsZBmF5N8VbPy75dhy3rLpE1F18KtWgmrUm2Pg%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 854 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 382209, + "bitrate": 467884, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "7788899", + "fps": 30, + "height": 480, + "indexRange": { + "end": "770", + "start": "220" + }, + "initRange": { + "end": "219", + "start": "0" + }, + "itag": 244, + "lastModified": "1705966622098793", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "large", + "qualityLabel": "480p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=244&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=7788899&dur=163.029&lmt=1705966622098793&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAKGyn799bfkVHYE195sPmD60dCMppqJrBM0O-sjgYTzzAiAoBjkNAtL90sXw2YP9UTW9JrMhPSvPiBI_KiCVMJAkFQ%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 854 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 383290, + "bitrate": 537902, + "contentLength": "7810925", + "fps": 30, + "height": 360, + "highReplication": true, + "indexRange": { + "end": "1167", + "start": "740" + }, + "initRange": { + "end": "739", + "start": "0" + }, + "itag": 134, + "lastModified": "1705967286812435", + "mimeType": "video/mp4; codecs=\"avc1.4d401e\"", + "projectionType": "RECTANGULAR", + "quality": "medium", + "qualityLabel": "360p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=134&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=7810925&dur=163.029&lmt=1705967286812435&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAJ92IgZgdk3_WLsfzJV_ZyrSFSbzpsoJh3DkRKDHbNxzAiEA9UbnVlXQ2S3BUimLmWC5TZQfhIkc-PlLnZ81fL0S5yA%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 640 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 205556, + "bitrate": 248858, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "4188954", + "fps": 30, + "height": 360, + "indexRange": { + "end": "770", + "start": "220" + }, + "initRange": { + "end": "219", + "start": "0" + }, + "itag": 243, + "lastModified": "1705966624121874", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "medium", + "qualityLabel": "360p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=243&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=4188954&dur=163.029&lmt=1705966624121874&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgSCLGQvdZKNXym0zt7c3Yw_4e0J8-wNxtPagPRRn4dRoCIQCOj0IzalNG4EcowBIyK2LC6NLFDr8Zt6sNVkqPjw6lGg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 640 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 246656, + "bitrate": 257417, + "contentLength": "5026513", + "fps": 30, + "height": 240, + "indexRange": { + "end": "1166", + "start": "739" + }, + "initRange": { + "end": "738", + "start": "0" + }, + "itag": 133, + "lastModified": "1705967298859029", + "mimeType": "video/mp4; codecs=\"avc1.4d4015\"", + "projectionType": "RECTANGULAR", + "quality": "small", + "qualityLabel": "240p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=133&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=5026513&dur=163.029&lmt=1705967298859029&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgPF0ms4OEe15BTjOFVCkvf52UeTUf0b62_pavCfEyGjcCIH-0AoxzyT8iioWFFaX7iYjqzzaUTpo8rgAPQ0uX8DJa&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 426 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 124706, + "bitrate": 149589, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "2541351", + "fps": 30, + "height": 240, + "indexRange": { + "end": "768", + "start": "219" + }, + "initRange": { + "end": "218", + "start": "0" + }, + "itag": 242, + "lastModified": "1705966614837727", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "small", + "qualityLabel": "240p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=242&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=2541351&dur=163.029&lmt=1705966614837727&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgKj1JyMGwYtf16zLJsmbnizz5_v3jaZSa7-j-ls8-qzECIQDKUd50iIc52h7zOX50Hf1SkbV9h-hP4QHs-wkik1fk6Q%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 426 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 111551, + "bitrate": 114816, + "contentLength": "2273274", + "fps": 30, + "height": 144, + "indexRange": { + "end": "1165", + "start": "738" + }, + "initRange": { + "end": "737", + "start": "0" + }, + "itag": 160, + "lastModified": "1705967288821438", + "mimeType": "video/mp4; codecs=\"avc1.4d400c\"", + "projectionType": "RECTANGULAR", + "quality": "tiny", + "qualityLabel": "144p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=160&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=2273274&dur=163.029&lmt=1705967288821438&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgb8eXnQ6MSJ3PuvFVBdYIWTnFobH8mTC9zbZpBNxLbBYCICkPLKEm3gNbW5HIFXs7bwF5rSqUKHHnXNK91qMslQog&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 256 + }, + { + "approxDurationMs": "163029", + "averageBitrate": 56524, + "bitrate": 70630, + "colorInfo": { + "matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709", + "primaries": "COLOR_PRIMARIES_BT709", + "transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709" + }, + "contentLength": "1151892", + "fps": 30, + "height": 144, + "indexRange": { + "end": "767", + "start": "218" + }, + "initRange": { + "end": "217", + "start": "0" + }, + "itag": 278, + "lastModified": "1705966620402771", + "mimeType": "video/webm; codecs=\"vp9\"", + "projectionType": "RECTANGULAR", + "quality": "tiny", + "qualityLabel": "144p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=278&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=video%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=1151892&dur=163.029&lmt=1705966620402771&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=130F224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAP4IybR7cZRpx7IX1ke6UIu_hdFZN3LOuHBDywg_xv5WAiB8_XEx8VhT9OlFxmM-cY0fl6-7GT9uj3clMIPDk2w7cA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 256 + }, + { + "approxDurationMs": "163096", + "audioChannels": 2, + "audioQuality": "AUDIO_QUALITY_MEDIUM", + "audioSampleRate": "44100", + "averageBitrate": 129508, + "bitrate": 130268, + "contentLength": "2640283", + "highReplication": true, + "indexRange": { + "end": "867", + "start": "632" + }, + "initRange": { + "end": "631", + "start": "0" + }, + "itag": 140, + "lastModified": "1705966477945761", + "loudnessDb": 5.2200003, + "mimeType": "audio/mp4; codecs=\"mp4a.40.2\"", + "projectionType": "RECTANGULAR", + "quality": "tiny", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=140&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=audio%2Fmp4&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=2640283&dur=163.096&lmt=1705966477945761&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgSxdbLrbojMVJcyRzsI2TrzOf78LN28bWcsHpbs4QXDwCIHidfXoriWMHfuiktUCdzLuUmksU7r5vITdh6u0puNmx&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D" + }, + { + "approxDurationMs": "163061", + "audioChannels": 2, + "audioQuality": "AUDIO_QUALITY_LOW", + "audioSampleRate": "48000", + "averageBitrate": 45860, + "bitrate": 53073, + "contentLength": "934750", + "indexRange": { + "end": "551", + "start": "266" + }, + "initRange": { + "end": "265", + "start": "0" + }, + "itag": 249, + "lastModified": "1714877357172339", + "loudnessDb": 5.21, + "mimeType": "audio/webm; codecs=\"opus\"", + "projectionType": "RECTANGULAR", + "quality": "tiny", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=249&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=audio%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=934750&dur=163.061&lmt=1714877357172339&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAItfaWkRs94vqyae7GR4M1xHoQO2lduvNRFugRSf0h-IAiA9fdLOJMwPI8vAO2C13igyv2qGSpOlKQptS4sN6p5Ffw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D" + }, + { + "approxDurationMs": "163061", + "audioChannels": 2, + "audioQuality": "AUDIO_QUALITY_LOW", + "audioSampleRate": "48000", + "averageBitrate": 61109, + "bitrate": 71197, + "contentLength": "1245582", + "indexRange": { + "end": "551", + "start": "266" + }, + "initRange": { + "end": "265", + "start": "0" + }, + "itag": 250, + "lastModified": "1714877466693058", + "loudnessDb": 5.21, + "mimeType": "audio/webm; codecs=\"opus\"", + "projectionType": "RECTANGULAR", + "quality": "tiny", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=250&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=audio%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=1245582&dur=163.061&lmt=1714877466693058&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgdJ1SjWwaloQecEblSIMFp2qFmpG_kKYZP1vX_M55dE0CIQCDSfa_FsaiFRcNL-1LRTgCIRSO7dj5vrpKR1Ya-KbmMw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D" + }, + { + "approxDurationMs": "163061", + "audioChannels": 2, + "audioQuality": "AUDIO_QUALITY_MEDIUM", + "audioSampleRate": "48000", + "averageBitrate": 121691, + "bitrate": 140833, + "contentLength": "2480393", + "indexRange": { + "end": "551", + "start": "266" + }, + "initRange": { + "end": "265", + "start": "0" + }, + "itag": 251, + "lastModified": "1714877359450110", + "loudnessDb": 5.21, + "mimeType": "audio/webm; codecs=\"opus\"", + "projectionType": "RECTANGULAR", + "quality": "tiny", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&vprv=1&svpuc=1&mime=audio%2Fwebm&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&rqh=1&gir=yes&clen=2480393&dur=163.061&lmt=1714877359450110&mt=1722295996&fvip=4&keepalive=yes&lmw=1&c=TVHTML5&sefc=1&txp=1308224&n=9oDhjinGhAMzJwSwL&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgO0jG-x2l6AF7tjryIX_oM3np78WgNDiseezppLfbQrgCIQCVLdpDhclKc8vQgWGzKXcqsAxgNl5S3MlLT8u1Jeok2A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D" + } + ], + "expiresInSeconds": "21540", + "formats": [ + { + "approxDurationMs": "163096", + "audioChannels": 2, + "audioQuality": "AUDIO_QUALITY_LOW", + "audioSampleRate": "44100", + "averageBitrate": 503367, + "bitrate": 503574, + "contentLength": "10262148", + "fps": 30, + "height": 360, + "itag": 18, + "lastModified": "1700885551970466", + "mimeType": "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"", + "projectionType": "RECTANGULAR", + "quality": "medium", + "qualityLabel": "360p", + "url": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&itag=18&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&bui=AXc671IT4iUCpJNJWUitTMgIi6njuKSsi3MNed1Szyf0qysTX0v1Nf6AyCvjIGbek5Fn50kuBrGtRJ5q&vprv=1&svpuc=1&mime=video%2Fmp4&ns=YmgbZhlLp0C-9ilsQWGAyUAQ&rqh=1&gir=yes&clen=10262148&ratebypass=yes&dur=163.096&lmt=1700885551970466&mt=1722295996&fvip=4&lmw=1&c=TVHTML5&sefc=1&txp=1318224&n=jTK1xoYpbq_JEKnBL&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AJfQdSswRAIgUah4qH8RqPzmo75ExCWSiRYlUlsAk0v9gl638LitVNICICxFs5lK3CsmOAja0bsXavXkyykzpdhHZKGXOZQYT1f8&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D", + "width": 640 + } + ], + "serverAbrStreamingUrl": "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?expire=1722318110&ei=viioZtTdKteHi9oPl42KsAg&ip=93.235.183.158&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mv=m&mvi=5&pl=26&initcwndbps=1957500&svpuc=1&ns=Kl83P0QZk1oI9742KUD7ly8Q&sabr=1&rqh=1&mt=1722295996&fvip=4&keepalive=yes&c=TVHTML5&smc=1&n=vteqEdq2-fowKcpxH&sparams=expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Csvpuc%2Cns%2Csabr%2Crqh&sig=AJfQdSswRAIgJRK55pIkQ3Pak9jZ4fHPDsxXv0YgkxKE-FFdIN12ph8CIFHlFEvAoUOoX4Fd1RmyCJqgLZhDkSLwD6s-xVW25kYL&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D" + }, + "trackingParams": "CAAQu2kiEwjUtN-9ts2HAxXXw0IFHZeGAoY=", + "videoDetails": { + "allowRatings": true, + "channelId": "UCbxxEi-ImPlbLx5F-fHetEg", + "isCrawlable": true, + "isLiveContent": false, + "isOwnerViewing": false, + "isPrivate": false, + "isUnpluggedCorpus": false, + "lengthSeconds": "163", + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV", + "thumbnail": { + "thumbnails": [ + { + "height": 360, + "url": "https://i.ytimg.com/vi/pPvd8UxmSbQ/hqdefault.jpg", + "width": 480 + } + ] + }, + "videoId": "pPvd8UxmSbQ" + } +} diff --git a/testfiles/player_model/hdr.json b/testfiles/player_model/hdr.json index 61c3192..ddf78d1 100644 --- a/testfiles/player_model/hdr.json +++ b/testfiles/player_model/hdr.json @@ -31,7 +31,8 @@ "height": 1080 } ], - "channel": { "id": "UCYq-iAOSZBvoUxvfzwKIZWA", "name": "Jacob + Katie Schwarz" }, + "channel_id": "UCYq-iAOSZBvoUxvfzwKIZWA", + "channel_name": "Jacob + Katie Schwarz", "view_count": 216221243, "keywords": [ "4K", diff --git a/testfiles/player_model/multilanguage.json b/testfiles/player_model/multilanguage.json index d36f102..59c7dc5 100644 --- a/testfiles/player_model/multilanguage.json +++ b/testfiles/player_model/multilanguage.json @@ -31,10 +31,8 @@ "height": 1080 } ], - "channel": { - "id": "UCX6OQ3DkcsbYNE6H8uQQuVA", - "name": "MrBeast" - }, + "channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA", + "channel_name": "MrBeast", "view_count": 136908834, "keywords": [], "is_live": false, diff --git a/tests/youtube.rs b/tests/youtube.rs index f157d99..d1e97f6 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -26,6 +26,7 @@ use rustypipe::validate; #[rstest] #[case::desktop(ClientType::Desktop)] +#[case::tv(ClientType::Tv)] #[case::tv_html5_embed(ClientType::TvHtml5Embed)] #[case::android(ClientType::Android)] #[case::ios(ClientType::Ios)] @@ -40,13 +41,26 @@ async fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) // dbg!(&player_data); assert_eq!(player_data.details.id, "n4tK7LYFxI0"); - assert_eq!( - player_data.details.name, - "Spektrem - Shine | Progressive House | NCS - Copyright Free Music" - ); - if client_type == ClientType::DesktopMusic { - assert!(player_data.details.description.is_none()); - } else { + assert_eq!(player_data.details.duration, 259); + assert!(!player_data.details.thumbnail.is_empty()); + assert_eq!(player_data.details.channel_id, "UC_aEa8K-EOJ3D6gOs7HcyNg"); + assert!(!player_data.details.is_live_content); + + // The TV client dows not output most video metadata + if client_type != ClientType::Tv { + assert_eq!( + player_data.details.name.expect("name"), + "Spektrem - Shine | Progressive House | NCS - Copyright Free Music" + ); + assert_eq!( + player_data.details.channel_name.expect("channel name"), + "NoCopyrightSounds" + ); + assert_gte( + player_data.details.view_count.expect("view count"), + 146_818_808, + "view count", + ); assert!(player_data .details .description @@ -54,15 +68,10 @@ async fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) .contains( "NCS (NoCopyrightSounds): Empowering Creators through Copyright / Royalty Free Music" )); + assert_eq!(player_data.details.keywords[0], "spektrem"); } - assert_eq!(player_data.details.duration, 259); - assert!(!player_data.details.thumbnail.is_empty()); - assert_eq!(player_data.details.channel.id, "UC_aEa8K-EOJ3D6gOs7HcyNg"); - assert_eq!(player_data.details.channel.name, "NoCopyrightSounds"); - assert_gte(player_data.details.view_count, 146_818_808, "view count"); - assert_eq!(player_data.details.keywords[0], "spektrem"); - assert!(!player_data.details.is_live_content); + // Ios uses different A/V formats if client_type == ClientType::Ios { let video = player_data .video_only_streams @@ -237,13 +246,13 @@ async fn get_player( let details = player_data.details; assert_eq!(details.id, id); - assert_eq!(details.name, name); + assert_eq!(details.name.expect("name"), name); let desc = details.description.expect("description"); assert!(desc.contains(description), "description: {desc}"); assert_eq!(details.duration, duration); - assert_eq!(details.channel.id, channel_id); - assert_eq!(details.channel.name, channel_name); - assert_gte(details.view_count, views, "views"); + assert_eq!(details.channel_id, channel_id); + assert_eq!(details.channel_name.expect("channel name"), channel_name); + assert_gte(details.view_count.expect("view count"), views, "views"); assert_eq!(details.is_live, is_live); assert_eq!(details.is_live_content, is_live_content); From 1e1315a8378bd0ad25b5f1614e83dabc4a0b40d5 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 31 Jul 2024 03:27:27 +0200 Subject: [PATCH 02/12] feat: downloader: add audio tagging --- .vscode/settings.json | 2 +- Cargo.toml | 5 +- README.md | 4 + cli/src/main.rs | 4 + downloader/Cargo.toml | 8 +- downloader/src/lib.rs | 311 +++++++++++++++++++++++++++++++++++++---- downloader/src/util.rs | 18 +++ 7 files changed, 323 insertions(+), 29 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3f2ccb1..637231b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "rust-analyzer.cargo.features": ["rss"] + "rust-analyzer.cargo.features": ["rss", "indicatif", "audiotag"] } diff --git a/Cargo.toml b/Cargo.toml index ee401fd..220e5da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,7 +74,10 @@ tracing-test = "0.2.5" # Included crates rustypipe = { path = ".", version = "0.2.0", default-features = false } -rustypipe-downloader = { path = "./downloader", version = "0.1.0", default-features = false } +rustypipe-downloader = { path = "./downloader", version = "0.1.0", default-features = false, features = [ + "indicatif", + "audiotag", +] } [features] default = ["default-tls"] diff --git a/README.md b/README.md index 432fa4c..15f6876 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # ![RustyPipe](https://code.thetadev.de/ThetaDev/rustypipe/raw/branch/main/notes/logo.svg) +[![Current crates.io version](https://img.shields.io/crates/v/smartcrop2.svg)](https://crates.io/crates/smartcrop2) +[![License](https://img.shields.io/badge/License-GPL--3-blue.svg?style=flat)](http://opensource.org/licenses/MIT) +[![CI status](https://code.thetadev.de/ThetaDev/rustypipe/actions/workflows/ci.yaml/badge.svg?style=flat&label=CI)](https://code.thetadev.de/ThetaDev/rustypipe/actions/?workflow=ci.yaml) + Rust client for the public YouTube / YouTube Music API (Innertube), inspired by [NewPipe](https://github.com/TeamNewPipe/NewPipeExtractor). diff --git a/cli/src/main.rs b/cli/src/main.rs index 484c51b..a4a428a 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -329,6 +329,8 @@ async fn download_video( .rustypipe(rp) .stream_filter(filter) .progress_bar(multi) + .audio_tag() + .crop_cover() .build(); let mut q = target.apply(dl.download_id(id)); if let Some(player_type) = player_type { @@ -361,6 +363,8 @@ async fn download_videos( .rustypipe(rp) .stream_filter(filter) .progress_bar(multi.clone()) + .audio_tag() + .crop_cover() .path_precheck() .build(); diff --git a/downloader/Cargo.toml b/downloader/Cargo.toml index c48fbe8..949a410 100644 --- a/downloader/Cargo.toml +++ b/downloader/Cargo.toml @@ -30,6 +30,8 @@ rustls-tls-native-roots = [ "rustypipe/rustls-tls-native-roots", ] +audiotag = ["dep:lofty", "dep:image", "dep:smartcrop2"] + [dependencies] rustypipe.workspace = true once_cell.workspace = true @@ -39,6 +41,10 @@ futures.workspace = true reqwest = { workspace = true, features = ["stream"] } rand.workspace = true tokio = { workspace = true, features = ["macros", "fs", "process"] } -indicatif.workspace = true +indicatif = { workspace = true, optional = true } filenamify.workspace = true tracing.workspace = true +time.workspace = true +lofty = { version = "0.21.0", optional = true } +image = { version = "0.25.0", optional = true } +smartcrop2 = { version = "0.2.0", optional = true } diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 6e9cfdf..3b72541 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -8,6 +8,7 @@ use std::{ borrow::Cow, cmp::Ordering, ffi::OsString, + io::Cursor, ops::Range, path::{Path, PathBuf}, sync::Arc, @@ -15,7 +16,6 @@ use std::{ }; use futures::stream::{self, StreamExt}; -use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use once_cell::sync::Lazy; use rand::Rng; use regex::Regex; @@ -23,17 +23,25 @@ use reqwest::{header, Client, StatusCode}; use rustypipe::{ client::{ClientType, RustyPipe}, model::{ + richtext::ToPlaintext, traits::{FileFormat, YtEntity}, - AudioCodec, VideoCodec, VideoPlayer, + AudioCodec, TrackItem, VideoCodec, VideoDetails, VideoPlayer, }, param::StreamFilter, }; +use time::{Date, OffsetDateTime}; use tokio::{ fs::{self, File}, io::AsyncWriteExt, process::Command, }; +#[cfg(feature = "indicatif")] +use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; + +#[cfg(feature = "audiotag")] +use lofty::{config::WriteOptions, picture::Picture, prelude::*, tag::Tag}; + pub use util::DownloadError; type Result = core::result::Result; @@ -54,11 +62,16 @@ pub struct Downloader { pub struct DownloaderBuilder { rp: Option, ffmpeg: String, + #[cfg(feature = "indicatif")] multi: Option, filter: StreamFilter, video_format: DownloadVideoFormat, n_retries: u32, path_precheck: bool, + #[cfg(feature = "audiotag")] + audio_tag: bool, + #[cfg(feature = "audiotag")] + crop_cover: bool, } struct DownloaderInner { @@ -69,6 +82,7 @@ struct DownloaderInner { /// Path to the ffmpeg binary ffmpeg: String, /// Global progress + #[cfg(feature = "indicatif")] multi: Option, /// Default stream filter filter: StreamFilter, @@ -78,6 +92,12 @@ struct DownloaderInner { n_retries: u32, /// Check if destination path exists before player is fetched path_precheck: bool, + /// Apply metadata to audio files + #[cfg(feature = "audiotag")] + audio_tag: bool, + /// Crop YT thumbnails to ensure square album covers + #[cfg(feature = "audiotag")] + crop_cover: bool, } /// Download query @@ -89,6 +109,7 @@ pub struct DownloadQuery { /// Destination dest: DownloadDest, /// Progress bar + #[cfg(feature = "indicatif")] multi: Option, /// Stream filter filter: Option, @@ -200,11 +221,16 @@ impl Default for DownloaderBuilder { Self { rp: None, ffmpeg: "ffmpeg".to_owned(), + #[cfg(feature = "indicatif")] multi: None, filter: StreamFilter::new(), video_format: DownloadVideoFormat::Mp4, n_retries: 3, path_precheck: false, + #[cfg(feature = "audiotag")] + audio_tag: false, + #[cfg(feature = "audiotag")] + crop_cover: false, } } } @@ -235,6 +261,7 @@ impl DownloaderBuilder { /// Set the indicatif [`MultiProgress`] used to show download progress /// for all downloads + #[cfg(feature = "indicatif")] #[must_use] pub fn progress_bar(mut self, progress: MultiProgress) -> Self { self.multi = Some(progress); @@ -277,6 +304,22 @@ impl DownloaderBuilder { self } + /// Enable audio tagging + #[cfg(feature = "audiotag")] + #[must_use] + pub fn audio_tag(mut self) -> Self { + self.audio_tag = true; + self + } + + /// Crop YouTube thumbnails to get square album covers + #[cfg(feature = "audiotag")] + #[must_use] + pub fn crop_cover(mut self) -> Self { + self.crop_cover = true; + self + } + /// Create a new, configured [`Downloader`] instance pub fn build(self) -> Downloader { self.build_with_client( @@ -294,11 +337,16 @@ impl DownloaderBuilder { rp: self.rp.unwrap_or_default(), http: http_client, ffmpeg: self.ffmpeg, + #[cfg(feature = "indicatif")] multi: self.multi, filter: self.filter, video_format: self.video_format, n_retries: self.n_retries, path_precheck: self.path_precheck, + #[cfg(feature = "audiotag")] + audio_tag: self.audio_tag, + #[cfg(feature = "audiotag")] + crop_cover: self.crop_cover, }), } } @@ -328,6 +376,7 @@ impl Downloader { dl: self.clone(), video, dest: DownloadDest::Default, + #[cfg(feature = "indicatif")] multi: None, filter: None, video_format: None, @@ -414,6 +463,7 @@ impl DownloadQuery { } /// Use a [`MultiProgress`] progress bar for all downloads + #[cfg(feature = "indicatif")] pub fn progress_bar(mut self, progress: MultiProgress) -> Self { self.multi = Some(progress); self @@ -443,16 +493,26 @@ impl DownloadQuery { let mut last_err = None; // Progress bar - let multi = self.multi.clone().or_else(|| self.dl.i.multi.clone()); - let pb = multi.map(|m| { - let pb = ProgressBar::new(1); - pb.set_style(ProgressStyle::with_template("{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})").unwrap() - .progress_chars("#>-")); - m.add(pb) - }); + #[cfg(feature = "indicatif")] + let pb = { + let multi = self.multi.clone().or_else(|| self.dl.i.multi.clone()); + multi.map(|m| { + let pb = ProgressBar::new(1); + pb.set_style(ProgressStyle::with_template("{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})").unwrap() + .progress_chars("#>-")); + m.add(pb) + }) + }; for n in 0..=self.dl.i.n_retries { - let err = match self.download_attempt(&pb, n).await { + let err = match self + .download_attempt( + n, + #[cfg(feature = "indicatif")] + &pb, + ) + .await + { Ok(res) => return Ok(res), Err(DownloadError::Http(e)) => { if !e.is_timeout() && e.status() != Some(StatusCode::FORBIDDEN) { @@ -472,7 +532,11 @@ impl DownloadQuery { Err(last_err.unwrap()) } - async fn download_attempt(&self, pb: &Option, n: u32) -> Result { + async fn download_attempt( + &self, + #[allow(unused_variables)] n: u32, + #[cfg(feature = "indicatif")] pb: &Option, + ) -> Result { let filter = self.filter.as_ref().unwrap_or(&self.dl.i.filter); let video_format = self.video_format.unwrap_or(self.dl.i.video_format); @@ -495,11 +559,13 @@ impl DownloadQuery { } } + #[cfg(feature = "indicatif")] let attempt_suffix = if n > 0 { format!(" (retry #{n})") } else { String::new() }; + #[cfg(feature = "indicatif")] if let Some(pb) = pb { pb.set_message(format!( "Fetching player data for {}{}", @@ -550,7 +616,7 @@ impl DownloadQuery { .details .channel_name .clone() - .or(details.map(|d| d.channel.name)), + .or(details.as_ref().map(|d| d.channel.name.to_owned())), }; let output_path = self.dest.get_dest_path(&pv).with_extension(extension); @@ -580,11 +646,20 @@ impl DownloadQuery { }); } + #[cfg(feature = "indicatif")] if let Some(pb) = pb { pb.set_message(format!("Downloading {name}{attempt_suffix}")) } - download_streams(&downloads, &self.dl.i.http, &user_agent, pb.clone()).await?; + download_streams( + &downloads, + &self.dl.i.http, + &user_agent, + #[cfg(feature = "indicatif")] + pb.clone(), + ) + .await?; + #[cfg(feature = "indicatif")] if let Some(pb) = &pb { pb.set_message(format!("Converting {name}")); pb.set_style( @@ -595,6 +670,25 @@ impl DownloadQuery { } convert_streams(&downloads, &output_path, &self.dl.i.ffmpeg, &name).await?; + + // Tag audio file + #[cfg(feature = "audiotag")] + if self.dl.i.audio_tag && video.is_none() { + let (details, track) = match details { + Some(d) => (d, self.dl.i.rp.query().music_details(&self.video.id).await?), + None => { + let q = self.dl.i.rp.query(); + tokio::try_join!( + q.video_details(&self.video.id), + q.music_details(&self.video.id) + )? + } + }; + self.apply_audio_tags(&output_path, details, track.track) + .await?; + } + + #[cfg(feature = "indicatif")] if let Some(pb) = pb { pb.disable_steady_tick(); } @@ -606,8 +700,9 @@ impl DownloadQuery { .collect::>() .await .into_iter() - .collect::>()?; + .collect::>()?; + #[cfg(feature = "indicatif")] if let Some(pb) = pb { pb.finish_and_clear(); } @@ -616,6 +711,107 @@ impl DownloadQuery { player_data, }) } + + #[cfg(feature = "audiotag")] + async fn apply_audio_tags( + &self, + file: &Path, + details: VideoDetails, + track: TrackItem, + ) -> Result<()> { + use std::num::NonZeroU32; + + use image::codecs::jpeg::JpegEncoder; + + let mut tagged_file = lofty::read_from_path(file)?; + let tag = match tagged_file.primary_tag_mut() { + Some(primary_tag) => primary_tag, + None => { + if let Some(first_tag) = tagged_file.first_tag_mut() { + first_tag + } else { + let tag_type = tagged_file.primary_tag_type(); + tagged_file.insert_tag(Tag::new(tag_type)); + + tagged_file.primary_tag_mut().unwrap() + } + } + }; + + let description = details.description.to_plaintext(); + + tag.set_album( + track + .album + .map(|b| b.name) + .unwrap_or_else(|| track.name.clone()), + ); + tag.set_artist( + track + .artists + .into_iter() + .next() + .map(|a| a.name) + .unwrap_or(details.channel.name), + ); + tag.set_title(track.name); + if let Some(release_date) = extract_yt_release_date(&description, details.publish_date) { + if let Ok(date_str) = release_date.format(&YMD_FORMAT) { + tag.insert_text(ItemKey::RecordingDate, date_str); + } + } + tag.set_comment(description); + + let thumbnail = track.cover.into_iter().max_by_key(|c| c.height); + if let Some(thumbnail) = thumbnail { + let resp = self + .dl + .i + .http + .get(thumbnail.url) + .send() + .await? + .error_for_status()?; + let img_type = resp + .headers() + .get(header::CONTENT_TYPE) + .and_then(|fmt| fmt.to_str().ok()) + .and_then(image::ImageFormat::from_mime_type); + let img_bts = resp.bytes().await?; + + let mut lofty_img = if self.dl.i.crop_cover { + let mut img = if let Some(fmt) = img_type { + image::load_from_memory_with_format(&img_bts, fmt)? + } else { + image::load_from_memory(&img_bts)? + }; + + // Crop cover image if it is not square + if img.height() != img.width() && img.height() > 0 { + let crop = smartcrop::find_best_crop(&img, NonZeroU32::MIN, NonZeroU32::MIN) + .unwrap() + .crop; + img = img.crop_imm(crop.x, crop.y, crop.width, crop.height); + let mut enc_bts = Vec::new(); + img.write_with_encoder(JpegEncoder::new_with_quality(&mut enc_bts, 90))?; + let mut rd = Cursor::new(enc_bts); + Picture::from_reader(&mut rd)? + } else { + let mut rd = Cursor::new(img_bts); + Picture::from_reader(&mut rd)? + } + } else { + let mut rd = Cursor::new(img_bts); + Picture::from_reader(&mut rd)? + }; + + lofty_img.set_pic_type(lofty::picture::PictureType::CoverFront); + tag.set_picture(0, lofty_img); + } + + tag.save_to_path(file, WriteOptions::default())?; + Ok(()) + } } fn get_download_range(offset: u64, size: Option) -> Range { @@ -666,12 +862,12 @@ fn filenamify_lim(name: &str) -> String { } } -async fn download_single_file>( +async fn download_single_file( url: &str, - output: P, + output: &Path, http: &Client, user_agent: &str, - pb: Option, + #[cfg(feature = "indicatif")] pb: Option, ) -> Result<()> { // Check if file is already downloaded let output_path: PathBuf = output.into(); @@ -729,6 +925,7 @@ async fn download_single_file>( size = Some(original_size); offset = file_size; + #[cfg(feature = "indicatif")] if let Some(pb) = &pb { pb.inc_length(original_size); pb.inc(offset); @@ -759,10 +956,29 @@ async fn download_single_file>( .await?; if is_gvideo && size.is_some() { - download_chunks_by_param(http, &mut file, url, size.unwrap(), offset, user_agent, pb) - .await?; + download_chunks_by_param( + http, + &mut file, + url, + size.unwrap(), + offset, + user_agent, + #[cfg(feature = "indicatif")] + pb, + ) + .await?; } else { - download_chunks_by_header(http, &mut file, url, size, offset, user_agent, pb).await?; + download_chunks_by_header( + http, + &mut file, + url, + size, + offset, + user_agent, + #[cfg(feature = "indicatif")] + pb, + ) + .await?; } fs::rename(&output_path_tmp, &output_path).await?; @@ -779,7 +995,7 @@ async fn download_chunks_by_header( size: Option, offset: u64, user_agent: &str, - pb: Option, + #[cfg(feature = "indicatif")] pb: Option, ) -> Result<()> { let mut offset = offset; let mut size = size; @@ -826,6 +1042,7 @@ async fn download_chunks_by_header( offset = parsed_offset + 1; if size.is_none() { size = Some(parsed_size); + #[cfg(feature = "indicatif")] if let Some(pb) = &pb { pb.inc_length(parsed_size); } @@ -836,6 +1053,7 @@ async fn download_chunks_by_header( while let Some(item) = stream.next().await { // Retrieve chunk. let mut chunk = item?; + #[cfg(feature = "indicatif")] if let Some(pb) = &pb { pb.inc(chunk.len() as u64); } @@ -859,9 +1077,10 @@ async fn download_chunks_by_param( size: u64, offset: u64, user_agent: &str, - pb: Option, + #[cfg(feature = "indicatif")] pb: Option, ) -> Result<()> { let mut offset = offset; + #[cfg(feature = "indicatif")] if let Some(pb) = &pb { pb.inc_length(size); } @@ -891,6 +1110,7 @@ async fn download_chunks_by_param( while let Some(item) = stream.next().await { // Retrieve chunk. let mut chunk = item?; + #[cfg(feature = "indicatif")] if let Some(pb) = &pb { pb.inc(chunk.len() as u64); } @@ -918,12 +1138,21 @@ async fn download_streams( downloads: &Vec, http: &Client, user_agent: &str, - pb: Option, + #[cfg(feature = "indicatif")] pb: Option, ) -> Result<()> { let n = downloads.len(); stream::iter(downloads) - .map(|d| download_single_file(&d.url, d.file.clone(), http, user_agent, pb.clone())) + .map(|d| { + download_single_file( + &d.url, + &d.file, + http, + user_agent, + #[cfg(feature = "indicatif")] + pb.clone(), + ) + }) .buffer_unordered(n) .collect::>() .await @@ -933,9 +1162,9 @@ async fn download_streams( Ok(()) } -async fn convert_streams>( +async fn convert_streams( downloads: &[StreamDownload], - output: P, + output: &Path, ffmpeg: &str, title: &str, ) -> Result<()> { @@ -975,3 +1204,33 @@ async fn convert_streams>( } Ok(()) } + +const YMD_FORMAT: &[time::format_description::FormatItem] = + time::macros::format_description!("[year]-[month]-[day]"); + +fn extract_yt_release_date( + description: &str, + publish_date: Option, +) -> Option { + static RELEASE_DATE_REGEX: Lazy = + Lazy::new(|| Regex::new(r"Released on: (\d{4}-\d{2}-\d{2})").unwrap()); + + RELEASE_DATE_REGEX + .captures(description) + .and_then(|cap| { + let raw_date = &cap[1]; + Date::parse(raw_date, YMD_FORMAT).ok() + }) + .map(|release_date| { + if let Some(upload_date) = publish_date { + // Prefer the video upload date if it lies within 4 days of the release date + let upload_date = upload_date.date(); + let diff = (upload_date - release_date).abs(); + if diff < time::Duration::days(4) { + return upload_date; + } + } + release_date + }) + .or_else(|| publish_date.map(|d| d.date())) +} diff --git a/downloader/src/util.rs b/downloader/src/util.rs index d95b8f0..3934e2f 100644 --- a/downloader/src/util.rs +++ b/downloader/src/util.rs @@ -27,11 +27,29 @@ pub enum DownloadError { /// Download target already exists #[error("file {0} already exists")] Exists(PathBuf), + #[cfg(feature = "audiotag")] + /// Audio tagging error + #[error("Audio tag error: {0}")] + AudioTag(Cow<'static, str>), /// Other error #[error("error: {0}")] Other(Cow<'static, str>), } +#[cfg(feature = "audiotag")] +impl From for DownloadError { + fn from(value: lofty::error::LoftyError) -> Self { + Self::AudioTag(value.to_string().into()) + } +} + +#[cfg(feature = "audiotag")] +impl From for DownloadError { + fn from(value: image::ImageError) -> Self { + Self::AudioTag(value.to_string().into()) + } +} + /// Split an URL into its base string and parameter map /// /// Example: From 3c83e11e753f8eb6efea5d453a7c819c487b3464 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 31 Jul 2024 21:46:32 +0200 Subject: [PATCH 03/12] fix: nsig fn extraction --- src/deobfuscate.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index 58e2924..4f90df9 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -164,6 +164,7 @@ fn get_sig_fn(player_js: &str) -> Result { + &deobfuscate_function + &caller_function(DEOBF_SIG_FUNC_NAME, &dfunc_name); verify_fn(&js_fn, DEOBF_SIG_FUNC_NAME)?; + tracing::debug!("successfully extracted sig fn `{dfunc_name}`"); Ok(js_fn) } @@ -171,7 +172,7 @@ fn get_sig_fn(player_js: &str) -> Result { fn get_nsig_fn_names(player_js: &str) -> impl Iterator + '_ { static FUNCTION_NAME_REGEX: Lazy = Lazy::new(|| { // x.get( .. y=functionName[array_num](z) .. x.set( - Regex::new(r#"\w\.get\(.+\w=(\w{2,})\[(\d+)\]\(\w\).+\w\.set\("#).unwrap() + Regex::new(r#"(?:\w\.get\(|index\.m3u8).+\w=(\w{2,})\[(\d+)\]\(\w\).+\w\.set\("#).unwrap() }); FUNCTION_NAME_REGEX @@ -265,7 +266,7 @@ fn get_nsig_fn(player_js: &str) -> Result { let js_fn = extract_js_fn(&player_js[offset..], name) .map(|s| s + ";" + &caller_function(DEOBF_NSIG_FUNC_NAME, name))?; verify_fn(&js_fn, DEOBF_NSIG_FUNC_NAME)?; - tracing::info!("Successfully extracted nsig fn `{name}`"); + tracing::debug!("successfully extracted nsig fn `{name}`"); Ok(js_fn) }; @@ -436,6 +437,6 @@ c[36](c[8],c[32]),c[20](c[25],c[10]),c[2](c[22],c[8]),c[32](c[20],c[16]),c[32](c let deobf_sig = deobf.deobfuscate_sig("GOqGOqGOq0QJ8wRAIgaryQHfplJ9xJSKFywyaSMHuuwZYsoMTAvRvfm51qIGECIA5061zWeyfMPX9hEl_U6f9J0tr7GTJMKyPf5XNrJb5fb5i").unwrap(); assert!(deobf_sig.len() >= 100); let deobf_nsig = deobf.deobfuscate_nsig("WHbZ-Nj2TSJxder").unwrap(); - assert!(deobf_nsig.len() >= 10); + assert!(deobf_nsig.len() >= 6); } } From e1e4fb29c190fec07f17c59ec88bef4f1c2a76a1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 1 Aug 2024 03:11:54 +0200 Subject: [PATCH 04/12] feat: downloader: add download_track fn, improve path templates --- cli/src/main.rs | 30 +++--- downloader/Cargo.toml | 2 +- downloader/src/lib.rs | 220 +++++++++++++++++++++++++++++++++++------- 3 files changed, 201 insertions(+), 51 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index a4a428a..3a8d503 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -7,10 +7,10 @@ use futures::stream::{self, StreamExt}; use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use rustypipe::{ client::{ClientType, RustyPipe}, - model::{UrlTarget, VideoId, YouTubeItem}, + model::{UrlTarget, YouTubeItem}, param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; -use rustypipe_downloader::{DownloadError, DownloadQuery, DownloaderBuilder}; +use rustypipe_downloader::{DownloadError, DownloadQuery, DownloadVideo, DownloaderBuilder}; use serde::Serialize; use tracing::level_filters::LevelFilter; use tracing_subscriber::{fmt::MakeWriter, EnvFilter}; @@ -344,7 +344,7 @@ async fn download_video( async fn download_videos( rp: &RustyPipe, - videos: &[VideoId], + videos: Vec, target: &DownloadTarget, resolution: Option, parallel: usize, @@ -385,9 +385,9 @@ async fn download_videos( .for_each_concurrent(parallel, |video| { let dl = dl.clone(); let main = main.clone(); - let id = &video.id; + let id = video.id().to_owned(); - let mut q = target.apply(dl.download_entity(video)); + let mut q = target.apply(dl.download_video(video)); if let Some(player_type) = player_type { q = q.player_type(player_type.into()); } @@ -482,16 +482,16 @@ async fn main() { .extend_limit(&rp.query(), limit) .await .unwrap(); - let videos: Vec = channel + let videos = channel .content .items .into_iter() .take(limit) - .map(VideoId::from) + .map(|v| DownloadVideo::from_entity(&v)) .collect(); download_videos( &rp, - &videos, + videos, &target, resolution, parallel, @@ -502,7 +502,7 @@ async fn main() { } UrlTarget::Playlist { id } => { target.assert_dir(); - let videos: Vec = if music { + let videos = if music { let mut playlist = rp.query().music_playlist(id).await.unwrap(); playlist .tracks @@ -514,7 +514,7 @@ async fn main() { .items .into_iter() .take(limit) - .map(VideoId::from) + .map(|v| DownloadVideo::from_track(&v)) .collect() } else { let mut playlist = rp.query().playlist(id).await.unwrap(); @@ -528,12 +528,12 @@ async fn main() { .items .into_iter() .take(limit) - .map(VideoId::from) + .map(|v| DownloadVideo::from_entity(&v)) .collect() }; download_videos( &rp, - &videos, + videos, &target, resolution, parallel, @@ -545,15 +545,15 @@ async fn main() { UrlTarget::Album { id } => { target.assert_dir(); let album = rp.query().music_album(id).await.unwrap(); - let videos: Vec = album + let videos = album .tracks .into_iter() .take(limit) - .map(VideoId::from) + .map(|v| DownloadVideo::from_track(&v)) .collect(); download_videos( &rp, - &videos, + videos, &target, resolution, parallel, diff --git a/downloader/Cargo.toml b/downloader/Cargo.toml index 949a410..b04d087 100644 --- a/downloader/Cargo.toml +++ b/downloader/Cargo.toml @@ -47,4 +47,4 @@ tracing.workspace = true time.workspace = true lofty = { version = "0.21.0", optional = true } image = { version = "0.25.0", optional = true } -smartcrop2 = { version = "0.2.0", optional = true } +smartcrop2 = { version = "0.3.0", optional = true } diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 3b72541..d9588cd 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -9,6 +9,7 @@ use std::{ cmp::Ordering, ffi::OsString, io::Cursor, + num::NonZeroU32, ops::Range, path::{Path, PathBuf}, sync::Arc, @@ -25,7 +26,7 @@ use rustypipe::{ model::{ richtext::ToPlaintext, traits::{FileFormat, YtEntity}, - AudioCodec, TrackItem, VideoCodec, VideoDetails, VideoPlayer, + AudioCodec, TrackItem, VideoCodec, VideoDetails, VideoPlayer, VideoPlayerDetails, }, param::StreamFilter, }; @@ -119,16 +120,26 @@ pub struct DownloadQuery { player_type: Option, } +/// Video to be downloaded #[derive(Default)] -struct DownloadVideo { +pub struct DownloadVideo { id: String, name: Option, channel_id: Option, channel_name: Option, + album_id: Option, + album_name: Option, + track_nr: Option, } impl DownloadVideo { - fn from_video(video: &impl YtEntity) -> Self { + /// Get the YouTube video id + pub fn id(&self) -> &str { + &self.id + } + + /// Create a new DownloadVideo from a YouTube entity + pub fn from_entity(video: &impl YtEntity) -> Self { DownloadVideo { id: video.id().to_owned(), name: Some(video.name().to_owned()), @@ -136,6 +147,26 @@ impl DownloadVideo { channel_name: video .channel_name() .map(|n| n.strip_suffix(" - Topic").unwrap_or(n).to_owned()), + album_id: None, + album_name: None, + track_nr: None, + } + } + + /// Create a new DownloadVideo from a YTM track + pub fn from_track(track: &TrackItem) -> Self { + DownloadVideo { + id: track.id.to_owned(), + name: Some(track.name.to_owned()), + channel_id: track.channel_id().map(str::to_owned), + channel_name: if track.by_va { + Some("Various Artists".to_owned()) + } else { + track.channel_name().map(str::to_owned) + }, + album_id: track.album.as_ref().map(|b| b.id.to_owned()), + album_name: track.album.as_ref().map(|b| b.name.to_owned()), + track_nr: track.track_nr, } } } @@ -149,11 +180,11 @@ enum DownloadDest { } fn video_filename(v: &DownloadVideo) -> String { - filenamify_lim(&format!( - "{} [{}]", - v.name.as_deref().unwrap_or_default(), - v.id - )) + let mut n = format!("{} [{}]", v.name.as_deref().unwrap_or_default(), v.id); + if let Some(track_nr) = v.track_nr { + n = format!("{track_nr:02} {n}"); + } + filenamify_lim(&n) } /// Video container format for downloading @@ -191,6 +222,8 @@ impl DownloadVideoFormat { impl DownloadDest { fn get_dest_path(&self, v: &DownloadVideo) -> PathBuf { + static RE_TEMPLATE: Lazy = Lazy::new(|| Regex::new(r#"\{\w+\} *"#).unwrap()); + match self { DownloadDest::Default => PathBuf::from(video_filename(v)), DownloadDest::File(p) => p.clone(), @@ -199,17 +232,38 @@ impl DownloadDest { .iter() .map(|part| { let s = part.to_string_lossy(); - let mut s = s.replace("{id}", &v.id); - if let Some(name) = &v.name { - s = s.replace("{title}", name) + + let (mut replaced, last_end) = RE_TEMPLATE.find_iter(&s).fold( + (String::new(), 0), + |(mut acc, last_end), m| { + acc += &s[last_end..m.start()]; + let ms = m.as_str(); + let trimmed = ms.trim_end_matches(' '); + let repl: Option> = match trimmed.trim_matches(['{', '}']) { + "id" => Some(v.id.as_str().into()), + "title" => v.name.as_deref().map(Cow::from), + "channel" => v.channel_name.as_deref().map(Cow::from), + "channelId" => v.channel_id.as_deref().map(Cow::from), + "album" => v.album_name.as_deref().map(Cow::from), + "albumId" => v.album_id.as_deref().map(Cow::from), + "track" => v.track_nr.map(|n| format!("{n:02}").into()), + _ => None, + }; + if let Some(repl) = repl { + acc += &repl; + acc += &ms[trimmed.len()..]; + } + (acc, m.end()) + }, + ); + replaced += &s[last_end..]; + replaced = replaced.trim().to_owned(); + + if replaced.is_empty() { + "-".to_owned() + } else { + filenamify_lim(&replaced) } - if let Some(channel) = &v.channel_name { - s = s.replace("{channel}", channel) - } - if let Some(id) = &v.channel_id { - s = s.replace("{channelId}", id); - } - filenamify_lim(&s) }) .collect(), } @@ -392,12 +446,27 @@ impl Downloader { }) } + /// Download a video from a DownloadVideo object + pub fn download_video(&self, video: DownloadVideo) -> DownloadQuery { + self.query(video) + } + /// Download a video from a [`YtEntity`] object (e.g. playlist/channel video) /// /// Providing an entity has the advantage that the download path can be determined before the video /// is fetched, so already downloaded videos get skipped right away. pub fn download_entity(&self, video: &impl YtEntity) -> DownloadQuery { - self.query(DownloadVideo::from_video(video)) + self.query(DownloadVideo::from_entity(video)) + } + + /// Download a video from a [`TrackItem`] (YouTube music album/playlist item) + /// + /// Providing an entity has the advantage that the download path can be determined before the video + /// is fetched, so already downloaded videos get skipped right away. + /// + /// If an album track is downloaded, this method will also add the track number to the downloaded file + pub fn download_track(&self, track: &TrackItem) -> DownloadQuery { + self.query(DownloadVideo::from_track(track)) } } @@ -617,6 +686,9 @@ impl DownloadQuery { .channel_name .clone() .or(details.as_ref().map(|d| d.channel.name.to_owned())), + album_id: self.video.album_id.to_owned(), + album_name: self.video.album_name.to_owned(), + track_nr: self.video.track_nr, }; let output_path = self.dest.get_dest_path(&pv).with_extension(extension); @@ -684,8 +756,14 @@ impl DownloadQuery { )? } }; - self.apply_audio_tags(&output_path, details, track.track) - .await?; + self.apply_audio_tags( + &output_path, + details, + &player_data.details, + track.track, + pv.track_nr, + ) + .await?; } #[cfg(feature = "indicatif")] @@ -717,12 +795,10 @@ impl DownloadQuery { &self, file: &Path, details: VideoDetails, + player_details: &VideoPlayerDetails, track: TrackItem, + track_nr: Option, ) -> Result<()> { - use std::num::NonZeroU32; - - use image::codecs::jpeg::JpegEncoder; - let mut tagged_file = lofty::read_from_path(file)?; let tag = match tagged_file.primary_tag_mut() { Some(primary_tag) => primary_tag, @@ -761,8 +837,30 @@ impl DownloadQuery { } } tag.set_comment(description); + if let Some(track_nr) = track_nr { + tag.set_track(track_nr.into()); + } + + // For YTM tracks the music details contain a high quality, square cover image, but for music videos + // the cover images are cropped and of worse resolution. + // Therefore we switch to the thumbnails from the player data if the music details contain no square + // thumbnails. + let thumbnail_music = track.cover.into_iter().max_by_key(|c| c.height); + let thumbnail = if thumbnail_music + .as_ref() + .map(|tn| tn.height == tn.width) + .unwrap_or_default() + { + thumbnail_music + } else { + let thumbnail_player = player_details + .thumbnail + .iter() + .max_by_key(|c| c.height) + .cloned(); + thumbnail_player.or(thumbnail_music) + }; - let thumbnail = track.cover.into_iter().max_by_key(|c| c.height); if let Some(thumbnail) = thumbnail { let resp = self .dl @@ -780,20 +878,23 @@ impl DownloadQuery { let img_bts = resp.bytes().await?; let mut lofty_img = if self.dl.i.crop_cover { - let mut img = if let Some(fmt) = img_type { - image::load_from_memory_with_format(&img_bts, fmt)? - } else { - image::load_from_memory(&img_bts)? - }; - // Crop cover image if it is not square - if img.height() != img.width() && img.height() > 0 { + if thumbnail.height != thumbnail.width { + let mut img = if let Some(fmt) = img_type { + image::load_from_memory_with_format(&img_bts, fmt)? + } else { + image::load_from_memory(&img_bts)? + }; + let crop = smartcrop::find_best_crop(&img, NonZeroU32::MIN, NonZeroU32::MIN) - .unwrap() + .map_err(|e| DownloadError::AudioTag(format!("image crop: {e}").into()))? .crop; img = img.crop_imm(crop.x, crop.y, crop.width, crop.height); let mut enc_bts = Vec::new(); - img.write_with_encoder(JpegEncoder::new_with_quality(&mut enc_bts, 90))?; + img.write_with_encoder(image::codecs::jpeg::JpegEncoder::new_with_quality( + &mut enc_bts, + 90, + ))?; let mut rd = Cursor::new(enc_bts); Picture::from_reader(&mut rd)? } else { @@ -1234,3 +1335,52 @@ fn extract_yt_release_date( }) .or_else(|| publish_date.map(|d| d.date())) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn template() { + let dest = + DownloadDest::Template(PathBuf::from("{channel}/{album}/{track} {title} [{id}]")); + let track_path = dest.get_dest_path(&DownloadVideo { + id: "a3Fo1vYyiDw".to_owned(), + name: Some("Volle Kraft voraus".to_owned()), + channel_id: Some("UCE7_p3lcXA-YXRZp2PjrgYw".to_owned()), + channel_name: Some("Helene Fischer".to_owned()), + album_id: Some("MPREb_O2gXCdCVGsZ".to_owned()), + album_name: Some("Rausch (Deluxe)".to_owned()), + track_nr: Some(1), + }); + assert_eq!( + track_path.to_str().unwrap(), + "Helene Fischer/Rausch (Deluxe)/01 Volle Kraft voraus [a3Fo1vYyiDw]" + ); + + let video_path = dest.get_dest_path(&DownloadVideo { + id: "5en96GIijXk".to_owned(), + name: Some("a pretty cloud, and a happy duck".to_owned()), + channel_id: Some("UCl2mFZoRqjw_ELax4Yisf6w".to_owned()), + channel_name: Some("Louis Rossmann".to_owned()), + album_id: None, + album_name: None, + track_nr: None, + }); + assert_eq!( + video_path.to_str().unwrap(), + "Louis Rossmann/-/a pretty cloud, and a happy duck [5en96GIijXk]" + ); + + let ido_path = dest.get_dest_path(&DownloadVideo { + id: "5en96GIijXk".to_owned(), + name: None, + channel_id: None, + channel_name: None, + album_id: None, + album_name: None, + track_nr: None, + }); + assert_eq!(ido_path.to_str().unwrap(), "-/-/[5en96GIijXk]"); + } +} From c6bd03fb70871ae1b764be18f88e86e71818fc56 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 6 Aug 2024 14:01:38 +0200 Subject: [PATCH 05/12] fix: add var to deobf fn assignment --- src/deobfuscate.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index 4f90df9..6f21adf 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -264,7 +264,7 @@ fn get_nsig_fn(player_js: &str) -> Result { .ok_or(DeobfError::Extraction("could not find function base"))?; let js_fn = extract_js_fn(&player_js[offset..], name) - .map(|s| s + ";" + &caller_function(DEOBF_NSIG_FUNC_NAME, name))?; + .map(|s| format!("var {};{}", s, caller_function(DEOBF_NSIG_FUNC_NAME, name)))?; verify_fn(&js_fn, DEOBF_NSIG_FUNC_NAME)?; tracing::debug!("successfully extracted nsig fn `{name}`"); Ok(js_fn) @@ -331,7 +331,7 @@ mod tests { }); const SIG_DEOBF_FUNC: &str = r#"var qB={w8:function(a){a.reverse()},EC:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c},Np:function(a,b){a.splice(0,b)}};var Rva=function(a){a=a.split("");qB.Np(a,3);qB.w8(a,41);qB.EC(a,55);qB.Np(a,3);qB.w8(a,33);qB.Np(a,3);qB.EC(a,48);qB.EC(a,17);qB.EC(a,43);return a.join("")};var deobf_sig=Rva;"#; - const NSIG_DEOBF_FUNC: &str = r#"Vo=function(a){var b=a.split(""),c=[function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(""))}, + const NSIG_DEOBF_FUNC: &str = r#"var Vo=function(a){var b=a.split(""),c=[function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(""))}, 928409064,-595856984,1403221911,653089124,-168714481,-1883008765,158931990,1346921902,361518508,1403221911,-362174697,-233641452,function(){for(var d=64,e=[];++d-e.length-32;){switch(d){case 91:d=44;continue;case 123:d=65;break;case 65:d-=18;continue;case 58:d=96;continue;case 46:d=95}e.push(String.fromCharCode(d))}return e}, b,158931990,791141857,-907319795,-1776185924,1595027902,-829736173,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(0,1,d.splice(e,1,d[0])[0])}, -1274951142,function(){for(var d=64,e=[];++d-e.length-32;){switch(d){case 91:d=44;continue;case 123:d=65;break;case 65:d-=18;continue;case 58:d=96;continue;case 46:d=95}e.push(String.fromCharCode(d))}return e}, From 97fb0578b5c4954a596d8dee0c4b6e1d773a9300 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 6 Aug 2024 14:04:03 +0200 Subject: [PATCH 06/12] feat: add audiotag+indicatif features to downloader --- .forgejo/workflows/ci.yaml | 2 +- .pre-commit-config.yaml | 2 +- cli/src/main.rs | 101 +++++++++++-------------------------- downloader/README.md | 42 +++++++++++++++ downloader/src/lib.rs | 96 +++++++++++++++++++++++++---------- 5 files changed, 144 insertions(+), 99 deletions(-) create mode 100644 downloader/README.md diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 4239b3a..11582b8 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -17,7 +17,7 @@ jobs: cache-on-failure: "true" - name: 📎 Clippy - run: cargo clippy --all --features=rss -- -D warnings + run: cargo clippy --all --tests --features=rss,indicatif,audiotag -- -D warnings - name: 🧪 Test run: cargo nextest run --config-file ~/.config/nextest.toml --profile ci --retries 2 --features rss --workspace diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index defbeb7..05a4482 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,4 +10,4 @@ repos: hooks: - id: cargo-fmt - id: cargo-clippy - args: ["--all", "--tests", "--features=rss", "--", "-D", "warnings"] + args: ["--all", "--tests", "--features=rss,indicatif,audiotag", "--", "-D", "warnings"] diff --git a/cli/src/main.rs b/cli/src/main.rs index 3a8d503..3fbd68c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,3 +1,4 @@ +#![doc = include_str!("../README.md")] #![warn(clippy::todo, clippy::dbg_macro)] use std::{path::PathBuf, str::FromStr, time::Duration}; @@ -10,7 +11,9 @@ use rustypipe::{ model::{UrlTarget, YouTubeItem}, param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; -use rustypipe_downloader::{DownloadError, DownloadQuery, DownloadVideo, DownloaderBuilder}; +use rustypipe_downloader::{ + DownloadError, DownloadQuery, DownloadVideo, Downloader, DownloaderBuilder, +}; use serde::Serialize; use tracing::level_filters::LevelFilter; use tracing_subscriber::{fmt::MakeWriter, EnvFilter}; @@ -310,29 +313,12 @@ fn print_data(data: &T, format: Format, pretty: bool) { } async fn download_video( - rp: &RustyPipe, + dl: &Downloader, id: &str, target: &DownloadTarget, - resolution: Option, player_type: Option, - multi: MultiProgress, ) { - let mut filter = StreamFilter::new(); - if let Some(res) = resolution { - if res == 0 { - filter = filter.no_video(); - } else { - filter = filter.video_max_res(res); - } - } - let dl = DownloaderBuilder::new() - .rustypipe(rp) - .stream_filter(filter) - .progress_bar(multi) - .audio_tag() - .crop_cover() - .build(); - let mut q = target.apply(dl.download_id(id)); + let mut q = target.apply(dl.id(id)); if let Some(player_type) = player_type { q = q.player_type(player_type.into()); } @@ -343,31 +329,13 @@ async fn download_video( } async fn download_videos( - rp: &RustyPipe, + dl: &Downloader, videos: Vec, target: &DownloadTarget, - resolution: Option, parallel: usize, player_type: Option, multi: MultiProgress, ) { - let mut filter = StreamFilter::new(); - if let Some(res) = resolution { - if res == 0 { - filter = filter.no_video(); - } else { - filter = filter.video_max_res(res); - } - } - let dl = DownloaderBuilder::new() - .rustypipe(rp) - .stream_filter(filter) - .progress_bar(multi.clone()) - .audio_tag() - .crop_cover() - .path_precheck() - .build(); - // Indicatif setup let main = multi.add(ProgressBar::new( videos.len().try_into().unwrap_or_default(), @@ -387,7 +355,7 @@ async fn download_videos( let main = main.clone(); let id = video.id().to_owned(); - let mut q = target.apply(dl.download_video(video)); + let mut q = target.apply(dl.video(video)); if let Some(player_type) = player_type { q = q.player_type(player_type.into()); } @@ -470,9 +438,27 @@ async fn main() { player_type, } => { let url_target = rp.query().resolve_string(&id, false).await.unwrap(); + + let mut filter = StreamFilter::new(); + if let Some(res) = resolution { + if res == 0 { + filter = filter.no_video(); + } else { + filter = filter.video_max_res(res); + } + } + let dl = DownloaderBuilder::new() + .rustypipe(&rp) + .stream_filter(filter) + .multi_progress(multi.clone()) + .audio_tag() + .crop_cover() + .path_precheck() + .build(); + match url_target { UrlTarget::Video { id, .. } => { - download_video(&rp, &id, &target, resolution, player_type, multi).await; + download_video(&dl, &id, &target, player_type).await; } UrlTarget::Channel { id } => { target.assert_dir(); @@ -489,16 +475,7 @@ async fn main() { .take(limit) .map(|v| DownloadVideo::from_entity(&v)) .collect(); - download_videos( - &rp, - videos, - &target, - resolution, - parallel, - player_type, - multi, - ) - .await; + download_videos(&dl, videos, &target, parallel, player_type, multi).await; } UrlTarget::Playlist { id } => { target.assert_dir(); @@ -531,16 +508,7 @@ async fn main() { .map(|v| DownloadVideo::from_entity(&v)) .collect() }; - download_videos( - &rp, - videos, - &target, - resolution, - parallel, - player_type, - multi, - ) - .await; + download_videos(&dl, videos, &target, parallel, player_type, multi).await; } UrlTarget::Album { id } => { target.assert_dir(); @@ -551,16 +519,7 @@ async fn main() { .take(limit) .map(|v| DownloadVideo::from_track(&v)) .collect(); - download_videos( - &rp, - videos, - &target, - resolution, - parallel, - player_type, - multi, - ) - .await; + download_videos(&dl, videos, &target, parallel, player_type, multi).await; } } } diff --git a/downloader/README.md b/downloader/README.md new file mode 100644 index 0000000..24a554a --- /dev/null +++ b/downloader/README.md @@ -0,0 +1,42 @@ +# RustyPipe downloader + +The downloader is a companion crate for RustyPipe that allows for easy and fast +downloading of video and audio files. + +## Features + +- Fast download of streams, bypassing YouTube's throttling +- Join video and audio streams using ffmpeg +- [Indicatif](https://crates.io/crates/indicatif) support to show download progress bars + (enable `indicatif` feature to use) +- Tag audio files with title, album, artist, date, description and album cover (enable + `audiotag` feature to use) +- Album covers are automatically cropped using smartcrop to ensure they are square + +## How to use + +For the downloader to work, you need to have ffmpeg installed on your system. If your +ffmpeg binary is located at a non-standard path, you can configure the location using +[`DownloaderBuilder::ffmpeg`]. + +At first you have to instantiate and configure the downloader using either +[`Downloader::new`] or the [`DownloaderBuilder`]. + +Then you can build a new download query with a video ID, stream filter and destination +path and finally download the video. + +```rust ignore +use rustypipe::param::StreamFilter; +use rustypipe_downloader::DownloaderBuilder; + +let dl = DownloaderBuilder::new() + .audio_tag() + .crop_cover() + .build(); + +let filter_audio = StreamFilter::new().no_video(); +dl.id("ZeerrnuLi5E").stream_filter(filter_audio).to_file("audio.opus").download().await; + +let filter_video = StreamFilter::new().video_max_res(720); +dl.id("ZeerrnuLi5E").stream_filter(filter_video).to_file("video.mp4").download().await; +``` diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index d9588cd..685f69d 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -1,15 +1,12 @@ +#![doc = include_str!("../README.md")] #![warn(missing_docs, clippy::todo, clippy::dbg_macro)] -//! # YouTube audio/video downloader - mod util; use std::{ borrow::Cow, cmp::Ordering, ffi::OsString, - io::Cursor, - num::NonZeroU32, ops::Range, path::{Path, PathBuf}, sync::Arc, @@ -24,13 +21,11 @@ use reqwest::{header, Client, StatusCode}; use rustypipe::{ client::{ClientType, RustyPipe}, model::{ - richtext::ToPlaintext, traits::{FileFormat, YtEntity}, - AudioCodec, TrackItem, VideoCodec, VideoDetails, VideoPlayer, VideoPlayerDetails, + AudioCodec, TrackItem, VideoCodec, VideoPlayer, }, param::StreamFilter, }; -use time::{Date, OffsetDateTime}; use tokio::{ fs::{self, File}, io::AsyncWriteExt, @@ -42,6 +37,10 @@ use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; #[cfg(feature = "audiotag")] use lofty::{config::WriteOptions, picture::Picture, prelude::*, tag::Tag}; +#[cfg(feature = "audiotag")] +use rustypipe::model::{richtext::ToPlaintext, VideoDetails, VideoPlayerDetails}; +#[cfg(feature = "audiotag")] +use time::{Date, OffsetDateTime}; pub use util::DownloadError; @@ -65,6 +64,8 @@ pub struct DownloaderBuilder { ffmpeg: String, #[cfg(feature = "indicatif")] multi: Option, + #[cfg(feature = "indicatif")] + progress_style: Option, filter: StreamFilter, video_format: DownloadVideoFormat, n_retries: u32, @@ -85,6 +86,9 @@ struct DownloaderInner { /// Global progress #[cfg(feature = "indicatif")] multi: Option, + /// Progress style + #[cfg(feature = "indicatif")] + progress_style: ProgressStyle, /// Default stream filter filter: StreamFilter, /// Default video format @@ -111,7 +115,7 @@ pub struct DownloadQuery { dest: DownloadDest, /// Progress bar #[cfg(feature = "indicatif")] - multi: Option, + progress: Option, /// Stream filter filter: Option, /// Target video format @@ -251,7 +255,7 @@ impl DownloadDest { }; if let Some(repl) = repl { acc += &repl; - acc += &ms[trimmed.len()..]; + acc += &ms[trimmed.len()..]; // preceeding whitespace } (acc, m.end()) }, @@ -277,6 +281,8 @@ impl Default for DownloaderBuilder { ffmpeg: "ffmpeg".to_owned(), #[cfg(feature = "indicatif")] multi: None, + #[cfg(feature = "indicatif")] + progress_style: None, filter: StreamFilter::new(), video_format: DownloadVideoFormat::Mp4, n_retries: 3, @@ -317,11 +323,19 @@ impl DownloaderBuilder { /// for all downloads #[cfg(feature = "indicatif")] #[must_use] - pub fn progress_bar(mut self, progress: MultiProgress) -> Self { + pub fn multi_progress(mut self, progress: MultiProgress) -> Self { self.multi = Some(progress); self } + /// Set the indicatif [`ProgressStyle`] for the progress bars displayed under `multi_progress` + #[cfg(feature = "indicatif")] + #[must_use] + pub fn progress_style(mut self, style: ProgressStyle) -> Self { + self.progress_style = Some(style); + self + } + /// Set the default [`StreamFilter`] for all downloads. /// /// The filter can be overridden for individual download queries. @@ -393,6 +407,12 @@ impl DownloaderBuilder { ffmpeg: self.ffmpeg, #[cfg(feature = "indicatif")] multi: self.multi, + #[cfg(feature = "indicatif")] + progress_style: self.progress_style.unwrap_or_else(|| { + ProgressStyle::with_template("{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})") + .unwrap() + .progress_chars("#>-") + }), filter: self.filter, video_format: self.video_format, n_retries: self.n_retries, @@ -431,7 +451,7 @@ impl Downloader { video, dest: DownloadDest::Default, #[cfg(feature = "indicatif")] - multi: None, + progress: None, filter: None, video_format: None, player_type: None, @@ -439,7 +459,8 @@ impl Downloader { } /// Download a video with the given ID - pub fn download_id>(&self, video_id: S) -> DownloadQuery { + #[must_use] + pub fn id>(&self, video_id: S) -> DownloadQuery { self.query(DownloadVideo { id: video_id.into(), ..Default::default() @@ -447,7 +468,8 @@ impl Downloader { } /// Download a video from a DownloadVideo object - pub fn download_video(&self, video: DownloadVideo) -> DownloadQuery { + #[must_use] + pub fn video(&self, video: DownloadVideo) -> DownloadQuery { self.query(video) } @@ -455,7 +477,8 @@ impl Downloader { /// /// Providing an entity has the advantage that the download path can be determined before the video /// is fetched, so already downloaded videos get skipped right away. - pub fn download_entity(&self, video: &impl YtEntity) -> DownloadQuery { + #[must_use] + pub fn entity(&self, video: &impl YtEntity) -> DownloadQuery { self.query(DownloadVideo::from_entity(video)) } @@ -465,7 +488,8 @@ impl Downloader { /// is fetched, so already downloaded videos get skipped right away. /// /// If an album track is downloaded, this method will also add the track number to the downloaded file - pub fn download_track(&self, track: &TrackItem) -> DownloadQuery { + #[must_use] + pub fn track(&self, track: &TrackItem) -> DownloadQuery { self.query(DownloadVideo::from_track(track)) } } @@ -495,6 +519,7 @@ impl DownloadQuery { /// /// Note that the file extension may be changed to fit the reuested video/audio format. /// Refer to the [`DownloadResult`] to get the actual path after downloading. + #[must_use] pub fn to_file>(mut self, file: P) -> Self { let file = file.into(); self.update_video_format(&file); @@ -504,15 +529,16 @@ impl DownloadQuery { /// Download to the given directory /// - /// The filename is created by this template: `{title} [{id}]`. + /// The filename is created by this template: `{track} {title} [{id}]`. /// /// You can use a custom filename template using [`DownloadQuery::to_template`] + #[must_use] pub fn to_dir>(mut self, dir: P) -> Self { self.dest = DownloadDest::Dir(dir.into()); self } - /// Download to the given filename template + /// Download to a path determined by a template /// /// Templates are paths that may contain variables for video metadata. /// @@ -521,9 +547,17 @@ impl DownloadQuery { /// - `{title}` Video title /// - `{channel}` Channel name /// - `{channel_id}` Channel ID + /// - `{album}` Album + /// - `{album_id}` Album ID + /// - `{track}` Track number + /// + /// Whitespace between template variables is automatically removed if a variable + /// contains no data (e.g. `{track} {name}` is equal to `{name}` if a video without + /// track number is downloaded). /// /// Note that the file extension may be changed to fit the reuested video/audio format. /// Refer to the [`DownloadResult`] to get the actual path after downloading. + #[must_use] pub fn to_template>(mut self, tmpl: P) -> Self { let tmpl = tmpl.into(); self.update_video_format(&tmpl); @@ -531,46 +565,52 @@ impl DownloadQuery { self } - /// Use a [`MultiProgress`] progress bar for all downloads + /// Show the progress of this download using a Indicatif [`ProgressBar`] #[cfg(feature = "indicatif")] - pub fn progress_bar(mut self, progress: MultiProgress) -> Self { - self.multi = Some(progress); + #[must_use] + pub fn progress_bar(mut self, progress: ProgressBar) -> Self { + self.progress = Some(progress); self } /// Set a [`StreamFilter`] for choosing a stream to be downloaded + #[must_use] pub fn stream_filter(mut self, filter: StreamFilter) -> Self { self.filter = Some(filter); self } /// Set the [`VideoFormat`] of downloaded videos + #[must_use] pub fn video_format(mut self, video_format: DownloadVideoFormat) -> Self { self.video_format = Some(video_format); self } /// Set the [`ClientType`] used to fetch the YT player + #[must_use] pub fn player_type(mut self, player_type: ClientType) -> Self { self.player_type = Some(player_type); self } /// Download the video + /// + /// If no download path is set, the video is downloaded to the current directory + /// with a filename created by this template: `{track} {title} [{id}]`. #[tracing::instrument(skip(self), fields(id = self.video.id))] pub async fn download(&self) -> Result { let mut last_err = None; // Progress bar #[cfg(feature = "indicatif")] - let pb = { - let multi = self.multi.clone().or_else(|| self.dl.i.multi.clone()); - multi.map(|m| { + let pb = match &self.progress { + Some(progress) => Some(progress.clone()), + None => self.dl.i.multi.clone().map(|m| { let pb = ProgressBar::new(1); - pb.set_style(ProgressStyle::with_template("{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})").unwrap() - .progress_chars("#>-")); + pb.set_style(self.dl.i.progress_style.clone()); m.add(pb) - }) + }), }; for n in 0..=self.dl.i.n_retries { @@ -799,6 +839,8 @@ impl DownloadQuery { track: TrackItem, track_nr: Option, ) -> Result<()> { + use std::{io::Cursor, num::NonZeroU32}; + let mut tagged_file = lofty::read_from_path(file)?; let tag = match tagged_file.primary_tag_mut() { Some(primary_tag) => primary_tag, @@ -1306,9 +1348,11 @@ async fn convert_streams( Ok(()) } +#[cfg(feature = "audiotag")] const YMD_FORMAT: &[time::format_description::FormatItem] = time::macros::format_description!("[year]-[month]-[day]"); +#[cfg(feature = "audiotag")] fn extract_yt_release_date( description: &str, publish_date: Option, From 114a86a3823a175875aa2aeb31a61a6799ef13bc Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 8 Aug 2024 03:22:04 +0200 Subject: [PATCH 07/12] feat: add YtEntity trait to YouTubeItem and MusicItem --- src/model/traits.rs | 116 +++++++++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 39 deletions(-) diff --git a/src/model/traits.rs b/src/model/traits.rs index 950de5d..30451a8 100644 --- a/src/model/traits.rs +++ b/src/model/traits.rs @@ -227,50 +227,16 @@ macro_rules! yt_entity_owner_music { } fn channel_name(&self) -> Option<&str> { - self.artists.first().map(|a| a.name.as_str()) + if self.by_va { + Some(crate::util::VARIOUS_ARTISTS) + } else { + self.artists.first().map(|a| a.name.as_str()) + } } } }; } -/* -impl YtEntity for VideoPlayer { - fn id(&self) -> &str { - &self.details.id - } - - fn name(&self) -> &str { - &self.details.name - } - - fn channel_id(&self) -> Option<&str> { - Some(&self.details.channel_id) - } - - fn channel_name(&self) -> Option<&str> { - self.details.channel_name.as_deref() - } -} - -impl YtEntity for VideoPlayerDetails { - fn id(&self) -> &str { - &self.channel_id - } - - fn name(&self) -> &str { - &self.name - } - - fn channel_id(&self) -> Option<&str> { - Some(&self.channel_id) - } - - fn channel_name(&self) -> Option<&str> { - self.channel_name.as_deref() - } -} -*/ - impl YtEntity for Channel { fn id(&self) -> &str { &self.id @@ -289,6 +255,78 @@ impl YtEntity for Channel { } } +impl YtEntity for YouTubeItem { + fn id(&self) -> &str { + match self { + YouTubeItem::Video(v) => &v.id, + YouTubeItem::Playlist(p) => &p.id, + YouTubeItem::Channel(c) => &c.id, + } + } + + fn name(&self) -> &str { + match self { + YouTubeItem::Video(v) => &v.name, + YouTubeItem::Playlist(p) => &p.name, + YouTubeItem::Channel(c) => &c.name, + } + } + + fn channel_id(&self) -> Option<&str> { + match self { + YouTubeItem::Video(v) => v.channel_id(), + YouTubeItem::Playlist(p) => p.channel_id(), + YouTubeItem::Channel(_) => None, + } + } + + fn channel_name(&self) -> Option<&str> { + match self { + YouTubeItem::Video(v) => v.channel_name(), + YouTubeItem::Playlist(p) => p.channel_name(), + YouTubeItem::Channel(_) => None, + } + } +} + +impl YtEntity for MusicItem { + fn id(&self) -> &str { + match self { + MusicItem::Track(t) => &t.id, + MusicItem::Album(b) => &b.id, + MusicItem::Artist(a) => &a.id, + MusicItem::Playlist(p) => &p.id, + } + } + + fn name(&self) -> &str { + match self { + MusicItem::Track(t) => &t.name, + MusicItem::Album(b) => &b.name, + MusicItem::Artist(a) => &a.name, + MusicItem::Playlist(p) => &p.name, + } + } + + fn channel_id(&self) -> Option<&str> { + match self { + MusicItem::Track(t) => t.channel_id(), + MusicItem::Album(b) => b.channel_id(), + MusicItem::Artist(_) => None, + MusicItem::Playlist(p) => p.channel_id(), + } + } + + fn channel_name(&self) -> Option<&str> { + match self { + MusicItem::Track(t) => t.channel_name(), + MusicItem::Album(b) => b.channel_name(), + MusicItem::Artist(_) => None, + MusicItem::Playlist(p) => p.channel_id(), + } + } +} + yt_entity_owner_opt! {Playlist} yt_entity! {ChannelId} yt_entity_owner! {VideoDetails} From 91b020efd498eff6e0f354a1de39439e252a79dd Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 8 Aug 2024 03:22:51 +0200 Subject: [PATCH 08/12] feat: add plaintext output to CLI --- cli/Cargo.toml | 2 + cli/README.md | 1 + cli/src/main.rs | 445 +++++++++++++++++++++++++++++++++++++----- downloader/src/lib.rs | 18 +- 4 files changed, 411 insertions(+), 55 deletions(-) create mode 100644 cli/README.md diff --git a/cli/Cargo.toml b/cli/Cargo.toml index a4cfc9d..c61060d 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -56,3 +56,5 @@ tracing.workspace = true tracing-subscriber.workspace = true serde_yaml.workspace = true dirs.workspace = true + +color-print = "0.3.6" diff --git a/cli/README.md b/cli/README.md new file mode 100644 index 0000000..e88277e --- /dev/null +++ b/cli/README.md @@ -0,0 +1 @@ +# RustyPipe CLI diff --git a/cli/src/main.rs b/cli/src/main.rs index 3fbd68c..4a4a7a8 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,11 +4,15 @@ use std::{path::PathBuf, str::FromStr, time::Duration}; use clap::{Parser, Subcommand, ValueEnum}; +use color_print::{cprint, cprintln}; use futures::stream::{self, StreamExt}; use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use rustypipe::{ client::{ClientType, RustyPipe}, - model::{UrlTarget, YouTubeItem}, + model::{ + richtext::ToPlaintext, traits::YtEntity, ArtistId, MusicSearchResult, TrackItem, UrlTarget, + YouTubeItem, + }, param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; use rustypipe_downloader::{ @@ -84,6 +88,9 @@ enum Commands { /// Video resolution (e.g. 720, 1080). Set to 0 for audio-only. #[clap(short, long)] resolution: Option, + /// Download only the audio track + #[clap(long)] + audio: bool, /// Number of videos downloaded in parallel #[clap(short, long, default_value_t = 8)] parallel: usize, @@ -93,8 +100,9 @@ enum Commands { /// Limit the number of videos to download #[clap(long, default_value_t = 1000)] limit: usize, + /// YT Client used to fetch player data #[clap(long)] - player_type: Option, + client_type: Option, }, /// Extract video, playlist, album or channel data Get { @@ -106,6 +114,9 @@ enum Commands { /// Pretty-print output #[clap(long)] pretty: bool, + /// Output as text + #[clap(long)] + txt: bool, /// Limit the number of items to fetch #[clap(long, default_value_t = 20)] limit: usize, @@ -118,14 +129,15 @@ enum Commands { /// Get comments #[clap(long)] comments: Option, - /// Get lyrics + /// Get lyrics for YTM tracks #[clap(long)] lyrics: bool, - /// Get the player + /// Get the player data instead of the video details #[clap(long)] player: bool, + /// YT Client used to fetch player data #[clap(long)] - player_type: Option, + client_type: Option, }, /// Search YouTube Search { @@ -137,6 +149,9 @@ enum Commands { /// Pretty-print output #[clap(long)] pretty: bool, + /// Output as text + #[clap(long)] + txt: bool, /// Limit the number of items to fetch #[clap(long, default_value_t = 20)] limit: usize, @@ -168,7 +183,7 @@ enum Format { Yaml, } -#[derive(Copy, Clone, ValueEnum)] +#[derive(Debug, Copy, Clone, ValueEnum)] enum ChannelTab { Videos, Shorts, @@ -312,15 +327,91 @@ fn print_data(data: &T, format: Format, pretty: bool) { }; } +fn print_entities(items: &[impl YtEntity]) { + for e in items { + cprint!("[{}] {}", e.id(), e.name()); + if let Some(n) = e.channel_name() { + cprint!(" - {}", n); + } + println!(); + } +} + +fn print_tracks(tracks: &[TrackItem]) { + for t in tracks { + if let Some(n) = t.track_nr { + cprint!("{n:02} "); + } + cprint!("[{}] {} - ", t.id, t.name); + print_artists(&t.artists); + print_duration(t.duration); + println!(); + } +} + +fn print_artists(artists: &[ArtistId]) { + for (i, a) in artists.iter().enumerate() { + if i > 0 { + print!(", "); + } + cprint!("{}", a.name); + if let Some(id) = &a.id { + print!(" [{id}]"); + } + } +} + +fn print_duration(duration: Option) { + if let Some(d) = duration { + print!(" "); + let hours = d / 3600; + let minutes = (d / 60) % 60; + let seconds = d % 60; + if hours > 0 { + cprint!("{hours:02}:"); + } + cprint!("{minutes:02}:{seconds:02}"); + } +} + +fn print_music_search( + data: &MusicSearchResult, + format: Format, + pretty: bool, + txt: bool, +) { + if txt { + if let Some(corr) = &data.corrected_query { + cprintln!("Did you mean `{}`?", corr); + } + print_entities(&data.items.items); + } else { + print_data(data, format, pretty) + } +} + +fn print_description(desc: Option) { + if let Some(desc) = desc { + if !desc.is_empty() { + print_h2("Description"); + cprintln!("{}", desc); + } + } +} + +fn print_h2(title: &str) { + cprintln!("\n{}:", title); +} + async fn download_video( dl: &Downloader, id: &str, target: &DownloadTarget, - player_type: Option, + client_type: Option, ) { let mut q = target.apply(dl.id(id)); - if let Some(player_type) = player_type { - q = q.player_type(player_type.into()); + if let Some(client_type) = client_type { + q = q.client_type(client_type.into()); } let res = q.download().await; if let Err(e) = res { @@ -333,7 +424,7 @@ async fn download_videos( videos: Vec, target: &DownloadTarget, parallel: usize, - player_type: Option, + client_type: Option, multi: MultiProgress, ) { // Indicatif setup @@ -356,8 +447,8 @@ async fn download_videos( let id = video.id().to_owned(); let mut q = target.apply(dl.video(video)); - if let Some(player_type) = player_type { - q = q.player_type(player_type.into()); + if let Some(client_type) = client_type { + q = q.client_type(client_type.into()); } async move { @@ -432,10 +523,11 @@ async fn main() { id, target, resolution, + audio, parallel, music, limit, - player_type, + client_type, } => { let url_target = rp.query().resolve_string(&id, false).await.unwrap(); @@ -447,18 +539,19 @@ async fn main() { filter = filter.video_max_res(res); } } - let dl = DownloaderBuilder::new() + let mut dl = DownloaderBuilder::new() .rustypipe(&rp) - .stream_filter(filter) .multi_progress(multi.clone()) - .audio_tag() - .crop_cover() - .path_precheck() - .build(); + .path_precheck(); + if audio { + dl = dl.audio_tag().crop_cover(); + filter = filter.no_video(); + } + let dl = dl.stream_filter(filter).build(); match url_target { UrlTarget::Video { id, .. } => { - download_video(&dl, &id, &target, player_type).await; + download_video(&dl, &id, &target, client_type).await; } UrlTarget::Channel { id } => { target.assert_dir(); @@ -475,7 +568,7 @@ async fn main() { .take(limit) .map(|v| DownloadVideo::from_entity(&v)) .collect(); - download_videos(&dl, videos, &target, parallel, player_type, multi).await; + download_videos(&dl, videos, &target, parallel, client_type, multi).await; } UrlTarget::Playlist { id } => { target.assert_dir(); @@ -508,7 +601,7 @@ async fn main() { .map(|v| DownloadVideo::from_entity(&v)) .collect() }; - download_videos(&dl, videos, &target, parallel, player_type, multi).await; + download_videos(&dl, videos, &target, parallel, client_type, multi).await; } UrlTarget::Album { id } => { target.assert_dir(); @@ -519,13 +612,14 @@ async fn main() { .take(limit) .map(|v| DownloadVideo::from_track(&v)) .collect(); - download_videos(&dl, videos, &target, parallel, player_type, multi).await; + download_videos(&dl, videos, &target, parallel, client_type, multi).await; } } } Commands::Get { id, format, + txt, pretty, limit, tab, @@ -533,7 +627,7 @@ async fn main() { comments, lyrics, player, - player_type, + client_type, } => { let target = rp.query().resolve_string(&id, false).await.unwrap(); @@ -544,16 +638,47 @@ async fn main() { match details.lyrics_id { Some(lyrics_id) => { let lyrics = rp.query().music_lyrics(lyrics_id).await.unwrap(); - print_data(&lyrics, format, pretty); + if txt { + println!("{}\n\n{}", lyrics.body, lyrics.footer); + } else { + print_data(&lyrics, format, pretty); + } } None => eprintln!("no lyrics found"), } } else if music { let details = rp.query().music_details(&id).await.unwrap(); - print_data(&details, format, pretty); + if txt { + if details.track.is_video { + println!("[MV]"); + } else { + println!("[Track]"); + } + print!("{} [{}]", details.track.name, details.track.id); + print_duration(details.track.duration); + println!(); + print_artists(&details.track.artists); + println!(); + if !details.track.is_video { + println!( + "Album: {}", + details + .track + .album + .as_ref() + .map(|b| b.id.as_str()) + .unwrap_or("None") + ) + } + if let Some(view_count) = details.track.view_count { + println!("Views: {view_count}"); + } + } else { + print_data(&details, format, pretty); + } } else if player { - let player = if let Some(player_type) = player_type { - rp.query().player_from_client(&id, player_type.into()).await + let player = if let Some(client_type) = client_type { + rp.query().player_from_client(&id, client_type.into()).await } else { rp.query().player(&id).await } @@ -580,13 +705,116 @@ async fn main() { None => {} } - print_data(&details, format, pretty); + if txt { + cprintln!( + "[Video]\n{} [{}]", + details.name, + details.id + ); + cprintln!( + "Channel: {} [{}]", + details.channel.name, + details.channel.id + ); + if let Some(subs) = details.channel.subscriber_count { + cprintln!("Subscribers: {}", subs); + } + if let Some(date) = details.publish_date { + cprintln!("Date: {}", date); + } + cprintln!("Views: {}", details.view_count); + if let Some(likes) = details.like_count { + cprintln!("Likes: {}", likes); + } + if let Some(comments) = details.top_comments.count { + cprintln!("Comments: {}", comments); + } + if details.is_ccommons { + cprintln!("Creative Commons"); + } + if details.is_live { + cprintln!("Livestream"); + } + print_description(Some(details.description.to_plaintext())); + if !details.recommended.is_empty() { + print_h2("Recommended"); + print_entities(&details.recommended.items); + } + let comment_list = comments.map(|c| match c { + CommentsOrder::Top => &details.top_comments.items, + CommentsOrder::Latest => &details.latest_comments.items, + }); + if let Some(comment_list) = comment_list { + print_h2("Comments"); + for c in comment_list { + if let Some(author) = &c.author { + cprint!("{} [{}]", author.name, author.id); + } else { + cprint!("Unknown author"); + } + if c.by_owner { + print!(" (Owner)"); + } + println!(); + println!("{}", c.text.to_plaintext()); + cprint!("Likes: {}", c.like_count.unwrap_or_default()); + if c.hearted { + cprint!(" "); + } + println!("\n"); + } + } + } else { + print_data(&details, format, pretty); + } } } UrlTarget::Channel { id } => { if music { let artist = rp.query().music_artist(&id, true).await.unwrap(); - print_data(&artist, format, pretty); + if txt { + cprintln!( + "[Artist]\n{} [{}]", + artist.name, + artist.id + ); + if let Some(subs) = artist.subscriber_count { + cprintln!("Subscribers: {subs}"); + } + if let Some(url) = artist.wikipedia_url { + cprintln!("Wikipedia: {url}"); + } + if let Some(id) = artist.tracks_playlist_id { + cprintln!("All tracks: {id}"); + } + if let Some(id) = artist.videos_playlist_id { + cprintln!("All videos: {id}"); + } + if let Some(id) = artist.radio_id { + cprintln!("Radio: {id}"); + } + print_description(artist.description); + if !artist.albums.is_empty() { + print_h2("Albums"); + for b in artist.albums { + cprint!("[{}] {} ({:?}", b.id, b.name, b.album_type); + if let Some(y) = b.year { + print!(", {y}"); + } + println!(")"); + } + } + if !artist.playlists.is_empty() { + print_h2("Playlists"); + print_entities(&artist.playlists); + } + if !artist.similar_artists.is_empty() { + print_h2("Similar artists"); + print_entities(&artist.similar_artists); + } + } else { + print_data(&artist, format, pretty); + } } else { match tab { ChannelTab::Videos | ChannelTab::Shorts | ChannelTab::Live => { @@ -604,15 +832,74 @@ async fn main() { .extend_limit(rp.query(), limit) .await .unwrap(); - print_data(&channel, format, pretty); + + if txt { + cprintln!( + "[Channel {:?}]\n{} [{}]", + tab, + channel.name, + channel.id + ); + print_description(Some(channel.description)); + if let Some(subs) = channel.subscriber_count { + cprintln!("Subscribers: {subs}"); + } + println!(); + print_entities(&channel.content.items); + } else { + print_data(&channel, format, pretty); + } } ChannelTab::Playlists => { let channel = rp.query().channel_playlists(&id).await.unwrap(); - print_data(&channel, format, pretty); + + if txt { + cprintln!( + "[Channel {:?}]\n{} [{}]", + tab, + channel.name, + channel.id + ); + print_description(Some(channel.description)); + if let Some(subs) = channel.subscriber_count { + cprintln!("Subscribers: {subs}"); + } + println!(); + print_entities(&channel.content.items); + } else { + print_data(&channel, format, pretty); + } } ChannelTab::Info => { - let channel = rp.query().channel_info(&id).await.unwrap(); - print_data(&channel, format, pretty); + let info = rp.query().channel_info(&id).await.unwrap(); + + if txt { + cprintln!( + "[Channel info]\nID:{}", + info.id + ); + print_description(Some(info.description)); + if let Some(subs) = info.subscriber_count { + cprintln!("Subscribers: {subs}"); + } + if let Some(vids) = info.video_count { + cprintln!("Videos: {vids}"); + } + if let Some(views) = info.view_count { + cprintln!("Views: {views}"); + } + if let Some(created) = info.create_date { + cprintln!("Created on: {created}"); + } + if !info.links.is_empty() { + print_h2("Links"); + for (name, url) in &info.links { + cprintln!("{name}: {url}"); + } + } + } else { + print_data(&info, format, pretty); + } } } } @@ -625,7 +912,26 @@ async fn main() { .extend_limit(rp.query(), limit) .await .unwrap(); - print_data(&playlist, format, pretty); + if txt { + cprintln!( + "[MusicPlaylist]\n{} [{}]\nTracks: {}", + playlist.name, + playlist.id, + playlist.track_count.unwrap_or_default(), + ); + if let Some(n) = playlist.channel_name() { + cprint!("Author: {n}"); + if let Some(id) = playlist.channel_id() { + print!(" [{id}]"); + } + println!(); + } + print_description(playlist.description.map(|d| d.to_plaintext())); + println!(); + print_tracks(&playlist.tracks.items); + } else { + print_data(&playlist, format, pretty); + } } else { let mut playlist = rp.query().playlist(&id).await.unwrap(); playlist @@ -633,12 +939,54 @@ async fn main() { .extend_limit(rp.query(), limit) .await .unwrap(); - print_data(&playlist, format, pretty); + if txt { + cprintln!( + "[Playlist]\n{} [{}]\nVideos: {}", + playlist.name, playlist.id, playlist.video_count, + ); + if let Some(n) = playlist.channel_name() { + cprint!("Author: {n}"); + if let Some(id) = playlist.channel_id() { + print!(" [{id}]"); + } + println!(); + } + if let Some(last_update) = playlist.last_update { + cprintln!("Last update: {last_update}"); + } + print_description(playlist.description.map(|d| d.to_plaintext())); + println!(); + print_entities(&playlist.videos.items); + } else { + print_data(&playlist, format, pretty); + } } } UrlTarget::Album { id } => { let album = rp.query().music_album(&id).await.unwrap(); - print_data(&album, format, pretty); + if txt { + cprint!( + "[Album]\n{} [{}] ({:?}", + album.name, + album.id, + album.album_type + ); + if let Some(year) = album.year { + print!(", {year}"); + } + println!(")"); + if let Some(n) = album.channel_name() { + cprint!("Artist: {}", n); + if let Some(id) = album.channel_id() { + print!(" [{id}]"); + } + } + print_description(album.description.map(|d| d.to_plaintext())); + println!(); + print_tracks(&album.tracks); + } else { + print_data(&album, format, pretty); + } } } } @@ -646,6 +994,7 @@ async fn main() { query, format, pretty, + txt, limit, item_type, length, @@ -672,32 +1021,40 @@ async fn main() { .await .unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); + + if txt { + if let Some(corr) = res.corrected_query { + cprintln!("Did you mean `{}`?", corr); + } + print_entities(&res.items.items); + } else { + print_data(&res, format, pretty); + } } }, Some(MusicSearchCategory::All) => { let res = rp.query().music_search_main(&query).await.unwrap(); - print_data(&res, format, pretty); + print_music_search(&res, format, pretty, txt); } Some(MusicSearchCategory::Tracks) => { let mut res = rp.query().music_search_tracks(&query).await.unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); + print_music_search(&res, format, pretty, txt); } Some(MusicSearchCategory::Videos) => { let mut res = rp.query().music_search_videos(&query).await.unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); + print_music_search(&res, format, pretty, txt); } Some(MusicSearchCategory::Artists) => { let mut res = rp.query().music_search_artists(&query).await.unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); + print_music_search(&res, format, pretty, txt); } Some(MusicSearchCategory::Albums) => { let mut res = rp.query().music_search_albums(&query).await.unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); + print_music_search(&res, format, pretty, txt); } Some(MusicSearchCategory::PlaylistsYtm | MusicSearchCategory::PlaylistsCommunity) => { let mut res = rp @@ -709,7 +1066,7 @@ async fn main() { .await .unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); + print_music_search(&res, format, pretty, txt); } }, Commands::Vdata => { diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 685f69d..40c2583 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -121,7 +121,7 @@ pub struct DownloadQuery { /// Target video format video_format: Option, /// ClientType type for fetching videos - player_type: Option, + client_type: Option, } /// Video to be downloaded @@ -163,11 +163,7 @@ impl DownloadVideo { id: track.id.to_owned(), name: Some(track.name.to_owned()), channel_id: track.channel_id().map(str::to_owned), - channel_name: if track.by_va { - Some("Various Artists".to_owned()) - } else { - track.channel_name().map(str::to_owned) - }, + channel_name: track.channel_name().map(str::to_owned), album_id: track.album.as_ref().map(|b| b.id.to_owned()), album_name: track.album.as_ref().map(|b| b.name.to_owned()), track_nr: track.track_nr, @@ -454,7 +450,7 @@ impl Downloader { progress: None, filter: None, video_format: None, - player_type: None, + client_type: None, } } @@ -589,8 +585,8 @@ impl DownloadQuery { /// Set the [`ClientType`] used to fetch the YT player #[must_use] - pub fn player_type(mut self, player_type: ClientType) -> Self { - self.player_type = Some(player_type); + pub fn client_type(mut self, client_type: ClientType) -> Self { + self.client_type = Some(client_type); self } @@ -684,8 +680,8 @@ impl DownloadQuery { } let q = self.dl.i.rp.query(); - let player_data = match self.player_type { - Some(player_type) => q.player_from_client(&self.video.id, player_type).await?, + let player_data = match self.client_type { + Some(client_type) => q.player_from_client(&self.video.id, client_type).await?, None => q.player(&self.video.id).await?, }; let user_agent = q.user_agent(player_data.client_type); From d053ac3eba810a7241df91f2f50bcbe1fd968c86 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 8 Aug 2024 14:56:39 +0200 Subject: [PATCH 09/12] fix: make Verification enum exhaustive --- src/model/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/model/mod.rs b/src/model/mod.rs index e54ab60..6ec4d2f 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -634,7 +634,6 @@ pub struct ChannelTag { #[derive( Default, Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash, )] -#[non_exhaustive] pub enum Verification { #[default] /// Unverified channel (default) From e8324cf3b065cb977adbc9529b1ef5ee18c3dd47 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 8 Aug 2024 15:04:15 +0200 Subject: [PATCH 10/12] fix: use anstream + owo-color for colorful CLI output the color-print crate works very well, but it cannot disable styling if the terminal does not support it, when saving the output to a file, etc --- cli/Cargo.toml | 3 +- cli/src/main.rs | 169 ++++++++++++++++++++++++++++-------------------- 2 files changed, 102 insertions(+), 70 deletions(-) diff --git a/cli/Cargo.toml b/cli/Cargo.toml index c61060d..e07a928 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -57,4 +57,5 @@ tracing-subscriber.workspace = true serde_yaml.workspace = true dirs.workspace = true -color-print = "0.3.6" +anstream = "0.6.15" +owo-colors = "4.0.0" diff --git a/cli/src/main.rs b/cli/src/main.rs index 4a4a7a8..6a954a9 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,14 +4,14 @@ use std::{path::PathBuf, str::FromStr, time::Duration}; use clap::{Parser, Subcommand, ValueEnum}; -use color_print::{cprint, cprintln}; use futures::stream::{self, StreamExt}; use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; +use owo_colors::OwoColorize; use rustypipe::{ client::{ClientType, RustyPipe}, model::{ richtext::ToPlaintext, traits::YtEntity, ArtistId, MusicSearchResult, TrackItem, UrlTarget, - YouTubeItem, + Verification, YouTubeItem, }, param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; @@ -329,9 +329,9 @@ fn print_data(data: &T, format: Format, pretty: bool) { fn print_entities(items: &[impl YtEntity]) { for e in items { - cprint!("[{}] {}", e.id(), e.name()); + anstream::print!("[{}] {}", e.id(), e.name().bold()); if let Some(n) = e.channel_name() { - cprint!(" - {}", n); + anstream::print!(" - {}", n.cyan()); } println!(); } @@ -340,9 +340,9 @@ fn print_entities(items: &[impl YtEntity]) { fn print_tracks(tracks: &[TrackItem]) { for t in tracks { if let Some(n) = t.track_nr { - cprint!("{n:02} "); + anstream::print!("{} ", format!("{n:02}").yellow().bold()); } - cprint!("[{}] {} - ", t.id, t.name); + anstream::print!("[{}] {} - ", t.id, t.name.bold()); print_artists(&t.artists); print_duration(t.duration); println!(); @@ -354,7 +354,7 @@ fn print_artists(artists: &[ArtistId]) { if i > 0 { print!(", "); } - cprint!("{}", a.name); + anstream::print!("{}", a.name.cyan()); if let Some(id) = &a.id { print!(" [{id}]"); } @@ -368,9 +368,9 @@ fn print_duration(duration: Option) { let minutes = (d / 60) % 60; let seconds = d % 60; if hours > 0 { - cprint!("{hours:02}:"); + anstream::print!("{}", format!("{hours:02}:").yellow()); } - cprint!("{minutes:02}:{seconds:02}"); + anstream::print!("{}", format!("{minutes:02}:{seconds:02}").yellow()); } } @@ -382,7 +382,7 @@ fn print_music_search( ) { if txt { if let Some(corr) = &data.corrected_query { - cprintln!("Did you mean `{}`?", corr); + anstream::println!("Did you mean `{}`?", corr.magenta()); } print_entities(&data.items.items); } else { @@ -394,13 +394,21 @@ fn print_description(desc: Option) { if let Some(desc) = desc { if !desc.is_empty() { print_h2("Description"); - cprintln!("{}", desc); + println!("{}", desc); } } } fn print_h2(title: &str) { - cprintln!("\n{}:", title); + anstream::println!("\n{}", format!("{title}:").green().underline()); +} + +fn print_verification(verification: Verification) { + match verification { + Verification::None => {} + Verification::Verified => print!(" ✓"), + Verification::Artist => print!(" ♪"), + } } async fn download_video( @@ -706,34 +714,36 @@ async fn main() { } if txt { - cprintln!( - "[Video]\n{} [{}]", - details.name, + anstream::println!( + "{}\n{} [{}]", + "[Video]".on_green().black(), + details.name.green().bold(), details.id ); - cprintln!( - "Channel: {} [{}]", + anstream::println!( + "{} {} [{}]", + "Channel:".blue(), details.channel.name, details.channel.id ); if let Some(subs) = details.channel.subscriber_count { - cprintln!("Subscribers: {}", subs); + anstream::println!("{} {}", "Subscribers:".blue(), subs); } if let Some(date) = details.publish_date { - cprintln!("Date: {}", date); + anstream::println!("{} {}", "Date:".blue(), date); } - cprintln!("Views: {}", details.view_count); + anstream::println!("{} {}", "Views:".blue(), details.view_count); if let Some(likes) = details.like_count { - cprintln!("Likes: {}", likes); + anstream::println!("{} {}", "Likes:".blue(), likes); } if let Some(comments) = details.top_comments.count { - cprintln!("Comments: {}", comments); + anstream::println!("{} {}", "Comments:".blue(), comments); } if details.is_ccommons { - cprintln!("Creative Commons"); + anstream::println!("{}", "Creative Commons".green()); } if details.is_live { - cprintln!("Livestream"); + anstream::println!("{}", "Livestream".red()); } print_description(Some(details.description.to_plaintext())); if !details.recommended.is_empty() { @@ -748,18 +758,23 @@ async fn main() { print_h2("Comments"); for c in comment_list { if let Some(author) = &c.author { - cprint!("{} [{}]", author.name, author.id); + anstream::print!("{} [{}]", author.name.cyan(), author.id); + print_verification(author.verification); } else { - cprint!("Unknown author"); + anstream::print!("{}", "Unknown author".magenta()); } if c.by_owner { print!(" (Owner)"); } println!(); println!("{}", c.text.to_plaintext()); - cprint!("Likes: {}", c.like_count.unwrap_or_default()); + anstream::print!( + "{} {}", + "Likes:".blue(), + c.like_count.unwrap_or_default() + ); if c.hearted { - cprint!(" "); + anstream::print!(" {}", "♥".red()); } println!("\n"); } @@ -773,31 +788,37 @@ async fn main() { if music { let artist = rp.query().music_artist(&id, true).await.unwrap(); if txt { - cprintln!( - "[Artist]\n{} [{}]", - artist.name, + anstream::println!( + "{}\n{} [{}]", + "[Artist]".on_green().black(), + artist.name.green().bold(), artist.id ); if let Some(subs) = artist.subscriber_count { - cprintln!("Subscribers: {subs}"); + anstream::println!("{} {}", "Subscribers:".blue(), subs); } if let Some(url) = artist.wikipedia_url { - cprintln!("Wikipedia: {url}"); + anstream::println!("{} {}", "Wikipedia:".blue(), url); } if let Some(id) = artist.tracks_playlist_id { - cprintln!("All tracks: {id}"); + anstream::println!("{} {}", "All tracks:".blue(), id); } if let Some(id) = artist.videos_playlist_id { - cprintln!("All videos: {id}"); + anstream::println!("{} {}", "All videos:".blue(), id); } if let Some(id) = artist.radio_id { - cprintln!("Radio: {id}"); + anstream::println!("{} {}", "Radio:".blue(), id); } print_description(artist.description); if !artist.albums.is_empty() { print_h2("Albums"); for b in artist.albums { - cprint!("[{}] {} ({:?}", b.id, b.name, b.album_type); + anstream::print!( + "[{}] {} ({:?}", + b.id, + b.name.bold(), + b.album_type + ); if let Some(y) = b.year { print!(", {y}"); } @@ -834,16 +855,18 @@ async fn main() { .unwrap(); if txt { - cprintln!( - "[Channel {:?}]\n{} [{}]", - tab, - channel.name, + anstream::print!( + "{}\n{} [{}]", + format!("[Channel {tab:?}]").on_green().black(), + channel.name.green().bold(), channel.id ); - print_description(Some(channel.description)); + print_verification(channel.verification); + println!(); if let Some(subs) = channel.subscriber_count { - cprintln!("Subscribers: {subs}"); + anstream::println!("{} {}", "Subscribers:".blue(), subs); } + print_description(Some(channel.description)); println!(); print_entities(&channel.content.items); } else { @@ -854,15 +877,15 @@ async fn main() { let channel = rp.query().channel_playlists(&id).await.unwrap(); if txt { - cprintln!( - "[Channel {:?}]\n{} [{}]", - tab, - channel.name, + anstream::println!( + "{}\n{} [{}]", + format!("[Channel {tab:?}]").on_green().black(), + channel.name.green().bold(), channel.id ); print_description(Some(channel.description)); if let Some(subs) = channel.subscriber_count { - cprintln!("Subscribers: {subs}"); + anstream::println!("{} {}", "Subscribers:".blue(), subs); } println!(); print_entities(&channel.content.items); @@ -874,27 +897,28 @@ async fn main() { let info = rp.query().channel_info(&id).await.unwrap(); if txt { - cprintln!( - "[Channel info]\nID:{}", + anstream::println!( + "{}\nID:{}", + "[Channel info]".on_green().black(), info.id ); print_description(Some(info.description)); if let Some(subs) = info.subscriber_count { - cprintln!("Subscribers: {subs}"); + anstream::println!("{} {}", "Subscribers:".blue(), subs); } if let Some(vids) = info.video_count { - cprintln!("Videos: {vids}"); + anstream::println!("{} {}", "Videos:".blue(), vids); } if let Some(views) = info.view_count { - cprintln!("Views: {views}"); + anstream::println!("{} {}", "Views:".blue(), views); } if let Some(created) = info.create_date { - cprintln!("Created on: {created}"); + anstream::println!("{} {}", "Created on:".blue(), created); } if !info.links.is_empty() { print_h2("Links"); for (name, url) in &info.links { - cprintln!("{name}: {url}"); + anstream::println!("{} {}", name.blue(), url); } } } else { @@ -913,14 +937,16 @@ async fn main() { .await .unwrap(); if txt { - cprintln!( - "[MusicPlaylist]\n{} [{}]\nTracks: {}", - playlist.name, + anstream::println!( + "{}\n{} [{}]\n{} {}", + "[MusicPlaylist]".on_green().black(), + playlist.name.green().bold(), playlist.id, + "Tracks:".blue(), playlist.track_count.unwrap_or_default(), ); if let Some(n) = playlist.channel_name() { - cprint!("Author: {n}"); + anstream::print!("{} {}", "Author:".blue(), n.bold()); if let Some(id) = playlist.channel_id() { print!(" [{id}]"); } @@ -940,19 +966,23 @@ async fn main() { .await .unwrap(); if txt { - cprintln!( - "[Playlist]\n{} [{}]\nVideos: {}", - playlist.name, playlist.id, playlist.video_count, + anstream::println!( + "{}\n{} [{}]\n{} {}", + "[Playlist]".on_green().black(), + playlist.name.green().bold(), + playlist.id, + "Videos:".blue(), + playlist.video_count, ); if let Some(n) = playlist.channel_name() { - cprint!("Author: {n}"); + anstream::print!("{} {}", "Author:".blue(), n.bold()); if let Some(id) = playlist.channel_id() { print!(" [{id}]"); } println!(); } if let Some(last_update) = playlist.last_update { - cprintln!("Last update: {last_update}"); + anstream::println!("{} {}", "Last update:".blue(), last_update); } print_description(playlist.description.map(|d| d.to_plaintext())); println!(); @@ -965,9 +995,10 @@ async fn main() { UrlTarget::Album { id } => { let album = rp.query().music_album(&id).await.unwrap(); if txt { - cprint!( - "[Album]\n{} [{}] ({:?}", - album.name, + anstream::print!( + "{}\n{} [{}] ({:?}", + "[Album]".on_green().black(), + album.name.green().bold(), album.id, album.album_type ); @@ -976,7 +1007,7 @@ async fn main() { } println!(")"); if let Some(n) = album.channel_name() { - cprint!("Artist: {}", n); + anstream::print!("{} {}", "Artist:".blue(), n); if let Some(id) = album.channel_id() { print!(" [{id}]"); } @@ -1024,7 +1055,7 @@ async fn main() { if txt { if let Some(corr) = res.corrected_query { - cprintln!("Did you mean `{}`?", corr); + anstream::println!("Did you mean `{}`?", corr.magenta()); } print_entities(&res.items.items); } else { From d36ba595dab0bbaef1012ebfa8930fc0e6bf8167 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 8 Aug 2024 15:10:55 +0200 Subject: [PATCH 11/12] fix: extraction error message --- src/deobfuscate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index 6f21adf..cbcaf50 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -272,7 +272,7 @@ fn get_nsig_fn(player_js: &str) -> Result { util::find_map_or_last_err( get_nsig_fn_names(player_js), - DeobfError::Extraction("no nsig fn name found"), + DeobfError::Extraction("nsig function name"), |name| { extract_fn(&name).map_err(|e| { tracing::warn!("Failed to extract nsig fn `{name}`: {e}"); From d5133247aa2cc430fdfb23b72146c453e96d48fa Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 4 Aug 2024 22:01:07 +0000 Subject: [PATCH 12/12] chore(deps): update rust crate rstest to 0.22.0 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 220e5da..9c05861 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ dirs = "5.0.0" filenamify = "0.1.0" # Testing -rstest = "0.21.0" +rstest = "0.22.0" tokio-test = "0.4.2" insta = { version = "1.17.1", features = ["ron", "redactions"] } path_macro = "1.0.0"