
    Cjj                         S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	J
r
JrJrJrJrJrJrJrJr  SSKJrJrJrJr  S	 r " S
 S\5      rg)a(  
This class is a rewrite based on the JS implementation found here:
https://github.com/RedHatProductSecurity/cvss-v4-calculator

Implements class for CVSS4 specification as defined at
https://www.first.org/cvss/specification-document .

The library is compatible with both Python 2 and Python 3.
    )unicode_literalsN)ROUND_HALF_UP)Decimal   )
CVSS_LOOKUP_GLOBALEPSILONMAX_COMPOSEDMAX_SEVERITYMETRICSMETRICS_ABBREVIATIONSMETRICS_ABBREVIATIONS_JSONMETRICS_MANDATORYMETRICS_VALUE_NAMESOrderedDict)CVSS4MalformedErrorCVSS4MandatoryErrorCVSS4RHMalformedErrorCVSS4RHScoreDoesNotMatchc                 n    [        [        U [        -   5      R                  [        S5      [        S95      $ )aj  
Round to one decimal place. Use Decimal because Python float rounding defaults to
"round half to even". We actually want "round half away from zero" aka "round half up" for
positive numbers.

Add a small value to make sure that values like the following are correctly rounded despite
floating point inaccuracies:

8.6 - 7.15 = 1.4499999999999993 (float) => 1.5
z0.1)rounding)floatDr   quantizer   )xs    \/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/cvss/cvss4.pyfinal_roundingr   =   s+     1w;((5M(JKK    c                       \ rS rSrSrS r\S 5       rS rS r	S r
S rS	 rS
 rS rS rSS jrS rS rS rS rS rSS jrS rS rSrg)CVSS4K   z<
Class to hold CVSS4 vector, parsed values, and all scores.
c                     Xl         0 U l        / U l        SU l        SU l        U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         g)z
Args:
    vector (str): string specifying CVSS4 vector, fields may be out of order, fields which
                  are not mandatory may be missing
N)
vectormetricsmissing_metrics
base_scoreseverityparse_vectorcheck_mandatoryadd_missing_optionalcompute_base_scorecompute_severity)selfr"   s     r   __init__CVSS4.__init__P   sb     !!!#!r   c                 ~    UR                  SS5      u  p# [	        U5      nU " U5      nUR                  5       S   U:X  a  U$ [        SR                  X5R                  5       S   U5      5      e! [         a    [        SR                  U5      5      ef = f! [         a    [        SR                  U5      5      ef = f)a  
Creates a CVSS4 object from CVSS vector in Red Hat notation, e.g. containing base score.
Also checks if the score matches the vector.

Args:
    vector (str): string specifying CVSS4 vector in Red Hat notation, fields may be out of
                  order, fields which are not mandatory may be missing

Returns:
    CVSS4: the generated CVSS4 object created from the vector string

Raises:
    CVSS4RHMalformedError: if vector is not in expected format for Red Hat notation
    CVSS4RHScoreDoesNotMatch: if vector and score do not match
/r   z0Malformed CVSS4 vector in Red Hat notation "{0}"r   zgCVSS4 vector in Red Hat notation "{0}" has score of "{1}" which does not match specified score of "{2}")split
ValueErrorr   formatr   scoresr   )clsr"   scorebase_vectorscore_valuecvss_objects         r   from_rh_vectorCVSS4.from_rh_vectorc   s    "	!'c1!5E
	,K
 +&"k1*FFLf!3!3!5a!8%G   	'BII&Q 	  	'BII&Q 	s   A/ B /%B%B<c                     / n[          H%  nX R                  ;  d  M  UR                  U5        M'     U(       a)  [        SR	                  SR                  U5      5      5      eg)z
Checks if mandatory fields are in CVSS4 vector.

Raises:
    CVSS4MandatoryError: if mandatory metric is missing in the vector
zMissing mandatory metrics "{0}"z, N)r   r#   appendr   r3   join)r,   missingmandatory_metrics      r   r(   CVSS4.check_mandatory   sV      1||3/0 !2 %&G&N&NtyyY`Oa&bcc r   c                 8   [         R                   " U R                  5      U l        S HF  nXR                  ;  d  U R                  U   S:X  d  M'  U R                  USS    U R                  U'   MH     S H#  nXR                  ;  d  M  SU R                  U'   M%     g)z
Adds missing optional parameters, so they match the mandatory ones. Original metrics are
also stored, as they may be used for printing back the minimal vector.
)MAVMACMATMPRMUIMVCMVIMVAMSCMSIMSAXr   N)
SAURVREUCRIRARE)copyr#   original_metrics)r,   abbreviations     r   r)   CVSS4.add_missing_optional   s    
 !%		$,, 7
