#!/usr/bin/perl -I/Users/duke/src/kde/kdebindings/kalyptus
# -*- indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-

# KDOC -- C++ and CORBA IDL interface documentation tool.
# Sirtaj Singh Kang <taj@kde.org>, Jan 1999.
# $Id: kalyptus 383034 2005-01-27 22:10:22Z dfaure $

# All files in this project are distributed under the GNU General
# Public License. This is Free Software.

require 5.000;

use Carp;
use Getopt::Long;
use File::Basename;
use strict;

use Ast;

use kdocUtil;
use kdocAstUtil;
use kdocParseDoc;

use vars qw/ %rootNodes $declNodeType @includes_list %options @formats_wanted $allow_k_dcop_accessors
	$skipInternal %defines $defines $match_qt_defines
	$libname $outputdir $parse_global_space $striphpath $doPrivate $readstdin
	$Version $quiet $debug $debuggen $parseonly $currentfile $cSourceNode $exe
	%formats %flagnames @allowed_k_dcop_accesors $allowed_k_dcop_accesors_re $rootNode 
	@classStack $cNode $globalSpaceClassName
	$lastLine $docNode @includes $cpp $defcppcmd $cppcmd $docincluded
	$inExtern $inNamespace %stats %definitions @inputqueue @codeqobject /;

## globals

%rootNodes = ();			# root nodes for each file type
$declNodeType = undef;			# last declaration type

@includes_list = ();			# list of files included from the parsed .h

# All options

%options = ();				# hash of options (set getopt below)
@formats_wanted = ();

$libname = "";
$outputdir = ".";

$striphpath = 0;

$doPrivate = 0;
$Version = "0.9";

$quiet = 0;
$debug = 0;
$debuggen = 0;
$parseonly = 0;
$globalSpaceClassName = "QGlobalSpace";

$currentfile = "";

$cpp = 0;
$defcppcmd = "g++ -Wp,-C -E";
$cppcmd = "";

$exe = basename $0;

@inputqueue = ();
@codeqobject = split "\n", <<CODE;
public:
    virtual QMetaObject *metaObject() const;
    virtual const char *className() const;
    virtual void* qt_cast( const char* );
    virtual bool qt_invoke( int, QUObject* );
    virtual bool qt_emit( int, QUObject* );
    virtual bool qt_property( int, int, QVariant* );
    static QMetaObject* staticMetaObject();
    QObject* qObject();
    static QString tr( const char *, const char * = 0 );
    static QString trUtf8( const char *, const char * = 0 );
private:
CODE

# Supported formats
%formats = ( "dcopidl" => "kalyptusCxxToDcopIDL" );

# these are for expansion of method flags
%flagnames = ( v => 'virtual', 's' => 'static', p => 'pure',
	c => 'const', l => 'slot', i => 'inline', n => 'signal',
 	d => 'k_dcop', z => 'k_dcop_signals', y => 'k_dcop_hidden' );

@allowed_k_dcop_accesors = qw(k_dcop k_dcop_hidden k_dcop_signals);
$allowed_k_dcop_accesors_re = join("|", @allowed_k_dcop_accesors);

%definitions = {
    _STYLE_CDE => '',
    _STYLE_MOTIF => '',
    _STYLE_MOTIF_PLUS => '',
    PLUS => '',
    _STYLE_PLATINUM => '',
    _STYLE_SGI => '',
    _STYLE_WINDOWS => '',
    QT_STATIC_CONST => 'static const',
    Q_EXPORT => '',
    Q_REFCOUNT => '',
    QM_EXPORT_CANVAS => '',
    QM_EXPORT_DNS => '',
    QM_EXPORT_ICONVIEW => '',
    QM_EXPORT_NETWORK => '',
    QM_EXPORT_SQL => '',
    QM_EXPORT_WORKSPACE => '',
    QT_NO_REMOTE => 'QT_NO_REMOTE',
    QT_ACCESSIBILITY_SUPPORT => 'QT_ACCESSIBILITY_SUPPORT',
    Q_WS_X11 => 'Q_WS_X11',
    Q_DISABLE_COPY => 'Q_DISABLE_COPY',
    Q_WS_QWS => 'undef',
    Q_WS_MAC => 'undef',
    Q_OBJECT => <<'CODE',
public:
    virtual QMetaObject *metaObject() const;
    virtual const char *className() const;
    virtual bool qt_invoke( int, QUObject* );
    virtual bool qt_emit( int, QUObject* );
    static QString tr( const char *, const char * = 0 );
    static QString trUtf8( const char *, const char * = 0 );
private:
CODE
};

=head1 KDOC -- Source documentation tool

	Sirtaj Singh Kang <taj@kde.org>, Dec 1998.

=cut

# read options

Getopt::Long::config qw( no_ignore_case permute bundling auto_abbrev );

GetOptions( \%options,
	"format|f=s", \@formats_wanted,
	"url|u=s",
	"skip-internal", \$skipInternal,
	"skip-deprecated|e",
	"document-all|a",
	"compress|z",
	# HTML options
	"html-cols=i",
	"html-logo=s",

	"strip-h-path",	\$striphpath,
	"outputdir|d=s", \$outputdir,
	"stdin|i",	\$readstdin,
	"name|n=s",	\$libname,
	"version|v|V", 	\&show_version,
	"private|p",	\$doPrivate,
	"globspace",	\$parse_global_space,
	"allow_k_dcop_accessors", \$allow_k_dcop_accessors,

	"cpp|P",	\$cpp,
	"docincluded",  \$docincluded,
	"cppcmd|C=s",	\$cppcmd,
	"includedir|I=s", \@includes,
	"define=s", \%defines, # define a single preprocessing symbol
	"defines=s", \$defines, # file containing preprocessing symbols, one per line

	"quiet|q",	\$quiet,
	"debug|D",	\$debug, # debug the parsing
	"debuggen",	\$debuggen, # debug the file generation
	"parse-only",	\$parseonly )
		|| exit 1;

$| = 1 if $debug or $debuggen;

# preprocessor settings

if ( $cppcmd eq "" ) {
	$cppcmd = $defcppcmd;
}
else {
	$cpp = 1;
}

if ( $#includes >= 0 && !$cpp ) {
	die "$exe: --includedir requires --cpp\n";
}

# Check output formats. HTML is the default
if( $#formats_wanted < 0 ) {
	push @formats_wanted, "java";
}

foreach my $format ( @formats_wanted ) {
	die "$exe: unsupported format '$format'.\n"
		if !defined $formats{$format};
}

if( $defines )
{
    open( DEFS, $defines ) or die "Couldn't open $defines: $!\n";
    my @defs = <DEFS>;
    chomp @defs;
    close DEFS;
    foreach (@defs)
    {
        $defines{ $_ } = 1 unless exists $defines{ $_ };
    }
}

# Check the %defines hash for QT_* symbols and compile the corresponding RE
# Otherwise, compile the default ones. Used for filtering in readCxxLine.
if ( my @qt_defines = map { ($_=~m/^QT_(.*)/)[0] } keys %defines)
{
    my $regexp = "m/^#\\s*ifn?def\\s+QT_(?:" . join('|', map { "\$qt_defines[$_]" } 0..$#qt_defines).")/o";
    $match_qt_defines = eval "sub { my \$s=shift;
                                   \$s=~/^#\\s*if(n)?def/ || return 0;
                                   if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)                         if(!\$1)              