#!/usr/bin/env perl
#
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
#
#  A script designed to interpose between the build system and gcc.  It invokes
#  both gcc and the static analyzer.
#
##===----------------------------------------------------------------------===##

use strict;
use warnings;
use FindBin;
use Cwd qw/ getcwd abs_path /;
use File::Temp qw/ tempfile /;
use File::Path qw / mkpath /;
use File::Basename;
use Text::ParseWords;

##===----------------------------------------------------------------------===##
# List form 'system' with STDOUT and STDERR captured.
##===----------------------------------------------------------------------===##

sub silent_system {
  my $HtmlDir = shift;
  my $Command = shift;

  # Save STDOUT and STDERR and redirect to a temporary file.
  open OLDOUT, ">&", \*STDOUT;
  open OLDERR, ">&", \*STDERR;
  my ($TmpFH, $TmpFile) = tempfile("temp_buf_XXXXXX",
                                   DIR => $HtmlDir,
                                   UNLINK => 1);
  open(STDOUT, ">$TmpFile");
  open(STDERR, ">&", \*STDOUT);

  # Invoke 'system', STDOUT and STDERR are output to a temporary file.
  system $Command, @_;

  # Restore STDOUT and STDERR.
  open STDOUT, ">&", \*OLDOUT;
  open STDERR, ">&", \*OLDERR;

  return $TmpFH;
}

##===----------------------------------------------------------------------===##
# Compiler command setup.
##===----------------------------------------------------------------------===##

# Search in the PATH if the compiler exists
sub SearchInPath {
    my $file = shift;
    foreach my $dir (split (':', $ENV{PATH})) {
        if (-x "$dir/$file") {
            return 1;
        }
    }
    return 0;
}

my $Compiler;
my $Clang;
my $DefaultCCompiler;
my $DefaultCXXCompiler;
my $IsCXX;
my $AnalyzerTarget;

# If on OSX, use xcrun to determine the SDK root.
my $UseXCRUN = 0;

if (`uname -a` =~ m/Darwin/) {
  $DefaultCCompiler = 'clang';
  $DefaultCXXCompiler = 'clang++';
  # Older versions of OSX do not have xcrun to
  # query the SDK location.
  if (-x "/usr/bin/xcrun") {
    $UseXCRUN = 1;
  }
} else {
  $DefaultCCompiler = 'gcc';
  $DefaultCXXCompiler = 'g++';
}

if ($FindBin::Script =~ /c\+\+-analyzer/) {
  $Compiler = $ENV{'CCC_CXX'};
  if (!defined $Compiler || (! -x $Compiler && ! SearchInPath($Compiler))) { $Compiler = $DefaultCXXCompiler; }

  $Clang = $ENV{'CLANG_CXX'};
  if (!defined $Clang || ! -x $Clang) { $Clang = 'clang++'; }

  $IsCXX = 1
}
else {
  $Compiler = $ENV{'CCC_CC'};
  if (!defined $Compiler || (! -x $Compiler && ! SearchInPath($Compiler))) { $Compiler = $DefaultCCompiler; }

  $Clang = $ENV{'CLANG'};
  if (!defined $Clang || ! -x $Clang) { $Clang = 'clang'; }

  $IsCXX = 0
}

$AnalyzerTarget = $ENV{'CLANG_ANALYZER_TARGET'};

##===----------------------------------------------------------------------===##
# Cleanup.
##===----------------------------------------------------------------------===##

my $ReportFailures = $ENV{'CCC_REPORT_FAILURES'};
if (!defined $ReportFailures) { $ReportFailures = 1; }

my $CleanupFile;
my $ResultFile;

# Remove any stale files at exit.
END {
  if (defined $ResultFile && -z $ResultFile) {
    unlink($ResultFile);
  }
  if (defined $CleanupFile) {
    unlink($CleanupFile);
  }
}

##----------------------------------------------------------------------------##
#  Process Clang Crashes.
##----------------------------------------------------------------------------##

sub GetPPExt {
  my $Lang = shift;
  if ($Lang =~ /objective-c\+\+/) { return ".mii" };
  if ($Lang =~ /objective-c/) { return ".mi"; }
  if ($Lang =~ /c\+\+/) { return ".ii"; }
  return ".i";
}