L <</4<<3MQT3T-1\\,qr:J-K\*
 
L <</-0\*
r   c                    U R                   S:X  a  [        S5      eU R                   R                  S5      (       a  [        S5      eU R                   R                  S5      (       d$  [        SR	                  U R                   5      5      e U R                   R                  S5      SS nU H  nUS:X  a$  [        S
R	                  U R                   5      5      e UR                  S5      u  p4X0R                  ;   a  [        SR	                  U5      5      eU[        ;  a  [        SR	                  U5      5      eU[        U   ;  a  [        SR	                  U5      5      eX@R                  U'   M     g! [         a%    [        S	R	                  U R                   5      5      ef = f! [         a    [        SR	                  U5      5      ef = f)zm
Parses metrics from the CVSS4 vector.

Raises:
    CVSS4MalformedError: if vector is not in expected format
 z'Malformed CVSS4 vector, vector is emptyr0   z$Malformed CVSS4 vector, trailing "/"	CVSS:4.0/zYMalformed CVSS4 vector "{0}" is missing mandatory prefix or uses unsupported CVSS versionr   NzMalformed CVSS4 vector "{0}"z!Empty field in CVSS4 vector "{0}":zMalformed CVSS4 field "{0}"zDuplicate metric "{0}"z(Invalid metric key in CVSS4 vector "{0}"z*Invalid metric value in CVSS4 vector "{0}")
r"   r   endswith
startswithr3   r1   
IndexErrorr2   r#   r   )r,   fieldsfieldmetricvalues        r   r'   CVSS4.parse_vector   s    ;;"%&OPP;;$$%&LMM{{%%k22%3396$++3F 	Z[[&&s+AB/F
 E{)*M*T*TUYU`U`*abbW %C 0 %)*B*I*I&*QRR00)*T*[*[\a*bcc/77)@GGN  $)LL ) 	  	Z%&D&K&KDKK&XYY	Z  W)*G*N*Nu*UVVWs   E4 F&4/F#&%Gc                 N    [         S[        U5      -      [        XS-
     5         $ )Neqr   )r	   str)r,   lookuprj   s      r   get_eq_maxesCVSS4.get_eq_maxes   s%    D3r7N+CAv,?@@r   c                     UR                  U5      [        U5      -   S-   nX#S  nSnSU;   a  US UR                  S5       nU$ UnU$ )Nr   r^   r0   )indexlen)r,   rf   stringextracted_index	extracted
metric_vals         r   extract_value_metricCVSS4.extract_value_metric   sa     ,,v.V<q@+,	
)"#9Y__S%9:J  #Jr   c                     U R                   R                  U5      nUS:X  a  US:X  a  gUS:X  a  US:X  a  gUS:X  a  US:X  a  gUS:X  a  US:X  a  gSU-   U R                   ;   a  U R                   SU-      nUS:w  a  U$ U$ )	NrX   rN   ArU   HrV   rW   M)r#   get)r,   rf   selectedmodified_selecteds       r   mCVSS4.m   s    <<##F+S=X_T>h#oT>h#oT>h#o<4<<' $S6\ : C'((r   c                 	   SnSnSnSnSnSnU R                  S5      S:X  a-  U R                  S5      S:X  a  U R                  S5      S:X  a  SnOU R                  S5      S:X  d*  U R                  S5      S:X  d  U R                  S5      S:X  aW  U R                  S5      S:X  a*  U R                  S5      S:X  a  U R                  S5      S:X  d  U R                  S5      S:X  d  SnOVU R                  S5      S:X  d?  U R                  S5      S:X  d,  U R                  S5      S:X  d  U R                  S5      S:X  d  S	nU R                  S
5      S:X  a  U R                  S5      S:X  a  SnO,U R                  S
5      S:X  a  U R                  S5      S:X  d  SnU R                  S5      S:X  a  U R                  S5      S:X  a  SnOU R                  S5      S:X  a  U R                  S5      S:X  dB  U R                  S5      S:X  d*  U R                  S5      S:X  d  U R                  S5      S:X  a  SnOAU R                  S5      S:X  d,  U R                  S5      S:X  d  U R                  S5      S:X  d  S	nU R                  S5      S:X  d  U R                  S5      S:X  a  SnOU R                  S5      S:X  dW  U R                  S5      S:X  dB  U R                  S5      S:X  d*  U R                  S5      S:X  d  U R                  S5      S:X  a  SnOkU R                  S5      S:X  dV  U R                  S5      S:X  dA  U R                  S5      S:X  d,  U R                  S5      S:X  d  U R                  S5      S:X  d  S	nU R                  S5      S:X  a  SnO/U R                  S5      S:X  a  SnOU R                  S5      S:X  a  S	nU R                  S5      S:X  a  U R                  S5      S:X  dT  U R                  S5      S:X  a  U R                  S5      S:X  d*  U R                  S5      S:X  a  U R                  S5      S:X  a  SnOU R                  S5      S:X  a  U R                  S5      S:X  dV  U R                  S5      S:X  a  U R                  S5      S:X  d,  U R                  S5      S:X  a  U R                  S5      S:X  d  SnX-   U-   U-   U-   U-   $ )NNoneAVNPRUI0P12ACLATVCrz   VIVArL   rO   rM   SCSISArX   ry   rT   rU   rV   rW   )r   )r,   eq1eq2eq3eq4eq5eq6s          r   macroVectorCVSS4.macroVector  s   66$<3466$<3#6466$<3;NCVVD\S DFF4LC$7466$<3;NVVD\S(TVVD\S-@TVVD\UXEXFF4LC'CVVD\S FF4LC466$<3#6$&&,#:MC66$<3466$<3#6C&&,#%$&&,#*=C66$<3466$<3#6C&&,#%$&&,#*=FF4LC466$<3#6$&&,#:MC&&,#%)<tPS@SC66%=C466%=C#7C&&-3&$&&-3*>FF4LC466$<3#6$&&,#:MC&&-3&$&&-3*>VVD\S DFF4LC$7466$<3;NC66#;#CVVC[CCVVC[CC VVD\S TVVD\S%8t#t(;t#t(;CVVD\S TVVD\S%8t#t(;t#t(;Cy3$s*S00r   c                    SSSSS.nSSSS.nSSSS.nSSS.nSSS	.nSSSS
.nSSSS
.nSSSS
.nSSSS
.n	SSSSS.n
SSSSS.nSSSS.nSSSS.nSSSS.nU R                  5       n[        S Vs/ s H  nU R                  U5      S:H  PM     sn5      (       a  SU l        g [        U   n[        US   5      n[        US   5      n[        US   5      n[        US   5      n[        US   5      n[        US   5      nSR                  S US-   UUUUU4 5       5      nSR                  S UUS-   UUUU4 5       5      nUS:X  a(  US:X  a"  SR                  S UUUS-   UUU4 5       5      nOUS:X  a(  US:X  a"  SR                  S UUUS-   UUU4 5       5      nOUS:X  a(  US:X  a"  SR                  S UUUUUUS-   4 5       5      nOsUS:X  aI  US:X  aC  SR                  S UUUUUUS-   4 5       5      nSR                  S UUUS-   UUU4 5       5      nO$SR                  S UUUS-   UUUS-   4 5       5      nSR                  S UUUUS-   UU4 5       5      nSR                  S UUUUUS-   U4 5       5      n[        R                  " U[        S 5      5      n[        R                  " U[        S 5      5      n US:X  aS  US:X  aM  [        R                  " W[        S 5      5      n![        R                  " W[        S 5      5      n"[        U!U"5      n#O [        R                  " W[        S 5      5      n#[        R                  " U[        S 5      5      n$[        R                  " U[        S 5      5      n%U R                  US5      n&U R                  US5      n'U R                  US5      US      n(U R                  US5      n)U R                  US5      n*/ n+U& HD  n,U' H;  n-U( H2  n.U) H)  n/U* H   n0U+R                  U,U--   U.-   U/-   U0-   5        M"     M+     M4     M=     MF     U+ GHh  n1XR                  S!5         XR                  S!U15         -
  n2X R                  S"5         X R                  S"U15         -
  n3X0R                  S#5         X0R                  S#U15         -
  n4X@R                  S$5         X@R                  S$U15         -
  n5XPR                  S%5         XPR                  S%U15         -
  n6X`R                  S&5         X`R                  S&U15         -
  n7XpR                  S'5         XpR                  S'U15         -
  n8XR                  S(5         XR                  S(U15         -
  n9XR                  S)5         XR                  S)U15         -
  n:XR                  S*5         XR                  S*U15         -
  n;XR                  S+5         XR                  S+U15         -
  n<XR                  S,5         XR                  S,U15         -
  n=XR                  S-5         XR                  S-U15         -
  n>XR                  S.5         XR                  S.U15         -
  n?[        U2U3U4U5U6U7U8U9U:U;U<U=U>U?4 V@s/ s H  n@U@S:  PM
     sn@5      (       a  GMi    O   W2W3-   W4-   nAW5W6-   nBW7W8-   W9-   W=-   W>-   W?-   nCW:W;-   W<-   nDSnEUU-
  nFUU -
  nGUU#-
  nHUU$-
  nIUU%-
  nJSnKSnLSnMSnNSnOSnPSnQSnRSnSSnTSnU[        S/   U   UE-  nV[        S0   U   UE-  nW[        S1   U   U   UE-  nX[        S2   U   UE-  nY[        UF5      [        [
        4;   a  WFS:  a  WPS-  nPWAWV-  nKWFUK-  nQ[        WG5      [        [
        4;   a  WGS:  a  WPS-  nPWBWW-  nLWGUL-  nR[        WH5      [        [
        4;   a  WHS:  a  WPS-  nPWCWX-  nMWHUM-  nS[        WI5      [        [
        4;   a  WIS:  a  WPS-  nPWDWY-  nNWIUN-  nT[        WJ5      [        [
        4;   a  WJS:  a  WPS-  nPSnOWJUO-  nUWPS:X  a  SOWQWR-   WS-   WT-   WU-   WP-  nZUUZ-  n[        SU5      n[!        S3U5      n[#        U5      U l        g s  snf s  sn@f )4N        g?g?g333333?)r   ry   r   r   )r   r   rz   )r   r   ry   )r   rz   )r   r   )rz   r   r   )rO   rz   r   r   )rz   r{   r   )r   r   r   r   r   r   r   r   r               r^   c              3   8   #    U  H  n[        U5      v   M     g 7fNrk   .0vals     r   	<genexpr>+CVSS4.compute_base_score.<locals>.<genexpr>y        '
 ZCHH Z   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r   |  r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r           .$^SC$^r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     s      3$^SC$^r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     s      4$^SC$^r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     s      .$bSC$br   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r     r   r   nanr   r   r   r   r   r   r   r   r   r   r   rU   rV   rW   r   r   eq3eq6r   g      $@)r   allr   r%   r   intr>   r|   r   maxrm   r=   rv   anyr
   typeminr   )[r,   	AV_levels	PR_levels	UI_levels	AC_levels	AT_levels	VC_levels	VI_levels	VA_levels	SC_levels	SI_levels	SA_levels	CR_levels	IR_levels	AR_levelsr   rf   rg   eq1_valeq2_valeq3_valeq4_valeq5_valeq6_valeq1_next_lower_macroeq2_next_lower_macroeq3eq6_next_lower_macroeq3eq6_next_lower_macro_lefteq3eq6_next_lower_macro_righteq4_next_lower_macroeq5_next_lower_macroscore_eq1_next_lower_macroscore_eq2_next_lower_macro"score_eq3eq6_next_lower_macro_left#score_eq3eq6_next_lower_macro_rightscore_eq3eq6_next_lower_macroscore_eq4_next_lower_macroscore_eq5_next_lower_macro	eq1_maxes	eq2_maxeseq3_eq6_maxes	eq4_maxes	eq5_maxesmax_vectorseq1_maxeq2_maxeq3_eq6_maxeq4_maxeq5max
max_vectorseverity_distance_AVseverity_distance_PRseverity_distance_UIseverity_distance_ACseverity_distance_ATseverity_distance_VCseverity_distance_VIseverity_distance_VAseverity_distance_SCseverity_distance_SIseverity_distance_SAseverity_distance_CRseverity_distance_IRseverity_distance_ARmetcurrent_severity_distance_eq1current_severity_distance_eq2 current_severity_distance_eq3eq6current_severity_distance_eq4stepavailable_distance_eq1available_distance_eq2available_distance_eq3eq6available_distance_eq4available_distance_eq5percent_to_next_eq1_severitypercent_to_next_eq2_severitypercent_to_next_eq3eq6_severitypercent_to_next_eq4_severitypercent_to_next_eq5_severityn_existing_lowernormalized_severity_eq1normalized_severity_eq2normalized_severity_eq3eq6normalized_severity_eq4normalized_severity_eq5max_severity_eq1max_severity_eq2max_severity_eq3eq6max_severity_eq4mean_distances[                                                                                              r   r*   CVSS4.compute_base_scoreU  s
   Cc<	Cc2	Cc2	C(	C(	Cc2	Cc2	Cc2	Cc2	Cc<	Cc<	Cc2	Cc2	Cc2	 &&(4XY4X&v#%4XYZZ!DO";/k!n%k!n%k!n%k!n%k!n%k!n%!ww '
!(1gwRY Z'
  
  "ww '
!('A+wRY Z'
  
 a<GqL&(gg .%,gw{GWV]$^. '# \gl&(gg .%,gw{GWV]$^. '# \gl&(gg .%,gwRY\]R]$^. '# \gl+-77 3%,gwRY\]R]$^3 ,( -/GG 4%,gw{GWV]$^4 -) ')gg .%,gw{GWV]`aVa$b. '#  "ww '
!('7GaKRY Z'
  
  "ww '
!('7GWq[RY Z'
  
 &8%;%;<PRWX]R^%_"%7%;%;<PRWX]R^%_"a<GqL1C1G1G,eEl2. 3E2H2H-uU|3/ -024W-) -?,B,B'u-) &8%;%;<PRWX]R^%_"%7%;%;<PRWX]R^%_"%%k15	%%k15	))+q9+a.I%%k15	%%k15	 G$#0K#,&/F'..w/@;/NQX/X[a/ab '0 $- $1 % ! &J&&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` ! &&,')4M4MdT^4_*`` !  -,,,,,,,,,,,,,   !G  * E &J !#77:NN 	& )=?S(S% "#"# ## #	#
 ## 	) !#77:NN 	&
 !&)C!C!&)C!C$),I$I!!&)C!C!&)C!C'($'($*+''($'($"#"#%&""#"#'.w7$>'.w7$>*84W=gFM'.w7$>&'E3<7<RVW<W!,IM]+](&<?[&[#&'E3<7<RVW<W!,IM]+](&<?[&[#)*ucl:?X\]?]!0#/$+ *CEd)d&&'E3<7<RVW<W!,IM]+](&<?[&[#&'E3<7<RVW<W!+,(&<?[&[#  1$  ()*,- ** *	*  	 	CD% (/c ZFs   /a1a
c                     / n[          HK  nX0R                  ;   d  M  U R                  U   nUS:w  d  M+  UR                  SR                  X45      5        MM     U(       a  SnOSnUSR	                  U5      -   $ )z
Returns vector without optional metrics marked as X and in the required order.

Args:
    output_prefix (bool): defines if CVSS vector should be printed with prefix

Returns:
    (str): cleaned CVSS4 with metrics in correct order
rN   z{0}:{1}r_   r^   r0   )r   rZ   r=   r3   r>   )r,   output_prefixr"   rf   rg   prefixs         r   clean_vectorCVSS4.clean_vector`  sp     +F...--f5C<MM)"2"26"AB	 ,
  FF(((r   c                 V    U R                   R                  US5      n[        U   U   nU$ )zL
Gets textual description of specific metric specified by its abbreviation.
rN   )r#   r|   r   )r,   r[   string_valueresults       r   get_value_descriptionCVSS4.get_value_descriptionz  s.     ||''c:$\2<@r   c                     U R                   S:X  a  SU l        g
U R                   S::  a  SU l        g
U R                   S::  a  SU l        g
U R                   S::  a  SU l        g
S	U l        g
)zK
Returns the severity based on score.

Returns:
    (str): Severity string
r   r   g333333@Lowg@Mediumg!@HighCriticalN)r%   r&   r,   s    r   r+   CVSS4.compute_severity  sW     ??c!"DM__#!DM__#$DM__#"DM&DMr   c                     U R                   4$ )zo
Returns computed base score as tuple for backwards compatibility.

Returns:
    (tuple of floats): Base Score
)r%   r%  s    r   r4   CVSS4.scores  s     !!r   c                     U R                   4$ )z}
Returns severities based on base score as tuple for backwards compatibility.

Returns:
    (tuple): Base Severity as string
)r&   r%  s    r   
severitiesCVSS4.severities  s     r   c                 T    [        U R                  5      S-   U R                  5       -   $ )z
Returns cleaned vector with score in Red Hat notation, e.g. score/vector.

Example: 7.3/CVSS:4.0/AV:P/AC:H/AT:N/PR:H/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:A
r0   )rk   r%   r  r%  s    r   	rh_vectorCVSS4.rh_vector  s&     4??#c)D,=,=,???r   c                 
  ^ ^^ S mUU U4S jnST R                   S.m[         H  nU" U5        M     [        T R                  5      TS'   T R                  TS'   U(       a"  [        [        TR                  5       5      5      mT$ )a  
Returns a dictionary formatted with attribute names and values defined by the official
CVSS JSON schema:

CVSS v4.0: https://www.first.org/cvss/cvss-v4.0.json?20231011

Serialize a `cvss` instance to JSON with:

json.dumps(cvss.as_json())

Or get sorted JSON in an OrderedDict with:

json.dumps(cvss.as_json(sort=True))

Returns:
    (dict): JSON schema-compatible CVSS representation
c                 p    U S:X  a  gU R                  5       R                  SS5      R                  SS5      $ )NAdjacentADJACENT_NETWORK-_ )upperreplace)texts    r   usCVSS4.as_json.<locals>.us  s5     z!)::<''S199#sCCr   c                 L   > [         U    nT" TR                  U 5      5      TU'   g r   )r   r  )rf   kdatar,   r9  s     r   add_metric_to_data)CVSS4.as_json.<locals>.add_metric_to_data  s&    *62A33F;<DGr   4)versionvectorString	baseScorebaseSeverity)r"   r   r   r%   r&   r   sorteditems)r,   sortminimalr>  rf   r=  r9  s   `    @@r   as_jsonCVSS4.as_json  ss    &	D	=
  KK

 Fv& !$//2[#}}^vdjjl34Dr   c                 4    [        U R                  5       5      $ r   )hashr  r%  s    r   __hash__CVSS4.__hash__  s    D%%'((r   c                 p    [        U[        5      (       a!  U R                  5       UR                  5       :H  $ g)NF)
isinstancer   r  )r,   os     r   __eq__CVSS4.__eq__  s-    a$$&!..*:::r   )r%   r#   r$   rZ   r&   r"   N)T)FF)__name__
__module____qualname____firstlineno____doc__r-   classmethodr:   r(   r)   r'   rm   rv   r   r   r*   r  r  r+   r4   r*  r-  rI  rM  rR  __static_attributes__ r   r   r   r   K   s     & % %Nd$1L,)\A*A1FI0V)4'$" @+Z)r   r   )rX  
__future__r   rY   decimalr   r   r   
constants4r   r   r	   r
   r   r   r   r   r   r   
exceptionsr   r   r   r   r   objectr   r[  r   r   <module>ra     sE   2 (  !     LV
F V
r   