code: @Override
      public boolean matches(ICpe target) {
          boolean result = this.vulnerable;
          result &= compareAttributes(this.getPart(), target.getPart());
          result &= compareAttributes(this.getVendor(), target.getVendor());
          result &= compareAttributes(this.getProduct(), target.getProduct());
  
          //TODO implement versionStart etc.
          result &= compareVersionRange(target.getVersion());
  
          //todo - if the vulnerablity has an update we are might not be collecting it correctly...
          // as such, this check might cause FN if the CVE has an update in the data set
          result &= compareAttributes(this.getUpdate(), target.getUpdate());
          result &= compareAttributes(this.getEdition(), target.getEdition());
          result &= compareAttributes(this.getLanguage(), target.getLanguage());
          result &= compareAttributes(this.getSwEdition(), target.getSwEdition());
          result &= compareAttributes(this.getTargetSw(), target.getTargetSw());
          result &= compareAttributes(this.getTargetHw(), target.getTargetHw());
          result &= compareAttributes(this.getOther(), target.getOther());
          return result;
      }
docs: <p>
  Determines if the VulnerableSoftware matches the given target
  VulnerableSoftware. This does not follow the CPE 2.3 Specification
  exactly as there are cases where undefined comparisons will result in
  either true or false. For instance, 'ANY' will match 'm+wild cards' and
  NA will return false when the target has 'm+wild cards'.</p>
  <p>
  For vulnerable software matching, the implementation also takes into
  account version ranges as specified within the NVD data feeds.</p>
  
  @param target the target CPE to evaluate
  @return <code>true</code> if the CPE matches the target; otherwise
  <code>false</code>