# Set this to 1 if we want to include 'parser rejects' files.
my $IncludeParserRejects = 0;
my $ParserRejects = "Parser Rejects";
my $AttributeIgnored = "Attribute Ignored";
my $OtherError = "Other Error";

sub ProcessClangFailure {
  my ($Clang, $Lang, $file, $Args, $HtmlDir, $ErrorType, $ofile) = @_;
  my $Dir = "$HtmlDir/failures";
  mkpath $Dir;

  my $prefix = "clang_crash";
  if ($ErrorType eq $ParserRejects) {
    $prefix = "clang_parser_rejects";
  }
  elsif ($ErrorType eq $AttributeIgnored) {
    $prefix = "clang_attribute_ignored";
  }
  elsif ($ErrorType eq $OtherError) {
    $prefix = "clang_other_error";
  }

  # Generate the preprocessed file with Clang.
  my ($PPH, $PPFile) = tempfile( $prefix . "_XXXXXX",
                                 SUFFIX => GetPPExt($Lang),
                                 DIR => $Dir);
  close ($PPH);
  system $Clang, @$Args, "-E", "-o", $PPFile;

  # Create the info file.
  open (OUT, ">", "$PPFile.info.txt") or die "Cannot open $PPFile.info.txt\n";
  print OUT abs_path($file), "\n";
  print OUT "$ErrorType\n";
  print OUT "@$Args\n";
  close OUT;
  `uname -a >> $PPFile.info.txt 2>&1`;
  `"$Compiler" -v >> $PPFile.info.txt 2>&1`;
  rename($ofile, "$PPFile.stderr.txt");
  return (basename $PPFile);
}

##----------------------------------------------------------------------------##
#  Running the analyzer.
##----------------------------------------------------------------------------##

sub GetCCArgs {
  my $HtmlDir = shift;
  my $mode = shift;
  my $Args = shift;
  my $line;
  my $OutputStream = silent_system($HtmlDir, $Clang, "-###", $mode, @$Args);
  while (<$OutputStream>) {
    next if (!/\s"?-cc1"?\s/);
    $line = $_;
  }
  die "could not find clang line\n" if (!defined $line);
  # Strip leading and trailing whitespace characters.
  $line =~ s/^\s+|\s+$//g;
  my @items = quotewords('\s+', 0, $line);
  my $cmd = shift @items;
  die "cannot find 'clang' in 'clang' command\n" if (!($cmd =~ /clang/));
  return \@items;
}

