|  | #!/usr/bin/env vpython3 | 
|  |  | 
|  | # Copyright (c) 2022 The WebRTC Project Authors. All Rights Reserved. | 
|  | # | 
|  | # Use of this source code is governed by a BSD-style license | 
|  | # that can be found in the LICENSE file in the root of the source | 
|  | # tree. An additional intellectual property rights grant can be found | 
|  | # in the file PATENTS.  All contributing project authors may | 
|  | # be found in the AUTHORS file in the root of the source tree. | 
|  |  | 
|  | import datetime | 
|  | from datetime import date | 
|  | import hashlib | 
|  | import sys | 
|  | from typing import FrozenSet, List, Set | 
|  |  | 
|  | import argparse | 
|  | import dataclasses | 
|  |  | 
|  |  | 
|  | @dataclasses.dataclass(frozen=True) | 
|  | class FieldTrial: | 
|  | """Representation of all attributes associated with a field trial. | 
|  |  | 
|  | Attributes: | 
|  | key: Field trial key. | 
|  | bug_id: Associated open bug containing more context. | 
|  | end_date: Date when the field trial expires and must be deleted. | 
|  | """ | 
|  | key: str | 
|  | bug_id: int | 
|  | end_date: date | 
|  |  | 
|  | def bug_url(self) -> str: | 
|  | if self.bug_id <= 0: | 
|  | return '' | 
|  | return f'https://issues.webrtc.org/issues/{self.bug_id}' | 
|  |  | 
|  |  | 
|  | # As per the policy in `g3doc/field-trials.md`, all field trials should be | 
|  | # registered in the container below. | 
|  | ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ | 
|  | # keep-sorted start | 
|  | FieldTrial('WebRTC-Aec3BufferingMaxAllowedExcessRenderBlocksOverride', | 
|  | 337900458, | 
|  | date(2024, 9, 1)), | 
|  | FieldTrial('WebRTC-Audio-GainController2', | 
|  | 42232605, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-OpusDecodeStereoByDefault', | 
|  | 379996136, | 
|  | date(2025, 11, 15)), | 
|  | FieldTrial('WebRTC-Audio-OpusGeneratePlc', | 
|  | 42223518, | 
|  | date(2025, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-PriorityBitrate', | 
|  | 42226125, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-AV1-OverridePriorityBitrate', | 
|  | 42226119, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Av1-GetEncoderInfoOverride', | 
|  | 42225234, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-BitrateAdjusterUseNewfangledHeadroomAdjustment', | 
|  | 349561566, | 
|  | date(2025, 8, 26)), | 
|  | FieldTrial('WebRTC-Bwe-LimitPacingFactorByUpperLinkCapacityEstimate', | 
|  | 42220543, | 
|  | date(2025, 1, 1)), | 
|  | FieldTrial('WebRTC-Bwe-ResetOnAdapterIdChange', | 
|  | 42225231, | 
|  | date(2025, 5, 30)), | 
|  | FieldTrial('WebRTC-DataChannelMessageInterleaving', | 
|  | 41481008, | 
|  | date(2024, 10, 1)), | 
|  | FieldTrial('WebRTC-Dav1dDecoder-CropToRenderResolution', | 
|  | 405341160, | 
|  | date(2026, 3, 21)), | 
|  | FieldTrial('WebRTC-DisableRtxRateLimiter', | 
|  | 42225500, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-DisableSslGroupIds', | 
|  | 404763475, | 
|  | date(2025,9,1)), | 
|  | FieldTrial('WebRTC-ElasticBitrateAllocation', | 
|  | 350555527, | 
|  | date(2025, 3, 1)), | 
|  | FieldTrial('WebRTC-EncoderDataDumpDirectory', | 
|  | 296242528, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ForceDtls13', | 
|  | 383141571, | 
|  | date(2024,9,1)), | 
|  | FieldTrial('WebRTC-EnableDtlsPqc', | 
|  | 404763475, | 
|  | date(2026,6,1)), | 
|  | FieldTrial('WebRTC-FrameCadenceAdapter-UseVideoFrameTimestamp', | 
|  | 42226256, | 
|  | date(2024, 10, 1)), | 
|  | FieldTrial('WebRTC-IPv6NetworkResolutionFixes', | 
|  | 42224598, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-IncomingTimestampOnMarkerBitOnly', | 
|  | 42224805, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-IncreaseIceCandidatePriorityHostSrflx', | 
|  | 42225331, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-JitterEstimatorConfig', | 
|  | 42224404, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-LibaomAv1Encoder-PostEncodeFrameDrop', | 
|  | 351644568, | 
|  | date(2026, 1, 30)), | 
|  | FieldTrial('WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings', | 
|  | 42226191, | 
|  | date(2024, 9, 1)), | 
|  | FieldTrial('WebRTC-MixedCodecSimulcast', | 
|  | 362277533, | 
|  | date(2025, 9, 1)), | 
|  | FieldTrial('WebRTC-NoSdpMangleUfrag', | 
|  | 375571816, | 
|  | date(2025, 10, 11)), | 
|  | FieldTrial('WebRTC-NoSdpMangleUfragRestrictedAddresses', | 
|  | 409713509, | 
|  | date(2025, 10, 11)), | 
|  | FieldTrial('WebRTC-NoSdpMangleNumberOfContents', | 
|  | 40567530, | 
|  | date(2025, 10, 11)), | 
|  | FieldTrial('WebRTC-Pacer-FastRetransmissions', | 
|  | 40235589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Pacer-KeyframeFlushing', | 
|  | 42221435, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-PostFilterKillSwitch', | 
|  | 417439718, | 
|  | date(2025, 9, 1)), | 
|  | FieldTrial('WebRTC-QCM-Dynamic-AV1', | 
|  | 349860657, | 
|  | date(2025, 7, 1)), | 
|  | FieldTrial('WebRTC-QCM-Dynamic-VP8', | 
|  | 349860657, | 
|  | date(2025, 7, 1)), | 
|  | FieldTrial('WebRTC-QCM-Dynamic-VP9', | 
|  | 349860657, | 
|  | date(2025, 7, 1)), | 
|  | FieldTrial('WebRTC-QCM-Static-AV1', | 
|  | 349860657, | 
|  | date(2025, 7, 1)), | 
|  | FieldTrial('WebRTC-QCM-Static-VP8', | 
|  | 349860657, | 
|  | date(2025, 7, 1)), | 
|  | FieldTrial('WebRTC-QCM-Static-VP9', | 
|  | 349860657, | 
|  | date(2025, 7, 1)), | 
|  | FieldTrial('WebRTC-ReceiveBufferSize', | 
|  | 42225927, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-RFC8888CongestionControlFeedback', | 
|  | 42225697, | 
|  | date(2025, 1, 30)), | 
|  | FieldTrial('WebRTC-RtcEventLogEncodeDependencyDescriptor', | 
|  | 42225280, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-RtcEventLogEncodeNetEqSetMinimumDelayKillSwitch', | 
|  | 42225058, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SetReadyToSendFalseIfSendFail', | 
|  | 361124449, | 
|  | date(2024, 12, 1)), | 
|  | FieldTrial('WebRTC-SimulcastEncoderAdapter-DropUnalignedResolution', | 
|  | 415329365, | 
|  | date(2025, 11, 2)), | 
|  | FieldTrial('WebRTC-SrtpRemoveReceiveStream', | 
|  | 42225949, | 
|  | date(2024, 10, 1)), | 
|  | FieldTrial('WebRTC-SwitchEncoderFollowCodecPreferenceOrder', | 
|  | 378566918, | 
|  | date(2025, 5, 1)), | 
|  | FieldTrial('WebRTC-PayloadTypesInTransport', | 
|  | 360058654, | 
|  | date(2025, 9, 11)), | 
|  | FieldTrial('WebRTC-UseAbsCapTimeForG2gMetric', | 
|  | 401512883, | 
|  | date(2025, 9, 10)), | 
|  | FieldTrial('WebRTC-UseNtpTimeAbsoluteSendTime', | 
|  | 42226305, | 
|  | date(2024, 9, 1)), | 
|  | FieldTrial('WebRTC-VP8-MaxFrameInterval', | 
|  | 42225870, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP9-SvcForSimulcast', | 
|  | 347737882, | 
|  | date(2024, 10, 1)), | 
|  | FieldTrial('WebRTC-Video-EnableRetransmitAllLayers', | 
|  | 42225262, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Video-EncoderFallbackSettings', | 
|  | 42231704, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VideoEncoderSettings', | 
|  | 40252667, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ZeroHertzQueueOverload', | 
|  | 42225879, | 
|  | date(2024, 7, 1)), | 
|  | FieldTrial('WebRTC-Video-H26xPacketBuffer', | 
|  | 41480904, | 
|  | date(2024, 6, 1)), | 
|  | FieldTrial('WebRTC-Video-Vp9FlexibleMode', | 
|  | 329396373, | 
|  | date(2025, 6, 26)), | 
|  | FieldTrial('WebRTC-IceHandshakeDtls', | 
|  | 367395350, | 
|  | date(2026, 1, 1)), | 
|  | FieldTrial('WebRTC-H265-QualityScaling', | 
|  | 402154973, | 
|  | date(2026, 1, 1)), | 
|  | # keep-sorted end | 
|  | ])  # yapf: disable | 
|  |  | 
|  | NO_BUG = -1 | 
|  | INDEFINITE = date(datetime.MAXYEAR, 1, 1) | 
|  |  | 
|  | # These field trials precedes the policy in `g3doc/field-trials.md` and are | 
|  | # therefore not required to follow it. Do not add any new field trials here. | 
|  | # If you remove an entry you should also update | 
|  | # POLICY_EXEMPT_FIELD_TRIALS_DIGEST. | 
|  | POLICY_EXEMPT_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ | 
|  | # keep-sorted start | 
|  | FieldTrial('WebRTC-AddNetworkCostToVpn', | 
|  | 42223280, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-AddPacingToCongestionWindowPushback', | 
|  | 42220204, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-AdjustOpusBandwidth', | 
|  | 42233664, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3AecStateFullResetKillSwitch', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3AecStateSubtractorAnalyzerResetKillSwitch', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3AntiHowlingMinimizationKillSwitch', | 
|  | 150764764, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3ClampInstQualityToOneKillSwitch', | 
|  | 42220991, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3ClampInstQualityToZeroKillSwitch', | 
|  | 42220991, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3CoarseFilterResetHangoverKillSwitch', | 
|  | 42222401, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3ConservativeTailFreqResponse', | 
|  | 42223361, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3DeactivateInitialStateResetKillSwitch', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3DelayEstimateSmoothingDelayFoundOverride', | 
|  | 42222934, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3DelayEstimateSmoothingOverride', | 
|  | 42222934, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3EchoSaturationDetectionKillSwitch', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceCaptureDelayEstimationDownmixing', | 
|  | 42221238, | 
|  | INDEFINITE), | 
|  | FieldTrial( | 
|  | 'WebRTC-Aec3EnforceCaptureDelayEstimationLeftRightPrioritization', | 
|  | 42221238, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceConservativeHfSuppression', | 
|  | 42222109, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3EnforceLowActiveRenderLimit', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceMoreTransparentNearendSuppressorHfTuning', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceMoreTransparentNearendSuppressorTuning', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceMoreTransparentNormalSuppressorHfTuning', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceMoreTransparentNormalSuppressorTuning', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceRapidlyAdjustingNearendSuppressorTunings', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceRapidlyAdjustingNormalSuppressorTunings', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceRenderDelayEstimationDownmixing', | 
|  | 42221238, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceSlowlyAdjustingNearendSuppressorTunings', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceSlowlyAdjustingNormalSuppressorTunings', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceStationarityProperties', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceStationarityPropertiesAtInit', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3EnforceVeryLowActiveRenderLimit', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3HighPassFilterEchoReference', | 
|  | 42222401, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3MinErleDuringOnsetsKillSwitch', | 
|  | 42220385, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3NonlinearModeReverbKillSwitch', | 
|  | 42222109, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3OnsetDetectionKillSwitch', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial( | 
|  | 'WebRTC-Aec3RenderDelayEstimationLeftRightPrioritizationKillSwitch', | 
|  | 42221238, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SensitiveDominantNearendActivation', | 
|  | 42221578, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SetupSpecificDefaultConfigDefaultsKillSwitch', | 
|  | 42221236, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3ShortHeadroomKillSwitch', | 
|  | 42220385, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3StereoContentDetectionKillSwitch', | 
|  | 42225201, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorAntiHowlingGainOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorDominantNearendEnrExitThresholdOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorDominantNearendEnrThresholdOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorDominantNearendHoldDurationOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorDominantNearendSnrThresholdOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorDominantNearendTriggerThresholdOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNearendHfMaskSuppressOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNearendHfMaskTransparentOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNearendLfMaskSuppressOverride', | 
|  | 42221589, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNearendLfMaskTransparentOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNearendMaxDecFactorLfOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNearendMaxIncFactorOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNormalHfMaskSuppressOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNormalHfMaskTransparentOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNormalLfMaskSuppressOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNormalLfMaskTransparentOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNormalMaxDecFactorLfOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorNormalMaxIncFactorOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3SuppressorTuningOverride', | 
|  | 42221589, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3TransparentAntiHowlingGain', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3TransparentModeHmm', | 
|  | 42222401, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3TransparentModeKillSwitch', | 
|  | 42234438, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3Use1Dot2SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3Use1Dot6SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3Use2Dot0SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseDot1SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseDot2SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseDot3SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseDot6SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseDot9SecondsInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseErleOnsetCompensationInDominantNearend', | 
|  | 42222842, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseLowEarlyReflectionsDefaultGain', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseLowLateReflectionsDefaultGain', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseNearendReverbLen', | 
|  | 42223329, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Aec3UseShortConfigChangeDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3UseZeroInitialStateDuration', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Aec3VerySensitiveDominantNearendActivation', | 
|  | 42221578, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Agc2SimdAvx2KillSwitch', | 
|  | 42232605, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Agc2SimdNeonKillSwitch', | 
|  | 42232605, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Agc2SimdSse2KillSwitch', | 
|  | 42232605, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-AllowMACBasedIPv6', | 
|  | 41480878, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-AlrDetectorParameters', | 
|  | 42220590, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-AndroidNetworkMonitor-IsAdapterAvailable', | 
|  | 42223964, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ApmExperimentalMultiChannelCaptureKillSwitch', | 
|  | 42225202, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-ApmExperimentalMultiChannelRenderKillSwitch', | 
|  | 42225203, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Audio-2ndAgcMinMicLevelExperiment', | 
|  | 40207112, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-ABWENoTWCC', | 
|  | 42233370, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Audio-AdaptivePtime', | 
|  | 40694579, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-Allocation', | 
|  | 42220324, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Audio-AlrProbing', | 
|  | 42220234, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-FecAdaptation', | 
|  | 42233254, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-LegacyOverhead', | 
|  | 42221084, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Audio-MinimizeResamplingOnMobile', | 
|  | 42231221, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-NetEqDecisionLogicConfig', | 
|  | 42223518, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-NetEqDelayManagerConfig', | 
|  | 42220376, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-NetEqNackTrackerConfig', | 
|  | 42220211, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-NetEqSmartFlushing', | 
|  | 42222334, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-OpusBitrateMultipliers', | 
|  | 42221139, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-Red-For-Opus', | 
|  | 42221750, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Audio-StableTargetAdaptation', | 
|  | 42221061, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Audio-iOS-Holding', | 
|  | 42233253, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-AudioDevicePlayoutBufferSizeFactor', | 
|  | 42221006, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-BindUsingInterfaceName', | 
|  | 42220770, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-AllocationProbing', | 
|  | 42220440, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-AlrProbing', | 
|  | 42220440, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-EstimateBoundedIncrease', | 
|  | 42220543, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-ExponentialProbing', | 
|  | 42220440, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-IgnoreProbesLowerThanNetworkStateEstimate', | 
|  | 42220543, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-InitialProbing', | 
|  | 42220440, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-InjectedCongestionController', | 
|  | 'webrtc:8415', | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Bwe-LimitProbesLowerThanThroughputEstimate', | 
|  | 42221601, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-LossBasedBweV2', | 
|  | 42222865, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-LossBasedControl', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-MaxRttLimit', | 
|  | 42234928, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Bwe-MinAllocAsLowerBound', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-NetworkRouteConstraints', | 
|  | 42221535, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-NoFeedbackReset', | 
|  | 42234928, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-ProbingBehavior', | 
|  | 42220440, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-ProbingConfiguration', | 
|  | 42220440, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-ReceiveTimeFix', | 
|  | 42234228, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-ReceiverLimitCapsOnly', | 
|  | 42222445, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-RobustThroughputEstimatorSettings', | 
|  | 42220312, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-SafeResetOnRouteChange', | 
|  | 42234928, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Bwe-SeparateAudioPackets', | 
|  | 42221011, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Bwe-TrendlineEstimatorSettings', | 
|  | 42221011, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-BweBackOffFactor', | 
|  | 42233342, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-BweLossExperiment', | 
|  | 42230863, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-BweRapidRecoveryExperiment', | 
|  | 42233136, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-BweThroughputWindowConfig', | 
|  | 42220312, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-BweWindowSizeInPackets', | 
|  | 42233342, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-CongestionWindow', | 
|  | 42225197, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-CpuLoadEstimator', | 
|  | 42233645, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Debugging-RtpDump', | 
|  | 42220735, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-DecoderDataDumpDirectory', | 
|  | 42224491, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-DefaultBitrateLimitsKillSwitch', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-DependencyDescriptorAdvertised', | 
|  | 42220386, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-DisableUlpFecExperiment', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-DontIncreaseDelayBasedBweInAlr', | 
|  | 42220590, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-DscpFieldTrial', | 
|  | 42223835, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ExtraICEPing', | 
|  | 42220311, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-FakeNetworkReceiveConfig', | 
|  | 42224493, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-FakeNetworkSendConfig', | 
|  | 42224493, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-FilterAbsSendTimeExtension', | 
|  | 42220271, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart', | 
|  | 42221149, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-FlexFEC-03', | 
|  | 42230680, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-FlexFEC-03-Advertised', | 
|  | 42230680, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ForcePlayoutDelay', | 
|  | 42222016, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-ForceSendPlayoutDelay', | 
|  | 42222016, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-ForceSimulatedOveruseIntervalMs', | 
|  | 42224494, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-FrameDropper', | 
|  | 42234921, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-FullBandHpfKillSwitch', | 
|  | 42221279, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-GenericCodecDependencyDescriptor', | 
|  | 42225273, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-GenericDescriptorAdvertised', | 
|  | 42234553, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-GenericDescriptorAuth', | 
|  | 42220132, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-GenericPictureId', | 
|  | 42234553, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-GetEncoderInfoOverride', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-H264HighProfile', | 
|  | 41481030, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-IPv6Default', | 
|  | NO_BUG,  # chromium:413437 | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-IceControllerFieldTrials', | 
|  | 40658968, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-IceFieldTrials', | 
|  | 42221103, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-KeyframeInterval', | 
|  | 42220470, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-LegacyFrameIdJumpBehavior', | 
|  | 42223541, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-LegacySimulcastLayerLimit', | 
|  | 42233936, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-LowresSimulcastBitrateInterpolation', | 
|  | 42222558, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-MutedStateKillSwitch', | 
|  | 177830919, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Network-UseNWPathMonitor', | 
|  | 42221045, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-NetworkMonitorAutoDetect', | 
|  | 42223964, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-NormalizeSimulcastResolution', | 
|  | NO_BUG, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Pacer-BlockAudio', | 
|  | 42233548, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Pacer-DrainQueue', | 
|  | 42233548, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Pacer-IgnoreTransportOverhead', | 
|  | 42235102, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Pacer-PadInSilence', | 
|  | 42233548, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-PacketBufferMaxSize', | 
|  | 42235070, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-PcFactoryDefaultBitrates', | 
|  | 42220941, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-PiggybackIceCheckAcknowledgement', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-PixelLimitResource', | 
|  | 42222397, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-ProbingScreenshareBwe', | 
|  | 42232804, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ProtectionOverheadRateThreshold', | 
|  | 42225198, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-QpParsingKillSwitch', | 
|  | 42222690, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-RtcEventLogKillSwitch', | 
|  | 42222210, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-RtcEventLogNewFormat', | 
|  | 42233237, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-RtcpLossNotification', | 
|  | 42220379, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SendBufferSizeBytes', | 
|  | 42222026, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SendNackDelayMs', | 
|  | 42235176, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SetSocketReceiveBuffer', | 
|  | 42223976, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SimulcastLayerLimitRoundUp', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SpsPpsIdrIsH264Keyframe', | 
|  | 42233557, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-StableTargetRate', | 
|  | 42220156, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-StrictPacingAndProbing', | 
|  | 42233198, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-StunInterPacketDelay', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SurfaceCellularTypes', | 
|  | 42221576, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-SwitchEncoderOnInitializationFailures', | 
|  | 42223783, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Target-Bitrate-Rtcp', | 
|  | 42235192, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-TransientSuppressorForcedOff', | 
|  | 40172597, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-UseBaseHeavyVP8TL3RateAllocation', | 
|  | 42234670, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-UseDifferentiatedCellularCosts', | 
|  | 42221576, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-UseStandardBytesStats', | 
|  | 42220573, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-UseTurnServerAsStunServer', | 
|  | 42221142, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP8-ForcePartitionResilience', | 
|  | 42221952, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-VP8-Forced-Fallback-Encoder-v2', | 
|  | 42231704, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-VP8-GetEncoderInfoOverride', | 
|  | 42221952, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-VP8-Postproc-Config', | 
|  | 42221657, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP8-Postproc-Config-Arm', | 
|  | 42231704, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-VP8IosMaxNumberOfThread', | 
|  | 42220027, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP9-GetEncoderInfoOverride', | 
|  | NO_BUG, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP9-LowTierOptimizations', | 
|  | 42224122, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP9-PerformanceFlags', | 
|  | 42221657, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VP9QualityScaler', | 
|  | 42221411, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Video-BalancedDegradation', | 
|  | 42232717, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-BalancedDegradationSettings', | 
|  | NO_BUG, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-DisableAutomaticResize', | 
|  | 42221931, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Video-DiscardPacketsWithUnknownSsrc', | 
|  | 42235091, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-ForcedSwDecoderFallback', | 
|  | NO_BUG, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-InitialDecoderResolution', | 
|  | 42222018, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Video-MinVideoBitrate', | 
|  | 42220993, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Video-Pacing', | 
|  | 42220062, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-Video-PreferTemporalSupportOnBaseLayer', | 
|  | 42221417, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-QualityScalerSettings', | 
|  | NO_BUG, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-QualityScaling', | 
|  | 42234348, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Video-UseFrameRateForOverhead', | 
|  | 166341943, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-VideoFrameTrackingIdAdvertised', | 
|  | 42222747, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-VideoLayersAllocationAdvertised', | 
|  | 42222126, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-VideoRateControl', | 
|  | 42220259, | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Vp9InterLayerPred', | 
|  | NO_BUG,  # chromium:949536 | 
|  | INDEFINITE), | 
|  | FieldTrial('WebRTC-Vp9IssueKeyFrameOnLayerDeactivation', | 
|  | 40595338, | 
|  | date(2024, 4, 1)), | 
|  | FieldTrial('WebRTC-ZeroPlayoutDelay', | 
|  | 40228487, | 
|  | date(2024, 4, 1)), | 
|  | # keep-sorted end | 
|  | ])  # yapf: disable | 
|  |  | 
|  | POLICY_EXEMPT_FIELD_TRIALS_DIGEST: str = \ | 
|  | 'e10a1af33d0a4cf81a6dc87d963b82cf6092ada3' | 
|  |  | 
|  | REGISTERED_FIELD_TRIALS: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS.union( | 
|  | POLICY_EXEMPT_FIELD_TRIALS) | 
|  |  | 
|  |  | 
|  | def todays_date() -> date: | 
|  | now = datetime.datetime.now(datetime.timezone.utc) | 
|  | return date(now.year, now.month, now.day) | 
|  |  | 
|  |  | 
|  | def registry_header( | 
|  | field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS) -> str: | 
|  | """Generates a C++ header with all field trial keys. | 
|  |  | 
|  | Args: | 
|  | field_trials: Field trials to include in the header. | 
|  |  | 
|  | Returns: | 
|  | String representation of a C++ header file containing all field trial | 
|  | keys. | 
|  |  | 
|  | >>> trials = { | 
|  | ...     FieldTrial('B', '', date(1, 1, 1)), | 
|  | ...     FieldTrial('A', '', date(1, 1, 1)), | 
|  | ...     FieldTrial('B', '', date(2, 2, 2)), | 
|  | ... } | 
|  | >>> print(registry_header(trials)) | 
|  | // This file was automatically generated. Do not edit. | 
|  | <BLANKLINE> | 
|  | #ifndef GEN_REGISTERED_FIELD_TRIALS_H_ | 
|  | #define GEN_REGISTERED_FIELD_TRIALS_H_ | 
|  | <BLANKLINE> | 
|  | #include "absl/strings/string_view.h" | 
|  | <BLANKLINE> | 
|  | namespace webrtc { | 
|  | <BLANKLINE> | 
|  | inline constexpr absl::string_view kRegisteredFieldTrials[] = { | 
|  | "A", | 
|  | "B", | 
|  | }; | 
|  | <BLANKLINE> | 
|  | }  // namespace webrtc | 
|  | <BLANKLINE> | 
|  | #endif  // GEN_REGISTERED_FIELD_TRIALS_H_ | 
|  | <BLANKLINE> | 
|  | """ | 
|  | registered_keys = {f.key for f in field_trials} | 
|  | keys = '\n'.join(f'    "{k}",' for k in sorted(registered_keys)) | 
|  | return ('// This file was automatically generated. Do not edit.\n' | 
|  | '\n' | 
|  | '#ifndef GEN_REGISTERED_FIELD_TRIALS_H_\n' | 
|  | '#define GEN_REGISTERED_FIELD_TRIALS_H_\n' | 
|  | '\n' | 
|  | '#include "absl/strings/string_view.h"\n' | 
|  | '\n' | 
|  | 'namespace webrtc {\n' | 
|  | '\n' | 
|  | 'inline constexpr absl::string_view kRegisteredFieldTrials[] = {\n' | 
|  | f'{keys}\n' | 
|  | '};\n' | 
|  | '\n' | 
|  | '}  // namespace webrtc\n' | 
|  | '\n' | 
|  | '#endif  // GEN_REGISTERED_FIELD_TRIALS_H_\n') | 
|  |  | 
|  |  | 
|  | def expired_field_trials( | 
|  | threshold: date, | 
|  | field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS | 
|  | ) -> Set[FieldTrial]: | 
|  | """Obtains expired field trials. | 
|  |  | 
|  | Args: | 
|  | threshold: Date from which to check end date. | 
|  | field_trials: Field trials to validate. | 
|  |  | 
|  | Returns: | 
|  | All expired field trials. | 
|  |  | 
|  | >>> trials = { | 
|  | ...     FieldTrial('Expired', '', date(1, 1, 1)), | 
|  | ...     FieldTrial('Not-Expired', '', date(1, 1, 2)), | 
|  | ... } | 
|  | >>> expired_field_trials(date(1, 1, 1), trials) | 
|  | {FieldTrial(key='Expired', bug='', end_date=datetime.date(1, 1, 1))} | 
|  | """ | 
|  | return {f for f in field_trials if f.end_date <= threshold} | 
|  |  | 
|  |  | 
|  | def validate_field_trials( | 
|  | field_trials: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS | 
|  | ) -> List[str]: | 
|  | """Validate that field trials conforms to the policy. | 
|  |  | 
|  | Args: | 
|  | field_trials: Field trials to validate. | 
|  |  | 
|  | Returns: | 
|  | A list of explanations for invalid field trials. | 
|  | """ | 
|  | invalid = [] | 
|  |  | 
|  | sha1 = hashlib.sha1() | 
|  | for trial in sorted(POLICY_EXEMPT_FIELD_TRIALS, key=lambda f: f.key): | 
|  | sha1.update(trial.key.encode('ascii')) | 
|  | if sha1.hexdigest() != POLICY_EXEMPT_FIELD_TRIALS_DIGEST: | 
|  | invalid.append( | 
|  | 'POLICY_EXEMPT_FIELD_TRIALS has been modified. Please note that ' | 
|  | 'you must not add any new entries there. If you removed an entry ' | 
|  | 'you should also update POLICY_EXEMPT_FIELD_TRIALS_DIGEST. The ' | 
|  | f'new digest is "{sha1.hexdigest()}".') | 
|  |  | 
|  | for trial in field_trials: | 
|  | if not trial.key.startswith('WebRTC-'): | 
|  | invalid.append(f'{trial.key} does not start with "WebRTC-".') | 
|  | if trial.bug_id <= 0: | 
|  | invalid.append(f'{trial.key} must have an associated bug.') | 
|  | if trial.end_date >= INDEFINITE: | 
|  | invalid.append(f'{trial.key} must have an end date.') | 
|  |  | 
|  | return invalid | 
|  |  | 
|  |  | 
|  | def cmd_header(args: argparse.Namespace) -> None: | 
|  | if not args.no_validation: | 
|  | if errors := validate_field_trials(): | 
|  | print('\n'.join(sorted(errors))) | 
|  | sys.exit(1) | 
|  |  | 
|  | args.output.write(registry_header()) | 
|  |  | 
|  |  | 
|  | def cmd_expired(args: argparse.Namespace) -> None: | 
|  | today = todays_date() | 
|  | diff = datetime.timedelta(days=args.in_days) | 
|  | expired = expired_field_trials( | 
|  | today + diff, | 
|  | ACTIVE_FIELD_TRIALS if args.no_exempt else REGISTERED_FIELD_TRIALS) | 
|  |  | 
|  | if len(expired) <= 0: | 
|  | return | 
|  |  | 
|  | expired_by_date = sorted(expired, key=lambda f: (f.end_date, f.key)) | 
|  | print('\n'.join( | 
|  | f'{f.key} ' | 
|  | f'{f"<{f.bug_url()}> " if f.bug_url() else ""}' | 
|  | f'{"expired" if f.end_date <= today else "expires"} on {f.end_date}' | 
|  | for f in expired_by_date)) | 
|  | if any(f.end_date <= today for f in expired_by_date): | 
|  | sys.exit(1) | 
|  |  | 
|  |  | 
|  | def cmd_validate(args: argparse.Namespace) -> None: | 
|  | del args | 
|  | invalid = validate_field_trials() | 
|  |  | 
|  | if len(invalid) <= 0: | 
|  | return | 
|  |  | 
|  | print('\n'.join(sorted(invalid))) | 
|  | sys.exit(1) | 
|  |  | 
|  |  | 
|  | def main() -> None: | 
|  | parser = argparse.ArgumentParser() | 
|  | subcommand = parser.add_subparsers(dest='cmd') | 
|  |  | 
|  | parser_header = subcommand.add_parser( | 
|  | 'header', | 
|  | help='generate C++ header file containing registered field trial keys') | 
|  | parser_header.add_argument('--output', | 
|  | default=sys.stdout, | 
|  | type=argparse.FileType('w'), | 
|  | required=False, | 
|  | help='output file') | 
|  | parser_header.add_argument( | 
|  | '--no-validation', | 
|  | default=False, | 
|  | action='store_true', | 
|  | required=False, | 
|  | help='whether to validate the field trials before writing') | 
|  | parser_header.set_defaults(cmd=cmd_header) | 
|  |  | 
|  | parser_expired = subcommand.add_parser( | 
|  | 'expired', | 
|  | help='lists all expired field trials', | 
|  | description=''' | 
|  | Lists all expired field trials. Exits with a non-zero exit status if | 
|  | any field trials has expired, ignoring the --in-days argument. | 
|  | ''') | 
|  | parser_expired.add_argument( | 
|  | '--no-exempt', | 
|  | default=False, | 
|  | action='store_true', | 
|  | required=False, | 
|  | help='whether to include policy exempt field trials') | 
|  | parser_expired.add_argument( | 
|  | '--in-days', | 
|  | default=0, | 
|  | type=int, | 
|  | required=False, | 
|  | help='number of days relative to today to check') | 
|  | parser_expired.set_defaults(cmd=cmd_expired) | 
|  |  | 
|  | parser_validate = subcommand.add_parser( | 
|  | 'validate', | 
|  | help='validates that all field trials conforms to the policy.', | 
|  | description=''' | 
|  | Validates that all field trials conforms to the policy. Exits with a | 
|  | non-zero exit status if any field trials does not. | 
|  | ''') | 
|  | parser_validate.set_defaults(cmd=cmd_validate) | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | if not args.cmd: | 
|  | parser.print_help(sys.stderr) | 
|  | sys.exit(1) | 
|  |  | 
|  | args.cmd(args) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |