RDK-61583: AAMP Federated 2606 release#1505
Merged
Merged
Conversation
Reason for change: Deadlock chain -
1. SetRateInternal() holds StreamLock and then waits for the GStreamer lock inside gst_omx_video_dec_sink_event().
2. The decoder first-frame callback holds the GStreamer lock and then calls PrivateInstanceAAMP::IsAtLivePoint(), which waits for StreamLock.
This creates a circular wait
Removing the streamlock from PrivateInstanceAAMP::IsAtLivePoint() breaks this circular dependency.
Test Procedure: updated in ticket
Risks: Low
Signed-off-by: Anurag Krishnan <akrish513@cable.comcast.com>
Reason for change: Update the default configurations for LLD as part of LLD and ABR hardening changes. Migrate latency to float to get millisecond precision. Enable AAMP underflow monitor by default and set 0.2s as the underflow threshold. Test Procedure: Sanity testing LLD playback Risks: Medium Signed-off-by: Vinish100 <vinish.balan@gmail.com>
This reverts commit d3ef507.
Reason for change: Reapply configuration updates - Update the default configurations for LLD as part of LLD and ABR hardening changes. Migrate latency to float to get millisecond precision. Test Procedure: Sanity testing LLD playback Risks: Medium Signed-off-by: Vinish100 <vinish.balan@gmail.com>
#1246) * VPLAY-12062 framework allowing l3 tests involving JavaScript and UVE-JS control of AAMP to be run on OSX (and/or Ubuntu) Reason for change: To allow L3 tests running on Mac Risks: Low Priority: P1 Signed-off-by: Rajat <emailofrajatyadav@gmail.com> * expanded Javascript functions implementation added to UVEBinding.cpp --------- Signed-off-by: Rajat <emailofrajatyadav@gmail.com>
…nts (#1264) Reason for change: SendBufferChangeEvent bufferingStop bool is changed to bufferingStart Test Procedure: No regression with buffering reporting Risks: Medium Signed-off-by: varshnie <varshniblue14@gmail.com> Co-authored-by: Vinish K B <vinish.balan@gmail.com>
Reason for change: Use init config underflowDetectThresholdSec to determine if its a true buffer underflow or false alarm when an underflow signal is received from sink Test Procedure: Delay manifest download to cause a buffer underflow and ensure buffering is started Risks: Low Signed-off-by: Vinish100 <vinish.balan@gmail.com>
…hile performing Trick Play/Seek (#1265) Reason for change: Progress Bar Point jumping to the End/beginning While performing Trick Play/Seek in Linear channels. In the problematic scenario, aamp is getting a wrong position from rialto. So modifying aamp to perform seek even when the seek position is 0. Test Procedure: Refer JIRA ticket Risks: low
Reason for change: Added L1 tests for possible scenarios for validating Early return functionality Test Procedure: L1 should pass Risks: Low Signed-off-by: lashminthaj <lashminthaj17@gmail.com>
…intermittent (#1200) * VPLAY-13060 ABR rejecting outliers for bandwidth calcualtion L2 2034 intermittent Reason for Change: updates AAMP’s Rolling Median Outlier (RMO) bandwidth estimator to avoid rejecting both samples during initial tune when only two bandwidth samples exist and they differ significantly, which could lead to “bandwidth unavailable” despite having usable data. - Adjust RMO outlier rejection logic to only reject samples above the median when exactly 2 samples are present. - Add a unit test covering the 2-sample “reject only higher outlier” scenario. - Minor test clarification comment update (annotating the rejected sample). Test Guidance: L2 2034 passing more reliably Risk: Low --------- Co-authored-by: Patrick Conduit <pconduit@synamedia.com>
#1273) Reason for Change: Adds reusable GitHub Copilot prompt files to support two common engineering workflows in this AAMP repo: (1) evidence-based defect localization from run logs and (2) consistent cyclomatic complexity measurement of functions/methods. Changes: Adds an AAMP log analysis prompt that enforces a timeline-first, evidence-based debugging approach. Adds a cyclomatic complexity measurement prompt with explicit McCabe counting rules and a required reporting format. Updates Copilot repository instructions to reference the new AAMP log debugging prompt. * Create Copilot prompts for debug & complexity analysis * Update instructions to reference cyclomatic complexity prompt * Added reference to AAMP_BUILD_INFO for debug use Risk: Low-impacts copilot quality only, not current code functionality
* VPAAMP-48 EWMA algorithm (new default) over RMO Reason for Change: flip network bandwith estimation algorithm to modern EWMA for testing in sprint Test Guidance: monitor for any improvement or regression with ABR behavior Risk: Medium - this has been dev tested, and believed to give better results --------- Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com>
Reason for change: Change aamp ABR code to log less often (only on changes) Test Procedure: See ticket Risks: low Signed-off-by: James Lofthouse <james_lofthouse@comcast.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
…#1281) Reason for Change: give developers feedback for prompts that are vague or lack context, with aim to help them improve and create more precise useful prompts. Add measurement of prompt quality for completeness, assumptions and clarity. Display the score and suggest improvements at the end of the prompt if the score is below threshold. Test Guidance: no impact on core AAMP - developers should see additional feedback while interacting with copilot. Risk: None
* VPAAMP-47 Add AAMP config to include the filename in log lines Reason for Change: Help filter logs and identify methods in the log. Summary of Changes: - Add new config logFilename, set to false by default - Add the filename to every log line if logFilename is true - Update the prototype of logprintf to include the filename Test Procedure: Enable logFilename and confirm logs Priority: P2 Risks: Low
…not resume at the correct segment. (#1172) VPAAMP-67 AAMP SkipFragments() not locating correct position with 30Sec manifest TSB Reason for Change: Fixes DASH (MPD) seek/skip alignment in StreamAbstractionAAMP_MPD::SkipFragments() for cases where presentationTimeOffset (PTO) and the SegmentTimeline’s start time diverge (e.g., after TSB culling), so resume/seek lands on the intended base-period segment. - Add handling for pto <= startTime when aligning skipTime against SegmentTimeline start time. - Add diagnostic logging for computed PTO/startTime offset. - Change an EOS log from INFO to WARN. Test Guidance: refer ticket Risk: Low --------- Co-authored-by: Patrick Conduit <pconduit@synamedia.com>
Reason for change: Fix ad break fragment scheduling for live stream if split period ad is placed and in progress. Risks: Low Test Procedure: Test with Early return stream Priority: P1 Signed-off-by: Nandakishor U M <nu641001@gmail.com>
* VPLAY-13176 underflow detection refactoring Reason for Change: Refactors video underflow detection to a timer/deadline-driven monitor, removing steady-state polling and introducing explicit notifications from fragment download and buffering transitions to improve consistency across devices/simulators. Changes: Replace polling-based underflow detection with a deadline-based AampUnderflowMonitor that arms/disarms on fragment and buffering notifications. Wire underflow-monitor notifications into fragment download/chunk caching and buffering state transitions. Update unit-test fakes to match the new monitor API and stream-abstraction notification surface. Test Guidance: 6002 L2 test and general regression Risk: High Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com> --------- Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com>
…#1279) * VPLAY-13258 Add aamp config to dump network CSV data (AAMP_NET_TRACE) Reason for change: To add run time aamp config to enable AAMP net traces csv dumps Risks: Low Priority: P1 Signed-off-by: Rajat <emailofrajatyadav@gmail.com> * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Signed-off-by: Rajat <emailofrajatyadav@gmail.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Reason for change: On processing a gst HDCP error, flush with teardown is called without
stopping stream injection leading to an abort
Test Procedure: See ticket
Risks: low
Signed-off-by: James Lofthouse <james_lofthouse@comcast.com>
* VPLAY-12908 - Code improvement in TsbReader Reason for change: - A follow up change to VPLAY-11126. Some edge cases are addressed here. Test Procedure: - Refer to Ticket Risks: low --------- Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com>
VPLAY-12242: create l1 or l2 tests reflecting app expectations related to player state changes Reason for Change: make it easier (via l1 tests) to detect changes that risk breaking current app assumptions about player state changes, to avoid regressions. Some of these were previously caught only in l3 tests. Test Guidance: l1 tests passing Risk: Low (test only changes) --------- Signed-off-by: psiva01 <sivasubramanian.patchaiperumal@ltts.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* VPLAY-13143 frequent stuttering while playing clear multi-codec test stream Reason for Change: test hevc/ave filtering with multi-codec streams Test Guidance: see ticket - includes a test stream that sufferes gstreamer pipeline errors without this. new l1/l2 tests added Risk: Medium --------- Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com>
* VPAAMP-76 default-enable eAAMPConfig_EnableAampUnderflowMonitor Reason for Change: This PR default-enables the new AampUnderflowMonitor subsystem and adds additional notifications/guards to reduce false underflow detection during trickplay rate changes and pipeline discontinuity flush sequences. Changes: Default-enable eAAMPConfig_EnableAampUnderflowMonitor in config defaults. Add an explicit rate-change notification path from SetRateInternal() into the underflow monitor. Add a “false alarm” guard in the underflow monitor run loop and disarm logic during codec-change discontinuity flushing. Other changes to avoid test regressions: aampgstplayer.cpp — codec-change flush disarm; Fixes: AAMP-AUDIO-13006 ×2 In AAMPGstPlayer::Discontinuity(), after StopBuffering(true) in the shouldHaltBuffering branch (codec change + PTS-restamp path), NotifyPipelinePausedToUnderflowMonitor() is now called. This disarms the monitor's deadline during the GstPlayer_SignalEOS → flush → GST_MESSAGE_EOS sequence. Without it, the monitor fired during the injection gap, paused the pipeline, and AAMP_EVENT_STATE_CHANGED: COMPLETE never appeared. AampUnderflowMonitor.h/.cpp — NotifyRateChange(float rate); Fixes: AAMP-TSB-5016, AAMP-CDAI-8003[4] New method that updates mCurrentPlayRate under the mutex and, if the new rate is trickplay (non-normal, non-pause, non-slo-mo), disarms the current deadline immediately. This closes the race window between aamp->rate = <trickplay> being set and the first trickplay fragment arriving via NotifyVideoFragment — during that gap, the old normal-play deadline could fire with mCurrentPlayRate still at 1.0, making isTrickplay = false and falsely declaring underflow. StreamAbstractionAAMP.h + streamabstraction.cpp — forwarding method NotifyRateChangeToUnderflowMonitor(float rate) follows the same pattern as the existing NotifyPipelinePausedToUnderflowMonitor(), operating under mUnderflowMonitorMutex. main_aamp.cpp — call site Immediately after aamp->rate = rate in the trickplay aamp_SetRate path, NotifyRateChangeToUnderflowMonitor(rate) is called before TuneHelper triggers new downloads. Risk: Medium Test Guidance: no impact on l1/l2 tests and no regressions in this area --------- Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com>
) * Revert "Revert "VPAAMP-48 EWMA algorithm (new default) over RMO (#1283)" (#1288)" Reason for Change: 0=ROLLING_MEDIAN_OUTLIER, 1=HARMONIC_EWMA (new default) - support for ResetCurrentlyAvailableBandwidth which exists to prevent the ABR manager from immediately re-switching profiles the moment it evaluates bandwidth again after a forced profile change. When a ramp-down is triggered by a download failure or buffer exhaustion, the player has already committed to a new (lower) profile — if the estimator still reports the pre-failure throughput, getProfileIndexByBitrateRampUpOrDown would see network bandwidth well above the new profile's bitrate and attempt to ramp back up on the very next evaluation cycle, causing a flip-flop. - new l1 test for same --------- Signed-off-by: Philip Stroffolino <philip_stroffolino@cable.comcast.com>
Reason for change: avoid logging bogus negative decode time value for failed tune s Test Procedure: See ticket Risks: low Signed-off-by: James Lofthouse <james_lofthouse@comcast.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
Reason for change: To add Ubuntu support to L3 tests Risks: Low Priority: P1 Signed-off-by: Rajat Yadav <ryadav819@cable.comcast.com> Co-authored-by: Rajat Yadav <ryadav819@cable.comcast.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
…1442) * VPAAMP-245: Negative Latency value logged while HLS linear playback w/o TSB Test Guidance: refer ticket Risk: Low Reason for change: EndPos is set to -1 for TSB-less playback before latency calculation. This caused latency to be negative, since HLS latency is calculated as EndPos - CurrPos. So, moved this tsbless block after latency calculation. Also, fixed start and end values in aamp pos logging. * Rename format_pos lambda to formatPos and val parameter to valMs for camelCase consistency * Add regression test for VPAAMP-245: TSB-less linear HLS latency non-negative Replace (valMs == -1.0) with (valMs < 0) in formatPos lambda: direct floating-point equality against a sentinel is fragile, and culledSeconds can legitimately go negative via the HLS PDT path in UpdateCullingState (negative culledSec values are explicitly allowed there), so < 0 is both safer and more correct. Remove redundant explicit casts in AAMPLOG_MIL call: (double) casts on videoBufferedDuration, audioBufferedDuration, and latency/1000.0 are unnecessary (division by a double literal already produces double), and the (long long) cast on videoPTS is redundant as it is already long long. --------- Signed-off-by: psiva01 <sivasubramanian.patchaiperumal@ltts.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: psiva01 <214551386+psiva01@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
……" (#1496)" (#1497) Reason for Change: Updates PrivateInstanceAAMP::MonitorProgress() to prevent negative live-latency values during TSB-less linear HLS playback by deferring the start/end = -1 (XRE sentinel) assignment until after HLS latency is computed, and adds a unit regression test to guard against recurrence. Changes: Move the TSB-less linear start/end = -1 override to after live latency calculation in MonitorProgress(). Add a regression unit test validating GetCurrentLatencyMs() is never negative for TSB-less linear HLS playback.
Reason for Change: Fixes subtitle rendering regressions after SSAI ad breaks for HLS/TS when eAAMPConfig_HlsTsEnablePTSReStamp is enabled by correcting how WebVTT timing is restamped and by resetting TS demuxer rollover state across discontinuities. Fix RestampSubtitle LOCAL parsing for non-standard CDN VTT format Some HLS CDN WebVTT segments place MPEGTS on a pseudo-cue settings line rather than in the X-TIMESTAMP-MAP header: WEBVTT X-TIMESTAMP-MAP=LOCAL:00:00:00.000 00:00:00.000 --> 00:00:00.420 ...,MPEGTS:3944266080 00:00:00.000 --> ... (real cue with text) The previous code used strchr(localPtr, ',') which searched past the line-ending newline, finding the comma inside the pseudo-cue settings. This caused localStr to absorb the pseudo-cue timing line (with an embedded newline), placing MPEGTS at the end of a cue settings line in the output instead of in the X-TIMESTAMP-MAP header: AFTER: X-TIMESTAMP-MAP=LOCAL:00:00:00.000,MPEGTS:160347600 The fix: limit the comma search to the current line by also checking for a preceding newline. If the comma comes after a newline (or there is no comma on the LOCAL line), extract LOCAL up to the newline only. MPEGTS is still found correctly via extractFieldPtr which scans the full headerView (including the pseudo-cue content). Fix RestampSubtitle test build: move to protected, expose via using Use explicit wrapper in TestableMediaTrack for RestampSubtitle - fragmentcollector_hls.cpp: fix misleading comment at SetSubtitlePtsOffset call site; ptsOffsetSecs is passed in seconds and the callee handles the unit conversion (ns for Rialto, ms for other sinks) - tsprocessor.cpp: remove commented-out per-packet AAMPLOG_TRACE; dead code in a hot loop with no runtime path to re-enable it Test Guidance: refer ticket Risk: Medium --------- Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
…el Change Reason for change: Added retry logic to AAMP downloads when curl returns error 55 (CURL_SEND_ERROR) Risks: Low Test Procedure: Refer jira ticket Priority: P0 Signed-off-by: Gnanesha <gnaani82@gmail.com>
…ed_2606 RDKEMW-19029: Observed Video Freeze & Fast-Forward Effect After Chann…
| { | ||
| AAMPLOG_INFO("[video] underflow ended. buffered=%.3f (>= resume threshold %.3f)", | ||
| bufferSec, resumeThreshold); | ||
| mAamp->SetBufferingState(false); |
| this->aamp = aamp; | ||
| // Initially set to this instance, can be changed by SetEncryptedAamp | ||
| this->mEncryptedAamp = aamp; | ||
| this->mEncryptedAampId = (aamp ? aamp->mPlayerId : -1); |
| const long long tActualCurlMs = NOW_STEADY_TS_MS - mDownloadStartTime; | ||
| const double predictedTransferMs = | ||
| AampNetworkPersona::Instance().SampleTransferMs( | ||
| mDownloadResponse ? mDownloadResponse->mDownloadData.size() : 0); |
| mCdaiObject->mCurAdIdx >= static_cast<int>(mCdaiObject->mCurAds->size()) || | ||
| mCdaiObject->mCurPlayingBreakId.empty()) | ||
| { | ||
| return -1.0; |
| double resid = x[i + 1] - (result.c + result.rho * x[i]); | ||
| sumResidSq += resid * resid; | ||
| } | ||
| result.sigmaEps = (m > 1) ? std::sqrt(sumResidSq / static_cast<double>(m - 1)) : 0.0; |
| * @brief Return encrypted player id | ||
| * @return ID of encrypted player else -1 | ||
| */ | ||
| const int GetEncryptedAampId(void) const; |
| mPeriodEndTime = savedPeriodEndTime; | ||
| mNumberOfTracks = savedNumberOfTracks; | ||
| mUpdateStreamInfo = savedUpdateStreamInfo; | ||
| mABRMode = savedABRMode; |
|
|
||
| if (reusedTtfbMs.size() >= 5 && freshTtfbMs.size() >= 3) | ||
| { | ||
| persona.newConnPenaltyMs = std::max(0.0, Median(freshTtfbMs) - Median(reusedTtfbMs)); |
| } | ||
| if (!counts.empty()) | ||
| { | ||
| persona.burstsPerSegment = static_cast<int>(std::round(Median(counts))); |
| } | ||
| if (!cvSeries.empty()) | ||
| { | ||
| persona.burstBytesCv = Median(cvSeries); |
…1564) Reason for change: underflow is now suppressed at VOD EOS boundary so the monitor does not post an underflow anomaly while EOS completion is in flight. --------- Signed-off-by: psiva01 <sivasubramanian.patchaiperumal@ltts.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
… with "Please wait until the program is loaded" error (#1582) * VPAAMP-529: Stop underflow monitor at VOD injection EOS instead of EOS boundary heuristic Replace the position-based EOS boundary guard (eosEndToleranceSec config) with a clean lifecycle fix: call StopUnderflowMonitor() from MediaTrack::InjectFragment() immediately after the last VOD video fragment's EOS sentinel is signalled to the pipeline. At that point no further fragment arrivals are possible, so underflow detection is meaningless and the monitor thread can be safely terminated before the GStreamer EOS bubble drains and eSTATE_COMPLETE is reached. Changes: - streamabstraction.cpp: call pContext->StopUnderflowMonitor() in the VOD video EOS path of InjectFragment(), after EndOfStreamReached() is called. - AampUnderflowMonitor.cpp: remove EOS boundary guard block (IsLive / duration / eosEndToleranceSec check). - AampConfig.h: remove eAAMPConfig_UnderflowEosEndToleranceSec enum entry. - AampConfig.cpp: remove underflowEosEndToleranceSec config table entry. - AampDefine.h: remove DEFAULT_UNDERFLOW_EOS_END_TOLERANCE_SEC constant. The eSTATE_COMPLETE exit guard added in VPAAMP-529 is retained as a safety net. * VPAAMP-529: Add L1 regression tests for VOD EOS StopUnderflowMonitor Two new tests in TrackInjectTests verify the VPAAMP-529-improved fix: - InjectFragment_VodEos_StopsUnderflowMonitor: asserts that StopUnderflowMonitor() is called exactly once when the video track's EOS sentinel is injected on a VOD stream (IsLive=false). - InjectFragment_LiveEos_DoesNotStopUnderflowMonitor: asserts that StopUnderflowMonitor() is NOT called when the same EOS sentinel path fires on a live stream, protecting that code path from regression. Supporting changes: - StreamAbstractionAAMP.h: make StopUnderflowMonitor() virtual so MockStreamAbstractionAAMP can intercept it via virtual dispatch. - MockStreamAbstractionAAMP.h: add MOCK_METHOD for StopUnderflowMonitor with override specifier. - TrackInjectTests.cpp: define g_mockStreamAbstractionAAMP locally to prevent FakeStreamAbstractionAamp.cpp.o from being loaded from libfakes.a, which would otherwise introduce 120 pre-existing duplicate symbols with the directly-compiled streamabstraction.cpp. * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * VPAAMP-529: Add StopUnderflowMonitor EXPECT_CALL to PreferredLanguages L1 tests --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Revert "VPLAY-12744:Handle static DASH DRM license rotation using EAP…
Reason for Change: Fixes HLS-TS PTS restamping across SSAI (server-side ad insertion) transitions to prevent video freeze when restamping is enabled. The core change avoids using a stale base_pts at the ad boundary and adds logic to suppress false rollover detection immediately after discontinuities/offset changes. Changes: Update Demuxer::UpdateSegmentInfo() to compute restamped PTS/DTS from raw encoder ticks plus ptsOffset (avoiding stale base_pts arithmetic). Add suppress_rollover_detection and clear/suppress rollover handling around discontinuities via setPtsOffset() / init(). Add a new TsDemuxerTests L1 unit test suite covering restamp output and rollover suppression/correction. --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com>
…ping enabled, e.g. NBCNewsNOW (#1542) Reason for Change: instead of the AAMP layer rewriting the MPEGTS field in the VTT byte stream (fragile header surgery), the PTS offset is pushed into the subtec channel as a signed time offset, matching the pattern already used on the DASH path. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: dnfaulkner <115161165+dnfaulkner@users.noreply.github.com> Co-authored-by: pstroffolino <Philip_Stroffolino@cable.comcast.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Reason for change: Handle ad breaks closed with NotifyReservationComplete and invalidate empty ad breaks to prevent ad state issues during trickplay. Risks: Low Test Procedure: Test with various ad break scenarios during trickplay Priority: P1 Change-Id: Ie25d404ec0edf9bed7ed0c9299fa8a0eda0d360e Signed-off-by: Nandakishor U M <nu641001@gmail.com>
Signed-off-by: psiva01 <sivasubramanian.patchaiperumal@ltts.com>
Signed-off-by: psiva01 <sivasubramanian.patchaiperumal@ltts.com>
This reverts commit 38daa1d.
This reverts commit 2dc4e3a.
VPAAMP-256, VPAAMP-453 & VPAAMP-457 revert
This reverts commit d42c6c8.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.