sub Analyze {
  my ($Clang, $OriginalArgs, $AnalyzeArgs, $Lang, $Output, $Verbose, $HtmlDir,
      $file) = @_;

  my @Args = @$OriginalArgs;
  my $Cmd;
  my @CmdArgs;
  my @CmdArgsSansAnalyses;

  if ($Lang =~ /header/) {
    exit 0 if (!defined ($Output));
    $Cmd = 'cp';
    push @CmdArgs, $file;
    # Remove the PCH extension.
    $Output =~ s/[.]gch$//;
    push @CmdArgs, $Output;
    @CmdArgsSansAnalyses = @CmdArgs;
  }
  else {
    $Cmd = $Clang;

    # Create arguments for doing regular parsing.
    my $SyntaxArgs = GetCCArgs($HtmlDir, "-fsyntax-only", \@Args);
    @CmdArgsSansAnalyses = @$SyntaxArgs;

    # Create arguments for doing static analysis.
    if (defined $ResultFile) {
      push @Args, '-o', $ResultFile;
    }
    elsif (defined $HtmlDir) {
      push @Args, '-o', $HtmlDir;
    }
    if ($Verbose) {
      push @Args, "-Xclang", "-analyzer-display-progress";
    }

    foreach my $arg (@$AnalyzeArgs) {
      push @Args, "-Xclang", $arg;
    }

    # Display Ubiviz graph?
    if (defined $ENV{'CCC_UBI'}) {
      push @Args, "-Xclang", "-analyzer-viz-egraph-ubigraph";
    }

    if (defined $AnalyzerTarget) {
      push @Args, "-target", $AnalyzerTarget;
    }

    my $AnalysisArgs = GetCCArgs($HtmlDir, "--analyze", \@Args);
    @CmdArgs = @$AnalysisArgs;
  }

  my @PrintArgs;
  my $dir;

  if ($Verbose) {
    $dir = getcwd();
    print STDERR "\n[LOCATION]: $dir\n";
    push @PrintArgs,"'$Cmd'";
    foreach my $arg (@CmdArgs) {
        push @PrintArgs,"\'$arg\'";
    }
  }
  if ($Verbose == 1) {
    # We MUST print to stderr.  Some clients use the stdout output of
    # gcc for various purposes.
    print STDERR join(' ', @PrintArgs);
    print STDERR "\n";
  }
  elsif ($Verbose == 2) {
    print STDERR "#SHELL (cd '$dir' && @PrintArgs)\n";
  }

  # Save STDOUT and STDERR of clang to a temporary file and reroute
  # all clang output to ccc-analyzer's STDERR.
  # We save the output file in the 'crashes' directory if clang encounters
  # any problems with the file.
  my ($ofh, $ofile) = tempfile("clang_output_XXXXXX", DIR => $HtmlDir);

  my $OutputStream = silent_system($HtmlDir, $Cmd, @CmdArgs);
  while ( <$OutputStream> ) {
    print $ofh $_;
    print STDERR $_;
  }
  my $Result = $?;
  close $ofh;

  # Did the command die because of a signal?
  if ($ReportFailures) {
    if ($Result & 127 and $Cmd eq $Clang and defined $HtmlDir) {
      ProcessClangFailure($Clang, $Lang, $file, \@CmdArgsSansAnalyses,
                          $HtmlDir, "Crash", $ofile);
    }
    elsif ($Result) {
      if ($IncludeParserRejects && !($file =~/conftest/)) {
        ProcessClangFailure($Clang, $Lang, $file, \@CmdArgsSansAnalyses,
                            $HtmlDir, $ParserRejects, $ofile);
      } else {
        ProcessClangFailure($Clang, $Lang, $file, \@CmdArgsSansAnalyses,
                            $HtmlDir, $OtherError, $ofile);
      }
    }
    else {
      # Check if there were any unhandled attributes.
      if (open(CHILD, $ofile)) {
        my %attributes_not_handled;

        # Don't flag warnings about the following attributes that we
        # know are currently not supported by Clang.
        $attributes_not_handled{"cdecl"} = 1;

        my $ppfile;
        while (<CHILD>) {
          next if (! /warning: '([^\']+)' attribute ignored/);

          # Have we already spotted this unhandled attribute?
          next if (defined $attributes_not_handled{$1});
          $attributes_not_handled{$1} = 1;

          # Get the name of the attribute file.
          my $dir = "$HtmlDir/failures";
          my $afile = "$dir/attribute_ignored_$1.txt";

          # Only create another preprocessed file if the attribute file
          # doesn't exist yet.
          next if (-e $afile);

          # Add this file to the list of files that contained this attribute.
          # Generate a preprocessed file if we haven't already.
          if (!(defined $ppfile)) {
            $ppfile = ProcessClangFailure($Clang, $Lang, $file,
                                          \@CmdArgsSansAnalyses,
                                          $HtmlDir, $AttributeIgnored, $ofile);
          }

          mkpath $dir;
          open(AFILE, ">$afile");
          print AFILE "$ppfile\n";
          close(AFILE);
        }
        close CHILD;
      }
    }
  }

  unlink($ofile);
}

##----------------------------------------------------------------------------##
#  Lookup tables.
##----------------------------------------------------------------------------##

my %CompileOptionMap = (
  '-nostdinc' => 0,
  '-include' => 1,
  '-idirafter' => 1,
  '-imacros' => 1,
  '-iprefix' => 1,
  '-iquote' => 1,
  '-iwithprefix' => 1,
  '-iwithprefixbefore' => 1
);

my %LinkerOptionMap = (
  '-framework' => 1,
  '-fobjc-link-runtime' => 0
);

my %CompilerLinkerOptionMap = (
  '-Wwrite-strings' => 0,
  '-ftrapv-handler' => 1, # specifically call out separated -f flag
  '-mios-simulator-version-min' => 0, # This really has 1 argument, but always has '='
  '-isysroot' => 1,
  '-arch' => 1,
  '-m32' => 0,
  '-m64' => 0,
  '-stdlib' => 0, # This is really a 1 argument, but always has '='
  '--sysroot' => 1,
  '-target' => 1,
  '-v' => 0,
  '-mmacosx-version-min' => 0, # This is really a 1 argument, but always has '='
  '-miphoneos-version-min' => 0 # This is really a 1 argument, but always has '='
);

my %IgnoredOptionMap = (
  '-MT' => 1,  # Ignore these preprocessor options.
  '-MF' => 1,

  '-fsyntax-only' => 0,
  '-save-temps' => 0,
  '-install_name' => 1,
  '-exported_symbols_list' => 1,
  '-current_version' => 1,
  '-compatibility_version' => 1,
  '-init' => 1,
  '-e' => 1,
  '-seg1addr' => 1,
  '-bundle_loader' => 1,
  '-multiply_defined' => 1,
  '-sectorder' => 3,
  '--param' => 1,
  '-u' => 1,
  '--serialize-diagnostics' => 1
);

my %LangMap = (
  'c'   => $IsCXX ? 'c++' : 'c',
  'cp'  => 'c++',
  'cpp' => 'c++',
  'cxx' => 'c++',
  'txx' => 'c++',
  'cc'  => 'c++',
  'C'   => 'c++',
  'ii'  => 'c++-cpp-output',
  'i'   => $IsCXX ? 'c++-cpp-output' : 'c-cpp-output',
  'm'   => 'objective-c',
  'mi'  => 'objective-c-cpp-output',
  'mm'  => 'objective-c++',
  'mii' => 'objective-c++-cpp-output',
);

my %UniqueOptions = (
  '-isysroot' => 0
);

##----------------------------------------------------------------------------##
# Languages accepted.
##----------------------------------------------------------------------------##

my %LangsAccepted = (
  "objective-c" => 1,
  "c" => 1,
  "c++" => 1,
  "objective-c++" => 1,
  "c-cpp-output" => 1,
  "objective-c-cpp-output" => 1,
  "c++-cpp-output" => 1
);

##----------------------------------------------------------------------------##
#  Main Logic.
##----------------------------------------------------------------------------##

my $Action = 'link';
my @CompileOpts;
my @LinkOpts;
my @Files;
my $Lang;
my $Output;
my %Uniqued;

# Forward arguments to gcc.
my $Status = system($Compiler,@ARGV);
if (defined $ENV{'CCC_ANALYZER_LOG'}) {
  print STDERR "$Compiler @ARGV\n";
}
if ($Status) { exit($Status >> 8); }

# Get the analysis options.
my $Analyses = $ENV{'CCC_ANALYZER_ANALYSIS'};

# Get the plugins to load.
my $Plugins = $ENV{'CCC_ANALYZER_PLUGINS'};

# Get the store model.
my $StoreModel = $ENV{'CCC_ANALYZER_STORE_MODEL'};

# Get the constraints engine.
my $ConstraintsModel = $ENV{'CCC_ANALYZER_CONSTRAINTS_MODEL'};

#Get the internal stats setting.
my $InternalStats = $ENV{'CCC_ANALYZER_INTERNAL_STATS'};

# Get the output format.
my $OutputFormat = $ENV{'CCC_ANALYZER_OUTPUT_FORMAT'};
if (!defined $OutputFormat) { $OutputFormat = "html"; }

# Get the config options.
my $ConfigOptions = $ENV{'CCC_ANALYZER_CONFIG'};

# Determine the level of verbosity.
my $Verbose = 0;
if (defined $ENV{'CCC_ANALYZER_VERBOSE'}) { $Verbose = 1; }
if (defined $ENV{'CCC_ANALYZER_LOG'}) { $Verbose = 2; }

# Get the HTML output directory.
my $HtmlDir = $ENV{'CCC_ANALYZER_HTML'};

my %DisabledArchs = ('ppc' => 1, 'ppc64' => 1);
my %ArchsSeen;
my $HadArch = 0;
my $HasSDK = 0;

# Process the arguments.
foreach (my $i = 0; $i < scalar(@ARGV); ++$i) {
  my $Arg = $ARGV[$i];
  my ($ArgKey) = split /=/,$Arg,2;

  # Be friendly to "" in the argument list.
  if (!defined($ArgKey)) {
    next;
  }

  # Modes ccc-analyzer supports
  if ($Arg =~ /^-(E|MM?)$/) { $Action = 'preprocess'; }
  elsif ($Arg eq '-c') { $Action = 'compile'; }
  elsif ($Arg =~ /^-print-prog-name/) { exit 0; }

  # Specially handle duplicate cases of -arch
  if ($Arg eq "-arch") {
    my $arch = $ARGV[$i+1];
    # We don't want to process 'ppc' because of Clang's lack of support
    # for Altivec (also some #defines won't likely be defined correctly, etc.)
    if (!(defined $DisabledArchs{$arch})) { $ArchsSeen{$arch} = 1; }
    $HadArch = 1;
    ++$i;
    next;
  }

  # On OSX/iOS, record if an SDK path was specified.  This
  # is innocuous for other platforms, so the check just happens.
  if ($Arg =~ /^-isysroot/) {
    $HasSDK = 1;
  }

  # Options with possible arguments that should pass through to compiler.
  if (defined $CompileOptionMap{$ArgKey}) {
    my $Cnt = $CompileOptionMap{$ArgKey};
    push @CompileOpts,$Arg;
    while ($Cnt > 0) { ++$i; --$Cnt; push @CompileOpts, $ARGV[$i]; }
    next;
  }
  # Handle the case where there isn't a space after -iquote
  if ($Arg =~ /^-iquote.*/) {
    push @CompileOpts,$Arg;
    next;
  }

  # Options with possible arguments that should pass through to linker.
  if (defined $LinkerOptionMap{$ArgKey}) {
    my $Cnt = $LinkerOptionMap{$ArgKey};
    push @LinkOpts,$Arg;
    while ($Cnt > 0) { ++$i; --$Cnt; push @LinkOpts, $ARGV[$i]; }
    next;
  }

  # Options with possible arguments that should pass through to both compiler
  # and the linker.
  if (defined $CompilerLinkerOptionMap{$ArgKey}) {
    my $Cnt = $CompilerLinkerOptionMap{$ArgKey};

    # Check if this is an option that should have a unique value, and if so
    # determine if the value was checked before.
    if ($UniqueOptions{$Arg}) {
      if (defined $Uniqued{$Arg}) {
        $i += $Cnt;
        next;
      }
      $Uniqued{$Arg} = 1;
    }

    push @CompileOpts,$Arg;
    push @LinkOpts,$Arg;

    while ($Cnt > 0) {
      ++$i; --$Cnt;
      push @CompileOpts, $ARGV[$i];
      push @LinkOpts, $ARGV[$i];
    }
    next;
  }

  # Ignored options.
  if (defined $IgnoredOptionMap{$ArgKey}) {
    my $Cnt = $IgnoredOptionMap{$ArgKey};
    while ($Cnt > 0) {
      ++$i; --$Cnt;
    }
    next;
  }

  # Compile mode flags.
  if ($Arg =~ /^-(?:[DIU]|isystem)(.*)$/) {
    my $Tmp = $Arg;
    if ($1 eq '') {
      # FIXME: Check if we are going off the end.
      ++$i;
      $Tmp = $Arg . $ARGV[$i];
    }
    push @CompileOpts,$Tmp;
    next;
  }

  if ($Arg =~ /^-m.*/) {
    push @CompileOpts,$Arg;
    next;
  }

  # Language.
  if ($Arg eq '-x') {
    $Lang = $ARGV[$i+1];
    ++$i; next;
  }

  # Output file.
  if ($Arg eq '-o') {
    ++$i;
    $Output = $ARGV[$i];
    next;
  }

  # Get the link mode.
  if ($Arg =~ /^-[l,L,O]/) {
    if ($Arg eq '-O') { push @LinkOpts,'-O1'; }
    elsif ($Arg eq '-Os') { push @LinkOpts,'-O2'; }
    else { push @LinkOpts,$Arg; }

    # Must pass this along for the __OPTIMIZE__ macro
    if ($Arg =~ /^-O/) { push @CompileOpts,$Arg; }
    next;
  }

  if ($Arg =~ /^-std=/) {
    push @CompileOpts,$Arg;
    next;
  }

  # Get the compiler/link mode.
  if ($Arg =~ /^-F(.+)$/) {
    my $Tmp = $Arg;
    if ($1 eq '') {
      # FIXME: Check if we are going off the end.
      ++$i;
      $Tmp = $Arg . $ARGV[$i];
    }
    push @CompileOpts,$Tmp;
    push @LinkOpts,$Tmp;
    next;
  }

  # Input files.
  if ($Arg eq '-filelist') {
    # FIXME: Make sure we aren't walking off the end.
    open(IN, $ARGV[$i+1]);
    while (<IN>) { s/\015?\012//; push @Files,$_; }
    close(IN);
    ++$i;
    next;
  }

  if ($Arg =~ /^-f/) {
    push @CompileOpts,$Arg;
    push @LinkOpts,$Arg;
    next;
  }

  # Handle -Wno-.  We don't care about extra warnings, but
  # we should suppress ones that we don't want to see.
  if ($Arg =~ /^-Wno-/) {
    push @CompileOpts, $Arg;
    next;
  }

  # Handle -Xclang some-arg. Add both arguments to the compiler options.
  if ($Arg =~ /^-Xclang$/) {
    # FIXME: Check if we are going off the end.
    ++$i;
    push @CompileOpts, $Arg;
    push @CompileOpts, $ARGV[$i];
    next;
  }

  if (!($Arg =~ /^-/)) {
    push @Files, $Arg;
    next;
  }
}

# If we are on OSX and have an installation where the
# default SDK is inferred by xcrun use xcrun to infer
# the SDK.
if (not $HasSDK and $UseXCRUN) {
  my $sdk = `/usr/bin/xcrun --show-sdk-path -sdk macosx`;
  chomp $sdk;
  push @CompileOpts, "-isysroot", $sdk;
}

if ($Action eq 'compile' or $Action eq 'link') {
  my @Archs = keys %ArchsSeen;
  # Skip the file if we don't support the architectures specified.
  exit 0 if ($HadArch && scalar(@Archs) == 0);

  foreach my $file (@Files) {
    # Determine the language for the file.
    my $FileLang = $Lang;

    if (!defined($FileLang)) {
      # Infer the language from the extension.
      if ($file =~ /[.]([^.]+)$/) {
        $FileLang = $LangMap{$1};
      }
    }

    # FileLang still not defined?  Skip the file.
    next if (!defined $FileLang);

    # Language not accepted?
    next if (!defined $LangsAccepted{$FileLang});

    my @CmdArgs;
    my @AnalyzeArgs;

    if ($FileLang ne 'unknown') {
      push @CmdArgs, '-x', $FileLang;
    }

    if (defined $StoreModel) {
      push @AnalyzeArgs, "-analyzer-store=$StoreModel";
    }

    if (defined $ConstraintsModel) {
      push @AnalyzeArgs, "-analyzer-constraints=$ConstraintsModel";
    }

    if (defined $InternalStats) {
      push @AnalyzeArgs, "-analyzer-stats";
    }

    if (defined $Analyses) {
      push @AnalyzeArgs, split '\s+', $Analyses;
    }

    if (defined $Plugins) {
      push @AnalyzeArgs, split '\s+', $Plugins;
    }

    if (defined $OutputFormat) {
      push @AnalyzeArgs, "-analyzer-output=" . $OutputFormat;
      if ($OutputFormat =~ /plist/) {
        # Change "Output" to be a file.
        my ($h, $f) = tempfile("report-XXXXXX", SUFFIX => ".plist",
                               DIR => $HtmlDir);
        $ResultFile = $f;
        # If the HtmlDir is not set, we should clean up the plist files.
        if (!defined $HtmlDir || -z $HtmlDir) {
          $CleanupFile = $f;
        }
      }
    }
    if (defined $ConfigOptions) {
      push @AnalyzeArgs, split '\s+', $ConfigOptions;
    }

    push @CmdArgs, @CompileOpts;
    push @CmdArgs, $file;

    if (scalar @Archs) {
      foreach my $arch (@Archs) {
        my @NewArgs;
        push @NewArgs, '-arch', $arch;
        push @NewArgs, @CmdArgs;
        Analyze($Clang, \@NewArgs, \@AnalyzeArgs, $FileLang, $Output,
                $Verbose, $HtmlDir, $file);
      }
    }
    else {
      Analyze($Clang, \@CmdArgs, \@AnalyzeArgs, $FileLang, $Output,
              $Verbose, $HtmlDir, $file);
    }
  }
}
