package RPS::Sale::File;

use strict;
use Data::Dumper;
#use warnings;

use Devel::Peek;
use Encode;

use Spreadsheet::ParseExcel;

use Text::CSV_XS;
use Date::Calc qw(Add_Delta_YMD Add_Delta_Days);
use Time::HiRes qw(gettimeofday);

# built in perl func
use File::Copy;

use lib '/app/tools/sale_import/lib';
use lib '/app/tools/rps/lib';
use RPS::Import::Service;

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Log;
use Common::File::UTF16;
use Common::File::UTF8;
use Common::UTF8;
use Common::Spreadsheet;

use lib '/app/tools/cpan/lib';
use RS::Spreadsheet::XLSX; # See Case 19256

use lib '/app/tools/data_classes/lib';
use RPS::File::File;
use Client::Service;
use Client::Client;

use base 'Sale::File';

# ------------------------
# Public Methods
# ------------------------

sub BaseDirectory
{
    # !!! Update this to use the config system?
    return "/app/shared/sale_import";
}

sub SimpleUploadFromShell
{
    my %args = @_;

    die "missing client_id\n" unless ($args{client_id});
    my $client = new Client::Client(client_id => $args{client_id});
    my $client_name = Common::Util::clean_name($client->ClientName);

    die "missing file path\n" unless ($args{filepath});
    my ($orig_file_name) = $args{filepath} =~ m/.*\/(.+?)$/;
    $orig_file_name ||= $args{filepath};

    my $uploadDir = BaseDirectory() . "/$client_name";
    if(!-e $uploadDir)
    {
        `mkdir $uploadDir`;
    }

    my ($year, $month, undef) = split('-', Common::Util::today());
    $uploadDir .= "/$year$month";
    if(!-e $uploadDir)
    {
        `mkdir $uploadDir`;
    }

    my $timestamp = _getTimeStamp();
    my $ext = $orig_file_name;
    $ext = ($ext =~ /\.(\w+)$/) ? ".$1" : "";
    my $final_file_name = $timestamp.$ext;
    my $final_file_path = $uploadDir."/".$final_file_name;
    print STDERR "SimpleUploadFromShell: saving src file to $final_file_path\n";
    copy($args{filepath}, $final_file_path) or die "copy failed: $!\n";

    # save file info to database
    my $file = RPS::File::File->new(client_id => $args{client_id});
    $file->PeriodID(0);
    $file->FileDir($uploadDir);
    $file->FileName($final_file_name);
    $file->OrigFileName($orig_file_name);
    $file->MD5Sum($args{md5_sum});
    $file->Save() or die "failed to save to db\n";

    if($file->FileID)
    {
        print STDERR "SimpleUploadFromShell: file info has been saved, file_id = ".$file->FileID."\n";
        return $file->FileID;
    }
    else
    {
        return undef;
    }
}

sub SimpleUploadFromWeb
{
	my $self = shift;
	my %args = @_;

	# get input params
	my $orig_file_name = $args{filename} || return $self->bail("missing file name");
	my $fh = $args{fh} || return $self->bail("missing file handle");

	# client info (is there a better way to get client_id?)
	my $client_id = $ENV{CLIENT_ID} or return undef;
	my $client = new Client::Client(client_id => $client_id);
	my $client_name = Common::Util::clean_name($client->ClientName);

	my $uploadDir = BaseDirectory() . "/$client_name";
	if(!-e $uploadDir)
	{
		`mkdir $uploadDir`;
	}

	my ($year, $month, undef) = split('-', Common::Util::today());
	$uploadDir .= "/$year$month";
	if(!-e $uploadDir)
	{
		`mkdir $uploadDir`;
	}

	my $timestamp = _getTimeStamp();
	my $ext = $orig_file_name;
	$ext = ($ext =~ /\.(\w\w\w\w?)$/) ? ".$1" : "";
	my $final_file_name = $timestamp.$ext;
	my $final_file_path = $uploadDir."/".$final_file_name;
	print STDERR "SimpleUploadFromWeb: saving  upload to tmp location: $final_file_path\n";

	open(TMP, ">$final_file_path") or return $self->bail("couldn't write to disk");
	binmode(TMP);
	while(<$fh>)
	{
		print TMP;
	}
	close(TMP);

	# save file info to database
	my $file = RPS::File::File->new();
	$file->PeriodID(0);
	$file->FileDir($uploadDir);
	$file->FileName($final_file_name);
	$file->OrigFileName($orig_file_name);
    $file->UserID(Common::RSApp::GetActiveUserID());
	$file->MD5Sum($args{md5_sum});
	$file->Save() or return $self->bail("couldn't save file to db");

	if($file->FileID)
	{
		print STDERR "SimpleUploadFromWeb: file info has been saved, file_id = ".$file->FileID."\n";
		return $file->FileID;
	}
	else
	{
		return undef;
	}
}


sub ParseFull
{
	my $self = shift;
	my %args = @_;

	$self->_init();

	my $client_id = $args{client_id};
	my $file_obj = $args{file};

	if (!$client_id)
	{
		$self->errstr("Client ID not specified");
		return undef;
	}

	if (!$file_obj)
	{
		$self->errstr("File object not provided");
		return undef;
	}

	my $path_to_import_file = $args{file_path} || $file_obj->FileDir."/".$file_obj->FileName;
	$self->{path} = $path_to_import_file;

	if(!-e $path_to_import_file)
	{
		$self->errstr("File $path_to_import_file does not exist");
		return undef;
	}

	print STDERR "ParseFull: reading file: $path_to_import_file\n";
	my $aref_lines_array;
	my $sheets_aref = [];
	my $sheetnames_aref = [];

	my $fileName = lc($file_obj->FileName);
	my $fileExtension;
	if ($fileName =~ m/(\.[a-z]+)$/)
	{
	  $fileExtension = $1;
	}

	my $fileType;
	my $utf16File = new Common::File::UTF16( $path_to_import_file );
	my $utf8File = new Common::File::UTF8( $path_to_import_file );

	# The only type of binary file that we can really handle is an excel spreadsheet,
	# so we're excluding .csv files here.
	# One day we hope to have a more robust solution to all this file handling stuff.
	if (-B $path_to_import_file && $fileExtension =~ /.xlsx?/ )
	{
	  $fileType = "excel";
	}
	elsif( $utf8File->isValid() ) {
		$fileType = "utf8";
	}
	elsif( $utf16File->isValid() ) {
		$fileType = "utf16";
	}
	# .cvs files should be treated like text files and ignore all PDF files
	elsif ((-T $path_to_import_file && $fileExtension ne '.pdf') || $fileExtension eq '.csv')
	{
	  $fileType = "text";
	}
	else
	{
        $self->errstr('File not identified');
    		return undef;
	}

	if ($fileType eq 'excel')
	{
		print STDERR "ParseFull: reading excel file\n";
        my $sheet_data = $self->_read_excel_file() || return undef;

        $sheets_aref = $sheet_data->[0];
        $sheetnames_aref = $sheet_data->[1];

		unless (ref($sheets_aref->[0]) eq 'ARRAY')
        {
            $self->errstr('Failed to read excel file');
            return undef;
        }

		# for backwards compatibility
		$aref_lines_array = $sheets_aref->[0];
	}
	elsif ($fileType eq 'text')
	{
		print STDERR "ParseFull: reading text file\n";
		$aref_lines_array = $self->_read_ascii_file();
		unless (ref($aref_lines_array->[0]) eq 'ARRAY')
        {
            $self->errstr('Failed to read text file') unless ($self->errstr() && '' ne $self->errstr());
            return undef;
        }

		# back-populate the single sheet
		$sheets_aref->[0] = $aref_lines_array;
	}
	elsif ($fileType eq 'utf16' ) {
		print STDERR "ParseFull: reading utf16 text file\n";
		$aref_lines_array = $self->_read_utf16_file( file => $utf16File );
		unless (ref($aref_lines_array->[0]) eq 'ARRAY')
        {
            $self->errstr('Failed to read utf16 text file') unless ($self->errstr() && '' ne $self->errstr());
            return undef;
        }

		# back-populate the single sheet
		$sheets_aref->[0] = $aref_lines_array;
	}
	elsif ($fileType eq 'utf8' ) {
		print STDERR "ParseFull: reading utf8 text file\n";
		$aref_lines_array = $self->_read_utf8_file( file => $utf8File );
		unless (ref($aref_lines_array->[0]) eq 'ARRAY')
        {
            $self->errstr('Failed to read utf8 text file') unless ($self->errstr() && '' ne $self->errstr());
            return undef;
        }

		# back-populate the single sheet
		$sheets_aref->[0] = $aref_lines_array;
	}

    print STDERR "ParseFull: determining service/version\n";
    if ($args{service_id} && $args{version})
    {
        print STDERR "ParseFull: forcing to service $args{service_id} : $args{version}\n";
        $self->{service_id} = $args{service_id};
        $self->{version_num} = $args{version};
    }
    elsif ($self->PreParse($sheets_aref, $file_obj->OrigFileName))
	{
		print STDERR "ParseFull: PreParse determined file service is $self->{service_id}, version $self->{version_num}\n";
    }
	else
	{
        $self->errstr('File not identified');
		return undef;
	}

    if($self->{service_id} == 262 && $self->{possible_quote} == 1) {
        $self->{path} = $path_to_import_file;
        $aref_lines_array = $self->_read_ascii_file(clean_quotes => 1);
        $sheets_aref->[0] = $aref_lines_array;
        $self->{delimiter} = "\t";
    }

    Client::Service::AddService(client_id => $client_id, service_id => $self->{service_id});
    $file_obj->ServiceID($self->{service_id});
    $file_obj->VersionNum($self->{version_num});
    $file_obj->TypeID($self->{type_id});

    ## indicate if it's a physical sales file
    ## clean this later... maybe some flag in the Client::Service
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_NAVARRE);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_FAITHWORKS);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_ECHO);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_DTTHIRDPARTY);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_DTARTISTDIRECT);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_DTINTERNATIONAL);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_BMG);
    #$file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_RYKODISC);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_DOCK);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_FUSION);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_ROOTSY);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_ROUGHTRADEDIST);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_RED);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_KOCHENTCANADA);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_HARMONIAMUNDI);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_FONTANA);
    #$file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_PROPERUK);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_KOCH_PHYSICAL);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_LOOKOUTDIRECT);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_LMMGSALES);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_PIAS_PHYSICAL);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_BMG_COLUMBIAHOUSE);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_SANCT_HISTORICAL);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_ADAPHYS);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_BMG_SONY);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_SHELLSHOCK);
    #$file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_CAROLINE);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_DOWNLOADCENTRIC);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_WELK);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_OUTSIDEMUSIC);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_SDROUTSIDESALES);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_TOUCHNGOPHYS);
    $file_obj->Physical(1) if ($self->{service_id} == Client::Service::DSP_NAXOS_PHYSICAL);

    $file_obj->Save();
    sleep(4);

	print STDERR "calling importer...\n";

    my %constructionArgs = (
        service_id => $file_obj->ServiceID,
        version_num => $file_obj->VersionNum,
    );
    if ($args{sale_object_class})
    {
        $constructionArgs{sale_object_class} = $args{sale_object_class};
    }

	my $importer = RPS::Import::Service->new(%constructionArgs);

	if( $importer && $importer->physical ) {
		$file_obj->Physical(1);
		$file_obj->Save();
	}

	# if we parsed an excel file then
	# we will have an arrayref or arrayrefs (ie. sheets)
	# so pass those as a 'sheets' param in leui of a 'lines' param

    my %importArgs = (
        client_id => $client_id,
		file => $file_obj,
		lines => $aref_lines_array,
		sheets => $sheets_aref,
		sheet_names => $sheetnames_aref,
    );

    # If the workbook is using a 1904-based epoch for dates, pass
    # this information to the importer in case it needs to process
    # encoded dates using ExcelFmt.
    #
    $importArgs{Flg1904} = 1 if( $self->{Flg1904} );


	my $result = $importer->Import(%importArgs);

    $self->errstr($importer->errstr());
    return $result;
}

sub PreParse
{
    my $self = shift;
    my $sheets = shift;
    my $file_name = shift;

    $self->_init();

    my $rules = $self->_file_match_rules();

    my $service_id_found = 0;
    my $version_num_found = 0;
    RULE:
    foreach my $rule (@$rules)
    {
        my $service_id = $rule->{service};
        my $version_num = $rule->{version};
        my $row_limit = $rule->{limit} || 80;

		Common::Log::Debug("======== SERVICE: $service_id, VERSION: $version_num ===========================");

        if ($rule->{file_name})
        {
            my $fname_match = $rule->{file_name};
            if ($file_name !~ m/$fname_match/i)
            {
                next RULE;
            }
        }

        # default to the first sheet
        my $data_sheet_index = $rule->{sheet} || 0;
        my $i = 0;
        SHEET:
        foreach my $sheet(@$sheets)
        {
            if (ref($sheet) ne 'ARRAY' or ($data_sheet_index ne 'any' and $data_sheet_index != $i))
            {
                $i++;
                next SHEET;
            }

            my $data = $rule->{lines};

            if ($rule->{match_on_any_row})
            {
                # look for header match on any of the first $row_limit rows
                my $limit = scalar @$sheet;
                $limit = $row_limit if ($limit > $row_limit);

                OFFSET:
                for (my $offset = 0; $offset < $limit; $offset++)
                {
                    for (my $row = 0; $row < scalar @$data; $row++)
                    {
                        for (my $col = 0; $col < scalar @{$data->[$row]}; $col++)
                        {
                            my $loc = 'Sheet ' . $i .' ' . perl_index_to_spreadsheet_loc( $row+$offset , $col );
                            my $regex   = defined($data->[$row][$col]) ? '/'.$data->[$row][$col].'/' : 'undef';
                            my $cellval = defined($sheet->[$row+$offset][$col]) ? "'" . $sheet->[$row+$offset][$col] . "'" : 'undef';
                            Common::Log::Debug( "HEADER: $loc $cellval =~ $regex" );
                            if (defined $data->[$row][$col])
                            {
                                if ($sheet->[$row + $offset][$col] =~ m/$data->[$row][$col]/i)
                                {
                                    $service_id_found = $service_id;
                                    $version_num_found = $version_num;
                                }
                                else
                                {
                                    $service_id_found = 0;
                                    $version_num_found = 0;
                                    next OFFSET;
                                }
                            }
                        }
                    }
                    last OFFSET if ($service_id_found);
                }
            }
            else
            {
                for (my $row = 0; $row < scalar @$data; $row++)
                {
                    for (my $col = 0; $col < scalar @{$data->[$row]}; $col++)
                    {
                        my $loc = 'Sheet ' . $i .' ' . perl_index_to_spreadsheet_loc( $row, $col );
                        my $regex   = defined($data->[$row][$col]) ? '/'.$data->[$row][$col].'/' : 'undef';
                        my $cellval = defined($sheet->[$row][$col]) ? "'" . $sheet->[$row][$col] . "'" : 'undef';
                        Common::Log::Debug( "HEADER: $loc $cellval =~ $regex" );
                        if (defined $data->[$row][$col])
                        {
                            if ($sheet->[$row][$col] =~ m/$data->[$row][$col]/i)
                            {
                                $service_id_found = $service_id;
                                $version_num_found = $version_num;
                            }
                            else
                            {
                                $service_id_found = 0;
                                $version_num_found = 0;
                                $i++;
                                next SHEET;
                            }
                        }
                    }
                }
            }

            if ($service_id_found)
            {
                $self->{service_id} = $service_id_found;
                $self->{version_num} = $version_num_found;
                return $service_id_found;
            }
            $i++;
        }
    }

    $self->errstr("Unrecognized file format");
    return undef;
}


# accessor methods


sub GetServiceID {
  my $self = shift;

  return $self->{service_id};
}


sub GetVersionNum {
  my $self = shift;

  return $self->{version_num};
}


sub GetFileType {
  my $self = shift;

  if ($self->{file_type} eq 'e') {
    return File::File::FILETYPE_EXCEL;
  }
  elsif ($self->{file_type} eq 't') {
    if ($self->{delimiter} eq "\t") {
      return File::File::FILETYPE_TABSEP;
    }
    elsif ($self->{delimiter} eq '\|') {
      return File::File::FILETYPE_PIPESEP;
    }
    elsif ($self->{delimiter} eq ',') {
      return File::File::FILETYPE_COMMASEP;
    }
  }

  return undef;
}

sub errstr
{
  my $self = shift;
  if (@_)
  {
    $self->{errstr} = shift;
    print STDERR $self->{errstr} . "\n";
  }
  return $self->{errstr};
}

sub bail
{
	my $self = shift;
	my $err = shift;

    $self->errstr($err) if (defined $err);

	return undef;
}

# private methods


sub _init {
  my $self = shift;

  $self->{path} = undef;
  $self->{header} = undef;
  $self->{service_id} = undef;
  $self->{version_num} = undef;
  $self->{file_type} = undef;
  $self->{delimiter} = undef;
  $self->{errstr} = undef;
}

sub _saveToDisk
{
	my $self = shift;
	my %args = @_;

	my $service_id = $args{service_id} or return undef;
	# my $period_id = $args{period_id} or return undef;
	my $source_file = $args{src} or return undef;
	return undef if(!-s $source_file);

	# client info (is there a better way to get client_id?)
	my $client_id = $ENV{CLIENT_ID} or return undef;
	my $client = new Client::Client(client_id => $client_id);
	my $client_name = Common::Util::clean_name($client->ClientName);

	# service info
	my $service = new Client::Service(service_id => $service_id);
	my $service_name = Common::Util::clean_name($service->ServiceName);

	my $timestamp = _getTimeStamp();
	my $ext = $source_file;
	$ext = ($ext =~ /\.(\w\w\w)$/) ? ".$1" : "";

	# setup the dirs
	my $base_dir = BaseDirectory();
	my $client_dir = "$base_dir/$client_name";
	my $dest_dir = "$client_dir/$service_name";
	my $new_file_name = $timestamp.$ext;
	my $final_file_path = "$dest_dir/$new_file_name";

	if(!-d $client_dir)
	{
		mkdir($client_dir) or return undef;
	}
	if(!-d $dest_dir)
	{
		mkdir($dest_dir) or return undef;
	}

	# do it. do it now.
	rename($source_file, $final_file_path) or return undef;

	return $final_file_path;
}

sub _getTimeStamp
{
	# I get YYYY-MM-DD HH:MM:SS
	my $today = Common::Util::today_and_now();

	# return YYYYMMDDHHMMSS
	$today =~ s/\D//g;
	
  # Now that we can upload multiple files at one time, 
  # we need to be more precise.
  my ($seconds, $microseconds) = gettimeofday;
  $microseconds = substr($microseconds,0,3);
  $today .= $microseconds;	

	return $today;
}

sub _read_utf16_file {
	my $self = shift;
	my %args = @_;
	my $utf16File = $args{file};

	my $lines = $utf16File->read();

	$self->{delimiter} = Common::Util::GetDelimiter( join( "\n", @$lines ) );

	if( $self->{delimiter} ) {
	    return $self->_read_text_file( %args, lines => $lines );
	} else {
        $self->errstr('Can not determine delimeter');
		return ();
	}
}

sub _read_utf8_file {
	my $self = shift;
	my %args = @_;

	my $utf8File = $args{file};
	my $lines = $utf8File->read();

	$self->{delimiter} = Common::Util::GetDelimiter( join( "\n", @$lines ) );

	if( $self->{delimiter} ) {
	    return $self->_read_text_file( %args, lines => $lines );
	} else {
        $self->errstr('Can not determine delimeter');
		return ();
	}
}

sub _read_ascii_file {
	my $self = shift;
	my %args = @_;
	my $file = $self->{path};

    unless (open FILE, $file)
    {
	    $self->errstr("Can't open file $file: $!");
	    return undef;
    }

	$self->{delimiter} = Common::Util::GetDelimiter(*FILE);

	# We used to use ReadMostTextFiles(), but in Case 5717 we encountered a situation
	# where a client tried to import a file containing embedded carriage returns.  The
	# bookpub version strips out any embedded carriage returns.
	#
	my $lines = Common::Util::ReadBookPubTextFiles(*FILE);
	close FILE;
	
	return $self->_read_text_file( %args, lines => $lines );

    #if( $self->{delimiter} ) {
    #    return $self->_read_text_file( %args, lines => $lines );
    #} else {
    #    $self->errstr('Can not determine delimeter');
    #	return ();
    #}

}

sub _read_text_file
{
	my $self = shift;
	my %args = @_;

	$self->{file_type} = 't';

	my $csv = Text::CSV_XS->new({binary => 1});	# actually means to allow characters outside of non-ASCII range
  $csv = Text::CSV_XS->new({binary => 1,escape_char => "\\"}) if($args{clean_quotes} == 1 && $self->{possible_quote} == 1);
	my $alternateCSV = Text::CSV_XS->new({allow_loose_quotes => 1, escape_char => ''});
	
	my $semicolonCSV = Text::CSV_XS->new({binary => 1, sep_char => ';'});
	$semicolonCSV = Text::CSV_XS->new({binary => 1, sep_char => ';', escape_char => "\\"}) if($args{clean_quotes} == 1 && $self->{possible_quote} == 1);
	my $alternateSemicolonCSV = Text::CSV_XS->new({allow_loose_quotes => 1, escape_char => '', sep_char => ';'});

	my @header;

	#if ($self->{delimiter})
	#{
		my $lines = $args{lines};
        my $limit = $args{limit} || scalar @$lines;

        my $lineNum = 1;

		for (my $i=0; $i<$limit; $i++)
		{
            my $line = $lines->[$i];


            # Make sure the incoming text is properly encoded as UTF8.
            # JPK - In theory, our UTF8::Encode method will work on just about
            # any string we give it.  At least it should work on strings that
            # are UTF8 already (but are not properly flagged), or latin1.
            #
            $lines->[$i] = Common::UTF8::Encode($line);

            # There shouldn't be a trailing CR on a line, but for some
            # UTF8 files this is not the case. Remove the trailing CR
            # (if present) to prevent $cvs->parse from failing.
            # See Case 13763 for more information.

            # The 'if' here is somewhat pointless
            #
#            $lines->[$i] =~ s/\x0d$// if ( $line =~ m/\x0d$/ );
            $lines->[$i] =~ s/\x0d$//;


            # Replace any non-tab (0x09) control characters with '?'
            #
            $lines->[$i] =~ s/(\x00|\x01|\x02|\x03|\x04|\x05|\x06|\x07|\x08|\x0a|\x0b|\x0c|\x0d|\x0e|\x0f|\x10|\x11|\x12|\x13|\x14|\x15|\x16|\x17|\x18|\x19|\x1a|\x1b|\x1c|\x1d|\x1e|\x1f)/\?/g;

			my @row;
			if ($self->{delimiter} && $self->{delimiter} eq ',')
			{
                # The "Faithworks" dualtone sales files have some wierd format where
                # some fields have ="data" format even though their csv files that
                # are not '"' qualified. The crude hack below cleans this up.
                $lines->[$i] =~ s/="/"/g;

                # some files have a single " which confuses the parse method
                my @commaCount = $lines->[$i] =~ m/[^\\]"/g;
                #$lines->[$i] =~ s/"// if (scalar @commaCount == 1);

				# a rather gross thing we have to do for CSV files with spaces around the commas.
				# the big drawback is that it get's rid of spaces within quoted strings.
				# we could deal with the quoted fields, but then i forget the point of using
				# the Text::CSV_XS library...
				
				$lines->[$i] =~ s/\s*,\s*/,/g;

                my $test_quote = $lines->[$i];
                $test_quote =~ s/\",\"//;
                $test_quote =~ s/^\"//;
                $test_quote =~ s/\"$//;
                $self->{possible_quote} = 1 if($test_quote =~ /\"/ && !$args{clean_quotes});

                if(defined $args{clean_quotes} && $args{clean_quotes} == 1 && 
                   defined $args{possible_quotes} && $self->{possible_quote} == 1) {
                    if($lines->[$i] !~ /\"/) {
                        $lines->[$i] =~ s/,/\t/g;
                    }
                    else {
                        if($lines->[$i] =~ /^\"/ && $lines->[$i] =~ /\"$/ && $lines->[$i] =~ /\",\"/) {
                            $lines->[$i] =~ s/^\"//;
                            $lines->[$i] =~ s/\"$//;
                            $lines->[$i] =~ s/\",\"/\t/g;
                            $lines->[$i] =~ s/\"/\\\"/g;
                        }
                        else {
                            $lines->[$i] =~ s/\'/\\\'/g;
                            my $subSwitch = 0;
                            my $workingLine = $lines->[$i];
                            my @comaSubs;
                            my $comaSubsCount = 0;
                            while($subSwitch < 1) {
                                $workingLine =~ m/(\"[^\"]*\")/;
                                $comaSubs[$comaSubsCount] = $1;
                                my $subField = "ddd".$comaSubsCount."bbb";
                                $workingLine =~ s/(\"[^\"]*\")/$subField/;
                                $comaSubs[$comaSubsCount] =~ s/^\"//;
                                $comaSubs[$comaSubsCount] =~ s/\"$//;
                                if($workingLine !~ /\"[^\"]*\"/) {
                                    $workingLine =~ s/,/\t/g;
                                    $subSwitch = 1;
                                }
                                $comaSubsCount++;
                            }
                            for(my $x=0;$x<@comaSubs;$x++) {
                                my $subField = "ddd".$x."bbb";
                                my $realField = $comaSubs[$x];
                                $workingLine =~ s/$subField/$realField/;
                            }
                            $lines->[$i] = $workingLine;
                        }
                    }
                    if ($csv->parse($lines->[$i]))
                    {
                        @row = split("\t",$lines->[$i]);
                    }
                    elsif ($alternateCSV->parse($lines->[$i]))
                    {
                        @row = split("\t",$lines->[$i]);
                    }
                    else
                    {
						$self->errstr("Double quotes must be escaped at line $lineNum");
                	    return undef;
                    }
                }
                else {
                    if ($csv->parse($lines->[$i]))
                    {
                        @row = Common::Util::trimquotes($self->_cleanup($csv->fields()));
                    }
					elsif ( $alternateCSV->parse($lines->[$i]) ) {
                        @row = Common::Util::trimquotes($self->_cleanup($alternateCSV->fields()));
					}
                    else
                    {
						$self->errstr("error parsing file at line $lineNum");
                	    return undef;
                    }
                }
			}
			elsif ($self->{delimiter} && $self->{delimiter} eq ';')
			{  		  
			  
          my $test_quote = $lines->[$i];
          $test_quote =~ s/\";\"//;
          $test_quote =~ s/^\"//;
          $test_quote =~ s/\"$//;
          $self->{possible_quote} = 1 if($test_quote =~ /\"/ && !$args{clean_quotes});
  
          if($args{clean_quotes} == 1 && $self->{possible_quote} == 1) {
              if($lines->[$i] !~ /\"/) {
                  $lines->[$i] =~ s/;/\t/g;
              } else {
                  if($lines->[$i] =~ /^\"/ && $lines->[$i] =~ /\"$/ && $lines->[$i] =~ /\";\"/) {
                      $lines->[$i] =~ s/^\"//;
                      $lines->[$i] =~ s/\"$//;
                      $lines->[$i] =~ s/\";\"/\t/g;
                      $lines->[$i] =~ s/\"/\\\"/g;
                  } else {
                      $lines->[$i] =~ s/\'/\\\'/g;
                      my $subSwitch = 0;
                      my $workingLine = $lines->[$i];
                      my @comaSubs;
                      my $comaSubsCount = 0;
                      while($subSwitch < 1) {
                          $workingLine =~ m/(\"[^\"]*\")/;
                          $comaSubs[$comaSubsCount] = $1;
                          my $subField = "ddd".$comaSubsCount."bbb";
                          $workingLine =~ s/(\"[^\"]*\")/$subField/;
                          $comaSubs[$comaSubsCount] =~ s/^\"//;
                          $comaSubs[$comaSubsCount] =~ s/\"$//;
                          if($workingLine !~ /\"[^\"]*\"/) {
                              $workingLine =~ s/;/\t/g;
                              $subSwitch = 1;
                          }
                          $comaSubsCount++;
                      }
                      for(my $x=0;$x<@comaSubs;$x++) {
                          my $subField = "ddd".$x."bbb";
                          my $realField = $comaSubs[$x];
                          $workingLine =~ s/$subField/$realField/;
                      }
                      $lines->[$i] = $workingLine;
                  }
              }
              if ($semicolonCSV->parse($lines->[$i]))
              {
                  @row = split("\t",$lines->[$i]);
              }
              elsif ($alternateSemicolonCSV->parse($lines->[$i]))
              {
                  @row = split("\t",$lines->[$i]);
              }
              else
              {
  						    $self->errstr("Double quotes must be escaped at line $lineNum");
                  return undef;
              }
          } else {
              if ($semicolonCSV->parse($lines->[$i]))
              {
                  @row = Common::Util::trimquotes($self->_cleanup($semicolonCSV->fields()));
              }
  					  elsif ( $alternateSemicolonCSV->parse($lines->[$i]) ) {
                  @row = Common::Util::trimquotes($self->_cleanup($alternateSemicolonCSV->fields()));
  					  }
              else
              {
  						    $self->errstr("error parsing file at line $lineNum");
                  return undef;
              }
          }
			}			
			elsif ($self->{delimiter})
			{
				@row = Common::Util::trimquotes($self->_cleanup(split($self->{delimiter}, $lines->[$i])));
			}
			else
			{
			    # For text files with no delimiter, we'll just glop the whole line into one field.
			    $row[0] = $lines->[$i];
			}

            $lineNum++;

			push @header, \@row;
		}
		
    if($args{clean_quotes} == 1 && $self->{possible_quote} == 1) {
        $self->{possible_quote} = 0;
        $args{clean_quotes} = 0;
    }
	#}

	return \@header;
}

sub _read_excel_file # See Case 19256
{
	my $self = shift;
	my %args = @_;
	my $print    = $args{print};

	my $file = $self->{path} || $args{path};

	my $book;

	my @sheet_lines = ();
    $self->{sheet_lines} = \@sheet_lines;

    if( $file =~ /\.xlsx$/ ) {
		$self->{isXLSX} = 1;
        $book = RS::Spreadsheet::XLSX->new($file, undef, sub { $self->_cellHandler(@_) });
    } else {
        my $parser = Spreadsheet::ParseExcel->new(CellHandler => sub { $self->_cellHandler(@_) },
                                               NotSetCell  => 1);
        $book = $parser->Parse($file);
    }

	unless (defined $book && defined $book->{Worksheet})
	{
		$self->errstr("The file could not be parsed as an Excel file");
		return undef;
	}

	$self->{file_type} = 'e';

    $self->{Flg1904} = '1' if( $book->{Flg1904} );

	my @sheets = ();
    my @sheet_names = ();
    push @sheets, @{$book->{Worksheet}};
    for (my $i = 0; $i < $book->{SheetCount}; $i++) {
        push @sheet_names, $book->{Worksheet}->[$i]->{Name};

        # We'll ditch rows before MinRow for the sake of compability.
        # Don't really like it, but some importers will break otherwise. 
        #
        # I'm sure it doesn't provide any measurable efficiencies and
        # comes at the cost of confusion for line numbers in importer
        # code and error messaging whenever it comes into play.
        #
        # The MinCol case is even rarer and we're not going to emulate
        # that.
        for (my $j = 0; $j < $book->{Worksheet}[$i]{MinRow}; $j++) {
            shift @{$sheet_lines[$i]};
        }
    }

	if ($print)
	{
		return 1;
	}
	else
	{
		return [\@sheet_lines, \@sheet_names];
	}
}

sub _cellHandler {
    my $self = shift;
    my $workbook = shift;
    my $sheet_index = shift;
    my $row = shift;
    my $col = shift;
    my $cell = shift;

    if ($cell)
    {
        my $value = $cell->{Val};

        #use Data::Dumper;
        #die Dumper $cell if( $value == 40148 );


        # All data will need to be passed through the Encode method.
        # We cannot rely on the Excel package to correctly translate character
        # sets, or to set the UTF-8 flag when necessary.
        # 

        # Leave the encoding 'undef' by default.  We can set this to something explicit
        # if necessary later.
        #
        my $encoding;


        # clean up ucs2/utf16 (two byte) strings.
        # right now, the 'Code' attribute of the Cell
        # is our only indicator for this. There might
        # be other values besides ucs2 that we haven't seen yet.
        #
        if($cell->{Code} && $cell->{Code} eq 'ucs2')
        {
            $encoding = Common::UTF8::kEncodingUCS2;
        }

        $value = Common::UTF8::Encode($value, $encoding);


        # 67 is a custom numeric type representing a date
        # Let's make sure it looks like a date, too.
        #
        # 02/27/2012 - okay, so it turns out it's not reliable at all to check $cell->{FormatNo} for anything.
        # it's actually just an index into a format specifier, which in turn, contains another index to
        # an actual format specification. specifically, what this means is the FormatNo has nothing to do with
        # the built-in (or custom) formats. The data structures to look at for more detail on this reside in
        # Spreadsheet::ParseExcel*. Format information (which contain font, style, display) lives in array
        # called $oBook->{Format}. Each format includes a 'FmtIdx' that points to an element from an array of
        # formatting strings, $oBook->{FormatStr}, which contain things like 'yyyy-mm-dd' and '0.000'
        #
        # so, again, this means there's nothing special about format 67. it might regularly contain a date
        # related format index, but there's no guarantee at all. however, since some code may be getting benefit
        # from this as a side-effect, we're going to leave it in place, but in addition to the exception for
        # number looking things, we're going to add an exception for the word 'General' which at least one
        # formatting string seemed to do with numbers. In this case, the format no 67 mapped to format string
        # index 178, which was '[$-1010409]General' and even though Spreadsheet::ParseExcel::Utility:ExcelFmt
        # seems to try to do a comprehensive job formatting everything, that just converts to 'General', which
        # is less than useless.
        #
        # at some point, we should ditch this whole format 67 business. for now we'll just log what's happening.
        # the original changes took place in versions 1.4 and 1.15
        #
        if ($cell->{FormatNo} && $cell->{FormatNo} eq 67)
        {
            # enhanced the RE in the following line to take into account parens
            # and commas.  
            if( $cell->Value() !~ m/^\(?\-?\d+,?\d*\.?\d+\)?$/ && 
                ($cell->Value() =~ m/^.*\(.*$/ xor $cell->Value() =~ m/^.*\).*$/ ) &&
                lc($cell->Value()) ne 'general')
            {
                my $before = $value;
                $value = $cell->Value();
                print STDERR "_read_excel_file: using $value instead of $before\n" if $before ne $value;
            }
        }

        if ( lc($cell->{Type}) eq 'date' )
        {
            my $held_value = $value;
            $value = Spreadsheet::ParseExcel::Utility::ExcelFmt("yyyy-mm-dd", $value);
            if ($workbook->{Flg1904}) # need to add 4 yrs
            {
                my ($y, $m, $d) = Add_Delta_Days(1904,1,1, $held_value);
                $value = sprintf("%04d-%02d-%02d",$y,$m,$d);
            }
        }

        else
        {
            $value = Common::Util::trimquotes($self->_cleanup($value)) ;     # raw value without formatting
        }

        if( $self->{isXLSX} ) {
            $value =~ s/&amp;/&/;
            $value =~ s/&lt;/</;
            $value =~ s/&gt;/>/;
            $value =~ s/&apos;/'/g;
            $value =~ s/&quot;/"/g;
        }


        # Filter out any funky control characters that might have made it through the parser.
        #
        $value =~ s/([\000-\010]|[\012-\037])//g;

        $self->{sheet_lines}[$sheet_index][$row][$col] = $value;
    }
}

sub _cleanup {
	my $self = shift;
	my @data = @_;

	for (@data) {
		s/[\n\r\t]+/ /g;   # strip tabs and linebreaks
		s/^\s+//;
		s/\s+$//;
	}

	return wantarray ? @data : $data[0];
}


sub _file_match_rules {
  my $self = shift;

  # array(ref) of hashrefs containing service, version and rule lines
  # ex: $rule = $rules->[i]; service_id->{$version_num}

  # rule order is important!
  # general rules of thumb:
  # 1) rule order is important!
  # 2) more specific rules should be placed before less specific rules
  # 3) each rule within the same service should typically have a unique version number
  # 4) version numbers must stay the same forever (unless you *know* a version has NEVER been used)
  # 5) it's okay for rule versions to be out of sequence in order to satisfy rules 1 and 2
  #    (i.e. a new rule n+1 for a service might be placed before older (and lower numbered) versions
  #    because it is more specific)
  # 6) so far, there hasn't been any overlap between services, but certainly possible, when adding
  #    a new service look for similarity and place accordingly (again, service_id/version_num order
  #    isn't important as long as they're unique)
  # 7) use sheet -> 'any' when the sheet order varies
  # 8) try to place any rules with match_on_any_row => 1 at/near the end to minimize unecessary searching
  # 9) When using the match_on_any_row we limit the search to the first 80 rows by default.  You can override
  #    this behavior using the 'limit' rule.
  # 10) file_name matching has been reworked to be used _in conjunction_ with line matching. if your intention
  #    is to match solely on file name (like caroline was done), first ask why you can't match something in the
  #    file. if you really really can't answer that, then specify a single wildcard line element and try to be as
  #    *specific* as possible with the filename pattern. the file_name option is really only meant to distinguish
  #    between multiple services that have the exact same format
  #
  my $rules = [
    # iris statement format
    { service => Client::Service::DSP_IRIS,
      version => 1,
      lines => [
        ['IRIS Distribution'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Revenue Statement']
      ]
    },
    # iris report format
    { service => Client::Service::DSP_IRIS,
      version => 2,
      lines => [
        ['IRIS Distribution'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Sales Report - Quantities']
      ]
    },
    # iris report format
    { service => Client::Service::DSP_IRIS,
      version => 3,
      lines => [
        ['line Id', 'DSP Name', 'Label Name', 'Release Title', 'UPC', 'Release Artist', 'Track Title', 'ISRC', 'Track Artist', 'Album or Track', 'Release Date', 'Transaction Date', 'Transaction Type', 'Sale or Return', 'Quantity', 'Unit Price', 'Gross', 'Base Fee', 'Service Fee', 'Total Fees', 'Fee', 'Net', 'Report Start Date', 'Report End Date', 'City', 'State', 'Zip', 'Territory'],
      ]
    },    
    # Aime Street
    { service => Client::Service::DSP_AMIESTREET,
      version => 1,
      sheet => 0,
      lines => [
        ['Amie Street Sales Report:']
      ]
    },
    # Aime Street
    { service => Client::Service::DSP_AMIESTREET,
      version => 4,
      sheet => 1,
      lines => [
        ['Amie Street Sales Report:'],
      ],
    },
    # Aime Street (version 2, loosely based on our spec Q32007)
    { service => Client::Service::DSP_AMIESTREET,
      version => 2,
      lines => [
        [undef,'Amie Street'],
        ['sale-year', 'sale-month', 'upc-ean', 'isrc', 'account-id', 'product-type', 'format-type', 'media-type', 'label', 'artist', 'album', 'track', 'units', 'royalty-price', 'extended-royalty', 'retail-price', 'extended-retail', 'currency-code', '^$']
      ],
    },
    # Aime Street (version 3, inching toward on our spec Q42007)
    { service => Client::Service::DSP_AMIESTREET,
      version => 3,
      match_on_any_row => 1,
      lines => [
        ['year', 'month', 'upc_ean', 'isrc', 'account_id', 'content_id', 'product_type', 'format_type', 'media_type', 'label', 'artist', 'album', 'track', 'units', 'royalty_price', 'extended_royalty_price', 'retail_price', 'extended_retail_price', 'currency_code']
      ],
    },
	# cherry red - muzicall (FB16684)
	{ service => Client::Service::DSP_MUZICALL_UK,
	  version => 1,
	  lines => [
		[
'Report Date', 'Initial Date', 'End Date', 'Product', 'Licensor Name', 'Country', 'Operator', 'Artist', 'Title', 'ISRC', 'Date', 'Time', 'Gross Retail Price', 'Net Retail Price', 'Retail Price Currency', 'Provider Share', 'Provider Share Currency', 'Units sold'
		]
	  ]
	},
	# bfm digital - jbhifimusic (FB17131)
	{ service => Client::Service::DSP_JBHIFIMUSIC,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'Account Number', 'Country Of Sale', 'Sales Period Begin \(DD-MM-YYYY\)', 'Sales Period End \(DD-MM-YYYY\)', 'Usage Type', 'Product Type', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Number of Transactions', 'Sub Type'
		]
	  ]
	},
	# bfm digital - jbhifimusic (FB5108)
	{ service => Client::Service::DSP_JBHIFIMUSIC,
	  version => 2,
	  sheet => 'any',
	  lines => [
		[
'Account Number', 'Country Of Sale', 'Sales Period Begin \(DD-MM-YYYY\)', 'Sales Period End \(DD-MM-YYYY\)', 'Usage Type', 'Product Type', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Number of Transactions', 'Merlin ID', 'Sub Label', 'Total', 'Sub Type'
		]
	  ]
	},
	# La Cupula - Boinc (FB1218)
	#
	{ service => Client::Service::DSP_BOINC,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'Territory', 'UPC', 'ISRC', 'BOINC Album Id', 'BOINC Track Id', 'Album Artist Name', 'Album Title', 'Track Title', 'Play Counts'
		]
	  ]
	},
	# Syntax - SoundCloud (FB9870)
	{ service => Client::Service::DSP_SOUNDCLOUD,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'Partner ID', 'Partner Name', 'Label Name', 'Account ID', 'Account Name', 'Artist Name', 'Album Title', 'Track Name', 'Track ID', 'Track Classification', 'ISRC', 'UPC', 'Reporting Period', 'Territory', 'Total Plays', 'Total Revenue', 'Revenue Currency', 'Monetisation Type', 'Usage Type', 'Version'
		]
	  ]
	},
	# harmonia mundi - orange (FB16989)
	{ service => Client::Service::DSP_ORANGE,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'Client_key', 'Vendor_retailer_code', 'country key', 'report date', 'initial date', 'end date', 'transaction type', 'sale type', 'Distrib_channel', 'product_key_type', 'UPC Identifier', 'ISRC Identifier', 'GRID', 'Artist Name', 'Title', 'UNIT SOLD', 'WPU', 'Retail price \(excl. VAT\)', 'Market_share', 'curency', 'sous label', 'line count', 'Amount Due', 'CA \(ht\)', 'price_code_corrige', undef, 'Album tracks number'
		]
	  ]
	},
	# Absolute Distribution (FB12682)
	{ service => Client::Service::DSP_ABSOLUTE_DISTRIBUTION,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'CompanyName', 'strLabelName', 'Track Artist', 'Album Artist', 'strTrackTitle', 'strAlbumTitle', 'strMonthSold', 'strReportingDigitalSalesPartner', 'strProductType', 'strCountry', 'strISRCNumber', 'strUPCNumber', 'strCatNo', 'strGridCode', 'strSalesChannel', 'Mechanicals Paid', 'strYoutubeUploader', 'strYoutubeVideoTitle', 'strStandardisedCountryCodes', 'lngNumberOfSales', 'Income', 'AbsoluteFee', 'AbsNetIncomeToLabel'
		]
	  ]
	},
	# harmonia mundi - HRA (FB2387)
	{ service => Client::Service::DSP_HRA,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'DSP \(Licensee\)', 'Date Report', 'Period start', 'Period end', 'Day of download', 'Time of download', 'Portal', 'Country of sale', 'Transaction Type', 'Distr. Channel', 'Format', 'Number of sales', 'PRODID', 'EAN_UPC', 'ISRC', 'Grid', 'Artist', 'Title', 'Label', 'Net Revenue End Consumer Price', 'End consumer price \(gross\)', 'End consumer price \(net\)', 'VAT', 'Currency', 'Exchange rate', 'Fee 1', 'Fee 2', 'Fee N', 'PPD \(net\) / per order', 'PPD \(net\) / total', 'Exchange rate \(PPD\)', 'GEMA payed by'
		]
	  ]
	},
	# stholdings - wimp (FB1720)
	{ service => Client::Service::DSP_WIMP_ASPIRO,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'transdate', 'tier', 'trackid', 'albumid', 'artistid', 'channelid', 'streams', 'album_title', 'album_upc', 'album_internalid', 'track_title', 'track_duration', 'track_amwkey', 'track_isrc', 'track_internalid', 'artistname', 'unit_content_cost', 'content_cost', 'content_cost_currency', 'partner_name'
		]
	  ]
	},
	# stholdings - wimp (FB1722)
	{ service => Client::Service::DSP_WIMP_ASPIRO,
	  version => 2,
	  sheet => 'any',
	  lines => [
		[
'logdate', 'productproviderid', 'productprovider', 'recordlabelname', 'countrycode', 'channelname', 'currencycode', 'type_of_sale', 'downloads', 'numberoftracks', 'salesprice', 'unit_contentcost', 'contentcost', 'currencycode', 'album_name', 'product_title', 'artist_name', 'upc', 'isrc', 'internalid'
		]
	  ]
	},
	# harmonia mundi - eClassical (FB1518)
	{ service => Client::Service::DSP_ECLASSICAL,
	  version => 1,
	  sheet => 'any',
	  lines => [
		[
'Nom Service', 'Pays', 'Order date', 'Période traitement', 'Label', 'Titre album ou track', 'Nom artiste', 'Référence Catalogue HM', 'Code BArre', 'ISRC', 'Format', 'Gestion Droit Meca', 'Type Vente', 'Quantité', 'Devise Origine', 'Px public unit. Orig.', 'Montant Orig.', 'Taux de change', 'Devise Relevé', 'Px public unit. Orig.', 'Montant Orig.', 'Coefficient Com.', 'Px Unit. Versé', 'Montant Annexe', 'Montant Net Versé'
		]
	  ]
	},
	# harmonia mundi - eClassical (FBoD4642)
	{ service => Client::Service::DSP_ECLASSICAL,
	  version => 2,
	  sheet => 'any',
	  lines => [
		[
            'Nom Service', 'Pays', 'Order date', 'Période traitement', 'Label', 'Titre album ou track', 'Nom artiste', 'Référence Catalogue HM',
            'Code BArre', 'ISRC', 'Format', 'Gestion Droit Meca', 'Type Vente', 'Quantité', 'Devise Origine', 'Px public unit. Orig.', 'Montant Orig.',
            'Devise Relevé', 'Coefficient Com.', 'Montant Net Versé', '^$'
		]
	  ]
	},
	# curb - MixAndBurn (FB2126)
	{ service => Client::Service::DSP_MIXANDBURN,
	  version => 1,
	  sheet => 0,
	  lines => [
		[
'ISRC', 'ARTIST_NAME', 'SONG_TITLE', 'UPC_CODE', 'TRACK_NUMBER', 'QUANTITY', 'ROYALTY', 'RETAIL'
		]
	  ]
	},
	# curb - Integra Interactive (FB2134)
	{ service => Client::Service::DSP_INTEGRA,
	  version => 6,
	  sheet => 0,
          match_on_any_row => 1,
	  lines => [
		[
'my_type', 'status', 'Cycle', undef, 'DistName', 'LabelName', 'Name', 'AlbumTitle', 'TrackTitle', 'LookUP', undef, 'Count|Burns', 'Cost', 'Credits', 'Total'
		]
	  ]
	},
	# curb - Integra Interactive (FB5227)
	{ service => Client::Service::DSP_INTEGRA,
	  version => 7,
	  sheet => 0,
          match_on_any_row => 1,
	  lines => [
		[
'my_type', 'status', 'Cycle', 'Source', 'Sale', 'DistName', 'LabelName', 'Name', 'AlbumTitle', 'TrackTitle', 'LookUP', undef, 'Count|Burns', 'Cost', 'Credits', 'Total'
		]
	  ]
	},
	# touchandgo - iTunes Radio (FB2056)
	{ service => Client::Service::DSP_ITUNES_RADIO,
	  version => 1,
	  sheet => 0,
          match_on_any_row => 1,
	  lines => [
	  	[
'Report Type', 'Apple Radio',
		],
		[
'ISRC', 'Vendor Id', 'Quantity', 'Apple Id', 'Artist', 'Title', 'Label', 'Country Of Sale'
		]
	  ]
	},
	# Dischord - iTunes Radio (FB4318)
	{ 
	    service => Client::Service::DSP_ITUNES_RADIO,
	    version => 2,
	    sheet => 0,
	    lines => [
	        ['Start Date'],
	        ['End Date'],
	  	    ['Report Type', 'iTunes Radio'],
		    ['ISRC', 'Vendor Id', 'Quantity', 'Non-Match User Quantity', 'Match User Quantity', 'Apple Id', 'Artist', 'Title', 'Label', 'Country Of Sale']
	    ]
	},	
	# Dischord - iTunes Radio (FB5517)
	{ 
	    service => Client::Service::DSP_ITUNES_RADIO,
	    version => 3,
	    sheet => 0,
	    lines => [
	      ['Start Date'],
	      ['End Date'],
	      ['Report Type', 'iTunes Radio'],
['ISRC', 'Vendor Id', 'Quantity', 'Non-Match User Quantity', 'Match User Quantity', 'Skips', 'Gross Heatseeker Plays', 'Gross CMA Plays', 'Gross Match Plays', 'Gross Heatseeker CMA Match Plays', 'Apple Id', 'Artist', 'Title', 'Label', 'Country Of Sale']
	    ]
	},	
	# touchandgo - iTunes Radio (FB8460)
	{ 
	    service => Client::Service::DSP_ITUNES_RADIO,
	    version => 4,
	    sheet => 0,
	    lines => [
	      ['Start Date'],
	      ['End Date'],
	      ['Report Type', 'iTunes Radio'],
['ISRC', 'Vendor Id', 'Quantity', 'Skips', 'Gross Heatseeker Plays', 'Gross CMA Plays', 'Gross Match Plays', 'Gross Heatseeker CMA Match Plays', 'Apple Id', 'Artist', 'Title', 'Label', 'Country Of Sale']
	    ]
	},	
	# MOS - Jesta (FB2951)
	{ service => Client::Service::DSP_JESTA_DIGITAL,
	  version => 1,
	  sheet => 'any',
          match_on_any_row => 1,
	  lines => [
		[
'LICENSOR', 'LICENSOR_ID', 'MONTH', 'DOMAIN', 'ARTIST', 'TITLE', 'REPORT_ID', 'ISRC', 'UPC', 'PRODUCT_TYPE', 'CATEGORY', 'PPD_CONTRACT', 'CURRENCY', 'EXCHANGE_RATE', 'EXCHANGE_RATE_MONTH', 'PPD_FINAL', 'CURRENCY', 'UNITS', 'TOTAL', 'CURRENCY'
		]
	  ]
	},
	# MOS - Musicall (FB2953)
	{ service => Client::Service::DSP_MUSICALL,
	  version => 1,
	  sheet => 'any',
          match_on_any_row => 1,
	  lines => [
		[
'Report Date', 'Initial Date', 'End Date', 'Product', 'Licensor Name', 'Country', 'Operator', 'Artist', 'Title', 'ISRC', 'Date', 'Time', 'Gross Retail Price', 'Net Retail Price', 'Retail Price Currency', 'Provider Share', 'Provider Share Currency', 'Units sold'
		]
	  ]
	},
	# memphis industries - goodfellas (FB17638)
	{ service => Client::Service::DSP_GOODFELLAS,
	  version => 1,
	  sheet => 'any',
          match_on_any_row => 1,
	  lines => [
		[
'Article ID', 'For', 'Artist', 'Title', 'Etichetta', 'Begin', 'Incm', 'Sold', 'Corr', 'End', 'Price', 'Amount', 'Descrizione Fornitore'
		]
	  ]
	},
	# memphis industries - music as usual (FB17625)
	{ service => Client::Service::DSP_MUSIC_AS_USUAL,
	  version => 1,
	  sheet => 'any',
          match_on_any_row => 1,
	  lines => [
		[
'REFERENCE', 'FMT', 'ARTIST', 'TITLE', 'TARIFA', 'PPD', 'NET PRICE', 'MAU FEE \(35%\)', 'PAYABLE', 'SALES', 'RETURNS', 'TOTAL DUE'
		]
	  ]
	},
	# ST Holdings - additech (FB16741)
	{ service => Client::Service::DSP_ADDICTECH,
	  version => 1,
          match_on_any_row => 1,
	  lines => [
		[
'Catalog Number', 'ISRC Code', 'UPC Code', 'Tune Code', 'Addictech Product ID', 'Addictech Order ID', 'Sale Timestamp', 'City', 'State', 'Country', 'Release', 'Label', 'Artist', 'Track/Bundle Name', 'File Format', 'Total Earned', 'Products Viewed'
		]
	  ]
	},
	# ST Holdings - additech (FB17011)
	{ service => Client::Service::DSP_ADDICTECH,
	  version => 2,
          match_on_any_row => 1,
	  lines => [
		[
'Catalog Number', 'ISRC Code', 'UPC Code', 'Tune Code', 'Addictech Product ID', 'Addictech Order ID', 'Sale Timestamp', 'City', 'State', 'Country', 'Release', 'Label', 'Artist', 'Track/Bundle Name', 'Addictech Product Type \(3\:Track; 6\:Bundle\)', 'File Format', 'Total Earned', 'Products Viewed'
		]
	  ]
	},
       # ST Holdings - chemical (FB16742)
       { service => Client::Service::DSP_CHEMICAL,
         version => 1,
           match_on_any_row => 1,
         lines => [
               [
 'Transaction Date', 'Territory', 'UPC/EAN', 'ISRC', 'Supplier Code', 'Release Title', 'Track Artist', 'Track Title', 'Format', 'Product Type', 'Unit Price', 'VAT Rate', 'Net Unit Price', 'MCPS Rate', 'MCPS Share', 'Payment Charge', 'Royalty Split', 'Chemical Share', 'Final Amount'
               ]
         ]
       },
       # Xbox Music - Subscription (FB16809)
       { service => Client::Service::DSP_XBOX_MUSIC,
         version => 1,
           match_on_any_row => 1,
         lines => [
               [
'Component Id', 'Track Title', 'Artist', 'Track Isrc', 'Album Title', 'Album Artist', 'Album Upc', 'Licensor Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Product Type', 'Number of Transactions', 'Usage Type', 'SubscriptionName'
               ]
         ]
       },
       # Xbox Music - Dto (FB16809)
       { service => Client::Service::DSP_XBOX_MUSIC,
         version => 2,
           match_on_any_row => 1,
         lines => [
               [
'Component Id', 'Product Title', 'Artist', 'Track Isrc', 'Parent Title', 'Parent Artist', 'Album Upc', 'Licensor Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Currency Code', 'Product Type', 'Source Wholesale price \/ Unit', 'Deductible Fees \/ Unit', 'Net Wholesale price \/ Unit', 'Payment currency', 'Retail Price', 'Number of Transactions', 'Usage Type', 'Total Wholesale Price', 'Total Retail Price'
               ]
         ]
       },
       # Xbox Music - Spy (FB3077)
       { service => Client::Service::DSP_XBOX_MUSIC,
         version => 3,
           match_on_any_row => 1,
         lines => [
               [
'Component Id', 'Track Title', 'Artist', 'Track Isrc', 'Release ProprietaryId', 'Album Title', 'Album Artist', 'Album Upc', 'Licensor Name', 'Label Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Product Type', 'Number of Transactions', 'Usage Type', 'SubscriptionName', 'WholesalePriceperUnit', 'TotalWholeSalePrice', 'Currency'
               ]
         ]
       },
       # Xbox Music - Dto (FB3146)
       { service => Client::Service::DSP_XBOX_MUSIC,
         version => 4,
         match_on_any_row => 1,
         lines => [
               [
'Component Id', 'Product Title', 'Artist', 'Track Isrc', 'Release ProprietaryId', 'Parent Title', 'Parent Artist', 'Album Upc', 'Licensor Name', 'Label Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Currency Code', 'Product Type', 'Source Wholesale price \/ Unit', 'Deductible Fees \/ Unit', 'Net Wholesale price \/ Unit', 'Payment currency', 'Retail Price', 'Number of Transactions', 'Usage Type', 'Total Wholesale Price', 'Total Retail Price'
               ]
         ]
       },       
       # Xbox Music - Subscription (FB8613)
       { service => Client::Service::DSP_XBOX_MUSIC,
         version => 5,
           match_on_any_row => 1,
         lines => [
               [
'Component Id', 'Track Title', 'Artist', 'Track Isrc', 'Release ProprietaryId', 'Album Title', 'Album Artist', 'Album Upc', 'Licensor Name', 'Label Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Product Type', 'Number of Transactions', 'Usage Type', 'SubscriptionName|Subscription Name', 'WholesalePriceperUnit', 'Total LocalWholeSalePrice|Total Local WholeSalePrice', 'Local Currency', 'Total PaymentWholeSalePrice|Total Payment WholeSalePrice', 'Payment Currency'
               ]
         ]
       },

       # Xbox Music - Dto (FB10681)
       { service => Client::Service::DSP_XBOX_MUSIC,
         version => 6,
         match_on_any_row => 1,
         lines => [
               [
'Component Id', 'Product Title', 'Artist', 'Track Isrc', 'Release ProprietaryId', 'Parent Title', 'Parent Artist', 'Album Upc', 'Licensor Name', 'Label Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Product Type', 'Source WholesalePrice \/ Unit', 'Deductible Fees \/ Unit', 'Net WholesalePrice \/ Unit', 'Retail Price', 'Number of Transactions', 'Usage Type', 'Total Retail Price', 'Total Local WholesalePrice', 'Local Currency', 'Total Payment WholeSalePrice', 'Payment Currency', '^$'
               ]
         ]
       },       

       # Fuga - ST Holdings (FB17506)
       { service => Client::Service::DSP_FUGA,
         version => 1,
         match_on_any_row => 1,
         sheet => 'any',
         lines => [
               [
'DSPReport', 'ReportStart', 'ReportEnd', 'Year', 'Quart', 'Month', 'Day', 'DSP', 'DSPTrackId', 'Label', 'Artist', 'Title', 'UPCCode', 'ISRCCode', 'Country', 'TypeOfSale', 'RetailPrice', 'Items', 'ItemRoyalty', 'TotalRoyalty', 'Currency', 'ExchangeRate', 'RoyaltyEUR', 'CPRate', 'CPShare', 'IIPShare', 'RoyaltyEURVAT', 'IIPShareVAT', 'RoyaltyEURGross', 'IIPShareGross', 'AmountDue'
               ]
         ]
       },
       # Fuga (FB1620)
       { service => Client::Service::DSP_FUGA,
         version => 2,
         sheet => 'any',
         lines => [
               [
'ReportStart', 'ReportEnd', 'Year', 'Quart', 'Month', 'Day', 'DSP', 'DSPTrackId', 'Label', 'Artist', 'Title', 'UPCCode', 'ISRCCode', 'Country', 'TypeOfSale', 'RetailPrice', 'Items', 'ItemRoyalty', 'TotalRoyalty', 'Currency', 'ExchangeRate', 'RoyaltyEUR', 'CPRate', 'CPShare', 'IIPShare', 'RoyaltyEURVAT', 'IIPShareVAT', 'RoyaltyEURGross', 'IIPShareGross', 'AmountDue'
               ]
         ]
       },
       # Fuga (FB2974)
       { service => Client::Service::DSP_FUGA,
         version => 3,
         sheet => 'any',
         lines => [
               [
 'ReportStart', 'ReportEnd', 'Year', 'Quart', 'Month', 'Day', 'DSP', 'DSPTrackId', 'Label', 'Artist', 'Title', 'UPCCode', 'ISRCCode', 'Country', 'TypeOfSale', 'RetailPrice', 'Items', 'ItemRoyalty', 'TotalRoyalty', 'Currency', 'ExchangeRate', 'RoyaltyEUR', 'CPRate', 'IIPShare', 'AmountDue'
               ]
         ]
       },
	# msn
	{ service => Client::Service::DSP_MSNMUSIC,
	  version => 1,
	  lines => [
		['MSN Music Download Service']
	  ]
	},
	# downloadpunk circa ?-6/2004
	{ service => Client::Service::DSP_DOWNLOADPUNK,
	  version => 1,
	  lines => [
		['Royalty Report', 'Start Date:', undef, 'End Date:'],
		[undef],
		['Label','Aggregator','Purchase','ISRC','UPC', 'Royalty','Retail','Artist','Title','Song or'],
		[undef,  'Label',     'Date',    undef, undef, 'Price',  'Price', undef,   undef,  'Album']
	  ]
	},
	# downloadpunk circa 7/2004
	{ service => Client::Service::DSP_DOWNLOADPUNK,
	  version => 2,
	  lines => [
		['Royalty Report', 'Start Date:', undef, 'End Date:'],
		[undef],
		['Label','Aggregator','ISRC','UPC', 'Qty','Royalty','Extended','Retail','Artist','Title','Song or'],
		[undef,  'Label',     undef, undef, undef,'Price',  'Price',   'Price', undef,   undef,  'Album/']
	  ]
	},
	# downloadpunk circa 8/2004-4/2005
	{ service => Client::Service::DSP_DOWNLOADPUNK,
	  version => 3,
	  lines => [
		['Royalty Report', 'Start Date:', undef, 'End Date:'],
		[undef],
		['Label','Aggregator','Purchase','ISRC','UPC', 'Qty','Royalty','Extended','Retail','Artist','Title','Song or'],
		[undef,  'Label',     'Date',    undef, undef, undef,'Price',  'Price',   'Price', undef,   undef,  'Album/']
	  ]
	},
	# downloadpunk circa 5/2005
	{ service => Client::Service::DSP_DOWNLOADPUNK,
	  version => 4,
	  lines => [
		['Royalty Report', 'Start Date:', undef, 'End Date:'],
		[undef],
		['Label','Aggregator','Purchase','ISRC','UPC', 'Qty','Royalty','Extended','Retail','Label','Artist','Title','Song or'],
		[undef,  'Label',     'Date',    undef, undef, undef,'Price',  'Price',   'Price', 'Charity', undef,   undef,  'Album/']
	  ]
	},
	# downloadpunk circa 6/2005-7/2006
	{ service => Client::Service::DSP_DOWNLOADPUNK,
	  version => 5,
	  lines => [
		['Royalty Report', 'Start Date:', undef, 'End Date:'],
		[undef],
		['Label','Aggregator','Purchase','ISRC','UPC', 'Qty','Royalty','Extended','Retail','Label','Total','Artist','Title','Song or'],
		[undef,  'Label',     'Date',    undef, undef, undef,'Price',  'Price',   'Price', 'Charity', undef,   undef,   undef,  'Album/']
	  ]
	},
    # downloadpunk circa 08/2007
    { service => Client::Service::DSP_DOWNLOADPUNK,
      version => 5,
      lines => [
        ['Royalty Report', 'Start Date:', undef, 'End Date:',undef],
        [undef],
        ['Owner','Aggregating','Purchase','ISRC','UPC', 'Qty','Royalty','Extended','Retail','Owner','Total','Artist','Title','Song or'],
        [undef,  'Owner',     'Date',    undef, undef, undef,'Price',  'Price',   'Price', 'Charity', undef,   undef,   undef,  'Album/']
      ]
    },
	# downloadpunk circa 8/2006-?
	{ service => Client::Service::DSP_DOWNLOADPUNK,
	  version => 6,
	  lines => [
		['Royalty Report', 'Start Date', undef, 'End Date'],
		[undef],
		['Label','Aggregator Label','Purchase Date','ISRC','UPC', 'Qty','Royalty Price','Extended Price','Retail Price','Label Charity Donation','Total Due','Artist Name','Title','Song or Album'],
	  ]
	},
	# audiolunchbox
	{ service => Client::Service::DSP_AUDIOLUNCHBOX,
	  version => 1,
	  lines => [
		['Label Name','Date','Transaction ID','Type','ALB ID','UPC','ISRC',
		 'Catalog ID','Artist','Album or Track Name','ALB Price','Label Price']
	  ]
	},
	# audiolunchbox august 2006+
	{ service => Client::Service::DSP_AUDIOLUNCHBOX,
	  version => 1,
	  lines => [
        [undef],
		['Label Name','Date','Transaction ID','Type','ALB ID','UPC','ISRC',
		 'Catalog ID','Artist','Album or Track Name','ALB Price','Label Price']
	  ]
	},
	# audiolunchbox subs file, nov 2006+
	{ service => Client::Service::DSP_AUDIOLUNCHBOX,
	  version => 2,
	  lines => [
        [undef],
		['Label Name','Date','Transaction ID','Type','ALB ID','UPC','ISRC',
		 'Catalog ID','Artist','Album or Track Name','Label Share','New Subscriber']
	  ]
	},
	# wda (for cingular)
	{ service => Client::Service::DSP_WDA,
	  version => 1,
	  lines => [
          [undef],
          ['WirelessDeveloper Agency Trust'],
          [undef],
          [undef],
          [undef],
          ['Bill To:'],
          [undef],
          [undef],
          [undef],
          ['Line Item Detail','Quantity',undef,undef,'Rate',undef,undef,'Total',undef,'TotalUSD'],
	  ]
	},
	# wda virtual label
	{ service => Client::Service::DSP_WDA,
	  version => 2,
	  sheet => 'any',
	  lines => [
          [undef],
          [undef],
          [undef],
          [undef, 'Check #', 'Seller Company', 'Invoice Number',
          'Buyer Company', 'Date', 'Content ID', 'Original Filename',
          'Item Description', 'Notes', 'Dwnld Type', 'Price Point',
          'Quantity', 'Gross Revenue', 'Net Revenue'],
	  ]
	},
	# wda virtual label
	{ service => Client::Service::DSP_WDA,
	  version => 2,
	  sheet => 'any',
	  lines => [
          [undef],
          [undef],
          [undef],
          [undef, 'Check #', 'Seller Company', 'Invoice Number',
          'Buyer Company', 'Date', 'Content ID', 'Original File name',
          'Item Description', 'Notes', 'Dwnld Type', 'Price Point',
          'Quantity', 'Gross Revenue', 'Net Revenue'],
	  ]
	},
	# wda virtual label
	{ service => Client::Service::DSP_WDA,
	  version => 3,
	  sheet => 'any',
	  lines => [
          [undef],
          ['Invoice Number', 'Seller', 'Buyer', 'Date', 'PropertyID',
          'ItemID', 'Property Type', 'Original File Name',
          'Property Description', 'Item Description', 'Notes', 'Type',
          'Net Revenue', 'Quantity', 'Gross Rev', 'Seller Rev'],
	  ]
	},
	# wda virtual label
	{ service => Client::Service::DSP_WDA,
	  version => 4,
	  sheet => 'any',
	  lines => [
          [undef],
          [undef],
          [undef],
          [undef, 'Check #', 'Seller Company', 'Invoice Number', 'Buyer Company',
		   'Date', 'Item Description', 'Notes', 'ISRC', 'Price Point', 'Quantity',
		   'Gross Revenue', 'Net Revenue' ],
	  ]
	},
	# musicnow downloads circa 1/2005-?
	{ service => Client::Service::DSP_MUSICNOW,
	  version => 1,
	  lines => [
		['ISRC', 'UPC', 'PERFORMER_NAME', 'TRACK_TITLE', 'ALBUM_TITLE', 'DOWNLOAD_PERIOD',
		 'DOWNLOAD_COUNT', 'PRICE', 'SALES', 'USER_DEFINED_DATA', 'SOLD AS ABLUM OR TRACK',
		 'SALES TYPE', 'ALBUM CONTENT PRODIVER ID', 'TRACK CONTENT PROVIDER ID']
	  ]
	},
	# musicnow downloads circa ?-12/2004
	{ service => Client::Service::DSP_MUSICNOW,
	  version => 2,
	  lines => [
		['ISRC', 'UPC', 'PERFORMER_NAME', 'TRACK_TITLE', 'ALBUM_TITLE', 'DOWNLOAD_PERIOD',
		 'DOWNLOAD_COUNT', 'PRICE', 'SALES', 'USER_DEFINED_DATA']
	  ]
	},
	# musicnow subscriptions
	{ service => Client::Service::DSP_MUSICNOW,
	  version => 3,
	  lines => [
		['ISRC', 'UPC', 'Artist', 'TRACK_TITLE', 'ALBUM_TITLE', '(DOWNLOAD_)*PERIOD', 'COUNT|UNITS',
		 'COST', 'SALES', 'LABEL', 'SOLD AS ABLUM OR TRACK', 'SALES TYPE',
		 'ALBUM CONTENT PRODIVER ID', 'TRACK CONTENT PROVIDER ID', 'LICENSOR_ID']
	  ]
	},
	# musicnow subscriptions - new (5/2006) - includes free streams
	{ service => Client::Service::DSP_MUSICNOW,
	  version => 4,
	  lines => [
		['ISRC', 'UPC', 'ARTIST', 'TRACK TITLE', 'ALBUM TITLE', 'PERIOD', 'COUNT', 'COST', 'SALES', 'LABEL', 'SOLD AS ALBUM OR TRACK', 'SALES TYPE', 'ALBUM CONTENT PROVIDER ID', 'TRACK CONTENT PROVIDER ID', 'LICENSOR ID'],
      ],
    },
	# emusic
	{ service => Client::Service::DSP_EMUSIC,
	  version => 1,
	  lines => [
		['EMUSIC.COM'],
		[undef],
		[undef],
		['For The Quarter Ended']
	  ],
	},
	# emusic
	{ service => Client::Service::DSP_EMUSIC,
	  version => 2,
	  lines => [
		[undef, undef, undef, undef, 'Label Royalty Statement Summary'],
		['Payee:', undef, undef, undef, undef, undef, undef, 'Company:', undef, 'eMusic.com, Inc.'],
	  ]
	},
	# emusic mechanicals
	{ service => Client::Service::DSP_EMUSIC,
	  version => 3,
	  lines => [
		[undef, undef, undef, undef, 'DPD Royalty Statement Summary'],
		['Payee:'],
		[undef],
		['Account:'],
		[undef, undef, undef, undef, 'FOR PERIOD']
	  ]
	},
	# emusic electronic
	{ service => Client::Service::DSP_EMUSIC,
	  version => 4,
	  lines => [
		['Payee', '\_', 'LABEL', 'PRODUCT CODE', 'PRODUCT TITLE', 'ARTIST NAME', 'ALBUM NAME', 'ISRC', 'ALBUM_PRODUCT_CODE', 'GROSS Rev', 'DLs', 'DPD Deduction', 'Pre-SPlit Revenue', 'Split', 'Total Payable']
	  ]
	},
	# emusic electronic (updated version w/ less detail)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 5,
	  lines => [
		['eMusic Track ID', 'Track Number', 'Track Name', 'CD Volume', 'Artist Name', 'UPC', 'ISRC','Release/Album Name', 'Number of Downloads', 'Net Unit Price', 'Total Unit Sales']
	  ]
	},
	# emusic electronic (updated version w/ two extra columns in front)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 8,
	  lines => [
		['Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Track Number', 'Track Name', 'CD Volume', 'Artist Name', 'UPC', 'ISRC','Release/Album Name', 'Number of Downloads', 'Net Unit Price', 'Total Unit Sales']
	  ]
	},
	# emusic (like v.8, but with territory)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 14,
	  lines => [
		['Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Track Number', 'Track Name', 'CD Volume', 'Artist Name', 'UPC', 'ISRC','Release/Album Name', 'ISO Code', 'Number of Downloads', 'Net Unit Price', 'Total Unit Sales']
	  ]
	},
	# emusic (like v.14, but with public domain column)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 16,
	  lines => [
		['Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Track Number', 'Track Name', 'CD Volume', 'Artist Name', 'UPC', 'ISRC','Release/Album Name', 'ISO Code', 'Number of Downloads', 'Public Domain Reimbursement', 'Net Unit Price', 'Total Unit Sales']
	  ]
	},
	# emusic another version similar to 14 but with total payable
	{ service => Client::Service::DSP_EMUSIC,
	  version => 18,
	  lines => [
		['Royaltor Code', 'Royaltor Name', 'eMusic Track ID',
		'eMusic Album ID', 'Track Number', 'Track Name', 'CD Volume',
		'Artist Name', 'UPC', 'ISRC', 'Release/Album Name', 'ISO Code',
		'Number of Downloads', 'Royalty Pool Per Track', 'Mechanical Deduction',
		'Public Domain Reimbursement', 'Net Royalty Pool Per Track',
		'Net Unit Rate', undef]
	  ]
	},
	# emusic
	{ service => Client::Service::DSP_EMUSIC,
	  version => 20,
	  lines => [
		['Site', 'Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Album ID',
		'Track Num', 'Track Name', 'CD Volume', 'Artist Name', 'UPC', 'ISRC',
		'Release/Album Name', 'ISO Code', 'Num Downloads', 'Currency',
		'Royalty Pool Per Track', 'PD Reimbursement', 'Mechanical Deduction',
		'Net Royalty Pool', 'Total Unit Sales', 'Net Unit Price', undef]
	  ]
	},
	# emusic
	{ service => Client::Service::DSP_EMUSIC,
	  version => 21,
	  lines => [
		['Site', 'Start Date', 'End Date', 'Config', 'Sale Type', 'Original Sale Date',
		 'Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Album ID', 'Disc #',
		 'Track #', 'Track Name', 'Artist Name', 'UPC', 'ISRC', 'Release/Album Name',
		 'ISO', 'Units', 'Credit Value', 'PD Reimbursement', 'DPD Deductions',
		 'Unit Rate', 'Total Track Sales Due', 'Total Album Sales Due',
		 'Total Royalty Earned', 'Currency']
	  ]
	},
	# emusic
	{ service => Client::Service::DSP_EMUSIC,
	  version => 22,
	  lines => [
        ['Site', 'Start Date', 'End Date', 'Config', 'Sale Type', 'Original Sale Date',
         'Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Album ID', 'Disc #',
         'Track #', 'Track Name', 'Artist Name', 'UPC', 'ISRC', 'Release/Album Name',
         'ISO', 'Pin-Code', 'CMA', 'CMA-ID', 'Units', 'ALC Minima', 'Retail Price',
         'eMusic Wholesale Minima','Price Basis', 'Gross Unit Rate', 'Gross Amount Due',
         'DPD Deductions', 'Net Unit Rate', 'Total Track Sales Due', 'Total Album Sales Due',
         'CMA Refund Unit Rate', 'Total CMA Refunded',
         'Total Royalty Earned', 'Currency']
	  ]
	},
	# eMusic (FB17245)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 23,
	  lines => [
        [
'Site', 'Start Date', 'End Date', 'User Type', 'Config', 'Sale Type', 'Original Sale Date \(For CMA Refunds Only\)', 'Royaltor Code', 'Royaltor Name', 'eMusic Track ID', 'Album ID', 'Disc #', 'Track #', 'Track Name', 'Artist Name', 'UPC', 'ISRC', 'Release/Album Name', 'ISO', 'Pin-Code', 'CMA', 'CMA-ID', 'Units', 'Rate Card Price', 'Retail Price', 'eMusic Wholesale Price', 'Price Basis', 'Gross Unit @ Royaltor\'s Rate', 'Gross Amount Due @ Royaltor\'s Rate', 'DPD Deductions @ Royaltor\'s Rate', 'Net Unit Rate', 'Total Track Sales Due', 'Total Album Sales Due', 'CMA Refund Unit Rate', 'Total CMA Refunded', 'Total Subscription Download Pool Royalty Earned', 'Total A La Carte Royalties', 'Total Royalties', 'Currency'
	 ]
	  ]
	},
	# emusic ????
	{ service => Client::Service::DSP_EMUSIC,
	  version => 6,
	  lines => [
		['Payee', '\_', 'LABEL', 'PRODUCT CODE', 'PRODUCT TITLE', 'ARTIST NAME', 'ISRC', 'ALBUM_PRODUCT_CODE', 'GROSS Rev', 'DLs', 'DPD Deduction', 'Pre-SPlit Revenue', 'Split', 'Total Payable']
	  ]
	},
	# emusic (yet another)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 7,
      sheet => 1,
	  lines => [
        [undef],
        [undef, undef, undef, undef, 'Label Royalty Statement'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef, 'STATEMENT SUMMARY'],
	  ]
	},
	# emusic (yet another... like v.7, but missing the first (blank) tab)
	{ service => Client::Service::DSP_EMUSIC,
	  version => 13,
	  lines => [
        [undef],
        [undef, undef, undef, undef, 'Label Royalty Statement'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef, 'STATEMENT SUMMARY'],
	  ]
	},
    # emusic (q3 2000 - q1 2002)
    { service => Client::Service::DSP_EMUSIC,
      version => 10,
      lines => [
        ['EMUSIC.COM'],
        [undef],
        [undef],
        ['Royalty Statement', 'For the Quarter Ended'],
        [undef],
        ['Payee', '^\d+$'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Returns'],  # 22nd line
      ],
    },
    # emusic (q2 2000 and older)
    { service => Client::Service::DSP_EMUSIC,
      version => 11,
      lines => [
        ['EMUSIC.COM'],
        [undef],
        [undef],
        ['Royalty Statement', 'For the Quarter Ended'],
        [undef],
        ['Payee', '^\d+$'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Returns'],  # 21st line
      ],
    },
    # emusic (q2 02 thru q1 04)
    { service => Client::Service::DSP_EMUSIC,
      version => 9,
      lines => [
        ['EMUSIC.COM'],
        [undef],
        [undef],
        ['Royalty Statement', 'For the Quarter Ended'],
        [undef],
        ['Payee', '^\d+$'],
      ],
    },
	# emusic mechanicals 08/2006 and beyond
	{ service => Client::Service::DSP_EMUSIC,
	  version => 12,
	  lines => [
		['LICENSE', 'ALBUM TITLE', 'CAT', 'SONG TITLE', 'PUB NAME', 'SPLIT', 'UNITS', 'AMOUNT DUE'],
	  ]
	},
	# emusic 3rd party sales
	{ service => Client::Service::DSP_EMUSIC,
	  version => 15,
	  lines => [
        [undef],
        [undef],
		['Track UPC', 'Track Name', 'Album Name', 'Artist Name', 'Label Name', 'Net Units Sold', 'Unit Price', 'Total Unit Sales'],
	  ]
	},
    # emusic 2008 Q2 suplemental sales file
    { service => Client::Service::DSP_EMUSIC,
        version => 17,
        lines => [
            ['eMusic Track ID','ISRC Code','UPC Code','Artist','Album Title','Track #','Track Title','Track Time','Downloads','Royalty Pool Per Track','Mechanical \(DPD\) Deduction','Net Royalty Pool Per Track',undef,'Album Total Payable'],
        ],
    },
    # emusic audio book
    { service => Client::Service::DSP_EMUSIC,
        version => 19,
        match_on_any_row => 1,
        lines => [
            ['eMusic Track ID', 'ISBN', 'Author', 'Narrator', 'Title',
            'Gross Units', 'Credit Units', 'Net Units', 'Unit Rate', 'Total Due'],
        ],
    },
	# Melodic (FB14825)
	{ service => Client::Service::DSP_MELODIC,
	  version => 1,
          match_on_any_row => 1,
	  lines => [
        ['Melodic Ltd.'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['STATEMENT'],
	  ],
	  file_name => '(melodic.*physical)', # filename must have "melodic" and "physical" in it
	},
	# Melodic (FB14826)
	{ service => Client::Service::DSP_MELODIC,
	  version => 2,
          match_on_any_row => 1,
	  lines => [
        ['Melodic Ltd.'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['STATEMENT'],
	  ],
	  file_name => '(melodic.*digital)', # filename must have "melodic" and "digital" in it
	},
	# Hostess (FB15147)
	{ service => Client::Service::DSP_HOSTESS,
	  version => 1,
          match_on_any_row => 1,
	  lines => [
        [
'Start Date', 'End Date', 'UPC', 'ISRC', undef, 'Quantity', 'Net Royalty', 'Net Royalty Total', 'Sale or Return', 'Transaction', 'Item Artist', 'Item Title', 'Side', 'Code', undef, undef, undef, 'Membership Type', 'Account ID'
		],
	  ],
	},
	# Hostess (FB15681)
	{ service => Client::Service::DSP_HOSTESS,
	  version => 2,
          match_on_any_row => 1,
	  lines => [
        [
'Start Date', 'End Date', 'UPC', 'ISRC', undef, 'Quantity', 'Net Royalty', 'Net Royalty Total', 'Sale or Return', 'Transaction', 'Item Artist', 'Item Title', 'Side', 'Code', undef, undef, undef, undef, 'End Date'
		],
	  ],
	},
	# Cargo Physical (FB15154)
	{ service => Client::Service::DSP_CARGO,
	  version => 1,
          match_on_any_row => 1,
	  lines => [
        [
'ITEM_ID', 'ARTICLE_ID', 'BARCODE', 'FOR', 'ARTIST', 'TITLE', 'DATE_BEGIN', 'DATE_END', 'BEGIN_STOCK', 'INCOMING_QTY', 'CORRECT_QTY', 'PROMO_QTY', 'END_STOCK', 'SOLD_QTY', 'TURNOVER', 'PROVISION', 'NET_AMOUNT', 'RMA_FEE', 'RMA_QTY', 'VPCK_FEE', 'VPCK_QTY', 'CURRENCY', 'NEG_SAL_QTY', 'REMARK', 'OWNER_ID'
		],
	  ],
	},
	# VPRecords - Content Connect Africa (FB15109)
	{ service => Client::Service::DSP_CONTENT_CONNECT_AFRICA,
	  version => 1,
          sheet => 'any',
          match_on_any_row => 1,
	  lines => [
[
'Month', 'SERVICE', 'MNO', 'Territory', 'CCACODE', 'DESCRIPTION', 'ARTIST', 'ALBUM', 'LABEL', 'ISRC', 'CONTENTTYPE', 'RATE', 'COUNT', 'REVENUE', 'RATE \(ex 18% VAT\)', 'RATE \(ex 20% Excise Duty\)', 'RATE \(ex 20% MTN Deemed costs\)', 'Aggr Share', 'Aggr Payout', 'Copyright Provision', 'Net Aggr Payout', 'Supplier Payout \(USh\)', 'Supplier Payout \(\w{3}\)'
]
	  ],
	},

    # Fina
    { service => Client::Service::DSP_FINA,
        version => 1,
        sheet => 0,
        lines => [
            ['Catalog #','Artist','Quantity','Price Paid','Price Sold','Date'],
        ],
    },
    # Fina 2009-01
    { service => Client::Service::DSP_FINA,
        version => 2,
        sheet => 0,
        lines => [
            ['Catalog #','Artist','Title','Quantity','Price Paid','Price Sold','Date'],
        ],
    },
    # Amazon Music Unlimited (FB17333)
	{ service => Client::Service::DSP_AMAZON_MUSIC_UNLIMITED,
	  version => 1,
	  lines => [
		[
'ASIN', 'album id', 'related upc', 'track id', 'isrc', 'total plays', 'total limited download plays', 'total streaming plays', 'artist name', 'album name', 'track name', 'label name', 'territory code', 'effective revenue', 'subscription plan', 'dataset date'

        ],
	  ]
	},
    # Amazon Music Unlimited (FB19339)
	{ service => Client::Service::DSP_AMAZON_MUSIC_UNLIMITED,
	  version => 1, # slightly different header, but still version 1
	  lines => [
		[
'asin', 'proprietary album id', 'album upc', 'proprietary track id', 'isrc', 'total plays', 'total plays from conditional downloads', 'total streams', 'artist name', 'album name', 'track name', 'label name', 'territory code', 'effective royalties', 'subscription plan', 'dataset date'
        ],
	  ]
	},
    # Amazon Cloud (FB16847)
	{ service => Client::Service::DSP_AMAZON_CLOUD,
	  version => 1,
	  lines => [
        ['Amazon \w\w Cloud Services \(Cost in \w\w\w\)'],
        [undef],
		[
            'ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'SUBSCRIPTION_PLAN', 'PLAYS', 'DOWNLOADS', 'STREAMS', 'UPLOADS', 'ARTIST_NAME', 'ALBUM_NAME', 'TRACK_NAME', 'LABEL_NAME'
        ],
	  ]
	},
    # Amazon Cloud (FB17072)
	{ service => Client::Service::DSP_AMAZON_CLOUD,
	  version => 1,
	  lines => [
        ['Amazon \w\w Cloud Services'],
        [undef],
		[
            'ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'SUBSCRIPTION_PLAN', 'PLAYS', 'DOWNLOADS', 'STREAMS', 'UPLOADS', 'ARTIST_NAME', 'ALBUM_NAME', 'TRACK_NAME', 'LABEL_NAME'
        ],
	  ]
	},
    # Amazon Cloud (FB12458)
	{ service => Client::Service::DSP_AMAZON_CLOUD,
	  version => 2,
          sheet => 'any',
          match_on_any_row => 1,
	  lines => [
		[
'MRI Song ID', 'Composition Title', 'Composers', 'Month', 'Tier', 'Count', 'Publisher', 'Share', 'Royalty Rate', 'Royalties'
        ],
	  ]
	},
    # ada
	{ service => Client::Service::DSP_ADA,
	  version => 1,
	  lines => [
        ['Alternative Distribution Alliance'],
        [undef],
        [undef],
        [undef],
		['Company','Code','DSP_Name','First_Rel_UPC'],
	  ]
	},
    # ADA (FB16893) wmi header
    { service => Client::Service::DSP_ADA,
        version => 16,
        sheet => 'any',
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 4,
            ['Company', 'Code', 'Media Code', 'DSP_NAME', 'Territ Code', 'Artist', 'Title', 'FIRST REL UPC', 'Product Identifier', 'Product ID', 'D\/F', 'PPD Price', 'Monthly Units', 'Monthly Total Sales', 'Revenue due Label'],
        ],
    },
    # ADA (FB13031)
    { service => Client::Service::DSP_ADA,
        version => 6,
        sheet => 'any',
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 3,
            ['Company','Code','Media Code','DSP Name','First Rel UPC','Product Identifier','Product ID Type Code','Artist','Title','D\/F','PPD Price','Monthly Units','Monthly Total Sales','Revenue due Label'],
        ],
    },
    { service => Client::Service::DSP_ADA,
        version => 7,
        sheet => 'any',
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 3,
            ['Company', 'Code', 'Media Code', 'DSP Name', 'First Rel UPC', 'Product Identifier', 'Product ID Type Code', 'Artist', 'Title',
	     'PPD Price', 'Monthly Units', 'Monthly Total Sales', 'DMC'],
        ],
    },
    # v15 is almost the same as v11, but the WMI tab is slightly different
    { service => Client::Service::DSP_ADA,
        version => 15,
        sheet => 'any',
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 4,
             ['Company', 'Label', 'Code', 'Media Code', 'DSP Name', 'Territory', 'Artist', 'Title', 'First Rel UPC', 'Product Identifier', 'Product ID Type Code', 'D\/F', 'PPD Price', 'Monthly Units', 'Monthly Total Sales', 'Revenue due Label']

        ],
    },    
    { service => Client::Service::DSP_ADA,
        version => 11,
        sheet => 'any',
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 4,
            ['Company', 'Label', 'Code', 'Media Code', 'DSP Name', 'First Rel UPC', 'Product Identifier', 'Product ID Type Code', 'Artist', 'Title', 'D\/F', 'PPD Price', 'Monthly Units', 'Monthly Total Sales', 'Revenue due Label'],
        ],
    },    
    # ADA Global - FB13508
    { service => Client::Service::DSP_ADAPHYS,
        version => 3,
        sheet => 1,
        lines => [
            [ 'Type', 'Customer Name', 'SOP Number', 'Document Date', 'Item Number', 'Item Description',
            'QTY', 'Extended Price', 'Item Class Code', 'Price Group', 'Sales Territory', undef,
            'Distribution Fee', undef, 'Copyright', 'Returns \& Free Processing Fee']
        ],
    },
    # ADA Global - FB13416
    { service => Client::Service::DSP_ADAPHYS,
        version => 4,
        sheet => 'any',
        #match_on_any_row => 1,
        lines => [
            [
               'Label', 'Catalogue No', 'Release Artist', 'Release Title',
               'Release Type', 'Media Type', 'Format\/Config', 'UPC',
               'Vendor Sale ID', 'Vendor', 'Country of Sale', 'Country Code',
               'UK PPD Price', 'Units Sold', 'Units Returned', 'Net Units',
               'Discount %', 'Total Discount', 'Sales', 'Returns', 'Net Income',
               'Distribution Fee', 'Returns Fee', 'Net Payable'
            ]
        ],
    },
    # ADA - FB16116, FB16136
    { service => Client::Service::DSP_ADA,
        version => 13,
        sheet => 'any',
        lines => [
            ['Label', 'Label Code', 'Catalogue No', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Transaction Date', 'Vendor', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Returns', 'Net Income', 'ADA Distribution Fee', 'Net Payable'],
        ],
    },    
    # ADA - FB16729
    { service => Client::Service::DSP_ADA,
        version => 13,
        sheet => 'any',
        lines => [
            ['Label', 'Label Code', 'Catalogue No', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Transaction Date', 'Vendor', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Adjustments', 'Net Units', 'Sales', 'Digital Adjustments', 'Net Income', 'ADA Distribution Fee', 'Net Payable'],
        ],
    },    
    # ADA - FB2106
    { service => Client::Service::DSP_ADA,
        version => 20,
        sheet => 'any',
        lines => [
            ['Label', 'Label Code', 'Catalogue No', 'Project', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Transaction Date', 'Vendor', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Adjustments', 'Net Units', 'Sales', 'Digital Adjustments', 'Net Income', 'ADA Distribution Fee', 'Net Payable'],
        ],
    },    
    # ADA Global - FB16135
    { service => Client::Service::DSP_ADAPHYS,
        version => 6,
        sheet => 'any',
        lines => [
            [
               'Label', 'Label Code', 'Catalogue No', 'Release Artist', 'Release Title',
               'Release Type', 'Media Type', 'Format\/Config', 'UPC',
               'Vendor Sale ID', 'Vendor', 'Country of Sale', 'Country Code',
               'UK PPD Price', 'Units Sold', 'Units Returned', 'Net Units',
               'Discount %', 'Total Discount', 'Sales', 'Returns', 'Net Income',
               'ADA Distribution Fee', 'Returns Fee', 'Net Payable'
            ]
        ],
    },
    # ADA Global - FB13460
    { service => Client::Service::DSP_ADA,
        version => 8,
        sheet => 'any',
        lines => [
            ['Fearless Records', undef, undef, 'ADA Global Ltd'],
        ],
    },
    # ADA - 2008-03
    { service => Client::Service::DSP_ADA,
        version => 2,
        sheet => 0,
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 3,
            ['Company','Code','Media Code','DSP Name','First Rel UPC','Product Identifier','Product ID Type Code','Artist','Title','D\/F','PPD Price','Monthly Units','Monthly Total Sales','Revenue due Label'],
        ],
    },

    # ADA - 2008-03
    { service => Client::Service::DSP_ADA,
        version => 3,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Company','Code','Media Code','DSP Name','Territory Code','Artist','Title','Start Date','End Date','Product Identifier','Product ID Type Code','D\/F','PPD Price','Monthly Units','Monthly Total Sales','Revenue due Label'],
        ],
    },
    # ADA - 2008-03
    { service => Client::Service::DSP_ADA,
        version => 4,
        sheet => 0,
        lines => [
            ['Alternative Distribution Alliance'],
            ([undef]) x 3,
            ['Company','Code','Media Code','DSP Name','First Rel UPC','Product Identifier','Product ID Type Code','Artist','Title','D\/F','Monthly Units','Monthly Total Sales','Revenue due Label'],
        ],
    },
    # ADA - 2008-03
    { service => Client::Service::DSP_ADA,
        version => 5,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Company','Code','Media Code','DSP Name','Territory Code','Artist','Title','Product Identifier','Product ID Type Code','D\/F','PPD Price','Monthly Units','Monthly Total Sales','Revenue due Label'],
        ],
    },
    # ADA - FB14424
    { service => Client::Service::DSP_ADA,
        version => 9,
        sheet => 'any',
        lines => [
            ['Label', 'Catalogue No', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Transaction Date', 'Vendor', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Mechanicals Withheld \(Y\/N\)', 'Mechanical Withheld Amount', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Returns', 'Net Income', 'Distribution Fee', 'Net Payable'],
        ],
    },
    # ADA - FB14664
    { service => Client::Service::DSP_ADA,
        version => 10,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['PROJECT', 'ARTIST', 'TITLE', 'Identifier', 'ISRC', 'UPC', 'Sales Month', 'Customer', 'Sales Channel','Transaction Type', 'Category', 'Type', 'Sub type', 'Net Units', 'Net Value'],
        ],
    },
    # ADA - FB15666
    { service => Client::Service::DSP_ADA,
        version => 12,
        sheet => 'any',
        lines => [
            ['MONTH', 'DIVISION_NM', 'PROVIDER', 'REPORT_START_DATE', 'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL', 'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE', 'WMG_UNIT_PRICE', 'GROSS_AMOUNT', 'NET_AMOUNT', 'MEDIA_CD', 'FORMAT', 'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD', 'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT', 'ORACLE_COMPANY', 'ORACLE_LABEL', 'ORG_ID', 'REPERTOIRE_OWNER', 'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'PROFIT_CENTER', 'WBS_ELEMENT', 'SAP_COMPANY_CODE', 'INCOME_OWNER', 'INCOME_OWN_DOMESTIC_TERRITORY', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME', 'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD', 'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM', 'SALES_TYPE', 'TRX_TYPE', 'EMDII'],
        ],
    },    
    # Fearless / ADA - FB16429
    { service => Client::Service::DSP_ADA,
        version => 14,
        sheet => 'any',
        lines => [
            ['MONTH', 'DIVISION_NM', 'PROVIDER', 'REPORT_START_DATE', 'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL', 'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE', 'WMG_UNIT_PRICE', 'GROSS_AMOUNT', 'NET_AMOUNT', 'MEDIA_CD', 'FORMAT', 'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD', 'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT', 'ORACLE_COMPANY', 'ORACLE_LABEL', 'ORG_ID', 'REPERTOIRE_OWNER', 'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'PROFIT_CENTER', 'WBS_ELEMENT', 'SAP_COMPANY_CODE', 'INCOME_OWNER', 'INCOME_OWN_DOMESTIC_TERRITORY', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME', 'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD', 'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM', 'SALES_TYPE', 'TRX_TYPE', 'EMD'],
        ],
    },    
    # Fearless / ADA - FBoD8325
    { service => Client::Service::DSP_ADA,
        version => 29,
        sheet => 'any',
        lines =>
        [
            [
                'MONTH', 'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'TERRITORY_CD', 'ARTIST', 'TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE',
                'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'FIRST_REL_UPC', 'ACTIVE_LABEL', 
                'TERRITORY_CD_DESCRIPTION', 'ACTIVE_ADA_LABEL', 'GRID', 'DOM_DIGITAL_TYPE', 'INTERNATIONAL_DIG_TYPE', 'REPORT_NAME',
                'LABEL_GROUP_CODE2', 'PROJECT_TITLE', 'Profit Center Name', 'Profit Center', 'CC', 'PC', 'WBS', 'EMDII'
            ]
        ],
    },    
    # Nettwerk / ADA - FB17604
    { service => Client::Service::DSP_ADA,
        version => 17,
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'TERRITORY_CD', 'ARTIST', 'TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'FIRST_REL_UPC', 'ACTIVE_LABEL', 'TERRITORY_CD_DESCRIPTION', 'ACTIVE_ADA_LABEL', 'GRID', 'TRANSACTION_DATE', 'DSP2'
            ]
        ],
    },    
    # Nettwerk / ADA - FB4897
    { service => Client::Service::DSP_ADA,
        version => 24, # almost the same as version 17
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'TERRITORY_CD', 'ARTIST', 'TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'ACTIVE_LABEL', 'TERRITORY_CD_DESCRIPTION', 'ACTIVE_ADA_LABEL', 'GRID', 'TRANSACTION_DATE', 'DSP2'
            ]
        ],
    },    
    # Nettwerk / ADA - FB17605
    { service => Client::Service::DSP_ADA,
        version => 18,
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', 'DSP2'
            ]
        ],
    },    
    # Nettwerk / ADA - FB4897
    { service => Client::Service::DSP_ADA,
        version => 23, # almost the same as version 18
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', 'DSP2'
            ]
        ],
    },    
    # Nettwerk / ADA - FB17607
    { service => Client::Service::DSP_ADA,
        version => 19,
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'LABEL', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', 'DSP2'
            ]
        ],
    },    
    # Nettwerk / ADA - FB4897
    { service => Client::Service::DSP_ADA,
        version => 25, # almost the same as version 19
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'LABEL', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', '(DSP2|RETAILER_NAME)'
            ]
        ],
    },    
    # Fearless / ADA - FB2985
    { service => Client::Service::DSP_ADA,
        version => 21,
        sheet => 'any',
        lines => [
            [
'Label', 'Label Code', 'Catalogue No', 'Project', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Transaction Date', 'Vendor', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Returns', 'Net Income', 'ADA Distribution Fee', 'Net Payable'
            ]
        ],
    },    
    # ElevenSeven / ADA - FB2929
    { service => Client::Service::DSP_ADA,
        version => 22,
        sheet => 'any',
        lines => [
            [
'Label', 'Label Code', 'Catalogue No', 'Project', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Transaction Date', 'Vendor', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Digital Adjustments', 'Net Income', 'ADA Distribution Fee', 'Net Payable'
            ]
        ],
    },    
    # Nettwerk / ADA - FB6839
    { service => Client::Service::DSP_ADA,
        version => 26,
        sheet => 'any',
        lines => [
            [
'DSP Name', 'Start Date', 'End Date', 'Artist', 'Title', 'Product', 'Media Code', 'Format Code', 'Selection Number', 'Artist Number', 'Label Code', 'Extended Family', 'Oracle Co.', 'ORG ID', 'GL Account', 'WBS Element', 'SAP Profit Center', 'SAP Company Code', 'Comm Model Type', 'Interface Group', 'Posted Date', 'Units', 'Gross Amt', 'Net Amt', 'WMG Amt'
            ]
        ],
    },    
    # Nettwerk / ADA - FB7511
    { service => Client::Service::DSP_ADA,
        version => 27,
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'TERRITORY_CD', 'ARTIST', 'TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'ACTIVE_LABEL', 'TERRITORY_CD_DESCRIPTION', 'ACTIVE_ADA_LABEL', 'GRID', 'TRANSACTION_DATE', 'RETAILER_NAME'
            ]
        ],
    },    
    # Nettwerk / ADA - FB8047
    { service => Client::Service::DSP_ADA,
        version => 28, # almost the same as version 25/19, but w/ extra column (PPD_PRICE) and LABEL in a different place
        sheet => 'any',
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'LABEL', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', '(DSP2|RETAILER_NAME)'
            ]
        ],
    },    
    # ADA Digital - FB8637
    { service => Client::Service::DSP_ADA,
        version => 30,
        sheet => 'any',
        lines => [
            [
'Month', 'Company', 'Code', 'Media Code', 'DSP_NAME', 'Territory Code', 'Artist', 'Title', 'FIRST_REL_UPC', 'Product Identifier', 'Product ID', 'D/F', 'PPD Price', 'Monthly Units', 'Monthly Total Sales', 'Revenue due Label', 'SEG6', 'Type2', 'LABEL_GROUP', 'LABEL', 'ACTIVE_LABEL', 'TERRITORY_CD_DESCRIPTION', 'ACTIVE_ADA_LABEL', 'GRID', 'REPORT_NAME', 'PROJECT_TITLE', 'TRANSACTION_DATE', 'WEB_WIRELESS', 'Profit Center Name', 'Profit Center', 'Profit Center Group', 'CC', 'PC', 'WBS', 'EMD', '^$'
            ]
        ],
    },    
    # ADA Digital - FB9872
    { service => Client::Service::DSP_ADA,
        version => 31,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'MONTH', 'DIVISION_NM', 'PROVIDER', 'RET_NAME|RETAILER', 'REPORT_START_DATE', 'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL', 'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE', 'WMG_UNIT_PRICE', 'GROSS_AMOUNT', 'NET_AMOUNT', 'MEDIA_CD', 'FORMAT', 'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD', 'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT', 'ORACLE_COMPANY', 'ORACLE_LABEL', 'ORG_ID', 'REPERTOIRE_OWNER', 'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'PROFIT_CENTER', 'WBS_ELEMENT', 'SAP_COMPANY_CODE', 'INCOME_OWNER', 'INCOME_OWN_DOMESTIC_TERRITORY', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME', 'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD', 'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM', 'SALES_TYPE', 'TRX_TYPE', 'EMD'
            ]
        ],
    },    
    # ADA Digital - FB10654
    { service => Client::Service::DSP_ADA,
        version => 32,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'MONTH', 'DIVISION_NM', 'PROVIDER', 'RET_NAME|RETAILER', 'REPORT_START_DATE', 'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL', 'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE', 'WMG_UNIT_PRICE', 'GROSS_AMOUNT', 'NET_AMOUNT', 'MEDIA_CD', 'FORMAT', 'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD', 'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT', 'ORG_ID', 'REPERTOIRE_OWNER', 'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'PROFIT_CENTER', 'WBS_ELEMENT', 'SAP_COMPANY_CODE', 'INCOME_OWNER', 'INCOME_OWN_DOMESTIC_TERRITORY', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME', 'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD', 'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM', 'SALES_TYPE', 'TRX_TYPE', 'EMD', '^$'
            ]
        ],
    },        
    # ADA Digital - FB12856
    { service => Client::Service::DSP_ADA,
        version => 33,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'LABEL', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', 'RETAILER_NAME','^$'

            ]
        ],
    },        
    # ADA Digital - FB17059 (same as v33 but with extra column)
    { service => Client::Service::DSP_ADA,
        version => 33,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'LABEL_CODE', 'MEDIA_CODE', 'DSP_NAME', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'ARTIST', 'TITLE', 'PPD_PRICE', 'MONTHLY_UNITS', 'MONTHLY_TOTAL_SALE', 'DISTRIBUTION_MEDIUM_CD', 'LABEL', 'TERRITORY_CD', 'LABEL_GROUP_CODE', 'LABEL_GROUP', 'EXTENDED_FAMILY', 'ACTIVE_LABEL', 'ACTIVE_ADA_LABEL', 'TRANSACTION_DATE', 'RETAILER_NAME','PRICE_GRADE','^$'

            ]
        ],
    },        
    # ada physical
    { service => Client::Service::DSP_ADAPHYS,
      version => 2,
      sheet => 1,
      lines => [
        ['Alternative Distribution Alliance'],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Company','Code','Cfg','Disc','SPG','UPC','Selection','Artist','Title']
      ]
    },
    # ada physical
    { service => Client::Service::DSP_ADAPHYS,
      version => 7,
      sheet => 'any',
      lines => [
        ['Alternative Distribution Alliance'],
        [undef],
        [undef],
        [undef],
        [undef],
        [
'Company', 'Label', 'Code', 'Cfg', '% Disc', 'SPG Code', 'UPC', 'Selection', 'Artist', 'Title', 'D/F', 'Before Discount', 'Discount', 'Gross Units', 'Gross Amount', 'Bill. Amount', 'Bill. Units', 'Avg P/U', 'RTLPRICE', 'BASE PRICE'
	]
      ]
    },    
    # ada physical
    { service => Client::Service::DSP_ADAPHYS,
      version => 5,
      sheet => 'any',
      lines => [
        ['Alternative Distribution Alliance'],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Company', 'Label', 'Code', 'Cfg']
      ]
    },    
    # ada physical
	{ service => Client::Service::DSP_ADAPHYS,
	  version => 1,
	  lines => [
        ['Alternative Distribution Alliance'],
        [undef],
        [undef],
        [undef],
        [undef],
		['Company', 'Code', 'Cfg', 'Disc', 'SPG', 'UPC']
	  ]
	},
    # music unlimited (FB16106)
    { service => Client::Service::DSP_MUSIC_UNLIMITED,
       version => 1,
       lines => [
       ['Account Name', 'Application', 'Territory', 'Operator', 'Device', 'Tariff', 'Sales period begin', 'Sales period end', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Customer Period', 'Number of Transactions', 'Record Label Company Name', 'Sub-Record Label Company Name', 'Label', 'Period', 'Service', 'Lookup', 'PPU', 'Royalty', 'Currency', 'USD Royalty'],
       ]
    },
    # ecast
    { service => Client::Service::DSP_ECAST,
      version => 1,
      sheet => 0,
      lines => [
          [undef],
          [undef],
          [undef],
          [undef],
          ['INCOME_SOURCE_PRODUCT_ID', 'PRODUCT_TITLE_TX', 'INCOME_SOURCE_SELECTION_ID', 'SELECTION_TITLE_TX', 'ARTIST_NM', 'UPC_NUM_TX', 'ISRC_NUM_TX', 'PER_UNIT_RATE_AM', 'PERIOD_UNITS_QT', 'PAYMENT_AM', 'INCOME_TYPE_TX', 'OWNER_NM', 'PLAY_TIME_MIN', 'PLAY_TIME_SEC', 'INCOME_SOURCE_TX'],
      ]
    },
    # sno-cap
    { service => Client::Service::DSP_SNOCAP,
      version => 1,
      sheet => 0,
      lines => [
          ['Vendor\/Retailer Name', 'External ID', 'UPC', 'ISRC', 'Snocap ID', 'Quantity', 'Wholesale Price Per Unit', 'Wholesale Value', 'Retail Price Per Unit', 'Retail Value', 'Snocap Fee', 'Artist Name', 'Product Name', 'PRODUCT TYPE', 'Transaction Type'],
      ]
    },
    # aol - same format as ecast only without the 4 blank lines at the top
    { service => Client::Service::DSP_AOL,
      version => 4,
      sheet => 0,
      lines => [
          ['INCOME_SOURCE_PRODUCT_ID', 'PRODUCT_TITLE_TX', 'INCOME_SOURCE_SELECTION_ID', 'SELECTION_TITLE_TX', 'ARTIST_NM', 'UPC_NUM_TX', 'ISRC_NUM_TX', 'PER_UNIT_RATE_AM', 'PERIOD_UNITS_QT', 'PAYMENT_AM', 'INCOME_TYPE_TX', 'OWNER_NM', 'PLAY_TIME_MIN', 'PLAY_TIME_SEC', 'INCOME_SOURCE_TX'],
      ]
    },
    # aol - same format as ecast only without the 4 blank lines at the top
    { service => Client::Service::DSP_AOL,
      version => 5,
      sheet => 0,
      lines => [
          ['Start Date', 'End Date', 'Label', 'Sub-label', 'Title', 'Artist', 'UPC',
          'ISRC', 'Franchise', 'PMMS ID', 'Country', 'Plays - All'],
      ]
    },
    # altnet
    { service => Client::Service::DSP_ALTNET,
      version => 1,
      lines => [
        [undef],
        [undef],
        [undef],
        ['Partner', 'Campaign', 'File', 'UPC', 'ISRC', 'Licenses Issued', 'File Price', 'Total'],
      ],
    },
    # altnet - ugly
    { service => Client::Service::DSP_ALTNET,
      version => 2,
      lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        ['File Data'],
        [undef],
        ['File Name','Campaign','ISRC','UPC',undef,'Sum','Count','Sum','Count'],
      ],
    },
    # altnet ... yet another variant on v.1
    { service => Client::Service::DSP_ALTNET,
      version => 3,
      lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        ['Partner', 'Campaign', 'File', 'UPC', 'ISRC', 'Licenses Issued', 'File Price', 'Total'],
      ],
    },
    # altnet revenue share files
    { service => Client::Service::DSP_ALTNET,
      version => 4,
      lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        ['Partner', 'Campaign\/Album', 'File', 'UPC Code', 'ISRC Code', 'album', 'title', 'author', 'Unit Price', 'Unit Sales', 'Total \$'],
      ],
    },
    # verve
    { service => Client::Service::DSP_VERVE,
      version => 1,
      lines => [
        ['Release #', 'Downloads', 'UPC Code', 'Album Title', 'Artist', 'ISRC#', 'Song Title'],
      ]
    },
    # warp - bleep
    { service => Client::Service::DSP_WARPBLEEP,
      version => 1,
      lines => [
        ['Period', 'From', 'To', 'Label', 'Catalogue', 'Type', 'Artist', 'Title', 'Currency', 'Quantity', 'UnitPrice', 'VAT', 'MCPS', 'Currency Amount', 'ExchRate', 'Sterling Amount', 'Bleep %', 'BleepShare', 'LabelShare'],
      ]
    },
    # warp - bleep (same as above only with upc and isrc after type)
    { service => Client::Service::DSP_WARPBLEEP,
      version => 2,
      lines => [
        ['Period', 'From', 'To', 'Label', 'Catalogue', 'Type', 'UPC', 'ISRC', 'Artist', 'Title', 'Currency', 'Quantity', 'UnitPrice', 'VAT', 'MCPS', 'Currency Amount', 'ExchRate', 'Sterling Amount', 'Bleep %', 'BleepShare', 'LabelShare'],
      ]
    },
    # Naxos Digital
    { service => Client::Service::DSP_NAXOS_DIGITAL,
      version => 1,
      sheet => 'any',
      lines => [
        ['Service', 'Label', 'Country', 'Date', 'CatalogueID', 'UPC', 'Album Title', 'ISRC', 'Track Title', 'Artist\/Composer',
         'Currency', 'Quantity', 'Price', 'Amount', 'Type', 'Delivery Type', 'Net To Label', 'Net To Label \(USD\)'],
      ]
    },
    # Naxos Physical
    { service => Client::Service::DSP_NAXOS_PHYSICAL,
      version => 1,
      sheet => 'any',
      lines => [
        ['Product Line', 'Item', 'UPC', 'Item Description', 'Item Description 2', 'Order Class Descr',
         'Country Name', 'Sales Qty', 'Sales \$', 'Returns Qty', 'Returns \$',
         'Net Sales Qty', 'Net Sales \$', 'Returns Qty', 'Returns \$'],
      ]
    },
    # Naxos Physical - ARC (FB16688)
    { service => Client::Service::DSP_NAXOS_PHYSICAL,
      version => 2,
      sheet => 'any',
      lines => [
        ['Product Line', 'Item', 'UPC', 'Item Description', 'Artist', 'Order Class Descr', 'Country Name',
        'Sales Qty', 'Sales \$', 'Returns Qty', 'Returns \$', 'Net Qty', 'Net \$', 'Returns Qty %', 'Returns \$ %']
      ]
    },
    # Naxos Physical - ARC (FB556)
    { service => Client::Service::DSP_NAXOS_PHYSICAL,
      version => 3,
      sheet => 'any',
      lines => [
        ['ReleaseDate', 'Product Line', 'Item', 'UPC', 'Item Description', 'Artist', 'Order Class Descr', 'Country Name',
        'Sales Qty', 'Sales \$', 'Returns Qty', 'Returns \$', 'Net Qty', 'Net \$', 'Returns Qty %', 'Returns \$ %']
      ]
    },
    # be entertainment
    #{ service => Client::Service::DSP_BEENTERTAINMENT,
    #version => 1,
    #lines => [
        #['Label Revenue Statement'],
        #[undef],
        #[undef],
        #['Label Revenue'],
        #['Begin Date', undef, '^\d+\/\d+\/\d{4}$', 'End Date'],
      #]
    #},
	# echospin
	{ service => Client::Service::DSP_ECHOSPIN,
	  version => 1,
	  lines => [
		['UPC', 'Artist', 'Title', 'Label', 'Sale Price', 'Insertion Fee', 'Royalty Price', 'Quantity', 'Total Sales', 'Total Insertion Fee', 'Total Royalty', 'Type', 'Format', 'Value Add', 'Territory', 'Sales Period'],
	  ]
	},
    # echospin - 2007 Q3
    { service => Client::Service::DSP_ECHOSPIN,
      version => 2,
      lines => [
        ['Media Type','Media ID','Transaction Type','Artist','Label','Title','Version','Unit Fee','Unit Price','Total Units','Total Sales','Value Add Fee','Value Add','Total Due','Format','Territory'],
      ]
    },
	# liquid
	{ service => Client::Service::DSP_LIQUIDAUDIO,
	  version => 1,
	  lines => [
		['Liquid Digital Media/Geneva Media, LLC']
	  ]
	},
	{ service => Client::Service::DSP_LIQUIDAUDIO,
	  version => 2,
	  lines => [
          [undef],
          ['Paid Downloads'],
          [undef],
          [undef],
          ['Label','Artist','Title','UPC','ISRC Code','Liquid SKU','Record Count','Price','Extended Price','Num Tracks','Play Time'],
	  ]
	},
    # Dualtone -> Liquid Audio 2008
    { service => Client::Service::DSP_LIQUIDAUDIO,
        version => 3,
        sheet => 0,
        lines => [
            ['Printed Date'],
            ['Dualtone Music Group'],
            ['This report displays the daily totals by product'],
        ],
    },
    # Liquid Digital Audio
    { service => Client::Service::DSP_LIQUIDAUDIO,
        version => 4,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['LABEL','MAIN_ARTIST','ALBUM NAME','TITLE','DIGITAL_UPC','ISRC','SOURCE_REFERENCE_ID','SKU','UNITS','COST','TOTAL COST'],
        ],
    },
	# virgin mega v.1 (through dec. 2005)
	{ service => Client::Service::DSP_VIRGINMEGA,
	  version => 1,
	  lines => [
		['Date of Record', 'Time of Record', 'Period', 'Retailer Identifier', 'Retail URL', 'Digital Identifier', 'Product Artist', 'Product Title', 'Quantity', 'Retail Price TTC', 'Retail Price Currency', 'Dealer Price HT', 'Dealer Price Currency', 'Format'],
	  ]
	},
	# virgin mega v.2 (jan. 2006 through present)
	{ service => Client::Service::DSP_VIRGINMEGA,
	  version => 2,
	  lines => [
        ['TOTAL ROYALTIES'],
		['Date of Record', 'Time of Record', 'Period', 'Retailer Identifier', 'Retail URL', 'Digital Identifier', 'Product Artist', 'Product Title', 'Quantity', 'Retail Price TTC', 'Retail Price Currency', 'Dealer Price HT', 'Dealer Price Currency', 'Format', 'SubTotal'],
	  ]
	},
	# virgin mega v.4  Same as starzik importer so we need to use filename to identify.
	{ service => Client::Service::DSP_VIRGINMEGA,
	  version => 4,
	  file_name => 'VirginMega',
	  lines => [
          ['Country', 'Period', 'Retailer Identifier', 'Format', 'Free Y\/N', 'Sales Type', 'Title Category', 'Per Album or per Track', 'ID Digital Identifier', 'Product Reference', 'Product Code Barre \(UPC\)', 'Album Name', 'Album Artist', 'Track Name', 'Track Artist', 'Label', 'ISRC', 'Number Of Tracks', 'Retail Price \(incl VAT\)', 'PPD \(excl VAT\)', 'Discount %', 'Royalty per unit \(excl VAT\)', 'Quantity', 'Total Amount \(excl VAT\)']
	  ]
	},
	# e uk v.1 (oct 2004 - feb 2005)
	{ service => Client::Service::DSP_E_UK,
	  version => 1,
	  lines => [
		['LABEL', 'DATE OF RECORD', 'TIME OF RECORD', 'REPORTING PERIOD START', 'REPORTING PERIOD END', 'RETAIL IDENTIFIER', 'CONTRACTED PARTY', 'RETAIL URL', 'DATE OF SALE', 'TIME OF SALE', 'DATE OF DOWNLOAD', 'TIME OF DOWNLOAD', 'DIGITAL IDENTIFIER', 'PRODUCT ARTIST', 'PRODUCT TITLE', 'QUANTITY', 'RETAIL PRICE', 'RETAIL PRICE CURRENCY', 'DEALER PRICE', 'DEALER PRICE CURRENCY', 'MEDIA FORMAT', 'BITRATE', 'CONSUMER COUNTRY'],
	  ]
	},
	# e uk v.2 (mar 2005 - may 2005)
	{ service => Client::Service::DSP_E_UK,
	  version => 2,
	  lines => [
		['LABEL', 'DATE OF RECORD', 'TIME OF RECORD', 'REPORTING PERIOD START', 'REPORTING PERIOD END', 'RETAIL IDENTIFIER', 'CONTRACTED PARTY', 'RETAIL URL', 'DIGITAL IDENTIFIER', 'PRODUCT ARTIST', 'PRODUCT TITLE', 'QUANTITY', 'RETAIL PRICE', 'RETAIL PRICE CURRENCY', 'DEALER PRICE', 'DEALER PRICE CURRENCY', 'MEDIA FORMAT', 'BITRATE', 'CONSUMER COUNTRY'],
	  ]
	},
	# e uk v.3 (jun 2005 - dec 2005)
	{ service => Client::Service::DSP_E_UK,
	  version => 3,
	  lines => [
		['LABEL', 'DATE_OF_RECORD', 'TIME_OF_RECORD', 'REPORTING_PERIOD_START', 'REPORTING_PERIOD_END', 'RETAIL_IDENTIFIER', 'CONTRACTED_PARTY', 'RETAIL_URL', 'DIGITAL_IDENTIFIER', 'PRODUCT_ARTIST', 'PRODUCT_TITLE', 'QUANTITY', 'RETAIL_PRICE', 'RETAIL_PRICE_CURRENCY', 'DEALER_PRICE', 'DEALER_PRICE_CURRENCY', 'MEDIA_FORMAT', 'BITRATE', 'CONSUMER_COUNTRY'],
	  ]
	},
	# e uk v.4 (jan 2006 - present?)
	{ service => Client::Service::DSP_E_UK,
	  version => 4,
	  lines => [
		['Date of record', 'Time of record', 'Reporting period start', 'Reporting period end', 'RETAIL IDENTIFIER', 'CONTRACTED PARTY', 'RETAIL URL', 'Date of sale', 'Time of sale', 'Date of Download', 'Time of Download', 'PRODUCT ICPN\/DIGITAL IDENTIFIER', 'PRODUCT\/TRACK - ARTIST', 'PRODUCT\/TRACK - TITLE', 'LABEL', 'SUPPLIER', 'TRACK', 'QUANTITY', 'TOTAL', 'RETAIL PRICE', 'RETAIL PRICE CURRENCY', 'DEALER PRICE', 'DEALER PRICE CURRENCY', 'MEDIA FORMAT', 'BITRATE', 'CONSUMER COUNTRY'],
	  ]
	},
	# e uk v.5, tesco (nov 2004 - jun 2005)
	{ service => Client::Service::DSP_E_UK,
	  version => 5,
	  lines => [
		['Date of record', 'Time of record', 'Period Start', 'Period End', 'Retail Id', 'Contracted Party', 'Retail URL', 'Date of sale', 'Time of sale', 'Date of download', 'Time of download', '247 Product ID', 'Digital Id', 'Artist', 'Title', 'Label', 'Supplier', 'Tracks', 'Quantity', 'EUK Price code', 'Retail price', 'Retail Currency', 'Dealer price', 'Dealer Currency', 'Media Format', 'Bitrate', 'Consumer Country'],
	  ]
	},
	# e uk v.6, tesco (jul 2005 - present?)
	{ service => Client::Service::DSP_E_UK,
	  version => 6,
	  lines => [
		['Date of record', 'Time of record', 'Period Start', 'Period End', 'Retail Id', 'Contracted Party', 'Retail URL', 'Date of sale', 'Time of sale', 'Date of download', 'Time of download', '247 Product ID', 'Digital Id', 'Artist', 'Title', 'Label', 'Supplier', 'Tracks', 'Quantity', 'EUK Price code', 'Retail price', 'Retail Currency', 'Dealer price', 'Dealer Currency', 'Media Format', 'Consumer Country'],
	  ]
	},
      # IC Agency -> Sanctuary UK
  { service => Client::Service::DSP_ICAGENCY,
      version => 1,
      sheet => 0,
      lines => [
        [undef],
        [undef],
        ['ICA'],
        [undef],
        [undef,'ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID',undef,undef,undef,'CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG LABEL'],
        ['']
      ],
  },
  # IC Agency -> Sanctuary UK
  { service => Client::Service::DSP_ICAGENCY,
      version => 2,
      sheet => 0,
      lines => [
        [undef],
        [undef],
        ['ICA'],
        [undef],
        [undef,'ICA ID','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID',undef,undef,undef,'CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY'],
     ],
   },
  # IC Agency -> Sanctuary UK
  { service => Client::Service::DSP_ICAGENCY,
      version => 3,
      sheet => 0,
      lines => [
        [undef],
        [undef],
        ['ICA'],
        [undef],
        [undef,'ISRC','LABEL','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID',undef,undef,undef,'CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY'],
     ],
   },
  # IC Agency -> Sanctuary UK
  { service => Client::Service::DSP_ICAGENCY,
      version => 4,
      sheet => 0,
      lines => [
        [undef],
        [undef],
        ['ICA'],
        [undef],
        [undef,'ICA ID','ISRC',undef,'ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID',undef,undef,undef,'CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY'],
     ],
   },
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 5,
      lines => [
        ['SALES FILE LAYOUT:'],
        [undef],
        ['company name',undef,'MUSIC AIRPORT'],
        [undef],
        ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.', 'ISRC', 'ARTIST', 'TITLE', 'SRG ALBUM REF\.', 'VENDOR', 'PRICE CATEGORY', 'MECHANICALS PAID', 'DEALER PRICE \(LOCAL CURRENCY\)', 'END USER PRICE \(LOCAL CURRENCY\)', 'RECEIPTS \(LOCAL CURRENCY\)', 'CURRENCY', 'EXCHANGE RATE', 'USE?AGE TYPE', 'TERRITORY SOLD', 'TERRITORY CONSUMED', 'SALES DATE', 'QUANTITY']
      ],
    },
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 5,
      lines => [
        ['SALES FILE LAYOUT:'],
        [undef],
        ['MUSIC AIRPORT INC'],
        [undef],
        ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.', 'ISRC', 'ARTIST', 'TITLE', 'SRG ALBUM REF\.', 'VENDOR', 'PRICE CATEGORY', 'MECHANICALS PAID', 'DEALER PRICE \(LOCAL CURRENCY\)', 'END USER PRICE \(LOCAL CURRENCY\)', 'RECEIPTS \(LOCAL CURRENCY\)', 'CURRENCY', 'EXCHANGE RATE', 'USE?AGE TYPE', 'TERRITORY SOLD', 'TERRITORY CONSUMED', 'SALES DATE', 'QUANTITY']
      ],
    },
    # Cybird Co
    { service => Client::Service::DSP_CYBIRD,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['company name','Cybird Co\.\,Ltd'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURR
ENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY',undef],
        ],
    },
    # Cybird Co
    { service => Client::Service::DSP_CYBIRD,
      version => 1,
      sheet => 0,
      lines => [
        [undef],
        [undef],
        ['company name','Cybird Co\.\,Ltd'],
        [undef],
        ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID', 'DEALER PRICE \(LOCAL CURRENCY\)', 'END USER PRICE \(LOCAL CURRENCY\)', 'RECEIPTS \(LOCAL CURRENCY\)', 'CURRENCY', 'EXCHANGE RATE', 'USE?AGE TYPE', 'TERRITORY SOLD', 'TERRITORY CONSUMED', 'SALES DATE', 'QUANTITY']
      ]
    },
    # Cybird Co
    { service => Client::Service::DSP_CYBIRD,
      version => 2,
      sheet => 0,
      lines => [
        ([undef]) x 12,
        [undef,undef,'Cybird NO\.','Title','Artist','CD No\.','CD Title',undef,undef,'Download','Total  \(JPY\)'],
      ]
    },
    # Cybird Co
    { service => Client::Service::DSP_CYBIRD,
      version => 2,
      sheet => 0,
      lines => [
        ([undef]) x 13,
        [undef,undef,'Cybird NO\.','Title','Artist','CD No\.','CD Title',undef,undef,'Download','Total  \(JPY\)'],
      ]
    },
    # SRGIUK - Maho I-Land
    { service => Client::Service::DSP_MAHOILAND,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['company name','Maho i-Land Co\.\, Ltd\, Japan'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # SRGIUK - Maho I-Land TOS
    { service => Client::Service::DSP_MAHOILAND,
        version => 3,
        sheet => 0,
        lines => [
        [undef],
        [undef],
        ['company name','T\.O\.S'],
        [undef],
        ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.', 'ISRC', 'ARTIST', 'TITLE', 'SRG ALBUM REF\.', 'VENDOR', 'PRICE CATEGORY', 'MECHANICALS PAID', 'DEALER PRICE \(LOCAL CURRENCY\)', 'END USER PRICE \(LOCAL CURRENCY\)', 'RECEIPTS \(LOCAL CURRENCY\)', 'CURRENCY', 'EXCHANGE RATE', 'USE?AGE TYPE', 'TERRITORY SOLD', 'TERRITORY CONSUMED', 'SALES DATE', 'QUANTITY']
        ],
    },
    # SRGIUK - Maho I-Land TOS
    { service => Client::Service::DSP_MAHOILAND,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            [undef,'Artist','Title',undef,undef,'Royalty','Total Royalty','Total Royalty',undef],
        ],
    },
    # SRGIUK - Maho I-Land
    { service => Client::Service::DSP_MAHOILAND,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['company name','T\.O\.S'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # SRGIUK - MTI
    { service => Client::Service::DSP_MTI,
        version => 1,
        sheet => 1,
        lines => [
            [undef],
            ['company nameMTI Ltd\.'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\) \[JPY\]','RECEIPTS \(LOCAL CURRENCY\) \[JPY\]','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','\# of download','QUANTITY \[JPY\]'],
        ],
    },
    # SRGIUK - MTI
    { service => Client::Service::DSP_MTI,
        version => 1,
        sheet => 1,
        lines => [
            [undef],
            ['company nameMTI Ltd\.'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\) \[JPY\]','RECEIPTS \(LOCAL CURRENCY\) \[JPY\]','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY \[JPY\]'],
        ],
    },
    # SRGIUK - VIBE Inc.
    { service => Client::Service::DSP_VIBEINC,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['company name: VIBE  Inc\.'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER','ISRC','ARTIST','TITLE','SRG ALBUM REF\. \/ Cat\. No\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # SRGIUK - VIBE Inc.
    { service => Client::Service::DSP_VIBEINC,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['company name: VIBE Inc\.'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER','ISRC','ARTIST','TITLE','SRG ALBUM REF\. \/ Cat\. No\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # SRGIUK - WES
    { service => Client::Service::DSP_WES,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['WES Ltd'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # SRGIUK - Orca
    { service => Client::Service::DSP_ORCA,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['company name'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER','ISRC','ARTIST','TITLE','SRG ALBUM REF\. \/ Cat\. No\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
	# pocket group 2005-09 and before
	{ service => Client::Service::DSP_POCKETGROUP,
	  version => 1,
      sheet => 1,
	  lines => [
		[undef],
        [undef],
        [undef],
        [undef],
		['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.', 'ISRC', 'ARTIST', 'TITLE', 'SRG ALBUM REF\.', 'VENDOR', 'PRICE CATEGORY', 'MECHANICALS PAID', 'DEALER PRICE \(LOCAL CURRENCY\)', 'END USER PRICE \(LOCAL CURRENCY\)', 'RECEIPTS \(LOCAL CURRENCY\)', 'CURRENCY', 'EXCHANGE RATE', 'USE?AGE TYPE', 'TERRITORY SOLD', 'TERRITORY CONSUMED', 'SALES DATE', 'QUANTITY']
	  ]
	},
#	# pocket group 2005-10 and beyond
	{ service => Client::Service::DSP_POCKETGROUP,
	  version => 2,
      sheet => 1,
	  lines => [
		[undef, undef, undef, 'Supplier Code'],
        ['Supplier Report', undef, undef, 'Reporting Month'],
        [undef],
        [undef],
        [undef],
  		['Provider Code', 'Artist', 'Item Name', 'Period', 'Local Currency Code', 'Unit Price', 'FX Rate', 'Unit Price', 'No\. of Units', 'Gross Revenue', 'UK VAT', 'Channel Partner Revenue Share', 'Net Revenue', 'Content Owner Share', 'Content Owner Share', 'ISRC Code']
	  ]
	},
	# pocket group (with UPC and country of sale)
	{ service => Client::Service::DSP_POCKETGROUP,
	  version => 4,
      sheet => 0,
	  lines => [
		[undef, undef, undef, 'Supplier Code'],
        ['Supplier Report', undef, undef, 'Reporting Month'],
        [undef],
        [undef],
        [undef],
  		['Provider', 'Artist', 'Item Name', 'Period', 'Local Currency Code', 'Unit Price', 'FX Rate', 'Unit Price', 'No\. of Units', 'Gross Revenue', 'UK VAT', 'Channel Partner Revenue Share', 'Net Revenue', 'Content Owner Share', 'Content Owner Share', 'ISRC Code', 'UPC Code', 'Country Of Sale']
	  ]
	},
	# pocket group
	{ service => Client::Service::DSP_POCKETGROUP,
	  version => 3,
      sheet => 0,
	  lines => [
		[undef, undef, undef, 'Supplier Code'],
        ['Supplier Report', undef, undef, 'Reporting Month'],
        [undef],
        [undef],
        [undef],
  		['Provider', 'Artist', 'Item Name', 'Period', 'Local Currency Code', 'Unit Price', 'FX Rate', 'Unit Price', 'No\. of Units', 'Gross Revenue', 'UK VAT', 'Channel Partner Revenue Share', 'Net Revenue', 'Content Owner Share', 'Content Owner Share', 'ISRC Code']
	  ]
	},
	# theta
	{ service => Client::Service::DSP_THETA,
	  version => 1,
	  lines => [
        ([undef]) x 9,
		['Title', 'Artist', 'Product Code', 'Downloads', 'Unit Price'],
	  ]
	},
    # theta - with multiple distributors
    { service => Client::Service::DSP_THETA,
      version => 2,
      lines => [
        ([undef]) x 9,
        ['Title', 'Artist', 'Product Code', 'Downloads', '\w+ Downloads'],
      ]
    },
    # fisher price
    { service => Client::Service::DSP_FISHERPRICE,
      version => 1,
      lines => [
        ['Title', 'Artist', 'ISRC', 'Price', 'Quantity', 'Local', 'Extended', 'Rate', 'Gross Payment', 'Fees', 'Net Payment'],
      ]
    },
    # fisher price
    { service => Client::Service::DSP_FISHERPRICE,
      version => 2,
      lines => [
        ([undef]) x 3,
        ['Songs\/Albums','1\$RC','Price','Quantity','Local','Extended \$','Rate','Gross','Fees','Net Payment'],
      ]
    },
    # Fisher Price
    { service => Client::Service::DSP_FISHERPRICE,
        version => 3,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Title','Division','Price','Qty','Local','Extnended \$','Rate','Gross','Fees','New Payment'],
        ],
    },
    # Fisher Price
    { service => Client::Service::DSP_FISHERPRICE,
        version => 3,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Title',undef,'Price','Quantity','Local','Extended \$','Rate','Gross','Fees','Net Payment'],
        ],
    },
    # Fisher Price
    { service => Client::Service::DSP_FISHERPRICE,
        version => 4,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Title', 'Division', undef, 'Exch Rate', 'Price', 'Quantity', 'Local', 'Extended \$', 'Rate',
            'Gross','Fees', 'Net Payment'],
        ],
    },
    # Fisher Price
    { service => Client::Service::DSP_FISHERPRICE,
        version => 5,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Title', 'Division', 'Price', 'Exch Price', 'Price', 'Quantity',
            'Local', 'Extended', 'Fee', 'Payment', 'x', 'Amount'],
        ],
    },
    # Fisher Price
    { service => Client::Service::DSP_FISHERPRICE,
        version => 5,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Title', 'Division', 'Price', 'Exch Price Rate', '\(US \$\)', 'Quantity',
            'Local', 'Price \(US \$\)', 'Rate', 'Gross', 'Fees', 'Payments',],
        ],
    },
    # fisher price
    { service => Client::Service::DSP_FISHERPRICE,
      version => 6,
      lines => [
        ['Title', 'Artist', 'UPC', 'ISRC', 'Price', 'Quantity', 'Local', 'Extended', 'Rate', 'Gross Payment', 'Fees', 'Net Payment'],
      ]
    },
	# musicmatch downloads
	{ service => Client::Service::DSP_MUSICMATCH,
	  version => 1,
	  lines => [
		['SUMMARY'],
		['Start of Period'],
		['End of Period'],
		['Track Downloads'],
		['Album Downloads']
	  ]
	},
	# musicmatch streams
	{ service => Client::Service::DSP_MUSICMATCH,
	  version => 2,
	  lines => [
		['LICENSE_PROVIDER', 'TRIAL_USER_TYPE', 'PLAY_TYPE', 'STAF_PLAY', 'PROVIDER_ID', 'OFFER_ID', 'ISRC', 'UPC', 'TRACK_VOLUME', 'TRACK_NUMBER', 'TRACK_TITLE', 'TRACK_ARTIST', 'ALBUM_TITLE', 'PLAY_COUNT']
	  ]
	},
	# musicmatch streams
	{ service => Client::Service::DSP_MUSICMATCH,
	  version => 3,
	  lines => [
		['LICENSE_PROVIDER', 'TRIAL_USER_TYPE', 'PLAY_TYPE', 'STAF_PLAY', 'PROVIDER_ID', 'OFFER_ID', 'ISRC', 'UPC', 'TRACK_VOLUME', 'TRACK_NUMBER', 'TRACK_TITLE', 'TRACK_ARTIST', 'ALBUM_TITLE', 'LABEL', 'PLAY_COUNT']
	  ]
	},
	# musicmatch streams with royalty amt
	{ service => Client::Service::DSP_MUSICMATCH,
	  version => 4,
	  lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
		['LICENSE_PROVIDER', 'TRIAL_USER_TYPE', 'PLAY_TYPE', 'STAF_PLAY', 'PROVIDER_ID', 'OFFER_ID', 'ISRC', 'UPC', 'TRACK_VOLUME', 'TRACK_NUMBER', 'TRACK_TITLE', 'TRACK_ARTIST', 'ALBUM_TITLE', 'LABEL', 'PLAY_COUNT', 'ROYALTY'],
	  ]
	},
    # musicmatch version 5 is WMG specific
	# realtones
	{ service => Client::Service::DSP_REALTONES,
	  version => 1,
      sheet => 1,
	  lines => [
		['LicenseCompanyID', 'Company', 'ProductType', 'ProductID', 'Author', 'Product', 'Active', 'PayoutType', 'Total Sent', 'AVG Price', 'Net Revenue', 'Total Revenue', 'Total Net Revenue', 'Payment'],
	  ]
	},
	# gillian welch (same headers as real except has multiple tabs
	#{ service => Client::Service::DSP_GILLIANWELCH,
	#  version => 1,
      #sheet => 1,
#	  lines => [
#		['Label Name', 'Label Code', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album #Sequence', 'ISRC', 'Sale Count', 'Unit Price', 'Sale Amount', 'Sale Type', 'Album ID', 'Track ID', 'Catalog ID', #'Report Start Dt', 'Report End Dt']
#	  ]
#	},
	# real downloads
	{ service => Client::Service::DSP_REAL,
	  version => 1,
	  lines => [
		['Label Name', 'Label Code', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', 'Sale Count', 'Unit Price', 'Sale Amount', 'Sale Type', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt']
	  ]
	},
	# real streams w/ new flag for free streams
	{ service => Client::Service::DSP_REAL,
	  version => 3,
	  lines => [
		['Label Name', 'Label Code', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt', 'Demand Play', 'Free Trial Stream']
	  ]
	},
	# real streams
	{ service => Client::Service::DSP_REAL,
	  version => 2,
	  lines => [
		['Label Name', 'Label Code', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt', 'Demand Play']
	  ]
	},
    # real streams
    { service => Client::Service::DSP_REAL,
      version => 2,
      lines => [
        ['Label Name', 'Label Code', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt'],
        ],
    },
	# real streams/downloads combined (old format)
	{ service => Client::Service::DSP_REAL,
	  version => 4,
	  lines => [
        ['Q\d \d+ \w+ DATA SHEET'],
		['Label', 'Artist', 'Album', 'Track', '# of \w+'],
	  ]
	},
	# real streams/downloads combined (old format)
	{ service => Client::Service::DSP_REAL,
	  version => 4,
	  lines => [
        ['Q\d \d+ \w+ DATA SHEET'],
        [undef],
		['Label', 'Artist', 'Album', 'Track', '# of \w+'],
	  ]
	},
	# real streams/downloads combined (even older format)
	{ service => Client::Service::DSP_REAL,
	  version => 5,
	  lines => [
        ['Q\d \d+ DATA SHEET'],
        [undef],
		['Label', 'Artist', 'Album', 'Track', '# of \w+'],
	  ]
	},
    # slaghuis - radio free abattoir
    { service => Client::Service::DSP_SLAGHUIS,
      version => 1,
      lines => [
        ['Radio Free Abattoir Digital Download Service'],
        [undef],
        ['Order #', 'Date', 'Distributor', 'Label', 'Artist', 'Track', 'Price', 'RFA %', 'RFA Fee'],
      ]
    },
    # slaghuis - radio free abattoir new
    { service => Client::Service::DSP_SLAGHUIS,
      version => 2,
      lines => [
        ['Radio Free Abattoir Digital Download Service'],
        [undef],
        ['Order #', 'Date', 'Distributor', 'Label', 'Artist', 'Track', 'Price', 'Fees', 'Net Due'],
      ]
    },
	# sony v.1
	{ service => Client::Service::DSP_SONY,
	  version => 1,
	  lines => [
		['Service Name:', 'Period Start Date:', 'Period End Date:', 'Music Sale Date:', 'ISRC:', 'UPC:', 'Artist Name:', 'Title:', 'Type:', 'Track #:', 'Volume Number:', 'Wholesale Price:', 'Total Sales', 'Total Payment Due']
	  ]
	},
	# sony v.2 (added Album Name)
	{ service => Client::Service::DSP_SONY,
	  version => 2,
	  lines => [
		['Service Name:', 'Period Start Date:', 'Period End Date:', 'Music Sale Date:', 'ISRC:', 'UPC:', 'Artist Name:', 'Album Name:', 'Title:', 'Type:', 'Track #:', 'Volume Number:', 'Wholesale Price:', 'Total Sales', 'Total Payment Due']
	  ]
	},
	# sony v.3 (changed 4th column)
	{ service => Client::Service::DSP_SONY,
	  version => 3,
	  lines => [
		['Service Name:', 'Period Start Date:', 'Period End Date:', 'Month:', 'ISRC:', 'UPC:', 'Artist Name:', 'Album Name:', 'Title:', 'Type:', 'Track #:', 'Volume Number:', 'Wholesale Price:', 'Total Sales', 'Total Payment Due']
	  ]
	},
	# sony v.2 (but in excel)
	{ service => Client::Service::DSP_SONY,
	  version => 2,
	  lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
		['Service Name', 'Period Start Date', 'Period End Date', 'Music Sale Date', 'ISRC', 'UPC', 'Artist Name', 'Album Name', 'Title', 'Type', 'Track #', 'Volume Number', 'Wholesale Price', 'Total Sales', 'Total Payment Due']
	  ]
	},
	# sony, european version
	{ service => Client::Service::DSP_SONY,
	  version => 4,
	  lines => [
		['Master\/header'],
        ['Label Id', 'Label Name', 'Report Date', 'Period Start', 'Period End', 'Total', 'Currency']
	  ]
	},
	# sony, bamarags
	{ service => Client::Service::DSP_SONY,
	  version => 5,
	  match_on_any_row => 1,
	  lines => [
        [
          'Booking Text', 'TP \/ Provider', 'Product Number', 'Product Title',
		  'Produict Artist|Product Artist', 'ISRC', 'Track Title', 'Track Artist', 'Country of Sale',
		  'Configuration', 'Sales Period', 'Dist. Channel', 'Price Level', 'Base Price',
		  'Container Deduction', 'Price Basis', 'Royalty Rate', 'Config', 'Price Line',
		  'Distribution  Channel', 'Territory', 'Other', 'Part %', 'Effective Rate',
		  'Sales Units', 'Net %', 'Pay Units', 'Prod Units', 'Tax Rate %', 'Royalty Payable',
		]

	  ]
	},
	# sony, R&T
	{ service => Client::Service::DSP_SONY,
	  version => 6,
	  match_on_any_row => 1,
      sheet => 'any',
	  lines => [
        [
		  'Billing Period Sap Fisc', 'Businessarea Code', 'Artist', 'Title',
		  'Rec Project Title', 'Rec Project Number', 'ISRC', 'UPC', 'Prod No',
		  'Product Type Nm', 'Samis Dist Channel Type Nm', 'Quantity', 'Amount',
		]

	  ]
	},
	# Sony AUS (DMB) Physical Only
	{ service => Client::Service::DSP_SONY,
	  version => 7,
	  lines => [
        [
		    'STACode#', 'Period', 'Short Name', 'Beneficiary Name', 'Agreement#', 'Agreement Name', 'Code', 'Channel', 'Product Name', 'Product Artist', 'Track Name', 'Track Artist', 'RAAS#', 'Month', 'Price Line', 'Roy\.Rate\/Roy\.Amt', 'Price', 'Sales Tax', 'Cover Deduction', 'Net Receipt', 'PPO%', 'Share%', 'Reserved B\/F', 'Unit Period', 'Net Unit Reserved', 'Unit Total', 'Total Royalty',
        ],
        [
            undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,'\w{1} (31|39|73)',
        ]
	  ]
	},	
	# Sony AUS (DMB) Digital Only
	{ service => Client::Service::DSP_SONY,
	  version => 8,
	  lines => [
        [
		    'STACode#', 'Period', 'Short Name', 'Beneficiary Name', 'Agreement#', 'Agreement Name', 'Code', 'Channel', 'Product Name', 'Product Artist', 'Track Name', 'Track Artist', 'RAAS#', 'Month', 'Price Line', 'Roy\.Rate\/Roy\.Amt', 'Price', 'Sales Tax', 'Cover Deduction', 'Net Receipt', 'PPO%', 'Share%', 'Reserved B\/F', 'Unit Period', 'Net Unit Reserved', 'Unit Total', 'Total Royalty',
        ],
        [
            undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,'\w{1} (91|95|B5|R3|R5)',
        ]
	  ]
	},		
	# Sony US - Razor & Tie (FB16972))
	{ service => Client::Service::DSP_SONY,
	  version => 9,
          match_on_any_row => 1,
	  lines => [
        [
'Statement Month', 'RAAS Artist', 'RAAS Title', 'Material', 'UPC Barcode', 'Reporting Period Fro', 'Reporting Period To', 'ISRC', 'Retail - Rate', 'Customer - Rate', 'Provider', 'Product Type', 'Download Type', 'Wholesale - Rate', 'Label Code', 'Division', 'Net value', 'QTY'
        ],
	  ]
	},		
	# Sony AUS Physical - Bamarags (FB6)
	{ service => Client::Service::DSP_SONY,
	  version => 10,
          match_on_any_row => 1,
	  lines => [
        [
'Product Number', 'Title', 'Product Artist', 'Configuration', 'Track Number', 'Track Title', 'Track Artist', 'Country', 'Distributio Manner', 'Price Line', 'Royalty Base Price', 'Units', 'Product Share %', 'Royalty Rate %', 'Royalty per Unit', 'Income Share', 'Royalty Amount'
        ],
        [
undef, undef, undef, '(vinyl|dvd|cd)'
        ],
	  ]
	},		
	# Sony AUS Digital - Bamarags (FB28)
	{ service => Client::Service::DSP_SONY,
	  version => 11,
          match_on_any_row => 1,
	  lines => [
        [
'Product Number', 'Title', 'Product Artist', 'Configuration', 'Track Number', 'Track Title', 'Track Artist', 'Country', 'Distributio Manner', 'Price Line', 'Royalty Base Price', 'Units', 'Product Share %', 'Royalty Rate %', 'Royalty per Unit', 'Income Share', 'Royalty Amount'
        ],
        [
undef, undef, undef, '(digital|mastertone)'
        ],
	  ]
	},		
	# Sony AUS Physical - Bamarags, FB1509
	{ service => Client::Service::DSP_SONY,
	  version => 17,
          match_on_any_row => 1,
	  lines => [
        [
'Product Number', 'Title', 'Product Artist', 'Configuration', 'Track Number', 'Barcode \(UPC\)', 'Track Title', 'Track Artist', 'Country', 'Distributio Manner', 'Price.*Line', 'Royalty Base Price', 'Units', 'Product Share %', 'Royalty Rate %', 'Royalty.*per Unit', 'Income Share', 'Royalty Amount'
        ],
        [
undef, undef, undef, '(longplay)'
        ],
	  ]
	},
	# Sony AUS Digital - Bamarags (FB28)
	{ service => Client::Service::DSP_SONY,
	  version => 16,
          match_on_any_row => 1,
	  lines => [
        [
'Product Number', 'Title', 'Product Artist', 'Configuration', 'Track Number', 'Barcode \(UPC\)', 'Track Title', 'Track Artist', 'Country', 'Distributio Manner', 'Price Line', 'Royalty Base Price', 'Units', 'Product Share %', 'Royalty Rate %', 'Royalty per Unit', 'Income Share', 'Royalty Amount'
        ],
        [
undef, undef, undef, '(digital|mastertone)'
        ],
	  ]
	},
	# Sony Foreign Physical - Relativity (FB942)
	{ service => Client::Service::DSP_SONY,
	  version => 12,
          match_on_any_row => 1,
	  lines => [
        [
'Booking text', 'Product Artist', 'Product title', 'Track number', 'Track name', 'Track Artist', 'Product number', 'Country', 'Config', 'Sales Period', 'Distribution channel', 'Price level', 'Base Price', 'Cont deduct', 'Price Basis', 'Rate Percentage', 'Config deduct', 'Price Line Deduction', 'Distribution Channel Deduction', 'Territory Deduction', 'Other Rate Deduction', 'Participant Share', 'Effective Rate', 'Sales Units', 'Net Percentage', 'Pay Units', 'Product Units', 'Tax Rate Percentage', 'Royalties'
        ],
        [
(undef) x 8, '(cd-lp)'
        ],
	  ]
	},		
	# Sony Foreign Digital - Relativity (FB943)
	{ service => Client::Service::DSP_SONY,
	  version => 13,
          match_on_any_row => 1,
	  lines => [
        [
'Booking text', 'Product Artist', 'Product title', 'Track number', 'Track name', 'Track Artist', 'Product number', 'Country', 'Config', 'Sales Period', 'Distribution channel', 'Price level', 'Base Price', 'Cont deduct', 'Price Basis', 'Rate Percentage', 'Config deduct', 'Price Line Deduction', 'Distribution Channel Deduction', 'Territory Deduction', 'Other Rate Deduction', 'Participant Share', 'Effective Rate', 'Sales Units', 'Net Percentage', 'Pay Units', 'Product Units', 'Tax Rate Percentage', 'Royalties'
        ],
        [
(undef) x 8, '(audio lp|audtrack)'
        ],
	  ]
	},		
	# Sony AUS Digital - Eleven Seven (FB 853)
	{ service => Client::Service::DSP_SONY,
	  version => 14,
      sheet => 1,
      match_on_any_row => 1,
	  lines => [
        [
'Digital Sales Month', 'Catalog', 'Artist', 'Title', 'Configuration', 'Customer', 'DSP', 'Permanent Dwnld', 'Digital Net Qty', 'Digital Net Value', 'Commission%', 'Commission Payable'
        ],
	  ]
	},		
	# Sony AUS Physical - Eleven Seven (FB 851)
	{ service => Client::Service::DSP_SONY,
	  version => 15,
      sheet => 1,
      match_on_any_row => 1,
	  lines => [
        [
'Month', 'Catalog', 'Artist', undef, 'Title', 'Product Type', 'Configuration', 'PPD', 'Royalty base price', 'Gross Qty', 'Return Qty', 'Net Qty', 'Gross Disc Qty', 'Return Disc Qty', 'Royalty units', 'Net Qty', 'Gross Value', 'Gross Disc Value', 'Return Value', 'Net Return Value', 'Net Value', 'Default Copyright Rate', 'Copyright Payable', 'Return Fee Percentage', 'Returns Fee Payable', 'Commission', 'Commission Payable'
        ],
	  ]
	},		
	# Sony AUS Physical FB5169
	{ service => Client::Service::DSP_SONY,
	  version => 18,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'ARIA Class', 'Config\.', 'Artist', 'Title', 'Vibe Record Label', 'RAAS Record Label', 'RAAS Rep\. Owner Code', 'RAAS Rep\. Owner Name', 'Bus\. Unit', 'Bus\. Unit Desc', 'Sales Category', 'JV Partner', 'Catalogue', 'Month', 'Net Qty\.', 'Net Value', 'Gross Qty\.', 'Return Qty\.'
        ],
        [
            undef, '(cd album|cd/dvd combo)'
        ],
	  ]
	},		
	# Sony AUS Digital FB5170
	{ service => Client::Service::DSP_SONY,
	  version => 19,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'ARIA Class', 'Config\.', 'Artist', 'Title', 'Vibe Record Label', 'RAAS Record Label', 'RAAS Rep\. Owner Code', 'RAAS Rep\. Owner Name', 'Bus\. Unit', 'Bus\. Unit Desc', 'Sales Category', 'JV Partner', 'Catalogue', 'Month', 'Net Qty\.', 'Net Value', 'Gross Qty\.', 'Return Qty\.'
        ],
        [
            undef, '(Digital .*|Mastertone|Ringback Tone)'
        ],
	  ]
	},		
	# Sony AUS Digital FB6266
	{ service => Client::Service::DSP_SONY,
	  version => 20,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'period', 'product', 'Dealer Group', 'artist', 'title', 'config', 'Prod Group', 'labelCode Desc', 'service', 'trans', 'NetQty', 'NetValue'
        ],
        [
            undef, undef, undef, undef, undef, '(Digital .*|Mastertone|Ringback Tone)'
        ],
	  ]
	},		
	# Sony AUS Physical FB6267
	{ service => Client::Service::DSP_SONY,
	  version => 21,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Labelcode', 'Catalog', 'Artist', 'Title', 'Product Group', 'Current PPD', 'Current Cost', 'Default Copyright Rate', 'Catalog Default Royalty Rate', 'Original Release Date', 'Sales Month', 'Deleted Date \(dd\/mm\/yyyy\)', 'Gross Qty', 'Return Qty', 'Net Qty', 'Gross Value', 'Gross Return Value', 'Net Value Before Discount', 'Net Discount Value', 'Net Value', 'Copyright Cost'
        ],
	  ]
	},		
	# Sony Digital - Nettwerk (FB7570)
	{ service => Client::Service::DSP_SONY,
	  version => 22,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'Eros Contract', 'Booking text', 'Product Artist', 'Product title', 'Track number', 'Track name', 'Track Artist', 'Product number', 'Country', 'Config', 'Sales Period', 'Distribution channel', 'Price level', 'Base Price', 'Cont deduct', 'Price Basis', 'Rate Percentage', 'Flat Rate', 'Config deduct', 'Price Line Deduction', 'Distribution Channel Deduction', 'Territory Deduction', 'Other Rate Deduction', 'Participant Share', 'Effective Rate', 'Sales Units', 'Pay Units', 'Net % Units', 'Royalties'
        ],
	  ]
	},		
	# Sony Digital - Nettwerk (FB10829)
	{ service => Client::Service::DSP_SONY,
	  version => 23,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Catalog', 'Product Group', 'Configuration', 'Artist', 'Title', 'Labelcode', 'Digital Sales Month', 'DSP', 'Permanent Download Flag', 'Digital Net Qty', 'Digital Net Value'
        ],
	  ]
	},		
	# Sony Digital - Varese (FB14958)
	{ service => Client::Service::DSP_SONY,
	  version => 27,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Catalog', 'Product Group', 'Configuration', 'Artist', 'Title', 'Labelcode', 'Sales Month', 'DSP', 'Permanent Download Flag', 'Sales Channel', 'Digital Net Qty', 'Digital Net Value'
        ],
	  ]
	},		
    # this will match any file with the word Digital in the filename. don't like it, but that's how it's been...
    # Note: this is the same header format as below, Digital and Physica are both reported in the same file and
    # it's been split into two.
	# Sony Digital - Bama Rags Recordings LLC (FB11024)
	{ service => Client::Service::DSP_SONY,
	  version => 24,
      sheet => 0,
      match_on_any_row => 1,
      file_name => 'Digital',
	  lines => [
        [
            'Product Number', 'Title', 'Product Artist', 'Configuration', 'Track Number', 'Track Title', 'Track Artist', 'ISRC', 'Barcode \(UPC\)', 'Country', 'Distribution Manner', 'Price Line', 'Provider Key', 'Provider Name', 'Royalty Base Price', 'Units', 'Product Share %', 'Royalty Rate %', 'Royalty per Unit', 'Income Share', 'Royalty Amount', '^$'
        ],
	  ]
	},		
    # this will match any file with the word Physical in the filename. don't like it, but that's how it's been...
    # Note: this is the same header format as above, Digital and Physica are both reported in the same file and
    # it's been split into two.
	# Sony Physical - Bama Rags Recordings LLC (FB11026)
	{ service => Client::Service::DSP_SONY,
	  version => 25,
      sheet => 0,
      match_on_any_row => 1,
      file_name => 'Physical',
	  lines => [
        [
            'Product Number', 'Title', 'Product Artist', 'Configuration', 'Track Number', 'Track Title', 'Track Artist', 'ISRC', 'Barcode \(UPC\)', 'Country', 'Distribution Manner', 'Price Line', 'Provider Key', 'Provider Name', 'Royalty Base Price', 'Units', 'Product Share %', 'Royalty Rate %', 'Royalty per Unit', 'Income Share', 'Royalty Amount', '^$'
        ],
	  ]
	},		
	# Sony AUS Physical FB11136
	{ service => Client::Service::DSP_SONY,
	  version => 26,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Labelcode', 'Catalog', 'Product Group', 'Configuration', 'Artist', 'Title', 'Product Group', 'Current PPD', 'Current Cost', 'Default Copyright Rate', 'Catalog Default Royalty Rate', 'Original Release Date', 'Sales Month', 'Deleted Date \(dd\/mm\/yyyy\)', 'Gross Qty', 'Return Qty', 'Net Qty', 'Gross Value', 'Gross Return Value', 'Net Value Before Discount', 'Net Discount Value', 'Net Value', 'Copyright Cost', '^$',
        ],
	  ]
	},		
	# Sony AUS Digital FB18099
	{ service => Client::Service::DSP_SONY,
	  version => 28,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Catalog', 'Sales Month', 'Configuration', 'Artist', 'Title', 'Labelcode', 'DSP', 'Sales Channel', 'Digital Net Qty', 'Digital Net Value'
        ],
	  ]
	},		
	# Sony AUS Physical FBoD18331
	{ service => Client::Service::DSP_SONY,
	  version => 29,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Labelcode', 'Catalog', 'Product Group', 'Configuration', 'Artist', 'Title', 'Current PPD', 'Current Cost', 'Default Copyright Rate', 'Catalog Default Royalty Rate', 'Original Release Date', 'Sales Month', 'Deleted Date \(dd\/mm\/yyyy\)', 'Manufactured Qty', 'Mth Gross Qty', 'Mth Return Qty', 'MTD Return Value', 'Mth Net Qty', 'MTD Gross Value', 'Return Value', 'Mth Net Value Before Discount', 'Mth Net Discount Value', 'Mth Net Value', 'Mth Copyright Cost', 'Mth Catalog Default Royalty Cost', 'Cost of PL Rebate', '^$',
        ],
	  ]
	},			
	# Sony Digital - Eleven Seven (FBoD18330)
	{ service => Client::Service::DSP_SONY,
	  version => 30,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Catalog', 'Sales Month', 'Artist', 'Title', 'Product Group', 'Configuration', 'Labelcode', 'Provider Name', 'Sales Channel', 'Digital Net Qty', 'Digital Net Value', '^$'
        ],
	  ]
	},	
    # Sony (EROS) (FBoD18250)
    { service => Client::Service::DSP_SONY,
      version => 31,
      sheet => 0,
      lines => [
        [ '\w{3}-\w{3}  \w\d{3}\w{2} \w\d{27}\w{2}\.{210}', '^$'],
      ]
    },				
    # neurotic - syntax (FB76)
	{ service => Client::Service::DSP_NEUROTICMEDIA,
	  version => 1,
	  lines => [
		[
'OrderDate', 'RoyaltyDate', 'OrderNumber', 'Store', 'Licensor', 'Artist', 'AlbumName', 'TrackName', 'NumTracks', 'Customer', 'Email', 'PostalCode', 'UPC', 'ISRC', 'SPID', 'RSID', 'Cost', 'PriceCode', 'Credit', 'IsPromotional', 'Sales', 'MerchantReportCode', 'Format', 'FormatType', 'CurrencyCode', 'GRID', 'Genres', 'CatalogName', 'FileSizeMB', 'PricingTerritory'
		]
	  ]
	},
	# Sony AUS Physical FBoD18385
	{ service => Client::Service::DSP_SONY,
	  version => 32,
      sheet => 0,
      match_on_any_row => 1,
	  lines => [
        [
'JV Partner', 'Labelcode', 'Catalog', 'Sales Month', 'Artist', 'Title', 'Product Group', 'Current PPD', 'Current Cost', 'Default Copyright Rate', 'Catalog Default Royalty Rate', 'Original Release Date', 'Deleted Date \(dd\/mm\/yyyy\)', 'Manufactured Qty', 'Mth Gross Qty', 'Mth Return Qty', 'Mth Net Qty', 'Mth Net Value Before Discount', 'Mth Net Discount Value', 'Mth Net Value', 'Mth Copyright Cost', 'Mth Catalog Default Royalty Cost', 'Cost of PL Rebate', '^$',
        ],
	  ]
	},			
    # ami q2 2005 and earlier
	{ service => Client::Service::DSP_AMI,
	  version => 1,
	  lines => [
		['ID', 'reporting_label', 'label', 'title', 'track_no', 'artist_name', 'album_name', 'album_upc', 'isrc', 'SumOfnumber_paid_plays', 'SumOfnumber_promotional_plays', 'Royalty']
	  ]
	},
    # ami q3 2005 and later
	{ service => Client::Service::DSP_AMI,
	  version => 2,
	  lines => [
		['ID', 'reporting_label', 'period_start', 'period_end', 'isrc', 'album_upc', 'label', 'artist_name', 'title', 'SumOfnumber_paid_plays', 'SumOfnumber_promotional_plays', 'Royalty']
	  ]
	},
    # ami another q3 2005 and later version
	{ service => Client::Service::DSP_AMI,
	  version => 3,
	  lines => [
		['Vendor', 'period_start', 'period_end', 'isrc', 'album_upc', 'label', 'artist_name', 'title', 'Plays', 'Royalty', 'reporting_label$'],
	  ]
	},
    # ami (excel)
	{ service => Client::Service::DSP_AMI,
	  version => 4,
      sheet => 1,
	  lines => [
		['Vendor_Name', 'Start_Date', 'End_Date', 'ISRC', 'UPC', 'Label', 'Artist', 'Song', '# of Plays', 'PPD', 'Fee'],
	  ]
	},
    # ami (2007 excel)
    { service => Client::Service::DSP_AMI,
        version => 6,
        sheet => 0,
        lines => [
            ['ID','Reporting Label','Year','Qtr','Label','Title','Track No','Artist','Album','UPC','ISRC','Paid Plays','Promo Plays','Royalty'],
        ],
    },
    # ami (2007 Q4>)
    { service => Client::Service::DSP_AMI,
        version => 7,
        sheet => 'any',
        lines => [
            ([undef]) x 5,
            ['Label','Title','Trk Artist','Division','Album','UPC ISRC','Paid Plays','Rate','Amount'],
        ],
    },
    # AMI (2008 Q2>)
    { service => Client::Service::DSP_AMI,
        version => 8,
        sheet => 0,
        lines => [
            ['REPORT PAYEE ID','REPORT PAYEE NAME','PUBLISHER ID','PUBLISHER NAME','TITLE','ARTIST','UPC','PUBLISHER CODE','WRITERS','PAID PLAYS','PROMO PLAYS','DEMO PLAYS','OPERATOR DOWN LOADS','PUBLISHER \% SHARE','PAYEE % SHARE','PLAY RATE','PLAY ROYALTY','SERVER FIXATION RATE','SERVER FIXATION ROYALTY','TOTAL ROYALTY'],
        ],
    },
    # AMI - Dualtone (17122/17123)
    { service => Client::Service::DSP_AMI,
        version => 9,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'mois courant\/current month \((download|streaming)\)', 'type', 'boutique\/store', 'territoire\/territory', 'upc', 'isrc', 'titre\/title', 'artistes\/artist', 'quantité\/quantity', 'redevances\/royalties'
	    ],
        ],
    },
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 1,
	  lines => [
		[undef],
		[undef],
		[undef],
		['Plays'],
		['Total Plays'],
		['\% of Total Plays'],
		[undef],
		['Revenue Share'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 2,
	  lines => [
		[undef],
		[undef],
		['Label 1', 'Label 2', 'Title', 'Plays'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 3,
	  lines => [
		[undef],
		[undef],
		['Parent Label', 'Label Name', 'Artist Display Name', 'Title', 'Total'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 4,
	  lines => [
		[undef, undef, undef, undef, 'TV400 - Play Count By Label'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 5,
	  lines => [
		[undef],
		[undef],
		['PARENT LABEL', 'LABEL', 'Title', 'Artist', 'Total'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 6,
	  lines => [
		[undef],
		[undef],
		['Sum of Orders'],
        ['Source'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 7,
	  lines => [
		['Sum of Orders'],
        ['Source'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 8,
	  lines => [
        [undef],
        ['USAGE_FEED_SOURCE_CODE','LABEL_NAME','TV200_TITLE','Total'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
      sheet => 2,
	  version => 9,
	  lines => [
        ['Sum of Orders'],
        ['Source','LABEL_NAME','TV200_TITLE','Total'],
	  ]
	},
	# music choice
	{ service => Client::Service::DSP_MUSICCHOICE,
	  version => 10,
      sheet => 'any',
	  lines => [
        ['Source', 'TV200_TITLE', 'Orders', 'LABEL_NAME'],
	  ]
	},
	# music choice v11 is wmg specific
	# hudson
	{ service => Client::Service::DSP_HUDSON,
	  version => 1,
	  lines => [
		['Hudson Entertainment'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Cell Phone Carrier'],
	  ]
	},
    # t-mobile
    { service => Client::Service::DSP_TMOBILE,
      version => 1,
      sheet => 1,
      match_on_any_row => 1,
      lines => [
        ['Title', 'Artist', '(Product|Content) Type', 'Unit Price', 'ISRC', 'Downloads'],
      ]
    },
    # t-mobile (callertunes)
    { service => Client::Service::DSP_TMOBILE,
      version => 2,
      sheet => 1,
      match_on_any_row => 1,
      lines => [
        ['Title', 'Artist', 'Purchases', 'Credits', 'Net Purchases', 'ISRC'],
      ]
    },
	# napster
	{ service => Client::Service::DSP_NAPSTER,
	  version => 1,
	  lines => [
		['H'],
		['D', undef, undef, 'ALBUM|TRACK', undef, undef, undef, undef, undef, undef, '7', undef, undef, '10']
	  ]
	},
	# napster
	{ service => Client::Service::DSP_NAPSTER,
	  version => 2,
	  lines => [
		['H'],
		['D', undef, undef, undef, undef, undef, undef, undef, '7', undef, undef, '1|2|5', undef, undef, undef,]
	  ]
	},
	# napster consolidated
	{ service => Client::Service::DSP_NAPSTER,
	  version => 3,
	  lines => [
        ['Transmissionno','Start_Date','End_Date','Service_provider_country','Consumer_country_code','ISRC','UPC','Digital_offering_id','Product_type','Quantity','Royalty_currency','Wholesale_price','Wholesale_value','PaymentCurrency','WholesalevaluePC','Artist_name','Album_name','Track_name']
	  ]
	},
	# napster consolidated stream
	{ service => Client::Service::DSP_NAPSTER,
	  version => 4,
	  lines => [
        ['Transmission_#','Start_Date','End_Date','Service_provider_country','usage_type','ISRC','UPC','Activity_type','quantity','royalty_currency','royalty_price_LC','royalty_amount_lc','payment_currency','royalty_amount_pc','artist_name','album_name','track_name']
	  ]
	},
    # napster consolidated stream - no header
    { service => Client::Service::DSP_NAPSTER,
      version => 4,
      lines => [
        ['(\d{6})','(\d{8})','(\d{8})','(\w\w)','PREMIUM|NTG|FREE_STREAM',undef,undef,'Stream|Client Plays|Device Plays|Free_Stream','(\d+)','(\w{3})',undef,undef,'USD',undef,undef,undef,undef]
      ]
    },
	# napster old download
	{ service => Client::Service::DSP_NAPSTER,
	  version => 5,
	  lines => [
		[undef],
		[undef],
		[undef, 'Permanent Download.*Monthly Royalty Summary'],
		['Record Type', 'Venture ID', 'Trans No', 'Digital offerin', 'ISRC', 'UPC', 'Artist', 'Track', 'Affil', 'SP Count', 'Cons\.Cou', 'Dist\.', 'Quantity', 'Price', 'Amount', 'Trans\.Date', 'Reason Cod']
	  ]
	},
	# napster old stream
	{ service => Client::Service::DSP_NAPSTER,
	  version => 6,
	  lines => [
		['R', 'Ventur', 'Trans No', 'Offering Id', 'ISRC', 'UPC', 'Artist', 'Track', 'Affil', 'Co', 'Co', 'Dis', 'Quantity', 'Date', 'R']
	  ]
	},
    # napster version 7 is WMG specific
	# itunes
	{ service => Client::Service::DSP_ITUNES,
	  version => 1,
	  lines => [
		['Start Date', 'End Date', 'UPC', 'ISRC', 'Vendor Identifier', 'Quantity', 'Royalty Price', 'Extended Price', 'Sale Or Return', 'Apple Identifier', 'Artist', 'Title', 'Label', 'Side', 'Song Or Playlist', 'Account Id', 'Country Of Sale']
	  ]
	},
	# itunes nov 05 added currency field
	{ service => Client::Service::DSP_ITUNES,
	  version => 2,
	  lines => [
		['Start Date', 'End Date', 'UPC', 'ISRC', 'Vendor Identifier', 'Quantity', 'Royalty Price', 'Extended Price', 'Currency', 'Sale Or Return', 'Apple Identifier', 'Artist', 'Title', 'Label', 'Side', 'Song Or Playlist', 'Account Id', 'Country Of Sale']
	  ]
	},
    # dec 07 changed heading for 'song or playlist' to 'product type'
	{ service => Client::Service::DSP_ITUNES,
	  version => 3,
	  lines => [
		['Start Date', 'End Date', 'UPC', 'ISRC', 'Vendor Identifier', 'Quantity', 'Royalty Price', 'Extended Price', 'Currency', 'Sale Or Return', 'Apple Identifier', 'Artist', 'Title', 'Label', 'Side', 'Product Type', 'Account Id', 'Country Of Sale', 'Pre-order', 'Season Pass indicator', 'ISAN\/Other Content ID', 'CMA', 'Customer Price', 'Customer Currency']
	  ]
	},
    # iTunes for ARC music
    { service => Client::Service::DSP_ITUNES,
        version => 4,
        sheet => 0,
        lines => [
            ['Start Date','End Date','ISRC','Quantity','Royalty Price','Extended Price','Currency','Artist','Title','Country Of Sale','Pre-order','Season Pass indicator','ISAN\/Other Content ID','CMA'],
        ],
    },
    # iTunes for IDEA
    { service => Client::Service::DSP_ITUNES,
        version => 3,
        sheet => 0,
        lines => [
            ['Start Date','End Date','UPC','ISRC','Vendor Identifier','Quantity','Partner Share','Extended Partner Share','Partner Share Currency','Sale Or Return','Apple Identifier','Artist\/Show\/Developer','Title','Label\/Studio\/Network','Side','Product Type Identifier','Account Identifier','Country Of Sale','Pre-order Flag','Season Pass Flag','ISAN\/Other Identifier','CMA Flag','Customer Price','Customer Currency'],
        ],
    },
    # iTunes 2008 Oct
    { service => Client::Service::DSP_ITUNES,
        version => 3,
        sheet => 0,
        lines => [
            ['Start Date','End Date','UPC','ISRC','Vendor Identifier','Quantity','Partner Share','Extended Partner Share','Partner Share Currency','Sale Or Return','Apple Identifier','Artist\/Show\/Developer','Title','Label\/Studio\/Network','Side','Product Type Identifier','Account Identifier','Country Of Sale','Pre-order Flag','Prepaid','Prepaid Type','ISAN\/Other Identifier','CMA Flag','Customer Price','Customer Currency'],
        ],
    },     
     # iTunes Cloud
    { service => Client::Service::DSP_ITUNES_CLOUD,
        version => 1,
        sheet => 0,
        file_name => '^C_\d{8}',
        lines => [
            ['Start Date', 'End Date', 'UPC', 'ISRC\/ISBN', 'Vendor Identifier', 'Quantity', 'Partner Share', 'Extended Partner Share', 'Partner Share Currency', 'Sales or Return', 'Apple Identifier', 'Artist\/Show\/Developer\/Author', 'Title', 'Label\/Studio\/Network\/Developer\/Publisher', 'Grid', 'Product Type Identifier', 'ISAN\/Other Identifier', 'Country Of Sale', 'Pre-order Flag', 'Promo Code', 'Customer Price', 'Customer Currency'],
        ],
    },    
     # iTunes Cloud 2012 April (Same format, but different file name.  Have to check for iTunes match product type)
    { service => Client::Service::DSP_ITUNES_CLOUD,
        version => 1,
        sheet => 0,
        lines => [
            ['Start Date', 'End Date', 'UPC', 'ISRC\/ISBN', 'Vendor Identifier', 'Quantity', 'Partner Share', 'Extended Partner Share', 'Partner Share Currency', 'Sales or Return', 'Apple Identifier', 'Artist\/Show\/Developer\/Author', 'Title', 'Label\/Studio\/Network\/Developer\/Publisher', 'Grid', 'Product Type Identifier', 'ISAN\/Other Identifier', 'Country Of Sale', 'Pre-order Flag', 'Promo Code', 'Customer Price', 'Customer Currency'],
            [undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'H3|J3|V3|S3'],
        ],
    },    
     # iTunes 2009 Mar
    { service => Client::Service::DSP_ITUNES,
        version => 5,
        sheet => 0,
        lines => [
            ['Start Date', 'End Date', 'UPC', 'ISRC', 'Vendor Identifier', 'Quantity', 'Partner Share', 'Extended Partner Share', 'Partner Share Currency', 'Sales or Return', 'Apple Identifier', 'Artist\/Show\/Developer', 'Title', 'Label\/Studio\/Network\/Developer', 'Grid', 'Product Type Identifier', 'ISAN\/Other Identifier', 'Country Of Sale', 'Pre-order Flag', 'Promo Code', 'Customer Price', 'Customer Currency'],
        ],
    },         
    # karmadownload
    { service => Client::Service::DSP_KARMADOWNLOAD,
      version => 1,
      lines => [
        ['KarmaDownload Royalty Statement'],
        [undef],
        ['Date'],
        [undef],
        ['Period'],
        [undef],
        ['Reference'],
        [undef],
        ['Contact'],
      ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 11,
            ['Label','Artist','Title','Format','UPC or ISRC','Unit Price','Quantity','Revenue','Currency','Territory','Revenue','Label Total','Minimum'],
        ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 14,
            ['Label','Artist','Title','Format','UPC or ISRC','Unit Price','Quantity','Revenue','Currency','Territory','Revenue','Label Total','Minimum'],
        ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 14,
            ['Label','Artist','Title','Format','UPC or ISRC','Unit Price','Quantity','Revenue','Currency','Territory','Revenue','Label','Minimum'],
        ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 16,
            ['Label','Artist','Title','Format','UPC or ISRC','Unit Price','Quantity','Revenue','Currency','Territory','Revenue','Label Total','Minimum'],
        ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 5,
        sheet => 0,
        lines => [
            ([undef]) x 16,
            ['Label','Artist','Title','Format','UPC or ISRC','Unit Price','Quantity','Revenue','Currency','Territory','Unit Cost','Revenue'],
        ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 4,
        sheet => 0,
        lines => [
            ([undef]) x 16,
            ['Artist','Title','Format','Unit Price','Quantity','Revenue','Currency','Territory','Revenue','Label Total'],
        ],
    },
    # Karma Download - Sanctuary UK
    { service => Client::Service::DSP_KARMADOWNLOAD,
        version => 3,
        sheet => 0,
        lines => [
            ([undef]) x 26,
            ['Label','Artist','Title','Format','UPC or ISRC','Unit Price','Quantity','Revenue','Currency','Territory','Revenue','Handling','Total Royalty','Label Total','Minimum'],
        ],
    },
    # coolsounds
    { service => Client::Service::DSP_COOLSOUNDS,
      version => 1,
      lines => [
        [undef, 'CoolSound Real.*'],
        [undef, 'Downloads'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef, undef, undef, '.+\s\d{4}\sto\s.+\s\d{4}'],
      ],
    },
    # navarre (thru March 2006)
    { service => Client::Service::DSP_NAVARRE,
      version => 1,
      lines => [
        [undef],
        [undef],
        [undef],
        ['ITEM', 'UPC', undef, undef, 'DEPT', 'LBL', undef, 'SEL', undef, 'ARTIST', undef, undef, undef, 'TITLE', undef, undef, 'CUST NAME', 'SALES TOTAL', 'RTN QTY', 'NET QTY', 'SALES AMT', 'RTN AMT', 'NET AMT', 'DISCOUNT', 'PAYMENT', 'PAYMENT AMT'],
      ],
    },
    # navarre (April 2006 and beyond)
    { service => Client::Service::DSP_NAVARRE,
      version => 2,
      lines => [
        [undef],
        [undef],
        [undef],
        ['ITEM', 'UPC', 'DEPT', 'LBL', 'SEL', 'ARTIST', undef, 'TITLE', undef, undef, 'CUST NAME', 'SALES TOTAL', 'RTN QTY', 'NET QTY', 'SALES AMT', 'RTN AMT', 'NET AMT', 'DISCOUNT', 'RTN DISCOUNT', 'SALES DISCOUNT', 'PAYMENT', 'PAYMENT AMT'],
      ],
    },
    # faithworks (thru March 2006)
    { service => Client::Service::DSP_FAITHWORKS,
      version => 1,
      lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['CUSTOMR', 'NAME \& ADDRESS', '\#INVOIC', 'INV TOTAL', '\#CREDIT', 'CRED TOTAL', 'NET', 'SAL/CRD', 'CUSTOMER\'S PO\#', 'ITEM KEY', 'SD', 'ITEM DESCRIPTION', 'RETAIL PRI', 'SELL PRICE', 'QTY SOLD', 'LINE TOTAL']
      ],
    },
    # faithworks (April & May 2006)
    { service => Client::Service::DSP_FAITHWORKS,
      version => 2,
      lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['CUSTOMR', 'NAME \& ADDRESS', '\#INVOIC', 'INV TOTAL', '\#CREDIT', 'CRED TOTAL', 'NET', 'SAL/CRD', 'CUSTOMER\'S PO\#', 'ITEM KEY', 'SD', 'ITEM DESCRIPTION', 'RETAIL PRI', 'SELL PRICE', 'QTY SOLD', 'LINE TOTAL', 'Motv']
      ],
    },
    # faithworks (June 2006 and beyond)
    { service => Client::Service::DSP_FAITHWORKS,
      version => 3,
      lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['ITEM KEY', 'SD', 'ITEM DESCRIPTION', 'TOT SOLD', 'GROSS', 'SALE NO', 'CUSTOMR', 'NAME \& ADDRESS', 'RETAIL PRI', 'SELL PRICE', 'QTY SOLD', 'LINE TOTAL']
      ],
    },
    # faithworks (October 2007 and beyond)
    { service => Client::Service::DSP_FAITHWORKS,
      version => 4,
      lines => [
        ([undef]) x 5,
        ['CUSTOMER','NAME','ADDRESS LINE 1','ADDRESS LINE 2','CITY','ST','POST CODE','\#INVOICE','INV TOTAL','\#CREDIT','CREDIT TOTAL','NET','SAL\/CRD','CUSTOMER PO\#','ITEM KEY','SD','ITEM DESCRIPTION','RETAIL PRICE','SELL PRICE','QTY SOLD','LINE TOTAL']
      ],
    },
    # faithworks (October 2007 and beyond)
    { service => Client::Service::DSP_FAITHWORKS,
      version => 5,
      lines => [
        ([undef]) x 5,
        ['CUSTOMER','NAME','ADDRESS LINE 1','ADDRESS LINE 2','CITY','ST','POST CODE','\#INVOICE','INV TOTAL','\#CREDIT','CREDIT TOTAL','NET','SAL\/CRD','CUSTOMER PO#','ITEM KEY','SD','ITEM DESCRIPTION','QTY SOLD','SELL PRICE','RETAIL TOTAL','INVOICE TOTAL']
      ],
    },
    # dualtone 3rd party
    { service => Client::Service::DSP_DTTHIRDPARTY,
      version => 1,
      lines => [
        [undef, undef, undef, undef, 'Date', undef, 'Num', undef, 'Name', undef, 'Memo', undef, 'Class', undef, 'Amount', undef, 'Units Sold'],
      ],
    },
    # dualtone artist direct
    { service => Client::Service::DSP_DTARTISTDIRECT,
      version => 1,
      lines => [
        [undef, undef, undef, 'Date', undef, 'Num', undef, 'Name', undef, undef, 'Class', undef, 'Amount', undef, 'Units Sold'],
      ],
    },
    # dualtone international
    { service => Client::Service::DSP_DTINTERNATIONAL,
      version => 1,
      lines => [
        [undef, undef, undef, undef, undef, undef, 'Date', undef, 'INV Num', undef, 'Name', undef, 'Class', undef, 'Amount', undef, 'Units Sold'],
      ],
    },
    # lookout direct
    { service => Client::Service::DSP_LOOKOUTDIRECT,
      version => 1,
      lines => [
        ['Sales Report'],
        [undef],
        [undef],
        ['Grouped by Item ID'],
        ['From'],
        [undef],
        [undef, 'Qty', 'Sales', 'Cost', 'Margin'],
        [undef, '-----', '-----', '-----', '-----'],
      ],
    },
    # lmmg sales
    { service => Client::Service::DSP_LMMGSALES,
      version => 1,
      lines => [
        ['LMMG Sales Overview'],
        [undef],
        ['Sales Period'],
        ['Report generated'],
        [undef],
        ['Description', 'Amount'],
      ],
    },
    # bmg
    { service => Client::Service::DSP_BMG,
      version => 1,
      lines => [
        ['Date', 'Item', 'Sales Units', 'Return Units', 'Discount', 'Sales', 'Returns', 'Discount Price'],
      ],
    },
    # bmg colubmia house
    { service => Client::Service::DSP_BMG_COLUMBIAHOUSE,
      version => 1,
      lines => [
        ['PERIOD ENDING'],
        [undef],
        ['LABEL', 'ROYALTY', 'SELECTION', 'TITLE \/ ARTIST', 'MANUFACTURER', 'SELL', 'ROYALTY', 'PER UNIT'],
      ],
    },
    # bmg sony
    { service => Client::Service::DSP_BMG_SONY,
      version => 1,
      lines => [
        ['Sony Music Canada'],
        ['Label Code Sales by Config\/Title code'],
        ['for Label'],
        ['Period'],
        [undef],
        ['Item Cd', 'Artist\/Title', 'Rel Date', 'Config', 'UPC Code', 'Gross Sales', 'Returns', 'Allowances', 'Net Sales', 'Gross Units', 'Return Units', 'Net Units', 'Gratis'],
      ],
    },
    # bmg sony, 2007 q2+
    { service => Client::Service::DSP_BMG_SONY,
      version => 2,
      lines => [
        ['Period', 'Year_Month', 'LSAS Header Desc', 'LSAS Parent Name', 'Sales Type', 'Selection Number', 'Artist', 'Selection Title', 'LSAS Group Desc', 'SAP Product Line', 'SAP Product Line NM', 'Map Code', 'Map Code Desc', 'Financial Label', 'Financial Label Name', 'Ship\/Rtrn', 'Price Category', 'List PR', 'Base PR', 'Effective PR', 'Invoice Amt', 'Base', 'Gross', 'Discount', 'Incentive', 'Imputed', 'Ship Units', 'Act Free Units', 'Std Free Units', 'Excess Free Units'],
      ],
    },
    # bmg sony AU
    { service => Client::Service::DSP_BMG_SONY,
      version => 3,
      lines => [
        ([undef]) x 4,
        [undef, 'Catalogue', 'Configuration', undef, 'Price Point', 'Label Description', undef, 'Album Title', 'Artist Name', 'Current Release Date', 'Edc Status', 'Wholesale', 'Gross Sales Qty', 'Gross Rtn Qty', 'Net Sales Qty', 'Discounted Units', 'Return Disc Qty', 'Royalty Units', 'Gross Value', 'Discount Value', 'Sales Value', 'Returns Value', 'Net Value', 'Commission %', 'Commission Payable', undef, 'Return Fee Percentage', 'Return Fee'],
      ],
    },
    # bmg sony NZ
    { service => Client::Service::DSP_BMG_SONY,
      version => 4,
      sheet => 2,
      lines => [
        ([undef]) x 5,
        ['Catalog Number', 'Product Description', undef, 'Sales Quantity', 'Return Quantity', 'Sales value', 'Discounts', 'Return Value', 'Net Sales Quantity', 'Net Sales Value', 'PPD', 'RIANZ'],
      ],
    },
    # bmg sony, 2008 q1+
    { service => Client::Service::DSP_BMG_SONY,
      version => 5,
      lines => [
        ['Period', 'Year_Month', 'LSAS Header Desc', 'LSAS Parent Name', 'Sales Type', 'Selection Number', 'Artist', 'Selection Title', 'LSAS Group Desc', 'SAP Product Line', 'SAP Product Line NM', 'Map Code', 'Map Code Desc', 'Financial Label', 'Financial Label Name', 'Ship\/Rtrn', 'Invoice Amt\$', 'Discount-\$', 'Imputed\$', 'Ship Units', 'Act Free Units'],
      ],
    },
    # rykodisc (physical sales)
    { service => Client::Service::DSP_RYKODISC,
      version => 1,
      lines => [
        ['EXTFAMILYCODE', 'IMDFAMILYCODE', 'IMDFAMILYNAME', 'COMPANYCODE', 'COMPANY', 'LABELCODE', 'BUUNIT', 'SALESPROGRAMCODE', 'LANDED_COST', 'RTLPRICE', 'FREEGOODSPCT', 'UPC', 'CONFIG', 'SELECTION', 'RELEASEDATE', 'ARTIST', 'TITLE', 'UNITSPERSET', 'LABEL_CD', 'GROSS_QTY', 'RETURN_QTY', 'NET_QTY', 'GROSS_DOLLARS PPD', 'DISCOUNTS', 'GROSS_AMT', 'RETURN_AMT', 'NET_AMT'],
      ],
    },
    # rykodisc (digital sales)
    { service => Client::Service::DSP_RYKODISC,
      version => 2,
      lines => [
        ['DSP_NAME', 'ARTIST', 'START_DATE', 'END_DATE', 'PRODUCT_IDENTIFIER', 'PRODUCT_ID_TYPE_CODE', 'TITLE', 'LABEL', 'FIRST_REL_UPC', 'FIRST_REL_TITLE', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_LABELCODE', 'WEA_COMPANYCODE', 'UNITS', 'PPD_PRICE', 'TOTAL_SALE', 'TERRITORY_CD', 'Media Type', 'INTERFACE_GROUP_CD', 'ORACLE_COMPANY', 'ORACLE_LABEL', 'COMPANY', 'COMM_MODEL_TYPE'],
      ],
    },
    # rykodisc2 (physical sales)
    { service => Client::Service::DSP_RYKODISC,
      version => 3,
      lines => [
        [undef],
        [undef],
        ['artist', 'title', 'upc', 'labelname', 'salesqty', 'rtnsqty',
         'netqty', 'salesamt', 'rtnsamt', 'netamt'],
      ],
    },
    # dock
    { service => Client::Service::DSP_DOCK,
      version => 1,
      lines => [
        ['Our ref', 'Your ref', 'Price', 'Format', 'Artist', 'Title', 'Stock', 'Entries', 'Sales', 'Amount\/Price', 'Deposit to clients', 'Deposit to clients', 'Units F\.O\.C\.', 'Stock'],
      ],
    },
    # red
    { service => Client::Service::DSP_RED,
      version => 1,
      lines => [
        [undef, 'ARTIST', 'TITLE', 'SHIP\#', 'SHIP\$', 'RTN\#', 'RTN\$', 'NET\#', 'NET\$'],
      ],
    },
    # Hybrid -> Red
    { service => Client::Service::DSP_RED,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            [undef,undef,'ARTIST','TITLE','PFX','SEL-CFG','CATALOG\#','SHIP\#','SHIP\$','RTN\#','RTN\$','NET\#','NET\$'],
        ],
    },
    # Hybrid -> Red
    { service => Client::Service::DSP_RED,
        version => 3,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            [undef,'ARTIST','TITLE','PFX','SEL-CFG','CATALOG\#','SHIP\#','SHIP\$','RTN\#','RTN\$','NET\#','NET\$'],
        ],
    },    
    # Hybrid -> Red
    { service => Client::Service::DSP_RED,
        version => 4,
        match_on_any_row => 1,
        sheet => 0,
        lines => [
            [undef],
            [undef,'ARTIST','TITLE','PFX','SEL-CFG','CATALOG\#','SHIP\#','SHIP\$','RTN\#','RTN\$','NET\#','NET\$'],
        ],
    },    
    # Red
    { service => Client::Service::DSP_RED,
        version => 5,
        match_on_any_row => 1,
        sheet => 0,
        lines => [
            [undef],
            ['LABEL','ARTIST','TITLE', 'CATALOG\#','SHIP\#','SHIP\$','RTN\#','RTN\$','NET\#','NET\$'],
        ],
    },    
    # Red
    { service => Client::Service::DSP_RED,
        version => 6,
        match_on_any_row => 1,
        sheet => 0,
        lines => [
            [undef],
            [undef, undef, 'ARTIST','TITLE', 'PFX', 'SEL-CFG', 'CATALOG\#', 'UPC_CD', 'SHIP\#','SHIP\$','RTN\#','RTN\$','NET\#','NET\$'],
        ],
    },    
    # Thirty Tigers Digital (FB17810) - place header here to prevent RED v7 from picking up header
    { service => Client::Service::DSP_THIRTY_TIGERS,
        version => 2,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'physical',
        lines => [
            [
'LABEL', 'Count(?:r)?ry', 'ARTIST', 'TITLE', 'PFX', 'ARTICLE\#', 'UPC', 'US CATLG\#', 'SHIP#', 'SHIP\$', 'RTN\#', 'RTN\$', 'NET\#', 'NET\$'
	        ],
        ],
    },    
    # Red (FB3684)
    { service => Client::Service::DSP_RED,
        version => 7,
        match_on_any_row => 1,
        sheet => 0,
        lines => [
            [undef],
            [undef, undef, 'ARTIST','TITLE', 'PFX', 'ARTICLE\#', 'UPC', 'US Catlg\#', 'SHIP\#','SHIP\$','RTN\#','RTN\$','NET\#','NET\$'],
        ],
    },    
    # Red (FBoD4995)
    { service => Client::Service::DSP_RED,
        version => 8,
        sheet => 0,
        lines => [
            ['RED'],
            ['Physical'],
            ['Cat For Tot', 'S/R', 'Label', 'Artist', 'Selection', 'SMC #', 'RED #', 'UPC', 'Cfg', 'Unit Prc', 'Prc Dsc', 'Eff Prc', 'Free Qty', 'QTY', 'Amount', 'US Amount', '^$'],
        ],
    },    
    # Red (FB20580)
    { service => Client::Service::DSP_RED,
        version => 9,
        sheet => 0,
        lines => [
            ['.*RED.*'],
            ['.*Physical Sales CA.*'],
            [
undef, undef, 'Artist', 'Title', 'Pfx', 'UPC', 'US_Catlg#', 'Selection#', 'SHIP#', 'SHIP\$', 'RTN#', 'RTN\$', 'NET#', 'NET\$', '^$'
	    ],
        ],
    },    
    # shellshock
    { service => Client::Service::DSP_SHELLSHOCK,
      version => 1,
      lines => [
        ['Cat', 'Quantity', 'UK Value', 'USD Value', 'USD Total'],
      ],
    },

    # EMI Canada
    #
    { service => Client::Service::DSP_EMI_CANADA,
        version => 1,
        sheet => 0,
        lines => [
            [
                'Month Ending', 'DST GRP', 'Label Grp', 'Label', 'UPC', 'Artist', 'Title', 'Config', 'Length', 'Sales Class', 'Price Point', 'Prefix', 'Pricing Rule', 'List Price', 'Box Price', 'Gross Sales \(\$\)', 'Discnt\. \(\$\)', 'Discnt\. \(\%\)', 'Grosss @ Invoice\(\$\)', 'Return \(\$\)', 'Return \(\%\)', 'Price Adjustments \(\$\)', 'Net Sales \$', 'Gross Domestic Sales \(Units\)', 'Domestic Returns \(Units\)', 'Net Domestic Sales \(Units\)', 'Split Price Adj\. \(\$\)', 'Split Volume Incentive \(\$\)', 'Digital Units', 'Digital \$',
            ],
        ],
    },

    # caroline
    # this will match any file with the word caroline in the filename. don't like it, but that's how it's been...
    # Note: this is the same header format as EMI v2, the exception being that it's considered caroline if it has
    # 'caroline' in the filename.
    #
    { service => Client::Service::DSP_CAROLINE,
      version => 1,
      file_name => 'caroline',
      match_on_any_row => 1,
      lines => [
            [undef, undef, undef, undef, 'GROSS SALES', undef, 'GROSS RETURNS', undef, 'NET' ],
            ['LABEL','ITEM','ARTIST/TITLE','UPC','UNITS','DOLLARS','UNITS','DOLLARS','NET UNITS','NET DOLLARS','TYPE'],
            [undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'P']
      ],
    },

    # EMI Physical.  We only know this by examining the 12 column (format) looking for a P
	{ service => Client::Service::DSP_EMI,
        version => 2,
        match_on_any_row => 1,
        lines => [
            [undef, undef, undef, undef, 'GROSS SALES', undef, 'GROSS RETURNS', undef, 'NET' ],
            ['LABEL','ITEM','ARTIST/TITLE','UPC','UNITS','DOLLARS','UNITS','DOLLARS','NET UNITS','NET DOLLARS','TYPE'],
			[undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'P']
        ],
    },
    # EMI Digital.  We only know this by examining the 12 column (format) looking for a D, M or S
	{ service => Client::Service::DSP_EMI,
        version => 1,
        match_on_any_row => 1,
        lines => [
            [undef, undef, undef, undef, 'GROSS SALES', undef, 'GROSS RETURNS', undef, 'NET' ],
            ['LABEL','ITEM','ARTIST/TITLE','UPC','UNITS','DOLLARS','UNITS','DOLLARS','NET UNITS','NET DOLLARS','TYPE'],
			[undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, '^[DMS]$']
        ],
    },

    # EMI Foreign Digital
    { service => Client::Service::DSP_EMI_FOREIGN_DIGITAL,
      version => 1,
      sheet => 1,
      match_on_any_row => 1,
      lines => [
          ['Sold By','Owned By','Artist','Title','DICPN/DTI','DICPN','ISRC','Format','Release date',
           'Gross Units','Net Sales Units','Gross Value','NDS Value', 'MONTH'],
        ],
    },

    # EMI Foreign Digital
    { service => Client::Service::DSP_EMI_FOREIGN_DIGITAL,
      version => 2,
      sheet => 0,
      match_on_any_row => 1,
      lines => [
          ['CLASS CODE','PRODUCT LINE','DEFAULT CATEGORY','Sold By','Owned By','Artist','Title','ICPN',
           'Format','Release date','Gross Units','Net Sales Units','Gross Value','NDS Value','EXCHANGE RATE',
           'NET .* DOLLARS','REPORTING MONTH'],
        ],
    },

    # caroline - welk (FB1807, FB1808)
    { service => Client::Service::DSP_CAROLINE,
      version => 2,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
'Calendar year', 'Calendar month', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'CPRS new UPC code', undef, 'ISRC Code', undef, 'Product Type  CO-PA', '(\$|CAD)', 'MU'
	]
      ],
    },
    # caroline - welk (FB3601) basically version 6 with an extra blank column at the beginning
    { service => Client::Service::DSP_CAROLINE,
      version => 6,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
undef, 'Calendar year', 'Calendar month', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'CPRS new UPC code', undef, 'ISRC Code', undef, 'Product Type  CO-PA', '(\$|CAD)', 'MU'
	]
      ],
    },    
    # caroline - welk (FB3630) basically version 6 with an extra blank column at the beginning
    { service => Client::Service::DSP_CAROLINE,
      version => 7,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
undef, 'Calendar year', 'Calendar month', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'CPRS new UPC code', undef, 'ISRC Code', undef, 'CAD', undef, 'CAD', 'CAD', 'CAD', 'CAD', 'CAD', 'MU', 'MU', 'MU'
	]
      ],
    },    
    # caroline - welk (FB3652) - same as v7, but shifted over one column
    { service => Client::Service::DSP_CAROLINE,
      version => 8,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
'Calendar year', 'Calendar month', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'CPRS new UPC code', undef, 'ISRC Code', undef, 'CAD', undef, 'CAD', 'CAD', 'CAD', 'CAD', 'CAD', 'MU', 'MU', 'MU'
	]
      ],
    },    

    # caroline - ato (FB1985)
    { service => Client::Service::DSP_CAROLINE,
      version => 3,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
'Super Label', 'Super Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'Configuration', 'ISRC', 'Statement Start Date', 'Statement End Date', 'Units.*', 'Revenue.*'
	]
      ],
    },
    # caroline - welk (FB3350)
    { service => Client::Service::DSP_CAROLINE,
      version => 5,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
'Super Label', 'Super Label Code', 'ASL #', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Configuration', 'Units.*', 'Revenue.*'
	]
      ],
    },
    # caroline - welk (FB4382)
    { service => Client::Service::DSP_CAROLINE,
      version => 9,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
'Super Label Code', 'Super Label', 'Sales Channel', 'Partner', 'Statement Start Date', 'Statement End Date', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Configuration', 'Units.*', 'Revenue.*'

	]
      ],
    },
    # caroline - ato (FB1987)
    { service => Client::Service::DSP_CAROLINE,
      version => 4,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code',
'Operating Unit', 'Company Code', 'Super Label Code', 'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Reporting Project Title',
'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Reporting Project Release Date', 'Title ID', 'Reporting Project Id',
'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Reporting Project Release Classification', 'Music Type Code', 'Music Type',
'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code',
'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price',
'Suggested Retail Price Code', 'Jumpstart Wholesale Price', 'Sales Units .*', 'Returned Units .*',
'Return Dollars .*', 'NET Units .*', 'Discount Amount .*', 'Gross Before Discount .*',
'Financial Net Sales .*', 'Financial Gross Sales Net of Discounts .*', 'Defective Gap Credit .*'
	]
      ],
    },
    # caroline - version 10
    { service => Client::Service::DSP_CAROLINE,
      version => 10,
      sheet => 'any',
      lines => [
        ([undef]) x 2,
        [ 'Country', 'Label Group', 'Label', 'Subject Area', 'UPC/ISRC', 'Royalty UPC', 'Title', 'Artist', 'Product Type', 'Format', 'Fiscal Year', 'Fiscal Month', 'Gross Sales Units', 'Return Unit', 'Net Sales Unit', 'Gross Sales Dollars', 'Discount Dollars', 'Return Dollars', 'Net Sales Dollars', '^$' ]
      ],
    },
    # caroline - version 11
    { service => Client::Service::DSP_CAROLINE,
      version => 11,
      sheet => 'any',
      lines => [
        [
            'Fiscal Year', 'Fiscal Month', 'Label Group', 'Label', 'Configuration', 'UPC', 'Selection', 'Artist', 'Title', 'Subj Area', 'Net Units', 'Net Revenue'
	]
      ],
    },
    # caroline - version 12 (FB5460)
    { service => Client::Service::DSP_CAROLINE,
      version => 12,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
        [
'Super Label', 'Super Label Code', 'Sub Label', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Revenue UMG P\d \d{2} \(\w{3} \d{2}\)', 'Units UMG P\d \d{2} \(\w{3} \d{2}\)'
	]
      ],
    },
    # Caroline - version 13 (FB8684)
    { service => Client::Service::DSP_CAROLINE,
      version => 13,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
        [ undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'Gross Income', 'Cash Discounts', 'Discounts Off-Invoice', 'Discounts On-Invoice', 'Gross Returns', 'Discounts on Returns', 'Net Sales', 'Sales Quantity', 'Gross Returns \(Q\)', 'Net Quantity' ],
        [ undef, 'Calendar year', 'Calendar month', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'CPRS new UPC code', undef, 'ISRC Code', undef, 'Product Type  CO-PA', 'CAD', undef, 'CAD', 'CAD', 'CAD', 'CAD', 'CAD', 'MU', 'MU', 'MU' ],
    ]
    },
    # Caroline - version 14 (FB14037)
    { service => Client::Service::DSP_CAROLINE,
      version => 14,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
	[ undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'Net Sales', 'Net Quantity' ],
	[ undef, 'Fiscal year/period', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'UPC', undef, 'ISRC', undef, 'Product Type', 'CAD', 'MU'],
    ]
    },
    # Caroline - version 15 (FB14856)
    { service => Client::Service::DSP_CAROLINE,
      version => 15,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
	[
'Label', 'Catalog No', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Vendor', 'Country of Sale', 'Country Code', 'Calendar Month', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Adjustments', 'Net Sales', 'Net Income', 'Caroline Distribution Fees', 'Distribution Fees %', 'Net Payable'
	],
    ]
    },
    # Caroline - version 16 (FB15405)
    { service => Client::Service::DSP_CAROLINE,
      version => 16,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
	[
'MR Super Label DESC', 'MR Super Label CODE', 'MR Sub Label DESC', 'MR Sub Label CODE', 'Sales Channel \(D\) DESC', 'Sales Channel \(D\) CODE', 'Sales Type DESC', 'Sales Type CODE', 'Sold As DESC', 'Sold As CODE', 'Album Artist DESC', 'Album TITLE', 'UPC ID', 'Track Artist \(D\) DESC', 'Track \(D\) Title', 'Product Latest Release Date ID', 'ISRC \(D\) ID', 'Configuration DESC', 'Configuration CODE', 'Statement Start Date \(D\) ID', 'Statement End Date \(D\) ID', 'National Account \(D\) DESC', 'MTD Digital Revenue', 'MTD Digital Units', 'Catalog/Non-Catalog', undef, undef, 'Statement Date'
	],
    ]
    },
    # Caroline - version 17 (FB15421)
    { service => Client::Service::DSP_CAROLINE,
      version => 17,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
	[
'MR Reporting Company DESC', 'MR Reporting Company CODE', 'MR Reporting Unit DESC', 'MR Reporting Unit CODE', 'MR Operating Company DESC', 'MR Operating Company CODE', 'MR Operating Unit DESC', 'MR Operating Unit CODE', 'MR Super Label DESC', 'MR Super Label CODE', 'MR Sub Label DESC', 'MR Sub Label CODE', 'Album Artist DESC', 'Album TITLE', 'Reporting Project DESC', 'Reporting Project CODE', 'Product Number NUMBER', 'Catalog Number CODE', 'UPC ID', 'Product Latest Release Date ID', 'Product Original Release Date ID', 'Reporting Project Release Date ID', 'Music Line DESC', 'Music Line CODE', 'Sales Type DESC', 'Sales Type CODE', 'Product Status DESC', 'Product Status CODE', 'Jumpstart Indicator \(P\) ID', 'Flex Product Indicator \(P\) ID', 'Configuration DESC', 'Configuration CODE', 'Price Code ID', 'Price Point CODE', 'Price Point DESC', 'Price Level CODE', 'Price Level DESC', 'Standard Cost \(P\) ID', 'Wholesale Price \(P\) ID', 'Suggested Retail Price Code \(P\) ID', 'Jumpstart Wholesale Price \(P\) ID', 'Financial Label CODE', 'Financial Label DESC', 'MTD Physical Net Revenue', 'MTD Physical Net Units', 'MTD Physical Sale Units', 'MTD Physical Returns Dollars', 'MTD Physical Returned Units', 'MTD Defective Gap Credit', 'MTD Physical Financial Net Sales', 'MTD Physical Gross Before Discount', 'MTD Physical Financial Gross Sales Net of Discounts', 'MTD Discount Dollars'
	],
    ]
    },
    # Caroline - version 18 (FB17546)
    { service => Client::Service::DSP_CAROLINE,
      version => 18,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
	[
'Label', 'Project', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Vendor', 'Country of Sale', 'Country Code', 'Calendar Month', 'Delivery Type', 'Delivery Format', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Adjustments', 'Net Sales', 'Net Income', 'Caroline Distribution Fees', 'Distribution Fees %', 'Net Payable'
	],
    ]
    },
    # YouTube Red - version 1 (FB14020)
    { service => Client::Service::DSP_YOUTUBE_RED,
      version => 1,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
['Video ID', 'Asset ID', 'ISRC', 'Custom ID', 'GRid', 'UPC', 'Artist', 'Title', 'Day', 'Country', 'Content Type', 'Claim Type', 'Monetized Views - Audio', 'Monetized Views - Audio Visual', 'Monetized Views', 'YouTube Revenue Split', 'Pro Rata Partner Revenue']
    ]
    },
    # YouTube Red - version 1 (FB15459)
    { service => Client::Service::DSP_YOUTUBE_RED,
      version => 2,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
['Video ID', 'Asset ID', 'ISRC', 'Custom ID', 'GRid', 'UPC', 'Artist', 'Title', 'Day', 'Country', 'Content Type', 'Claim Type', 'Monetized Views - Audio', 'Monetized Views - Audio Visual', 'Monetized Views', 'Amount']
    ]
    },
    # YouTube Red - version 3 (FB15524)
    { service => Client::Service::DSP_YOUTUBE_RED,
      version => 3,
      match_on_any_row => 1,
      sheet => 'any',
      lines => [
[
'Video ID', 'Asset ID', 'ISRC', 'Custom ID', 'GRid', 'UPC', 'Artist', 'Title', 'Day', 'Country', 'Content Type', 'Claim Type', 'Policy', 'Owned Views : Audio', 'Owned Views : Audio Visual', 'Owned Views', 'YouTube Revenue Split', 'Partner Revenue : Pro Rata'
]
    ]
    },
    # rough trade distribution gmbh
    { service => Client::Service::DSP_ROUGHTRADEDIST,
      version => 1,
      lines => [
        ['SUPPLIER', 'SUPPL_CODE', 'ARTIKELNR', 'CATALOG_NO', 'PRICE', 'SHARE', 'EVER_SALES', 'SALES', 'RETURNS', 'FREEGOODS', 'SALES_TURN', 'RETUR_TURN', 'COUNTRY', 'CURRENCY', 'CREDIT', 'PERIOD'],
      ],
    },
    # rough trade distribution gmbh
    { service => Client::Service::DSP_ROUGHTRADEDIST,
      version => 2,
      lines => [
        ['SUPPLIER', 'SUPPL_CODE', 'ARTIKELNR', 'CATALOG_NO', 'EVER_SALES', 'SALES', 'RETURNS', 'FREEGOODS', 'SHARE', 'SALES_TURN', 'RETUR_TURN', 'PRICE', 'COUNTRY', 'CURRENCY', 'CREDIT', 'PERIOD'],
      ],
    },
    # rough trade distribution gmbh
    { service => Client::Service::DSP_ROUGHTRADEDIST,
      version => 3,
      lines => [
        ['SUPPLIER','SUPPL_CODE','CATALOG_NO','ARTIKELNR','SALES','RETURNS','FREEGOODS','SHARE','SALES_TURN','RETUR_TURN','PRICE','COUNTRY','CURRENCY','CREDIT','PERIOD'],
      ],
    },
    # rough trade distribution dualtone
    { service => Client::Service::DSP_ROUGHTRADEDIST,
      version => 4,
      lines =>
      [[undef, 'Artist\/Title', 'PriceCode', 'Category', 'Domestic', 'Free', 'Promo',
      'Returns', 'Price', 'PPD', 'Turnover', 'Export', 'Free', 'Promo', 'Returns',
      'Price', 'PPD', 'Turnover', 'Amount', 'Vatrate'],],
    },
    # rough trade distribution dualtone
    { service => Client::Service::DSP_ROUGHTRADEDIST,
      version => 5,
      lines =>
      [['ArticleNo', 'Artist/Title', 'Pricecode', 'Category', 'Domestic', 'Free', 'Promos', 'Returns',
      'Price', 'Foreign', 'Free', 'Promos', 'Returns', 'Price', 'Amount', 'VATRATE'],],
    },
    # proper uk
    { service => Client::Service::DSP_PROPERUK,
      version => 1,
      lines => [
        ['Reporting Period', 'MAIN_SUPPLIER', 'ACCOUNT_NAME', 'ANALYSIS_GROUP', 'ANALYSIS_GROUP_DESC', 'ITEM_NUMBER', 'PRODUCT_GROUP', 'ITEM_DESCRIPTION_1', 'ITEM_DESCRIPTION_2', 'RELEASE DATE', 'Opening Stock', 'Purchases', 'Purchases returned', 'Promos', 'Sales', 'Returns', 'Net Sales', 'Closing Stock', undef, 'Cost Price', 'To Invoice', 'CURRENCY_DESCRIPTION'],
      ],
    },
    # proper uk
    { service => Client::Service::DSP_PROPERUK,
      version => 2,
      lines => [
        ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Statement Month', 'Label', 'Track Artist', 'Release Artist', 'Video Artist', 'Catalogue ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Video Name', 'Video Type', 'TV', 'Sale Format', 'Download Mechanicals Withheld', 'Delivery Type', 'Unit Count', 'Credit Count', '\w{3} Unit Price', '\w{3} Total Sales', '\w{3} Total Credits', '\w{3} Mechanicals Withheld By IODA', '\w{3} IRS Withheld', '\w{3} Total Sales', '\w{3} Invoice Amount'],
      ],
    },    
    # proper uk
    { service => Client::Service::DSP_PROPERUK,
      version => 3,
      lines => [
      	['From Proper Music Distribution Ltd', 'Consignment Sales Report', 'Reporting Period', undef, 'Run Date', undef, 'Label Report'],
      	['Label Report', 'Sales and Stock movements'],
        ['Ft', 'Catalogue Number', 'Barcode', 'Artist', 'Title', 'Release Date', 'Opn Stk', 'Pur Orders', 'Pur Return', 'Promos', 'Sales', 'Returns', 'Net Sales', 'Adjs', 'Cls Stk', 'Cost Price', 'To Invoice', 'All Time', 'Label'],
      ],
    },      
    # proper uk (v3 minus the upc column)
    { service => Client::Service::DSP_PROPERUK,
      version => 4,
      lines => [
      	['From Proper Music Distribution Ltd', 'Consignment Sales Report', 'Reporting Period', undef, 'Run Date', undef, 'Label Report'],
      	['Label Report', 'Sales and Stock movements'],
        ['Ft', 'Catalogue Number', 'Artist', 'Title', 'Release Date', 'Opn Stk', 'Pur Orders', 'Pur Return', 'Promos', 'Sales', 'Returns', 'Net Sales', 'Adjs', 'Cls Stk', 'Cost Price', 'To Invoice', 'All Time', 'Label'],
      ],
    },         
    # proper uk (FB15989)
    { service => Client::Service::DSP_PROPERUK,
      version => 5,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
      	['From Proper Music Distribution Ltd'],
        ([undef]) x 4,
        [
'Label', 'Format', 'Catalogue Number', 'Barcode', 'Artist', 'Title', 'PPD', 'Customer', 'Country', 'Sales Units', 'Sales Value', 'Cost Value at Agreed Buy Price', 'Returns Units', 'Returns Value', 'Adjusted Returns Value', 'Net Sales', undef, 'Invoice Amount in GBP', 'Exchange Rate', 'Invoice', 'Currency'
	],
      ],
    },         
    # proper uk (FB17861)
    { service => Client::Service::DSP_PROPERUK,
      version => 6,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
      	['From Proper Music Distribution Ltd'],
        ([undef]) x 4,
        [
 'Label', 'Format', 'Catalogue Number', 'Barcode', 'Artist', 'Title', 'PPD', 'Customer', 'Country', 'Sales Units', 'Sales Value', 'Sales Value at PPD net of Dist. Fee', 'Returns Units', 'Returns Value', 'Adjusted Returns Value', 'Net Sales', undef, 'Invoice Amount in GBP', 'Exchange Rate', 'Invoice', 'Currency'
	],
      ],
    },         
    # proper uk (FB18652)
    { service => Client::Service::DSP_PROPERUK,
      version => 6,  # alt v6 header; has 'Fee %' column instead of undef
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
      	['From Proper Music Distribution Ltd'],
        ([undef]) x 4,
        [
 'Label', 'Format', 'Catalogue Number', 'Barcode', 'Artist', 'Title', 'PPD', 'Customer', 'Country', 'Sales Units', 'Sales Value at NIP', 'Sales Value Net of Dist. Fee', 'Returns Units', 'Returns Value', 'Adjusted Returns Value', 'Net Sales', 'Fee %', 'Invoice Amount in GBP', 'Exchange Rate', 'Invoice', 'Currency'
	],
      ],
    },         
    # ONErpm (FB18670)
    { service => Client::Service::DSP_ONERPM,
      version => 1,
      sheet => 'any',
      lines => [
        [
'UPC', 'Cat #', 'ISRC', 'Quantity', 'Unit Gross', 'Total Gross', 'Fees', '% Share', 'Subtotal', 'Net \(Local\)', 'Currency \(Local\)', 'Exchange Rate', 'Net', 'Currency', 'Label', 'Artist', 'Album Title', 'Song Title', 'Song Mix', 'Retailer Territory', 'Customer Territory', '3rd Party Retailer', 'Stream', 'Product Type', 'Sale Type', 'Customer ID', 'Transaction Date', 'Accounted Date', 'Shared'
	],
      ],
    },         
    # rootsy
    { service => Client::Service::DSP_ROOTSY,
      version => 1,
      lines => [
        ['Cat\.\#', 'Artist', 'Title', 'Sales \d{4}', 'Sales Jan', 'Sales Feb', 'Sales March', 'Sales April', 'Sales May', 'Sales June', 'Sales July', 'Sales Aug', 'Sales Sep', 'Sales Oct', 'Sales Nov', 'Sales Dec', 'Sale Total', 'Unit price', 'Sum '],
      ],
    },
    # puretracks, 2006 and older with month in summary pricing rows
    { service => Client::Service::DSP_PURETRACKS,
      version => 6,
      lines => [
        ([undef]) x 2,
        ['Month', 'Item', 'Qty', '^Price$', 'Item Total'],
      ],
    },
    # puretracks, 2006 and older with month in summary pricing rows
    { service => Client::Service::DSP_PURETRACKS,
      version => 8,
      lines => [
        ([undef]) x 2,
        ['Item', 'Qty\.', 'Price', 'Item Total'],
      ],
    },
    # puretracks, 2008 10
    { service => Client::Service::DSP_PURETRACKS,
        sheet => 2,
        version => 11,
        lines => [
            ([undef]) x 5,
            ['Date','Qty','ISRC','Label\'s UniqueID','Artist','Title','Retail','Wholesale','Publishing',undef],
        ],
    },

    # puretracks - FB17430
    { service => Client::Service::DSP_PURETRACKS,
        sheet => 2,
        version => 13,
        lines => [
            ([undef]) x 3,
            ['Report Name'],
            ['TRACK SALES'],
            [ 'DATE', 'MEDIA TYPE', 'UPC', 'ISRC', 'PURETRACKS ID', 'LABEL NAME', 'LICENSOR ID', 'ARTIST', 'TITLE', 'QTY', 'RETAIL', 'WHOLESALE', 'PUBLISHING']
        ],
    },

    # puretracks, 2007 09
    { service => Client::Service::DSP_PURETRACKS,
        sheet => 2,
        version => 7,
        lines => [
            ([undef]) x 3,
            ['Report Name'],
            ['TRACK SALES'],
        ],
    },
    # puretracks, 2008 01
    { service => Client::Service::DSP_PURETRACKS,
        sheet => 0,
        version => 9,
        lines => [
            ['PURETRACKS INC\.'],
            ([undef]) x 25,
            ['Type','QTY','Retail','Wholesale','Payment','Publishing Deduction\*','Net Payment'],
        ],
    },
    # puretracks newer version
    { service => Client::Service::DSP_PURETRACKS,
      version => 2,
      sheet => 1,
      lines => [
        ['Summary - Albums? Sold'],
        [undef],
        ['Date', 'Qty\.', undef, 'Album Artist', 'Album Title'],
      ],
    },
    # puretracks, 2007+
    { service => Client::Service::DSP_PURETRACKS,
      version => 3,
      sheet => 1,
      lines => [
        ['QTY', 'UPC', 'Artist', 'Title', 'Retail', 'Transaction Date'],
      ],
    },
    # puretracks
    { service => Client::Service::DSP_PURETRACKS,
      version => 1,
      lines => [
        [undef],
        [undef],
        ['Item', 'Qty\.', 'Price Per Item', 'Item Total', 'Publishing Total', 'Less Publishing'],
      ],
    },
    # puretracks, 2006 and older with month in summary pricing rows
    { service => Client::Service::DSP_PURETRACKS,
      version => 5,
      lines => [
        ([undef]) x 2,
        ['Month', 'Item', 'Qty', 'Price Per Item', 'Item Total'],
      ],
    },
    # puretracks
    { service => Client::Service::DSP_PURETRACKS,
      version => 10,
      lines => [
        ['PURETRACKS INC\.'],
        ([undef]) x 25,
        ['Type','QTY','Wholesale','Payment','Publishing Deduction','Net Payment'],
      ],
    },
    # puretracks, 2007+ w/wholesale & publish
    { service => Client::Service::DSP_PURETRACKS,
      version => 4,
      sheet => 1,
      lines => [
        ['QTY', 'UPC', 'Artist', 'Title', 'Retail', 'Wholesale', 'Publish', 'Transaction Date'],
      ],
    },
    # puretracks, 2010
    { service => Client::Service::DSP_PURETRACKS,
      version => 12,
      sheet => 1,
      lines => [
        ([undef]) x 6,
        ['UPC', undef, 'ISRC', 'Track ID', 'Track Title', 'Artist Name', undef, 'Non- Portable Plays', 'Portable Plays'],
      ],
    },
    # universal
    { service => Client::Service::DSP_UNIVERSAL,
      version => 1,
      lines => [
        ['CP NO', 'CP NAME', 'CONTRACT', 'SUB-CONTRACT', 'SALE TERR', 'TERR NAME', 'ARTICLE NO', 'CONF', 'SET', 'ST DATE', 'END DATE', 'SALE CHAN', 'UNIT', 'GROSS IND', 'BASIS', 'CURR', 'PRICE EX SALES TAXES', 'PRICE BASIS', 'ACCOUNTING PRICE', 'CURR', 'RATE', 'PAID ROY\. REC\.', 'SHARE', 'ROYALTY AMOUNT', 'SOURCE TAX', 'RATE OF EXCHANGE', 'CURR', 'NET ROYALTY AMOUNT'],
      ],
    },
    # universal - multi tab with a blank col
    { service => Client::Service::DSP_UNIVERSAL,
      version => 2,
      sheet => 1,
      lines => [
        ['ALBUMS'],
        [undef],
        ['GL Digital Partner', 'GL Sales Channel', 'GL Sold As', 'GL UPC', 'GL Album Artist', 'GL Album Title', 'Partner Stmt Start Date', 'Partner Stmt End Date', 'GL Period', 'GL Super Label', undef, 'Net Unit Price', 'Album Sales Units', 'Album Sales Revenue'],
      ],
    },
    # universal - multi tab with no blank col
    { service => Client::Service::DSP_UNIVERSAL,
      version => 3,
      sheet => 1,
      lines => [
        ['GL Digital Partner', 'GL Sales Channel', 'GL Sold As', 'GL UPC', 'GL Album Artist', 'GL Album Title', 'GL Partner Stmt Start Date', 'GL Partner Stmt End Date', 'GL Period', 'GL Super Label', 'Net Unit Price', 'Album Sales Units', 'Album Sales Revenue'],
      ],
    },
    # universal - multi tab with a blank col for albums but not for tracks
    { service => Client::Service::DSP_UNIVERSAL,
      version => 4,
      sheet => 1,
      lines => [
        ['GL Digital Partner', 'GL Sales Channel', 'GL Sold As', 'GL UPC', 'GL Album Artist', 'GL Album Title', 'GL Partner Stmt Start Date', 'GL Partner Stmt End Date', 'GL Period', 'GL Super Label', 'Metrics', 'Net Unit Price', 'Album Sales Units', 'Album Sales Revenue'],
      ],
    },
    # universal - canadian digital sales
    { service => Client::Service::DSP_UNIVERSAL,
        version => 5,
        shees => 0,
        lines => [
            [undef],
            ['Repertoire Owner','Artist Name','Track Title','Title','Album Track Ind','Sales Channel','Sales Channel Desc','Isrc','UPC Number','Catalog Number','Units Sold','Net Price'],
        ],
    },
    # universal - canadian physical sales
    { service => Client::Service::DSP_UNIVERSAL,
        version => 6,
        sheet => 0,
        lines => [
            ([undef]) x 5,
            [undef,undef,'Sound Carrier','Catalogue #','Artist Name',undef,'Title','Release Date','Current Price Code','Gross Sales Units','Gross Sales before Discounts','Discounts','Gross Sales Dollars','Return Units','Return Dollars','Net Units','Net Dollars'],
        ],
    },
    # universal - canadian physical sales
    { service => Client::Service::DSP_UNIVERSAL,
        version => 9,
        sheet => 0,
        lines => [
            ([undef]) x 6,
            [undef,'Sound Carrier','Catalogue #','Artist Name',undef,'Title','Release Date','Current Price Code','Gross Sales Units','Gross Sales before Discounts','Discounts','Gross Sales Dollars','Return Units','Return Dollars','Net Units','Net Dollars'],
        ],
    },
    # CMG -> Universal -> Albums
    { service => Client::Service::DSP_UNIVERSAL,
        version => 7,
        sheet => 0,
        lines => [
            ['GL Digital Partner','GL Sales Channel','GL Sold As','GL UPC','GL Album Artist','GL Album Title','GL Partner Stmt Start Date','GL Partner Stmt End Date','GL Period','GL Super Label','Net Unit Price','Album Sales Units','Album Sales Revenue']
        ],
    },
    # CMG -> Universal -> Albums
    { service => Client::Service::DSP_UNIVERSAL,
        version => 7,
        sheet => 0,
        lines => [
            ['GL\_Digital\_Partner','GL\_Sales\_Channel','GL\_Sold\_As','GL\_UPC','GL\_Album\_Artist','GL\_Album\_Title','GL\_Partner\_Stmt\_Start\_Date','GL\_Partner\_Stmt\_End\_Date','Period','GL\_Super\_Label','Net_Units','Album\_Sales\_Units','Album\_Sales\_Revenue'],
        ],
    },
    # CMG -> Universal -> Tracks
    { service => Client::Service::DSP_UNIVERSAL,
        version => 8,
        sheet => 0,
        lines => [
            ['GL Digital Partner','GL Sales Channel','GL Sold As','GL ISRC','GL UPC','GL Track Artist','GL Track Title','GL Partner Stmt Start Date','GL Partner Stmt End Date','Period','GL Super Label','Net Units','Track Sales Units','Track Sales Revenue'],
        ],
    },
    # Wild Palms -> Universal Online
    { service => Client::Service::DSP_UNIVERSAL,
        version => 10,
        sheet => 0,
        lines => [
            ['Country','Period','Retailer Identifier','Format','Free Y\/N','Sales Type','Title Category','Per Album or  per Track','ID Digital Identifier','Product Ref\.','Product Code Barre \(UPC\)','Album Name','Album Artist','Track Name','Track Artist','Label','ISRC','Number Of Tracks','Retail  Price \(incl VAT\)','PPD \(excl VAT\)','Discount \%','Royalty Per Unit \(excl VAT\)','quantity','Total Amount \(excl VAT\)'],
        ],
    },
    # VP Music -> Universal UK
    { service => Client::Service::DSP_UNIVERSAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        limit => 2,
        lines => [
            ['ROYALTY STATEMENT FOR AND ON BEHALF OF UNIVERSAL MUSIC DIGITAL SERVICES'],
            [undef],
            ['Acct Year/Month','Sales Admin Country Name','Payee Name','RMS Releasing Division Name','Reporting Digital Sales Partner','RMS Releasing Label Name','Product Type Description \(Reported\)','ISRC Number \(Processing\)','Track Artist \(Reported\)','Track Artist \(Standardised\)','Track Title \(Reported\)','Track Title \(Standardised\)','Sales Channel Description','UPC \(Reported\)','Album Artist \(Reported\)','Album Title \(Reported\)','Total Number Of Payable Txn','Retail Price £','Income £ Sterling','\% Income Due','Value Due £ Sterling'],
        ],
    },
    # VP Music -> Universal UK
    { service => Client::Service::DSP_UNIVERSAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Acct Year/Month','Sales Admin Country Name','Payee Name','RMS Releasing Division Name','Reporting Digital Sales Partner','RMS Releasing Label Name','Product Type Description \(Reported\)','ISRC Number \(Processing\)','Track Artist \(Reported\)','Track Artist \(Standardised\)','Track Title \(Reported\)','Track Title \(Standardised\)','Sales Channel Description','UPC \(Reported\)','Album Artist \(Reported\)','Album Title \(Reported\)','Total Number Of Payable Txn','Retail Price £','Total  Amount Local','\% Income Due','Total Due Amount'],
        ],
    },
    # VP Music -> Universal UK (FB16683)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
             'Acct Year/Month','Sales Admin Country Name','Payee Name','RMS Releasing Division Name','Reporting Digital Sales Partner','RMS Releasing Label Name','Product Type Description \(Reported\)','ISRC Number \(Processing\)','Track Artist \(Reported\)','Track Artist \(Standardised\)','Track Title \(Reported\)','Track Title \(Standardised\)','Sales Channel Description','UPC \(Reported\)','Album Artist \(Reported\)','Album Title \(Reported\)','Total Number Of Payable Txn','Retail Price £','Total Due Amount Local','\% Income Due','Total Due Amount Local'
	    ],
        ],
    },
    # VP Music -> Universal UK (FB36)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
             'Acct Year/Month','Sales Admin Country Name','Payee Name','RMS Releasing Division Name','Reporting Digital Sales Partner','RMS Releasing Label Name','Product Type Description \(Reported\)','ISRC Number \(Processing\)','Track Artist \(Reported\)','Track Artist \(Standardised\)','Track Title \(Reported\)','Track Title \(Standardised\)','Sales Channel Description','UPC \(Reported\)','Album Artist \(Reported\)','Album Title \(Reported\)','Total Number Of Payable Txn','Retail Price £','Value Due £ Sterling','\% Income Due','Total Due Amount Local'
	    ],
        ],
    },
    # VP Music -> Universal UK (FB2940)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
             'Acct Year/Month','Sales Admin Country Name','Payee Name','RMS Releasing Division Name','Reporting Digital Sales Partner','RMS Releasing Label Name','Product Type Description \(Reported\)','ISRC Number \(Processing\)','Track Artist \(Reported\)','Track Artist \(Standardised\)','Track Title \(Reported\)','Track Title \(Standardised\)','Sales Channel Description','UPC \(Reported\)','Album Artist \(Reported\)','Album Title \(Reported\)','Total Number Of Payable Txn',
	     'Retail Price £','Total Due Amount Local','\% Income Due','Value Due £ Sterling'
	    ],
        ],
    },
    # Universal CA Digital
    { service => Client::Service::DSP_UNIVERSAL,
        version => 12,
        lines => [
            [undef],
            ['Repertoire Owner', 'Artist Name', 'Track Short Title', 'Title', 'Album Track Ind', 'Sales Channel', 'Sales Channel Desc', 'Isrc', 'UPC Number', 'Catalog Number', 'Calendar_Year_Month', 'Units Sold', 'Net Price'],
        ],
    },
    # Universal CA Physical
    { service => Client::Service::DSP_UNIVERSAL,
        version => 13,
        lines => [
            ([undef]) x 6,
            [undef, 'Fiscal Year Month', 'Release Date', 'Catalog Number', 'Gross Sales Units', undef, undef, undef, 'Total Rtn Units', 'Total Rtn Dollar', 'Net Sales Units', 'Net Sales Dollars', 'Manual Adj Dollars', 'Flexx Dollars', undef, 'Scan Dollars', 'Artist and Title Description'],
        ],
    },    
    # Welk - Universal (FB4885)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 14,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Financial Label', 'Artist', 'Project', 'Release', 'Product', 'ISRC', 'UPC', 'Product Group', 'Product Type', 'Usage Type', 'Subject Area', 'Calendar Month', 'Country', 'Configuration', 'Net Quantity', 'Sales in USD\(\$\)'
	    ],

        ],
    },    
    # Universal Digital (FB5216)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 15,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'ENDING', 'CATALOGUE NO.', 'SALES TYPE', 'RECORDING', 'TRACK', 'SALES', 'PRICE \(\$\)', 'RATE', 'SHARE', 'EARNINGS \(\$\)'
	    ],
            [ undef ],
            [
undef, undef, '(PORTABLE SUBSCRIPTION INCOME|AD-FUNDED STREAMING BY THIRD PARTY)'
	    ],

        ],
    },    
    # Universal Physical (FB5217)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 16,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'ENDING', 'CATALOGUE NO.', 'RECORDING', 'TRACK', 'SALES', 'PRICE \(\$\)', 'RATE', 'SHARE', 'EARNINGS \(\$\)'
	    ],
        ],
    },    
    # Universal Physical (FB5397)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 17,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Reporting Project Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Reporting Project Release Date', 'Title ID', 'Reporting Project Id', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Reporting Project Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price',

'Sales Units UMG \w{2} \w{2} \(\w{3} \d{2}\)', 'Returned Units UMG \w{2} \w{2} \(\w{3} \d{2}\)', 'NET Units UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Gross Before Discount UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Discount Amount UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Financial Gross Sales Net of Discounts UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Return Dollars UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Financial Net Sales UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Defective Gap Credit UMG \w{2} \d{2} \(\w{3} \d{2}\)'

	    ],
        ],
    },    
    # Universal Physical (FB5567)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 18,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Title ID', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price',

'Sales Units UMG \w{2} \w{2} \(\w{3} \d{2}\)', 'Returned Units UMG \w{2} \w{2} \(\w{3} \d{2}\)', 'NET Units UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Gross Before Discount UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Discount Amount UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Financial Gross Sales Net of Discounts UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Return Dollars UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Financial Net Sales UMG \w{2} \d{2} \(\w{3} \d{2}\)', 'Defective Gap Credit UMG \w{2} \d{2} \(\w{3} \d{2}\)'

	    ],
        ],
    },    
    # Universal Physical (FB7488) - almost the same as FB5567, but with columns AU and AW swapped
    { service => Client::Service::DSP_UNIVERSAL,
        version => 18,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Title ID', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price',
'Sales Units UMG \w{2,3} \w{2} \(\w{3} \d{2}\)', 
'Returned Units UMG \w{2,3} \w{2} \(\w{3} \d{2}\)', 
'NET Units UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Financial Gross Sales Net of Discounts UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Discount Amount UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Gross Before Discount UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Return Dollars UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'Financial Net Sales UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'Defective Gap Credit UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'^$'
	    ],
        ],
    },    
    # Universal Physical (FB9402) - another version 18 variant, but with some juggled columns
    { service => Client::Service::DSP_UNIVERSAL,
        version => 29,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Parent Label',
'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Title ID', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price',
'Sales Units UMG \w{2,3} \w{2} \(\w{3} \d{2}\)', 
'Returned Units UMG \w{2,3} \w{2} \(\w{3} \d{2}\)', 
'NET Units UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Gross Before Discount UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Discount Amount UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Financial Gross Sales Net of Discounts UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Return Dollars UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'Financial Net Sales UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'Defective Gap Credit UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'^$'
	    ],
        ],
    },    
    # Universal Physical (FB9403) - another version 18 variant, but with some juggled columns
    { service => Client::Service::DSP_UNIVERSAL,
        version => 30,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Parent Labels',
'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Title ID', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price',
'Sales Units UMG \w{2,3} \w{2} \(\w{3} \d{2}\)', 
'Returned Units UMG \w{2,3} \w{2} \(\w{3} \d{2}\)', 
'Return Dollars UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'NET Units UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Discount Amount UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Gross Before Discount UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Financial Net Sales UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'Financial Gross Sales Net of Discounts UMG \w{2,3} \d{2} \(\w{3} \d{2}\)',
'Defective Gap Credit UMG \w{2,3} \d{2} \(\w{3} \d{2}\)', 
'^$'
	    ],
        ],
    },    
    # Universal Digital (FB5581)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 19,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Digital Sales'],
	    [ undef ],
[
'Super Label', 'Sub Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'Configuration', 'ISRC', 'Statement Start Date', 'Statement End Date', 'Units UMG P\d+ \d{2} \(\w{3} \d{2}\)', 'Revenue UMG P\d+ \d{2} \(\w{3} \d{2}\)'
]
        ],
    },    
    # Universal Digital (FB5582)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 20,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Physical Sales'],
	    [ undef ],
[
'Super Label', 'Super Label Code', 'Artist', 'Title', 'UPC', 'Latest Release Date', 'Sales Type', 'Configuration', 'Price Point', 'Price Level', 
'Sales Units UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'Returned Units UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'NET Units UMG\s+P\w+ \d{2} \(\w{3} \d{2}\)',
'Gross Before Discount UMG\s+P\w+ \d{2} \(\w{3} \d{2}\)', 
'Return Dollars UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'Discount Amount UMG P\w+ \d{2} \(\w{3} \d{2}\)',
'Financial Net Sales UMG P\w+ \d{2} \(\w{3} \d{2}\)'
]
        ],
    },    
    # Universal Digital (FB7144) -- almost same as version 20, but first two columns are swapped
    { service => Client::Service::DSP_UNIVERSAL,
        version => 23,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Physical Sales'],
	    [ undef ],
[
'Super Label Code', 'Super Label', 'Artist', 'Title', 'UPC', 'Latest Release Date', 'Sales Type', 'Configuration', 'Price Point', 'Price Level', 
'Sales Units UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'Returned Units UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'NET Units UMG P\w+ \d{2} \(\w{3} \d{2}\)',
'Gross Before Discount UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'Return Dollars UMG P\w+ \d{2} \(\w{3} \d{2}\)', 
'Discount Amount UMG P\w+ \d{2} \(\w{3} \d{2}\)',
'Financial Net Sales UMG P\w+ \d{2} \(\w{3} \d{2}\)'
]
        ],
    },    
    # Universal Digital (FB17990) -- almost same as version 23, but no spaces in the (MMMYY).  Also 1st column variation.
    { service => Client::Service::DSP_UNIVERSAL,
        version => 23,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Physical Sales'],
	    [ undef ],
[
'(Sub|Super) Label Code', 'Super Label', 'Artist', 'Title', 'UPC', 'Latest Release Date', 'Sales Type', 'Configuration', 'Price Point', 'Price Level', 
'Sales Units UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)', 
'Returned Units UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)', 
'NET Units UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)',
'Gross Before Discount UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)', 
'Return Dollars UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)', 
'Discount Amount UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)',
'Financial Net Sales UMG P\w+ \d{2} \(\w{3}(?:\s)?\d{2}\)'
]
        ],
    },    
    # Universal Digital (FB6053)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 21,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
[
'Accounting Quarter', 'Country of Sale Name', 'Configuration Desc', 'Sales Channel', 'Configuration Spar Code', 'Item ID', 'Owner Company Name', 'Reporting Company Name', 'Item Title', 'Main Artist Desc', 'Settlement Quarter', 'Net Sales', 'PPD Price Local', 'Retail Price Local', 'Exchange Rate Local Euro', 'Gross Rec', '\% Due', 'Due Euro', 'ex rate', 'Due £'
]
        ],
    },    
    # Universal Digital (FB7060)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 22,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Digital Sales'],
            [ undef ],
            [
                'Super Label', 'Super Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)?', 'Units UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)?'
            ]
        ],
    },
    # Universal Digital, similar to 22 above (FB11459)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 38,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Digital Sales'],
	    [ undef ],
[
'Super Label', 'Super Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3,9} \d{2}\)?', 'Units UMG P\d{1,2} \d{2} \(\w{3,9} \d{2}\)?'
]
        ],
    },    
    # Universal Digital, similar to 38 above (FB14027)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 45,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Digital Sales'],
	    [ undef ],
[
'Super Label Code', 'Super Label', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3,9}\s*\d{2}\)?', 'Units UMG P\d{1,2} \d{2} \(\w{3,9}\s*\d{2}\)?'
]
        ],
    },    
    # Universal Digital (FB16507)
            { service => Client::Service::DSP_UNIVERSAL,
                version => 50,
                sheet => 'any',
                match_on_any_row => 1,
                lines => [
                    [
'Super Label Code', 'Super Label', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'Configuration', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(.+\)', 'Units UMG P\d{1,2} \d{2} \(.+\)'
                        ],
                ],
            },
    # Universal Digital (FB8395) [similar to v22 header, but with an extra column]
    { service => Client::Service::DSP_UNIVERSAL,
        version => 27,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Digital Sales'],
	    [ undef ],
[
'Super Label', 'Super Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Track Code', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)?', 'Units UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)?'
]
        ],
    },    
    # Universal Digital (FB7766)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 24,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
[
'Accounting Quarter', 'Owner Company Name', 'Country of Sale Name', 'Reporting Company Name', 'Sales Channel Description', 'Item ID', 'Item Title', 'Main Artist Desc', 'Configuration Desc', 'Settlement Quarter', 'Net Sales', 'PPD Price Local', 'Retail Price Local', 'Exchange Rate Local Euro', 'Gross Rec', '% Due', 'Due Euro', 'ex\.? rate', 'Due £'
]
        ],
    },   
    # Universal Digital (FB8241)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 25,
        sheet => 'any',
        lines => [
        ['Digital Sales'],
	    [ undef ],
[
'Super Label', 'Super Label Code|Sub Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'Configuration', 'ISRC', 'Statement Start Date', 'Statement End Date', 'Revenue UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)', 'Units UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)', 'ASL|^$', '^$'
]
        ],
    },    
    # Universal Digital (FB8243)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 26,
        sheet => 'any',
        lines => [
        ['Digital Sales'],
	    [ undef ],
[
'Super Label', 'Super Label Code', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPC', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'Configuration', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)', 'Units UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)', '^$'
]
        ],
    },          
    # Universal Digital (FB8854)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 28,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'digital',
        lines => [
            [
                'ENDING', 'CATALOGUE NO.', 'SALES TYPE', 'RECORDING', 'TRACK', 'SALES', 'PRICE \(\$\)', 'RATE', 'SHARE', 'EARNINGS \(\$\)'
	        ],
        ],
    },    
    # Universal Physical (FB13314) -- same header as v28, but for physical sales
    { service => Client::Service::DSP_UNIVERSAL,
        version => 41,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'physical',
        lines => [
            [
                'ENDING', 'CATALOGUE NO.', 'SALES TYPE', 'RECORDING', 'TRACK', 'SALES', 'PRICE \(\$\)', 'RATE', 'SHARE', 'EARNINGS \(\$\)'
	        ],
        ],
    },    
    # Universal Digital (FB9998)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 31,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Title ID', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price', 'Sales Units UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Returned Units UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Return Dollars UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'NET Units UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Discount Amount UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Gross Before Discount UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Financial Net Sales UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Financial Gross Sales Net of Discounts UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', 'Defective Gap Credit UMG P\d{1,2} \d{1,2} \(\w{3} \d{1,2}\)', '(Parent Label)?'
	        ],
        ],
    },    
    # Universal Digital (FB10346) -- alternate v31 header (no last column)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 31,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Reporting Company Code', 'Reporting Company', 'Reporting Unit Code', 'Reporting Unit', 'Operating Company Code', 'Operating Company', 'Operating Unit Code', 'Operating Unit', 'Company Code', 'Super Label Code', 'Super Label', 'Sub Label Code', 'Sub Label', 'Artist', 'Title', 'Product Number', 'Catalog Number', 'UPC', 'Latest Release Date', 'Original Release Date', 'Title ID', 'Music Line', 'Sales Type', 'Status', 'Product Release Classification', 'Music Type Code', 'Music Type', 'Regular Sales Indicator', 'Jumpstart Indicator', 'Flex Product Indicator', 'Repertoire Owner Code', 'Repertoire Owner Description', 'Configuration Code', 'Configuration', 'Configuration Mod', 'Units per Set', 'Price Code', 'Price Point', 'Price Level', 'Standard Cost', 'Wholesale Price', 'Suggested Retail Price Code', 'Jumpstart Wholesale Price', 'Sales Units UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Returned Units UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Return Dollars UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'NET Units UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Discount Amount UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Gross Before Discount UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Financial Net Sales UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Financial Gross Sales Net of Discounts UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)', 'Defective Gap Credit UMG P\d \d{1,2} \(\w{3}\s*\d{1,2}\)'
	        ],
        ],
    },    
    # Universal Digital (FB10005)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 32,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Calendar year', 'Calendar month', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'CPRS new UPC code', undef, 'ISRC Code', undef, 'Product Type  CO-PA'
	        ],
        ],
    },    
    # Universal Digital AU (FB9994)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 33,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Sales Country', 'RMS Releasing Label Name', 'Sales Period', 'Acct Period', 'Item ID \(ISRC\)', 'Artist', 'Album', 'Title', 'Release Date', 'Digital Sales Partner', 'Sales Channel Description', 'Product Type', 'PPD Local', 'Digital Units', 'Digital Sales Income', 'Distribution Fee %', 'Distibution Fee', 'Total Income Net of Distribution Fee'
	        ],
        ],
    },    
    # Universal Digital NZ (FB9995)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 34,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Sales Country', 'RMS Releasing Label Name', 'Acct Period', 'Item ID \(Processed\)', 'Artist', 'Title', 'Sales Period', 'Partner', 'Product Type', 'Sales Channel Description', 'PPD Local', 'Curr Local', 'Payable Txn', 'Amount Local', 'Royalty Rate', 'Payable'
	        ],
        ],
    },    
    # Universal Physical AU (FB9996)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 35,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Sales Month', 'Catalog', 'Artist', 'Title', 'Release Date', 'Music Class', 'Price Code', 'PPD', 'Gross Sales Qty', 'Returns Qty', 'Net Sales Qty', 'Freebie Qty', 'Gross Sales Value', 'Returns Value', 'Discount Value', 'Rebate Value', 'Net Sales Value', undef, 'Distribution Fee %', 'Distribution Fee Value', 'Mechanical Rate %', 'Mechanical', undef, 'Pmt Due', undef
	        ],
        ],
    },    
    # Universal Digital  (FB11126)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 36,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'digital',
        lines => [
            [
'Processing Period', 'Contract Number', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Carrier Type', 'Set Cnt', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code', 'PPD', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(\w{3}\)'
	        ],
        ],
    },    
    # Universal Physical  (FB11131)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 37,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'physical',
        lines => [
            [
'Processing Period', 'Contract Number', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Carrier Type', 'Set Cnt', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code', 'PPD', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(\w{3}\)'
	        ],
        ],
    },    
    # Universal Physical  (FB13259)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 39,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'physical',
        lines => [
            [
'Product Number', 'Title', 'Product Type Code', 'Set Contents', 'Sales Period', 'Country', 'Distributor', 'Sales Type', 'Sales Units', 'Gross/ Net', 'Price Basis', 'Currency Code', 'PPD', 'Accounting Price', 'Royalty Rate %', 'Product Share %', 'Source Tax %', 'Exchange Rate', 'Royalty Amount'
	        ],
        ],
    },    
    # Universal Physical  (FB13322)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 40,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'digital',
        lines => [
            [
'Product Number', 'Title', 'Product Type Code', 'Set Contents', 'Sales Period', 'Country', 'Distributor', 'Sales Type', 'Sales Units', 'Gross/ Net', 'Price Basis', 'Currency Code', 'PPD', 'Accounting Price', 'Royalty Rate %', 'Product Share %', 'Source Tax %', 'Exchange Rate', 'Royalty Amount'
	        ],
        ],
    },    
    # Universal Physical  (FB13486)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 42,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Article Number', 'Title', 'Subcontract Name', 'Sub con', 'Carrier Type', 'Set Cnt', 'Period From / To', 'Orignal SalesTerritory Name', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Gross Net Ind', 'Prc Ba- sis', 'Net Sales', 'Currency Code', 'PPD', 'Accounting Price', 'Roy Rate', 'Share %', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(EUR\)'
	        ],
        ],
    },    
    # Universal Physical  (FB13846)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 43,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Sales Month', 'Catalog', 'Artist', 'Title', 'Release Date', 'Music Class', 'Carrier', 'Price Code', 'PPD', 'Gross Sales Qty', 'Returns Qty', 'Net Sales Qty', 'Freebie Qty', 'Gross Sales Value', 'Returns Value', 'Discount Value', 'Rebate Value', 'Net Sales Value', undef, 'Distribution Fee %', 'Distribution Fee Value', 'Mechanical Rate %', 'Mechanical', undef, 'Pmt Due'
	        ],
        ],
    },    
    # Universal Physical (FB14038)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 44,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Fiscal year/period', 'JVA: Deal parent num', 'JVA: Deal sub number', 'Artist', 'UPC', undef, 'ISRC', undef, 'Product Type'
	        ],
        ],
    },    
    # Universal Physical (FB14580)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 46,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Administrator ID', 'Administrator Company Name', 'Owner ID', 'Owner Company Name', 'Contributor ID', 'Acc Per Begin Quarter', 'Sls Per Begin Quarter', 'Sls Per End Quarter', 'Country of Sale ID', 'Country of Sale Name', 'Deal Type \(Distro/License\)', 'MCG', 'Item ID', 'Item Title', 'ISRC', 'ISRC Title', 'Configuration Code', 'Configuration Description', 'Contributor Description', 'Sales Channel Code', 'Sales Channel Description', 'Sales Type', 'Net Sales', 'Retail Price Euro', 'Retail Price Euro-net of tax', 'PPD Price Euro', 'PPD Price Euro - net of tax', 'Top Price Euro', 'AIF Accounting Rate', 'Accounting Level \(out\)', 'AIF Royalty Base Indicator', 'Share Percentage', 'AIF Royalty base amt Euro', 'AIF Royalty base amt Euro2', 'Base amt euro -  net of tax', 'AIF Royalty base amt  USD', 'NOR Acct amt euro', 'Coll Source Tax %', 'AIF amt euro', 'Global Netting', 'AIF amt \w{3}', 'NOR actual FX rate', 'NOR USD', 'NOR AIF Amt \w{3} \(NET\)', 'Superlabel- Final Q215', 'Final Superlabel Desc'
	        ],
        ],
    },    
    # Universal Physical (FB14855)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 47,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Jde Company \(JDE - Jan 2004 to Dec 2012\) CODE', 'Jde Company \(JDE - Jan 2004 to Dec 2012\) Name', 'Financial Label CODE', 'Financial Label DESC', 'MR Sub Label DESC', 'MR Sub Label CODE', 'Album Artist DESC', 'Catalog Number CODE', 'Product Number NUMBER', 'UPC ID', 'Product Latest Release Date ID', 'Product Original Release Date ID', 'Music Line DESC', 'Music Line CODE', 'Sales Type DESC', 'Sales Type CODE', 'Flex Product Indicator \(P\) ID', 'Jumpstart Indicator \(P\) ID', 'Rep Owner \(FiRR converted to SAP\) CODE', 'Rep Owner \(FiRR converted to SAP\) DESC', 'Configuration DESC', 'Configuration CODE', 'Price Code ID', 'Price Point CODE', 'Price Point DESC', 'Price Level CODE', 'Price Level DESC', 'Standard Cost \(P\) ID', 'Wholesale Price \(P\) ID', 'Suggested Retail Price Code \(P\) ID', 'Jumpstart Wholesale Price \(P\) ID', 'Product DESC', 'SAP Artist \(SAP \x{2013} Jan 2013 to present\) DESC', 'SAP Company \(SAP \x{2013} Jan 2013 to present\) CODE', 'SAP Company \(SAP \x{2013} Jan 2013 to present\) DESC', 'MTD Physical Net Revenue', 'MTD Physical Net Units', 'MTD Physical Invoice Sales', 'MTD Physical Sale Units', 'MTD Physical Returns Dollars', 'MTD Physical Returned Units', 'MTD Physical Financial Net Sales', 'MTD Physical Gross Before Discount', 'MTD Physical Financial Gross Sales Net of Discounts'
	        ],
        ],
    },    
    # Universal Physical (FB14993)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 48,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'MR Reporting Company DESC', 'MR Reporting Company CODE', 'MR Reporting Unit DESC', 'MR Reporting Unit CODE', 'MR Operating Company DESC', 'MR Operating Company CODE', 'MR Operating Unit DESC', 'MR Operating Unit CODE', 'Financial Label CODE', 'Financial Label DESC', 'MR Sub Label DESC', 'MR Sub Label CODE', 'Album Artist DESC', 'Album TITLE', 'Product Number NUMBER', 'UPC ID', 'Product Latest Release Date ID', 'Product Original Release Date ID', 'Track \(D\) Title', 'Music Line DESC', 'Sales Type DESC', 'Product Status DESC', 'Jumpstart Indicator \(P\) ID', 'Flex Product Indicator \(P\) ID', 'Rep Owner \(FiRR converted to SAP\) CODE', 'Rep Owner \(FiRR converted to SAP\) DESC', 'Configuration DESC', 'Configuration CODE', 'Price Code ID', 'Price Point CODE', 'Price Level CODE', 'Standard Cost \(P\) ID', 'Wholesale Price \(P\) ID', 'Suggested Retail Price Code \(P\) ID', 'Jumpstart Wholesale Price \(P\) ID', 'MTD Physical Invoice Sales', 'MTD Physical Sale Units', 'MTD Physical Returns Dollars', 'MTD Physical Returned Units', 'MTD Physical Net Revenue', 'MTD Physical Net Units', 'MTD Physical Gross Before Discount', 'MTD Physical Financial Gross Sales Net of Discounts', 'MTD Discount Dollars', 'MTD Defective Gap Credit'
	        ],
        ],
    },    
    # Universal Physical (FB14993)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 49,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'MR Reporting Company DESC', 'MR Reporting Company CODE', 'MR Reporting Unit DESC', 'MR Reporting Unit CODE', 'MR Operating Company DESC', 'MR Operating Company CODE', 'MR Operating Unit DESC', 'MR Operating Unit CODE', 'Financial Label CODE', 'Financial Label DESC', 'MR Sub Label DESC', 'MR Sub Label CODE', 'Album Artist DESC', 'Album TITLE', 'Product Number NUMBER', 'UPC ID', 'Product Latest Release Date ID', 'Product Original Release Date ID', 'Track \(D\) Title', 'Music Line DESC', 'Music Line CODE', 'Sales Type DESC', 'Sales Type CODE', 'Product Status DESC', 'Product Status CODE', 'Jumpstart Indicator \(P\) ID', 'Flex Product Indicator \(P\) ID', 'Rep Owner \(FiRR converted to SAP\) CODE', 'Rep Owner \(FiRR converted to SAP\) DESC', 'Configuration DESC', 'Configuration CODE', 'Price Code ID', 'Price Point CODE', 'Price Point DESC', 'Price Level CODE', 'Price Level DESC', 'Standard Cost \(P\) ID', 'Wholesale Price \(P\) ID', 'Suggested Retail Price Code \(P\) ID', 'Jumpstart Wholesale Price \(P\) ID', 'MTD Physical Net Revenue', 'MTD Physical Net Units', 'MTD Physical Invoice Sales', 'MTD Physical Sale Units', 'MTD Physical Returns Dollars', 'MTD Physical Returned Units', 'MTD Defective Gap Credit', 'MTD Physical Gross Before Discount', 'MTD Physical Financial Gross Sales Net of Discounts', 'MTD Discount Dollars'
	        ],
        ],
    },    
    # Universal Digital  (FB16838)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 51,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'digital',
        lines => [
            [
'Processing Period', 'Contract Number', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Configuration description', 'Carrier Type', 'Set Cnt', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code', 'PPD', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(\w{3}\)'
	        ],
        ],
    },    
    # Universal Physical  (FB16839)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 52,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'physical',
        lines => [
            [
'Processing Period', 'Contract Number', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Configuration description', 'Carrier Type', 'Set Cnt', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code', 'PPD', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(\w{3}\)'
	        ],
        ],
    },    
    # Universal Digital  (FB17720)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 53,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'digital',
        lines => [
            [
'Processing Period', 'Contract Number', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Carrier Type', 'Set Cnt', 'ISRC Artist', 'ISRC Title', 'ISRC', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code Country', 'Price 1', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(\w{3}\)'
	        ],
        ],
    },    
    # Universal Digital  (FB17723)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 54,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'physical',
        lines => [
            [
'Processing Period', 'Contract Number', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Carrier Type', 'Set Cnt', 'ISRC Artist', 'ISRC Title', 'ISRC', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code Country', 'Price 1', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \(\w{3}\)'
	        ],
        ],
    },    
    # Universal Physical  (FB17829)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 55,
        sheet => 'any',
        match_on_any_row => 1,
        #file_name => 'physical',
        lines => [
            [
'Processing Period', 'Contract Description', 'Partner 1', 'Subledger Code', 'Subcontract Name', 'Sub con', 'Title', 'Configuration description', 'Carrier Type', 'Set Cnt', 'ISRC Artist', 'ISRC Title', 'ISRC', 'Period From / To', 'Orignal SalesTerritory Name', 'Article Number', 'Sub Licensee Code', 'Sub Licensee Name', 'Project Ref No', 'Sale Description', 'Sale Channel Code', 'Net Sales', 'Currency Code Country', 'PPD', 'Prc Ba- sis', 'Accounting Price', 'Roy Rate', 'Share %', 'Royalty Amount', 'Source Tax', 'Rate Of Exchange', 'Net Royalty Amount \((\w{3})\)'
	        ],
        ],
    },    
    # Universal NZ Physical  (FB18232)
    { service => Client::Service::DSP_UNIVERSAL,
        version => 56,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'CATALOGUE', 'ARTIST', 'TITLE', 'PPD', 'DIST %', 'UNITS', 'GROSS SALES', 'NET SALES', 'DISTRIBUTION', 'COPYRIGHT', 'TOTAL EXPENSES', 'TOTAL PAYABLE', '^$'
	        ],
        ],
    },      
    # Universal Digital  (FB18881) 
    { service => Client::Service::DSP_UNIVERSAL,
        version => 57,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Super Label Code', 'Super Label', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPS', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)', 'Units UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)'
	        ],
        ],
    },      
    # Universal Digital  (FB18859)  similar to v57, but with Configuration column
    { service => Client::Service::DSP_UNIVERSAL,
        version => 58,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Super Label Code', 'Super Label', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title', 'UPS', 'Track Artist', 'Track Title', 'Physical Album Latest Release Date', 'Configuration', 'ISRC', 'Revenue UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)', 'Units UMG P\d{1,2} \d{2} \(\w{3} \d{2}\)'
	        ],
        ],
    },      
    # Cargo Digital  (FB18954)
    { service => Client::Service::DSP_CARGO_DIGITAL,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'EAN/UPC', 'Artist', 'Title', 'Label', 'ISRC', 'SaleType', 'Salescountry', 'Shop', 'Quantity', 'NetRevenue'
	        ],
        ],
    },      
    # Cargo Digital  (FB18955)
    { service => Client::Service::DSP_CARGO_DIGITAL,
        version => 2,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'SaleStartDate', 'SaleEndDate', 'ShopSystem', 'SaleType', 'Salescountry', 'TrackTitle', 'TrackArtistName', 'TrackLabelName', 'ISRC', 'AlbumTitle', 'AlbumArtistName', 'AlbumLabelName', 'EAN/UPC', 'Quantity', 'NetRevenue', 'ChannelDisplayName', 'VideoID'
	        ],
        ],
    },
    # Thirty Tigers Digital (FB17809)
    { service => Client::Service::DSP_THIRTY_TIGERS,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        file_name => 'digital',
        lines => [
            [
'LABEL', 'ARTIST', 'TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PARENT PROD NO', 'UPC', 'TOTAL AM', 'DOWNLOAD QT', 'DOWNLOAD AM', 'STREAM PREMIUM QT', 'STREAM PREMIUM AM', 'STREAM AD SUPPORTED QT', 'STREAM AD SUPPORTED AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'
	        ],
        ],
    },    
    # Apple Music  (FB11130)
    { service => Client::Service::DSP_APPLE_MUSIC,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Storefront Name', 'Apple Identifier', 'Membership Type', 'Quantity', 'Net Royalty', 'Net Royalty Total', 'ISRC', 'Item Title', 'Item Artist', 'Item Type', 'Media Type', 'Vendor Identifier'
	        ],
        ],
    },    
    # DashGo (FB9983)
    { service => Client::Service::DSP_DASHGO,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Store', 'Region', 'Artist Name', 'Label Name', 'Album Name', 'UPC', 'Track Title', 'VideoId', 'ISRC', 'Label Track ID', 'Composers', 'Units', 'Currency', 'Product Type', 'Revenue'
	        ],
        ],
    },    
    # DashGo, v2 (FB10840)
    { service => Client::Service::DSP_DASHGO,
        version => 2,
        sheet => 'any',
        lines => [
            [
                'Store', 'Region', 'Artist Name', 'Label Name', 'Album Name', 'Track Artist', 'UPC', 'Track Title', 'VideoId', 'ISRC', 'Label Track ID', 'Composers', 'Units', 'Currency', 'Product Type', 'Revenue', '^$'
	        ],
        ],
    },    
    # thumbplay - FB14922
    { service => Client::Service::DSP_THUMBPLAY,
      #sheet => 'any',
      version => 1,
      match_on_any_row => 1,
      lines => [
        [ 'Row number', 'Sales Channel', 'External Meta Data', 'UPC', 'Clip ID', 'Product', 'Artist', 'Title', 'Period Start Date', 'Period End Date', 'Units', 'Retail Unit Price'],
      ]
    },

    # fusion
    { service => Client::Service::DSP_FUSION,
      version => 1,
      match_on_any_row => 1,
      lines => [
        ['number', 'description', 'Fmt', 'receipts', 'returns', 'inv', undef, 'goods', 'promo', 'inv', 'Sales', undef, undef, 'Sales', 'SP', 'disc', 'disc', 'disc' ],
      ],
    },
    # fontana 2005 style
    { service => Client::Service::DSP_FONTANA,
      version => 1,
      lines => [
        [undef],
        ['RUNDATE', 'ProdNo', 'ProdTitle', 'ProdArtist', 'OPUNIT', 'RPTCOMP', 'SUPERLBL', 'CONFIG', 'MUSLINE', 'TITLEID', 'RlseDate', 'STyp', 'Sls U', 'Sls \$', 'Rtn U', 'Rtn \$'],
      ],
    },
    # fontana 2006 style
    { service => Client::Service::DSP_FONTANA,
      version => 2,
      lines => [
        ['OpCompany', 'SuperLabel', 'ProductNo', 'Title', 'Artist', 'Config', 'MusicLine', 'MusicType', 'ReleaseDate', 'MthSlsDollars', 'MthRtnDollars', 'MthNetDollars', 'MthSlsUnits', 'MthRtnUnits', 'MthNetUnits', 'SalesTypeFin', 'FileDate'],
      ],
    },
    # fontana 2006 style
    { service => Client::Service::DSP_FONTANA,
      version => 3,
      sheet => 1,
      lines => [
        ['OpCompany', 'SuperLabel', 'ProductNo', 'Title', 'Artist', 'Config', 'MusicLine', 'MusicType', 'ReleaseDate', 'MthSlsDollars', 'MthRtnDollars', 'MthNetDollars', 'MthSlsUnits', 'MthRtnUnits', 'MthNetUnits', 'DEFGAPCREDITDOLLARS', 'SalesTypeFin', 'FileDate'],
      ],
    },
    # fontana 2007 style
    { service => Client::Service::DSP_FONTANA,
        version => 4,
        sheet => 0,
        lines => [
         ['OpCompany','SuperLabel', 'ProductNo', 'Title', 'Artist', 'Config', 'MusicLine', 'MusicType', 'ReleaseDate', 'MthSlsDollars', 'MthRtnDollars', 'MthNetDollars', 'MthSlsUnits', 'MthRtnUnits', 'MthNetUnits', 'DEFGAPCREDITDOLLARS', 'SalesTypeFin', 'FileDate'],
        ],
    },
    # fontana 2011 style
    { service => Client::Service::DSP_FONTANA,
        version => 5,
        sheet => 0,
        lines => [
         ['Operating Unit Desc', 'Period', 'Operating Unit', 'Super Label', 'Super Label Desc', 'Product No', 'Title', 'Artist', undef, 'Config', 'Music Line', 'Music Type', 'Release Date', 'Sales Type', 'Mth Sls Dollars', 'Mth Rtn Dollars', 'Mth Net Dollars', 'Mth Sls Units', 'Mth Rtn Units', 'Mth Net Units', 'Defective Gap Credit'],
        ],
    },
    # fontana- eleven seven style
    { service => Client::Service::DSP_FONTANA,
        version => 6,
        sheet => 0,
        lines => [
        ([undef]) x 5,
         ['Operating Unit', 'Super Label', 'Master Artist', 'Master Album', 'Product Code', 'UPC', 'Product Latest Release Date', 'Product Original Release Date', 'Current Status', 'Music Line', 'Configuration', 'Current Retail Price Code', 'Current Genre', 'Current Price Point'],
        ],
    },
    # fontana 2012 style
    { service => Client::Service::DSP_FONTANA,
        version => 7,
        sheet => 0,
        lines => [
         ['Operating Unit', undef, 'Period', 'Super Label', undef, 'Product', undef, undef, 'Album Artist', undef, 'Config', 'Music Line', 'Music Type', 'Sales Type', 'Mth Sls Dollars', 'Mth Rtn Dollars', 'Mth Net Dollars', 'Mth Sls Units', 'Mth Rtn Units', 'Mth Net Units', 'Defective Gap Credit'],
        ],
    },    
    # Fontana Physical (FB14951)
    { service => Client::Service::DSP_FONTANA,
        version => 8,
        sheet => 0,
        lines => [
         [
'Period', 'Reporting Source', 'Retailer', 'Super Label', 'Label', 'Artist', 'Album Title', 'UPC\/EAN', 'Product \/ Catalog #', 'Genre', 'Release Date', 'Retailer Stmt Country ISO', 'Territory', 'Sales Type Code', 'Sales Description', 'Sales Classification', 'Quantity Gross', 'Quantity Returns', 'Quantity Net', 'Gross US\$', 'Discount US\$', 'Gross After Discount US\$', 'Return US\$', 'Net US\$'
	 ],
        ],
    },    
    #fontana 2008
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 4,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Music Line', 'Sales Channel', 'Partner', 'Sales Type', 'Sold As', 'Album Artist', 'Album Title',
            'Track Artist', 'Track Title', 'ISRC', 'Physical Album Release Date',
            'Units.*', 'Revenue.*', ],
        ],
    },
    #fontana 2009
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 5,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
        [undef],
        [undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, 'Metrics', 'Track Sales Units',
        'Track Sales Revenue', 'Track Sales Units ITD', 'Track Sales Revenue ITD'],
        ['GL Reporting Company', 'GL Music Line', undef, 'GL Sales Channel', undef,
        'GL Digital Partner', undef, 'GL Sales Type', 'GL Sold As', 'GL ISRC',
        'GL Track Artist', 'GL Track Title', 'GL Album Title',
        'Release Date \(Latest\)', undef, undef, undef, undef, undef]

        ],
    },
    #fontana 2009 Album
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 6,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
        [undef],
        [undef],
        ['Label', 'Music Line', undef, 'Sales Channel', undef, 'Partner', undef, 'Sales Type',
        'Sold As', 'UPC', 'Album Artist', 'Album Title', 'Physical Album Release Date',
        'Metrics', 'Mth Sales Units', 'Mth Sales Revenue', 'ITD Sales Units', 'ITD Sales Revenue']

        ],
    },
    #fontana 2009 Album
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 7,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
        [undef],
        ['GL Reporting Company', 'GL Music Line', undef, 'GL Digital Partner', undef,
        'GL Sales Type', 'GL Sold As', 'GL ISRC', 'GL Track Artist', 'GL Track Title',
        'GL Album Title', 'Release Date \(Latest\)', 'Track Sales Units',
        'Track Sales Revenue', 'Track Sales Units ITD', 'Track Sales Revenue ITD',]

        ],
    },
    #fontana 2009 Album
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
        ['GL Operating Unit', 'Period', 'GL Reporting Company', 'GL Music Line',
		 undef, 'GL Sales Channel', undef, 'GL Digital Partner', undef, 'GL Sales Type',
		 'GL Sold As', 'GL ISRC', 'GL Track Artist', 'GL Track Title', 'GL Album Title',
		 'Release Date \(Latest\)', 'Track Sales Units', 'Track Sales Revenue',
		 'Track Sales Units ITD', 'Track Sales Revenue ITD']
        ],
    },
    #fontana
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 9,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Operating Unit', 'Period', 'Label', 'Music Line', undef, 'Sales Channel',
			 undef, 'Partner', undef, 'Sales Type', 'Sold As', 'UPC', 'Album Artist',
			 'Album Title', 'Physical Album Release Date', 'Mth Sales Units',
			 'Mth Sales Revenue', 'ITD Sales Units', 'ITD Sales Revenue']
        ],
    },
    #fontana
    { service => Client::Service::DSP_FONTANADIGITAL,
        sheet => 'any',
        version => 10,
        lines => [
            ['Reporting Unit DESC','Period Long Desc','Super Label DESC','Music Line DESC','Music Line CODE','Sales Channel DESC','Sales Channel CODE','National Account Detail DESC','National Account Detail ID','Sales Type DESC','Sold As DESC','Sold As CODE','Reporting Project DESC','Reporting Project ID','UPC ID','Album TITLE','Album ARTIST','Track TITLE','Track ARTIST','ISRC ID','Product Latest Release Date ID','Product Original Release Date ID','Metrics','Units','Amount']
        ],
    },
    # Ogangi
    { service => Client::Service::DSP_OGANGI,
      version => 1,
      sheet => 0,
      lines => [
        ([undef]) x 3,
        ['ID', 'Title', 'Territory', 'Carrier', 'Seller', 'Type', 'Retail Price', 'Currency', 'Downloads', 'Revenue', '\w{3} Revenue', 'Rev Share %', 'Min RR GSTExcl', '\w{3} Royalty', '^$'],
      ],
    },    
    # Ogangi - FB15694
    { service => Client::Service::DSP_OGANGI,
      version => 2,
      sheet => 0,
      match_on_any_row => 1,
      lines => [
        [
'ID', 'Title', 'Artist', 'Content Provider Product ID', 'Isrc value', 'GRID', 'Territory', 'Carrier', 'Seller', 'Type', 'Sub-type', 'Copyright', 'Source', 'Retail Price', 'Currency', 'Downloads', 'Revenue', '\w{3} Revenue', '\w{3} Rev GSTExcl', 'Copyright %', '\w{3} Copyright Total', 'Rev Share %', 'Min RR GSTExcl', '\w{3} Royalty'
	],
      ],
    },
    # Ogangi - FB19522
    { service => Client::Service::DSP_OGANGI,
      version => 3,
      sheet => 0,
      match_on_any_row => 1,
      lines => [
        [
'ID', 'Title', 'Territory', 'Carrier', 'Seller', 'Type', 'Retail Price', 'Currency', 'Downloads', 'Revenue', 'USD Revenue', 'Rev Share %', 'Min RR GSTExcl', 'USD Royalty', 'IRSC', 'UPC', 'Artist'
	],
      ],
    },
    # Download Centric
    { service => Client::Service::DSP_DOWNLOADCENTRIC,
      version => 1,
      sheet => 1,
      lines => [
        ['ORDER NUMBER','ORDER DATE','SHIP DATE','NAME','UPC','UNIT PRICE','QUANTITY','EXTENDED PRICE','SHIPPING','SALES TAX','TOTAL','TOTAL PAYABLE','REFUNDED ORDER NUMBER'],
      ],
    },
    # Download Centric
    { service => Client::Service::DSP_DOWNLOADCENTRIC,
      version => 2,
      sheet => 2,
      lines => [
        ['ORDER NUMBER','ORDER DATE','SHIP DATE','NAME','UPC','UNIT PRICE','QUANTITY','EXTENDED PRICE','SHIPPING','SALES TAX','TOTAL','TOTAL PAYABLE','REFUNDED ORDER NUMBER'],
      ],
    },
    # Download Centric
    { service => Client::Service::DSP_DOWNLOADCENTRIC,
        version => 2,
        sheet => 0,
        lines => [
         ['ORDER NUMBER','ORDER DATE','SHIP DATE','NAME','UPC','UNIT PRICE','QUANTITY','EXTENDED PRICE','SHIPPING','SALES TAX','TOTAL','TOTAL PAYABLE','REFUNDED ORDER NUMBER'],
        ],
    },
    # buymusic
    { service => Client::Service::DSP_BUYMUSIC,
      version => 1,
      lines => [
        ['AlbumOrTrack', 'UPC', 'ISRC', 'Units', 'DealerUnitPrice', 'PaymentAmount'],
        ['A|T', '\d+'],
      ],
    },
    # xringer
    { service => Client::Service::DSP_XRINGER,
      version => 1,
      lines => [
        ['Country', 'DBID', 'Label', 'ISRC', 'Title', 'Artist', 'Retail', 'Count', 'Amount', 'Retail', 'Count', 'Amount', 'Retail', 'Count', 'Amount', 'Total Count', 'Total Amount'],
      ],
    },
    # xringer w/wholesale cols
    { service => Client::Service::DSP_XRINGER,
      version => 2,
      lines => [
        ['Country', 'DBID', 'Label', 'Title', 'Artist', 'Retail', 'Wholesale', 'Count', 'Amount', 'Retail', 'Wholesale', 'Count', 'Amount', 'Retail', 'Wholesale', 'Count', 'Amount', 'Total Count', 'Total Amount'],
      ],
    },
    # koch ent canada
    { service => Client::Service::DSP_KOCHENTCANADA,
      version => 1,
      lines => [
        ['KOCH Entertainment'],
        [undef],
        [undef],
        ['Pricecode', undef, 'Gross', 'Net', 'Cost', 'Extended Price'],
      ],
    },
    # koch ent canada
    #{ service => Client::Service::DSP_KOCHENTCANADA,
    #  version => 2,
    #  lines => [
    #    ['KOCH Entertainment'],
    #    [undef],
    #    [undef],
    #    ['Product', undef, undef, 'Gross', 'Returns', 'Net', 'F\/G', 'D\/S', 'Promo'],
    #  ],
    #},
    # koch physical sales
    { service => Client::Service::DSP_KOCH_PHYSICAL,
      version => 1,
      lines => [
        ['Territory', 'Product\#', 'Configuration', 'Roy\.Type', 'quarterend', 'units'],
      ],
    },
    # koch physical sales
    { service => Client::Service::DSP_KOCH_PHYSICAL,
      version => 2,
      lines => [
        ['KOCH Entertainment Distribution'],
        ([undef]) x 11,
        ['NUMBER',undef,undef,'DESCRIPTION','SHIPPED','RETURNED','UNITS','SHIPPED','RETURNED','DOLLARS','DOLLARS'],
      ],
    },
    # Koch physical sales -> ARC Music
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 3,
        match_on_any_row => 1,
        lines => [
            ['ITEM','UNITS','UNITS','NET','DOLLARS','DOLLARS','DISCOUNT','NET'],
            ['NUMBER','SHIPPED','RETURNED','UNITS','SHIPPED','RETURNED','DOLLARS','DOLLARS'],
        ],
    },
    # Koch physical sales -> ARC Music
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 4,
        match_on_any_row => 1,
        lines => [
            [undef, 'ITEM NUMBER', 'ITEM DESCRIPTION', undef, 'UNITS SHIPPED', undef,
            'UNITS RETURNED', undef, 'NET UNITS', undef, undef, 'DOLLARS SHIPPED',
            'DOLLARS RETURNED', undef, 'DISCOUNT DOLLARS', 'NET DOLLARS', undef, undef,],
        ],
    },
    # Koch physical sales -> Indie Blu - Now with UPC!
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 5,
        match_on_any_row => 1,
        lines => [
            ['ITEM NUMBER', 'UPC',undef, undef, undef,undef,'ITEM DESCRIPTION', undef, undef, undef, 'UNITS SHIPPED', undef,
            'UNITS RETURNED', undef, undef, 'NET UNITS',  undef, 'DOLLARS SHIPPED', undef,
            'DOLLARS RETURNED', undef, 'DISCOUNT DOLLARS', undef, undef, 'NET DOLLARS', ],
        ],
    },
    # Koch physical sales -> Indie Blu
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 6,
        match_on_any_row => 1,
        lines => [
            [undef, 'ITEM NUMBER', 'UPC',undef, undef, undef,undef,'ITEM DESCRIPTION', undef, undef, undef, undef, 'UNITS SHIPPED', undef,
            'UNITS RETURNED', undef, undef, 'NET UNITS',  undef, 'DOLLARS SHIPPED', undef,
            'DOLLARS RETURNED', undef, 'DISCOUNT DOLLARS', undef, undef, 'NET DOLLARS', ],
        ],
    },
    # Koch physical sales -> PRA Records (FB13373)
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 7,
        match_on_any_row => 1,
        lines => [
            [undef, 'ITEM NUMBER', 'UPC', undef, undef, 'ITEM DESCRIPTION', undef, undef, undef,
			 'UNITS SHIPPED', undef, 'UNITS RETURNED', undef, 'NET UNITS', undef, 'DOLLARS SHIPPED',
			 'DOLLARS RETURNED', undef, 'SALES DISCOUNT', 'RETURNS DISCOUNT', undef, undef, 'NET DOLLARS'],
        ],
    },
    # Koch physical sales -> Indie Blu (FB13373)
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 7,
        match_on_any_row => 1,
        lines => [
            [undef, 'ITEM NUMBER', 'UPC', undef, undef, 'ITEM DESCRIPTION', undef, undef, undef,
			 'UNITS SHIPPED', undef, 'UNITS RETURNED', undef, 'NET UNITS', undef, 'DOLLARS SHIPPED',
			 'DOLLARS RETURNED', undef, undef, 'DISCOUNT DOLLARS', undef, undef, 'NET DOLLARS'],
        ],
    },
    # Koch physical sales -> Indie Blu (FB14506)
    { service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 8,
        lines => [
            [undef],
            [
			 'ITEM NUMBER',	'UPC', 'ITEM DESCRIPTION', 'UNITS SHIPPED', 'UNITS RETURNED',
			 'NET UNITS', 'DOLLARS SHIPPED', 'DOLLARS RETURNED', undef,
             'DISCOUNT DOLLARS', 'PHYSICAL DOLLARS'
			],

        ],
    },
    # Koch physical
    {
        service => Client::Service::DSP_KOCH_PHYSICAL,
        version => 8,
        match_on_any_row => 1,
        lines => [
            [ undef ],
			[
			    'ITEM NUMBER', 'UPC', 'ITEM DESCRIPTION', 'UNITS SHIPPED', 'UNITS RETURNED',
			    'NET UNITS', 'DOLLARS SHIPPED', 'DOLLARS RETURNED', 'SALES DISCOUNT',
			    'RETURNS DISCOUNT', 'PHYSICAL DOLLARS'
			]
        ]
    },

    # harmonia mundi
    { service => Client::Service::DSP_HARMONIAMUNDI,
      version => 1,
      lines => [
        ['Recording Number', '(Release|Sale) Date', 'Notes?', 'Title', 'USA Sales', 'Export Sales', 'World Sales', 'Price', 'GL', 'Form'],
      ],
    },
	# buymusic - VERY similar to itunes
	{ service => Client::Service::DSP_BUYMUSIC,
	  version => 2,
	  lines => [
		['StartDate', 'EndDate', 'UPC', 'ISRC', 'Quantity', 'RoyaltyPrice', 'ExtendedPrice', 'Currency', 'SaleOrReturn', 'Artist', 'Title', 'LabelName', 'SongOrPlaylist', 'CountryOfSale']
	  ]
	},
    # clear channel
    { service => Client::Service::DSP_CLEARCHANNEL,
      version => 1,
      lines => [
          ['Income_Source_Product_ID', 'Product_Title_TX', 'Selection_Title_TX', 'Artist_NM', 'UPC_Code', 'ISRC_NUM_TX', 'Per_Unit_Rate_AM', 'Period_Units_QT', 'Payment_AM', 'Income_Type_TX', 'Owner_NM', 'Income_Source_TX', 'Provder_Name'],
      ]
    },
	# starbucks
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 1,
	  sheet => 1, # (second sheet)
	  lines => [
		['VendorName', 'ArtistName', 'AlbumTitle', 'TrackTitle', 'AlbumUPC', 'AlbumTrackType', 'UnitsSold', 'WholeSalePrice', 'PayAmount', 'GenreName', 'TxnDate', 'ISRC']
	  ]
	},
	# starbucks v.1.1 - same as first with different header label spacing
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 1,
	  sheet => 'any', # (usually second sheet)
	  lines => [
		['VendorName', 'ArtistName', 'AlbumTitle', 'Track     Title', 'Album   UPC', 'AlbumTrackType', 'UnitsSold', 'WholeSalePrice', 'PayAmount', 'GenreName', 'TxnDate', 'ISRC']
	  ]
	},
	# starbucks v.2
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 2,
	  sheet => 1,
	  lines => [
		['VendorName', 'ArtistName', 'AlbumTitle', 'TrackTitle', 'AlbumUPC', 'AlbumTrackType', 'UnitsSold', 'WholeSalePrice', 'PayAmount', 'GenreName'],
	  ]
	},
	# starbucks v.3
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 3,
	  sheet => 1,
	  lines => [
		['Date', 'Vendor', 'Artist', 'Album Name', 'Track Name', 'UPC', 'Track Num', 'CD Num', 'ISRC', 'Album or Track', 'Quantity', 'Cost', 'Extended Cost'],
	  ]
	},
	# starbucks v.4
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 4,
	  lines => [
		['Vendor Name', 'Artist Name', 'Album Title', 'Track Title', 'Album UPC', 'Album Track Type', 'Units Sold', 'Whole Sale Price', 'Pay Amount', 'Genre Name', 'Txn Date', 'ISRC'],
	  ]
	},
	# starbucks v.5
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 5,
	  lines => [
		['VendorName', 'ArtistName', 'AlbumTitle', 'TrackTitle', 'AlbumUPC', 'AlbumTrackType', 'UnitsSold', 'WholeSalePrice', 'PayAmount', 'GenreName', 'TxnDate', 'ISRC'],
	  ]
	},
	# starbucks v.6 (similar to 1.1 minus isrc)
	{ service => Client::Service::DSP_STARBUCKS,
	  version => 6,
      sheet => 'any',
	  lines => [
		['VendorName', 'ArtistName', 'AlbumTitle', 'Track     Title', 'Album   UPC', 'AlbumTrackType', 'UnitsSold', 'WholeSalePrice', 'PayAmount', 'GenreName', 'TxnDate'],
	  ]
	},
	# simplyaudiobooks
	{ service => Client::Service::DSP_SIMPLYAUDIOBOOKS,
	  version => 1,
	  sheet => 1,
	  lines => [
        [ undef ],
		['ISBN', 'Title', 'Total Downloads', 'List Price', 'Total'],
	  ]
	},
	#musicnet, version 9
	{ service => Client::Service::DSP_MEDIANET,
	  version => 9,
	  lines => [
        [ undef ],
		[ 'Licensee', 'Portal', 'Country of Transaction', 'ISRC', 'UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Label Owner', 'Number of Plays', 'Net Royalty per Play', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type' ]
	  ]
	},		
	#musicnet (sometime in 2012 and on) - just small changes to column names 
	{ service => Client::Service::DSP_MEDIANET,
	  version => 7,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album UPC', 'Album Title', 'Artist', 'Track ISRC', 'Period Units QT', 'Income Type', 'Label Name', 'Track Number', 'Income Source', 'Provider Comp Id', 'Retailer Name', 'Offer Category', 'Portable Offer Indicator', 'Territory Code', 'Currency Code', 'Wholesale Price', 'Total Wholesale Amount', 'Sale Price', 'Total Sale Amount']
	  ]
	},		
	#musicnet (sometime in 2012 and on) - defaults currency code to USD
	{ service => Client::Service::DSP_MEDIANET,
	  version => 8,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album UPC', 'Album Title', 'Artist', 'Track ISRC', 'Period Units QT', 'Income Type', 'Label Name', 'Track Number', 'Income Source', 'Provider Comp Id', 'Retailer Name', 'Offer Category', 'Portable Offer Indicator', 'Territory Code']
	  ]
	},	
	#musicnet (sometime in 2011 and on)
	{ service => Client::Service::DSP_MEDIANET,
	  version => 7,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album Upc', 'Album Title', 'Album Artist', 'Track Isrc', 'Period Units QT', 'Income Type', 'Label Name', 'Track Number', 'Income Source', 'Provider Comp Id', 'Retailer Name', 'Offer Category', 'Portable Offer Indicator', 'Territory Code', 'Currency Code', 'Wholesale Price', 'Total Wholesale']
	  ]
	},
	#musicnet (sometime in 2006 and on)
	{ service => Client::Service::DSP_MEDIANET,
	  version => 5,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album Upc', 'Album Title', 'Album Artist', 'Track Isrc', 'Period Units QT', 'Income Type', 'Label Name', 'Track Number', 'Income Source', 'Provider Comp Id', 'Retailer Name', 'Offer Category', 'Portable Offer Indicator', 'Territory Code']
	  ]
	},
	#musicnet (late 2005 and on)
	{ service => Client::Service::DSP_MEDIANET,
	  version => 1,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album Upc', 'Album Title', 'Album Artist', 'Track Isrc', 'Period Units QT', 'Income Type', 'Label Name', 'Track Number', 'Income Source', 'Provider Comp Id', 'Retailer Name', 'Offer Category']
	  ]
	},
	#musicnet (early 2005) variant on version 2
	{ service => Client::Service::DSP_MEDIANET,
	  version => 6,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album Upc', 'Album Title', 'Album Artist', 'Album Upc', 'Track Isrc', 'Period Units QT', 'Income Type', 'Label Name', 'Track Duration mins', 'Track Duration secs', 'Track Number', 'Income Source', 'Territory Code', 'Currency Code']
	  ]
	},
	#musicnet (early 2005)
	{ service => Client::Service::DSP_MEDIANET,
	  version => 2,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album Upc', 'Album Title', 'Album Artist', 'Album Upc', 'Track Isrc', 'Period Units QT', 'Income Type', 'Label Name', 'Track Duration mins', 'Track Duration secs', 'Track Number', 'Income Source']
	  ]
	},
	#musicnet (2004)
	{ service => Client::Service::DSP_MEDIANET,
	  version => 3,
	  lines => [
		['Mnet Comp Id', 'Track Title', 'Album Upc', 'Album Title', 'Album Artist', 'Album Upc', 'Track Isrc', 'Period Units QT', 'Income Type', 'Label Name', 'Track Duration', 'Track Duration', 'Income Source', 'Track Number']
	  ]
	},
	#musicnet (2003)
	{ service => Client::Service::DSP_MEDIANET,
	  version => 4,
	  lines => [
		['INCOME_SOURCE_PRODUCT_ID', 'PRODUCT_TITLE_TX', 'INCOME_SOURCE_SELECTION_ID', 'SELECTION_TITLE_TX', 'ARTIST_NM', 'UPC_NUM_TX', 'ISRC_NUM_TX', 'PERIOD_UNITS_QT', 'INCOME_TYPE_TX', 'OWNER_NM', 'PLAY_TIME_MIN', 'PLAY_TIME_SEC', 'INCOME_SOURCE_TX', 'TRACK_NUM']
	  ]
	},
	#touchtunes
	{ service => Client::Service::DSP_TOUCHTUNES,
	  version => 1,
	  lines => [
		['Record COMPANY', 'LABEL ID', 'LABEL NAME', 'SONG ID', 'SONG TITLE', 'ARTIST NAME', 'TOTAL PLAYS', '# OF FREE PLAYS', 'ACTUAL % DEDUCTED', 'NET PLAYS', 'RATE', 'ROYALTY', 'STATEMENT_PERIOD', 'SYSTEM']
	  ]
	},
	#touchtunes old
	{ service => Client::Service::DSP_TOUCHTUNES,
	  version => 2,
	  lines => [
		['RECORD COMPANY', 'LABEL ID', 'LABEL NAME', 'SONG ID', 'TITLE', 'ARTIST NAME', 'RATE', 'ROYALTY', 'PLAYS', 'PERIOD', 'SYSTEM']
	  ]
	},
    #touchtunes version 3 is WMG specific
	#loudeye
	{ service => Client::Service::DSP_LOUDEYE,
	  version => 1,
	  lines => [
		['Affiliate', 'UPC', 'ISRC', 'Volume Number', 'Track Number', 'Artist Name', 'Album Title', 'Track Title', 'Album or Track', 'Downloads', 'Wholesale Price', 'Total Due']
	  ]
	},
	#touchtunes v4
	{ service => Client::Service::DSP_TOUCHTUNES,
	  version => 4,
	  lines => [
		[
            'Record COMPANY', 'LABEL ID', 'LABEL NAME', 'SONG ID', 'SONG TITLE', 'ARTIST NAME', 'ISRC', 'UPC', 'TOTAL PLAYS', '# OF FREE PLAYS', 'ACTUAL % DEDUCTED', 'NET PLAYS', 'RATE', 'ROYALTY', 'STATEMENT_PERIOD', 'SYSTEM', '^$'
	    ]
	  ]
	},
	# royaltyshare format
	#{ service => Client::Service::DSP_RSFORMAT,
	#  version => 1,
	#  lines => [
	#	['Service Name', 'Region', 'Sales Period', 'Label', 'Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Sale Format', 'Delivery Type', 'Net Units', 'Net Dollars']
	 # ]
	#},
	# royaltyshare format -- phys cd only
	{ service => Client::Service::DSP_RSFORMATPHYSICAL,
	  version => 1,
	  lines => [
		['Region', 'Sale Date', 'Artist Name', 'Catalog', 'Album Name', 'UPC', 'Net Units', 'Net Dollars']
	  ]
	},
	# royaltyshare format, physical, inc. foreign revenue, with extra cols
        { service => Client::Service::DSP_RSFORMATLABEL,
          version => 2,
          lines => [
          ['label-name', 'service-id', 'service-name', 'distributor', 'territory', 'period-begin',
          'period-end', 'product-type', 'product-format', 'catalog-id', 'upc', 'album-id', 'album-name',
          'album-artist', 'release-date', 'upc-alt', 'album-custom-1', 'album-custom-2', 'album-custom-3',
          'isrc', 'track-id', 'disc-no', 'track-no', 'track-name', 'track-artist', 'track-custom-1',
          'track-custom-2', 'track-custom-3', 'units', 'unit-price', 'ext-price', 'currency-code',
          'currency-conv', '[^-]-unit-price', '[^-]-ext-price', 'free', 'dist-fee',
          '[^-]-net-price', 'media[-_]type']
      ]
    },
    # royaltyshare format -- digital format with free and royalty type columns
    { service => Client::Service::DSP_RSFORMATDIGITAL,
      version => 5,
      sheet => 0,
      lines => [
          [ 'Units', undef, 'Royalty', undef, 'Royalty Currency', undef ],
          [ 'service-name', 'label-name', 'country-code', 'sale-year', 'sale-month',
            'product-type', 'product-format', 'media-type', 'service-product-id', 'client-product-id',
            'artist-name', 'catalog-id', 'upc-ean', 'album-name', 'isrc', 'track-no', 'track-name', 'units',
            'retail-price', 'royalty-price', 'royalty-total', 'free', 'royalty-type' ],
     ]
    },    
    # royaltyshare format -- digital format with support for multiple services
    { service => Client::Service::DSP_RSFORMATDIGITAL,
      version => 4,
      sheet => 0,
      lines => [
          [ 'Units', undef, 'Royalty', undef, 'Royalty Currency', undef ],
          [ 'service-name', 'label-name', 'country(-| )code', 'sale-year', 'sale-month',
            'product-type', 'product-format', 'media-type', 'service-product-id', 'client-product-id',
            'artist-name', 'catalog-id', 'upc-ean', 'album-name', 'isrc', 'track-no', 'track-name', 'units',
            'retail-price', 'royalty-price', 'royalty-total' ],
     ]
    },
    # royaltyshare format -- our digital format
    { service => Client::Service::DSP_RSFORMATDIGITAL,
      version => 3,
      sheet => 0,
      lines => [
          [ 'Service Name', undef, 'Units', undef, 'Royalty', undef, 'Royalty Currency', undef ],
          [ 'label-name', 'country(-| )code', 'sale-year', 'sale-month', 'product-type', 'product-format',
		    'media-type', 'service-product-id', 'client-product-id', 'artist-name', 'catalog-id', 'upc-ean',
			'album-name', 'isrc', 'track-no', 'track-name', 'units', 'retail-price', 'royalty-price', 'royalty-total' ],
     ]
    },
    # royaltyshare format -- our digital format
    { service => Client::Service::DSP_RSFORMATDIGITAL,
      version => 2,
      lines => [
      ['label-name', 'service-id', 'service-name', 'territory',
      'period-begin', 'period-end', 'product-type', 'product-format-id',
      'product-format-name', 'service-product-id', 'client-product-id',
      'artist-name', 'catalog-id', 'upc', 'album-name', 'isrc', 'track-no',
      'track-name', 'units', 'currency-code', 'unit-price', 'ext-price',
      'free', 'dist-fee', 'net-price', 'media-type',
      ]
     ]
    },
    # royaltyshare format -- our output format
    { service => Client::Service::DSP_RSFORMATDIGITAL,
      version => 1,
      lines => [
      ['label-name', 'service-id', 'service-name', 'territory', 'period-begin', 'period-end', 'product-type',
      'product-format', 'catalog-id', 'upc', 'album-id', 'album-name', 'album-artist']
	  ]
	},
	# royaltyshare format, physical, inc. foreign revenue
	{ service => Client::Service::DSP_RSFORMATPHYSICAL,
	  version => 2,
	  lines => [
		['Service\/Distributor', 'Region', 'Sale Date', 'Artist Name', 'Catalog \#', 'Album Name', 'UPC', 'Gross Units', 'Gross Revenue', 'Return Units', 'Return Revenue', 'Net Units', 'Net Revenue', 'Currency Code', 'Net US Dollars', 'Comments', 'Media Type']
	  ]
	},
	# royaltyshare format, physical, inc. foreign revenue, with extra cols
	{ service => Client::Service::DSP_RSFORMATPHYSICAL,
	  version => 3,
      match_on_any_row => 1,
	  lines => [
		['Service\/Distributor', 'Region', 'Sale Date', 'Artist Name', 'Catalog \#', 'Album Name', 'Configuration', 'UPC', 'Channel', 'Price', 'Gross Units', 'Gross Revenue', 'Return Units', 'Return Revenue', 'Net Units', 'Net Revenue', 'Currency Code', 'Net US Dollars', 'Comments']
	  ]
	},
    # royaltyshare format, physical, inc. foreign revenue, with extra cols for MCPS
    { service => Client::Service::DSP_RSFORMATPHYSICAL,
      version => 4,
	  lines => [
		['Service\/Distributor', 'Region', 'Sale Date', 'Artist Name', 'Catalog \#', 'Album Name', 'Configuration', 'UPC', 'Sales Channel', 'Price Tier', 'Currency Code', 'Unit Wholesale Price', 'Unit Retail Price', 'Gross Units', 'Gross Revenue', 'Return Units', 'Return Revenue', 'Net Units', 'Net Revenue', 'Free Goods', 'Adjustment', 'Royalty Type', 'Comments']
	  ]
    },
    # royaltyshare format, physical, updated to be consistent with digital version
    { service => Client::Service::DSP_RSFORMATPHYSICAL,
      version => 5,
	  lines => [
	    [ 'Service Name', undef, 'Units', undef, 'Royalty', undef, 'Royalty Currency', undef ],
		['label-name', 'country-code', 'sale-year', 'sale-month', 'product-type', 'artist-name', 'catalog-id', 'upc-ean', 'album-name', 'sales-channel', 'price-tier', 'wholesale-price', 'retail-price', 'gross-units', 'gross-revenue', 'return-units', 'return-revenue', 'net-units', 'net-revenue', 'free-goods', 'adjustment', 'royalty-type', 'comments']
	  ]
    },
    # MVD version 1, based loosely on the royaltyshare format
    { service => Client::Service::DSP_MVD,
      version => 1,
	  lines => [
		[ 'VENDOR_NUM', 'service-id', 'service-name', 'distributor', 'territory', 'period-begin', 'period-end', 'product-type', 'product-format', 'catalog-id', 'upc', 'album-id', 'album-name', 'album-artist', 'release-date', 'upc-alt', 'album-customer-1', 'album-customer-2', 'album-customer-3', 'isrc', 'track-id', 'disc-no', 'track-no', 'track-name', 'track-artist', 'track-custom-1', 'track-custom-2', 'track-custom-3', 'units', 'unit-price', 'ext-price', 'currency-code', 'currency-conv', 'usd-unit-price', 'usd-ext-price', 'free', 'dist-fee', 'usd-net-price', 'media-type', 'mvd-po-num', 'royalty%' ]
	  ]
    },
    # MVD version 2 (FB18561)
    { service => Client::Service::DSP_MVD,
      version => 2,
	  lines => [
		[
'SKU', 'TITLE', 'CUSTOMER#', 'CUSTOMER', 'SALESREP', 'INVOICE#', 'SHIPPED', 'DISCOUNT', 'PRICE', 'EXT. PRICE', 'DISC AMOUNT', 'NET', 'DATE'
]
	  ]
    },
    # MVD version 3 (FB19054)
    { service => Client::Service::DSP_MVD,
      sheet => 'any',
      version => 3,
	  lines => [
		[
'sku#', 'barcode', 'title', 'opening inventory', 'received qty', 'closing inventory', 'quantity sold', 'sales', 'quantity returned', 'returns', 'promos shipped', 'net units', 'net sales', 'royalty', 'royalty sales', 'royalty returns', 'net royalty'
]
	  ]
    },
    # MVD version 4 (FB20292)
    { service => Client::Service::DSP_MVD,
      version => 4,
	  lines => [
		[
'SKU', 'TITLE', 'CAT', 'CUSTOMER#', 'CUSTOMER', 'SALESREP', 'INVOICE#', 'SHIPPED', 'DISCOUNT', 'PRICE', 'EXT. PRICE', 'DISC AMOUNT', 'NET', 'DATE'
]
	  ]
    },    
    # SRD version 1 (FB19047)
    { service => Client::Service::DSP_SRD,
      sheet => 'any',
      version => 1,
	  lines => [
		[
'Label', 'Catalog No', 'Release Artist', 'Release Title', 'Release Type', 'UPC', 'ISRC', 'Grid', 'Vendor Sales ID', 'Vendor', 'Country of Sale', 'Delivery Type', 'Delivery Format', 'Mechanicals Withheld \(Y/N\)', 'Mechanical Withheld Amount', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Returns', 'Net Sales', 'Net Income', 'Fees', 'Net Payable'
]
	  ]
    },
    # SRD version 2 (FB19164)
    { service => Client::Service::DSP_SRD,
      sheet => 'any',
      version => 2,
	  lines => [
		[
undef, 'Lab', 'Stock', 'Description', undef, undef, undef, 'PPD', 'Ref', 'CURR', 'FOC', 'Prm', 'Sales', 'Recd', 'ACCUM', 'Des', 'Sld', 'Prm', 'Foc', 'Def', 'Stk', 'OST', 'S', 'SOR', 'Revenue'
]
	  ]
    },
	# grayv
	{ service => Client::Service::DSP_GRAYV,
	  version => 1,
	  lines => [
		['Count', 'Start Date', 'End Date', 'Plays', 'Royalty', 'Extended Price', 'Artist', 'Title', 'Label', 'Country Of Sale']
	  ]
	},
	# play network
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 2,
	  lines => [
        [undef],
		['Song Usage Report'],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
	  ]
	},
	# play network (variation for Welk)
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 2,
	  lines => [
        [undef],
		['Sugar Hill Records c\/o The Welk Group Song Usage Report'],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
	  ]
	},
	# play network (variation for IndieBlu) FB13782
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 2,
	  lines => [
        [undef],
		['Compendia Music Group Song Usage Report'],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
	  ]
	},
	# play network (variation for IndieBlu) FB13782
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 2,
	  lines => [
        [undef],
		['Artemis Records Song Usage Report'],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
	  ]
	},
	# play network (variation for Dualtone) FB13782
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 2,
	  lines => [
        [undef],
		['Dualtone Music Group Song Usage Report'],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
	  ]
	},
	# play network (variation for Welk)
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 2,
	  lines => [
        [undef],
		['Welk Group Inc. Song Usage Report'],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
	  ]
	},
    # play network (FB13943)
    { service => Client::Service::DSP_PLAYNETWORK,
      version => 2,
      lines => [
        [undef],
        ['.* Song Usage Report'],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        [undef],
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', 'of Uses'],
      ]
    },
	# play network
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 5,
	  lines => [
        [undef],
		['Song Usage Report'],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
        ([undef])x8,
        ['Song Title', 'ISRC', 'Album Title', 'Song Artist', '# of Uses', 'Ex']
          ]
	},
	# play network
	{ service => Client::Service::DSP_PLAYNETWORK,
	  version => 1,
	  lines => [
        [undef],
		['Song Usage Report'],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Total Single Uses'],
        [undef],
        ['Total Multiple Uses'],
	  ]
	},
    # play network
    { service => Client::Service::DSP_PLAYNETWORK,
      version => 3,
      lines => [
        ['Razor & Tie Entertainment'],
        [undef],
        ['Song Usage Report'],
        [undef],
        [undef],
        ['During the Period'],
        ['Total Single'],
      ]
    },
    # play network
    { service => Client::Service::DSP_PLAYNETWORK,
      version => 4,
      sheet => 0,
      lines => [
            ([undef]) x 3,
            ['Song Title','ISRC','Album Title','Song Artist','Division','Uses','Rate','Amount'],
      ]
    },
    # play network
    { service => Client::Service::DSP_PLAYNETWORK,
      version => 4,
      sheet => 'any',
      lines => [
            ([undef]) x 9,
            ['Song Title','ISRC','Album Title','Song Artist','Division','Uses','Rate','Amount'],
      ]
    },
    # play network
    { service => Client::Service::DSP_PLAYNETWORK,
      version => 6,
      sheet => 'any',
      lines => [
            ['Playnetwork, Inc.'],
            ([undef]) x 6,
            ['Song Title','ISRC','Album Title','Song Artist','# of Uses','Quarterly Royalties'],
      ]
    },        
	#verizon
	{ service => Client::Service::DSP_VERIZON,
	  version => 1,
	  lines => [
		[undef, 'VZW'],
	    [undef, undef, '# of Tracks (Available|Sold)', '# (of Downloads|Sold)', '% of Catalog', '% of Sales']
	  ]
	},
	#verizon, with extra tab in front
	{ service => Client::Service::DSP_VERIZON,
	  version => 2,
      sheet => 1,
	  lines => [
		[undef, 'VZW'],
	    [undef, undef, '# of Tracks (Available|Sold)', '# (of Downloads|Sold)', '% of Catalog', '% of Sales']
	  ]
	},
	#verizon - wallpaper (version 3 - located near bottom due to 'match_on_any_row')
    #verizon - vod (video)
    { service => Client::Service::DSP_VERIZON,
      version => 4,
      sheet => 'any',
      lines => [
        [undef, 'Monthly Settlement Report'],
        [undef],[undef],[undef],[undef],[undef],[undef],
        [undef, 'Artist', 'Title', 'GRID', 'Retail', 'Downloads', 'Wholesale', 'Provider Revenue'],
      ]
    },
    #verizon - vod (video) - with extra pre-header info
    { service => Client::Service::DSP_VERIZON,
      version => 4,
      sheet => 'any',
      lines => [
        [undef, 'Monthly Settlement Report'],
        ([undef]) x 9,
        [undef, 'Artist', 'Title', 'GRID', 'Retail', 'Downloads', 'Wholesale', 'Provider Revenue'],
      ]
    },
    #verizon - vod (video) - same as above with retail/dl swapped
    { service => Client::Service::DSP_VERIZON,
      version => 5,
      sheet => 'any',
      lines => [
        [undef, 'Monthly Settlement Report'],
        ([undef]) x 9,
        [undef, 'Artist', 'Title', 'GRID', 'Downloads', 'Retail', 'Wholesale', 'Provider Revenue'],
      ]
    },
    #verizon 6,7,8 are WMG specific
	#aol
	{ service => Client::Service::DSP_AOL,
	  version => 1,
      sheet => 2,
	  lines => [
		[undef],
		[undef],
	    ['Music Video on Demand Royalty Detail'],
		['For the Month of']
	  ]
	},
	#aol
	{ service => Client::Service::DSP_AOL,
	  version => 2,
      sheet => 2,
	  lines => [
		[undef],
		[undef],
	    [undef, 'Music Video on Demand Royalty Detail'],
		[undef, 'For the Month of']
	  ]
	},
	# panic button
    { service => Client::Service::DSP_PANICBUTTON,
      version => 1,
      lines => [
      ([undef]) x 6,
      ['Satement Month', 'Sale Month', 'Label Name', 'Sale Type', 'Track or Album', 'Cat Num', 'Album Artist', 'Album Title', 'Track Artist', 'Track Title', 'Track #', 'UPC', 'ISRC', 'Reseller', 'Territory', 'Free/Promo', 'Qty', 'Gross', 'Net'],
      ]
    },
	# panic button 2/09
    { service => Client::Service::DSP_PANICBUTTON,
      version => 2,
      lines => [
      ([undef]) x 6,
      ['Satement Month', 'Sale Month', 'Label Name', 'Sale Type', 'Track or Album', 'Cat Num', 'Album Artist', 'Album Title', 'Track Artist', 'Track Title', 'UPC', 'ISRC', 'Reseller', 'Territory', 'Free/Promo', 'Qty', 'Gross', 'Net'],
      ]
    },
	#sprint
	{ service => Client::Service::DSP_SPRINT,
	  version => 1,
	  lines => [
		['Partner Code', 'Partner Name', 'Original Billing Period Start Date', 'Billing Period Start Date', 'Content Description-New', 'Content', 'Revenue.*Share Code', 'Number of Events', 'Unit_Price', 'Total', 'Revenue Share', 'Total Remitted']
	  ]
	},
	#sprint - streams
	{ service => Client::Service::DSP_SPRINT,
	  version => 2,
	  lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
		['Ranking', 'Track Requests', '% of Total Requests', 'Artist Name', 'Album', 'Track Title', 'Label', 'Genre'],
	  ]
	},
    # sprint 3-10 are WMG specific
	#ioda
	{ service => Client::Service::DSP_IODA,
	  version => 1,
	  lines => [
		['Service Name', 'Region', 'Year', 'Period', 'Label', 'Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track name', 'ISRC', 'Sale Format', 'Delivery Type', 'Unit Count', 'Unit Price', 'Credits / Returns', 'Gross']
	  ]
	},
	# moviso
	{ service => Client::Service::DSP_MOVISO,
	  version => 1,
	  lines => [
		[undef],
		[undef,undef,undef,undef,undef,undef,undef,undef,'Infospace Mobile']
	  ]
	},
    # nine squared: multiple sheet year from file month from sheet
    { service => Client::Service::DSP_NINESQUARED,
        version => 10,
        sheet => 1,
        lines => [
            ['Author','Company_1','Distributor','Platform','Product','ProductID','ProductType','Service','SongCode','Price','TotalSent','TotalNetRevenue','TotalRevenue','Payment'],
        ],
    },
	# nine squared, similar but summary tab is at the end, not the start, plus extra tabs
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 2,
	  lines => [
		[(undef) x 10, 'Licensing Report by Company-\(Net and Retail, Brew and Non-Brew\)']
	  ]
	},
	# nine squared, single month reports may 2006 and beyond
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 3,
	  lines => [
		[(undef) x 6, 'Licensing Report by Company-\(Net and Retail, Brew and Non-Brew\)']
	  ]
	},
	# nine squared, variable-tab but consistant
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 4,
      sheet => 1,
	  lines => [
		[(undef) x 8, 'Royalty Report by Company-\(Net and Retail, Brew and Non-Brew\)']
	  ]
	},
	# nine squared, variable-tab but consistant
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 7,
	  lines => [
		[(undef) x 7, 'Royalty Report by Company-\(Net and Retail, Brew and Non-Brew\)']
	  ]
	},
	# nine squared, similar to above
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 8,
	  lines => [
		[(undef) x 9, 'Royalty Report by Company-\(Net and Retail, Brew and Non-Brew\)']
	  ]
	},
	# nine squared, similar to above
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 9,
	  lines => [
		[(undef) x 8, 'Royalty Report by Company-\(Net and Retail, Brew and Non-Brew\)']
	  ]
	},
	# nine squared, single sheet motricity
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 5,
	  lines => [
		['ProductID', 'Artist', 'Title', 'Writer', 'License Company', 'Song Code', 'Percent Ownership', 'License Status', 'Distributor', 'Average Price', 'Number Sent', 'Total', 'Commission']
	  ]
	},
	# nine squared, single sheet vr
	{ service => Client::Service::DSP_NINESQUARED,
	  version => 6,
	  lines => [
		['ProductID', 'Artist', 'Title', 'Writer', 'License Company', 'Song Code', 'Percent Ownership', 'Distributor', 'Average Price', 'Number Sent', 'Total', 'Billing', 'Carrier', 'Net', 'Commission']
	  ]
	},
    # nine squared summary sheet -> detail sheet
    { service => Client::Service::DSP_NINESQUARED,
        version => 11,
        sheet => 1,
        lines => [
            ['ProductID','ProductType','Platform','Company_1','GRID','SongCode','Service','Distributor','PLaccount','Author','Product','Price','TotalSent','TotalRevenue','TotalNetRevenue','Payment','Month'],
        ],
    },
    # nine squared
    { service => Client::Service::DSP_NINESQUARED,
      version => 1,
      lines => [
        ['9 Squared'],
      ]
    },
	# mixxer
	{ service => Client::Service::DSP_MIXXER,
	  version => 1,
	  lines => [
		['Record Label', 'Label', 'Title', 'Artist', 'RSP', 'ISRC', '(Total|Downloads)', 'Royalt.*']
	  ]
	},
	# beatport
	{ service => Client::Service::DSP_BEATPORT,
	  version => 1,
	  lines => [
		['PRODUCT_UPC', 'PRODUCT_CATALOGUE_NUMBER', 'TRACK_ISRC_CODE', 'TRACK_ID', 'LABEL', 'RELEASE', 'TRACK_TITLE', 'TRACK_ARTIST', 'REMIXER_NAME', 'REMIX', 'TERRITORY', 'PURCHASE_STATUS', 'FORMAT', 'DELIVERY', 'TRANSACTION_DATE', 'CONTENT_TYPE', 'TRACK_COUNT', 'GROSS_CONTENT_REVENUE', 'GROSS_WAV_REVENUE', 'PAID_PRICE', 'NET_CONTENT_REVENUE', 'NET_WAV_REVENUE', 'NET_TOTAL']
	  ]
	},
  # beatport - new columns 1/29/09
  { service => Client::Service::DSP_BEATPORT,
    version => 4,
    lines => [
    ['PRODUCT_UPC', 'PRODUCT_CATALOGUE_NUMBER', 'TRACK_ISRC_CODE', 'TRACK_ID', 'LABEL', 'RELEASE', 'TRACK_TITLE', 'TRACK_ARTIST', 'REMIXER_NAME', 'REMIX', 'TERRITORY', 'PURCHASE_STATUS', 'FORMAT', 'DELIVERY', 'TRANSACTION_DATE', 'CONTENT_TYPE', 'TRACK_COUNT', 'GROSS_CONTENT_REVENUE', 'GROSS_WAV_REVENUE', 'PAID_PRICE', 'NET_CONTENT_REVENUE', 'NET_WAV_REVENUE', 'WITHHELD_AMOUNT', 'NET_TOTAL', 'SALE_TYPE']
    ]
  },
    # bacci bros - beatport - historical files
    { service => Client::Service::DSP_BEATPORT,
        version => 2,
        lines => [
            ['Catalog','Release','Track','ISRC','Remix','Country','Exclusive','New Release','General Content','Back Catalog','Classic','Release','Gross'],
        ],
    },
    # bacci bros - beatport - historical files
    { service => Client::Service::DSP_BEATPORT,
        version => 3,
        lines => [
            ['PRODUCT_UPC','PRODUCT_CATALOGUE_NUMBER','TRACK_ISRC_CODE','LABEL','RELEASE','TRACK_TITLE','TRACK_ARTIST','REMIXER_NAME','REMIX','TERRITORY','PURCHASE_STATUS','FORMAT','DELIVERY','TRANSACTION_DATE','GROSS_CONTENT_REVENUE','GROSS_WAV_REVENUE','PAID_PRICE','NET_CONTENT_REVENUE','NET_WAV_REVENUE','NET_TOTAL'],
        ],
    },
    # virtual - beatport (FB17748)
    { service => Client::Service::DSP_BEATPORT,
        version => 5,
        lines => [
            [
'PRODUCT_UPC', 'PRODUCT_CATALOGUE_NUMBER', 'TRACK_ISRC_CODE', 'TRACK_ID', 'LABEL', 'RELEASE', 'TRACK_TITLE', 'TRACK_ARTIST', 'REMIXER_NAME', 'REMIX', 'TERRITORY', 'PURCHASE_STATUS', 'FORMAT', 'DELIVERY', 'TRANSACTION_DATE', 'CONTENT_TYPE', 'TRACK_COUNT', 'GROSS_CONTENT_REVENUE', 'GROSS_WAV_REVENUE', 'PAID_PRICE', 'NET_CONTENT_REVENUE', 'NET_WAV_REVENUE', 'MECHANICAL_WITHHOLDING', 'US_TAX_WITHHOLDING', 'WITHHELD_AMOUNT', 'US_TAX_WITHHOLDING_PERCENT', 'US_TAX_WITHHOLDING_COMPLIANCY_STATUS', 'NET_TOTAL', 'SALE_TYPE'
	    ],
        ],
    },
    # futureclassic - beatport (FB11560)
    { service => Client::Service::DSP_BEATPORT,
        version => 6,
        match_on_any_row => 1,
        lines => [
            [
'Territory', 'Label Name', 'UPC', 'Catalog Number', 'ISRC', 'Track Title', 'Track Version', 'Artists', 'Remixers', 'Release Title', 'Quantity', 'Payable Amount \(USD\)'
	    ],
        ],
    },

    # infospace
    { service => Client::Service::DSP_INFOSPACEMOBILE,
      version => 1,
      lines => [
          # ignore first 25 lines
          [undef], [undef], [undef], [undef], [undef],
          [undef], [undef], [undef], [undef], [undef],
          [undef], [undef], [undef], [undef], [undef],
          [undef], [undef], [undef], [undef], [undef],
          [undef], [undef], [undef], [undef], [undef],
          ['Service', 'ISRC', 'Title', 'Artist', 'Sends', undef, undef, undef, 'Product'],
      ],
    },
	# streamwaves (minimal)
	{ service => Client::Service::DSP_STREAMWAVES,
	  version => 1,
      sheet => 2,
	  lines => [
		['Label', 'Artist', 'Album', 'Song', 'Units', 'Revenue'],
	  ]
	},
	# streamwaves (more data)
	{ service => Client::Service::DSP_STREAMWAVES,
	  version => 2,
      sheet => 2,
	  lines => [
		['Song ID', 'ISRC', 'UPC', 'Label Name', 'Artist Name', 'Album Name', 'Song Name', '#Plays', 'Revenue'],
	  ]
	},
	# streamwaves (different data)
	{ service => Client::Service::DSP_STREAMWAVES,
	  version => 3,
      sheet => 2,
	  lines => [
		['UPC', 'ISRC', 'Label', 'Artist', 'Album', 'Song', '#', 'Royalties'],
	  ]
	},
	# orchard
	{ service => Client::Service::DSP_ORCHARD,
	  version => 1,
	  lines => [
		  # yes, they have extra space after them in the source file.
		['Service',	'Artist', 'Release', 'Label Catalog #', 'Track', 'ISRC', 'CD #', 'Track #', 'Total Activity', 'Total Net Rev \$', 'DT', 'DT \$', 'DA', 'DA \$', 'S', 'S \$', 'DR', 'DR \$', 'TD', 'TD\$'],
	  ]
	},
	# orchard 2
	{ service => Client::Service::DSP_ORCHARD,
	  version => 2,
	  lines => [
		['Service', 'Artist', 'Release', 'UPC', 'Manufacturer UPC', 'Label Catalog #', 'Track', 'ISRC', 'CD', 'Track #', 'Total Activity', 'Total Net Rev \$', 'DT', 'DT \$', 'DA', 'DA \$', 'S', 'S \$', 'DR', 'DR \$', 'RB', 'RB \$', 'TD', 'TD\$'],
	  ]
	},
	# orchard w/publishing info
	{ service => Client::Service::DSP_ORCHARD,
	  version => 3,
	  lines => [
		['Quarter', 'DMS', 'Orchard UPC', 'Manufacturer UPC', 'Label Catalog', 'Imprint Label', 'Artist Name', 'Release name', 'Track Name', 'ISRC', 'CD', 'Track', 'Quantity', 'Unit Price', 'Total Amount', 'Trans Type', 'Adjusted Gross', 'Split Rate', 'Label Share', 'Ring?tone Publishing', 'Publishing', 'OMS Fee'],
	  ]
	},
    # orchard new version 2007/12
    { service => Client::Service::DSP_ORCHARD,
        version => 3,
        lines => [
            ['Quarter','DMS','Orchard UPC','Manufacturer\'s UPC','Label Catalog #','Imprint Label','Artist Name','Release Name','Track Name','ISRC','CD','Track #','Quantity','Unit Price','Total Amount','Trans Type','Adjusted Gross','Split Rate','Label Share Net Receipts','Ringtone Publishing','Publishing','OMS Fee'],
            ]
    },
    # Orchard new version DRA format
    { service => Client::Service::DSP_ORCHARD,
        version => 4,
        lines => [
            [undef],
            [undef],
            ['DRA ID','Artist','Song','Album','ISRC','UPC',undef,'Permanent Download','Subscription Play','OTA',undef,'DRA ID','iTunes Canada',undef,'iTunes S\.a\.r\.l\.',undef,'iTunes Australia',undef,'Itunes New Zealand',undef,'Apple Computer\, Inc\.',undef,'Liquid Digital Media',undef,'MusicNet',undef,'Napster Switzerland',undef,'Napster EU',undef,'Napster US',undef,'Napster Canada',undef,'Napster Germany',undef,'Napster UK',undef,'Real Networks',undef,'Ruckus Network',undef,'Sony Connect\, Inc\.',undef,'Starbucks Corporation',undef,'Verizon Wireless',undef,'T-Online \(Germany\)',undef,'iTunes Canada',undef,'iTunes S\.a\.r\.l\.',undef,'iTunes Australia',undef,'Itunes New Zealand',undef,'Apple Computer\, Inc\.',undef,'Liquid Digital Media',undef,'MusicNet',undef,'Napster Canada',undef,'Napster Germany',undef,'Napster UK',undef,'Napster US',undef,'Real Networks',undef,'Sony Connect\, Inc\.',undef,'Starbucks Corporation',undef,'T-Online \(Germany\)',undef,'MusicNet',undef,'Real Networks',undef,'Ruckus Network',undef,'T-Online \(Germany\)',undef,'Napster Switzerland',undef,'Napster EU',undef,'Napster US',undef,'Verizon Wireless',undef],
        ],
    },
    # Orchard new version DRA format
    { service => Client::Service::DSP_ORCHARD,
        version => 5,
        lines => [
            ([undef]) x 2,
            ['DRA ID','Artist','Song','Album','ISRC','UPC',undef,'Permanent Download','Subscription Play','OTA',undef,'DRA ID','iTunes Australia',undef,'iTunes Canada',undef,'iTunes S\.a\.r\.l\.',undef,'Itunes New Zealand',undef,'Apple Computer\, Inc\.',undef,'Liquid Digital Media',undef,'Real Networks',undef,'Starbucks Corporation',undef,'Verizon Wireless',undef,'T-Online \(Germany\)',undef,'Ruckus Network',undef,'MusicNet',undef,'Napster Switzerland',undef,'Napster US',undef,'Napster Canada',undef,'Napster Germany',undef,'Napster UK',undef,'iTunes Australia',undef,'iTunes Canada',undef,'iTunes S\.a\.r\.l\.',undef,'Itunes New Zealand',undef,'Apple Computer\, Inc\.',undef,'Liquid Digital Media',undef,'Real Networks',undef,'Starbucks Corporation',undef,'T-Online \(Germany\)',undef,'MusicNet',undef,'Napster Canada',undef,'Napster Germany',undef,'Napster UK',undef,'Napster US',undef,'Real Networks',undef,'T-Online \(Germany\)',undef,'Ruckus Network',undef,'MusicNet',undef,'Napster Canada',undef,'Napster Germany',undef,'Napster UK',undef,'Napster US',undef,'Verizon Wireless',undef,'Napster Switzerland',undef,'Napster US',undef],
        ],
    },
    # Orchard new version DRA format
    { service => Client::Service::DSP_ORCHARD,
        version => 6,
        lines => [
            ([undef]) x 2,
            ['DRA ID','Artist','Song','Album','ISRC','UPC',undef,'Master Ringtone','Permanent Download','OTA','Subscription Play',undef,'DRA ID','9 Squared\, Inc\.',undef,'iTunes Australia',undef,'iTunes Canada',undef,'iTunes S\.a\.r\.l\.',undef,'Itunes New Zealand',undef,'Apple Computer\, Inc\.',undef,'eMusic\.com\, Inc\.',undef,'GrooveMobile',undef,'Liquid Digital Media',undef,'MusicNet',undef,'Napster Switzerland',undef,'Napster EU',undef,'Napster US',undef,'Napster Canada',undef,'Napster Germany',undef,'Real Networks',undef,'Starbucks Corporation',undef,'Verizon Wireless',undef,'Zingy\, Inc\.',undef,'Nokia',undef,'Moderati',undef,'9 Squared\, Inc\.',undef,'Zingy\, Inc\.',undef,'Moderati',undef,'iTunes Australia',undef,'iTunes Canada',undef,'iTunes S\.a\.r\.l\.',undef,'Itunes New Zealand',undef,'Apple Computer\, Inc\.',undef,'eMusic\.com\, Inc\.',undef,'Liquid Digital Media',undef,'MusicNet',undef,'Napster Canada',undef,'Napster Germany',undef,'Napster US',undef,'Real Networks',undef,'Starbucks Corporation',undef,'Nokia',undef,'GrooveMobile',undef,'Napster Switzerland',undef,'Napster EU',undef,'Napster US',undef,'Verizon Wireless',undef,'MusicNet',undef,'Real Networks',undef,'Nokia',undef],
        ],
    },
    # Orchard - Yet another DRA format
    { service => Client::Service::DSP_ORCHARD,
        version => 10,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['DRA ID','Artist','Song','Album','ISRC','UPC',undef,'Permanent Download','Subscription Play','OTA',undef,'DRA ID','Real Networks',undef,'Verizon Wireless',undef,'MusicNet',undef,'Napster US',undef,'Napster Germany',undef,'Napster UK',undef,'Real Networks',undef,'MusicNet',undef,'Napster US',undef,'Real Networks',undef,'Napster Germany',undef,'Napster UK',undef,'Napster US',undef,'MusicNet',undef,'Verizon Wireless',undef],
        ],
    },
    # Orchard - Yet another DRA format
    { service => Client::Service::DSP_ORCHARD,
        version => 11,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['DRA ID','Artist','Song','Album','ISRC','UPC',undef,'Permanent Download','Subscription Play','OTA',undef,'DRA ID','Apple Computer\, Inc\.',undef,'eMusic\.com\, Inc\.',undef,'MusicNet',undef,'Napster UK',undef,'Napster US',undef,'Real Networks',undef,'Verizon Wireless',undef,'Apple Computer\, Inc\.',undef,'eMusic\.com\, Inc\.',undef,'MusicNet',undef,'Napster UK',undef,'Napster US',undef,'Real Networks',undef,'MusicNet',undef,'Real Networks',undef,'Verizon Wireless',undef],
        ],
    },
    # Orchard - Yet another DRA format
    { service => Client::Service::DSP_ORCHARD,
        version => 12,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['DRA ID','Artist','Song','Album','ISRC','UPC',undef,'Permanent Download','Subscription Play','OTA',undef,'DRA ID','Apple Computer\, Inc\.',undef,'MusicNet',undef,'Napster US',undef,'Verizon Wireless',undef,'Real Networks',undef,'Apple Computer\, Inc\.',undef,'MusicNet',undef,'Napster US',undef,'Real Networks',undef,'MusicNet',undef,'Real Networks',undef,'Napster US',undef,'Verizon Wireless',undef],
        ],
    },
    # Orchard - DM Records
    { service => Client::Service::DSP_ORCHARD,
        version => 13,
        sheet => 0,
        lines => [
            ['Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC',
			 'Manufacturer\'s UPC', 'Label Catalog #', 'Imprint Label', 'Artist Name',
			 'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #',
			 'Quantity', 'Unit Price', 'Total Amount', 'Trans Type', 'Adjusted Gross',
			 'Split Rate', 'Label Share Net Receipts', 'Ringtone Publishing',
			 'Publishing', 'Mech. Administrative Fee']
        ],
    },
    # Orchard - ATO / Daywind (FB17437)
    { service => Client::Service::DSP_ORCHARD,
        version => 14,
        sheet => 0,
        lines => [
            ['Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC',
			 'Manufacturer\'s UPC', 'Label Catalog #', 'Imprint Label', 'Artist Name',
			 'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #',
			 'Quantity', 'Unit Price', 'Gross', 'Trans Type', 'Adjusted Gross',
			 'Split Rate', 'Label Share Net Receipts', 'Ringtone Publishing',
			 'Publishing', 'Mech. Administrative Fee', 'Preferred Currency']
        ],
    },
    # Orchard - Bismeaux (FB11835) - Similar to v14, but now has "Cloud Publishing" column
    { service => Client::Service::DSP_ORCHARD,
        version => 20,
        sheet => 0,
        lines => [
            ['Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC',
	                'Manufacturer\'s UPC', 'Label Catalog #', 'Imprint Label', 'Artist Name',
			'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #',
			'Quantity', 'Unit Price', 'Gross', 'Trans Type', 'Adjusted Gross',
			'Split Rate', 'Label Share Net Receipts', 'Ringtone Publishing',
			'Cloud Publishing', 'Publishing', 'Mech. Administrative Fee', 'Preferred Currency', '^$']
        ],
    },
    # Orchard - EMG (FB11897) - Similar to v20, but with "Subaccount" column
    { service => Client::Service::DSP_ORCHARD,
        version => 21,
        sheet => 0,
        lines => [
            ['Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC',
	                'Manufacturer\'s UPC', 'Label Catalog #', 'Subaccount', 'Imprint Label', 'Artist Name',
			'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #',
			'Quantity', 'Unit Price', 'Gross', 'Trans Type', 'Adjusted Gross',
			'Split Rate', 'Label Share Net Receipts', 'Ringtone Publishing',
			'Cloud Publishing', 'Publishing', 'Mech. Administrative Fee', 'Preferred Currency']
        ],
    },
    # Orchard - (FB15146) - Similar to v20, but with extra column for revenue
    { service => Client::Service::DSP_ORCHARD,
        version => 22,
        sheet => 0,
        lines => [
            ['Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC',
	                'Manufacturer\'s UPC', 'Label Catalog #', 'Imprint Label', 'Artist Name',
			'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #',
			'Quantity', 'Unit Price', 'Gross', 'Trans Type', 'Adjusted Gross',
			'Split Rate', 'Label Share Net Receipts', 'Ringtone Publishing',
			'Cloud Publishing', 'Publishing', 'Mech. Administrative Fee', 'Preferred Currency', 'Total Receipts']
        ],
    },
    # The Orchard - FB15359
    { service => Client::Service::DSP_ORCHARD,
        version => 23,
        sheet => 0,
        lines => [
            [
'detail', 'SELLING_COMPANY', 'SELLING_COMPANY_CD', 'SAP_COMPANY', 'SAP_COMPANY_CD', 'SAP_PROFIT_CENTER', 'SAP_PROFIT_CENTER_CD', 'FIN_LABEL', 'FIN_LABEL_CD', 'ORCHARD_SUBACCT', 'ARTIST', 'TITLE', 'UPC_CD', 'SAP_MATERIAL_NO', 'ALTERNATE_CATLG_ID', 'CONFIGURATION_GROUP_CD', 'CONFIGURATION_NM', 'IN_STORE_DT', 'REPORTING_PARENT_NO', 'BILL_TO_NO', 'SHIP_TO_NO', 'COUNTRY_CD', 'CUSTOMER_PRICE_CD', 'BILL_TO_NM', 'REASON_CD', 'REASON_DESC', 'INVOICE_SOURCE_CD', 'REPORTING_DT', 'TRANSACTION_CD', 'ENTRY_DT', 'TRANSACTION_DT', 'CUSTOMER_PO_NO', 'AGENT_NM', 'SALES_REP_CD', 'INVOICE_CREDIT_NO', 'CAMPAIGN_CD', 'CAMPAIGN_DESC', 'SERIES_CD', 'UNIT_PR', 'TOTAL_DISCOUNT_RT', 'EFFECTIVE_PR', 'FREE_GOODS_QT', 'TRANSACTION_QT', 'TRANSACTION_AM', 'Item Class Code', 'Frequency', 'Net Amt'
            ],
        ],
    },
    # Orchard - New Earth Records (FB17551)
    { service => Client::Service::DSP_ORCHARD,
        version => 15,
        sheet => 0,
        lines => [
            [
'Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC', 'Manufacturer\'s UPC', 'Label Catalog #', 'Imprint Label', 'Artist Name', 'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #', 'Quantity', 'Trans Type', 'Label Share Net Receipts', 'Preferred Currency'
            ]
        ],
    },
    # Orchard - CDA Group (FB34)
    { service => Client::Service::DSP_ORCHARD,
        version => 16,
        sheet => 0,
        lines => [
            [
'Period', 'Activity Period', 'DMS', 'Territory', 'Orchard UPC', 'Manufacturer\'s UPC', 'Label Catalog #', 'Subaccount', 'Imprint Label', 'Artist Name', 'Release Name', 'Track Name', 'ISRC', 'Volume', 'Track #', 'Quantity', 'Unit Price', 'Gross', 'Trans Type', 'Adjusted Gross', 'Split Rate', 'Label Share Net Receipts', 'Ringtone Publishing', 'Publishing', 'Mech. Administrative Fee', 'Preferred Currency'
            ]
        ],
    },
    # Orchard - Cult (FB4061)
    { service => Client::Service::DSP_ORCHARD,
        version => 17,
        sheet => 0,
        lines => [
            [
'SOP Type', 'Invoice Type', 'SOP Number', 'Item Number', 'Format Type', 'Item Class Code', 'Item Description', 'QTY', 'Extended Price', 'Unit Price', 'Customer Number', 'Document Date', 'Customer Name', 'Customer Class', 'Country Cust Mstr', 'Country - Transaction', 'Salesperson ID - Cust Mstr', 'Salesperson ID - Transaction', 'Customer PO Number', 'Sub Label'
	    ],

        ],
    },
    # Orchard - Ubiquity (FB8864)
    { service => Client::Service::DSP_ORCHARD,
        version => 18,
        match_on_any_row => 1,
        sheet => 'any',
        lines => [
            [
'Activity Period', 'DMS', 'Territory', 'Product Code', 'Artist Name', 'Release Name', 'Track Name', 'Trans Type', 'Quantity', 'Unit Price', 'Gross Amount', 'Fee %', 'Dist. Fee', 'Publishing Deductions', 'Label Share Net Receipts'
	    ],

        ],
    },
    # Orchard - Ubiquity (FB8865)
    { service => Client::Service::DSP_ORCHARD,
        version => 19,
        match_on_any_row => 1,
        sheet => 'any',
        lines => [
            [
'Customer Name', 'Document date', 'Item Number', 'Artists Name', 'Album Name', 'Qty.', 'Unit Price', 'Extended Price', 'Fee Percentage', 'Distribution Fee', 'Net Amount', 'Sales Territory'
	    ],

        ],
    },
    # Orchard - CMH
    { service => Client::Service::DSP_ORCHARD,
        version => 7,
        sheet => 0,
        lines => [
                ['Quarter','Booking Month','Activity Period','DMS','Territory','Orchard UPC',undef,'Label Catalog #','Imprint Label','Artist Name',undef,'Track Name','ISRC','Volume','Track #','Quantity','Unit Price','Total Amount','Trans Type','Adjusted Gross','Split Rate',undef,undef,'Publishing',undef],
            ],
    },
    # Orchard - Fearless
    { service => Client::Service::DSP_ORCHARD,
        version => 7,
        sheet => 0,
        lines => [
                ['Period','Booking Month','Activity Period','DMS','Territory','Orchard UPC',undef,'Label Catalog #','Imprint Label','Artist Name',undef,'Track Name','ISRC','Volume','Track #','Quantity','Unit Price','Total Amount','Trans Type','Adjusted Gross','Split Rate',undef,undef,'Publishing',undef],
            ],
    },
    # orchard 2008 - Q2
    { service => Client::Service::DSP_ORCHARD,
        version => 9,
        sheet => 0,
        lines => [
            ['Quarter','Activity Period','DMS','Territory','Orchard UPC',undef,undef,'Imprint Label','Artist Name','Release Name','Track Name','ISRC','Volume','Track #','Quantity','Unit Price','Total Amount','Trans Type','Adjusted Gross','Split Rate','Label Share Net Receipts','Ringtone Publishing',undef],
        ],
    },
    # Orchard - MardiGras
    { service => Client::Service::DSP_ORCHARD,
        version => 8,
        sheet => 0,
        lines => [
            ['Artist Name','Release Name','Label Catalog #','Label share net receipts','Ringtone Publishing','Publishing','Total Recoup Cost','Ending Outstanding Recoup','Amount Paid'],
        ],
    },
	# dra
	{ service => Client::Service::DSP_DRA,
	  version => 1,
	  lines => [
		[undef, undef, undef, undef, undef, 'Label Name'],
		[undef, undef, undef, undef, undef, 'Statement Date'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['DRA ID', 'Artist', 'Song', 'Album', 'UPC'],
	  ]
	},
	# dra, slightly different (only 2 format types)
	{ service => Client::Service::DSP_DRA,
	  version => 2,
	  lines => [
		[undef, undef, undef, undef, undef, undef, 'Label Name'],
		[undef, undef, undef, undef, undef, undef, 'Statement Date'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['DRA ID', 'Artist', 'Song', 'Album', 'ISRC', 'UPC'],
	  ]
	},
	# echo (dualtone online sales)
	{ service => Client::Service::DSP_ECHO,
	  version => 1,
	  lines => [
		['DESCRIPTION', 'QTY', 'UNIT PRICE', 'TOTAL'],
	  ]
	},
	# musicnow, old style
	{ service => Client::Service::DSP_MUSICNOW,
	  version => 5,
	  lines => [
		['^\d+$', '^\d+$', '^\w+$', undef, undef, undef, undef, '^\d+$', undef,
		 '^\d+$', '^\d+$', '^\d+$', '^\d+$', '^\d+$', '^[0-9.]+$'],
      ]
	},
	# ruckus
	{ service => Client::Service::DSP_RUCKUS,
	  version => 1,
	  lines => [
		['^\d+$', undef, undef, undef, undef, 'RUCKUS', 'SUB', '^\d+$', undef, undef,
         undef, '^[A-Z]+$', undef, '^[A-Z]+$', '^[A-Z]+$', '^[A-Z]+$', '^\d+$', '^\d+$'],
      ]
	},
	# ruckus, simplified version
	{ service => Client::Service::DSP_RUCKUS,
	  version => 3,
	  lines => [
		['RUCKUS', '^\d{8}$', '^\d{8}$', '\d', '\d'],
      ]
	},
	# jamster
	{ service => Client::Service::DSP_JAMSTER,
	  version => 1,
	  lines => [
        [undef],
        [undef],
        ['Content Partner'],
        ['Time Frame'],
        [undef],
        [undef],
        [undef],
        ['Jamster! Services'],
	  ]
	},
    # jamster q3 2006
	{ service => Client::Service::DSP_JAMSTER,
	  version => 2,
	  lines => [
        [undef, 'Revenue Report'],
        [undef],
        [undef, 'Content Partner'],
        [undef, 'Time frame'],
        [undef],
        [undef],
        [undef, 'Jamster! Services'],
	  ]
	},
    # jamster q4 2006, same as above on other tabs
	{ service => Client::Service::DSP_JAMSTER,
	  version => 2,
	  lines => [
        [undef, 'Revenue Report'],
        [undef],
        [undef, 'Content Partner'],
        [undef, 'Time frame'],
        [undef],
        [undef, 'Jamster Services'],
	  ]
	},
    # jamster q2 2006
	{ service => Client::Service::DSP_JAMSTER,
	  version => 3,
	  lines => [
        ['Jamster Report'],
	  ]
	},
    # jamster wireless
	{ service => Client::Service::DSP_JAMSTER,
	  version => 4,
	  lines => [
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['CODE', 'ARTIST', 'TITLE', 'CONTENT CATEGORY', 'Portal', 'DOWNLOADS', undef, undef, 'Minimum PPD', 'License Fee Payable', 'TOTAL'],
	  ]
	},
    # jamster q1 2007, same as v2 on other tabs
	{ service => Client::Service::DSP_JAMSTER,
	  version => 5,
	  lines => [
        [undef],
        [undef, 'Revenue Report'],
        [undef],
        [undef, 'Content Partner'],
        [undef, 'Time frame'],
        [undef],
        [undef, 'Jamba Services'],
	  ]
	},
    # Desstra - JAMSTER
    { service => Client::Service::DSP_JAMSTER,
        version => 6,
        sheet => 0,
        lines => [
             ['LICENSOR','PERIODMONTH','DOMAIN','ARTIST','TITLE','ISRC','CATEGORY','SALES','PPD_local','CUR_local','EXCHANGERATE','EXCHANGEDATE','PPD_EUR','CUR_PPD','TOAL_EUR','CUR_TOTAL'],
        ],
    },
    # omstreams
	{ service => Client::Service::DSP_OMSTREAM,
	  version => 1,
	  lines => [
        ['Title', 'Downloads', 'Artist', 'Label', 'Type', 'Price', 'Amount', 'Sum Total', 'Total'],
	  ]
	},
    # mobile streams
	{ service => Client::Service::DSP_MOBILESTREAMS,
	  version => 1,
	  lines => [
        ['Mobile Streams Content Partner Report'],
        [undef],
        [undef],
        ['ARTIST', 'TITLE', 'CONTENT ID'],
	  ]
	},
	{ service => Client::Service::DSP_MOBILESTREAMS,
	  version => 3,
      sheet => 1,
	  lines => [
	    [
          'Period', 'Subsidiary', 'Global ID', 'ISCR',
          'Artist', 'Title', 'Media Type',
          'Distribution Partner','Territory',
          'Downloads', 'Local Currency',
          'Net Revenue', 'Royalties To Licensor'
	    ]
	  ]
	},
	{ service => Client::Service::DSP_MOBILESTREAMS,
	  version => 2,
      sheet => 1,
	  lines => [
	    [
          'Period', 'Subsidiary', 'Artist', 'Title', 'Media Type',
		  'Distribution Partner', 'Downloads', 'Local Currency',
		  'Net Revenue', 'Royalties To Licensor'
	    ]
	  ]
	},
	# Skint - mobile streams
	{ service => Client::Service::DSP_MOBILESTREAMS,
	  version => 4,
      sheet => 1,
	  lines => [
	    [
          'Period', 'Subsidiary', 'Content Provider', 'Global ID', 'Vuesia ID', 'Filename', 'Provider ID',
          'Artist', 'Title', 'Media Type',
          'Distribution Channel', 'Platform', 'Territory',
          'Downloads', 'Local Currency', 'Tariff',
          'Net Revenue', 'Royalties To Licensor'
	    ]
	  ]
	},
	# Skint - mobile streams (FB17734)
	{ service => Client::Service::DSP_MOBILESTREAMS,
	  version => 5,
      sheet => 1,
	  lines => [
	    [
            'Period', 'Subsidiary', 'Content Provider', 'Global ID', 'Artist', 'Title', 'Media Type',
            'Distribution Channel', 'Platform', 'Territory', 'Downloads', 'Local Currency', 'Tariff', 'Net Revenue', 'Royalties To Licensor'
	    ]
	  ]
	},
	# moderati 2005
	{ service => Client::Service::DSP_MODERATI,
	  version => 1,
	  lines => [
        [undef],
        ['Licensor:'],
        ['Licensor ID:'],
        ['Report Period:'],
        ['Territory:'],
        ['Payment rate:'],
        [undef],
        ['Carrier', undef, undef, 'Promo', 'Song Title Id', 'Song Title', 'Artist', 'Writer', 'Pay Code'],
	  ]
	},
    # moderati q4 2006 (and newer??)
	{ service => Client::Service::DSP_MODERATI,
	  version => 3,
	  lines => [
        [undef],
        ['Licensor:'],
        ['Licensor ID:'],
        ['Report Period:'],
        ['Territory:'],
        ['Payment rate:'],
        [undef],
        ['Carrier', 'Licensor Id', 'Licensor Name', 'Promo', 'Song Title Id', 'Song Title', 'Artist', 'Asset Type', 'Writer', 'ISRC', 'Pay Code', 'Download Count', 'Credits', 'Total Credits', 'Percentage Controlled', 'Prorated Credits', 'Retail Price/Credit', 'Prorated Retail', undef, undef, undef, undef, 'Royalty Minimum', '^Royalty Due.*']
	  ]
	},
    # moderati q4 2005
    { service => Client::Service::DSP_MODERATI,
        version => 7,
        lines => [
            ([undef]) x 9,
            ['Carrier','Licensor Id','Licensor Name','Promo','Song Title Id','Song Title','Artist','Pay Code','Download Count','Credits','Total Credits','Percentage Controlled','Prorated Credits','Retail Price\/Credit','Prorated Retail','Net Price\/Credit','Prorated Net','Royalty Net Rate','Royalty Retail Rate','Royalty Minimum','Original Q405 Royalties Due','\% of total','Deferred Royalties Due'],
        ],
    },
    # moderati (same as above with extra blank lines)
	{ service => Client::Service::DSP_MODERATI,
	  version => 3,
	  lines => [
        [undef],
        ['Licensor:'],
        ['Licensor ID:'],
        ['Report Period:'],
        ['Territory:'],
        ['Payment rate:'],
        ([undef]) x 3,
        ['Carrier', 'Licensor Id', 'Licensor Name', 'Promo', 'Song Title Id', 'Song Title', 'Artist', 'Asset Type', 'Writer', 'ISRC', 'Pay Code', 'Download Count', 'Credits', 'Total Credits', 'Percentage Controlled', 'Prorated Credits', 'Retail Price/Credit', 'Prorated Retail', undef, undef, undef, undef, 'Royalty Minimum', '^Royalty Due.*']
	  ]
	},
	# moderati 2006
	{ service => Client::Service::DSP_MODERATI,
	  version => 2,
	  lines => [
        [undef],
        ['Licensor:'],
        ['Licensor ID:'],
        ['Report Period:'],
        ['Territory:'],
        ['Payment rate:'],
        [undef],
        ['Carrier', undef, undef, 'Promo', 'Song Title Id', 'Song Title', 'Artist', 'Asset Type', 'Writer', 'ISRC'],
	  ]
	},
	# moderati - deferred
	{ service => Client::Service::DSP_MODERATI,
	  version => 4,
	  lines => [
        [undef],
        ['Licensor:'],
        ['Licensor ID:'],
        ['Report Period:'],
        ['Territory:'],
        ['Payment rate:'],
        ([undef]) x 2,
        ['Carrier', 'Licensor ID', 'Licensor Name', 'Songtitle ID', 'Song Title', 'Artist', 'Writer', 'Pay Code', 'Download Count', 'Credits', 'Total Credits', 'Percent Controlled', 'Prorated Credits', 'Retail Price / Credit', 'Prorated Retail', 'Net Price/ Credit', 'Prorated Net', 'Royalty Net Rate', 'Royalty Retail Rate', 'Royalty Penny Rate', undef, '% of total', 'Deferred Royalties Due'],
	  ]
	},
    # moderati - deferred
    { service => Client::Service::DSP_MODERATI,
      version => 5,
      lines => [
        ([undef]) x 11,
        ['Service Id','Carrier','Licensor Id','Licensor Name','Promo','Song Title Id','Song Title','Artist','Asset Type','Writer','ISRC','Pay Code','Download Count','Credits','Total Credits','Percentage Controlled','Prorated Credits','Retail Price\/Credit','Prorated Retail','Net Price\/Credit','Prorated Net','Royalty Net Rate','Royalty Retail Rate','Royalty Minimum','Royalty Due \(greater amount\)'],
      ]
    },
    # moderati - deferred
    { service => Client::Service::DSP_MODERATI,
      version => 6,
      lines => [
        ([undef]) x 11,
        ['Carrier','Service Id','Licensor Id','Licensor Name','Song Title Id','Song Title','Artist','Asset Type','Writer','ISRC','Pay Code','Download Count','Credits','Total Credits','Percentage Controlled','Prorated Credits','Retail Price\/Credit','Prorated Retail','Net Price\/Credit','Prorated Net','Royalty Net Rate','Royalty Retail Rate','Royalty Minimum','Royalty Due \(greater amount\)'],
      ]
    },
    # moderati
    { service => Client::Service::DSP_MODERATI,
      version => 8,
      lines => [
        ([undef]) x 11,
        ['Carrier','Service Id','Licensor Id','Licensor Name','Song Title Id','Song Title','Artist','Asset Type','Writer','Bundle Pkg','ISRC','Pay Code','Download Count','Credits','Total Credits','Percentage Controlled','Prorated Credits','Retail Price\/Credit','Prorated Retail','Net Price\/Credit','Prorated Net','Royalty Net Rate','Royalty Retail Rate','Royalty Minimum','Royalty Due \(greater amount\)'],
      ]
    },
	# wider than
	{ service => Client::Service::DSP_WIDERTHAN,
	  version => 1,
	  lines => [
        ['Settlement Report by Customer'],
        [undef],
        [undef],
        [undef],
        ['Title', 'Artist', 'ID', 'Format', 'Price', 'Downloads'],
	  ]
	},
	# muzak
	{ service => Client::Service::DSP_MUZAK,
	  version => 1,
	  lines => [
        ['Title', 'Artist', 'Record Label', 'Album', 'key', 'Program', 'Total'],
	  ]
	},
    # muzak
    { service => Client::Service::DSP_MUZAK,
      version => 2,
      lines => [
        ['Title','Artist','Album','Record Label','Label ID','Total'],
      ]
    },
    # muzak
    { service => Client::Service::DSP_MUZAK,
      version => 2,
      lines => [
        ['recnum','title   artist  album   recordlabel LABEL ID    SumOfTotal'],
      ]
    },
    # muzak
    { service => Client::Service::DSP_MUZAK,
      version => 3,
      sheet => 1,
      lines => [
        ['Recnum','Title','Artist','Album','Label','Distribution','Program'],
      ]
    },
    # muzak
    { service => Client::Service::DSP_MUZAK,
      version => 4,
      lines => [
        [undef],
        [undef],
        [undef],
        ['Title', 'Artist', 'Release', 'Record Label', 'Description', 'Distribution'],
      ]
    },
    # Sainsburys - MOS (FB16398)
    { service => Client::Service::DSP_SAINSBURYS,
      version => 1,
      lines => [
        ['ISRC', 'PRODUCT_UPC', 'PRODUCT_CATALOGUE_NUMBER', 'ARTIST', 'TITLE', 'TRANSACTION_TYPE', 'FORMAT_IDENTIFER', 'TERRITORY', 'CURRENCY_CODE', 'TRANSACTION_DATE', 'QUANTITY', 'PAID_PRICE', 'TOTAL']
      ]
    },
	# sanctuary historical
	{ service => Client::Service::DSP_SANCT_HISTORICAL,
	  version => 1,
	  lines => [
        [undef, undef, undef, undef, 'Ships', 'Ships'],
        ['Format', 'Artist', 'Album', 'UPC Code'],
	  ]
	},
    # skype
    { service => Client::Service::DSP_SKYPE,
      sheet => 1,
      version => 1,
      lines => [
        ['Date', 'ProductID', 'DownloadApplication', 'MediaType', 'TransmissionStandard', 'Handset', 'SalesPrice', 'Currency', 'ProviderContentID', 'Grid', 'ISRC', 'DigitalIdentifier', 'Portal', 'Artist', 'Downloads', 'Total Price'],
      ]
    },
    # skype (slight variation on the first)
    { service => Client::Service::DSP_SKYPE,
      sheet => 1,
      version => 2,
      lines => [
        ['Date', 'ProductID', 'DownloadApplication', 'MediaType', 'TransmissionStandard', 'Handset', 'SalesPrice', 'Currency', 'ProviderContentID', 'Grid', 'ISRC', 'DigitalIdentifier', 'Label', 'Portal', 'Artist', 'Composer', 'Downloads', 'Total Price'],
      ]
    },
    # skype (another slight variation on the first)
    { service => Client::Service::DSP_SKYPE,
      sheet => 1,
      version => 3,
      lines => [
        ['Date', 'ProductID', 'DownloadApplication', 'MediaType', 'TransmissionStandard', 'Handset', 'SalesPrice', 'Currency', 'ProviderContentID', 'Grid', 'ISRC', 'DigitalIdentifier', 'Portal', 'Artist', 'Composer', 'Downloads'],
      ]
    },
    # skype (and another slight variation on the first)
    { service => Client::Service::DSP_SKYPE,
      sheet => 1,
      version => 4,
      lines => [
        ['Date', 'ProductID', 'DownloadApplication', 'MediaType', 'TransmissionStandard', 'Handset', 'SalesPrice', 'Currency', 'ProviderContentID', 'Grid', 'ISRC', 'DigitalIdentifier', 'Label', 'Portal', 'Artist', 'Composer', 'Downloads'],
      ]
    },
    # amp'd
    { service => Client::Service::DSP_AMPD,
      sheet => 1,
      version => 1,
      lines => [
        ['Revnue Sharing\/Royalty Statement Detail'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Track Title', 'Track Artist', 'ISRC', 'Unit price', 'Units', 'Price'],
      ]
    },
    # amp'd, another...
    { service => Client::Service::DSP_AMPD,
      sheet => 1,
      version => 2,
      lines => [
        ['Revnue Sharing\/Royalty Statement Detail'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['TrackTitle', 'TrackArtist', 'TrackIsrc', 'Unit', 'UnitPrice', 'Price'],
      ]
    },
    # amp'd, and yet another...
    { service => Client::Service::DSP_AMPD,
      sheet => 1,
      version => 3,
      lines => [
        ['Revnue Sharing\/Royalty Statement Detail'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['TrackTitle', 'TrackArtist', 'TrackIsrc', 'UnitPrice', 'Price', 'Units'],
      ]
    },
    # amp'd, and yet still another...
    { service => Client::Service::DSP_AMPD,
      sheet => 1,
      version => 4,
      lines => [
        ['Revnue Sharing\/Royalty Statement Detail'],
        [undef],
        [undef],
        [undef],
        [undef],
        [undef],
        ['Track Title', 'Track Artist', 'ISRC', 'Units', 'Retail', 'Unit Price', 'Amount Due'],
      ]
    },
    # amp'd version 5 is wmg specific
    # calabash
    { service => Client::Service::DSP_CALABASH,
      version => 1,
      lines => [
        ['Vendor'],
        ['Contact'],
        [undef],
        [undef],
        ['Time Period', 'Vendor Earnings'],
      ]
    },
    # SongSlide
    { service => Client::Service::DSP_SONGSLIDE,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['SEQ','UPC','ISRC','Artist Name','Track Name','# Units Sold','Total Revenue','song price',undef],
        ],
    },
    # imn
    { service => Client::Service::DSP_IMN,
      version => 1,
      lines => [
        ['Item', 'Label Name', 'Artist', 'Title', 'PlayTime'],
      ]
    },
    # muze
    { service => Client::Service::DSP_MUZE,
      version => 1,
      lines => [
        ['MUZENBR', 'DISC', 'TRK', 'PERFORMER', 'TITLE', 'SONG', 'HITS', 'MEGS', 'MINS'],
      ]
    },
	# zingy, this doesn't make sense to me:
	# the header line is line #17 in the excel file,
	# but it only matches when I leave 14 blank lines. (wtf?)
	{ service => Client::Service::DSP_ZINGY,
	  version => 1,
	  lines => [
		[undef],
	    [undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		['Territory','Qrt','Year','kind', 'itemID', 'Title', 'Artist', '(.*)Share', 'Pricing'],
	  ]
	},
    # zingy, another format
	{ service => Client::Service::DSP_ZINGY,
	  version => 2,
	  lines => [
		['Publisher', undef],
	    ['Remittance Period', undef],
		['Remittance date', undef],
		[undef],
		['Territory Key:'],
	  ]
	},
	# zingy, yet another...
	{ service => Client::Service::DSP_ZINGY,
	  version => 3,
	  lines => [
		[undef],
	    [undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		['Territory', 'Qrt', 'Year', 'Kind', 'ItemID', 'ItemName', 'Artist', undef, undef,'Price'],
	  ]
	},
	# zingy, variation on v.3
	{ service => Client::Service::DSP_ZINGY,
	  version => 4,
	  lines => [
		[undef],
	    [undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		['Territory', 'Qrt', 'Year', 'Kind', 'ItemID', 'ItemName', 'Artist', undef, undef,'Price'],
	  ]
	},
	# zingy, another variation on v.3
	{ service => Client::Service::DSP_ZINGY,
	  version => 5,
	  lines => [
		[undef],
	    [undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		[undef],
		['Territory', 'Qrt', 'Year', 'Kind', 'ItemID', 'ItemName', 'Artist', undef, undef, undef, undef, undef,'Price'],
	  ]
	},
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 1,
      lines => [
        ([undef]) x 14,
        ['ID', undef, 'ISRC', 'Title', undef, undef, undef, undef, undef, undef, undef, 'Artist', undef, undef, undef, undef, undef, undef, undef, 'Fee', undef, 'Network Carrier Fee', undef, 'Copyright License Fee', undef, 'Royalty'],
      ],
    },
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 2,
      lines => [
        ([undef]) x 15,
        ['ID', 'ISRC', undef, 'Title', undef, undef, undef, undef, undef, undef, undef, 'Artist', undef, undef, undef, undef, undef, undef, 'Fee', 'Network Carrier Fee', undef, undef, 'Copyright License Fee', 'Royalty'],
      ],
    },
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 3,
      lines => [
        ([undef]) x 16,
        ['ID', undef, 'ISRC', 'Title', undef, undef, undef, undef, undef, undef, undef, 'Artist', undef, undef, undef, undef, undef, undef, undef, 'Retail Price', undef, 'Network Carrier Fee', undef, 'Copyright License Fee', undef, 'Sub-distributed Royalty', undef, 'Royalty'],
      ],
    },
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 4,
      lines => [
        ([undef]) x 16,
        ['ID', undef, 'ISRC', 'Title', undef, undef, undef, undef, undef, undef, undef, 'Artist', undef, undef, undef, undef, undef, undef, undef, 'Retail Price', undef, 'Network Carrier Fee', undef, 'Copyright License Fee', undef, 'Royalty'],
      ],
    },
    # music airport
    { service => Client::Service::DSP_MUSICAIRPORT,
      version => 6,
      sheet   => 'any',
      lines => [
        [undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
		 undef, undef, undef, undef, undef, 'Docomo', 'Docomo', 'au', 'au',
		 'SoftBank', 'SoftBank', undef, undef],
      ],
    },
    # other music
    { service => Client::Service::DSP_OTHERMUSIC,
      version => 1,
      lines => [
        ['TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE', 'PRODUCT_CATALOG_NUMBER', 'UNIT_TYPE', 'QUANTITY', 'PAID_PRICE', 'TRANSACTION_TYPE', 'FORMAT_IDENTIFIER', 'TERRITORY', 'TRANSACTION_DATE', 'UNIT_PRICE', 'LABEL', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
        [(undef) x 15, 'Other Music Digital'],
      ],
    },
    # other music
    { service => Client::Service::DSP_OTHERMUSIC,
      version => 2,
      lines => [
        ['LABEL','TRACK_ISRC_CODE','PRODUCT_UPC','TRACK_ARTIST','TRACK_TITLE','PRODUCT_CATALOG_NUMBER','UNIT_TYPE','QUANTITY','UNIT_PRICE','PAID_PRICE','PAID_TOTAL','TRANSACTION_TYPE','FORMAT_IDENTIFIER','TERRITORY','TRANSACTION_DATE','CURRENCY_CODE','DMS','MECHANICALS'],
        [(undef) x 16, 'Other Music Digital'],
      ],
    },
    # fnac
    { service => Client::Service::DSP_FNAC,
      version => 1,
      lines => [
        ([ undef ]) x 11,
        [ 'P\.riode' ],
        ([ undef ]) x  6,
        [undef, undef, 'D\.signation', 'Quantit\.', 'Prix Unitaire', 'Montant'],
      ],
    },
    # fnac II
    { service => Client::Service::DSP_FNAC,
        version => 2,
        match_on_any_row => 1,
        sheet   => 'any',
        lines => [
            ['Country','Period','Retailer Identifier','Format','Free Y\/N','Sales Type','Title Category','Per Album or  per Track','ID Digital Identifier','Product Reference','Product Code Barre \(UPC\)','Album Name','Album Artist','Track Name','Track Artist','Label','ISRC','Number of Tracks','Retail Price \(incl VAT\)','PPD \(excl VAT\)','Discount \%','Royalty per unit \(excl VAT\)','quantity','Total Amount \(excl VAT\)'],
        ],
    },
    # fnac II
    { service => Client::Service::DSP_FNAC,
        version => 3,
        lines => [
            ['\d{6}','WILDPALMS','\w{2}','\d{8}','\d{8}','stream','Track',undef,undef,'\w+','\w+',undef,'\d+',undef,undef],
        ],
    },
    # fnac III
    { service => Client::Service::DSP_FNAC,
        version => 4,
        sheet => 'any',
        lines => [
            ['START DATE', 'END DATE', undef, undef, undef, 'UNIT',
            'UNIT PRICE', 'GBP ROYS', undef, undef, 'ARTIST', 'TRACK',],
        ],
    },
    # fnac
    { service => Client::Service::DSP_FNAC,
      version => 4,
      sheet => 0,
      lines => [
        ([undef]) x 17,
        [undef, undef, 'D.signation', 'Quantit.', 'Prix Unitaire', 'Montant'],
      ],
    },
    # fnac II
    { service => Client::Service::DSP_FNAC,
        version => 5,
        sheet   => 'any',
        lines => [
            ['Country','SalesDate','Retailer','Format','ProductType','ISRC','GRID',
			 'EAN_UPC','FnacID','DigitalID','AlbumName','AlbumArtist','TrackName',
			 'TrackArtist','Label','product_NumberOfTracks','Currency','RetailPrice',
			 'NetSellingPrice','Royalty','Discount','RoyaltyAfterDiscount','Units','TotalRoyalties'],
        ],
    },
    # fnac
    { service => Client::Service::DSP_FNAC,
        version => 6,
        sheet   => 'any',
        lines => [
            ['Country', 'SalesDate', 'Retailer', 'Format', 'ProductType', 'ISRC', 'GRID',
			 'EAN_UPC', 'ID_Fournisseur', 'FnacID', 'DigitalID', 'AlbumName', 'AlbumArtist', 'TrackName',
			 'TrackArtist', 'Label', 'product_NumberOfTracks', 'Currency', 'RetailPrice',
			 'NetSellingPrice', 'Royalty', 'Discount', 'RoyaltyAfterDiscount', 'Units', 'TotalRoyalties'],
        ],
    },
    # ingrooves, an aggregator.
    { service => Client::Service::DSP_INGROOVES,
      version => 1,
      sheet   => 1,
      lines   => [
        ['DATE', 'STATEMENT', 'ENDING', 'SONG', 'ALBUM', 'MIX', 'ARTIST', 'ISRC', 'UPC\/EAN', 'CATALOG', 'TRANSACTED', 'SOURCE', 'QUANTITY', 'NET', 'MECHANICAL', 'ADMINISTRATION', 'ROYALTY'],
      ]
    },
    # ingrooves - same as above but with 'mix' and 'album' reversed
    { service => Client::Service::DSP_INGROOVES,
      version => 2,
      sheet   => 1,
      lines   => [
        ['DATE', 'STATEMENT', 'ENDING', 'SONG', 'MIX', 'ALBUM', 'ARTIST', 'ISRC', 'UPC\/EAN', 'CATALOG', 'TRANSACTED', 'SOURCE', 'QUANTITY', 'NET', 'MECHANICAL', 'ADMINISTRATION', 'ROYALTY'],
      ]
    },

    # !!!!!!!!!!!!!!!!!!!
    # Per case 10994, versions 3 and 4 have been deactivated.
    #
    #
    # ingrooves
    #{ service => Client::Service::DSP_INGROOVES,
    #    version => 3,
    #    sheet => 1,
    #    lines => [
    #            ['DATE','STATEMENT','TYPE','TITLE','MIX TITLE','ARTIST','QUANTITY','NET','MECHANICAL','ROYALTY'],
    #        ],
    #},
    # ingrooves
    #{ service => Client::Service::DSP_INGROOVES,
    #    version => 4,
    #    sheet => 1,
    #    lines => [
    #            ['DATE','STATEMENT','ENDING','TYPE','TITLE','MIX #TITLE','ARTIST','CATALOG','QUANTITY','NET','MECHANICAL','ADMINISTRATION','ROYALTY'],
    #        ],
    #},

    # ingrooves
    { service => Client::Service::DSP_INGROOVES,
        version => 5,
        sheet => 1,
        lines => [
            ['DATE','STATEMENT','ENDING','SONG','ALBUM','MIX','ARTIST','ISRC','UPC\/EAN','CATALOG','SOURCE','QUANTITY','NET','MECHANICAL','ADMINISTRATION','ROYALTY'],
        ],
    },
    # ingrooves
    { service => Client::Service::DSP_INGROOVES,
        version => 6,
        sheet => 1,
        lines => [
            ['DATE','STATEMENT','ENDING','SONG','MIX','ALBUM','ARTIST','ISRC','UPC\/EAN','CATALOG','TRANSACTED','SOURCE','QUANTITY','NET','ROYALTY','ASSET TYPE','PRODUCT TYPE', 'TRANSACTION TYPE'],
        ],
    },
    # ingrooves (renamed some columns, but data is still in the same place)
    { service => Client::Service::DSP_INGROOVES,
        version => 6,
        sheet => 1,
        lines => [
            ['DATE','STATEMENT','ENDING','SONG','MIX','ALBUM','ARTIST','ISRC','UPC\/EAN','CATALOG','TRANSACTED','TERRITORY','QUANTITY','REVENUE FROM RETAILER','NET REVENUE TO CLIENT','ASSET TYPE','PRODUCT TYPE', 'TRANSACTION TYPE'],
        ],
    },
    # Nettwerk-specific ingrooves
    { service => Client::Service::DSP_INGROOVES,
        version => 15,
        sheet => 1,
        lines => [
            ['Nettwerk', 'DATE','STATEMENT','ENDING','SONG','MIX','ALBUM','ARTIST','ISRC','UPC\/EAN','CATALOG','TRANSACTED','TERRITORY','QUANTITY','REVENUE FROM RETAILER','NET REVENUE TO CLIENT','ASSET TYPE','PRODUCT TYPE', 'TRANSACTION TYPE','DELIVERED BY','LABEL'],
        ],
    },
    # Nettwerk-specific ingrooves, v2
    { service => Client::Service::DSP_INGROOVES,
        version => 16,
        sheet => 0,
        lines => [
            [ 'PERIOD', 'RETAILER', 'RETAILER REPORTING PERIOD', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'QUANTITY', 'REVENUE FROM RETAILER', 'NET REVENUE TO CLIENT' ],
        ],
    },
    # VP Records-specific ingrooves
    # (Changed to INGrooves per FB14063, was DSP_INGROOVES_VPRECORDS version 1)
# INgrooves version 7 has been deprecated (FB17642)
#    { service => Client::Service::DSP_INGROOVES,
#        version => 7,
#        sheet => 'any',
#        lines => [
#            ['DATE', 'STATEMENT', 'ENDING', 'SONG', 'MIX', 'ALBUM', 'ARTIST', 'ISRC', 'UPC\/EAN',
#             'CATALOG', 'TRANSACTED', 'SOURCE', 'QUANTITY', 'NET', 'MECHANICAL WITHHOLDING',
#             'ROYALTY', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'PROJECT \(LICENSEE\)', 'LABEL',
#             'TRACK CUSTOM ID', 'ALBUM CUSTOM ID', 'DELIVERED BY'],
#        ],
#    },
    # VP Records-specific ingrooves (FB16166)
    { service => Client::Service::DSP_INGROOVES,
        version => 10,
        sheet => 'any',
        lines => [
            ['DATE', 'STATEMENT', 'SUB-SERVICE', 'ENDING', 'SONG', 'MIX', 'ALBUM', 'ARTIST', 'ISRC', 'UPC\/EAN',
             'CATALOG', 'TRANSACTED', 'SOURCE', 'QUANTITY', 'NET', 'MECHANICAL WITHHOLDING',
             'ROYALTY', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'PROJECT \(LICENSEE\)', 'LABEL',
             'TRACK CUSTOM ID', 'ALBUM CUSTOM ID', 'DELIVERED BY'],
        ],
    },
    # Ingrooves
    { service => Client::Service::DSP_INGROOVES,
        version => 8,
        sheet => 'any',
        lines => [
            ['DATE', 'STATEMENT', 'SUB-SERVICE', 'ENDING', 'SONG', 'MIX', 'ALBUM',
			 'ARTIST', 'ISRC', 'UPC/EAN', 'CATALOG', 'TRANSACTED', 'TERRITORY',
			 'QUANTITY', 'REVENUE FROM RETAILER', 'NET REVENUE TO CLIENT', 'ASSET TYPE',
			 'PRODUCT TYPE', 'TRACK CUSTOM ID', 'DELIVERED BY', 'LABEL', 'CONSUMPTION'],
        ],
    },
    # Ingrooves
    { service => Client::Service::DSP_INGROOVES,
        version => 9,
        sheet => 'any',
        lines => [
            ['DATE', 'STATEMENT', 'ENDING', 'SONG', 'MIX', 'ALBUM',
			 'ARTIST', 'ISRC', 'UPC/EAN', 'CATALOG', 'TRANSACTED', 'TERRITORY',
			 'QUANTITY', 'REVENUE FROM RETAILER', 'NET REVENUE TO CLIENT', 'ASSET TYPE',
			 'PRODUCT TYPE', 'TRACK CUSTOM ID', 'DELIVERED BY', 'LABEL', 'CONSUMPTION'],
        ],
    },
    # Ingrooves (FB17038)
    { service => Client::Service::DSP_INGROOVES,
        version => 11,
        sheet => 'any',
        lines => [
            [
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'QUANTITY', 'REVENUE FROM RETAILER', 'NET REVENUE TO CLIENT'
			 ],
        ],
    },
    # Ingrooves (FB17211/FB17218/FB17218)
    { service => Client::Service::DSP_INGROOVES,
        version => 12,
        sheet => 'any',
        lines => [
            [
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'QUANTITY', 'REVENUE FROM RETAILER', 'MECHANICALS', 'NET REVENUE TO CLIENT'
			 ],
        ],
    },
    # Ingrooves (FB17209/FB17230)
    { service => Client::Service::DSP_INGROOVES,
        version => 13,
        sheet => 'any',
        lines => [
            [
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'QUANTITY', 'REVENUE FROM RETAILER', 'MECHANICAL WITHHOLDING', 'NET REVENUE TO CLIENT'
			 ],
        ],
    },
    # Ingrooves v13 alternate header (FB1808)
    { service => Client::Service::DSP_INGROOVES,
        version => 13,
        sheet => 'any',
        lines => [
            [
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'QUANTITY', 'US\$ REVENUE FROM RETAILER', 'US\$ MECHANICALS', 'US\$ NET REVENUE TO CLIENT'
			 ],
        ],
    },
    # Ingrooves (FB17736)
    { service => Client::Service::DSP_INGROOVES,
        version => 14,
        sheet => 'any',
        lines => [
            [
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'QUANTITY', 'REVENUE FROM RETAILER', 'NET REVENUE TO CLIENT'
			 ],
        ],
    },
    # INGrooves, derived from v13 (FBoD5159)
    { service => Client::Service::DSP_INGROOVES,
        version => 18,
        sheet => 0,
        lines => [
            [ 'PERIOD', 'RETAILER', 'RETAILER REPORTING PERIOD', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'QUANTITY', 'US\$ REVENUE FROM RETAILER', 'US\$ NET REVENUE TO CLIENT', '^$' ],
        ],
    },
    # INGrooves, derived from v18 (FBoD4998)
    { service => Client::Service::DSP_INGROOVES,
        version => 19,
        sheet => 0,
        lines => [
            [ 'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'QUANTITY', 'US\$ REVENUE FROM RETAILER', 'US\$ MECHANICALS', 'US\$ NET REVENUE TO CLIENT', '^$' ],
        ],
    },
    # INGrooves, derived from v18 (FBoD5128)
    { service => Client::Service::DSP_INGROOVES,
        version => 20,
        sheet => 'any',
        lines => [
            [ 'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'QUANTITY', 'US\$ REVENUE FROM RETAILER', 'US\$ NET REVENUE TO CLIENT', '^$' ],
        ],
    },
    # INGrooves v21, derived from v13 (FB5173)
    { service => Client::Service::DSP_INGROOVES,
        version => 21,
        sheet => 0,
        lines => [
            [ 
'PERIOD', 'RETAILER', 'RETAILER REPORTING PERIOD', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'QUANTITY', 'REVENUE FROM RETAILER', 'NET REVENUE TO CLIENT', '^$' ],
        ],
    },
    # INGrooves v22 (FB8604)
    { service => Client::Service::DSP_INGROOVES,
        version => 22,
        sheet => 'any',
        lines => [
            [ 
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC\/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'RETAILER STATEMENT COUNTRY ISO', 'TERRITORY OF SALE', 'DELIVERED BY', 'LABEL', 'ASSET TYPE', 'SALES DESCRIPTION', 'SALES CATEGORY', 'QUANTITY', '\w{2}\$ REVENUE FROM RETAILER', '\w{2}\$ NET REVENUE TO CLIENT', '^$' ],
        ],
    },    
    # INGrooves v23 (FB8604)
    { service => Client::Service::DSP_INGROOVES,
        version => 23,
        sheet => 'any',
        lines => [
            [ 
'PERIOD', 'RETAILER', 'RETAILER REPORTING PERIOD', 'ARTIST', 'ALBUM', 'UPC\/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'RETAILER STATEMENT COUNTRY ISO', 'TERRITORY OF SALE', 'DELIVERED BY', 'LABEL', 'ASSET TYPE', 'SALES DESCRIPTION', 'SALES CATEGORY', 'QUANTITY', '\w{2}\$ REVENUE FROM RETAILER', '\w{2}\$ NET REVENUE TO CLIENT', '^$' ],
        ],
    },        
    # INGrooves, and extra (unused by us) column added to v20
    { service => Client::Service::DSP_INGROOVES,
        version => 24,
        sheet => 'any',
        lines => [
            [ 'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'TERRITORY', 'DELIVERED BY', 'LABEL', 'SALES TYPE', 'ASSET TYPE', 'PRODUCT TYPE', 'TRANSACTION TYPE', 'QUANTITY', 'US\$ REVENUE FROM RETAILER', 'US\$ MECHANICALS', 'US\$ NET REVENUE TO CLIENT', '^$' ],
        ],
    },
    # INGrooves v25 (FB12234)
    { service => Client::Service::DSP_INGROOVES,
        version => 25,
        sheet => 'any',
        lines => [
            [ 
'Period', 'Delivered By', 'Retailer', 'Label', 'Artist', 'Album', 'UPC\/EAN', 'Product \/ Catalog #', 'Song', 'Mix \(Version\)', 'ISRC', 'Genre', 'Release Date', 'Retailer Stmt Country ISO', 'Territory', 'Asset Type', 'Sales Description', 'Sales Classification', 'Quantity Net', '\w{2}\$ Revenue', '\w{2}\$ After Fees', '^$'
],
        ],
    },        
    # INGrooves v25 (FB12395) - alternate column names
    { service => Client::Service::DSP_INGROOVES,
        version => 25,
        sheet => 'any',
        lines => [
            [ 
'Period', 'Delivered By', 'Retailer', 'Label', 'Artist', 'Album Title', 'UPC\/EAN', 'Product \/ Catalog #', 'Song', 'Mix \(Version\)', 'ISRC', 'Genre', 'Release Date', 'Retailer Stmt Country ISO', 'Territory', 'Asset Type', 'Sales Description', 'Sales Classification', 'Quantity Net', '\w{2}\$ Revenue', 'Net Dollars After Fees', '^$'
],
        ],
    },        
    # INGrooves v26 (FB12645) - VPAL
    { service => Client::Service::DSP_INGROOVES,
        version => 26,
        sheet => 'any',
        lines => [
            [ 
'Period', 'Delivered By', 'Retailer', 'Label', 'Artist', 'Album',       'UPC\/EAN', 'Product \/ Catalog #', 'Song', 'Mix \(Version\)', 'ISRC', 'Genre', 'Release Date', 'Retailer Stmt Country ISO', 'Territory', 'Asset Type', 'Sales Description', 'Sales Classification', 'Quantity Net', '\w{2}\$ Revenue', '\w{2}\$ Mechanicals Net', '\w{2}\$ After Fees', '^$'
],
        ],
    },        
    # INGrooves v27 (FB13422) - MUSICOUNTS
    { service => Client::Service::DSP_INGROOVES,
        version => 27,
        sheet => 'any',
        lines => [
            [ 
'PERIOD', 'RETAILER', 'ARTIST', 'ALBUM', 'UPC\/EAN', 'SONG', 'MIX', 'ISRC', 'PRODUCT RELEASE DATE', 'CATALOG', 'RETAILER STATEMENT COUNTRY ISO', 'TERRITORY OF SALE', 'DELIVERED BY', 'LABEL', 'ASSET TYPE', 'SALES DESCRIPTION', 'SALES CATEGORY', 'QUANTITY', '\w{2}\$ REVENUE FROM RETAILER', '\w{2}\$ MECHANICALS', '\w{2}\$ NET REVENUE TO CLIENT'
],
        ],
    },        
    # INGrooves v28 (FB15561) - MUSICOUNTS
    { service => Client::Service::DSP_INGROOVES,
        version => 28,
        sheet => 'any',
        lines => [
            [ 
'Period', 'Delivered By', 'Retailer', 'Label', 'Artist', 'Album Title', 'UPC/EAN', 'Product / Catalog #', 'Song', 'Mix \(Version\)', 'ISRC', 'Genre', 'Release Date', 'Retailer Stmt Country ISO', 'Territory', 'Asset Type', 'Sales Description', 'Sales Classification', 'Quantity Net', 'US\$ Revenue', 'US\$ Mechanicals', 'Net Dollars after Fees'
],
        ],
    },        
    # Ingrooves (FB2109)
    { service => Client::Service::DSP_INGROOVES,
        version => 17,
        sheet => 'any',
        lines => [
            [
'EarningsDueAt', 'SalesPeriodStart', 'SalesPeriodEnd', 'MusicService', 'Artist', 'AlbumName', 'GTIN', 'SongName', 'ISRC', 'ReleaseDate', 'AlbumOrSongCatalog', 'DeliveredBy', 'Label', 'TransactedAt', 'SalesType', 'AssetType', 'ProductTypes', 'Quantity', 'GrossNet', 'Royalty', 'SourceTerritory'
	 ],
        ],
    },
    # Koch Digital.
    {
        service => Client::Service::DSP_KOCH_DIGITAL,
        version => 1,
        lines => [
            ([ undef ]) x 10,
            [
                'Digital Provider',
                undef,
                'Album ID / Item #',
                'UPC / ISRC #',
                undef,
                'Disc',
                'Album  / Track Title',
                undef,
                'Album / Track Artist',
                undef,
                'Format',
                undef,
                'Units',
                'Dollars'
            ]
        ]
    },

    # Entertainment One Distribution (E1)
    {
        service => Client::Service::DSP_E1_DISTRIBUTION,
        version => 1,
        match_on_any_row => 1,
        lines => [[
            'Ctry', 'Digital Provider', 'Album ID \/ Item #', 'UPC \/ ISRC #', 'Disc',
			'Album  \/ Track Title', 'Album \/ Track Artist', 'Format', 'Units', 'Dollars'
            ]
        ]
    },
    # Entertainment One Distribution (E1) - FB14118
    {
        service => Client::Service::DSP_E1_DISTRIBUTION,
        version => 2,
        match_on_any_row => 1,
        lines => [[
'Month', 'Label Code', 'LabelName', 'DSP', 'DeliveryType', 'Territory', 'UPC', 'AlbumID', 'AlbumName', 'AlbumArtist', 'ISRC', 'DiscNo', 'TrackNo', 'TrackName', 'TrackArtist', 'ProductType', 'Units', 'Sales \(\w{3}\)', 'FXRate', 'DigitalFee', 'DigitalDays', 'HST', 'Sales \(\w{3}\)', 'Distribution Fee', 'Total Sales', 'HST', 'Total Payable'
            ]]
    },
    # Entertainment One Distribution (E1) - FB14634
    {
        service => Client::Service::DSP_E1_DISTRIBUTION,
        version => 3,
        match_on_any_row => 1,
        lines => [[
'Month', 'Vendor', 'Label Code', 'LabelName', 'DSP', 'DeliveryType', 'Territory', 'UPC', 'AlbumID', 'AlbumName', 'AlbumArtist', 'ISRC', 'DiscNo', 'TrackNo', 'TrackName', 'TrackArtist', 'ProductType', 'Units', 'Sales \(\w{3}\)', 'FXRate', 'DigitalFee', 'DigitalDays', 'HST', 'Sales \(\w{3}\)', 'Distribution Fee', 'Total Sales', 'HST', 'Total Payable'
            ]]
    },
    # Insound
    {
        service => Client::Service::DSP_INSOUND,
        version => 1,
        lines => [
            ([ undef ]) x 4,
            [
                'Date Sold',
                'UPC',
                'Distributor-Provided ID',
                'Artist',
                'Title',
                'Cost',
                'Date Posted On Insound',
            ]
        ]
    },
    # Insound V 2
    { service => Client::Service::DSP_INSOUND,
        version => 2,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Date Sold','UPC','Artist','Title','Cost','Date Posted On Insound'],
        ],
    },
    # Destra Music
    {
        service => Client::Service::DSP_DESTRAMUSIC,
        version => 1,
        lines => [
            [
                'Vendor Code',
                'Vendor Name',
                'Vendor Country Code',
                'UPC',
                'ISRC',
                'Artist Name',
                'Track Title',
                'Album Title',
                'Qty',
                'Transaction Date',
                'Transaction No',
                'Product Origin ID',
                'Product ID',
                'Price',
                'PPD',
                'Additional Revenue',
                'Label Share Additional Rev.',
                'Label Share Ex',
                'Currency',
                'Consumer Country Code',
                'PostCode',
                'Transaction Type',
                'Sale Type',
                'Duration Of Transaction',
                'Volume of Data Transferred',
                'Distribution Channel',
                'Sound Scan ID',
                'Length of Recording',
                'LabelGroup',
                'Digital ID',
                'Number of burns',
                'Number times Played',
                'Total Permanent Downloads',
                'Total Tethered Downloads',
                'Total Streamed Tracks',
            ]
        ]
    },
    # Moontaxi (just the NON-standard version!)
    {
        service => Client::Service::DSP_MOONTAXI,
        version => 1,
        sheet => 2,
        lines =>
        [
            ['Date', 'Quantity', 'Price', 'Amount', 'Rate', 'Total', 'Selection Number', 'Album Artist', 'Album Title', 'Label']
        ]
    },
    # google
    {
        service => Client::Service::DSP_GOOGLE,
        version => 1,
        lines =>
        [
            ['Titles', 'Total', 'Payment'],
        ]
    },
    # merlin (FB17408) - Originally Google version 5, this is the Google version 3 header with an extra column at end and MERLIN as partner.
    {
        service => Client::Service::DSP_MERLIN,
        version => 16,
        match_on_any_row => 1,
        lines =>
        [
            [undef],
            ['MERLIN'],
['Sale_Date', 'Consumer_Country', 'Consumer_Zip_Code', 'Album_or_Track', 'Quantity_Purchased', 'Quantity_Returned', 'UPC', 'ISRC', 'Artist', 'Track', 'Album', 'Content_Provider', 'Label', 'Retail_Price', 'Retail_Currency', 'Wholesale_Price', 'Wholesale_Currency', 'Partner_Revenue_Paid', 'Partner_Revenue_Currency', 'Partner_Revenue_USD|USD_Amount']
        ]
    },

     # Merlin (FB16651) - SKINT - same as Google v3
	{ service => Client::Service::DSP_MERLIN,
       version => 12,
       match_on_any_row => 1,
       lines =>
       [
	       [undef],
		   ['MERLIN'],
           [
'Sale_Date', 'Consumer_Country', 'Consumer_Zip_Code', 'Album_or_Track', 'Quantity_Purchased', 'Quantity_Returned', 'UPC', 'ISRC', 'Artist', 'Track', 'Album', 'Content_Provider', 'Label', 'Retail_Price', 'Retail_Currency', 'Wholesale_Price', 'Wholesale_Currency', 'Partner_Revenue_Paid', 'Partner_Revenue_Currency'
           ],
        ],
	},

     # CDBaby (FB7541)
	{ service => Client::Service::DSP_CDBABY,
       version => 1,
       match_on_any_row => 1,
       lines =>
       [
           [
'Report Date', 'Sales Date', 'Quantity', 'Price', 'Subtotal', 'Isrc', 'Barcode', 'CDBabySku', 'Album Name', 'Artist Name', 'Track Name', 'Partner Name', 'Transaction Type', 'Delivery Country'
           ],
        ],
	},

     # Remark (FB7965)
	{ service => Client::Service::DSP_REMARK,
       version => 1,
       match_on_any_row => 1,
       sheet => 'any',
       lines =>
       [
           [
	# The header is in Japanese, but these aren't coming in nicely via the
	# Excel module.  Viewed in Excel, this is what is looks like:
	#  'TERM', 'SERVICE', 'TRACK ID', 'ISRC CODE', 'TRACK TITLE', 'ARTIST', 'TYPE OF USE', 'UNIT PRICE', 'CARRIER FEE', 'SUBLICENSE FEE', 'ROYALTY PRICE', 'TOTAL\(DOWNLOADS\)', 'TOTAL\(PAYMENT AMOUNT\)'
	# Here are the header values as seen in PreParse:
	#
	'\x{ff34}\x{ff25}\x{ff32}\x{ff2d}', '\x{ff33}\x{ff25}\x{ff32}\x{ff36}\x{ff29}\x{ff23}\x{ff25}',  # TERM,  SERVICE
	'\x{ff34}\x{ff32}\x{ff21}\x{ff23}\x{ff2b}\x{3000}\x{ff29}\x{ff24}', # TRACK ID
	'\x{ff29}\x{ff33}\x{ff32}\x{ff23}\x{3000}\x{ff23}\x{ff2f}\x{ff24}\x{ff25}',  # ISRC CODE
	'\x{ff34}\x{ff32}\x{ff21}\x{ff23}\x{ff2b}\x{3000}\x{ff34}\x{ff29}\x{ff34}\x{ff2c}\x{ff25}', # TRACK TITLE
	'\x{ff21}\x{ff32}\x{ff34}\x{ff29}\x{ff33}\x{ff34}', # ARTIST
	'\x{ff34}\x{ff39}\x{ff30}\x{ff25}\x{3000}\x{ff2f}\x{ff26}\x{3000}\x{ff35}\x{ff33}\x{ff25}', # TYPE OF USE
	'\x{ff35}\x{ff2e}\x{ff29}\x{ff34}\x{3000}\x{ff30}\x{ff32}\x{ff29}\x{ff23}\x{ff25}', # UNIT PRICE
	'\x{ff23}\x{ff21}\x{ff32}\x{ff32}\x{ff29}\x{ff25}\x{ff32}\x{3000}\x{ff26}\x{ff25}\x{ff25}', # CARRIER FEE
	'\x{ff33}\x{ff35}\x{ff22}\x{ff2c}\x{ff29}\x{ff23}\x{ff25}\x{ff2e}\x{ff33}\x{ff25}\x{3000}\x{ff26}\x{ff25}\x{ff25}', # SUBLICENSE FEE
	'\x{ff32}\x{ff2f}\x{ff39}\x{ff21}\x{ff2c}\x{ff34}\x{ff39}\x{3000}\x{ff30}\x{ff32}\x{ff29}\x{ff23}\x{ff25}', # ROYALTY PRICE
	'\x{ff34}\x{ff2f}\x{ff34}\x{ff21}\x{ff2c}\x{ff08}\x{ff24}\x{ff2f}\x{ff37}\x{ff2e}\x{ff2c}\x{ff2f}\x{ff21}\x{ff24}\x{ff33}\x{ff09}', # TOTAL(DOWNLOADS)
	'\x{ff34}\x{ff2f}\x{ff34}\x{ff21}\x{ff2c}\x{ff08}\x{ff30}\x{ff21}\x{ff39}\x{ff2d}\x{ff25}\x{ff2e}\x{ff34}\x{3000}\x{ff21}\x{ff2d}\x{ff2f}\x{ff35}\x{ff2e}\x{ff34}\x{ff09}' # TOTAL(PAYMENT AMOUNT)
           ],
        ],
	},

    # google music (FB16661)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 3,
        match_on_any_row => 1,
        lines =>
        [
['Sale_Date', 'Consumer_Country', 'Consumer_Zip_Code', 'Album_or_Track', 'Quantity_Purchased', 'Quantity_Returned', 'UPC', 'ISRC', 'Artist', 'Track', 'Album', 'Content_Provider', 'Label', 'Retail_Price', 'Retail_Currency', 'Wholesale_Price', 'Wholesale_Currency', 'Partner_Revenue_Paid', 'Partner_Revenue_Currency']
        ]
    },
    # google music (FB15346)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 2,
        lines =>
        [
            ['Partner_Name', 'Reporting_Region', 'Start_Date', 'End_Date', 'Partner_Album_Sales', 'Partner_Track_Sales',
            'Partner_Album_Preorders', 'Partner_Track_Preorders', 'Partner_Free_Albums', 'Partner_Free_Tracks',
            'Partner_Refund_Amount', 'Partner_Amount_Due\(\$\)']
        ]
    },
    # google music (FB17247)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 4,
        match_on_any_row => 1,
        lines =>
        [
            [
'Partner_Name', 'Reporting_Region', 'Start_Date', 'End_Date', 'Web_Plays_Total', 'Web_Plays_Partner', 'Device_Plays_Total', 'Device_Plays_Partner', 'Downloads_Total', 'Downloads_Partner', 'Active_Users', 'Fee_Pool', 'Money_Due_Partner'
            ]
        ]
    },
    # google music (FB1345)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 6,
        lines =>
        [
            [
'Partner_Name', 'Reporting_Region', 'Reporting_Currency', 'Start_Date', 'End_Date', 'Plays_Total', 'Plays_Partner', 'Subscription_Revenue', 'Subscribers', 'Fee_Pool', 'Money_Due_Partner'
            ],
            [undef],
            [
'Artist', 'Track', 'Album', 'UPC', 'GRID', 'ISRC', 'Partner_Album_ID', 'Partner_Track_ID', 'Content_Provider', 'Label', 'Web_Plays', 'Device_Plays'
            ]
        ]
    },
    # google music (FB2434)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 7,
        lines =>
        [
            ['Start_Date', 'End_Date', 'Reporting_Currency'],
            [undef],
            ['Reporting_Region', 'Artist', 'Track', 'Album', 'UPC', 'GRID', 'ISRC', 'Partner_Album_ID', 'Partner_Track_ID', 'Content_Provider', 'Label', 'Web_Plays', 'Device_Plays', 'Total_Plays', 'Total_Payable_Local_Currency', 'Total_Payable_USD'],
        ]
    },
    # google music (FB2488)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 8,
        lines =>
        [
            ['Start_Date', 'End_Date', 'Reporting[_ ]Currency'],
            [undef],
            [
	    'Reporting_Region', 'Artist', 'Track', 'Album', 'UPC', 'ISRC', 'Partner_Album_ID', 'Partner_Track_ID', 'Content_Provider', 'Label', 'Web_Plays', 'Device_Plays', 'Downloads', 'Weighted Activity', 'Local Currency', 'Track revenue USD'
	    ],
        ]
    },
    # google play TRANS format (their 1.2) (FBoD4502)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 9,
        lines =>
        [
            ['Partner_Name', 'Reporting_Region', 'Start_Date', 'End_Date', 'Partner_Album_Sales', 'Partner_Track_Sales', 'Partner_Free_Albums',
             'Partner_Free_Tracks', 'Partner_Refund_Amount', 'Partner_Revenue', 'Partner_Revenue_Currency', 'Partner_Revenue_Invoiced',
             'Partner_Revenue_Invoiced_Currency', '^$'],
            [undef],
            ['Start_Date', 'End_Date', 'UPC', 'GRID', 'ISRC', 'Custom_ID_1', 'Custom_ID_2', 'Custom_ID_3', 'Custom_ID_4', 'Google_ID', 'Artist',
             'Product_Title', 'Container_Title', 'Content_Provider', 'Label', 'Consumer_Country', 'Device_Type', 'Product_Type', 'Interaction_Type',
             'Count', 'Consumer_Zip_Code', 'Retail_Price', 'Retail_Currency', 'Wholesale_Price', 'Wholesale_Currency', 'Partner_Revenue_Paid',
             'Partner_Revenue_Currency', 'Partner_Revenue_Invoiced', 'Partner_Revenue_Invoiced_Currency']
        ]
    },
    # google music (FB5305)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 10,
        lines =>
        [
            [
'Partner_Name', 'Reporting_Region', 'Reporting_Currency', 'Start_Date', 'End_Date', 'Plays_Total', 'Plays_Partner', 'Subscribers', 'Fee_Pool', 'Money_Due_Partner'
	    ],
            [undef],
            [
'Start_Date', 'End_Date', 'UPC', 'GRID', 'ISRC', 'Custom_ID_1', 'Custom_ID_2', 'Custom_ID_3', 'Custom_ID_4', 'Google_ID', 'Artist', 'Product_Title', 'Container_Title', 'Content_Provider', 'Label', 'Consumer_Country', 'Device_Type', 'Product_Type', 'Interaction_Type', 'Count'
	    ],
        ]
    },
    # google music (FB5565)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 11, # similar to v8
        lines =>
        [
            ['Partner_Name', 'Reporting_Region', 'Start_Date', 'End_Date', 'Plays_Total', 'Money_Due_Partner'],
            [undef],
            [
'Reporting_Region', 'Artist', 'Track', 'Album', 'UPC', 'ISRC', 'Partner_Album_ID', 'Partner_Track_ID', 'Content_Provider', 'Label', 'Web_Plays', 'Device_Plays', 'Downloads', 'Weighted_Activity', 'Amount_Payable_(\w{3})'
	    ],
        ]
    },
    # google music (FB5562)
    {
        service => Client::Service::DSP_GOOGLE,
        version => 12,
        lines =>
        [
            [ 'Partner_Name', 'Reporting_Region', 'Reporting_Currency', 'Start_Date', 'End_Date', 'Plays_Partner', 'Money_Due_Partner' ],
            [undef],
            [
'Reporting_Region', 'Start_Date', 'End_Date', 'UPC', 'GRID', 'ISRC', 'Custom_ID_1', 'Custom_ID_2', 'Custom_ID_3', 'Custom_ID_4', 'Google_ID', 'Artist', 'Product_Title', 'Container_Title', 'Content_Provider', 'Label', 'Consumer_Country', 'Device_Type', 'Product_Type', 'Interaction_Type', 'Count', 'Total_Plays', 'Partner_Revenue_Paid', 'Partner_Revenue_Currency', '(\w{3})_Amount'
	    ],
        ]
    },
    # amazon
    {
        service => Client::Service::DSP_AMAZON,
        version => 1,
        lines => [
            ['ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'Units', 'COST', 'Amount_Due', 'ALBUM_ARTIST', 'ALBUM_NAME', 'Track_Name', 'LABEL_NAME'],
        ]
    },
    # amazon
    {
        service => Client::Service::DSP_AMAZON,
        version => 2,
        lines => [
            [undef], # date range located in A1
            ['ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'Units', 'COST', 'Amount_Due', 'ALBUM_ARTIST', 'ALBUM_NAME', 'Track_Name', 'LABEL_NAME'],
        ]
    },
    # amazon uk
    {
        service => Client::Service::DSP_AMAZON,
        version => 6,
        lines => [
            ['Amazon UK'],
            [undef], # date range located in A1
            ['ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'Units', 'COST', 'Amount_Due', 'ALBUM_ARTIST', 'ALBUM_NAME', 'Track_Name', 'LABEL_NAME'],
        ]
    },
    # amazon uk
    {
        service => Client::Service::DSP_AMAZON,
        version => 6,
        lines => [
            ['Amazon UK'],
            [undef], # date range located in A1
            [undef],
            ['ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'Units', 'COST', 'Amount_Due', 'ALBUM_ARTIST', 'ALBUM_NAME', 'Track_Name', 'LABEL_NAME'],
        ]
    },
    # amazon oseao media group
    {
        service => Client::Service::DSP_AMAZON,
        version => 7,
        lines => [
            [undef],
            [undef], # date range located in A2
            ['ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'Units', 'COST', 'Amount_Due', 'ALBUM_ARTIST', 'ALBUM_NAME', 'Track_Name', 'LABEL_NAME'],
        ]
    },
    # amazon oseao media group
    {
        service => Client::Service::DSP_AMAZON,
        version => 7,
        lines => [
            [undef],
            [undef],
            [undef], # date range located in A2
            ['ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'ALBUM_TRACK', 'Units', 'COST', 'Amount_Due', 'ALBUM_ARTIST', 'ALBUM_NAME', 'Track_Name', 'LABEL_NAME'],
        ]
    },
    # amazon - 2008 Q1 format
    { service => Client::Service::DSP_AMAZON,
        version => 3,
        lines => [
            [undef],
            ['itmclss','album_name','track_name','type','units','roy','total'],
        ],
    },
    # amazon - AudioBee - 2008 Q1 format
    { service => Client::Service::DSP_AMAZON,
        version => 4,
        lines => [
            ([undef]) x 4,
            ['Date of Transaction','External ID','ASIN','Title','Units', 'List\/Dealer Price','Discount','Cost','Total Payment'],
        ],
    },
    #amazon - Linus - 2008 Q3 format
    { service => Client::Service::DSP_AMAZON,
        version => 5,
        lines => [
            ([undef]) x 11,
             ['Date of Transaction', 'External ID', 'ASIN', 'Title', 'List/Dealer Price', 'Discount', 'Units', 'Cost', 'Amount'],
        ],
    },
    #amazon CreateSpace physical sales
    { service => Client::Service::DSP_AMAZON,
        version => 8,
        lines => [
            ['Sale Date', 'Title ID', 'ASIN', 'UPC', 'External SKU', 'Name',
            'Primary Artist', 'Channel', 'Retail Price', 'Sale Price',
            'Sales', 'Royalties', 'Total Sales',]
        ],
    },
    # Amazon Physical - ACC (FB2264)
    { service => Client::Service::DSP_AMAZON,
        version => 9,
        match_on_any_row => 1,
        lines => [
            [
'date\/time', 'settlement id', 'type', 'order id', 'sku', 'description', 'quantity', 'marketplace', 'fulfillment', 'order city', 'order state', 'order postal', 'product sales', 'shipping credits', 'gift wrap credits', 'promotional rebates', 'sales tax collected', 'selling fees', 'fba fees', 'other transaction fees', 'other', 'total'
	    ]
        ],
    },
    # Amazon Digital - CM (FB9132).  Alternate column headings (FB19815)
    { service => Client::Service::DSP_AMAZON,
        version => 10,
        match_on_any_row => 1,
        lines => [
            [
'VENDOR_CODE', 'TERRITORY_CODE', 'START_DATE', 'END_DATE', 'UPC', 'ISRC', 'PRODUCT_TYPE_ID', 'ALBUM_ASIN', 'TRACK_ASIN', '(ALBUM_VENDOR|ALBM_VENDR)_PRODUCT_IDENTIFIER', '(TRACK_VENDOR|TRCK_VENDR)_PRODUCT_IDENTIFIER', 'ALBUM_NAME', 'TRACK_NAME', 'ARTIST_NAME', 'LABEL_NAME', 'UNITS', 'COST', 'COST_CURRENCY', 'AMOUNT', 'SALE_RETURN_FLAG', 'SALE_TYPE'
	    ]
        ],
    },
    # Audible book service
    { service => Client::Service::DSP_AUDIBLE,
        version => 1,
        lines => [
            [undef,undef,undef,undef,'ALC Purchases','ALC Purchases','ALC Purchases','AL Purchases','AL Purchases','AL Purchases','Grand Total','Grand Total','Grand Total'],
        ['Royalty Earner','Product Id','Product Name','Author Name','Quantity','Net Sales','Royalty Paid','Quantity','Net Sales','Royalty Paid','Quantity','Net Sales','Royalty Paid'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 1,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            [undef],
            ['Name','ID','Label','Number of downloads'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 1,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            [undef],
            ['Name','ID','Label','Author','Number of downloads'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 1,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            ['Name','ID','Label','Author','Number of downloads'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 1,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            [undef],
            [undef],
            ['Name','ID','Label','Author','Number of downloads'],
        ],
    },
    # Musiwave
    { service => Client::Service::DSP_MUSIWAVE,
        version => 4,
        sheet => 1,
        lines => [
            ['COUNTRY','COMPANY','PORTAL ID','PORTAL NAME','SERVICE CODE','SERVICE NAME','SERVCIE ID','REF\. TRANSACTION','LABEL NAME','UNITS'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 2,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            [undef],
            ['Name','Artist','ID','Label','ISRC','Authors'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 2,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            [undef],
            [undef],
            ['Name','Artist','ID','Label','ISRC','Authors'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 2,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            [undef],
            [undef],
            ['Name','Artist','ID','Label','ISRC','Author'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 2,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            [undef,'Reporting'],
            [undef],
            [undef],
            [undef],
            [undef,'MUSITONES'],
            ['Name','Artist','ID','Label','ISRC','Author'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 2,
        sheet => 1,
        lines => [
            ([undef]) x 8,
            ['Service name :','MUSITONES'],
            ['Name','Artist','ID','Label','ISRC','Author'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 2,
        sheet => 0,
        lines => [
            ['Sanctuary Fees / Download Musitones'],
            [undef],
            [undef,'Period'],
            ([undef]) x 7,
            ['Download Musitones services'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 3,
        sheet   => 1,
        lines => [
            ([undef]) x 7,
            [undef,undef,'MUSITONES'],
            ['Title','ID','ARTIST','LABEL','ISRC','AUTHOR'],
        ],
    },
    #Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 4,
        sheet   => 1,
        lines => [
            ['COUNTRY','COMPANY','PORTAL ID','PORTAL NAME','SERVICE CODE','SERVICE NAME'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 5,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            ['FROM'],
            ['TO'],
            ['SERVICE'],
            ['TITLE','ID','ARTIST','LABEL'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 6,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            ['FROM',undef],
            ['TO',undef],
            [undef],
            [undef],
            ['LICENSOR','ARTIST','TITLE'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 7,
        sheet => 1,
        lines => [
            ['Portals',undef,'Labels','Artists','Title','Count'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 8,
        sheet => 1,
        lines => [
            ['Services','Musitones'],
            ['From',undef],
            ['To',undef],
            [undef],
            [undef],
            ['Portail','Name','Title','Artist','Labels','Count'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 9,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            ([undef]) x 4,
            ['PORTAL NAME','PORTAL ID','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 9,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            ([undef]) x 2,
            ['PORTAL NAME','PORTAL ID','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 9,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 9,
        sheet => 2,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 10,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            ([undef]) x 3,
            ['PORTAL NAME','PORTAL ID','PRODUCT ID','ISRC','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 10,
        sheet => 2,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','PRODUCT ID','ISRC','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 10,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','PRODUCT ID','ISRC','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 10,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','PRODUCT ID','ISRC','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 11,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','ISRC','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },
    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 11,
        sheet => 1,
        lines => [
            ['SERVICES','MUSITONES'],
            ['FROM',undef],
            ['TO',undef],
            [undef],
            [undef],
            ['PORTAL NAME','PORTAL ID','ISRC','TRACK NAME','ARTIST NAME','LABEL NAME','COUNT'],
        ],
    },

    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 13,
        sheet => 1,
        match_on_any_row => 1,
        lines => [
            ['PORTAL NAME', 'PORTAL ID', 'PRODUCT ID', 'ISRC', 'Code CR',
            'TRACK NAME', 'ARTIST NAME', 'LABEL NAME', 'COUNT'],
        ],
    },

    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 14,
        match_on_any_row => 1,
        lines => [
            ['ProductID', 'Track Title', 'Artist', 'Track Isrc', 'Album Title', 'Album Artist', 'Album Upc', 'Label Name', 'Track Number', 'Provider Comp Id', 'Retailer Name', 'Portable Offer Indicator', 'Territory Code', 'Currency Code', 'Product Type', 'Wholesale Price' ],
        ],
    },

    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 15,
        match_on_any_row => 1,
        lines => [
            ['ProductID', 'Track Title', 'Artist Track', 'Isrc', 'Album Title', 'Album Artist', 'Album Upc', 'Label Name', 'Track Number',
	    'Provider Comp Id', 'Retailer Name', 'Portable Offer Indicator', 'Territory Code', 'Currency Code', 'Product Type', 'Wholesale Price' ],
       ],
    },

    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 16,
        match_on_any_row => 1,
        lines => [
            ['Component Id', 'Product Title', 'Artist', 'Track Isrc', 'Parent Title', 'Parent Artist', 'Album Upc', 'Licensor Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Currency Code', 'Product Type', 'Wholesale Price', 'Retail Price', 'Number of Transactions', 'Usage Type', 'Total Wholesale Price', 'Total Retail Price'],
       ],
    },

    # Musiwave distribution
    { service => Client::Service::DSP_MUSIWAVE,
        version => 17,
        match_on_any_row => 1,
        lines => [
            ['Component Id', 'Track Title', 'Artist', 'Track Isrc', 'Album Title', 'Album Artist', 'Album Upc', 'Licensor Name', 'Track Number', 'Retailer Name', 'Territory Code', 'Product Type', 'Number of Transactions', 'Usage Type', 'SubscriptionName'],
       ],
    },

    # WaxPoetics
    { service => Client::Service::DSP_WAXPOETICS,
        version => 1,
		file_name => 'waxpoetics',
        lines =>
        [
          ['LABEL', 'TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE',
		   'PRODUCT_CATALOG_NUMBER', 'UNIT_TYPE', 'QUANTITY', 'UNIT_PRICE', 'PAID_PRICE',
		   'PAID_TOTAL', 'TRANSACTION_TYPE', 'FORMAT_IDENTIFIER', 'TERRITORY',
		   'TRANSACTION_DATE', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
        ],
    },

    # Dance Tracks Digital
    { service => Client::Service::DSP_DANCETRACKS,
        version => 1,
        lines => [
            ['TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE', 'PRODUCT_CATALOG_NUMBER', 'QUANTITY', 'PAID_PRICE', 'TRANSACTION_TYPE', 'FORMAT_IDENTIFIER', 'TRANSACTION_DATE', 'UNIT_PRICE', 'LABEL', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
            [(undef) x 13, 'Dancetracks Digital'],
        ],
    },
    # Dance Tracks Digital
    { service => Client::Service::DSP_DANCETRACKS,
        version => 2,
        lines => [
            ['Label','Artist','Release','Track','ISRC','UPC','VendorID','Units','Gross','Payment'],
        ],
    },
    # Dance Tracks Digital (just like other music v2)
    { service => Client::Service::DSP_DANCETRACKS,
        version => 3,
        lines => [
            ['LABEL', 'TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE', 'PRODUCT_CATALOG_NUMBER', 'UNIT_TYPE', 'QUANTITY', 'UNIT_PRICE', 'PAID_PRICE', 'PAID_TOTAL', 'TRANSACTION_TYPE', 'FORMAT_IDENTIFIER', 'TERRITORY', 'TRANSACTION_DATE', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
            [(undef) x 16, 'Dancetracks Digital'],
        ],
    },
    # TurnTable Lab (FB12363)
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 6,
        lines => [
            ['LABEL', 'TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE',
            'PRODUCT_CATALOG_NUMBER', 'UNIT_TYPE', 'QUANTITY', 'UNIT_PRICE',
            'PAID_PRICE', 'PAID_TOTAL', 'TRANSACTION_TYPE',
            'FORMAT_IDENTIFIER', 'TERRITORY', 'TRANSACTION_DATE', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
            [(undef) x 16, 'Turntable Lab Digital'],
        ],
    },
    # ElWatusi (looks like Dance Tracks v4, but per FB13749 it's not)
    { service => Client::Service::DSP_ELWATUSI,
        version => 1,
        lines => [
            ['LABEL', 'TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE',
            'PRODUCT_CATALOG_NUMBER', 'UNIT_TYPE', 'QUANTITY', 'UNIT_PRICE',
            'PAID_PRICE', 'PAID_TOTAL', 'TRANSACTION_TYPE',
            'FORMAT_IDENTIFIER', 'TERRITORY', 'TRANSACTION_DATE', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
            [(undef) x 16, 'elWatusi'],
        ],
    },
    # Dance Tracks Digital (just like other music v2)
    { service => Client::Service::DSP_DANCETRACKS,
        version => 4,
        lines => [
            ['LABEL', 'TRACK_ISRC_CODE', 'PRODUCT_UPC', 'TRACK_ARTIST', 'TRACK_TITLE',
            'PRODUCT_CATALOG_NUMBER', 'UNIT_TYPE', 'QUANTITY', 'UNIT_PRICE',
            'PAID_PRICE', 'PAID_TOTAL', 'TRANSACTION_TYPE',
            'FORMAT_IDENTIFIER', 'TERRITORY', 'TRANSACTION_DATE', 'CURRENCY_CODE', 'DMS', 'MECHANICALS'],
        ],
    },
    # DMX06 File
    { service => Client::Service::DSP_DMX,
        version => 3,
        lines => [
            ['Payee','Sub-Label','Song Title','Artist','Ext'],
        ],
    },
    # NOKIA Sales Files via La Culpa
    { service => Client::Service::DSP_NOKIA,
        version => 1,
        lines => [
            ['PRHId','VendorName','TransType','TransDateTime','Artist','Title','ISRCCode','UPCCode','LabelName','CatalogNumber','OrderId','OrderRowId','SubPeriodId','VendorCountryCode','PaymentValue','PaymentValueCurrencyCode'],
        ],
    },
     # NOKIA Sales Files via La Culpa v2
    { service => Client::Service::DSP_NOKIA,
        version => 2,
        lines => [
            ['PRHID', 'Vendor Name', 'Trans Type', 'TransDateTime', 'Artist', 'Title', 'ISRC Code', 'UPC Code', 'Label Name', 'CatalogNumber', 'OrderID', 'Vendor Country Code', 'Payment Value', 'Payment Value Currency Code'],
        ],
    },
     # NOKIA Sales Files via La Culpa v2
    { service => Client::Service::DSP_NOKIA,
        version => 3,
        lines => [
            [undef],
            ['PRHID', 'Vendor Name', 'Trans Type', 'Artist', 'Title', 'Track Length', 'Composer', 'Author', 'ISRCCode', 'UPCCode', 'LabelName', 'CatalogNumber', 'VendorCountryCode', 'Track count', 'Download count', 'Rights Holders Total tracks downloaded', 'Revenue share downloaded', 'Revenue share per track'],
        ],
    },
     #NOKIA Sales Files MoS
    { service => Client::Service::DSP_NOKIA,
        version => 3,
        lines => [
            [undef],
            ['PRHID', 'Vendor Name', 'Trans Type', 'Artist', 'Title', 'Track Length', 'Composer', 'Author', 'ISRCCode', 'UPCCode', 'LabelName', 'CatalogNumber', 'VendorCountryCode', 'Track count', 'Stream count', 'Total tracks streamed', 'Revenue share Streamed', 'Revenue share per track'],
        ],
    },
    #NOKIA Sales Files MoS
    { service => Client::Service::DSP_NOKIA,
        version => 4,
        lines => [
            [undef],
            ['PRHID', 'Vendor Name', 'Trans Type', 'Artist', 'Title',
            'Track Length', 'Composer', 'Author', 'ISRCCode', 'UPCCode',
            'LabelName', 'CatalogNumber', 'VendorCountryCode', 'Track count',
            'Download count', 'Rights Holders Total tracks downloaded'],
        ],
    },
    #NOKIA Sales Files MoS
    { service => Client::Service::DSP_NOKIA,
        version => 5,
        lines => [
            ['PRHID', 'Vendor Name', 'Trans Type', 'Artist', 'Title',
            'Track Length', 'Composer', 'Author', 'ISRC Code', 'UPC Code',
            'Label Product ID', 'Label Name', 'CatalogNumber', 'Vendor Country Code', 'Track Count',
            'Download Count', (undef)],
        ],
    },
    #NOKIA Sales Files MoS
    { service => Client::Service::DSP_NOKIA,
        version => 6,
        lines => [
            ['PRHID', 'Vendor Name', 'Trans Type', 'TransDateTime', 'Artist', 'Title',
            'ISRC Code', 'UPC Code', 'Label Product ID', 'Label Name - SUB LABEL',
            'CatalogNumber', 'OrderID', 'Vendor Country Code', 'Payment Value',
            'Payment Value Currency Code'],
        ],
    },
    #NOKIA Sales Files MoS
    { service => Client::Service::DSP_NOKIA,
        version => 7,
        lines => [
            ['PRHID', 'Vendor Name', 'Trans Type', 'Artist', 'Title',
             'Track Length', 'Composer', 'Author', 'ISRC Code', 'UPC Code',
             'Label Product ID', 'Label Name', 'Catalog Number', 'Vendor Country Code', 'Track Count',
             'Download Count', 'Rights Holders Total Tracks Downloaded', 'Revenue Share Downloaded', 'Revenue Share Per Track'],
        ],
    },
    # Nokia - STHoldings (FB1622)
    { service => Client::Service::DSP_NOKIA,
        version => 8,
        lines => [
                ['PRHID', 'Vendor Name', 'Trans Type', 'Device type', 'Transaction Period', 'Artist', 'Title', 'ISRC Code', 'UPC Code', 'Label Product ID', 'Label Name - SUB LABEL', 'CatalogNumber', 'Vendor Country Code', 'Payment Value Digital Radio Streams', 'Total Payment Value Digital Radio Streams', 'Payment Value Currency Code', 'Total Payment Value In Settlement Currency', 'Settlement Currency Code', 'Total Number of Digital Radio Streams'],
        ],
    },
    # Nokia - STHoldings (FB1625)
    { service => Client::Service::DSP_NOKIA,
        version => 9,
        lines => [
                ['PRHID', 'Vendor Name', 'Device Type', 'Trans Type', 'TransDate', 'Artist', 'Title', 'ISRC Code', 'UPC Code', 'Label product id', 'Label Name - SUB LABEL', 'Vendor Country Code', 'Settlement currency ISO3 code', 'PremiumRadioRoyaltyPerStream', 'Total Number of Digital Radio Streams', 'TotalPremiumRadioRoyalty'
		],
        ],
    },
    # Arvato "Arvato Totals" sales files
    { service => Client::Service::DSP_ARVATO,
        version => 1,
        sheet => 1,
        lines => [
            ['Partner','Year','Month','ProductID','Title','Artist','Author','ProductType','Count','DistributionType',undef,'Share',undef,undef,'Song Code','Affiliate'],
        ],
    },
    # Avartp "GNAB" sales files
    { service => Client::Service::DSP_ARVATO,
        version => 9,
        sheet => 0,
        lines => [
            ['Dsp Key','Date Of Record','Record Type','Report Start Date','Report End Date','Vendor Retailer Name','Quantity','Date Of Download','Service Type Key Id','Licence Partner','Article Id','Grid','Isrc','Ean','Participant Full Name','Track Title','Price Code','End Customer Country Key','Reseller Currency Key','Vat Tax','Wholesale Price Net','Wholesale Price Net Sum','End Customer Sales Price Gross','End Customer Sales Price Gross Sum'],
        ],
    },
    # Avartp "GNAB" sales files
    { service => Client::Service::DSP_ARVATO,
        version => 10,
        sheet => 0,
        lines => [            ['Dsp Key','Date Of Record','Record Type','Report Start Date','Report End Date','Vendor Retailer Name','Quantity','Date Of Download','Service Type Key Id','Licence Partner','Article Id','Grid','Isrc','Ean','Participant Full Name','Track Title','Price Code','End Customer Country Key','Reseller Currency Key','Vat Tax','End Customer Sales Price Gross','Ecsp Gross Sum','Wholesale Price Net','Wholesale Price Net Sum'],
        ],
    },
    # Avartp "GNAB" sales files
    { service => Client::Service::DSP_ARVATO,
        version => 2,
        sheet => 0,
        lines => [
            ['Dsp Key','Date Of Record','Record Type','Report Start Date','Report End Date','Vendor Retailer Name','Quantity','Date Of Download','Service Type Key Id','Licence Partner','Article Id','Grid','Isrc','Ean','Participant Full Name','Track Title','Price Code','End Customer Country Key','Reseller Currency Key','Vat Tax',undef,undef,undef,undef],
        ],
    },
    # Arvato "Report_AOL_MR_Sanctuary" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 3,
        sheet => 0,
        lines => [
            ['Year','Month','ProductID','Title','Artist','Author','ProductType','Count','DistributionType','Sales Price','Share','Revenue Share','Revenue Share','Song Code'],
        ],
    },
    # Arvato "Report_Vodafone_DE_Sanctuary" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 4,
        sheet => 0,
        lines => [
            ['Year','Month','ProductID','Title','Artist','Author','ProductType','Count','DistributionType','Sales Price'],
        ],
    },
    # Arvato "Sanctuary Records_T-Mobile_Int._(SKK&UK)" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 5,
        sheet => 1,
        lines => [
            ['T-Mobile Caller Tunes'],
            ([undef]) x 3,
            [undef,'Artist','Tune','Label','Transaction','Sales price net','Rev\.-Share EURO'],
        ],
    },
    # Arvato "Sanctuary_Mobilkom_AT" and "Sanctuary_Proximus" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 6,
        sheet => 1,
        lines => [
            ['Ring'],
            ([undef]) x 3,
            ['Article-ID','artistname','articlename','Label','Ergebnis','Sales Price','Rev\.-Share'],
        ],
    },
    # Arvato "Sanctuary_Swisscom_RingBackTones" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 7,
        sheet => 1,
        lines => [
            ['Ring'],
            ([undef]) x 3,
            [undef,'Artist','Title','Label','Transaction','Sales price net CHF','Rev\.-Share EURO'],
        ],
    },
    # Arvato "Sanctuary_T-Mobile_Int.(HU)" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 7,
        sheet => 1,
        lines => [
            ['T-Mobile'],
            ([undef]) x 3,
            [undef,'Artist','Tune','Label','Transaction','Revenue','Rev\.-Share EURO'],
        ],
    },
    # Arvato "Sanctuary_T-Mobile" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 8,
        sheet => 1,
        lines => [
            ['T-Mobile'],
            ([undef]) x 3,
            ['Product-Id','artistname','articlename','Label','Ergebnis','Sales Price','Rev\.-Share'],
        ],
    },
    # Arvato "Sanctuary_T-Mobile" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 8,
        sheet => 1,
        lines => [
            ['T-Mobile'],
            ([undef]) x 2,
            ['Product-Id','artistname','articlename','Label','Ergebnis','Sales Price','Rev\.-Share'],
        ],
    },
     # Arvato "Sanctuary_VF-RUTs" sales file
    { service => Client::Service::DSP_ARVATO,
        version => 8,
        sheet => 1,
        lines => [
            ['Abrufe VF RUT'],
            ([undef]) x 2,
            ['Product-Id','artistname','articlename','Label','Ergebnis','Sales Price','Rev\.-Share'],
        ],
    },
    # Sanctuary UK - FONTANA
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 1,
        sheet => 0,
        lines => [
            ['six degrees'],
            [undef],
            [undef],
            ['Music Line','Sales Channel','Partner','Sales Type','Sold As','Album Artist','Album Title','Track Artist','Track Title','Physical Album Release Date','ISRC','Units','Revenue'],
        ],
    },
    # Sanctuary UK - FONTANA
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 2,
        sheet => 0,
        lines => [
            ['Super Label','Music Line','Sales Channel','Partner','Sales Type','Sold As','Album Artist','Album Title','Track Artist','Track Title','ISRC','Physical Album Release Date','Units','Revenue','File Date'],
            ['six degrees'],
        ],
    },
    # Sanctuary UK - FONTANA
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 3,
        sheet => 0,
        lines => [
            [undef],
            ['Music Line','Sales Channel','Partner','Sales Type','Sold As','Album Artist','Album Title','Track Artist','Track Title','Physical Album Release Date','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue','Units','Revenue'],
        ],
    },
    # Fontana Digital - FB18396
    { service => Client::Service::DSP_FONTANADIGITAL,
        version => 11,
        sheet => 0,
        lines => [
            [
'Reporting Unit', 'Period', 'Super Label', 'Music Line DESC', 'Music Line CODE', 'Sales Channel DESC', 'Sales Channel CODE', 'National Account Detail DESC', 'National Account Detail ID', 'Sales Type', 'Sold As DESC', 'Sold As CODE', 'Reporting Project DESC', 'Reporting Project ID', 'UPC', 'Album TITLE', 'Album ARTIST', 'Track TITLE', 'Track ARTIST', 'ISRC', 'Product Latest Release Date', 'Product Original Release Date', 'Units', 'Amount'
	    ],
        ],
    },
    # Gray V Sanctuary UK
    { service => Client::Service::DSP_GRAYV,
        version => 2,
        sheet => 0,
        lines => [
            ['Distribution','Royalty','Extended Price','Artist','Title'],
        ],
    },
	# Gray V (same as v1, but without 'Country of Sale' column)
	{ service => Client::Service::DSP_GRAYV,
	  version => 3,
	  lines => [
		['Count', 'Start Date', 'End Date', 'Plays', 'Royalty', 'Extended Price', 'Artist', 'Title', 'Label', '^$']
	  ]
	},
    # Kontor format 1 -> 2005 1Q, 2Q
    { service => Client::Service::DSP_KONTOR,
        version => 1,
        sheet => 0,
        lines => [
            ['CUST\.NO\.','ACC\.NO\.','SUB-ACC','ARTIST','TITLE','DISTRIBUTOR','TYPE','TERRITORY','ISRC\/EAN\/UPC','SALES PERIOD \[YEAR-MONTH\]','UNITS','INCOME PER PIECE \[EUR\]','TOTAL INCOME \[EUR\]','RETAIL PRICE \[EUR\]','COPYRIGHT SHARE','COPYRIGHT VALUE\/PIECE \[EUR\]','TOTAL COPYRIGHT VALUE \[EUR\]','LABEL SHARE','ROYALTY AMOUNT LABEL \[EUR\]','PAYMENT LABEL \[EUR\]'],
        ],
    },
    # Kontor format 2 -> 2005 3Q,4QA
    { service => Client::Service::DSP_KONTOR,
        version => 2,
        sheet => 3,
        lines => [
            ['CUST\.NO\.','ACC\.NO\.','SUB-ACC','ARTIST','TITLE','DISTRIBUTOR','TYPE','TERRITORY','ISRC\/EAN\/UPC','SALES PERIOD \[YEAR-MONTH\]','UNITS','INCOME PER PIECE \[EUR\]','TOTAL INCOME \[EUR\]','RETAIL PRICE \[EUR\]','COPYRIGHT SHARE','COPYRIGHT VALUE\/PIECE \[EUR\]','TOTAL COPYRIGHT VALUE \[EUR\]','LABEL SHARE','ROYALTY AMOUNT LABEL \[EUR\]','PAYMENT LABEL \[EUR\]','LABELKZ']
        ],
    },
    # Kontor format 3 -> 2005 4QB
    { service => Client::Service::DSP_KONTOR,
        version => 3,
        sheet => 2,
        lines => [
            ['CUST\.NO\.','ACC\.NO\.','SUB-ACC','ARTIST','TITLE','DISTRIBUTOR','TYPE','TERRITORY','ISRC\/EAN\/UPC','SALES PERIOD','UNITS','INCOME PER PIECE \[EUR\]','TOTAL INCOME \[EUR\]','RETAIL PRICE \[EUR\]','COPYRIGHT SHARE','COPYRIGHT VALUE\/PIECE \[EUR\]','TOTAL COPYRIGHT VALUE \[EUR\]','LABEL SHARE','ROYALTY AMOUNT LABEL \[EUR\]','PAYMENT LABEL \[EUR\]','LABELKZ','WV',undef]
        ],
    },
    # Kontor format 4 -> 2006 1Q
    { service => Client::Service::DSP_KONTOR,
        version => 4,
        sheet => 0,
        lines => [
            ([undef]) x 8,
            ['Unterkonto','Labelname','ISRC','EAN\/UPC','Artist','Produkttitel','Werktitel','Lizenznehmer','Sub-Lizenznehmer','Format','Vertriebsweg','Vertriebsgebiet','Verkaufsperiode','HAP','Anteil Kunde \%',undef,'Abrechnungsmenge',undef,'Lizenzsatz Kunde \%','Lizenzbetrag vor GEMA','Endverbraucherpreis \(EVP\)','GEMA-Lizenzsatz \%','GEMA-Basis','GEMA-Mindestlizenz pro Track','Anz.Werke','GEMA-Lizenzwert \(LZW\)','GEMA-Betrag VOLL','GEMA-MODE','GEMA-Anteil Kunde \%','GEMA-LZW Kunde','GEMA-Betrag Kunde','Lizenzbetrag Kunde']
        ],
    },
    # Kontor format 5 -> 2006 2Q
    { service => Client::Service::DSP_KONTOR,
        version => 5,
        sheet => 0,
        lines => [
            ([undef]) x 8,
            ['Sub-Account No\.','Labelname','ISRC','EAN\/UPC','Artist','Producttitle','Tracktitle','Licensee','Outletname','Format','Distribution Channel','Territory','Sales Period','PPD','Share Customer \%','Net value per unit','Units','Net Revenue','Royalty Rate Customer','Roy\.Amount before Copy\. Ded\.','End Consumer Price \(EVP\)','GEMA-Roy.Rate \%','GEMA-Base','GEMA-minimum roy\. value per unit','no\.of tracks','GEMA-roy\.value per unit','GEMA-roy.amount 100\%','GEMA-mode','GEMA-share Customer \%','GEMA-roy\.value per unit Customer','GEMA-roy\.amount Customer','Royalty Amount Customer']
        ],
    },
    # ioda with commissions
	{ service => Client::Service::DSP_IODA,
	  version => 2,
      match_on_any_row => 1,
	  lines => [
		['Service Name', 'Region', 'Year', 'Period', 'Label', 'Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Sale Format', 'Delivery Type', 'Unit Count', 'Unit Price', 'Credits / Returns', 'Gross'],
	  ]
	},
    # ioda with commissions - same as above but with country
	{ service => Client::Service::DSP_IODA,
	  version => 3,
      match_on_any_row => 1,
	  lines => [
		['Service Name', 'Region', 'Country', 'Year', 'Period', 'Label', 'Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Sale Format', 'Delivery Type', 'Unit Count', 'Unit Price', 'Credits / Returns', 'Gross'],
	  ]
	},
    # ioda with commissions - same as above but with country NOW .TAB FILE altered header
    { service => Client::Service::DSP_IODA,
      version => 4,
      match_on_any_row => 1,
      lines => [
        ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Label', 'Track Artist', 'Release Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Sale Format', 'Delivery Type', 'Unit Count', 'Unit Price', 'Credits/Returns', 'Gross'],
      ]
    },
    # ioda with commissions - same as above but with country NOW .TAB FILE altered header
    { service => Client::Service::DSP_IODA,
      version => 4,
      match_on_any_row => 1,
      lines => [
        ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID','Release Name','UPC','Track Name','ISRC','Sale Format','Delivery Type','Unit Count','Unit Price','Credits\/ Returns','Gross',undef,undef,undef,undef,undef],
      ]
    },
    # IODA 2008
    { service => Client::Service::DSP_IODA,
        version => 5,
        sheet => 0,
        lines => [
            [undef],
            [undef],
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID!','Release Name','UPC','Track Name','ISRC','Sale Format','Delivery Type',undef,'Unit Count',undef,'Original Currency Code','Unit Price','Credits\/Returns','Gross','Net',undef,'Exchange Rate',undef,'Preferred Currency Code','Unit Price','Credits\/Returns','Gross','Net'],
        ],
    },
    # IODA 2008 2nd qtr
    { service => Client::Service::DSP_IODA,
        version => 6,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['Service Name', 'Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID','Release Name','UPC','Track Name','ISRC','Sale Format','Delivery Type',undef,'Unit Count',undef,'Original Currency Code','Unit Price','Credits\/Returns','Gross',undef,'Exchange Rate',undef,'Preferred Currency Code','Unit Price','Credits\/Returns','Gross'],
        ],
    },
    # IODA 2008
    { service => Client::Service::DSP_IODA,
        version => 7,
        sheet => 0,
        lines => [
            [undef],
            [undef],
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID!','Release Name','UPC','Track Name','ISRC','Sale Format','Delivery Type',undef,'Unit Count',undef,'Original Currency Code','Unit Price','Credits\/Returns','Retail Sales','Gross','Net',undef,'Exchange Rate',undef,'Preferred Currency Code','Unit Price','Credits\/Returns','Retail Sales','Gross','Net'],
        ],
    },
    # IODA 2008 - Onward and Upward
    { service => Client::Service::DSP_IODA,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID!','Release Name','UPC','Track Name','ISRC','Sale Format','Download Mechanicals Withheld','Delivery Type',undef,'Unit Count',undef,'Original Currency Code','Unit Price','Credits\/Returns','Gross','Net',undef,'Exchange Rate',undef,'Preferred Currency Code','Unit Price','Credits\/Returns','Gross','Net'],
        ],
    },
    # IODA 2008 -> CRCJ
    { service => Client::Service::DSP_IODA,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID','Release Name','UPC','Track Name','ISRC','Sale Format','Download Mechanicals Withheld','Delivery Type',undef,'Unit Count',undef,'Original Currency Code','Unit Price','Credits\/Returns','Total Sales','Net Earnings',undef,'Exchange Rate',undef,'Preferred Currency Code','Unit Price','Credits\/Returns','Total Sales','Net Earnings'],
        ],
    },
    # IODA 2008 - Six Degrees
    { service => Client::Service::DSP_IODA,
        version => 9,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID!','Release Name','UPC','Track Name','ISRC','Sale Format','Download Mechanicals Withheld','Delivery Type',undef,'Unit Count',undef,'Original Currency Code','Unit Price','Credits\/Returns','Retail Sales','Gross','Net',undef,'Exchange Rate',undef,'Preferred Currency Code','Unit Price','Credits\/Returns','Retail Sales','Gross','Net'],
        ],
    },
     # IODA 2008 - Destra
    { service => Client::Service::DSP_IODA,
        version => 10,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID!','Release Name','UPC','Track Name','ISRC','Sale Format','Download Mechanicals Withheld','Delivery Type','Unit Count','Original Currency Code','Unit Price','Credits\/Returns','Gross','Net','Exchange Rate','Preferred Currency Code','Unit Price','Credits\/Returns','Gross','Net'],
        ],
    },
    #IODA 2008 -> Destra
    { service => Client::Service::DSP_IODA,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name','Region','Country','Year','Period','Label','Track Artist','Release Artist','Catalog ID!','Release Name','UPC','Track Name','ISRC','Sale Format','Delivery Type','Unit Count','Original Currency Code','Unit Price','Credits\/Returns','Gross','Net','Exchange Rate','Preferred Currency Code','Unit Price','Credits\/Returns','Gross','Net'],
        ],
    },
    #IODA 2008 -> Another Six Degrees Version
    { service => Client::Service::DSP_IODA,
        version => 12,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Label', 'Track Artist', 'Release Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Sale Format', 'Download Mechanicals Withheld', 'Delivery Type', 'Unit Count', 'Original Currency Code', 'Unit Price', 'Credits\/Returns', 'Total Sales', 'Net Earnings', 'Exchange Rate', 'Preferred Currency Code', 'Unit Price', 'Credits\/Returns', 'Total Sales', 'Gross US\$',
             'Net US\$',undef],
        ],
    },
    #IODA 2009
    { service => Client::Service::DSP_IODA,
        version => 13,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Label', 'Track Artist', 'Release Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Sale Format', 'Download Mechanicals Withheld', 'Delivery Type', undef, 'Unit Count', 'Credit Count', 'IODA Percent', undef, 'Original Currency Code', 'Unit Price', 'Total Sales', 'Total Credits', 'IODA Commission', 'Mechanicals Withheld', 'IRS Withheld', 'Net Earnings', undef, 'Exchange Rate', undef, 'Preferred Currency Code', 'Unit Price', 'Total Sales', 'Total Credits', 'IODA Commission', 'Mechanicals Withheld', 'IRS Withheld', 'Net Earnings',],
        ],
    },
    #IODA 2009
    { service => Client::Service::DSP_IODA,
        version => 14,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Label', 'Track Artist',
            'Release Artist', 'Video Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name',
            'ISRC', 'Video Name', 'Video Type', 'TV', 'Sale Format', 'Mechanicals Withheld By Service',
            'Delivery Type', undef, 'Unit Count', 'Credit Count', 'IODA Percent', undef,
            'Original Currency Code', 'Unit Price', 'Total Sales', 'Total Credits', 'IODA Commission',
            'Mechanicals Withheld By IODA', 'IRS Withheldr', 'Net Earnings', undef, 'Exchange Rate', undef,
            'Preferred Currency Code', 'Unit Price', 'Total Sales', 'Total Credits', 'IODA Commission',
            'Mechanicals Withheld By IODA', 'IRS Withheld', 'Net Earnings',],
        ],
    },
    #IODA 2010 / Smogveil
    { service => Client::Service::DSP_IODA,
        version => 15,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Statement Month', 'Label', 'Track Artist',
            'Release Artist', 'Video Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name',
            'ISRC', 'Video Name', 'Video Type', 'TV', 'Sale Format', 'Mechanicals Withheld By Service',
            'Delivery Type', 'Unit Count', 'Credit Count', 'IODA Percent',
            'Original Currency Code', 'Unit Price OC', 'Total Sales OC', 'Total Credits OC', 'IODA Commission OC',
            'Mechanicals Withheld By IODA OC', 'IRS Withheld OC', 'Net Earnings OC', 'Exchange Rate',
            'Preferred Currency Code', 'Unit Price', 'Total Sales', 'Total Credits', 'IODA Commission',
            'Mechanicals Withheld By IODA', 'IRS Withheld', 'Net Earnings',],
        ],
    },
    #IODA 2012 / New Earth
    { service => Client::Service::DSP_IODA,
        version => 16,
        lines => [
            ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Statement Month', 'Label', 'Track Artist',
            'Release Artist', 'Video Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name',
            'ISRC', 'Video Name', 'Video Type', 'TV', 'Sale Format', 'Mechanicals Withheld By Service',
            'Delivery Type', 'Unit Count', 'Credit Count', 'Original Currency Code', 'Net Earnings OC',
            'Exchange Rate', 'Preferred Currency Code', 'Net Earnings'],
        ],
    },    
    #IODA 2012 / Hornblow
    { service => Client::Service::DSP_IODA,
        version => 17,
        lines => [
            ['Service Name', 'Region', 'Country', 'Year', 'Period', 'Statement Month', 'Label', 'Track Artist',
             'Release Artist', 'Catalog ID', 'Release Name', 'UPC', 'Track Name', 'ISRC', 'Video Name',
             'Video Type', 'TV', 'Sale Format', 'Mechanicals Withheld By Service', 'Delivery Type', 'Unit Count',
             'Credit Count', 'IODA Percent', 'Original Currency Code', 'Unit Price OC', 'Total Sales OC',
             'Total Credits OC', 'IODA Commission OC', 'Mechanicals Withheld By IODA OC', 'IRS Withheld OC',
             'Net Earnings OC', 'Exchange Rate', 'Preferred Currency Code', 'Unit Price', 'Total Sales',
             'Total Credits', 'IODA Commission', 'Mechanicals Withheld By IODA', 'IRS Withheld', 'Net Earnings']
        ],
    },
    #IODA (FB7941)
    { service => Client::Service::DSP_IODA,
        version => 18,
        lines => [
            [
             'vendor', 'region', 'country', 'year', 'period', 'stmnt_mnth', 'label_desc', 'trk_artist', 'rel_artist', 'sku', 'rel_name', 'upc', 'track_name', 'isrc', 'sale_fmt', 'mech_whld', 'delivry_id', 'unit_cnt', 'pref_curr', 'unit_prc', 'ext_prc', 'ext_cred', 'net', 'trnstype'
	    ]
        ],
    },
	#verizon - wallpaper
	{ service => Client::Service::DSP_VERIZON,
	  version => 3,
      match_on_any_row => 1,
	  lines => [
	    ['Image_Title', 'Image_ID', 'Month', 'Total '],
	  ]
	},
    # Naeros inception - 11-01-2007
    { service => Client::Service::DSP_NAEROS,
        version => 1,
        sheet => 0,
        lines => [
            [undef,'Big Fish'],
            ['Track\/ Album','ISRC\/ UPC','Label','Artist','Album','Track','Views','Purchases',undef,undef,undef,'Amount'],
        ],

    },
    # MediaDo - 11-01-2007
    { service => Client::Service::DSP_MEDIADO,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['MEDIA DO'],
            [undef],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY'],
        ],

    },
    # MediaDo - 11-01-2007
    { service => Client::Service::DSP_MEDIADO,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 4,
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label',undef],
        ],

    },
    # Estore - Six Degrees
    { service => Client::Service::DSP_ESTORE,
        version => 1,
        sheet => 0,
        lines => [
            ['PROD_CODE','PROD_NAME','PROD_PRICE','PROD_QUANT','ORDER_TOTL'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Distributor name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 2,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 4,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 5,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 7,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 8,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 12,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # JUNO - Seed Distribution
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name','Number of Sales','Number of Refunds','Total sales','Royalty','Mechanicals'],
            ([undef]) x 16,
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # Juno - Ditto
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Label name','Date\/Time','Your Release Ref','Catalogue No\.','UPC','Release','Track','Mix','Track Your Ref','Track ISRC','Track MCPS','Release Artist','File Type','Quantity','Value','Country','Royalty','Mechanicals','Sale\/Refund'],
        ],
    },
    # Juno - CM
    { service => Client::Service::DSP_JUNO,
        version => 1,
        sheet => 0,
        lines => [
            ['Label name', 'Number of Sales', 'Number of Refunds', 'Total sales', 'Royalty', 'Mechanicals'],
        ],
    },
    # Juno - Nettwerk
    { service => Client::Service::DSP_JUNO,
        version => 2,
        sheet => 0,
        lines => [
            ['Date\/Time','Label','Your Ref','Catalogue Number','UPC','Release','Artist','Track','Mix','Track Your Ref','Track ISRC','File Type','Value','Royalty','Mechanicals','Country','Transaction Type'],
        ],
    },
    # SRGIUK - Cool Inc
    { service => Client::Service::DSP_COOLINC,
        version => 1,
        sheet => 0,
        lines => [
            ['Report Of Music Download Log'],
            [undef],
            ['Artist','Title','Track ID','Sales Price',undef,undef,undef,'Total'],
        ],
    },
    # SRGIUK - Cool Inc
    { service => Client::Service::DSP_COOLINC,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 4,
            ['COMPANY\'S DIGITAL IDENTIFIER','ISRC','ARTIST','TITLE','SRG ALBUM REF\. \/ Cat\. No\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY w\/Tax\=5\%\)','RECEIPTS \(LOCAL CURRENCY\)','Number of Download','Total Sales \(Net\)','Total Tax\(\=5\%\)','SRG Share \(\=50\%\)','CURRENCY','EXCHANGE RATE','Payment to SRG','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG Label','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product',undef,undef,undef,undef,undef],
        ],
    },
    # SRGIUK - Lyzia
    { service => Client::Service::DSP_LYZIA,
        version => 1,
        sheet => 1,
        lines => [
            ['Lyzia'],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF\.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # SRGIUK - Lyzia
    { service => Client::Service::DSP_LYZIA,
        version => 1,
        sheet => 1,
        lines => [
            ['Lyzia'],
            ['COMPANY\'S DIGITAL IDENTIFIER \/ CAT\.NO\.','ISRC','ARTIST','TITLE','SRG ALBUM REF.','VENDOR','PRICE CATEGORY','MECHANICALS PAID','DEALER PRICE \(LOCAL CURRENCY\)','END USER PRICE \(LOCAL CURRENCY\)','RECEIPTS \(LOCAL CURRENCY\)','CURRENCY','EXCHANGE RATE','USEAGE TYPE','TERRITORY SOLD','TERRITORY CONSUMED','SALES DATE','QUANTITY','SRG LABEL','Length \(secs\) of SRG TRACK within product','Length \(secs\) of music within product','Total length \(secs\) of product'],
        ],
    },
    # Sanctuary UK -> New Visions
    { service => Client::Service::DSP_NEWVISIONS,
        version => 1,
        sheet => 1,
        lines => [
            ['PRODUCT ARTIST','PRODUCT TITLE','ITEM CODE','KEYWORD','BILLING TYPE','CONTENT TYPE','QUANTITY','GROSS CONSUMER RETAIL PRICE','VAT\%','TRANSACTION IDENTIFIER','ISRC CODE'],
        ],
    },
    # Sanctuary UK -> New Visions II
    { service => Client::Service::DSP_NEWVISIONS,
        version => 2,
        sheet => 1,
        lines => [
            ['MONTH','DIGITAL IDENTIFIER','PRODUCT ARTIST','PRODUCT TITLE','GROSS CONSUMER RETAIL PRICE','USEAGE TYPE','ITEM CODE','BILLING TYPE','ISRC CODE','PPD\%','PPD'],
        ],
    },
    # Sanctuary UK -> New Visions III
    { service => Client::Service::DSP_NEWVISIONS,
        version => 3,
        sheet => 1,
        lines => [
            ['MONTH_YEAR','CATALOG','TYPE','CATEGORY','ITEM_NAME','DOWNLOADS','SREF','PRICE','REVENUE','TITLE','PERFORMER','ISRC CODE'],
        ],
    },
    # Sanctuary UK -> New Visions III
    { service => Client::Service::DSP_NEWVISIONS,
        version => 3,
        sheet => 1,
        lines => [
            ['MONTH_YEAR','CATALOG','TYPE','CATEGORY','ITEM_NAME','DOWNLOADS','SREF','PRICE','REVENUE','TITLE','PERFORMER',undef,'ISRC CODE'],
        ],
    },
    # Sanctuary UK -> New Visions IV
    { service => Client::Service::DSP_NEWVISIONS,
        version => 4,
        sheet => 1,
        lines => [
            ['DIGITAL IDENTIFIER','PRODUCT ARTIST','PRODUCT TITLE','GROSS CONSUMER RETAIL PRICE','USEAGE TYPE','ITEM CODE','BILLING TYPE','ISRC CODE','PPD\%','PPD'],
        ],
    },
    # Sanctuary UK -> New Visions V
    { service => Client::Service::DSP_NEWVISIONS,
        version => 5,
        sheet => 1,
        lines => [
            [undef,'Sref','Performer','Title','Downloads'],
        ],
    },
    # Sanctuary UK -> New Visions VI
    { service => Client::Service::DSP_NEWVISIONS,
        version => 6,
        sheet => 1,
        lines => [
            ['DIGITAL IDENTIFIER','PRODUCT ARTIST','PRODUCT TITLE','GROSS CONSUMER RETAIL PRICE','USEAGE TYPE','ITEM CODE','BILLING TYPE','PPD\%','PPD','ISRC CODE'],
        ],
    },
    # Sanctuary UK -> New Visions VII
    { service => Client::Service::DSP_NEWVISIONS,
        version => 7,
        sheet => 1,
        lines => [
            ['DIGITAL IDENTIFIER','PRODUCT ARTIST','PRODUCT TITLE','GROSS CONSUMER RETAIL PRICE','USEAGE TYPE','ITEM CODE','BILLING TYPE','PPD\%','PPD'],
        ],
    },
    # Sanctuary UK -> New Visions VIII
    { service => Client::Service::DSP_NEWVISIONS,
        version => 8,
        sheet => 1,
        lines => [
            ['MONTH','DIGITAL IDENTIFIER','PRODUCT ARTIST','PRODUCT TITLE','GROSS CONSUMER RETAIL PRICE','USEAGE TYPE','ITEM CODE','BILLING TYPE','PPD\%','PPD'],
        ],
    },
    # Sanctuary UK -> New Visions IX
    { service => Client::Service::DSP_NEWVISIONS,
        version => 9,
        sheet => 1,
        lines => [
            ['PRODUCT ARTIST','PRODUCT TITLE','LABEL NAME','ITEM CODE','KEYWORD','BILLING TYPE','CONTENT TYPE','GROSS CONSUMER RETAIL PRICE','TRANSACTION IDENTIFIER',undef],
        ],
    },
    # Sanctuary UK -> New Visions IX
    { service => Client::Service::DSP_NEWVISIONS,
        version => 10,
        sheet => 1,
        lines => [
            ['PRODUCT ARTIST','PRODUCT TITLE','ITEM CODE','KEYWORD','BILLING TYPE','CONTENT TYPE','GROSS CONSUMER RETAIL PRICE','TRANSACTION IDENTIFIER','ISRC CODE'],
        ],
    },
    # Sancturary UK -> New Visions XI
    { service => Client::Service::DSP_NEWVISIONS,
        version => 11,
        sheet => 1,
        lines => [
            ['download_id','added_time','msisdn','content_order_ref','prs_number','file_name','device_type','trans_ref','desc_1','desc_2','content_type_name'],
        ],
    },
    # Sanctuary UK -> New Visions XII
    { service => Client::Service::DSP_NEWVISIONS,
        version => 12,
        sheet => 1,
        lines => [
            ['PRODUCT ARTIST','PRODUCT TITLE','ITEM CODE','KEYWORD','BILLING TYPE','CONTENT TYPE','QUANTITY','GROSS CONSUMER RETAIL PRICE','VAT\%','TRANSACTION IDENTIFIER'],
        ],
    },
    # Sanctuary UK -> New Visions XIV
    { service => Client::Service::DSP_NEWVISIONS,
        version => 14,
        sheet => 1,
        lines => [
            ['PRODUCT ARTIST','PRODUCT TITLE','ITEM CODE','KEYWORD','BILLING TYPE','CONTENT TYPE','GROSS CONSUMER RETAIL PRICE','TRANSACTION IDENTIFIER'],
        ],
    },
    # WE7 -> Sanctuary UK label
    { service => Client::Service::DSP_WE7,
        version => 1,
        sheet => 1,
        lines => [
            ['We7 Ltd',undef,'www\.we7\.com',undef,undef],
        ],
    },
    # Big Fish -> We7
    { service => Client::Service::DSP_WE7,
        version => 2,
        sheet => 0,
        lines => [
            [undef,undef,undef,undef],
            ['D','\w{10}','\d{10}',undef,undef,undef,'t|a','\d','\d+',undef,undef,'GBP','\w+',undef,undef,undef],
        ],
    },
    # Sno Cap Streams
    { service => Client::Service::DSP_SNOCAP,
        version => 2,
        sheet => 0,
        lines => [
            ['IMEEM, Inc'],
        ],
    },
    # Razor & Tie MusicGiants
    { service => Client::Service::DSP_MUSICGIANTS,
        version => 1,
        sheet => 0,
        lines => [
            [undef],
            ['Album|Track','\d{5}','\d{5}',undef,'\d+',undef,'\w+','\w+','\d+','\d{6}',undef,'\d+','\d+','\w+'],
        ],
    },
    # Seed distribution - turn table lab
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 1,
        sheet => 0,
        lines => [
            ['Record Type','Track ISRC','Album UPC','Artist Name','Album Name','Track Name','Product SKU','Label','Distributor Track ID','Distributor Album ID','Distributor','Sale Format','Delivery ID','Unit Count','Total Price','Label Portion','ISO Currency Code','ISO Country Code','Transaction Type','Sale Type','Sale Date','Customer ZIP','Customer City','Customer State','Customer Country'],
        ],
    },
    # Audio Bee - turn table lab
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 2,
        sheet => 0,
        lines => [
            ['Record Type','Track ISRC','Album UPC','Product SKU','Distributor Track ID','Distributor Album ID','Distributor','Sale Format','Delivery ID','Unit Count','Total Price','Label Portion','ISO Currency Code','ISO Country Code','Track Name','Album Name','Artist Name','Transaction Type','Sale Type','Sale Date','Customer ZIP','Customer City','Customer State','Customer Country','Label'],
        ],
    },
    # Seed Distribution -> Turn Table Lab
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 3,
        sheet => 0,
        lines => [
            ['Track ISRC','Album UPC','Product SKU','Distributor Track ID','Distributor Album ID','Distributor','Sale Format','Delivery ID','Unit Count','Total Price','Label Portion','ISO Currency Code','ISO Country Code','Track Name','Album Name','Artist Name','Transaction Type','Sale Type','Sale Date','Customer ZIP','Customer City','Customer State','Customer Country','Label'],
        ],
    },
    # Audio Bee -> Turn Table Lab
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 4,
        sheet => 0,
        lines => [
            ['Record Type','Track ISRC','Album UPC','Product SKU','Distributor Track ID','Distributor Album ID','Distributor','Sale Format','Delivery ID','Unit Count','Total Price','Label Portion','Label Portion','ISO Currency Code','ISO Country Code','Track Name','Album Name','Artist Name','Transaction Type','Sale Type','Sale Date','Customer ZIP','Customer City','Customer State','Customer Country','Label'],
        ],
    },
    # Seed Distribution -> Turn Table Lab
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 5,
        sheet => 0,
        lines => [
            ['Record Type','Track ISRC','Album UPC','Product SKU','Track Name','Distributor Track ID','Distributor Album ID','Distributor','Sale Format','Delivery ID','Unit Count','Total Price','Label Portion','ISO Currency Code','ISO Country Code','Album Name','Artist Name','Transaction Type','Sale Type','Sale Date','Customer ZIP','Customer City','Customer State','Customer Country','Label'],
        ],
    },
    # Seed Distribution -> Turn Table Lab
    { service => Client::Service::DSP_TURNTABLELAB,
        version => 5,
        sheet => 0,
        lines => [
            ['Record Type','Track ISRC','Album UPC','Product SKU','Track Name','Distributor Track ID','Distributor Album ID','Distributor','Sale Format','Delivery ID','Unit Count','Total Price','Royalty','ISO Currency Code','ISO Country Code','Album Name','Artist Name','Transaction Type','Sale Type','Sale Date','Customer ZIP','Customer City','Customer State','Customer Country','Label'],
        ],
    },
    # LaCupula - Track It Down
    { service => Client::Service::DSP_TRACKITDOWN,
        version => 1,
        sheet => 0,
        lines => [
            ['recordlabel','track_id','catalogue_number','title','artist','remixer','isrc_code','barcode_number','total_sales','total_commission'],
        ],
    },
    # LaCupula - Track It Down (cosmetic changes to column names, but values still in same order)
    { service => Client::Service::DSP_TRACKITDOWN,
        version => 1,
        sheet => 0,
        lines => [
            [
                'recordlabel', 'track id', 'catalogue number', 'track title', 'artist name',
                'remixer name', 'isrc code', 'barcode number', 'total units', 'total commission'
            ],
        ],
    },
    # LaCupula - Track It Down
    { service => Client::Service::DSP_TRACKITDOWN,
        version => 2,
        sheet => 0,
        lines => [
            ['recordlabel','track_id','catalogue_number','title','artist','remixer','isrc_code','barcode_number','tunecode','total_sales','total_commission'],
        ],
    },
    # Track It Down
    { service => Client::Service::DSP_TRACKITDOWN,
        version => 3,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Recordlabel', 'Track Id', 'Catalogue Number', 'Track Title', 'Artist Name', 'Remixer Name', 'ISRC Code', 'Barcode Number', 'Total Units Sold', 'Total Commission']
        ],
    },
    # ST Holdings - Track It Down (FB16681)
    { service => Client::Service::DSP_TRACKITDOWN,
        version => 4,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
             'Recordlabel', 'Track Id', 'Catalogue Number', 'Track Title', 'Artist Name', 'Remixer Name', 'ISRC Code', 'Barcode Number', 'Affiliate Code', 'Country Code', 'Total Units Sold', 'Total Commission'
	    ]
        ],
    },
    # Bacci Bros - Vid Zone Digital Media
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 1,
        sheet => 1,
        lines => [
            ['VidZone Digital Media Royalty Report',undef,undef,undef,undef,undef,undef,undef,undef,undef],
            ['ISRC','ARTIST','TITLE','VENDOR','END USER','ROYALTY','CONTENT TYPE','SALES','QUANTITY','VALUE'],
        ],
    },
    # Wild Palms - Vid Zone Digital Media
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 2,
        sheet => 1,
        lines => [
            ['VidZone Digital Media Summary Of Sales',undef,undef,undef,undef,undef,undef,undef,undef,undef],
            ['ISRC','ARTIST','TITLE','VENDOR','END USER','ROYALTY','CONTENT TYPE','SALES','QUANTITY','VALUE','TERRITORY'],
        ],
    },
    # Sanctuary UK - Vid Zone Digital Media
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 1,
        sheet => 0,
        lines => [
            ['VidZone Mobile Video \/ Audio Royalty Report'],
            [undef],
            ['ISRC','ARTIST','TITLE','VENDOR','END USER PRICE','ROYALTY PAYABLE','CONTENT TYPE','SALES DATE','QUANTITY','VALUE']
        ],
    },
    # Sanctuary UK - Vid Zone Digital Media
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['ISRC','ARTIST','TITLE','VENDOR','END USER PRICE','ROYALTY PAYABLE','CONTENT TYPE','SALES DATE','QUANTITY','VALUE','LABEL'],
        ],
    },
    # Skint - Vid Zone Digital Media
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 3,
        sheet => 1,
        lines => [
            ['UPC', 'ISRC','ARTIST','TITLE','PRODUCT TITLE', 'PRODUCT ARTIST', 'FORMAT', 'TERRITORY',
             'VENDOR', 'END USER', 'ROYALTY', 'CONTENT TYPE', 'SALES DATE', 'QUANTITY', 'VALUE'],
        ],
    },
    # Skint - Vid Zone Digital Media
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 4,
        sheet => 1,
        lines => [
            ['UPC', 'ISRC','ARTIST','TITLE','PRODUCT TITLE', 'PRODUCT ARTIST', 'TERRITORY',
             'VENDOR', 'END USER', 'ROYALTY', 'CONTENT TYPE', 'SALES DATE', 'QUANTITY', 'VALUE'],
        ],
    },
    # Skint - Vid Zone Digital Media (FB17275)
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 5,
        sheet => 1,
        lines => [
            [
'UPC', 'ISRC', 'ARTIST', 'TITLE', 'PRODUCT ARTIST', 'PRODUCT TITLE', 'TERRITORY', 'VENDOR', 'END USER', 'ROYALTY', 'CONTENT TYPE', 'SALES DATE', 'QUANTITY', 'VALUE \(LOCAL\)', 'CURRENCY RATE', 'VALUE \(GBP\)'
	     ],
        ],
    },
    # Mbop - Vid Zone Digital Media (FB10)
    { service => Client::Service::DSP_VIDZONEDIGITAL,
        version => 6,
        sheet => 1,
        lines => [
            [
'UPC', 'ISRC', 'ARTIST', 'TITLE', 'PRODUCT ARTIST', 'PRODUCT TITLE', 'LABEL', 'TERRITORY', 'VENDOR', 'END USER', 'ROYALTY', 'CONTENT TYPE', 'SALES DATE', 'QUANTITY', 'VALUE \(LOCAL\)', 'CURRENCY RATE', 'VALUE \(GBP\)'
	     ],
        ],
    },
    # Memphis Industries - Indigo
    { service => Client::Service::DSP_INDIGO,
        version => 1,
        sheet => 0,
        lines => [
            ['period', 'supplier-code', 'supplier', 'label', 'Indigo-no', 'label-cat-no', 'barcode', 'format', 'artist', 'title', 'Indigo-Nr_kurz', 'title_short', 'pco', 'PPD', 'type', 'country', 'foc', 'sales_gross_units', 'sales_gross_EUR', 'returns_units', 'returns_EUR', 'sales_net_units', 'sales_net_EUR', 'margin', 'payable', 'ARP', 'handling_fee_AT']
        ],
    },
    # La Cupula - DJ Download
    { service => Client::Service::DSP_DJDOWNLOAD,
        version => 1,
        sheet => 1,
        lines => [
            ['Stable\/Aggregator','Label','Type','Track','Catalogue #','ISRC','EU Unit Sales','Non EU Unit Sales','Total Units','Avg Unit Price','Sales \(incl VAT\)','Sales \(Excl VAT\)','Transaction Costs \(Capped\)','Applicable Bandwidth','Base','Royalty Base Price','Label Royalty'],
        ],
    },
    # WildPalms - DJ Download
    { service => Client::Service::DSP_DJDOWNLOAD,
        version => 1,
        sheet => 0,
        lines => [
            ['Stable\/Aggregator','Label','Type','Track','Catalogue #','ISRC','EU Unit Sales','Non EU Unit Sales','Total Units','Avg Unit Price','Sales \(incl VAT\)','Sales \(Excl VAT\)','Transaction Costs \(Capped\)','Applicable Bandwidth','Base','Royalty Base Price','Label Royalty'],
        ],
    },
    # MoS - DJ Download
    { service => Client::Service::DSP_DJDOWNLOAD,
        version => 2,
        sheet => 'any',
        lines => [
            ['Stable/Aggregator', 'Label', 'Type', 'Track', 'Artist', 'Title', 'Mix', 'Catalogue #', 'ISRC', 'EU Unit Sales', 'Non EU Unit Sales', 'Total Units', 'Avg Unit Price', 'Sales \(incl VAT\)', 'Sales \(Excl VAT\)', 'Transaction Costs \(Capped\)', 'Applicable Bandwidth', 'Base', 'Royalty Base Price', 'Label Royalty'],
        ],
    },
    # Go Digital -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 1,
        sheet => 0,
        lines => [
            ['line_number','id','filename','recipient_id','recipient_name','recipient_email','recipient_phone','report_period_start_date','report_period_end_date','timestamp','video_id','video_username','content_type','content_policy','tv_metadata.custom_id','tv_metadata.show_title','tv_metadata.episode_title','tv_metadata.episode','tv_metadata.season','exhibition_count','view_count','amount_payable.amount','amount_payable.currency_code','has_multiple_claims','group.number_of_videos','group.total_exhibition_count','group.total_view_count','group.total_amount_payable.amount','group.total_amount_payable.currency_code','file.number_of_videos','file.total_exhibition_count','file.total_view_count','file.total_amount_payable.amount','file.total_amount_payable.currency_code'],
        ],
    },
    # AudioBee -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 2,
        sheet => 0,
        lines => [
            ['line_number','id','filename','recipient_id','recipient_name','recipient_email','recipient_phone','report_period_start_date','report_period_end_date','timestamp','video_id','content_type','content_policy','tv_metadata.custom_id','tv_metadata.show_title','tv_metadata.episode_title','tv_metadata.episode','tv_metadata.season','exhibition_count','view_count','amount_payable.amount','amount_payable.currency_code','has_multiple_claims','group.number_of_videos','group.total_exhibition_count','group.total_view_count','group.total_amount_payable.amount','group.total_amount_payable.currency_code','file.number_of_videos','file.total_exhibition_count','file.total_view_count','file.total_amount_payable.amount','file.total_amount_payable.currency_code'],
        ],
    },
    # Go Digital -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 3,
        sheet => 0,
        lines => [
            ([undef]) x 33,
            ['line_number','video_id','video_username','content_type','content_policy','exhibition_count','view_count','amount_payable\.amount','amount_payable\.currency_code','has_multiple_claims','metadata\.custom_id','metadata\.show_title','metadata\.episode_title','metadata\.episode','metadata\.season'],
        ],
    },
    # AudioBee -> YouTube
    { service => Client::Service::DSP_YOUTUBE,
        version => 4,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['line_number','video_id','video_username','content_type','content_policy','exhibition_count','view_count','embed_exhibitions','embed_views','video_unit_exhibitions','video_unit_views','amount_payable\.amount','amount_payable\.currency_code','has_multiple_claims','metadata\.custom_id'],
        ],
    },
    # AudioBee -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 5,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['line_number','video_id','username','exhibition_count','view_count','embed_exhibitions','embed_views','video_unit_exhibitions','video_unit_views','amount_payable','has_multiple_claims','category','metadata\.custom_id'],
        ],
    },
    # AudioBee -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 6,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['line_number','video_id','title','username','claim_type','embed_exhibitions','embed_views','video_unit_exhibitions','video_unit_views','watch_exhibitions','watch_views','amount_payable','has_multiple_claims','category','metadata\.custom_id'],
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 7,
        sheet => 0,
        match_on_any_row => 1,
        lines => [     ['line_number', 'video_id', 'title', 'username', 'claim_type', 'claim_origin', 'embed_exhibitions', 'embed_views', 'video_unit_exhibitions', 'video_unit_views', 'watch_exhibitions', 'watch_views', 'revenue', 'amount_payable', 'has_multiple_claims', 'category', 'metadata.custom_id', 'metadata.isrc', 'metadata.grid', 'metadata.upc', 'metadata.artist', 'metadata.song', 'metadata.album', 'metadata.label'],
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 7,
        sheet => 0,
        match_on_any_row => 1,
        lines => [['line_number', 'video_id', 'title', 'username', 'claim_type',
         'claim_origin', 'embed_exhibitions', 'embed_views', 'video_unit_exhibitions',
          'video_unit_views', 'watch_exhibitions', 'watch_views', 'revenue', 'amount_payable',
           'has_multiple_claims', 'category', 'metadata.custom_id', 'metadata.isrc',
           'metadata.grid', 'metadata.upc', 'metadata.artist', 'metadata.song', 'metadata.album', 'metadata.label'],
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [['line_number', 'id', 'filename', 'recipient_id',
        'recipient_name', 'recipient_email', 'recipient_phone',
        'report_period_start_date', 'report_period_end_date', 'timestamp',
        'video_id', 'video_username', 'content_type', 'content_policy',
        'metadata.custom_id', 'metadata.isrc',
        'metadata.grid', 'metadata.upc', 'metadata.artist', 'metadata.song',
        'metadata.album', 'metadata.label', 'exhibition_count', 'view_count',
        'amount_payable.amount', 'amount_payable.currency_code',
        'has_multiple_claims', 'group.number_of_videos',
        'group.total_exhibition_count', 'group.total_view_count',
        'group.total_amount_payable.amount',
        'group.total_amount_payable.currency_code', 'file.number_of_videos',
        'file.total_exhibition_count', 'file.total_view_count',
        'file.total_amount_payable.amount', 'file.total_amount_payable.currency_code',],
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 9,
        sheet => 0,
        match_on_any_row => 1,
        lines => [['line_number', 'video_id', 'video_username', 'content_type', 'content_policy',
        'exhibition_count', 'view_count', 'amount_payable.amount',
        'amount_payable.currency_code', 'has_multiple_claims', 'metadata.custom_id',
        'metadata.isrc', 'metadata.grid', 'metadata.upc', 'metadata.artist',
        'metadata.song', 'metadata.album', 'metadata.label',],
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 10,
        sheet => 0,
        match_on_any_row => 1,
        lines => [['line_number', 'video_id', 'title', 'username', 'exhibition_count',
        'view_count', 'embed_exhibitions', 'embed_views', 'video_unit_exhibitions',
        'video_unit_views', 'amount_payable', 'has_multiple_claims', 'category',
        'metadata.custom_id', 'metadata.isrc', 'metadata.grid', 'metadata.upc',
        'metadata.artist', 'metadata.song', 'metadata.album', 'metadata.label',],
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
			 'video_id', 'content_type', 'policy', 'video_title', 'username',
			 'uploader', 'claim_type', 'claim_origin', 'embed_views', 'watch_views',
			 'youtube_sold_revenue', 'partner_sold_revenue', 'afv_revenue|other_revenue',
			 'amount_payable', 'has_multiple_claims', 'category', 'custom_id',
			 'isrc', 'grid', 'upc', 'artist', 'title', 'album', 'label'
			]
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 12,
        sheet => 0,
        match_on_any_row => 1,
		limit => 1500,
        lines => [
            [
             'video_id', 'content_type', 'policy', 'video_title', 'video_duration',
			 'username', 'uploader', 'claim_type', 'claim_origin', 'embed_views',
			 'watch_views', 'youtube_sold_revenue', 'partner_sold_revenue',
			 'afv_revenue', 'amount_payable', 'has_multiple_claims', 'category',
			 'asset_id', 'custom_id', 'isrc', 'grid', 'upc', 'artist', 'title',
			 'album', 'label',
			]
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 13,
        sheet => 0,
        match_on_any_row => 1,
		limit => 1500,
        lines => [
            [
             'video_id', 'content_type', 'policy', 'video_title', 'video_duration',
			 'username', 'uploader', 'claim_type', 'claim_origin', 'embed_views',
			 'watch_views', 'youtube_sold_revenue', 'partner_sold_revenue',
			 'afv_revenue', 'amount_payable', 'has_multiple_claims', 'category',
			 'custom_id', 'isrc', 'grid', 'upc', 'artist', 'title', 'album', 'label',
			]
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 12,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
			 'video_id', 'content_type', 'policy', 'video_title', 'username',
			 'uploader', 'claim_type', 'claim_origin', 'embed_views', 'watch_views',
			 'youtube_sold_revenue', 'partner_sold_revenue', 'afv_revenue',
			 'amount_payable', 'has_multiple_claims', 'category', 'custom_id',
			 'isrc', 'grid', 'upc', 'artist', 'title', 'album', 'label'
			]
        ],
    },
    # Syntax -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 14,
        sheet => 0,
		limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
			 'video_id', 'content_type', 'policy', 'video_title', 'video_duration',
			 'username', 'uploader', 'claim_type', 'claim_origin', 'embed_views',
			 'watch_views', 'youtube_sold_revenue', 'partner_sold_revenue',
			 'afv_revenue', 'amount_payable', 'estimated_rpm', 'has_multiple_claims',
			 'category', 'asset_id', 'asset_channel', 'custom_id', 'isrc', 'grid',
			 'upc', 'artist', 'title', 'album', 'label'
			]
        ],
    },
    # Nettwerk -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 15,
        sheet => 0,
		limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
			 'video_id', 'content_type', 'policy', 'video_title', 'video_duration',
			 'username', 'uploader', 'claim_type', 'claim_origin', 'embed_views',
			 'watch_views', 'youtube_sold_revenue', 'partner_sold_revenue',
			 'afv_revenue', 'amount_payable', 'estimated_rpm', 'has_multiple_claims',
			 'category', 'asset_id', 'custom_id', 'isrc', 'grid',
			 'upc', 'artist', 'title', 'album', 'label'
			]
        ],
    },
    # You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 16,
        sheet => 0,
		limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Video ID', 'Content Type', 'Policy', 'Video Title', 'Video Duration \(sec\)', 'Username', 'Uploader', 'Channel Display Name', 'Channel ID', 'Claim Type', 'Claim Origin', 'Total Views', 'Watch Page Views', 'Embedded Player Views', 'Channel Page Video Views', 'Live Views', 'Recorded Views', 'Ad-Enabled Views', 'Total Earnings', 'Gross YouTube-sold Revenue', 'Gross Partner-sold Revenue', 'Gross AdSense-sold Revenue', 'Estimated RPM', 'Net YouTube-sold Revenue', 'Net AdSense-sold Revenue', 'Multiple Claims\?', 'Category', 'Asset ID', 'Channel', 'Custom ID', 'ISRC', 'GRid', 'UPC', 'Artist', 'Asset Title', 'Album', 'Label'
			]
        ],
    },
    # Nettwerk -> You Tube
    { service => Client::Service::DSP_YOUTUBE,
        version => 17,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
			 'video_id', 'content_type', 'policy', 'video_title', 'username',
			 'uploader', 'claim_type', 'claim_origin', 'embed_views', 'watch_views',
			 'youtube_sold_revenue', 'partner_sold_revenue',
			 'amount_payable', 'has_multiple_claims', 'category', 'custom_id',
			 'isrc', 'grid', 'upc', 'artist', 'title', 'album', 'label'
			]
        ],
    },    
    # You Tube (FB6131)
    { service => Client::Service::DSP_YOUTUBE,
        version => 18,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Video ID', 'Content Type', 'Policy', 'Video Title', 'Video Duration \(sec\)', 'Username', 'Uploader', 'Channel Display Name', 'Channel ID', 'Claim Type', 'Claim Origin', 'Total Views', 'Watch Page Views', 'Embedded Player Views', 'Channel Page Video Views', 'Live Views', 'Recorded Views', 'Ad-Enabled Views', 'Total Earnings', 'Gross YouTube-sold Revenue', 'Gross Partner-sold Revenue', 'Gross AdSense-sold Revenue', 'Estimated RPM', 'Net YouTube-sold Revenue', 'Net AdSense-sold Revenue', 'Multiple Claims\?', 'Category', 'Asset ID', 'Asset Labels', 'Asset Channel ID', 'Custom ID', 'ISRC', 'GRid', 'UPC', 'Artist', 'Asset Title', 'Album', 'Label'
			]
        ],
    },
    # You Tube (FB6564)
    { service => Client::Service::DSP_YOUTUBE,
        version => 19,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Asset ID', 'Custom ID', 'ISRC', 'GRid', 'Asset Title', 'Artist', 'Administer Publish Rights', 'Country', 'Total Views', 'Ad-Enabled Views', 'Watch Page Views', 'Embedded Page Views', 'Channel Page Video Views', 'Gross YouTube-sold Revenue', 'Gross Partner-sold Revenue', 'Gross AdSense-sold Revenue', 'Total Earnings', 'Net YouTube-sold Revenue', 'Net AdSense-sold Revenue'
			]
        ],
    },
    # You Tube (FB6570)
    { service => Client::Service::DSP_YOUTUBE,
        version => 20,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Asset ID', 'Asset Labels', 'Custom ID', 'ISRC', 'UPC', 'GRid', 'Asset Title', 'Artist', 'Administer Publish Rights', 'Country', 'Total Views', 'Ad-Enabled Views', 'Watch Page Views', 'Embedded Page Views', 'Channel Page Video Views', 'Gross YouTube-sold Revenue', 'Gross Partner-sold Revenue', 'Gross AdSense-sold Revenue', 'Total Earnings', 'Net YouTube-sold Revenue', 'Net AdSense-sold Revenue'
			]
        ],
    },
    # You Tube (FB15529)
    { service => Client::Service::DSP_YOUTUBE,
        version => 21,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Asset ID', 'Asset Labels', 'Custom ID', 'ISRC', 'UPC', 'GRid', 'Asset Title', 'Artist', 'Administer Publish Rights', 'Country', 'Owned Views', 'Owned Views : Watch Page', 'Owned Views : Embedded Player', 'Owned Views : Channel Page', 'Owned Views : Live', 'Owned Views : On Demand', 'Owned Views : Ad-Enabled', 'YouTube Revenue Split : AdSense Served YouTube Sold', 'YouTube Revenue Split : DoubleClick Served YouTube Sold', 'YouTube Revenue Split : DoubleClick Served Partner Sold', 'YouTube Revenue Split : Partner Served Partner Sold', 'YouTube Revenue Split', 'Partner Revenue : AdSense Served YouTube Sold', 'Partner Revenue : DoubleClick Served YouTube Sold', 'Partner Revenue : DoubleClick Served Partner Sold', 'Partner Revenue : Partner Served Partner Sold', 'Partner Revenue'
			]
        ],
    },
    # You Tube (FB16359)
    { service => Client::Service::DSP_YOUTUBE,
        version => 22,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Video ID', 'Content Type', 'Policy', 'Video Title', 'Video Duration \(sec\)', 'Username', 'Uploader', 'Channel Display Name', 'Channel ID', 'Claim Type', 'Claim Origin', 'Multiple Claims\?', 'Category', 'Asset ID', 'Asset Labels', 'Asset Channel ID', 'Custom ID', 'Total Views', 'Watch Page Views', 'Embedded Player Views', 'Channel Page Video Views', 'Live Views', 'Recorded Views', 'Ad-Enabled Views', 'Total Earnings', 'Gross YouTube-sold Revenue', 'Gross Partner-sold Revenue', 'Gross AdSense-sold Revenue', 'Estimated RPM', 'Net YouTube-sold Revenue', 'Net AdSense-sold Revenue', 'ISRC', 'GRid', 'UPC', 'Artist', 'Asset Title', 'Album', 'Label'
			]
        ],
    },
    # You Tube (FB16493)
    { service => Client::Service::DSP_YOUTUBE,
        version => 23,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Video ID', 'Content Type', 'Policy', 'Video Title', 'Video Duration \(sec\)', 'Username', 'Uploader', 'Channel Display Name', 'Channel ID', 'Claim Type', 'Claim Origin', 'Multiple Claims\?', 'Category', 'Asset ID', 'Asset Labels', 'Asset Channel ID', 'Custom ID', 'ISRC', 'GRid', 'UPC', 'Artist', 'Asset Title', 'Album', 'Label', 'Owned Views', 'Owned Views : Watch Page', 'Owned Views : Embedded Player', 'Owned Views : Channel Page', 'Owned Views : Live', 'Owned Views : On Demand', 'Owned Views : Ad-Enabled', 'YouTube Revenue Split : AdSense Served YouTube Sold', 'YouTube Revenue Split : DoubleClick Served YouTube Sold', 'YouTube Revenue Split : DoubleClick Served Partner Sold', 'YouTube Revenue Split : Partner Served Partner Sold', 'YouTube Revenue Split', 'Partner Revenue : AdSense Served YouTube Sold', 'Partner Revenue : DoubleClick Served YouTube Sold', 'Partner Revenue : DoubleClick Served Partner Sold', 'Partner Revenue : Partner Served Partner Sold', 'Partner Revenue', 'Estimated RPM'
			]
        ],
    },
    # You Tube (FB18975)
    { service => Client::Service::DSP_YOUTUBE,
        version => 24,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Adjustment Type', 'Day', 'Country', 'Asset ID', 'Asset Title', 'Asset Labels', 'Asset Channel ID', 'Asset Type', 'Custom ID', 'ISRC', 'UPC', 'GRid', 'Artist', 'Album', 'Label', 'Administer Publish Rights', 'Owned Views', 'YouTube Revenue Split : Auction', 'YouTube Revenue Split : Reserved', 'YouTube Revenue Split : Partner Sold YouTube Served', 'YouTube Revenue Split : Partner Sold Partner Served', 'YouTube Revenue Split', 'Partner Revenue : Auction', 'Partner Revenue : Reserved', 'Partner Revenue : Partner Sold YouTube Served', 'Partner Revenue : Partner Sold Partner Served', 'Partner Revenue'
			]
        ],
    },
    # Live Nation (FB20211)
    { service => Client::Service::DSP_LIVE_NATION,
        version => 1,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'videoId', 'claimType', 'claimOrigin', 'assetTitle', 'contentType', 'assetType', 'artist', 'album', 'isrc', 'customId', 'writer', 'chanDispName', 'tViews', 'adViews', 'tEarnings'
			]
        ],
    },
    # Planet (FB16387)
    { service => Client::Service::DSP_PLANET,
        version => 1,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Item No.', 'Artist Name', 'Item Description', 'UPC/Barcode', 'BP Code', 'BP Name', 'Opening Stock WHS1', 'Opening Stock Returns WHSE2', 'Opening Stock', 'Incoming Stock', 'Returns', 'Month Sales', 'Month Sales & Returns', 'Revenue \p{Sc}', 'Free Sales', 'Free Sales Details', 'Closing Stock WHSE1', 'Closing Stock WHSE2', 'Closing Stock', 'Selected Period'
		]
        ],
    },
    # PIAS (FB16388)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 7,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Editeur', 'col.', 'Code barre', 'Réference', 'Réference fourn.', 'Article', 'Pays', 'Code prix', 'Base de calcul', 'Prix de référence', 'Comission', 'Prix  achat', 'Qté', 'Montant à facturer', 'Stock interne au \d{1,2}/\d{1,2}/\d{4}'
		]
        ],
    },
    # PIAS (FB16389)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 8,
        sheet => 0,
	limit => 2000,
        match_on_any_row => 1,
        lines => [
            [
'Item No.', 'Description', 'Date', 'Barcode Number', 'Sales Qty', 'Return Qty', 'Net Qty', undef, undef, 'Promos', 'Qty On Hand'
		]
        ],
    },
    # PIAS (FB16435)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 9,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Item No.', 'Description', 'Date', 'Barcode Number', 'Sales Qty', 'Return Qty', 'Net Qty', 'Cost', 'Amount Due'
		]
        ],
    },
    # PIAS (FB16472)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 10,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Supplier', 'Code', 'Title', 'Unit', 'Cost \(%\)', 'Period Opening Balance', 'Sales Order', 'Sales Return', 'Goods Received', 'Promo', 'Write Off', 'Period Closing Balance', 'Nett Sales £', '£ Cost from % of NSV', 'Nett Sales Qty', 'Stocktake Adj In', 'Stocktake Adj Out'
		]
        ],
    },
    # DRIPFM (FB16636)
    { service => Client::Service::DSP_DRIPFM,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'unique_track_id', 'timestamp', 'track_number', 'song_title', 'artist_name', 'album_title', 'composer', 'publisher', 'creative_name', 'catalog_number', 'album_upc', 'track_isrc', 'type_of_usage_detail', 'type_of_payment', 'units', 'territory_code', 'territory_name', 'mtri', 'cri', 'pui', 'activity_quarter', 'service_type', 'reporting_period_start_date', 'reporting_period_end_date'
		]
        ],
    },
    # JUKE (FB16457)
    { service => Client::Service::DSP_JUKE,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'LM ID', 'Period Start', 'Period End', 'Service Name', 'Usage Type', 'Platform', 'Country', 'Label Name', 'Artist', 'Title', 'ISRC', 'UPC', 'Product Type', 'Quantity', 'Bitrate', 'Genre'
		]
        ],
    },
    # JUKE (FB16831)
    { service => Client::Service::DSP_JUKE,
        version => 2,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'LM ID', 'Period Start', 'Period End', 'Service Name', 'Usage Type', 'Platform', 'Country', 'Label Name', 'Artist', 'Title', 'ISRC', 'UPC', 'Product Type', 'Quantity', 'Revenue', 'Currency', 'Bitrate', 'Genre'
		]
        ],
    },
# Welk importer disabled (FB16535)
#	# Welk group
#    { service => Client::Service::DSP_WELK,
#        version => 1,
#        sheet => 0,
#        lines => [
#            ['distributor','region','sale_date','artist_name','catalog','album_name','configuration','upc','channel','price','gross_units','gross_revenue','return_units','return_revenue','net_units','net_revenue','currency_code','net_us_dollars','comments'],
#            ['Welk Group',undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef],
#        ],
#    },
#    # Welk group
#    { service => Client::Service::DSP_WELK,
#        version => 1,
#        sheet => 0,
#        lines => [
#            ['distributor','region','sale_date','artist_name','catalog','album_name','configuration','upc','channel','price','gross_units','gross_revenue','return_units','return_revenue','net_units','net_revenue','currency_code','net_us_dollars'],
#            ['Welk Group',undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef],
#        ],
#    },
#    # Welk group
#    { service => Client::Service::DSP_WELK,
#        version => 1,
#        sheet => 0,
#        lines => [
#        ['Service/Distributor', 'Region', 'Sale Date', 'Artist Name', 'Catalog', 'Album Name', 'Configuration', 'UPC', 'Channel', 'Price', 'Gross Units', 'Gross Revenue', 'Return Units', 'Return Revenue', 'Net Units', 'Net Revenue', 'Currency Code', 'Net US Dollars']],
#    },
#    # Welk group
#    { service => Client::Service::DSP_WELK,
#        version => 2,
#        sheet => 0,
#        lines => [
#        ['distributor', 'region', 'sale_date', 'invoice', 'custno', 'company',
#        'artist_name', 'catalog', 'album_name', 'configuration', 'upc',
#        'channel', 'price', 'gross_units', 'gross_revenue',
#        'return_units', 'return_revenue', 'net_units', 'net_revenue', 'currency_code',
#        'net_us_dollars', 'comments'],
#        ['Welk Group',undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef],
#        ],
#    },
    # Zero Inch - Republic (FB16580)
    { service => Client::Service::DSP_ZERO_INCH,
        version => 1,
        sheet => 'any',
        lines => [
            [ 'DATE', 'Time of download', 'EAN', 'ISRC', 'Artist', 'Title', 'Label', 'Net Sales Price', 'HAP', 'Commission', 'Net Revenue', 'Country', 'Affiliate' ],
        ],
    },
    # Six Degrees - Outside Music
    { service => Client::Service::DSP_OUTSIDEMUSIC,
        version => 1,
        sheet => 'any',
        lines => [
            ['Product code','Vendor Part Number','Warehouse\/Part number','Description','Cost',undef,'Sales'],
        ],
    },
    # Six Degrees - Physical Sales
    { service => Client::Service::DSP_SDROUTSIDESALES,
        version => 1,
        sheet => 0,
        lines => [
            ['SIX DEGREES RECORDS',undef,undef,'Country','Type','Date','Num','Name City','Name State','Name Zip','Name','Item','Item Description','Qty','Sales Price','Amount'],
        ],
    },
    # same as above, but now has country
    { service => Client::Service::DSP_SDROUTSIDESALES,
        version => 2,
        sheet => 0,
        lines => [
            [undef, undef, undef, 'Country', 'Type', 'Date', 'Num', 'Name City', 'Name State', 'Name Zip', 'Name', 'Item', 'Item Description', 'Qty', 'Sales Price', 'Amount'],
        ],
    },
    { service => Client::Service::DSP_SDROUTSIDESALES,
        version => 3,
        sheet => 0,
        lines => [
            [undef, undef, undef, undef, 'Type', 'Date', 'Num', 'Name City',
            'Name State', 'Name Zip', 'Name', 'COUNTRY', 'Item', 'Item Description',
            'Qty', 'Sales Price', 'Amount'],
        ],
    },
    { service => Client::Service::DSP_SDROUTSIDESALES,
        version => 3,
        sheet => 0,
        lines => [
            [undef, undef, undef, undef, 'Type', 'Date', 'Num', 'Name City',
            'Name State', 'Name Zip', 'Name', 'Name Contact', 'Item', 'Item Description',
            'Qty', 'Sales Price', 'Amount'],
        ],
    },
    { service => Client::Service::DSP_SDROUTSIDESALES,
        version => 4,
        sheet => 0,
        lines => [
            [undef, undef, undef, 'Type', 'Date', 'Num', 'Name City',
            'Name State', 'Name Zip', 'Name', 'COUNTRY', 'Item', 'Item Description',
            'Qty', 'Sales Price', 'Amount'],
        ],
    },
    { service => Client::Service::DSP_SDROUTSIDESALES,
        version => 4,
        sheet => 0,
        lines => [
            [undef, undef, undef, 'Type', 'Date', 'Num', 'Name City',
            'Name State', 'Name Zip', 'Name', 'Name Contact', 'Item', 'Item Description',
            'Qty', 'Sales Price', 'Amount'],
        ],
    },    
    # Cherry Red - Cherry Red Digital Downloads
    { service => Client::Service::DSP_CHERRYRED,
        version => 1,
        sheet => 0,
        lines => [
            ['OrderId','AccountId','OrderStatusId','GiftId','GiftCode','SupplierId','Number','Description','SupplierTable','OrderDate','OrderTime','SupplierItemBuyingPrice','SupplierGiftWrap','DeliveryPrice','VatAmount','GrossAmount','DeliveryComments','CCAuthorisationCode','Name','GiftWrapped','Message','HouseName','HouseFlatNumber','Street','District','TownCity','County','PostCode','Country','OrderStatus','SupplierName','OrderDateTime','OrderHoursOld','AffiliateId','Currency','PaymentMethod','ContentItemId','ThirdPartyRef','ThirdPartySupplier','ServiceId','ServiceTag','ProductType','ProductDataSource','SettleStatus','SettleDate'],
        ],
    },
    # Essential Distribution - Nettwerk (FB17154)
    { service => Client::Service::DSP_ESSENTIAL_DISTRIBUTION,
        version => 2,
	file_name => 'Digital',
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Vendor', 'Country of Sale', 'Sales Period', 'Statement Period', 'Label', 'Catalog Artist', 'Catalog Title', 'Catalog No', 'UPC', 'Format', 'Net Units', 'Net Sales', 'ESS Fees', 'Net Payable'],
        ],
    },
    # Essential Distribution - Cherry Red (FB16803)
    { service => Client::Service::DSP_ESSENTIAL_DISTRIBUTION,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Vendor', 'Country of Sale', 'Sales Period', 'Statement Period', 'Label', 'Catalog Artist', 'Catalog Title', 'Catalog No', 'UPC', 'Format', 'Net Units', 'Net Sales', 'ESS Fees', 'Net Payable'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 1,
        sheet => 1,
        lines => [
            [undef],
            ['Mois','Type','ID Mobivillage','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 15,
            ['Mois','Type','ID Mobivillage','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 16,
            ['Mois','Type','ID Mobivillage','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 17,
            ['Mois','Type','ID Mobivillage','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 17,
            ['Mois','Type','ID Mobivillage','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Correction','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 3,
        sheet => 0,
        lines => [
            ([undef]) x 17,
            ['Mois','Type','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 18,
            ['Mois','Type','ID Mobivillage','Titre','Artiste','Auteur','Compositeur','MAJOR','LABEL','ISRC','Client','Pays','Service ID Mobivillage','Downloads','Prix HT','\% de reversement','Reversement unitaire','Montant'],
        ],
    },
    # Mobivillage - Sanctuary UK
    { service => Client::Service::DSP_MOBIVILLAGE,
        version => 4,
        sheet => 'any',
        lines => [
            ([undef]) x 16,
            ['Month','Company','Type','Payant O/N','ID','Name','Artist','Author','Label','ISRC','Client','Country','Access',undef,'Quantity','Calculation Basis','Royalty Rate \%','Royalty per Unit','Royalty amount'],
        ],
    },
    # Cherry Red - Uploader
    { service => Client::Service::DSP_UPLOADER,
        version => 1,
        sheet => 0,
        lines => [
            ['Service Name','Period Start','Period End','Label Pay','Account ID','Label','Artist','Title','Catalogue ID','UPC','ISRC','Sale Format','Territory','Delivery Type','Quantity','Unit Price','Returns','Gross','Currency','Exchange Rate','Mechanical Paid','Gross GBP','Label Share'],
        ],
    },
    # Cherry Red - Uploader
    { service => Client::Service::DSP_UPLOADER,
        version => 2,
        sheet => 0,
        lines => [
            ['Service Name','Period Start','Period End','Label Pay','Account ID','Label','Artist','Title','ISRC','Catalogue ID','UPC','Sale Format','Territory','Delivery Type','Quantity','Unit Price','Returns','Gross','Currency','Exchange Rate','Mechanical Paid','Gross GBP','Label Share'],
        ],
    },
    # Cherry Red - Uploader
    { service => Client::Service::DSP_UPLOADER,
        version => 2,
        sheet => 0,
        lines => [
            [undef],
            ['Service Name','Period Start','Period End','Label Pay','Account ID','Label','Artist','Title','ISRC','Catalogue ID','UPC','Sale Format','Territory','Delivery Type','Quantity','Unit Price','Returns','Gross','Currency','Exhchange Rate','Mechanical Paid','Gross GBP','Label Share'],
        ],
    },
    # Sanctuary UK - IPlay
    { service => Client::Service::DSP_IPLAY,
        version => 1,
        sheet => 0,
        lines => [
            [undef],
            ['\d{8}',undef,undef,undef,'DOWNLOAD','OTHER','WEB',undef,'\w{10}',undef,undef,'\d+',undef,undef,undef,undef,'\d{8}','iplay','PL','PL','STD','PLN'],
        ],
    },
    # Sanctuary UK - IPlay
    { service => Client::Service::DSP_IPLAY,
        version => 2,
        sheet => 1,
        lines => [
            [undef],
            [undef],
            ['Nazwa artysty','Tytul','Ilosc sprzedanych sztuk','Cena Iplay\.pl \(bez vat\)','Cena dystrybutora'],
        ],
    },
    # Sanctuary UK - MusicBrigade
    { service => Client::Service::DSP_MUSICBRIGADE,
        version => 1,
        sheet => 0,
        lines => [
            [undef],
            ['Start Date','End Date','UPC','ISRC','Cat No','Quantity','Royalty','Total Per Line','Format','Retail Channel','Artist','Title','Label','Blank','Sale Or Credit','Territory Of Sale','Retail Price','Currency'],
        ],
    },
    # Sanctuary UK - MusicBrigade
    { service => Client::Service::DSP_MUSICBRIGADE,
        version => 2,
        sheet => 0,
        lines => [
            ['Start Date','End Date','ISRC','Quantity','Format','Format2','Artist','Retail Channel','Title','Label','Sale Or Credit','Territory Of Sale','Royalty','Total per line','Currency'],
        ],
    },
    # Sanctuary UK - MusicBrigade
    { service => Client::Service::DSP_MUSICBRIGADE,
        version => 3,
        sheet => 0,
        lines => [
            ['Start Date','End Date','ISRC','Quantity','Format','Format2','Artist','Retail Channel','Title','Label','Sale Or Credit','Territory Of Sale','Retail price','Currency'],
        ],
    },
    # Destra - Big Pond
    { service => Client::Service::DSP_BIGPOND,
        version => 1,
        sheet => 0,
        lines => [
            ['Month','Parent Label','Label','Vendor Code','CountryOfSale','EntityToBeBilled','E-RetailerName','E-SalesDate','SalesChannel','BundleOrIndividual','ISRC','TrackArtistName','TrackTitle','UPC','AlbumArtistName','AlbumTitle','PricePaid','CurrencyType','No_OfAudioTransaction','No_OfAudioRevGenTrasaction','SourceTaxRate','DistMethod','WholePrice','ConsumerCountry','DistChannel','Price Per Item','Label Share','Refund'],
        ],
    },
    # Destra - DigiRama
    { service => Client::Service::DSP_DIGIRAMA,
        version => 1,
        sheet => 0,
        lines => [
            ['Date','Type','Content Provider Ref','Artist','Title','Label','Amount'],
        ],
    },
    # Destra - Hutchinson
    { service => Client::Service::DSP_HUTCHINSON,
        version => 1,
        sheet => 0,
        lines => [
            ['MercuryId','Type','Title','Artist','Territory','Sub Label','Label','Sell Price','DLs','PPD','Total Royalties'],
        ],
    },
    # Destra - 5th Finger
    { service => Client::Service::DSP_5THFINGER,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 6,
            [undef,'Track name','Artist','Composer','Publisher','Record Company','Billable events','Value of Retail Sales',undef],
        ],
    },
    # Destra - Destra JB
    { service => Client::Service::DSP_DESTRAJB,
        version => 1,
        sheet => 0,
        lines => [
            ['Vendor Code','Vendor Name','Vendor Country Code','UPC','ISRC','Artist Name','Track Title','Album Title','Qty','Transaction Date','Transaction No','Product Origin ID','Product ID','Price','PPD','Additional Revenue','Label Share Additional Rev\.','Label Share Inc','Currency','Consumer Country Code','PostCode','Transaction Type','Sale Type','Duration Of Transaction','Volume of Data Transferred \(Kb\)','Distribution Channel','Sound Scan ID','Length of Recording','LabelGroup','Digital ID','Number of burns','Number times Played','Total Permanent Downloads','Total Tethered Downloads','Total Streamed Tracks'],
        ],
    },
    # Destra - Sanity
    { service => Client::Service::DSP_SANITY,
        version => 1,
        sheet => 0,
        lines => [
            ['Kiosk','TransactionID','DateTime','ProductType','Label','Item Name','UPC\/ISRC','PriceCode','PPD'],
        ],
    },
    # Destra - TNZ
    { service => Client::Service::DSP_TNZ,
        version => 1,
        sheet => 0,
        lines => [
            ['Content ID','Content Type','Content Title','Content Aurthor\/Artist','TT Label','CT Label','AT Label',undef,'DL','Sale Price \(\$NZ\)','Sales \(Ex GST\)','Royalties'],
        ],
    },
    # Destra - Sound Buzz - Online
    { service => Client::Service::DSP_SOUNDBUZZ,
        version => 1,
        sheet => 1,
        match_on_any_row => 1,
        lines => [
            ['SrNo','CountryOfSale','E-RetailerName','ReportingDate','InitialDate','EndDate','SalesDate','DistMethod','BundleOrIndividual','UPC','ISRC','TrackArtistName','TrackTitle','TrackLabelName','TrackParentLabelName','AlbumArtistName','AlbumTitle','AlbumLabelName','AlbumParentLabelName','PricePaid \(excl GST\)','PPD \(excl GST\)','CurrencyType','No_OfAudioTransaction','OrderNo','ConsumerCountry','DistChannel','Refund_Status','OptusTransactionId'],
        ],
    },
    # Destra - Sound Buzz - Mobile
    { service => Client::Service::DSP_SOUNDBUZZ,
        version => 2,
        sheet => 1,
        match_on_any_row => 1,
        lines => [
            ['SrNo','CountryOfSale','E-RetailerName','SalesDate','DistMethod','BundleOrIndividual','UPC','ISRC','TrackArtistName','TruetoneTitle','Truetone\'s LabelName','PricePaid \(incl GST\)','PPD \(excl GST\)','CurrencyType','No_OfAudioTransaction','RandomKey','ConsumerCountry','DistChannel','Refund_Status','OptusTransactionId'],
        ],
    },
    # Destra  - Belong
    { service => Client::Service::DSP_BELONG,
        version => 1,
        sheet => 1,
        lines => [
            ['Truetones',undef,undef,undef,undef,undef],
            ['Product Type','Item Name','License','Channel','Channel Name','Downloads'],
        ],
    },
    # Destra - MobileActive
    { service => Client::Service::DSP_MOBILEACTIVE,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Catalog Id','Title','Third Party Code','Request Time'],
        ],
    },
    # Seed Distribution - Hip Hop Site
    { service => Client::Service::DSP_HIPHOPSITE,
        version => 1,
        sheet => 0,
        lines => [
            ['Artist','Title','SKU','UPC','ISRC','Price','Quantity Sold','\% Split','Sub Total'],
        ],
    },
    # Audio Bee - Spiral Frog
    { service => Client::Service::DSP_SPIRALFROG,
        version => 1,
        sheet => 0,
        lines => [
           ['AudioBee','\d+','T|A',undef,'\d{8}',undef,'\w+','\w+','\w+','\w+','\d{7}','\d{7}','\w','\d+','\d+',undef,undef,undef,'SpiralFrog',undef,undef],
        ],
    },
    # Concord -> StarCon
    { service => Client::Service::DSP_STARCON,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['Super Label','Super Label Code','Sub Label','Sub Label code','Object Acct','Subsidiary','Music Line','Sales Channel','Partner','Sales Type','Sold As','Album Track Code','Album Artist','Album Title','UPC','Track Artist','Track Title','ISRC','Source UPC','Physical Album Release Date','Configuration Code','Configuration','Units','Revenue'],
        ],
    },
    # Alexander Street Press -> Arhoolie
    { service => Client::Service::DSP_ALEXANDERSTREET,
        version => 1,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            ['Entity ID','Album Title','Track Title','Label','Catalog Number','Number of Playbacks'],
        ],
    },
    # Sunnyside -> HD Tracks
    { service => Client::Service::DSP_HDTRACKS,
        version => 1,
        sheet => 0,
        lines => [
            ['Start Date','End Date','UPC','ISRC','Distributor Number','Distributor Name','Label Number','Label Name','Artist','Track Title','Album Title','Quantity','Unit Price','Track or Album','Extended Price','Extra'],
        ],
    },
    # Sunnyside -> HD Tracks
    { service => Client::Service::DSP_HDTRACKS,
        version => 2,
        sheet => 0,
        lines => [
            ['Start Date','End Date','UPC','ISRC','Distributor Number','Distributor Name','Label Number','Label Name','Artist','Track Title','Album Title','Quantity','Unit Price','Track or Album','Extended Price','96/24','Extra'],
        ],
    },
    # Blind Pig -> HD Tracks
    { service => Client::Service::DSP_HDTRACKS,
        version => 3,
        sheet => 0,
        lines => [
            [undef],
            [undef],
            ['UPC','ISRC','Distributor Number','Distributor Name','Label Number',
             'Label Name','Artist','Track Title','Album Title','Quantity','Unit Price',
             'Track or Album','Extended Price','96/24','Extra'],
        ],
    },
    # OSEAO - AudioJelly
    { service => Client::Service::DSP_AUDIOJELLY,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['AJ ref','Company','Date','Track \/ album name','Record label','Head label','Artist','Territory','Gross','Vat','Net','Royalty rate','Fraud protection fee','Royalty'],
        ],
    },
    # Ditto -> AudioJelly
    { service => Client::Service::DSP_AUDIOJELLY,
        version => 2,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['Catalogue number','Product name','Company','Date','AJ ref','Record label','ISRC','Artist','Territory','Gross','Vat','Net','Royalty rate','MCPS deduction','Royalty'],
        ],
    },
    # Houseplanet -> AudioJelly
    { service => Client::Service::DSP_AUDIOJELLY,
        version => 3,
        sheet => 0,
        lines => [
            ['UPC\/EAN','Catalogue Number','ISRC','Quantity','Retail Price','Unit Gross','VAT','Unit Net','Royalty Share \(%\)','Royalty','Currency','Exchange Rate','Label Royalty \(GBP\)','Sub Label','Artist','Album Title','Song Title','Mix','Retailer Territory','Customer Territory','3rd Party Retailer','Product Type','Sale Type','Customer ID','Date of Transaction'],
        ],
    },
    # Houseplanet -> AudioJelly
    { service => Client::Service::DSP_AUDIOJELLY,
        version => 4,
        sheet => 0,
        lines => [
            ['UPC\/EAN','Catalogue Number','ISRC','Quantity','Retail Price','Unit Gross','VAT','Unit Net','Royalty Share \(%\)','Royalty','Currency','Exchange Rate','Label Royalty \(GBP\)','Sub Label','Artist','Album Title','Song Title','Retailer Territory','Customer Territory','3rd Party Retailer','Product Type','Sale Type','Date of Transaction'],
        ],
    },
    # OSEAO - What People Play
    { service => Client::Service::DSP_WHATPEOPLEPLAY,
        version => 1,
        sheet => 0,
        lines => [
            ['Supplier','DSP \(Licensee\)','Date Report','Period Start','Period End','Day of Download','Time of Download','Portal','Country of Sale','Transaction Type','Distribution channel','Format','Quality','Number of Sales','EAN \/ UPC','ISRC','Catalog No','Artist','Title','Label','End Consumer Price \(gross\)','VAT','Royality Basis','Mechanicals','Currency ECP \(ISO\)','Exchange Rate','Label Share','PPD \(net\)\/ per Order','Net Revenue','Currency PPD \(ISO\)','Exchange Rate \(PPD\)','Mechanicals payed by'],
        ],
    },
    # OSEAO - DanceRecords
    { service => Client::Service::DSP_DANCERECORDS,
        version => 1,
        sheet => 0,
        lines => [
            ['Date','Time','Format','Qty','Price','Commission','ISRC','Artist','Title','Label','Country','UPC','Type'],
        ],
    },
    # OSEAO - DanceRecords
    { service => Client::Service::DSP_DANCERECORDS,
        version => 1,
        sheet => 0,
        lines => [
            ['Date','Time','Format','Qty','Price','Commission','Your Stock# \(Track\)','Artist','Title','Label','Country','Your Stock# \(Release\)','Type','ISRC','UPC'],
        ],
    },
    # OSEAO - Stompy
    { service => Client::Service::DSP_STOMPY,
        version => 1,
        sheet => 0,
        lines => [
            [undef],
            ['Artist \/ Producer','Title','Label','ISRC','Format','Price','Qty','Royalties'],
        ],
    },
    # OSEAO - Stompy
    { service => Client::Service::DSP_STOMPY,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['Artist \/ Producer','Title','Label','ISRC','Format','Price','Qty','Royalties'],
        ],
    },
    # OSEAO - Stompy
    { service => Client::Service::DSP_STOMPY,
        version => 2,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Artist \/ Producer','Title','Label','ISRC','UPC\/EAN','Format','Price','Qty','Royalties'],
        ],
    },
    # Kufala -> Live Downloads
    { service => Client::Service::DSP_LIVEDOWNLOADS,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 9,
            ['ID','TITLE','PRICE','SALES','TOTAL REVENUE','MB TRANSFERRED','DELIVERY COST','REFUNDS','REFUND TOTAL','SERVICE FEE','NET REVENUE'],
        ],
    },
    # 7 Digital -> Ditto
    { service => Client::Service::DSP_7DIGITAL,
        version => 1,
        sheet => 0,
        lines => [
            ['saledate','productartist','productname','trackartist','trackname','ISRC','UPC','labelname','shopdesc','outpayment','currencycode'],
        ],
    },
    # 7 Digital -> Ditto
    { service => Client::Service::DSP_7DIGITAL,
        version => 2,
        sheet => 0,
        lines => [
            [undef],
            [undef],
            [undef],
            ['Sale Date','Product Artist', 'Product Name',
            'Track Artist', 'Track Name', 'ISRC', undef, 'UPC',
            'Label Name', 'Store Name', 'shopcountry',
            'bundledtracks', 'Sale DateStamp', 'Customer Country',
            'Currency', undef, 'Ex Rate', undef],
        ],
    },
    # 7 Digital -> Ministry of Sound
    { service => Client::Service::DSP_7DIGITAL,
        version => 3,
        sheet => 0,
        lines => [
    				([undef]) x 7,
    				['Sale Date','Product Artist','Product Name','Track Artist','Track Name','ISRC','UPC','Label Name','Store Name', 'shopcountry','bundledtracks','Sale ID','User ID','Transaction ID','Sale DateStamp','Chart Week','Customer Country','is Eu Country',undef,'Paymentmethod Desc','Currency','Transaction Is Own Label Shop','Transaction Cost','Collection Society Cost','SMSCost','Revenue After Costs','Ex Rate',undef],
				],
    },
    # 7 Digital -> BSD
    { service => Client::Service::DSP_7DIGITAL,
        version => 4,
        sheet => 0,
        lines => [
    				([undef]) x 6,
    				['Sale Date','Product Artist','Product Name','Track Artist','Track Name','ISRC','UPC','Label Name','Store Name', 'shopcountry','bundledtracks','Chart Week','Customer Country','is Eu Country','Currency','Revenue After Costs','Ex Rate',undef],
				],
    },
    # 7 Digital -> BSD (again)
    { service => Client::Service::DSP_7DIGITAL,
        version => 5,
        sheet => 0,
        lines => [
    				([undef]) x 7,
    				['Sale Date','Product Artist','Product Name','Track Artist','Track Name','ISRC','UPC','Label Name','Store Name', 'shopcountry','bundledtracks','Sale DateStamp','Customer Country','Currency','Revenue After Costs','Ex Rate',undef],
				],
    },
    # 7 Digital -> La Cupula
    { service => Client::Service::DSP_7DIGITAL,
        version => 6,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
    				['Sale Date','Product Artist','Product Name','Track Artist','Track Name','ISRC','UPC','Label Name','Store Name', 'shopcountry','bundledtracks','Sale ID','User ID','Transaction ID','Sale DateStamp','Chart Week','Customer Country','is Eu Country',undef,'Paymentmethod Desc','Retail Price','Net Price','Currency','Transaction Is Own Label Shop','Transaction Cost','Collection Society Cost','SMSCost','Revenue After Costs','Ex Rate',undef],
				],
    },
    # 7 Digital -> MoS
    { service => Client::Service::DSP_7DIGITAL,
        version => 7,
        sheet => 0,
        lines => [['saledate', 'productartist', 'productname', 'trackartist', 'trackname', 'ISRC', 'UPC',
        'labelname', 'shopdesc', 'currencycode', 'outpayment', 'Ex rate', undef,],
      ],
    },
    # 7 Digital -> another revision...
    { service => Client::Service::DSP_7DIGITAL,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
                    ['Sale Date', 'Product Artist', 'Product Name', undef, 'Track Name', 'ISRC', 'UPC',
        'Label Name', 'Store Name', 'shopcountry', 'bundledtracks', 'DP Currency', 'Revenue After Costs', undef, undef,
        ],
      ],
    },  
    # 7 Digital -> Beggars (FB12267)
    { service => Client::Service::DSP_7DIGITAL,
        version => 9,
        sheet => 0,
        lines => [[
            'Start Date', 'End Date', 'UPC', 'ISRC', 'Cat No', 'Quantity', 'Royalty', 'Total Per Line',
            'Single/Album', 'Retail Channel', 'Artist Name', 'Release Title', 'Label', 'Blank',
            'Sale or Credit', 'Territory of Sale', 'Currency', 'Ex Rate', undef
        ],
      ],
    },
    # 7 Digital -> Skint (FB1676)
    { service => Client::Service::DSP_7DIGITAL,
        version => 10,
        sheet => 0,
        match_on_any_row => 1,
        lines => [[
            'Sale Date', 'Product Artist', 'Product Name', 'Track Artist', 'Track Name', 'ISRC', 'UPC', 
            'Label Name', 'Store Name', 'shopcountry', 'bundledtracks', 'Currency', 'Revenue After Costs', 
            'Exchange Rate',
        ],
      ],
    },    
    # 7 Digital -> MOS (FB2087)
    { service => Client::Service::DSP_7DIGITAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [[
             'Sale Date', 'Product Artist', 'Product Name', 'Track Artist', 'Track Name', 'ISRC', 'UPC',
	     'Label Name', 'Store Name', 'DP Currency', 'Revenue After Costs', 'Exchange Rate', '£ Due'
        ],
      ],
    },    
    # 7 Digital -> MOS (FB3834)
    { service => Client::Service::DSP_7DIGITAL,
        version => 12,
        sheet => 0,
        match_on_any_row => 1,
        lines => [[
             'Sale Date', 'Product Artist', 'Product Name', 'Track Artist', 'Track Name', 'ISRC', 'UPC',
	     'Label Name', 'Store Name', 'Shop Country', 'Bundle Track', 'DP Currency', 'Label Revenue in DP Currency',
	     'DP Exchange Rate to GBP', 'Label Revenue \(\w{3}\)'

        ],
      ],
    },    
    # 7 Digital -> MOS (FB12141)
    { service => Client::Service::DSP_7DIGITAL,
        version => 13,
        sheet => 0,
        match_on_any_row => 1,
        lines => [[
'Affliate/Partner Name', 'Sale Date', 'Product Artist', 'Product Name', 'Track Artist', 'Track Name', 'ISRC', 'UPC', 'Label Name', 'Store Name', 'Shop Country', 'Format', 'Bit Rate', 'Bundle Track', 'DP Currency', 'Label Revenue in DP Currency', 'DP Exchange Rate to GBP', 'Label Revenue \(\w{3}\)'
        ],
      ],
    },    
    # 7 Digital -> Syntax (FB13588)
    { service => Client::Service::DSP_7DIGITAL,
        version => 14,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [[
'Date Time Played', 'Country Of Sale', 'Subscription Type', 'Sales Channel \(category\)', 'Partner', 'ISRC', 'Track Artist', 'Track Title', 'UPC', 'Album Artist', 'Album Title', 'Label Name', 'Number Of Transactions', 'Statement Amount', 'Statement Currency'
        ],
      ],
    },
    # Oseao Media Group -> Digital Tunes
    { service => Client::Service::DSP_DIGITALTUNES,
        version => 1,
        sheet => 0,
        lines => [
            ['Purchase date','Type','Item','Label','UPC','Cat No','External Id','ISRC','Price','Transaction fee','Data fee','Artist fee','VAT','Royalty basis','Royalty'],
        ],
    },
    # Definative Jux -> Pharmacy
    { service => Client::Service::DSP_PHARMACY,
        version => 1,
        sheet => 1,
        match_on_any_row => 1,
        lines => [
            ['Item ID','Item Name','# Of Units','\% Of Units','\% Of Sales','Total Sales'],
        ],
    },
    # OSEAO -> Primal Records
    { service => Client::Service::DSP_PRIMALRECORDS,
        version => 1,
        sheet => 0,
        lines => [
            ['ORDERID','PRODUCTCODE','PRODUCT','PROVIDER','PRICE',undef,'Provider \(@ \d{2}\%\)','TOTAL'],
        ],
    },
    # OSEAO -> TraxSource
    { service => Client::Service::DSP_TRAXSOURCE,
        version => 1,
        sheet => 0,
        lines => [
            ['Label','UPC - EAN','ISRC','Catalog Number','Artist','Title','Track Number','Track','Bitrate','Price Point','Trans \%','Percentage','Unit Rate','Qty','Amount Due'],
        ],
    },
    # OSEAO -> TraxSource
    { service => Client::Service::DSP_TRAXSOURCE,
        version => 2,
        sheet => 0,
        lines => [
            ['Label','UPC - EAN','ISRC','Catalog Number','Artist','Title','Track Number','Track','bundle','Bitrate','Price Point','Trans \%','Percentage','Unit Rate','Qty','Amount Due'],
        ],
    },
    # OSEAO -> TraxSource
    { service => Client::Service::DSP_TRAXSOURCE,
        version => 3,
        sheet => 0,
        lines => [
            ['Label','Period','UPC - EAN','ISRC','Catalog Number','Artist','Title','Track Number','Track','bundle','Bitrate','Price Point','Trans \%','Percentage','Unit Rate','Qty','Amount Due'],
        ],
    },
    # OSEAO -> TraxSource
    { service => Client::Service::DSP_TRAXSOURCE,
        version => 4,
        sheet => 0,
        lines => [
            ['Label', 'Period', 'UPC - EAN', 'ISRC', 'Catalog Number',
            'Artist', 'Title', 'Track Number', 'Track', 'bundle', undef,
            'Bitrate', 'Price Point', 'Trans %', 'Percentage', 'Unit Rate',
            'Qty', 'Mechanical Withholding', 'Amount Due'],
        ],
    },
    # OSEAO -> TraxSource Version 5
    { service => Client::Service::DSP_TRAXSOURCE,
        version => 5,
        sheet => 0,
        lines => [
            ([undef]) x 20,
            ['Label', 'Period', 'UPC - EAN', 'Catalog Number',
            'Release Artist', 'Release Title', 'ISRC', 'Track Number',
            'Track Artist', 'Track Title', 'Track Version', 'bundle', 'Territory',
            'Bitrate', 'Price Point', 'Trans %', 'Percentage',
            'Mechanical Withholding', 'Unit Rate', 'Qty', 'Amount Due'],
        ],
    },
    # CBS Records -> RED DIGITAL
    { service => Client::Service::DSP_REDDIGITAL,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 2,
            ['Label','Configuration','Artist','Title','Prod#','ISRC','Onl Dwn#','Onl Dwn\$','Onl Sub#','Onl Sub\$','Mob Dwn#','Mob Dwn\$','Mob Sub#','Mob Sub\$','Multi Dwn#','Multi Dwn\$','Multi Sub#','Multi Sub\$','Kiosk#','Kiosk\$','Embed#','Embed\$','Other#','Other\$','Tot#','Tot\$'],
        ],
    },
    # CBS Records -> RED DIGITAL
    { service => Client::Service::DSP_REDDIGITAL,
        version => 2,
        sheet => 0,
        lines => [
            ['LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'EMBED QT', 'EMBED AM', 'OTHER QT', 'OTHER AM'],
        ],
    },
    # ATO -> RED DIGITAL
    { service => Client::Service::DSP_REDDIGITAL,
        version => 3,
        sheet => 0,
        lines => [
            ['PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'EMBED QT', 'EMBED AM', 'OTHER QT', 'OTHER AM'],
        ],
    },
    # ATO -> RED DIGITAL
    { service => Client::Service::DSP_REDDIGITAL,
        version => 4,
        sheet => 0,
        lines => [
            ['LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'UPC', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'EMBED QT', 'EMBED AM', 'OTHER QT', 'OTHER AM'],
        ],
    },
    # ATO -> RED DIGITAL
    { service => Client::Service::DSP_REDDIGITAL,
        version => 5,
        sheet => 0,
        lines => [
            ['PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'SALES PERIOD', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'EMBED QT', 'EMBED AM', 'OTHER QT', 'OTHER AM'],
        ],
    },    
    # ATO -> RED DIGITAL, version 6
    { service => Client::Service::DSP_REDDIGITAL,
        version => 6,
        sheet => 0,
        lines => [
            ['PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'SALES PERIOD', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'],
        ],
    },    
    # ATO -> RED DIGITAL, version 7
    { service => Client::Service::DSP_REDDIGITAL,
        version => 7,
        sheet => 0,
        lines => [
            ['PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'],
        ],
    },    
    # HORNBLOW -> RED DIGITAL, version 8
    { service => Client::Service::DSP_REDDIGITAL,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['PROD NO', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC',
	    'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'],
        ],
    },    
    # HORNBLOW -> RED DIGITAL, version 9
    { service => Client::Service::DSP_REDDIGITAL,
        version => 9,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             ['PROD NO', 'LABEL', 'ARIST', 'ALBUM', 'CONFIGURATION', 'TRACK TITLE', 'ISRC', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'],
        ],
    },    
    # HORNBLOW -> RED DIGITAL, version 10
    { service => Client::Service::DSP_REDDIGITAL,
        version => 10,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             ['LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'UPC', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'],
        ],
    },    
    # HORNBLOW -> RED DIGITAL, version 11 (FB16829)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 11,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
             'PROD NO', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'
             ],
        ],
    },    
    # HORNBLOW -> RED DIGITAL, version 12 (FB16913)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 12,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
             'PROD NO', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'UPC', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'
             ],
        ],
    },    
    # HORNBLOW -> RED DIGITAL, version 13 (FB16915)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 13,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'SALES PERIOD', 'DISTRIBUTION CHANNEL', 'TOTAL QT', 'TOTAL AM'
             ],
        ],
    },    
    # ELEVEN SEVEN -> RED DIGITAL, version 14 (FB17051)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 14,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
             'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'UPC', 'COUNTRY', 'TOTAL QT', 'TOTAL AM', 'ONLINE DWN QT', 'ONLINE DWN AM', 'ONLINE SUB QT', 'ONLINE SUB AM', 'MOBILE DWN QT', 'MOBILE DWN AM', 'MOBILE SUB QT', 'MOBILE SUB AM', 'MULTIP DWN QT', 'MULTIP DWN AM', 'MULTIP SUB QT', 'MULTIP SUB AM', 'KIOSK QT', 'KIOSK AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'
             ],
        ],
    },    
    # Fearless -> Red Digital, version 15 (FBoD881)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 15,
        sheet => 0,
        lines => [
             ['PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'UPC', 'COUNTRY', 'SALES PERIOD', 'DISTRIBUTION CHANNEL', 'TOTAL QT', 'TOTAL AM'],
        ],
    },    
    # Mom And Pop Music -> Red Digital, version 16 (FBoD9811)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 16,
        sheet => 0,
        lines => [
             ['LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'UPC', 'COUNTRY', 'TOTAL AM', 'DOWNLOAD QT', 'DOWNLOAD AM', 'STREAM PREMIUM QT', 'STREAM PREMIUM AM', 'STREAM AD SUPPORTED QT', 'STREAM AD SUPPORTED AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM', '^$'],
        ],
    },        
    # Black River -> RED DIGITAL, version 17 (FB16828)
    { service => Client::Service::DSP_REDDIGITAL,
        version => 17,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'PROVIDER', 'LABEL', 'ARIST', 'PARENT TITLE', 'CONFIGURATION', 'TRACK ARTIST', 'TRACK TITLE', 'ISRC', 'PROD NO', 'PARENT PROD NO', 'COUNTRY', 'SALES PERIOD', 'TOTAL AM', 'DOWNLOAD QT', 'DOWNLOAD AM', 'STREAM PREMIUM QT', 'STREAM PREMIUM AM', 'STREAM AD SUPPORTED QT', 'STREAM AD SUPPORTED AM', 'LOCKER QT', 'LOCKER AM', 'OTHER QT', 'OTHER AM'
             ],
        ],
    },    
    # Razor and Tie -> Trusonic
    { service => Client::Service::DSP_TRUSONIC,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 4,
            ['Label','TruSonic ID','Titles','Artists','per song'],
        ],
    },
    # Ditto -> TuneTribe
    { service => Client::Service::DSP_TUNETRIBE,
        version => 1,
        sheet => 0,
        lines => [
            ['Order date','Order id','Customer country','Artist name','Product name','Product id','UPC','ISRC','Owner net revenue'],
        ],
    },
    # Ditto -> TuneTribe
    { service => Client::Service::DSP_TUNETRIBE,
        version => 2,
        sheet => 0,
        lines => [
            ['(\d+)\D(\d+)\D(\d{4})','(\d+)\D(\d+)\D(\d{4})',undef,undef,undef,'(\d)',undef,undef,'(A|S)','tunetribe',undef,undef,undef,undef,'S','UK'],
        ],
    },
    # Ditto -> TuneTribe
    { service => Client::Service::DSP_TUNETRIBE,
        version => 3,
        sheet => 0,
        lines => [
            ['Artist','Title','Release date','Keyword','Single ID','Company','Invoice','Nov','Dec','Jan','Feb','Total','Prev\. Total','New Total','Redeemed','Due','Prev\. Accounted','Due','DP','Amount Due'],
        ],
    },
    # Ditto -> TuneTribe
    { service => Client::Service::DSP_TUNETRIBE,
        version => 4,
        sheet => 0,
        lines => [
            ['Order Date','Order Id','Sale Type','Customer Country','Artist Name','Product Name','Product Id','UPC','ISRC','Owner Net Revenue'],
        ],
    },
    # Ditto -> TuneTribe
    { service => Client::Service::DSP_TUNETRIBE,
        version => 5,
        sheet => 0,
        lines => [
            ['Order Date','Order Id','Sale Type','Customer Country','Artist Name','Product Name','Product Id','UPC','ISRC','Net Item Price','MCPS Cost','TuneTribe Commission','Affiliate Commission','Payment Processing Cost','Owner Net Revenue'],
        ],
    },
    # Touch N Go Physical
    { service => Client::Service::DSP_TOUCHNGOPHYS,
        version => 1,
        sheet => 0,
        lines => [
            ['UPC','CAT','CAT#, BAND, DESC','CURRENT ON HAND','PTD NET','PTD RTN','PTD GROSS','YTD NET','YTD RTN','YTD GROSS','PTD NET \$','Due To KRS'],
        ],
    },
    # DualTone -> FunMobility
    { service => Client::Service::DSP_FUNMOBILITY,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 11,
            ['Carrier','Title','Artist','Transactions','Retail Price','Net Price','Rev\. Share','Performance Id','Royalty Formula Notes','Product Type','Royalty\/Unit','Royalty','UPC','EMIDTI','GRID','ISRC','External Id'],
        ],
    },
    # Dualtone -> FunMobility
    { service => Client::Service::DSP_FUNMOBILITY,
        version => 2,
        sheet => 0,
        lines => [
           [undef],
           [undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,'FunMobility'],
        ],
    },
    # Dualtone -> FunMobility
    { service => Client::Service::DSP_FUNMOBILITY,
        version => 3,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Carrier','Title','Artist','Trans','Retail Price','Royalty Amt','Perf ID','Royalty Formula','Product Type','Royalty\/Unit','Royalty','UPC','ISRC','External ID'],
        ],
    },
    # Dualtone -> FunMobility
    { service => Client::Service::DSP_FUNMOBILITY,
        version => 4,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['Distribution Channel', 'Title', 'Artist', 'Content Type',
             'Month', 'Source', 'Sales', 'Retail Price', 'Royalty Percentage',
             'Royalty/Unit', 'Royalty', 'Funmobility ID', 'ISRC'
            ],
        ],
    },
    # Oseao Media Group -> Xpress Beats
    { service => Client::Service::DSP_XPRESSBEATS,
        version => 1,
        sheet => 0,
        lines => [
            [undef,undef,undef,undef,'SE13 Ltd T\/A Xpressbeats',undef],
            ([undef]) x 13,
            ['ISRC','PROD CODE','TRACK NO','ARTIST','TITLE','ROYALTY','QTY','TOTAL'],
        ],
    },
    # Virtual Label -> State 51
    { service => Client::Service::DSP_STATE51,
        version => 1,
        sheet => 'any',
        lines => [
            ([undef]) x 12,
            ['Licensor','Music Service','Start','End','Artist','Title','Label','UPC','Cat No','ISRC','EU','n-EU','Unsp','Ctry','Curr','Roy C','ExchR','Roy','s51','Label'],
        ],
    },
    # Memphis Industries -> State 51 (FB17384)
    { service => Client::Service::DSP_STATE51,
        version => 2,
        match_on_any_row => 1,
        sheet => 'any',
        lines => [
            [
                'Licensor', 'Music Service', 'Start', 'End', 'Rep Curr', 'Conv Rate', 'Artist 1 \(Track artist or only given\)',
                'Artist 2 \(album artist or any additional\)', 'Album Title', 'Track Title', 'Product Title', 'Vol', 'Tr #',
                'Label', 'Grid', 'UPC', 'Cat No', 'ISRC', 'DMS id', 'Other id', 'File Format', 'Total Units', 'S\/ R', 'Trans Time',
                'Country of Sale', 'Country of Consump.', 'EU', 'non- EU', 'Product Type', 'Usage Type', 'Activity Type',
                'Mech Inc', 'Discount Scheme', 'Trans\. Costs \%', 'MS \%', 'Label \%', 'Sales Tax rate', 'Ret Curr', 'Unit Price',
                'Total', 'Tax Unit', 'Tax Total', 'Unit Net', 'Total Net', 'Mech Base', 'Mech Unit', 'Mech Total', 'Tot Net - Mech',
                'Deduct 1', 'Deduct 2', 'Unit Rlty', 'Share Base', 'MS share', 'Royalty', 'Ex Rate Ret-Rep', 'Unit Price', 'Total',
                'Tax Unit', 'Tax Total', 'Unit Net', 'Total Net', 'Mech Base', 'Mech Unit', 'Mech Total', 'Tot Net - Mech', 'Deduct 1',
                'Deduct 2', 'Unit Rlty', 'Share Base', 'MS share', 'Royalty', 'Royalty GBP', 'state51 commission', 'To Label'
          ],
        ],
    },
    # Kill Rock Stars -> Touch N Go (Digital)
    { service => Client::Service::DSP_TOUCHNGO,
        version => 1,
        sheet => 0,
        lines => [
            ['Vendor Identifier','Quantity','Extended Price','Artist','Title','Label','Label \%','Due To Label'],
        ],
    },
    # Kill Rock Stars -> Touch N Go (Digital)
    { service => Client::Service::DSP_TOUCHNGO,
        version => 2,
        sheet => 0,
        lines => [
            ['ISRC\/UPC','Artist','Title','PTD Download Units','PTD Download \$','PTD Stream Units','PTD Stream \$','Free Stream Units','Total \$','Label','Label \%','Due To Label'],
        ],
    },
    # BFM -> Kosmic
    { service => Client::Service::DSP_KOSMIC,
        version => 1,
        sheet => 0,
        lines => [
            ([undef]) x 5,
            ['Client Code','Company','Product Name','Product Artist','Product Code','Format','Track Name','Track Artist','Track ID','Unit Price','Quantity','Gross','Net'],
        ],
    },
    # Big Fish -> Wippit
    { service => Client::Service::DSP_WIPPIT,
        version => 1,
        sheet => 0,
        lines => [
            ['No\.','Sale Time','Date of Download','Download Time','Record Label','Licensor','Track Artist','Track Album','Track Title','Cat ID','DigitalISRC','Wholesale Price'],
        ],
    },
    # Festival Link -> NUGS
    { service => Client::Service::DSP_NUGS,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
                ['ID','TITLE','PRICE','SALES','TOTAL REVENUE','MB TRANSFERRED','DELIVERY COST','REFUNDS','REFUND TOTAL','SHIPPING TOTAL','SERVICE FEE','NET REVENUE'],
            ],
    },
    # Festival Link -> NUGS
    { service => Client::Service::DSP_NUGS,
        version => 2,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
                ['ID','TITLE','PRICE','SALES','TOTAL REVENUE','MB TRANSFERRED','DELIVERY COST','REFUNDS','REFUND TOTAL','SERVICE FEE','ORIG\. CURRENCY','NET REVENUE'],
        ],
    },
    # Sanctuary UK -> 24-7
    { service => Client::Service::DSP_24_7_MUSICSHOP,
        version => 1,
        sheet => 1,
        lines => [
            ['Transaction ID','LM ID','Date of sale','Time of sale','Portal URL','Owner of content','Label','Artist','Title','Digital Id','Type of Digital Id','Configuration','No of Tracks','No of Sec\.','Quantity','Media Format','PPD price','PPD Currency','Publ\. Incl\/Excl','Retail price','VAT','Net retail price','Retail country','Retail currency','Retail VAT \%','License Org\.'],
        ],
    },
    # Ministry of Sound -> 24-7
    { service => Client::Service::DSP_24_7_MUSICSHOP,
        version => 2,
        sheet => 1,
        lines => [
            ['Transaction ID','LM ID','Date of sale','Time of sale','Portal URL','Owner of content','Offer to','Sold to','Label','Artist','Title','Digital Id','Type of Digital Id','Catalogue No\.','Configuration','No of Tracks','No of Sec\.','Quantity','Media Format','PPD price','PPD Currency','Publ\. Incl\/Excl','Retail price','VAT','Net retail price','Retail country','Retail currency','Retail VAT \%','License Org\.'],
        ],
    },
    # Ministry of Sound -> 24-7
    { service => Client::Service::DSP_24_7_MUSICSHOP,
        version => 3,
        sheet => 'any',
        lines => [
            ['Transaction ID','LM ID','Date of sale','Time of sale','Portal URL','Owner of content','Offer to','Sold to','Label','Artist','Title','Digital Id','Type of Digital Id','UPC','Catalogue No\.','Configuration','No of Tracks','No of Sec\.','Quantity','Media Format','PPD price','PPD Currency','Publ\. Incl\/Excl','Retail price','VAT','Net retail price','Retail country','Retail currency','Retail VAT \%','License Org\.'],
        ],
    },
    { service => Client::Service::DSP_24_7_MUSICSHOP,
        version => 4,
        sheet => 'any',
        lines => [
            ['Transaction ID', 'LM ID', 'Date of sale', 'Time of sale', 'Portal URL',
            'Owner of content', 'Label', 'Artist', 'Title', 'Digital Id',
            'Type of Digital Id', 'Catalogue No\.', 'Configuration', 'No of Tracks',
            'No of Sec\.', 'Quantity', 'Media Format', 'PPD price', 'PPD Currency',
            'Publ\. Incl\/Excl', 'Retail price', 'VAT', 'Net retail price', 'Retail country',
            'Retail currency', 'Retail VAT \%', 'License Org\.'],
        ],
    },
    # Sanctuary UK -> 30th
    { service => Client::Service::DSP_30TH,
        version => 1,
        sheet => 0,
        lines => [
            ['TO: SANCTUARY GROUP LIMITED'],
            [undef],
            ['company name',undef,'THIRTIETH CO\.\, LTD\.'],
        ],
    },
    # Sanctuary UK -> ClassicalWorld
    { service => Client::Service::DSP_CLASSICALWORLD,
        version => 1,
        sheet => 1,
        lines => [
            ([undef]) x 5,
            ['cdid','catno','workname','trackname','rectrack_id','length','segments','streams'],
        ],
    },
    # Sanctuary UK -> ClassicalWorld
    { service => Client::Service::DSP_CLASSICALWORLD,
        version => 2,
        sheet => 2,
        match_on_any_row => 1,
        lines => [
            ['cdid','catno','isrc','workname','trackname','composer','artist','rectrack_id','length','segments','streams'],
        ],
    },
    # Indie Blu -> ClassicalWorld (Streams)
    { service => Client::Service::DSP_CLASSICALWORLD,
        version => 3,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['CD ID','Cat no.','Work Title','Track Title','Entity ID','Duration','Streams',undef],
        ],
    },
    # Indie Blu -> ClassicalWorld (Downloads)
    { service => Client::Service::DSP_CLASSICALWORLD,
        version => 3,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['CD ID','Cat no.','Work Title','Track Title','Entity ID','Duration','Downloads','USD Price', 'Total', 'RoyaltyRate', 'Royalty'],
        ],
    },
    # Wild Palms -> 4DEEJAYS
    { service => Client::Service::DSP_4DEEJAYS,
        version => 1,
        sheet => 0,
        lines => [
            ['CAT NUMBER','DATE','COUNTRY','LABEL','TRACK','FILE','PPD'],
        ],
    },
    # Oseao Media -> DJMR
    { service => Client::Service::DSP_DJMR,
        version => 1,
        sheet => 0,
        lines => [
            ['manufacturers_name','track_title','mix_title','artists_name','products_sku','products_quantity','products_royalties','products_price'],
        ],
    },
    # Oseao Media -> DJMR
    { service => Client::Service::DSP_DJMR,
        version => 2,
        sheet => 0,
        lines => [
            ['Distributor', 'Licensee', 'Portal', 'Country of Sale', 'Transaction',
            'Format', 'Date Purchased', 'ISRC', 'UPC\/EAN', 'SKU', 'Label',
            'Artist', 'Track Title', 'Mix Version', 'Quantity', 'Price US\$',
            'Royalties US\$', 'Fees US\$', 'DJMR Profits US\$', 'Payment #'],
        ],
    },
    # Oseao Media -> Starzik
    { service => Client::Service::DSP_STARZIK,
        version => 1,
        sheet => 0,
        lines => [
            ['Country','Period','Retailer identifier','Format','Free Y\/N','Sales type','Title category','Per album or per track','ID digital identifier','Product reference','Product code barre \(UPC\)','Album name','Album artist','Track name','Track artist','Label','ISRC','Number of tracks','Retail price \(incl VAT\)','PPD \(excl VAT\)','Discount \%','Royalty per unit \(excl VAT\)','Quantity','Total amount \(excl VAT\)'],
        ],
    },
    # Oseao Media -> Wasabeat
    { service => Client::Service::DSP_WASABEAT,
        version => 1,
        sheet => 0,
        lines => [
            ['id','site','order','date','userid','type','trackid','title','mixtitle','artist','remixer','releaseid','releasename','catalognumber','upc','genre','copyright','composer','lyricist','medley','isrc','chartid','charttitle','labelid','labelname','distributorid','distributorname','price','fee','amount','royalty','mechanicals','taxes','expense','year','term','state'],
        ],
    },
    # Oseao Media -> Wasabeat
    { service => Client::Service::DSP_WASABEAT,
        version => 1,
        sheet => 1,
        lines => [
            ['id','site','order','date','userid','type','trackid','title','mixtitle','artist','remixer','releaseid','releasename','catalognumber','upc','genre','copyright','composer','lyricist','medley','isrc','chartid','charttitle','labelid','labelname','distributorid','distributorname','price','fee','amount','royalty','mechanicals','taxes','expense','year','term','state'],
        ],
    },
    # Oseao Media -> Wasabeat
    { service => Client::Service::DSP_WASABEAT,
        version => 1,
        sheet => 0,
        lines => [
            ['id', 'site', 'order', 'date', 'userid', 'type', 'trackid', 'title', 'mixtitle', 'artist',
            'remixer', 'releaseid', 'releasename', 'catalognumber', 'upc', 'genre', 'copyright',
            'composer', 'lyricist', 'medley', 'isrc', 'chartid', 'charttitle', 'LB_ID', 'labelname',
            'DS_ID', 'distributorname', 'price', 'fee', 'amount', 'royalty', 'mechanicals', 'taxes',
            'expense', 'year', 'term', 'state', 'downloadcount'],
        ],
    },
    # Oseao Media -> Necodo
    { service => Client::Service::DSP_NECODO,
        version => 1,
        sheet => 0,
        lines => [
            ['Date Sold','Album Title','Track Title','UPC','ISRC','Sales Amt','Payout to You'],
        ],
    },
    # Osea Media -> BeatsDigital
    { service => Client::Service::DSP_BEATSDIGITAL,
        version => 2,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['dbid', 'date', 'TYPE', 'bdID', 'upc/ean/isrc', 'label',
            'artist', 'title', 'mix', 'NET', '#', 'MCPS', 'ROYALTY', 'USERCOUNTRY',],
        ],
    },
    # Osea Media -> BeatsDigital
    { service => Client::Service::DSP_BEATSDIGITAL,
        version => 3,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
          ['dbid', 'date', 'TYPE', 'bdID', 'alb upc', 'upc\/ean\/isrc', 'label', 'artist', 'title',
		   'mix', 'NET', undef, 'COST', 'MCPS', 'ROYALTY', 'USERCOUNTRY' ],
        ],
    },
    # Osea Media -> BeatsDigital
    { service => Client::Service::DSP_BEATSDIGITAL,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['dbid','date','TYPE','bdID','upc\/ean\/isrc','label','artist','title','mix','NET','#','MCPS','ROYALTY','ROYALTYRATE'],
        ],
    },
    # Osea Media -> BeatsDigital
    { service => Client::Service::DSP_BEATSDIGITAL,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['dbid','date','TYPE','bdID',
            'upc\/ean\/isrc','label','artist','title','mix','NET','#',
            'MCPS','ROYALTY'],
        ],
    },
    # TouchAndGo -> Beats Music
    { service => Client::Service::DSP_BEATSMUSIC,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Storefront Name', 'Apple Identifier', 'ISRC', 'Item Title', 'Item Artist', 'Quantity', 'Net Royalty', 'Net Royalty Total', 'Vendor Identifier'
	    ],
        ],
    },
    # ShockHound
    { service => Client::Service::DSP_SHOCKHOUND,
        version => 2,
        sheet => 0,
        lines => [
        		[undef],
            ['SHOCKHOUND'],
            [undef],
            [undef],
            [undef],
            [undef],
            [undef],
            ['Date','Royalty Date','Transaction Number','Order Number','Shockhound Sku','Album DESC','Album ID','Album Track Count','Genre','Album Upc','Album Content Provider Sku','Music Label','Album Catalog Number','Artist ID','Artist DESC','Track DESC','Track ID','Track NUM','Track Isrc','Track Content Provider Sku','Track Disc Number','Purchasable Type','Currency Code','Territory','Transaction Type',undef,'Sales U','Sales Unit Price','Sales \$','Royalty Unit Price','Royalty \$'],
        ],
    },
    # ShockHound
    { service => Client::Service::DSP_SHOCKHOUND,
        version => 4,
        sheet => 0,
        lines => [
            [undef],
            ['SHOCKHOUND'],
            [undef],
            [undef],
            [undef],
            [undef],
            [undef],
            ['Provider', 'Label', 'Type', 'Royalty', 'Album Name',
            'Track Name', 'Unit Prc', 'Qty Sold', 'Order Amount', 'Royalty'],
        ],
    },
    # ShockHound
    { service => Client::Service::DSP_SHOCKHOUND,
        version => 1,
        sheet => 0,
        lines => [
        		[undef],
            ['SHOCKHOUND'],
            #([undef]) x 5,
            #['Date','Transaction Number','Order Number','Royalty Date','Shockhound Sku','Album DESC','Album ID','Album Track Count','Album Upc','Album Catalog Number','Album Content Provider Sku','Music Label','Artist ID','Artist DESC','Track DESC','Track ID','Track NUM','Track Isrc','Track Content Provider Sku','Purchasable Type','Currency Code','Territory','Transaction Type','Sales U','Sales Unit Price','Sales $','Royalty Unit Price','Royalty $'],
        ],
    },
    # ShockHound
    { service => Client::Service::DSP_SHOCKHOUND,
        version => 3,
        sheet => 0,
        lines => [
            ['SHOCKHOUND'],
            ([undef]) x 6,
            ['Date', 'Transaction Number', 'Order Number', 'Royalty Date', 'Shockhound Sku', 'Album', 'Album Track Count', 'Album Upc', 'Album Catalog Number', 'Album Content Provider Sku', 'Music Label', 'Artist ID', 'Artist DESC', 'Track DESC', 'Track ID', 'Track NUM', 'Track Isrc', 'Track Content Provider Sku', 'Track Disc Number', 'Purchasable Type', 'Currency Code', 'Territory', 'Transaction Type', 'Metrics', 'Sales U', 'Sales Unit Price', 'Sales \$', 'Royalty Unit Price', 'Royalty \$'],
        ],
    },
    # ShockHound
    { service => Client::Service::DSP_SHOCKHOUND,
        version => 5,
        sheet => 0,
        lines => [
            ['SHOCKHOUND'],
            ([undef]) x 6,
            ['Date', 'Transaction Number', 'Order Number', 'Royalty Date', 'Shockhound Sku', 'Album DESC', 'Album ID', 'Album Track Count', 'Genre', 'Album Upc', 'Album Content Provider Sku', 'Music Label', 'Album Catalog Number', 'Artist ID', 'Artist DESC', 'Track DESC', 'Track ID', 'Track NUM', 'Track Isrc', 'Track Content Provider Sku', 'Track Disc Number', 'Purchasable Type', 'Currency Code', 'Territory', 'Transaction Type', 'Metrics', 'Sales U', 'Sales Unit Price', 'Sales \$', 'Royalty Unit Price', 'Royalty \$', 'Total Royalty Due \$'],
        ],
    },
    # LaLa (Downloads)
    { service => Client::Service::DSP_LALA,
        version => 2,
        sheet => 0,
        lines => [
            ['\w+\d{2}\-\d{2}','^\d+$','^\d+$',undef,'^\d+$','^\d$',undef,undef,undef,undef,'^\d+$','^\d+\.\d+$'],
        ],
    },
    # LaLa (Streams)
    { service => Client::Service::DSP_LALA,
        version => 1,
        sheet => 0,
        lines => [
            ['\w+\d{2}\-\d{2}','^\d+$','^\d+$','','','^\d+$',undef,undef,undef,undef,'^\d+$',undef],
        ],
    },
     # LaLa (Streams)
    { service => Client::Service::DSP_LALA,
        version => 1,
        sheet => 0,
        lines => [
            ['\w+\d{2}\-\d{2}','^\d+$','^\d+$',undef,undef,'^\d+$',undef,undef,undef,undef,'^\d+$',undef],
        ],
    },
    # PlayDigital
    { service => Client::Service::DSP_PLAYDIGITAL,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            ['UPC \/ EAN \/ GTIN','CAT#','ISRC','QUANTITY','RETAIL PRICE','TOTAL GROSS UNIT PRICE','ADMINISTRATION FEE','ADJUST GROSS UNIT REVENUE','REVENUE \(% share\)','REVENUE IN LOCAL CURRENCY','CURRENCY TYPE','EXCHANGE RATE','REVENUE','RECORD LABEL','ARTIST','SONG TITLE','SONG MIX','RETAILER TERRITORY','CUSTOMER TERRITORY','PRODUCT TYPE','SALE TYPE','CUSTOMER ID','DATE OF TRANSACTION'],
        ],
    },

    # Barden
    { service => Client::Service::DSP_BARDEN,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            ['Recording Id', 'Artist Name', 'Song Title', 'Song Code', 'Play Count', 'Revenue'],
        ],
    },

    #revolver
    { service => Client::Service::DSP_REVOLVER,
      version => 1,
      sheet => 0,
      lines => [[
            'Pay Period', 'Sold Month', 'Sold Year', 'Label ID', 'UPC', 'ISRC', 'Artist', 'Album Title',
            'Title', 'Provider', 'Country Of Sale', 'service name', 'Quantity', 'actual dollars',
             'Extended Price_c true Actual',
             'Label Royalty percent', 'Label Royalty Payback'],
            ],
    },

    #revolver physical
    { service => Client::Service::DSP_REVOLVER,
      version => 2,
      sheet => 0,
      lines => [[
            'Vendor Name', 'LineRoyalty_Summary by Vendor Name', 'Label id', 'Product Artist', 'Product Title', 'Product Format Weight', 'Qty Shipped_Sales_s by zct_RoyaltySort', 'Qty ReturnedDefective_Summary by zct_RoyaltySort', 'Qty ReturnedOverStock_Summary by zct_RoyaltySort', 'Qty Royalty_Summary by zct_RoyaltySort', 'Projected Cost', 'Promo_Freegood', 'LineRoyalty_Summary by zct_RoyaltySort', 'zgd_StartDate', 'zgd_EndDate'],
            ],
    },
    #create space physical
    { service => Client::Service::DSP_CREATESPACE,
      version => 1,
      sheet => 0,
      lines => [[
            'Start Date', 'End Date', 'Country', 'CSP Title ID', 'UPC', 'Total Units',
            'Wholesale Price', 'Net Invoice Value', 'List Price', 'Total List Price',
            'Currency', 'Artist', 'Product', 'Label'],
            ],
    },
    #create space digital
    { service => Client::Service::DSP_CREATESPACE,
        version => 2,
        lines => [
            ['Date', 'Title ID', 'Title Name', 'Qty Bought', 'Discount Code', 'Channel', 'Royalty']
        ],
    },
    #create space digital
    { service => Client::Service::DSP_CREATESPACE,
        version => 3,
        lines => [
            ([undef]) x 5,
            ['Sale Date', 'Title Name', 'Track Name', 'Product Type', 'Locale', 'Sales Channel',
            'UPC/ISBN', 'EAN/ISBN', 'ASIN', 'Title ID', 'List Price', 'Unit Fees',
            'Quantity', 'Royalty']
        ],
    },
    #create space digital
    { service => Client::Service::DSP_CREATESPACE,
        version => 4,
        lines => [
            ([undef]) x 5,
            ['Sale Date', 'Title Name', 'Track Name', 'Product Type', 'Locale', 'Sales Channel',
            'UPC/ISBN', 'EAN/ISBN', 'ASIN', 'Title ID', 'List Price', 'Sale Price', 'Unit Fees',
            'Quantity', 'Royalty']
        ],
    },
    #create space digital
    { service => Client::Service::DSP_CREATESPACE,
        version => 5,
        lines => [
            ([undef]) x 5,
            ['Sale Date', 'Title Name', 'Track Name', 'Product Type', 'Locale', 'Sales Channel',
            'UPC/ISBN', 'EAN/ISBN-13', 'ASIN', 'SKU', 'Title ID', 'List Price', 'Unit Fees',
            'Quantity', 'Royalty', 'Payment ID', 'Payment Status']
        ],
    },
    #create space digital - BFM
    { service => Client::Service::DSP_CREATESPACE,
        version => 6,
        lines => [
            ([undef]) x 5,
             ['Sale Date', 'Title Name', 'Track Name', 'Product Type', 'Sales Channel',
	      'UPC/ISBN', 'EAN/ISBN-13', 'ASIN', 'Title ID', 'List Price', 'Sale Price',
	      'Unit Fees', 'Quantity', 'Royalty']
        ],
    },
    #create space digital - Syntax (FB5501)
    { service => Client::Service::DSP_CREATESPACE,
        version => 7,
        lines => [
            ([undef]) x 5,
             ['Sale Date', 'Title Name', 'Track Name', 'Product Type', 'Sales Channel',
	      'UPC/ISBN', 'EAN/ISBN-13', 'ASIN', 'Title ID', 'List Price',
	      'Unit Fees', 'Quantity', 'Royalty']
        ],
    },
    #select archambault
    { service => Client::Service::DSP_SELECT_ARCHAMBAULT,
      version => 1,
      sheet => 0,
      match_on_any_row => 1,
      lines => [['Titre', 'Unit', 'Redevances',
      'Unit', 'Redevances', 'Unit', 'Redevances Total \(\$ CAD\)', undef],
            ],
    },
	#select archambault
    { service => Client::Service::DSP_SELECT_ARCHAMBAULT,
      version => 2,
      sheet => 0,
      match_on_any_row => 1,
      lines => [
		    [
			    'période', 'type', 'upc', 'isrc', 'titre', 'artistes', 'quantité', 'redevances'
            ],
      ],
    },
    # dualtone - select archambault
    { service => Client::Service::DSP_SELECT_ARCHAMBAULT,
      version => 2,
      sheet => 'any',
      match_on_any_row => 1,
      lines => [
        [
            'mois courant\/current month', 'type', 'upc', 'isrc', 'titre\/title', 'artistes\/artist', 'quantité\/quantity', 'redevances\/royalties'
        ],
      ],
    },


    #Limewire -> bfm
    { service => Client::Service::DSP_LIMEWIRE,
        version => 1,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            ['Provider Name', 'Provider Track Id', 'Album Name', 'UPC',
            'Track Name', 'ISRC', 'Type', 'Number of Tracks in Album',
            'Purchase Date', 'Amount', 'Label', undef, undef,
            undef, undef, undef, undef, undef, undef, undef, undef],
        ],
    },
    #Limewire -> bfm
    { service => Client::Service::DSP_LIMEWIRE,
        version => 2,
        sheet => 'any',
        match_on_any_row=>1,
        lines => [
            [ 'Provider Name', 'Track Name', 'Track Artist', 'Provider Track ID',
			  'ISRC', 'Album name', 'Album Primary Artist', 'Provider Product ID',
			  'UPC', 'Tracks on Album', 'Purchase Date', 'Download Type',
			  'Purchase Amount', 'Units', 'Royalties Due' ]
        ],
    },
    #Livewire -> beggers
    { service => Client::Service::DSP_LIVEWIRE,
        version => 1,
        sheet => 'any',
        match_on_any_row=>1,
        lines => [
            [ 'Date', 'Artist', 'Track', 'ISRC', 'UPC', 'Media Type', 'Promo ID',
			  'Retail Price', 'Net Price', 'Country\/ Currency', 'Carrier',
			  'Label Royalty \(GBP\)' ]

        ],
    },
    # DanceTunes
    { service => Client::Service::DSP_DANCETUNES,
        version => 1,
        lines => [
            [
               'Maand', 'Maand', 'Label', 'Artiest', 'Titel', 'Bet. meth.', 'Versie',
			   'Type', 'Id', 'Land', 'ISRC', 'Ref1', 'Ref2', 'Aant', 'Prijs ex',
			   'Btw', 'Psp', 'Cc', 'Fi', undef, undef, 'BM'
            ],
        ],
    },
     #DrumAndBassArena -> Hardcore Beats
     { service => Client::Service::DSP_DRUM_AND_BASS_ARENA,
        version => 1,
        sheet => 'any',
        match_on_any_row=>1,
        lines => [
            ['Type', 'Artist', 'Name', 'UPC', 'ISRC', 'Product Type', 'Quantity', 'Price',
            'Retail price less VAT @', 'MCPS-PRS \(8% of Retail price less VAT\)',
            'Billing, Delivery & Storage \(10%\)', 'Total NET rev', 'Outpayment', 'Subtotal',],
        ],
    },
    # DrumAndBaseArena version 2
     { service => Client::Service::DSP_DRUM_AND_BASS_ARENA,
        version => 2,
        sheet => 'any',
        match_on_any_row=>1,
        lines => [
            ['Type', 'Catalogue No', 'Artist', 'Name', 'UPC', 'ISRC', 'Product Type', 'Quantity', 'Price',
            'Retail price less VAT @', 'MCPS-PRS \(8% of Retail price less VAT\)',
            'Billing, Delivery & Storage \(10%\)', 'Total NET rev', 'Outpayment', 'Subtotal',],
        ],
    },
    # Smithmusic - Hoopla (FB17183)
     { service => Client::Service::DSP_HOOPLA,
        version => 1,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            [
'circId', 'borrowed', 'title', 'groupTitle', 'artist', 'format', 'isbn', 'publisher', 'publisherid', 'upc', 'library', 'state', 'postal', 'revenue', 'revenueCurrency', 'netDueMin', 'netDueMax', 'netDueFlat', 'netDuePercent', 'netDue', 'netDueCurrency'
	    ],
        ],
    },
    #Play it again sam digital
     { service => Client::Service::DSP_PIAS_DIGITAL,
        version => 1,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            ['<Month>', '<Artist>', '<Title>', '<UPC Code>', '<Catalogue Number>',
            '<ISRC Code>', '<Format>', '<Territory>', '<DMS>', '<Quantity>',
            '<Received Income>', '<Mech>', '<Fee Base>', '<Fee>', '<Fee %>', '<Label Income>',],
        ],
    },
     { service => Client::Service::DSP_PIAS_DIGITAL,
        version => 2,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            ['Artist', 'Product', 'ISRC', 'Barcode', 'Territory',
            'Format Type', 'DMS', undef, 'Gross', 'Mechanical',
            'Net', 'Fee %', 'Total Fee', 'Total', 'Artist'],
        ],
    },
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 1,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            [
                'ITEM CODE', 'CAT NO', 'TITLE', 'ARTIST', 'TERRITORY', 'TYPE',
				'FOC', 'SOLD', 'RETURNED', 'PER UNIT', 'SALES', 'DISCOUNT',
				'DISCOUNT', 'PRICE', 'PER UNIT', 'FEE', '%AGE', 'PER UNIT', 'TO LABEL'

            ],
        ],
    },
    # ato - pias physical (FB17082)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 11,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            [
                'ITEM CODE', 'CAT NO', 'TITLE', 'ARTIST', 'TERRITORY', 'TYPE',
				'FOC', 'SOLD', 'RETURNED', 'PRICE', 'PER UNIT',
				'FEE', '%AGE', 'PER UNIT', 'TO LABEL'
            ],
        ],
    },
    # light in the attic - pias physical (FB19019)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 12,
        sheet => 0,
        match_on_any_row=>1,
        lines => [
            [
                 'ITEM CODE', 'CAT NO', 'TITLE', 'ARTIST', 'TERRITORY', 'FOC',
		 'SOLD', 'RETURNED', 'PER UNIT', 'PER UNIT', 'FEE', '%AGE', 'PER UNIT', 'TO LABEL'
            ],
        ],
    },
    # ato - pias physical (FB17672)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 2,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [ 'Item Code', 'Supplier Code', 'Title', 'Artist', 'Country', 'Qty', 'UnitRoy', 'Royalty', 'Deduc', 'Unit', 'Roy' ],
            [ undef,        undef,          undef,   undef,     undef,    'Sold', 'Base', '%', '%', 'Value', 'Income' ],
        ],
    },
    # ato - pias physical (FB9387)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 3,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [ 'Item Code', 'Supplier Code', 'Title', 'Artist', 'Country', 'Qty', 'Qty',  'UnitRoy', 'Net',      'Royalty', 'Roy' ],
            [ undef,        undef,          undef,   undef,     undef,    'FOC', 'Sold', 'Base',    'Receipts', '%', 'Income' ],
        ],
    },    
    # futureclassic - pias physical (FB10295)
    { service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 4,
        sheet => 'any',
        file_name => 'physical',
        match_on_any_row => 1,
        lines => [
['Artist', 'Product Title', 'Catalogue No.', 'Barcode', 'ISRC', 'Terr.', 'Dist. Chan.', 'Price Category', 'Format Type', 'Units', 'Share', 'Base Price', 'Pkg. %', 'Royalty %', 'Sales %', 'Income']
        ],
    },    
    # futureclassic - pias digital (FB10296)
    { service => Client::Service::DSP_PIAS_DIGITAL,
        version => 5,
        sheet => 'any',
        file_name => 'digital',
        match_on_any_row => 1,
        lines => [
['Artist', 'Product Title', 'Catalogue No.', 'Barcode', 'ISRC', 'Terr.', 'Dist. Chan.', 'Price Category', 'Format Type', 'Units', 'Share', 'Base Price', 'Pkg. %', 'Royalty %', 'Sales %', 'Income']
        ],
    },    
    # Play it again sam mobile
    { service => Client::Service::DSP_PIAS_MOBILE,
        version => 1,
        sheet => 'any',
        match_on_any_row=>1,
        lines => [[undef,undef,'MONTH statement received', 'Date of sales', 'Label', 'Service', 'Territory', 'ISRC', 'Artist', 'Title', 'Format', 'Units', 'Net receipt per unit', 'Total', undef, undef, 'Label Income'],
        ],
    },
    #DrumAndBassArena -> Hardcore Beats
     { service => Client::Service::DSP_BOOMKAT,
        version => 1,
        sheet => 0,
        lines => [
            ['Supplier', 'DSP', 'Portal', 'Day of Download', 'Artist', 'Title', 'Label',
            'Format', 'Format Identifer', 'Catalogue Number', 'Product UPC', 'ISRC',
            'Duration', 'In Bundle', 'Wholesale Price', 'End Consumer Price \(RRP\)',
            'VAT', 'Quantity', 'Wholesale Price Total', 'RRP Total', 'Mechanicals',
            'Mechanicals Paid By', 'Currency', 'Territory', ],
        ],
    },
    { service => Client::Service::DSP_BOOMKAT,
        version => 2,
        sheet => 0,
        lines => [
            ['Supplier', 'DSP', 'Portal', 'Day of Download', 'Artist', 'Title', 'Label',
            'Format', 'Format Identifer', 'Catalogue Number', 'Product UPC', 'ISRC',
            'Duration', 'In Bundle', 'Wholesale Price', 'End Consumer Price \(RRP\)',
            'VAT', 'Quantity', 'Wholesale Price Total', 'RRP Total', 'Currency', 'Territory', ],
        ],
    },
    # Virtual Label - Boomkat (FB12872)
    { service => Client::Service::DSP_BOOMKAT,
        version => 3,
        sheet => 0,
        lines => [
            [
'supplier', 'dsp', 'day of download', 'artist', 'title', 'label', 'format', 'catalogue number', 'product upc', 'isrc', 'duration', '14 tracks\?', 'wholesale price', 'rrp', 'vat', 'quantity', 'wholesale price total', 'rrp total', 'mechanicals', 'mechanicals paid by', 'currency', 'territory'
	    ],
        ],
    },
    # ami (2007 excel)
    { service => Client::Service::DSP_AMI,
        version => 5,
        sheet => 3,
        lines => [
            ['AMI'],
        ],
    },
    #Atlantic
     { service => Client::Service::DSP_ATLANTIC,
        version => 1,
        sheet => 0,
        lines => [
            ['Push Period', 'DIVISION_NM', 'PROVIDER', 'REPORT_START_DATE',
            'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL',
            'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE',
            'WMG_AMOUNT', 'WMG_UNIT_PRICE', 'MEDIA_CD', 'FORMAT',
            'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD',
            'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT',
            'ORACLE_COMPANY', 'ORACLE_LABEL', 'ORG_ID', 'REPERTOIRE_OWNER',
            'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'WEA_EXTFAMILYCODE',
            'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME',
            'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD',
            'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM',],
        ],
    },
    #DJTunes
    { service => Client::Service::DSP_DJTUNES,
      version => 1,
      sheet => 0,
      lines => [
            [undef, undef, '^(\d{1,2}|\d{4})\D\d{1,2}\D(\d{1,2}|\d{4})$',
            undef, undef, undef, "[A-Z][A-Z]", undef, undef, undef,
            '\d+', '\d+', undef, undef, undef, undef, undef, undef,
            undef, undef, '[A-Z][A-Z][A-Z]'],
      ],
    },
    #DJTunes
    { service => Client::Service::DSP_DJTUNES,
      version => 2,
      sheet => 0,
      lines => [
            [undef, undef, '^(\d{1,2}|\d{4})\D\d{1,2}\D(\d{1,2}|\d{4})$',
            undef, undef, undef, "[A-Z][A-Z]", undef, undef, undef,
            '\d+', '\d+', undef, undef, undef, undef, undef, undef,
            '[A-Z][A-Z][A-Z]', undef, undef, '[A-Z][A-Z][A-Z]'],
      ],
    },
    # Bleep
    { service => Client::Service::DSP_BLEEP,
        version => 1,
        sheet => 'any',
        lines => [['Period', 'Label', 'Artist', 'Title', 'Catalogue', 'UPC', 'ISRC', 'Type', 'NoOfTracks', 'PayoutPerSale', 'QtySold', 'TotalPayout',],
        ],
    },
    # Bleep
    { service => Client::Service::DSP_BLEEP,
        version => 2,
        sheet => 'any',
        lines => [['Month', 'Year', 'Label', 'Aggregator\/Supplier', 'CatNo', 'Store',
                   'ProductType', 'Format', 'Artist', 'Album', 'Track', 'UPC',
                   'ISRC', 'CountryISO', 'Currency', 'EURExchRate', 'USDExchRate',
                   'GBPExchRate', 'Units', 'UnitPrice', 'VATRate', 'NetUnitPrice',
                   'ConvUnitPrice', 'NetConvAmt', 'DigitalBleep\%age', 'DigitalMCPS\%age',
                   'BleepShare', 'MCPSShare', 'LabelShare'],
        ],
    },
    # Bleep
    { service => Client::Service::DSP_BLEEP,
        version => 3,
        sheet => 'any',
        lines => [['Month', 'Year', 'Label', 'Aggregator\/Supplier', 'CatNo', 'Store',
                   'ProductType', 'Format', 'Artist', 'Title', 'UPC',
                   'ISRC', 'Currency', 'EURExchRate', 'USDExchRate',
                   'GBPExchRate', 'Units', 'UnitPrice', 'VATRate', 'NetUnitPrice',
                   'ConvUnitPrice', 'NetConvAmt', 'DigitalBleep\%age', 'DigitalMCPS\%age',
                   'BleepShare', 'MCPSShare', 'LabelShare'],
        ],
    },
    # Bleep
    { service => Client::Service::DSP_BLEEP,
        version => 4,
        sheet => 'any',
        lines => [['Month', 'Year', 'Label', 'Aggregator\/Supplier', 'CatNo', 'Store',
                   'ProductType', 'Format', 'Artist', 'Album', 'Track', 'ReleaseUPC', 'FormatUPC',
                   'ISRC', 'CountryISO', 'Currency', 'EURExchRate', 'USDExchRate',
                   'GBPExchRate', 'Units', 'UnitPrice', 'VATRate', 'NetUnitPrice',
                   'ConvUnitPrice', 'NetConvAmt', 'DigitalBleep\%age', 'DigitalMCPS\%age',
                   'BleepShare', 'MCPSShare', 'LabelShare'],
        ],
    },
    # ST Holdings - Bleep (FB16680)
    { service => Client::Service::DSP_BLEEP,
        version => 5,
        sheet => 'any',
        lines => [['Month', 'Year', 'Label', 'Aggregator\/Supplier', 'CatNo', 'Store',
	           'ProductType', 'Format', 'Artist', 'Album', 'Track', 'ReleaseUPC', 'FormatUPC',
		   'ISRC', 'CountryISO', 'Currency', 'EURExchRate', 'USDExchRate',
		   'GBPExchRate', 'Units', 'UnitPrice', 'VATRate', 'NetUnitPrice',
		   'ConvUnitPrice', 'NetConvAmt', 'Bleep\%age', 'MCPS\%age', 'BleepShare',
		   'MCPSShare', 'LabelShare']
	 ]
    },
    # ST Holdings - Bleep (FB17056)
    { service => Client::Service::DSP_BLEEP,
        version => 5,
        sheet => 'any',
        lines => [['Month', 'Year', 'Label', 'Aggregator\/Supplier', 'CatNo', 'Store',
	           'productType', 'Format', 'Artist', 'Album', 'Track', 'ReleaseUPC', 'FormatUPC',
		   'ISRC', 'CountryISO', 'Currency', 'EURExchange', 'USDExchRate',
		   'GBPExchRate', 'Units', 'UnitPrice', 'VATRate', 'NetUnitPrice',
		   'ConvUnitPrice', 'NetConvPrice', 'Bleep\%age', 'MCPS\%age', 'BleepShare',
		   'MCPSShare', 'LabelShare']
	 ]
    },
    # ST Holdings - Bleep (FB17010)
    { service => Client::Service::DSP_BLEEP,
        version => 7,
        sheet => 'any',
        lines => [[
               'Month', 'Year', 'Label', '(name|Aggregator)', 'CatNo', 'Store',
               'productType', 'Format', 'Artist', 'Album', 'Track', 'ReleaseUPC', 'FormatUPC',
               'ISRC', 'CountryISO', 'Currency', 'EURExchange', 'USDExchange',
               'GBPExchange', 'SumOfUnits', 'UnitPrice', 'VATRate', 'NetUnitAmt',
               'ConvUnitAmt', 'NetConvAmt', 'Bleepage', 'MCPSage', 'BleepShare',
               'MCPSShare', 'LabelShare']
	 ]
    },
    # ST Holdings - Bleep (FB16680)
    # Note: this header matches the detail lines of version 5; we do this since
    # this version has no header and we must match on the expected data types.
    #
    { service => Client::Service::DSP_BLEEP,
        version => 6,
        sheet => 'any',
	filename => 'STHO',
        lines => [[
#	    #'Month',  'Year', 'Label', 'Aggregator\/Supplier', 'CatNo', 'Store',
	    '\d{1,2}', '\d{4}', undef,  'STHO\d{3}',             undef,  'Digital',
#	    #'ProductType',    'Format', 'Artist', 'Album', 'Track', 'ReleaseUPC',     'FormatUPC',
	    '(Track|Release)', '\w+',    undef,    undef,    undef,  '^(\d{13}|\s*)$', '^(\d{13}|\s*)$',
#	    #'ISRC',               'CountryISO', 'Currency', 'EURExchRate',  'USDExchRate',
	    '^(\w{12}|n\/a|\s*)$', '\w{2}',      '\w{3}',    '^\d*\.*?\d+$', '^\d*\.*?\d+$',
#	    #'GBPExchRate', 'Units', 'UnitPrice',        'VATRate',             'NetUnitPrice',
	    '\d+',          '\d+',   '^(\d+\.\d+|\d+)$', '^(\d+\.\d+|\d+)\%?$', '^(\d+\.\d+|\d+)$',
#	    #'ConvUnitPrice',   'NetConvAmt',       'Bleep\%age',          'MCPS\%age',           'BleepShare',
	    '^(\d+\.\d+|\d+)$', '^(\d+\.\d+|\d+)$', '^(\d+\.\d+|\d+)\%?$', '^(\d+\.\d+|\d+)\%?$', '^(\d+\.\d+|\d+)$',
#	    #'MCPSShare',       'LabelShare']
	    '^(\d+\.\d+|\d+)$', '^(\d+\.\d+|\d+)$']
	 ]
    },


    # Indie Mobile
    { service => Client::Service::DSP_INDIEMOBILE,
        version => 1,
        sheet => 'any',
        match_on_any_row=>1,
        lines => [[undef,undef,'MONTH statement received', 'Date of sales', 'Label', 'Service', 'Territory', 'ISRC', 'Artist', 'Title', 'Type', 'Units', 'NET receipt per unit', 'Total', 'IM Comission %', 'IM Comission \S', 'Label Income'],
        ],
    },
    # Akuma
    { service => Client::Service::DSP_AKUMA,
        version => 1,
        sheet => 'any',
        lines =>
        [
            [
                'UPC', 'ISRC', 'INTERN_CODE', 'TITLE', 'ARTIST', 'LABEL', 'DAY OF DOWNLOAD', 'TYPE', 'COUNT',
                'NET_REVENUE', 'NET_END_CONSUMER_PRICE', 'VAT', 'COUNTRY', 'CURRENCY'
            ],
        ],
    },
    # Megastore
    { service => Client::Service::DSP_MEGASTORE,
        version => 1,
        sheet => 'any',
        lines =>
        [
            [
                'Report Start', 'Report End', 'Account ID', 'Label', 'Catalogue Number',
				'Release Title', 'Track Title', 'Artist', 'Label', 'Distributor',
				'UPC', 'ISRC', 'Sale Format', 'Country', 'Price', 'Currency',
				'Quantity', 'Share'
            ],
        ],
    },
    # DX3
    { service => Client::Service::DSP_DX3_TECHNOLOGIES,
        version => 1,
        sheet => 'any',
        lines =>
        [
            [
                'Sales Date', 'Product Type', 'ISRC', 'PhysicalUPC', 'Artist', 'Title',
				'Grid Code', 'Retail Price Ex VAT', 'Currency ISO Code', 'Distribution Channel',
				'Retailed Name', 'Retailer Country', 'Amount', 'Sales Count'
            ],
        ],
    },
    # DX3
    { service => Client::Service::DSP_DX3_TECHNOLOGIES,
        version => 2,
        sheet => 'any',
        lines =>
        [
            [
                'Sales Date', 'Product Type', 'ISRC', 'Artist', 'Title',
				'Grid Code', 'Retail Price Ex VAT', 'Currency ISO Code',
				'Product Type', 'Distribution Channel',
				'Retailed Name', 'Retailer Country', 'Amount', 'Sales Count'
            ],
        ],
    },
    # DX3
    { service => Client::Service::DSP_DX3_TECHNOLOGIES,
        version => 3,
        sheet => 'any',
        lines =>
        [
            [
                'Sales Date', 'Product Type', 'Physical UPC', 'ISRC', 'Artist', 'Title',
				'Grid Code', 'Retail Price', 'Currency ISO Code', 'Distribution Channel',
				'Retailed Name', 'Retailer Country', 'Amount', 'Sales Count'
            ],
        ],
    },    
    # DX3
    { service => Client::Service::DSP_DX3_TECHNOLOGIES,
        version => 4,
        sheet => 'any',
        lines =>
        [
            [
                'Sales Date', 'Product Type', 'ISRC', 'Physical UPC', 'Artist', 'Title',
				'Grid Code', 'Retail Price', 'Currency ISO Code', 'Distribution Channel',
				'Retailed Name', 'Retailer Country', 'Amount', 'Sales Count'
            ],
        ],
    },      
    # BUONGIORNO
    { service => Client::Service::DSP_BUONGIORNO,
        version => 1,
        sheet => 'any',
        lines =>
        [
            [
                'Month', 'Service', 'Territory', 'Content Type', 'Product Code',
				'Title', 'Artist', 'Rights Company', 'Downloads', 'GBP Gross  Revenues',
				'Provider Agreement', 'Provider share', 'GBP Provider Payment'
            ],
        ],
    },
    # BUONGIORNO
    { service => Client::Service::DSP_BUONGIORNO,
        version => 2,
        sheet => 'any',
        lines =>
        [
            [
                'Month', 'Service', 'Territory', 'Content Type',
				'Title', 'Artist', 'Rights Company', 'Downloads', 'Gross  Revenues Euro',
				undef, undef,'Gross  Revenues GBP', 'Provider Agreement', 'Provider share',
				'Provider Payment Euro', 'Provider Payment GBP', 'Service Type'
            ],
        ],
    },
    # BUONGIORNO
    { service => Client::Service::DSP_BUONGIORNO,
        version => 3,
        sheet => 'any',
        lines =>
        [
            [
                'Month', 'Service', 'Territory', 'Content Type', 'Title', 'Artist',
				'Rights Company', 'Downloads', 'Gross  Revenues Euro', 'Revenue share',
				'Fixed Fee per Downlaod', 'Gross  Revenues GBP', 'Provider Agreement',
				'Provider Payment Euro', 'Provider Payment GBP', 'Service Type'
            ],
        ],
    },
    # Spotify
    { service => Client::Service::DSP_SPOTIFY,
        version => 1,
        sheet => 'any',
        lines =>
        [
            ['Format Version', 'Start Date', 'End Date', 'Sender', 'Recipient', 'Aggregator'],
            [undef],
            ['Country', 'Label', 'Product', 'URI', 'UPC', 'ISRC', 'Track name', 'Artist name', 'Composer name', 'Album name', 'Quantity'],
        ],
    },
    # Spotify
    { service => Client::Service::DSP_SPOTIFY,
        version => 4,
        sheet => 'any',
        lines =>
        [
            ['Format version', 'Start date', 'End date', 'Sender', 'Recipient', 'Label', 'Aggregator'],
            [undef],
            ['Country', 'Product', 'URI', 'UPC', 'EAN', 'ISRC', 'Track name', 'Artist name', 'Composer name', 'Album name', 'Quantity', 'Label'],
        ],
    },    
    # Spotify
    { service => Client::Service::DSP_SPOTIFY,
        version => 2,
        sheet => 'any',
        lines =>
        [
            ['Format version', 'Start date', 'End date', 'Sender', 'Recipient', 'Label', 'Aggregator'],
            [undef],
            ['Country', 'Product', 'URI', 'UPC', 'EAN', 'ISRC', 'Track name', 'Artist name', 'Composer name', 'Album name', 'Quantity'],
        ],
    },
    # Spotify
    # there are two formats for the first line of this file that we recognize for processing
    # as Version 3 of the Spotify importer
    # a) ..., Sender, Recipient, Aggregator, Disclaimer
    # b) ..., Sender, Recipient, Disclaimer
    { service => Client::Service::DSP_SPOTIFY,
        version => 3,
        sheet => 'any',
        lines =>
        [
            ['Format Version', 'Start Date', 'End Date', 'Sender', 'Recipient'],
            [undef],
            ['Country', 'Label', 'Product', 'URI', 'UPC', 'EAN', 'ISRC', 'Track name', 'Artist name', 'Composer name', 'Album name', 'Quantity'],
        ],
    },    
    # Spotify (FB15985)
    { service => Client::Service::DSP_SPOTIFY,
        version => 6,
        sheet => 'any',
        lines =>
        [
            ['Format Version', 'Start Date', 'End Date', 'Sender', 'Recipient', 'Disclaimer'],
            [undef],
            ['Country', 'Product', 'URI', 'UPC', 'EAN', 'ISRC', 'Track name', 'Artist name', 'Composer name', 'Album name', 'Quantity', 'Label', 'Payable EUR', 'Payable USD'],
        ],
    },    
    # Spotify (FB3674)
    { service => Client::Service::DSP_SPOTIFY,
        version => 5,
        sheet => 'any',
        lines =>
        [
            ['Format Version', 'Start Date', 'End Date', 'Sender', 'Recipient', 'Disclaimer'],
            [undef],
            ['Country', 'Product', 'URI', 'UPC', 'EAN', 'ISRC', 'Track name', 'Artist name', 'Composer name', 'Album name', 'Quantity', 'Label', 'Payable EUR'],
        ],
    },    
    # Spotify
    { service => Client::Service::DSP_SPOTIFY,
        version => 999,
        lines =>
        [
            ['^A$', '^PREP001$', '^PK11$', undef, '^\w{3}$', undef, '^\d{8}$', '^\d{8}$'],
            ['^M|Z$', '^PK11$'],
        ],
    },    
    # Musicload (subscription)
    { service => Client::Service::DSP_MUSICLOAD,
        version => 1,
        sheet => 'any',
        lines =>
        [
            ['Rec Type', 'DSP ID', 'Trans-Date', 'Total Streams', 'Streams Contract-Partner', 'Stream-Ratio', 'Sales Volume Total', 'Sales Volume', 'Currency'],
            [undef],
            [undef],
            ['Rec Type', 'DSP ID', 'Trans-Date', 'Retailer', 'Retailer-Country', 'Product ID', 'Offer-ID', 'Label-Code', 'Label', 'Reporting Label', 'ISRC', 'EAN', 'GRID', 'Label Order Number', 'Artist', 'Title', '#Tracks', 'DRM', 'Date of Sale', 'Time of Sale', 'Units Paid', 'Set Num', 'Trans-Type', 'Service Type', 'Album Artist', 'Album Title', 'PPS'],
        ],
    },
    # Musicload (a la carte)
    { service => Client::Service::DSP_MUSICLOAD,
        version => 2,
        sheet => 'any',
        lines =>
        [
            ['Record Type', 'Report Timestamp', 'Report Startdate', 'Report Enddate'],
            [undef],
            [undef],
            ['Record Type', 'Label', undef, 'Sold Units', 'Net Revenue'],
        ],
    },
    # Tunecore
    { service => Client::Service::DSP_TUNECORE,
        version => 1,
        lines =>
        [
		  [
            'TC Reporting Month', 'Start Date', 'End Date', 'TC Album ID', 'UPC',
			'TC Song ID', 'ISRC', '# Sold', 'PayRate for one sold', '# of Streams',
			'PayRate for one stream', 'Total Earned', 'Currency', 'Artist', 'Album Title',
			'Song Title', 'Label', 'Name of store or service', 'Substore',
			'Country Of Sale', 'TC Transaction ID'
		  ]
        ],
    },
    # Tunecore
    { service => Client::Service::DSP_TUNECORE,
        version => 2,
        lines =>
        [
		  [
            'Sales Period', 'Posted Date', 'Store Name', 'Country Of Sale', 'Artist', 'Release Type', 'Release Title', 'Song Title', 'Label', 'UPC', 'Optional UPC', 'TC Song ID', 'Optional ISRC', 'Sales Type', '# Units Sold', 'Per Unit Price', 'Net Sales', 'Net Sales Currency', 'Exchange Rate', 'Total Earned', 'Currency'
		  ]
        ],
    },    
    # Slacker
    { service => Client::Service::DSP_SLACKERINC,
        version => 1,
        lines =>
        [
		  [
            'artistName', 'albumName', 'trackName', 'label', 'upc',
			'isrc', 'playType', 'playCount', 'pricePerUnit', 'extendedAmount',
		  ]
        ],
    },
    # Curb / Slacker - FB2118
    { service => Client::Service::DSP_SLACKERINC,
        version => 2,
        sheet => 0,
        lines => [
            [
'artistName', 'albumName', 'trackName', 'trackNumber', 'label', 'upc', 'isrc', 'playType', 'playCount', 'pricePerUnit', 'extendedAmount'
            ]
        ],
    },    
    # Mercury
    { service => Client::Service::DSP_MERCURY,
        version => 1,
        lines =>
        [
		  [
            'SupplierReference', 'Title', 'Artist', 'Album', 'Licensor', 'SubLicensor',
			'ContentType', 'TransactionStartDate', 'TransactionEndDate', 'QuantitySold',
			'UnitPrice', 'TotalTransactionValue', 'SupplierRevenuePerTransaction',
			'GrossSupplierRevenueShare', 'GRID', 'ISRC', 'UPC', 'SalesChannel', 'ISOCountryCode',
			'ISOCurrencyCode', 'ContentItemID'
		  ]
        ],
    },
    # Mercury
    { service => Client::Service::DSP_MERCURY,
        version => 2,
        lines =>
        [
		  [
            'SupplierReference', 'Title', 'Artist', 'Album', 'Licensor', 'ContentType',
            'TransactionStartDate', 'TransactionEndDate', 'QuantitySold', 'UnitPrice',
            'TotalTransactionValue', 'SupplierRevenuePerTransaction', 'GrossSupplierRevenueShare',
            'GRID', 'ISRC', 'UPC', 'SalesChannel', 'ISOCountryCode', 'ISOCurrencyCode'
		  ]
        ],
    },
    # Deezer
    { service => Client::Service::DSP_DEEZER,
        version => 1,
        sheet => 0,
        lines => [
            [undef, '^\d{2}\-\d{2}\-\d{4}$', '^[a-zA-Z]{2}-?\w{3}-?\d{2}-?\d{5}$', undef, undef, undef, '^\d+$', '^\w{2}$', '^\d+$', '^$'],
        ],
    },
    # Deezer
    { service => Client::Service::DSP_DEEZER,
        version => 2,
        sheet => 0,
        lines => [
            ['^\d{2}(\/|-)\d{2}(\/|-)\d{4}$', '^\d{2}(\/|-)\d{2}(\/|-)\d{4}$', '^[a-zA-Z]{2}-?\w{3}-?\d{2}-?\d{5}$', undef, undef, undef, '^(\d(\.|,)\d+E\+)?\d+$', '^\w{2}$', '^\d+$', '^\d*\.*\d+$', '^$'],
        ],
    },
    # Deezer (FB16799)
    { service => Client::Service::DSP_DEEZER,
        version => 2,
        sheet => 0,
        lines => [
            ['^\d{2}(\/|-)\d{2}(\/|-)\d{4}$', '^\d{2}(\/|-)\d{2}(\/|-)\d{4}$', '^[a-zA-Z]{2}-?\w{3}-?\d{2}-?\d{5}$', undef, undef, undef, '^(\d(\.|,)\d+E\+)?\d+$', '^\w{2}$', '^\d+$', '^\d*\.*\d+$', '\w{4}', '^$'],
        ],
    },
    # Deezer (FB17569)
    { service => Client::Service::DSP_DEEZER,
        version => 2,
        sheet => 0,
        lines => [
            ['^\d{2}(\/|-)\d{2}(\/|-)\d{4}$', '^\d{2}(\/|-)\d{2}(\/|-)\d{4}$', '^[a-zA-Z]{2}-?\w{3}-?\d{2}-?\d{5}$', undef, undef, undef, '^(\d(\.|,)\d+E\+)?\d+$', '^\w{2}$', '^\d+$', '^\d*\.*\d+$', '\w{3}', '^$'],
        ],
    },
    # Avarto
    { service => Client::Service::DSP_AVARTO,
        version => 1,
        sheet => 'any',
        lines =>
        [ [undef], [undef], [undef], [undef],
		  [
             undef, 'No.', 'Licensor', 'ContractOwner', 'Retailername',
             'Orderdate', 'Country', 'Articleoriginator', 'Articletype', undef,
             'Distributionchannel', 'Articleid', 'UPC', 'EAN', 'ISRC',
             'General Reporting Code', 'GRID', 'Artistname', 'Articlename',
             'Author', 'Albumartist', 'Albumtitle', 'Paymentmethod', 'CT Count',
             'Licensor Right Share', 'Price Code', 'Net Salesprice', 'Currency',
             'VAT', 'Salesprice ExchangeRate', 'InvoiceAmount per Transaction',
             undef, 'Currency', 'Total InvoiceAmount', 'Currency'
		  ]
        ],
    },
    # Avarto
    { service => Client::Service::DSP_AVARTO,
        version => 2,
        sheet => 'any',
        lines =>
        [ [undef], [undef], [undef], [undef],
		  [
             undef, 'No.', 'Licensor', 'ContractOwner', 'Retailername',
             'Order ?[Dd]ate', 'Country', 'Articleoriginator', 'Articletype', undef,
             'Distribution ?channel', 'Articleid', 'UPC', 'EAN', 'ISRC',
             'General Reporting Code', 'GRID', 'Artistname', 'Articlename',
             'Author', 'Albumartist', 'Albumtitle', 'Paymentmethod', 'CT Count',
             'Licensor Right Share', 'Price Code', 'Net Salesprice', 'Currency',
             'VAT', 'Salesprice ExchangeRate', 'InvoiceAmount per Transaction', 'Currency', 'Total InvoiceAmount', 'Currency'
		  ]
        ],
    },    
    # Masterbeat
    { service => Client::Service::DSP_MASTERBEAT,
        version => 1,
        lines =>
        [ [undef],
		  [
             'Release', 'Release or Track', 'Title', 'UPC', 'ISRC',
             'Vendor Catalog', 'Artist', 'Remix', 'Qty', 'Cost'
		  ]
        ],
    },
    # Finetunes
    { service => Client::Service::DSP_FINETUNES,
        version => 1,
        lines =>
        [
		  [
            'Supplier', undef, 'Date Report', 'Period start', undef,
			'Day of download', 'Time of download', 'Portal', undef,
			'Transaction type', 'Distribution channel', 'Format',
			'Number of Sales', undef, 'EAN / UPC', 'ISRC', 'GRid', 'Artist',
			'Title', 'Label', 'Net Revenue End Customer Price', undef, undef,
			'VAT', undef, 'Exchange rate', 'Fee 1', 'Fee 2', 'Fee N', undef,
			undef, undef, undef, 'GEMA payed by', 'PPD_SUMMED_UP'
		  ]
        ],
    },
    # Finetunes
    { service => Client::Service::DSP_FINETUNES,
        version => 2,
        sheet => 'any',
		#match_on_any_row => 1,
        lines =>
        [
		  [ undef ],
		  [
            '.*UPC', 'Artist', 'Title', 'Label', 'ISRC', 'SaleType', 'Salescountry',
			'Shop', 'Quantity', 'PPD\(RAW\)', 'Quantity.*', 'CS-FEE', 'NetRevenue'
          ]
        ],
    },
    # Dance All Day
    { service => Client::Service::DSP_DANCEALLDAY,
        version => 1,
        lines =>
        [
		  [
            'Supplier', 'DSP*', 'Date Report', 'Day of download',
			'Time of download', 'Portal', 'Country of sale*',
			'Transaction type', 'Distribution channel', 'Format',
			'Number of Sales', 'EAN / UPC', 'ISRC', 'Artist', 'Title', 'Label',
			'End consumer price*', 'VAT', 'Currency ECP*', 'Exchange rate',
			'PPD*', 'Currency PPD*', 'Exchange rate*', 'GEMA payed'
		  ]

        ],
    },
    # Dance All Day
    { service => Client::Service::DSP_DANCEALLDAY,
        version => 2,
        lines =>
        [
          [
            'Supplier', 'DSP \(Licensee\)', 'Date Report', 'Portal',
            'Transaction Type', 'Distribution Channel', 'Format',
            'Number of Sales', 'EAN / UPC', 'ISRC', 'Artist', 'Title', 'Label',
            'End consumer price \(net\)', 'VAT', 'Currency ECP', 'Exchange rate',
            'PPD*', 'Currency PPD*', 'Exchange rate*', 'GEMA payed'
          ]

        ],
    },
    # Dance All Day
    { service => Client::Service::DSP_DANCEALLDAY,
        version => 3,
        lines =>
        [
          [
            'Supplier', 'DSP \(Licensee\)', 'Date Report', 'Portal', 'Country of sale',
            'Transaction Type', 'Distribution Channel', 'Format',
            'Number of Sales', 'EAN / UPC', 'ISRC', 'Artist', 'Title', 'Label',
            'End consumer price \(net\)', 'VAT', 'Currency ECP', 'Exchange rate',
            'PPD*', 'Currency PPD*', 'Exchange rate*', '(?:GEMA payed)?'
          ]

        ],
    },
    # Telus
    { service => Client::Service::DSP_TELUS,
        version => 1,
        lines =>
        [
		  [
            'LABEL', 'ISRC', 'ALBUM ISRC', 'ARTIST',
            'TITLE', 'UNIT PRICE', 'REVENUE', 'UNIT SOLD',
			'WHOLESALE', 'VENDOR SHARE'
		  ]

        ],
    },
    # Telus Subscription
    { service => Client::Service::DSP_TELUS,
        version => 2,
        sheet => 'any',
        lines =>
        [
		  [
            'count', 'isrc', 'track', 'billingtag'
		  ]

        ],
    },
    # Telus
    { service => Client::Service::DSP_TELUS,
        version => 3,
        sheet => 'any',
        sheet => 'any',
        lines =>
        [
		  [undef],
		  [ 'CONTENT_TYPE', 'ISRC', 'ARTIST', 'TITLE', 'PRICE', 'DOWNLOADS', undef, 'REVENUE', undef, 'REVENUE_SHARE', 'VENDOR_SHARE' 		  ]
        ],
    },
    # MySpace
    { service => Client::Service::DSP_MYSPACE,
        version => 1,
        lines =>
        [
          [ 'dmsld', 'dmsCountry', 'transactionDate', 'upc', 'isrc', 'albumName', 'trackName', 'quantity', 'unitPrice', 'total', 'transactionType', 'retailPrice' ]
        ],
    },
    # MySpace
    { service => Client::Service::DSP_MYSPACE,
        version => 2,
        lines =>
        [
          [ 'dmsId', 'dmCountry', 'transactionDate', 'upc', 'isrc', 'albumName', 'trackName', 'quantity', 'unitPrice', 'total', 'transactionType', 'retailPrice' ]
        ],
    },
    # MySpace
    { service => Client::Service::DSP_MYSPACE,
        version => 3,
        lines =>
        [
          [ 'PERIOD_START', 'PERIOD_END', 'TERRITORY', 'CURRENCY', 'UPC', 'ISRC', 'ARTIST_NAME', 'SONG_TITLE', 'QUANTITY', 'UNIT_PRICE_RATE', 'GROSS_REVENUE', 'NET_REVENUE', 'REV_SHARE'],
        ],
    },
    # Dance Music Hub
    { service => Client::Service::DSP_DANCEMUSICHUB,
        version => 1,
        lines =>
        [
          ['Supplier', 'DSP \(Licensee\)', 'Report Perid Start', 'Report Perid End', 'Day of download', 'Portal',
		   'Country of sale \(ISO 3166-1\)', 'Transaction type', 'Distribution channel', 'Format', 'EAN \/ UPC',
		   'ISRC', 'Artist', 'Title', 'Label', 'Number of Sales', 'Consumer Price Total', 'Royalty Payable Total',
		   'Currency Royalty Price \(ISO\)', 'Exchange rate', 'PPD PRICE', 'Currency PPD \(ISO\)' ],
        ],
    },
    # Dance Music Hub
    { service => Client::Service::DSP_DANCEMUSICHUB,
        version => 2,
        lines =>
        [
          ['Supplier', 'Report Period Start', 'Report Period End', 'Portal', 'Day of download',
           'Transaction type', 'Format', 'EAN \/ UPC', 'ISRC',
           'Number of Sales',  'Royalty Price UNIT', 'Royalty Price TOTAL',
           'Currency Royalty Price \(ISO\)', 'Title', 'Country Of Sale', 'Artist', 'Label',
           'Exchange rate', 'Royalty Price Total Local Currency \(approximate\)', 'Local Currency'],
        ],
    },
    # Dance Music Hub
    { service => Client::Service::DSP_DANCEMUSICHUB,
        version => 2,
        lines =>
        [
          ['Supplier', 'Report Period Start', 'Report Period End', 'Portal', 'Day of download',
           'Transaction type', 'Format', 'EAN \/ UPC', 'ISRC',
           'Number of Sales',  'Royalty Price UNIT', 'Royalty Price TOTAL',
           'Currency Royalty Price \(ISO\)', 'Title', 'Country Of Sale', 'Artist', 'Label',
           'Royalty Price Total Local Currency \(approximate\)'],
        ],
    },
    # Inndigital
    { service => Client::Service::DSP_INN_DIGITAL,
        version => 1,
		sheet => 'any',
        lines =>
        [
          [
            'DSP Code', 'Report Date', 'Initial Date', 'End Date', 'Total Revenue', 'Revenue Currency', 'Total Number of Lines in Detail Record'
		  ],
		],
    },
    # MyxerTone
    { service => Client::Service::DSP_MYXERTONE,
        version => 1,
        lines =>
        [
          [undef],
          [undef],
          [undef],
          [ 'User ID:' ],
          [undef],
          [ 'Email:' ],
          [undef],
          [undef],
          [ 'Start Date:' ],
          [undef],
          [ 'End Date:' ],
		],
    },
    # Jamvana
    { service => Client::Service::DSP_JAMVANA,
        version => 1,
        lines =>
        [
			[
                'OrderId', 'ProductId', 'Distributor', 'ReleaseName', 'CatalogNumber',
		        'TrackName', 'SongTitle', 'SongInformation', 'Gross Sale', 'Aggregator %',
		        'Mechanicals', 'JamVana NET', 'GenresName', 'LabelId', 'RecordLabel',
		        'ArtistName', 'IsSong', 'Quarter', 'Store Name'
			]
		],
    },
    { service => Client::Service::DSP_JAMVANA,
        version => 2,
        lines =>
        [
			[
                'Distributor', 'ReleaseName', 'CatalogNumber', 'TrackName', 'SongTitle',
		        'Gross Sale', 'Aggregator %', 'Mechanicals', 'JamVana NET', 'LabelId',
		        'RecordLabel', 'ArtistName', 'IsSong', 'Quarter', 'Store Name'
			]
		],
    },
    # ICJ
    { service => Client::Service::DSP_ICJ,
        version => 1,
        lines =>
        [
			[
               'Year-Month', 'Music ID', 'Music Name', 'Artist Name', 'Service Name',
			   'Media', 'Price\(Excluding tax\)', 'Royalty per Download',
			   'Royalty Payable per Download', 'DoCoMo', 'au', 'SoftBank', 'PC',
			   'Subtotal DL', 'Royalty'
			]
		],
    },

    # LastFM
    { service => Client::Service::DSP_LASTFM,
        version => 1,
        lines =>
        [
			[
               'Service provider', 'Transaction type', 'Country code', 'Transaction date',
			   'UPC', 'ISRC', 'Artist name', 'Album name', 'Track name', 'Quantity',
			   'Unit price', 'Currency code', 'Total'
			]
		],
    },

    # TDC Musik
    { service => Client::Service::DSP_TDC_MUSIK,
        version => 1,
        lines =>
        [
			[
               'H', '\d{6}', undef, undef, '\w', '\d+', '\w{3}', '0', '\d{8}', undef, undef, 'TDC Musik', 'WEB'
			]
		],
    },

    # Christian Book
    { service => Client::Service::DSP_CHRISTIANBOOK,
        version => 1,
        lines =>
        [
			[
               'CBD_SKU', 'Title', 'Product#', 'Digital_List_Price', 'Units', 'Cost'
			]
		],
    },
    # Redeye Digital
    { service => Client::Service::DSP_REDEYE,
        version => 1,
        lines =>
        [
			[
               'DSP', 'Start Date', 'End Date', 'Terr.', 'UPC\/ISRC', 'Label', 'Artist', 'Album\/Track Title', 'Method', 'Format', 'Qnty', 'Royalty', 'Dist %', 'Extended'

			]
		],
    },
    # SURFDOG -> REDEYE DIGITAL, version 2
    { service => Client::Service::DSP_REDEYE,
        version => 2,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             ['DSP', 'Start Date', 'End Date', 'Terr.', 'UPC\/ISRC', 'Item Num', 'Label', 'Artist', 'Album\/Track Title', 'Method', 'Format', 'Qnty', 'Royalty', 'Dist %', 'Extended']
        ],
    },    
    # STT Holdings -> REDEYE DIGITAL (FB16724)
    { service => Client::Service::DSP_REDEYE,
        version => 3,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'Transaction Date', 'Territory', 'UPC\/EAN', 'ISRC', 'Cat. Num.', 'Supplier Code', 'Release Title', 'Track Artist', 'Track Title', 'Format', 'Product Type', 'Unit Price', 'VAT Rate', 'Net Unit Price', 'Royalty Split', 'Store Share', 'Final Amount'
	     ]
        ],
    },    
    # SURFDOG -> REDEYE DIGITAL (FB17052)
    { service => Client::Service::DSP_REDEYE,
        version => 4,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'DSP', 'Start Date', 'End Date', 'Territory', 'UPC', 'ISRC', 'Item Num', 'Label', 'Artist', 'Album Title', 'Track Title', 'Track Artist', 'Method', 'Format', 'Quantity', 'Royalty', 'Dist \%', 'Extended'
             ],
        ],
    },    
    # CMG -> REDEYE PHYSICAL (FB5381)
    { service => Client::Service::DSP_REDEYE,
        version => 5,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'Item Num', 'UPC', 'Artist', 'Title', 'Units', 'Customer', 'Invoice Number', 'Invoice Date', 'Invoice p\/u', 'Gross', 'Distribution Fee', 'Net Cost', 'Return Reserved', 'Freight', 'Terms', '^$'
             ],
        ],
    },    
    # Oh Boy -> REDEYE PHYSICAL (FB11028)
    { service => Client::Service::DSP_REDEYE,
        version => 6,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
                'Sales Date', 'Item #', 'UPC', 'Artist', 'Title', 'Street Date', 'Vendor #', 'Vendor', 'Customer', 'Type', 'Units', 'Sales', 'Sales Rep', '^$'
             ],
        ],
    },    
    # Everloving -> REDEYE PHYSICAL (FB15403)
    { service => Client::Service::DSP_REDEYE,
        version => 7,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'Item Num', 'UPC', 'Artist', 'Title', 'Units', 'Customer', 'Invoice Number', 'Invoice Date', 'Invoice p\/u', 'Gross', 'Distribution Fee', 'Net Cost', 'Return Reserved', 'Freight', '(Territory|Country)', '^$'
             ],
        ],
    },    
    # Oh Boy -> REDEYE PHYSICAL (FB17547)
    { service => Client::Service::DSP_REDEYE,
        version => 8,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'Item Num', 'UPC', 'Artist', 'Title', 'Units', 'Customer', 'Invoice Number', 'Invoice Date', 'Invoice p\/u', 'Gross', 'Distribution Fee', 'Net Cost', 'Return Reserves', 'Net', 'Amt Paid'
             ],
        ],
    },    
    # Redeye Physical (FB19469)
    { service => Client::Service::DSP_REDEYE,
        version => 9,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
             [
'Item Num', 'UPC', 'Artist', 'Title', 'Units', 'Customer', 'Invoice Number', 'Return Date', 'Price', 'Gross', 'Distro', 'Net', 'Ret Proc', 'country'
             ],
        ],
    },    
    # Eleven Seven -> EMI UK digital, version 6 (FBoD864)
    { service => Client::Service::DSP_EMI_UK,
        version => 6,
        lines =>
        [
            ['Digital'],
            [undef],
            [undef],
            [undef, undef, undef, undef, undef, undef, 'Month-to-date', undef, undef, undef, undef, undef, undef, undef, undef, 'Fiscal year-to-date', undef, undef, undef, undef, undef, undef, undef, undef, 'All-time'],
            [
                'Artist name', 'Title', 'Format', 'ICPN/DTI', 'Cat. Number', 'Territory',
                'Gross units', 'Returns units', 'Net units', 'Gross value',
                'Returns value', 'Returns %', 'Discount value', 'Discount %', 'NDS value',
                'Gross units', 'Returns units', 'Net units', 'Gross value', 'Returns value',
                'Returns %', 'Discount value', 'Discount %', 'NDS value', 'Gross units',
                'Returns units', 'Net units', 'Gross value', 'Returns value', 'Returns %',
                'Discount value', 'Discount %', 'NDS value'
            ]
        ]
    },
    { service => Client::Service::DSP_EMI_UK,
        version => 3,
        match_on_any_row => 1,
        lines =>
        [
			[ 'Digital.*'],
			[ undef ],
			[
               'Artist Name', 'Title', 'Format', 'ICPN', 'CAT Number', 'Territory',
			   undef, 'Gross Units', 'Returns Units', 'Net Units', 'Gross Value',
			   'Return Value', 'Return %', 'Discount Value', 'Discount %', 'NDS Value',
			   'Gross Units', 'Returns Units', 'Net Units', 'Gross Value', 'Return Value',
			   'Return %', 'Discount Value', 'Discount %', 'NDS Value', 'Gross Units',
			   'Returns Units', 'Net Units', 'Gross Value', 'Return Value', 'Return %',
			   'Discount Value', 'Discount %', 'NDS Value',
			]
		],
    },
    # Eleven Seven -> EMI UK physical, version 5 (FBoD862)
    { service => Client::Service::DSP_EMI_UK,
        version => 5,
        match_on_any_row => 1,
        lines =>
        [
            [undef, undef, undef, undef, undef, undef, 'Month-to-date', undef, undef, undef, undef, undef, undef, undef, undef, 'Fiscal year-to-date', undef, undef, undef, undef, undef, undef, undef, undef, 'All-time'],
            [
                'Artist name', 'Title', 'Format', 'ICPN', 'Cat. Number', 'Territory',
                'Gross units', 'Returns units', 'Net units', 'Gross value', 'Returns value',
                'Returns %', 'Discount value', 'Discount %', 'NDS value', 'Gross units',
                'Returns units', 'Net units', 'Gross value', 'Returns value', 'Returns %',
                'Discount value', 'Discount %', 'NDS value', 'Gross units', 'Returns units',
                'Net units', 'Gross value', 'Returns value', 'Returns %', 'Discount value',
                'Discount %', 'NDS value'
            ]
        ],
    },
    { service => Client::Service::DSP_EMI_UK,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
			[ 'Physical.*'],
			[ undef ],
			[
               'Artist Name', 'Title', 'Format', 'ICPN', 'CAT Number', 'Territory',
			   undef, 'Gross Units', 'Returns Units', 'Net Units', 'Gross Value',
			   'Return Value', 'Return %', 'Discount Value', 'Discount %', 'NDS Value',
			   'Gross Units', 'Returns Units', 'Net Units', 'Gross Value', 'Return Value',
			   'Return %', 'Discount Value', 'Discount %', 'NDS Value', 'Gross Units',
			   'Returns Units', 'Net Units', 'Gross Value', 'Return Value', 'Return %',
			   'Discount Value', 'Discount %', 'NDS Value',
			]
		],
    },
    { service => Client::Service::DSP_EMI_UK,
        version => 2,
        match_on_any_row=>1,
        lines =>
        [
			[
               'Artist Name', 'Title', 'Format', 'ICPN', 'CAT Number', 'Territory',
			   'Gross Units', 'Returns Units', 'Net Units', 'Gross Value', 'Return Value',
			   'Return %', 'Discount Value', 'Discount %', 'NDS Value', 'Gross Units',
			   'Returns Units', 'Net Units', 'Gross Value', 'Return Value', 'Return %',
			   'Discount Value', 'Discount %', 'NDS Value', 'Gross Units', 'Returns Units',
			   'Net Units', 'Gross Value', 'Return Value', 'Return %', 'Discount Value',
			   'Discount %', 'NDS Value'
			]
		],
    },
    { service => Client::Service::DSP_EMI_UK,
        version => 4,
        match_on_any_row=>1,
        lines =>
        [
			[
               'Sold By', 'Owned By', 'Artist', 'Title', 'ICPN', 'Format', 'Release date',
			   'Gross Units', 'Net Sales Units', 'Gross Value', 'NDS Value',
            ]
		],
    },
    # Warner Physical
    { service => Client::Service::DSP_WARNER,
        version => 1,
        lines =>
        [
            [
               'MONTH', 'EXTFAMILYNAME', 'IMDFAMILYNAME', 'COMPANY', 'LABELCODE', 'CONFIG', 'PREFIX', 'SELECTION', 'RELEASEDATE', 'ARTIST', 'TITLE', 'COMP', 'GROSS_QTY', 'RETURN_QTY', 'NET_QTY', 'GROSS_AMT', 'RETURN_AMT', 'NET_AMT'

            ]
        ],
    },
    # Warner UK Digital
    { service => Client::Service::DSP_WARNER,
        version => 2,
        lines =>
        [
            [
'stm_recdate', 'stm_repdate', 'stm_catno', 'stm_share', 'stm_totshare', 'stm_time', 'stm_tottime', 'sales', 'price', 'stm_base', 'stm_unitrate', 'stm_receipt', 'stm_royalty', 'stm_royaltor', 'stm_payee', 'stm_packrate', 'stm_royrate', 'stm_pcsales', 'stm_pcbase', 'stm_pcrev', 'stm_roytype', 'b_period', 'e_period', 'stm_tax', 'stm_exchrate', 'stm_escrate', 'ter_location', 'pak_desc', 'con_name', 'cat_title', 'pri_desc', 'con_payee', 'com_name', 'com_address1', 'com_address2', 'com_address3', 'com_address4', 'par_tune', 'par_title', 'stm_teritory', 'cat_owner', 'stm_locpack_rate', 'pak_type', 'stm_operiod'
            ],
            [
undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'DIGITAL', undef
            ]
        ],
    },
    # Warner UK Physical
    { service => Client::Service::DSP_WARNER,
        version => 3,
        lines =>
        [
            [
'stm_recdate', 'stm_repdate', 'stm_catno', 'stm_share', 'stm_totshare', 'stm_time', 'stm_tottime', 'sales', 'price', 'stm_base', 'stm_unitrate', 'stm_receipt', 'stm_royalty', 'stm_royaltor', 'stm_payee', 'stm_packrate', 'stm_royrate', 'stm_pcsales', 'stm_pcbase', 'stm_pcrev', 'stm_roytype', 'b_period', 'e_period', 'stm_tax', 'stm_exchrate', 'stm_escrate', 'ter_location', 'pak_desc', 'con_name', 'cat_title', 'pri_desc', 'con_payee', 'com_name', 'com_address1', 'com_address2', 'com_address3', 'com_address4', 'par_tune', 'par_title', 'stm_teritory', 'cat_owner', 'stm_locpack_rate', 'pak_type', 'stm_operiod'
            ],
            [
undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, 'PHYSICAL', undef
            ]
        ],
    },
    # Warner AU Physical (FB7240)
    { service => Client::Service::DSP_WARNER,
        version => 4,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'Artist', 'Title', 'Catalogue #', 'Config', 'Current PPD', 'Sales PPD', 'Gross Sales Units', 'Returns Units', 'Returns Value', 'GSLR Units', 'Promos Units', 'Destructions Units', 'Discounts Value', 'Net Sales Value', 'Copyright', 'Dist Fee', 'Rebate', 'Promos Units Handling Fee', 'Destructions Handling Fee', 'Returns Handling Fee', 'Distribution Proceeds Before Mfg', 'Adjusted Gross Sales Value', 'Adjusted Deduction Value', 'Adjusted Net Sales Value', 'Adjusted Sales PPD'
            ],
        ],
    },
    # Warner AU Digital (FB7242)
    { service => Client::Service::DSP_WARNER,
        version => 5,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'Artist', 'Title', 'GRID', 'Catalogue #', 'Config', 'Sales PPD', 'Gross Sales Units', 'Returns Units', 'Returns Value', 'GSLR Units', 'Promos Units', 'Destructions Units', 'Discounts Value', 'Net Sales Value', 'Dist Fee', 'Rebate', 'Promos Units Handling Fee', 'Destructions Handling Fee', 'Returns Handling Fee', 'Distribution Proceeds Before Mfg'
            ],
        ],
    },
    # Warner NZ Digital (FB7243)
    { service => Client::Service::DSP_WARNER,
        version => 6,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'period year', 'period month', 'report date', 'artist name', 'customer name', 'product type desc', 'tune link num', 'dealer price', 'title', 'units sold', 'gross sales'
            ],
        ],
    },
    # Warner NZ Physical (FB7244)
    { service => Client::Service::DSP_WARNER,
        version => 7,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'Artist', 'Title', 'Catalogue #', 'Gross Sales', 'Return', 'GSLR', 'Promo', 'Destruction', 'Returns', 'Discounts', 'Net Sales', 'Net Sales', 'PPD', 'PPD', 'Actual Sale', 'Copyright', 'Dist. Fee', 'Mktng. Fee', 'Promo Fee', 'GST on', 'Promo Units', 'Destructions', 'Returns', 'Royalty Pay', 'Adjusted Gross Sales', 'Adjusted Deduction', 'Adjusted Net Sales', 'Adjusted Sales PPD'
            ],
        ],
    },
    # Warner NZ Digital (FB7487) - same as version 6, but without "report date" column
    { service => Client::Service::DSP_WARNER,
        version => 8,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
 'period year', 'period month', 'artist name', 'customer name', 'product type desc', 'tune link num', 'dealer price', 'title', 'units sold', 'gross sales'
            ],
        ],
    },
    # Warner NZ Physical (FB8973)
    { service => Client::Service::DSP_WARNER,
        version => 9,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'Month', 'Artist', 'Title', 'Catalogue #', 'Gross Sales', 'Returns', 'GSLR', 'Discounts', 'Net Sales', 'PPD', 'PPD', 'Dist\. Fee', 'GST on', 'Copyright', 'Royalty Pay'
            ],
        ],
    },
    # Warner AU Physical (FB8972)
    { service => Client::Service::DSP_WARNER,
        version => 10,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'Artist', 'Title', 'Catalogue #', 'Config', 'Current PPD', 'Sales PPD', 'Gross Sales Units', 'Returns Units', 'Returns Value', 'GSLR Units', 'Promos Units', 'Destructions Units', 'Discounts Value', 'Net Sales Value', 'Copyright', 'Dist Fee', 'Rebate', 'Promos Units Handling Fee', 'Destructions Handling Fee', 'Returns Handling Fee', 'Distribution Proceeds Before Mfg'
            ],
        ],
    },
    # Warner US Digital (FBoD18144)
    { service => Client::Service::DSP_WARNER,
        version => 11,
        sheet => 'any',
        lines =>
        [
            [
'Receipt Date', 'Product Code', 'Product Usercode', 'Product Barcode', 'Product Title', 'Artist Name', 'Territory', 'Distribution Channel', 'Price Category', 'Configuration', 'Units Sold', 'Price 1 - PPD', 'Price 2 - SRLP', 'Source', 'Sale Date', 'Net Receipts', 'Notes', 'Project Name', '^$'
            ],
        ],
    },    
    # Republic of Music (FB8971)
    { service => Client::Service::DSP_REPUBLIC_OF_MUSIC,
        version => 1,
	match_on_any_row => 1,
	sheet => 'any',
        lines =>
        [
            [
'Label', 'Catalog No', 'Release Artist', 'Release Title', 'Release Type', 'Media Type', 'Format/Config', 'Release Date', 'UPC', 'SR1 Release ID', 'Vendor Sale ID', 'Vendor', 'Country of Sale', 'Country Code', 'Budget Sale Type', 'UK PPD Price', 'Units Sold', 'Units Returned', 'Net Units', 'Gross Sales \(PPD\)', 'Discount %', 'Total Discount', 'Sales', 'Returns', 'Net Income', 'ROM Distribution Fee', 'Returns Fee', 'Net Payable'
            ],
        ],
    },
    # RealNet
    { service => Client::Service::DSP_REALNET,
        version => 1,
        lines =>
        [
			[
                'Report Type', 'Account Name', 'Content Partner', 'Period Start',
				'Period End', 'Report Timestamp', 'Sales Territory', 'Retail Currency',
				'Total Quantity', 'Total Label Share', 'Total Share Currency'
			],
			[ undef ],
            [
                'Sales Quantity', 'Distribution Method', 'Product Type', 'Tracks in Album',
				'UPC', 'ISRC', 'GRID', 'Product ID', 'Product ID Real', 'Artist',
				'Product Title', 'Price Code', 'Retail Price', 'Label Share per Unit',
				'Label Share'
            ]
        ],
    },
    # Boundee
    { service => Client::Service::DSP_BOUNDEE,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
               'BounDEE Admin Code', 'Company Admin Code', 'Sales Month',
               'T_Title / P_Title', 'Configuration', 'Retail Price w/o Tax',
               undef, undef, undef, undef, undef, undef,
               'BounDEE Admin Code', 'Company Admin Code',
               'T_Artist', 'T_Contents', 'Sales', undef, 'Commission', undef,
               'Notes 1', 'Notes 2'

            ],
        ],
    },
    # Boundee v2
    { service => Client::Service::DSP_BOUNDEE,
        version => 2,
        match_on_any_row => 1,
        lines =>
        [
            [
               'SSNW Admin Code', 'Company Admin Code', 'Sales Month',
               'T_Title / P_Title', 'Configuration', 'Retail Price w/o Tax',
               undef, undef, undef, undef, undef, undef,
               'SSNW Admin Code', 'Company Admin Code',
               'T_Artist', 'T_Contents', 'Sales', undef, 'Commission', undef,
               'Notes 1', 'Notes 2'

            ],
        ],
    },
    # Satellite
    { service => Client::Service::DSP_SATELLITE,
        version => 1,
        lines =>
        [
			[
               'H', '\d{8}', '\d{8}', undef, '\w{3}', '\w{3}', '\d+', '\d+'
			]
		],
    },
    # Satellite, version 2
    { service => Client::Service::DSP_SATELLITE,
        version => 2,
        lines =>
        [
     		[
                'RECORD_TYPE', 'PERIOD_START_DATE', 'PERIOD_END_DATE',
                'TOTAL_SALES', 'ISO_CURRENCY_CODE', 'TIMEZONE',
                'SPEC_NUMBER', 'VERSION_NUMBER',

			],
			[
               'H', '\d{8}', '\d{8}', undef, '\w{3}', '\w{3}', '\d+', '\d+'
			],
            [
                'RECORD_TYPE', 'ISRC', 'UPC', 'TRACK_NAME',
                'TRACK_VERSION', 'RELEASE_NAME', 'ARTIST_NAME',
                'LABEL_NAME', 'TRANSACTION_TYPE', 'FORMAT', 'UNIT_PRICE',
                'ISO_COUNTRY_CODE',  undef, 'MECHANICAL_DEDUCTION',
                'TRANSACTION_FEE_DEDUCTION', 'CURATOR_COMMISSION',
                'TRANSACTION_DATE',
            ],
		],
    },
    # Merlin
	{ service => Client::Service::DSP_MERLIN,
        version => 1,
        lines =>
        [
			['Accounted Period', 'Date of Report', 'Total Royalties Payable', 'Currency', 'Licensee', 'Aggregator' ],
			[ undef ],
			[
               'Licensee', 'Portal Retailer', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Number of Transactions', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type',
            ]
		],
    },
    # Merlin
	{ service => Client::Service::DSP_MERLIN,
        version => 3,
        lines =>
        [
			[
               'PROVIDER_NAME', 'PERIOD_START', 'PERIOD_END', 'TERRITORY', 'CURRENCY', 'EXTERNAL_ID', 'UPC', 'ISRC', 'LABEL', 'SUB_LABEL', 'ARTIST_NAME', 'SONG_TITLE', 'QUANTITY', 'UNIT_PRICE_RATE', 'GROSS_REVENUE', 'NET_REVENUE', 'REV_SHARE', 'USD PAYABLE',
            ]
		],
    },
    # Merlin
    { service => Client::Service::DSP_MERLIN,
      version => 6,
      lines =>
      [
        [
          'PROVIDER_NAME', 'PERIOD_START', 'PERIOD_END', 'TERRITORY', 'CURRENCY', 'EXTERNAL_ID', 'UPC', 'ISRC', 'LABEL', 'SUB_LABEL', 'ARTIST_NAME', 'SONG_TITLE', 'QUANTITY', 'UNIT_PRICE_RATE', 'GROSS_REVENUE', 'NET_REVENUE', 'REV_SHARE', 'REV_SHARE',
        ]
      ],
    },    
    # Merlin
	{ service => Client::Service::DSP_MERLIN,
        version => 2,
        match_on_any_row => 1,
        lines =>
        [
			[
               'PROVIDER_NAME|provider', 'PERIOD_START|start_date', 'PERIOD_END|end_date', 'TERRITORY', 'CURRENCY', 'EXTERNAL_ID', 'UPC', 'ISRC', 'LABEL', 'SUB_LABEL', 'ARTIST_NAME', 'SONG_TITLE', 'QUANTITY', 'UNIT_PRICE_RATE', 'GROSS_REVENUE', 'NET_REVENUE', 'REV_SHARE',
            ]
		],
    },   
    # Merlin
	{ service => Client::Service::DSP_MERLIN,
        version => 4,
        lines =>
        [
			[
               'Licensee', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label Name', 'Number of Transactions', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type',
            ]
		],
    },
    # Merlin
	{ service => Client::Service::DSP_MERLIN,
        version => 5,
        lines =>
        [
			['Accounted Period', 'Date of Report', 'Total Royalties payable', 'Currency', 'Licensee', 'Aggregator' ],
			[ undef ],
			[ undef ],
			[
               'Licensee', 'Portal Retailer', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type',
            ]
		],
    },        
    # Merlin - Skint (FB16390)
	{ service => Client::Service::DSP_MERLIN,
        version => 9,
        match_on_any_row => 1,
        lines =>
        [
		[
                'Licensee', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Sub Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type'
            ]
		],
    },        
     # Merlin (FB16175)
	{ service => Client::Service::DSP_MERLIN,
       version => 7,
       match_on_any_row => 1,
       lines =>
       [
			[
               'Lable', 'DSP', 'Date report', 'Day of download', 'Portal', 'Country of sale', 'Transaction type', 'Distribution channel', 'Format', 'Numbe of sales', 'ISRC', 'UPC', 'EAN', 'Artist', 'Title', 'Album name', 'Sub-Label', 'End  consumer price', 'VAT', 'Gross revenueless VAT, RUB', 'Currency ECP', 'Currency PPD', 'Exchange rate PPD', 'Gross  revenueless  VAT, USD', undef, undef, 'Net revenue', 'PPD %', 'PPD', 'PPD Minimum', 'PPD per order'
			],
			[ undef ],
		],
	},
     # Merlin (FB16266) - SKINT
	{ service => Client::Service::DSP_MERLIN,
       version => 8,
       match_on_any_row => 1,
       lines =>
       [
           [
        'Distributor', 'Marketer', 'Label', 'Country', 'ISRC', 'UPC', 'ArtistName', 'TrackName', 'AlbumName', 'Units', 'UnitPrice', 'NetRoyalty', 'CurrencyCode', 'TransactionType', 'PlayType', 'UserType', 'ProductType', 'SalesType', 'Delimiter'
           ],
        ],
	},

     # Merlin (FB16552) - SKINT
	{ service => Client::Service::DSP_MERLIN,
       version => 10,
       match_on_any_row => 1,
       lines =>
       [
           [
'Date of Sales', 'Country of Sales', 'Distribution channel', 'Sale configuration', 'UPC', 'ISRC', 'EAN', 'Artist', 'Title', 'Album name', 'Sub-Label', 'Retail price, incl VAT, RUB', 'VAT, RUR', 'Publishing fees \(12%\)', 'Technical fees \(15%\)', 'Net revenue, excl VAT, RUR', 'Exchange rate', 'Net revenue, excl VAT, USD', 'Agreed share in net revenue, %', 'Minimum guaranteed fee, USD', 'PPD accounted, USD'
           ],
        ],
	},

     # Merlin (FB16587) - GROOVESHARK
	{ service => Client::Service::DSP_MERLIN,
       version => 11,
       match_on_any_row => 1,
       lines =>
       [
           [
'licensee', 'country', 'isrc', 'upc', 'artist', 'title', 'album', 'label', 'total_plays', 'per_play_rate', 'net_royalty', 'currency', 'transaction_type', 'play_type', 'user_type', 'distributor'

           ],
        ],
	},

     # Merlin (FB16804) - SKINT
	{ service => Client::Service::DSP_MERLIN,
       version => 13,
       match_on_any_row => 1,
       lines =>
       [
           [
'Licensee', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Sub Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Territory', 'Transaction Type', 'Play Type', 'User Type'
           ],
        ],
	},

     # Merlin (FB17030) - MEMPHIS
	{ service => Client::Service::DSP_MERLIN,
       version => 14,
       match_on_any_row => 1,
       lines =>
       [
           [
'Start Date', 'End Date', 'MUZU\.TV', 'Merlin', 'Country Of Usage', 'Distributor', 'Label', 'ArtistName', 'TrackName', 'MuzuFileIdentifier', 'UPC', 'ISRC', 'Quantity', 'Currency', 'RevShare', 'NumberOfUsers', 'NetRevenuePerPlay', 'Payable', 'MG Plays', 'MG Rate', 'MG Rev', 'Ad Rev'
           ],
        ],
	},
    # Merlin (FB17240)
    { service => Client::Service::DSP_MERLIN,
        version => 15,
        sheet => 0,
        lines => [
            [
'Start Report', 'End Report', 'ISRC', 'Artist', 'Title', 'Album', 'UPC', 'Country', 'Nb of plays', 'Royalties', 'Service', 'Provider', 'provider_id', 'Label'
            ],
        ],
    },
    # Merlin (FB17480)
    { service => Client::Service::DSP_MERLIN,
        version => 17,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Date of Sales', 'Country of Sales', 'Distribution channel', 'Sale configuration', 'UPC', 'ISRC', 'EAN', 'Artist', 'Title', 'Album name', 'Sub-Label', 'Retail price, incl VAT, RUB', 'VAT, RUR', 'Publishing fees \(12%\)', 'Technical fees \(15%\)', 'Net revenue, excl VAT, RUR', 'Exchange rate', 'Net revenue, excl VAT, USD', 'Agreed share in net revenue, %', 'Minimum guaranteed fee, USD', 'Payable Fee'
            ],
        ],
    },
    # Merlin (FB17515)
    { service => Client::Service::DSP_MERLIN,
        version => 18,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Account Name', 'Application', 'Territory', 'Operator', 'Device', 'Tariff', 'Sales period begin', 'Sales period end', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Customer Period', 'Number of Transactions', 'Record Label Company Name', 'Sub-Record Label Company Name', 'PPU \(Local Curr\)', 'Royalty \(Local Curr\)', 'Currency', 'Royalty \(\w{3}\)'
            ],
        ],
    },
    # Merlin (FB795)
    # Positioning this rule here so that it gets picked up before version 19.  The last
    # field (Royalty) is more specific in this version
    { service => Client::Service::DSP_MERLIN,
        version => 24,
        sheet => 0,
        lines => [
            [
'Account Name', 'Application', 'Territory', 'Operator', 'Device', 'Tariff', 'Sales period begin', 'Sales period end', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Customer Period', 'Number of Transactions', 'Record Label Company Name', 'Sub-Record Label Company Name', 'Royalty \(USD\)'
            ],
        ],
    },
    # Merlin (FB17676)
    { service => Client::Service::DSP_MERLIN,
        version => 19,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Account Name', 'Application', 'Territory', 'Operator', 'Device', 'Tariff', 'Sales period begin', 'Sales period end', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Customer Period', 'Number of Transactions', 'Record Label Company Name', 'Sub-Record Label Company Name', 'Royalty \(\w{3}\)'
            ],
        ],
    },
    # Merlin (FB17678)
    { service => Client::Service::DSP_MERLIN,
        version => 20,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Licensee', 'Portal Retailer', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Sub Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type'
            ],
        ],
    },
    # Merlin (FB17677)
    { service => Client::Service::DSP_MERLIN,
        version => 21,
        sheet => 0,
        lines => [
	    [undef],
	    [undef],
            [
'Distributor', 'Marketer', 'Label', 'Country', 'ISRC', 'UPC', 'ArtistName', 'TrackName', 'AlbumName', 'Units', 'UnitPrice', 'NetRoyalty', 'CurrencyCode', 'TransactionType', 'PlayType', 'UserType', 'ProductType', 'SalesType'
            ],
        ],
    },
    # Merlin (FB17743)
    { service => Client::Service::DSP_MERLIN,
        version => 22,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Account Number', 'Country Of Sale', 'Sales Period Begin \(DD-MM-YYYY\)', 'Sales Period End \(DD-MM-YYYY\)', 'Usage Type', 'Product Type', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Number of Transactions', 'Merlin ID', 'Sub Label', 'AUD Payable', 'USD Payable'
            ],
        ],
    },
    # Merlin (FB797)
    { service => Client::Service::DSP_MERLIN,
        version => 23,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Licensee', 'Portal Retailer', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type'
            ],
        ],
    },
    # Merlin (FB4754)
    { service => Client::Service::DSP_MERLIN,
        version => 25,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Start_Date', 'End_Date', 'UPC', 'GRID', 'ISRC', 'Custom_ID_1', 'Custom_ID_2', 'Custom_ID_3', 'Custom_ID_4', 'Google_ID', 'Artist', 'Product_Title', 'Container_Title', 'Content_Provider', 'Label', 'Consumer_Country', 'Device_Type', 'Product_Type', 'Interaction_Type', 'Count', 'Consumer_Zip_Code', 'Retail_Price', 'Retail_Currency', 'Wholesale_Price', 'Wholesale_Currency', 'Partner_Revenue_Paid', 'Partner_Revenue_Currency', 'Partner_Revenue_Invoiced', 'Partner_Revenue_Invoiced_Currency'
            ],
        ],
    },
    # Merlin (FB4755)
    { service => Client::Service::DSP_MERLIN,
        version => 26,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Reporting_Region', 'Artist', 'Track', 'Album', 'UPC', 'ISRC', 'Partner_Album_ID', 'Partner_Track_ID', 'Content_Provider', 'Label', 'Web_Plays', 'Device_Plays', 'Downloads', 'Weighted Activity', 'Amount_Payable_USD'
            ],
        ],
    },
    # Merlin (FB4757)
    { service => Client::Service::DSP_MERLIN,
        version => 27,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Reporting_Region', 'Artist', 'Track', 'Album', 'UPC', 'GRID', 'ISRC', 'Partner_Album_ID', 'Partner_Track_ID', 'Content_Provider', 'Label', 'Web_Plays', 'Device_Plays', 'Total_Plays', 'Partner_Revenue_Paid', 'Partner_Revenue_Currency', 'USD_Amount'
            ],
        ],
    },
	# Merlin (almost the same as medianet v9) (FB8306)
	{ service => Client::Service::DSP_MERLIN,
	  version => 28,
	  lines => [
	[
	  'Licensee', 'Portal', 'Country of Transaction', 'ISRC', 'UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Merlin Member', 'Number of Plays', 'Net Royalty per Play', 'Net Royalty Total', 'Currency', 'Transaction Type', 'Play Type', 'User Type' ]
	]
	},		
    # Merlin
	{ service => Client::Service::DSP_MERLIN,
        version => 29,
        lines =>
        [
			[
                'start_date', 'end_date', 'territory', 'currency', 'external_id', 'upc', 'isrc', 'label', 'sub_label', 'artist_name', 'song_title', 'quantity', 'unit_price_rate', 'gross_revenue', 'net_revenue', 'rev_share'

            ]
		],
    },   
    # Merlin, v30, Pandora
	{ service => Client::Service::DSP_MERLIN,
        version => 30,
        lines =>
        [
			[
                'Period Start', 'Merlin Member', 'Label', 'UPC', 'Disc Num', 'Track Num', 'Track Name', 'Album', 'Artist', 'ISRC', 'Country', 'Total Spins', 'Compensable Spins', 'Non-Subscriber Spins', 'Subscriber Spins', 'Bullet Non-Subscriber', 'Bullet Subscriber', 'Label Steering Percent', 'USD amount'
            ]
		],
    },   
    # Merlin, v31, Pandora
	{ service => Client::Service::DSP_MERLIN,
        version => 31,
        lines =>
        [
			[
                'Period Start', 'Merlin Member', 'Label', 'UPC', 'Disc Num', 'Track Num', 'Track Name', 'Album', 'Artist', 'ISRC', 'Country', 'Total Spins', 'Compensable Spins', 'Non-Subscriber Spins', 'Subscriber Spins', 'Bullet Non-Subscriber', 'Bullet Subscriber', 'Payable in USD'
            ]
		],
    },   
    # Merlin, v32, Virtual
	{ service => Client::Service::DSP_MERLIN,
        version => 32,
        match_on_any_row => 1,
        lines =>
        [
	    [
'Country of Transaction', 'Report start date', 'Report end date', 'Licensee', 'DSP DPID', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Sub Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Currency', 'Tier', 'Stream Type'
            ]
		],
    },   
    # Merlin, v33, ATO
	{ service => Client::Service::DSP_MERLIN,
        version => 33,
        match_on_any_row => 1,
        lines =>
        [
	        [
                'Accounted_Period2', 'Date_of_Report2', 'Total_Royalties_payable2', 'Currency3', 'Licensee4', 'Aggregator2', 'Licensee2', 'Portal_Retailer2', 'Country_of_Transaction2', 'ISRC2', 'EAN_UPC2', 'ArtistName2', 'TrackName2', 'AlbumName2', 'Label2', 'Number_of_Transaction2', 'Net_Royalty_per_Transaction2', 'Net_Royalty_Total2', 'Currency2', 'Transaction_Type2', 'Play_Type2', 'User_Type2', '^$'
            ]
		],
    },   
    # Merlin, v34, Pandora, added and extra column to 31, FB10990
	{ service => Client::Service::DSP_MERLIN,
        version => 34,
        lines =>
        [
			[
                'Period Start', 'Merlin Member', 'Label', 'UPC', 'Disc Num', 'Track Num', 'Track Name', 'Album', 'Artist', 'ISRC', 'Country', 'Total Spins', 'Compensable Spins', 'Non-Subscriber Spins', 'Subscriber Spins', 'Bullet Non-Subscriber', 'Bullet Subscriber', 'Label Steering Percent', 'Payable in USD', '^$'
            ]
		],
    },   
    # Merlin, v35 (FB12652)
	{ service => Client::Service::DSP_MERLIN,
        version => 35,
        match_on_any_row => 1,
        lines =>
        [
			[
'Party ID', 'Provider Name', 'Label Name', 'Local ID', 'Catalog Number', 'ICPN \(UPC\)', 'GRID', 'ISRC', 'Artist', 'Title', 'ReleaseType', 'CommercialType', 'DistributionChannelType', 'DistributionChannel', 'UseType', 'Territories', 'TotalStreams', 'Unit price', 'Total', 'Currency', 'Total Euro'
            ]
		],
    },   
    # Merlin, v36 (FB12911)
	{ service => Client::Service::DSP_MERLIN,
        version => 36,
        match_on_any_row => 1,
        lines =>
        [
			[
'Report date', 'Merlin Member', 'Sublabel', 'Service Type', 'ISRC', 'UPC', 'Company', 'Territory', 'Transaction', 'Album Name', 'Track Name', 'Artist Name', 'Track Count', 'Per Stream Rate', 'Currency', 'Total', 'Total USD'
            ]
		],
    },   
    # Merlin, v37 (FB13072)
	{ service => Client::Service::DSP_MERLIN,
        version => 37,
        match_on_any_row => 1,
        lines =>
        [
			[
'Accounted Period', 'Date of Report', 'Total Royalties payable', 'Currency', 'Licensee', 'Aggregator', 'Portal Retailer', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Transaction Type', 'Play Type', 'User Type'
            ]
		],
    },   
    # Merlin, v38 (FB14077)
	{ service => Client::Service::DSP_MERLIN,
        version => 38,
        match_on_any_row => 1,
        lines =>
        [
			[
'Date', 'Content Provider', 'Label', 'ISRC', 'UPC', 'Artist Name', 'Album Name', 'Track Name', 'Type', 'Service Type', 'Number of Transaction', 'Net Royalty Total per Transaction', 'Net Royalty Total', 'Territory', 'Currency', 'Payable', '\w{3} Payable'
            ]
		],
    },   
    # Merlin, v39 (FB14077)
	{ service => Client::Service::DSP_MERLIN,
        version => 39,
        match_on_any_row => 1,
        lines =>
        [
			[
'Report Date', 'Member ID', 'Label ID', 'Artist', 'Release Title', 'Release ID', 'Track Title', 'ISRC ID', 'Type', 'Quantity', 'Customer Price', 'Territory Code', 'Price Foreign', 'DSP Currency', 'Total in USD'
            ]
		],
    },   
    # Merlin, v40 (FB14078)
	{ service => Client::Service::DSP_MERLIN,
        version => 40,
        match_on_any_row => 1,
        lines =>
        [
			[
'Accounted Period', 'Date of Report', 'Total Royalties payable', 'Currency', 'Licensee', 'Aggregator', 'Portal Retailer', 'Country of Transaction', 'ISRC', 'EAN UPC', 'Artist Name', 'Track Name', 'Album Name', 'Label', 'Number of Transaction', 'Net Royalty per Transaction', 'Net Royalty Total', 'Net Royalty per Transaction in Euro', 'Net Royalty Total in Euro', 'Transaction Type', 'Play Type', 'User Type'
            ]
		],
    },   
    # Merlin, v41 (FB18356)
	{ service => Client::Service::DSP_MERLIN,
        version => 41,
        lines =>
        [
			[
'Digital Service Code', 'Report Date', 'Transaction Date', 'Party_id', 'Member_id', 'label_id', 'Artist', 'release_title', 'release_id', 'Track_title', 'isrc_id', 'Type', 'User Type', 'quantity', 'customer_price', 'Net Royalty Total', 'territory_code', 'price_foreign', 'DSP_currency', 'Total in USD', '^$'
            ]
		],
    },       
    # Merlin/UMA, v43 (FB19896)
	{ service => Client::Service::DSP_MERLIN,
        version => 43,
        lines =>
        [
			[
'Digital Service Code', 'start date', 'end date', 'Member_id', 'Label_name', 'Artist', 'release_title', 'release_id', 'Track_title', 'ISRC', 'Type', 'User Type', 'quantity', 'customer_price', 'minimum fee', 'Net Royalty Total', 'territory_code', 'price_foreign', 'DSP_currency', 'Total in \w{3}', '^$'
            ]
		],
    },       
    # Zed (FB17700)
    { service => Client::Service::DSP_ZED,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'VendorName', 'VendorId', 'Price', 'Product ID', 'Product', 'ProductType', 'TotalSent', 'TotalRevenue', 'NetRevenue', 'Payment', 'Distributor', 'Song Code', 'Author', 'Writer', 'Active', 'Service \/Percent Ownership', 'Platform \/Status', 'ReportingOn'
            ],
        ],
    },
    # V2 Benelux (FB17279)
    { service => Client::Service::DSP_V2_BENELUX,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Net Turnover', 'Artist', 'Title', 'Supplier', 'Text45', 'Article nr', 'Format', 'Net Sales'
            ],
        ],
    },
    # Fool's Gold (FB13323)
    { service => Client::Service::DSP_FAT_BEATS,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'VendorID', 'ItemID', 'Item Description', 'UPC', 'City', 'State', 'Zip', 'Country', 'Invoice#', 'Inv Date', 'Unit Price', 'Qty', 'Amount'
            ],
        ],
    },
    # Fool's Gold (FB13336)
    { service => Client::Service::DSP_FOOLS_GOLD,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Product Type', 'Product title', 'Price per Unit', 'Catalog #', 'Country of Sale', 'Quantity Sold', 'Gross Income'
            ],
        ],
    },
    # Catapult (FB9451)
    { service => Client::Service::DSP_CATAPULT,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Store', 'Sales Period', 'UPC\/ISRC', 'Artist', 'Title', '(Streams|Units)', 'Country', 'Unit Price', 'Extended Price'
            ],
        ],
    },
    # DDS (FB7486)
    { service => Client::Service::DSP_DDS,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Start Date', 'End Date', 'UPC #', 'ISRC code', 'Vendor Identifier', 'Quantity', 'Partner Share', 'Extended Partner Share', 'Partner Share Currency', 'Sales or Return', 'Apple Identifier', 'Artist\/Show\/Developer', 'Title', 'Label', 'Product Type Identifier', 'Country Of Sale', 'Pre-order Flag', 'Promo Code', 'Customer Price', 'Customer Currency'
            ],
        ],
    },
    # DDS, v2 (FB11396)
    { service => Client::Service::DSP_DDS,
        version => 2,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
                'Start Date', 'End Date', 'DSP', 'Territory', 'Label', 'Artist', 'Album', 'Title', 'UPC #', 'ISRC #', 'Quantity', 'Unit Revenue', 'Gross Revenue', 'Customer Currency', 'Sales or Return', 'Promo Code', 'Trans Type', '^$'
            ],
        ],
    },
    # Nimbit Physical (FB4708)
    { service => Client::Service::DSP_NIMBIT,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Order', 'Sales Channel', 'Event', 'Notes', 'Date', 'Statement Date', 'Type', 'Product', 'Units', 'Price', 'Total', 'Commission', 'Net', 'Customer Email', 'First Name', 'Last Name', 'Address', 'City', 'State', 'Zip', 'Country', 'Shipping First Name', 'Shipping Last Name', 'Shipping Address', 'Shipping City', 'Shipping State', 'Shipping Zip', 'Shipping Country', 'Upc', 'Isrc',
            ],
            [
undef  , undef          , undef  , undef  , undef ,          undef  , 'CD'
            ]
        ],
    },
    # Nimbit Physical (FB4710)
    { service => Client::Service::DSP_NIMBIT,
        version => 2,
        sheet => 'any',
        match_on_any_row => 1,
        lines => [
            [
'Order', 'Sales Channel', 'Event', 'Notes', 'Date', 'Statement Date', 'Type', 'Product', 'Units', 'Price', 'Total', 'Commission', 'Net', 'Customer Email', 'First Name', 'Last Name', 'Address', 'City', 'State', 'Zip', 'Country', 'Shipping First Name', 'Shipping Last Name', 'Shipping Address', 'Shipping City', 'Shipping State', 'Shipping Zip', 'Shipping Country', 'Upc', 'Isrc',
            ],
            [
undef  , undef          , undef  , undef  , undef ,          undef  , 'MP3'
            ]
        ],
    },
    # Select Digital/Idol (FB9470)
    { service => Client::Service::DSP_SELECT_DIGITAL_IDOL,
        version => 1,
        sheet => 'any',
        lines => [
            [
'Label', 'Period', 'Country', 'Company', 'Digital Store', 'Audio Format', 'Artist', 'Album', 'UPC \/ ALD', 'Track', 'ISRC', 'Transaction', 'Product', 'Device', 'Retail price', 'Quantity', 'Royalty per unit', 'Royalty total', 'Mechanicals US \(SACEM\)', 'Label Share'

            ],
        ],
    },
    # Select Digital/Idol (FB14882)
    { service => Client::Service::DSP_SELECT_DIGITAL_IDOL,
        version => 2,
        sheet => 'any',
        lines => [
            [
'Label', 'Period', 'Country', 'Company', 'Digital Store', 'Audio Format', 'Artist', 'Album', 'UPC \/ ALD', 'Track', 'ISRC', 'Transaction', 'Product', 'Device', 'Retail price', 'Quantity', 'Royalty per unit', 'Royalty total', 'Label Share'
            ],
        ],
    },
	# iMusica
	{
		service => Client::Service::DSP_IMUSICA,
        version => 1,
        lines =>
        [
			[
               'Store', undef, 'Format', undef, 'Period', undef, undef, undef,
			   'Track', undef, 'Artists', 'ISRC', 'Album', 'UPC', 'Label', undef,
			   'Price', 'Qty', undef, 'Exchange Rate', undef, 'Unit Value', undef,
			   'Final Value'
            ]
        ],
    },

	# Malco Records
	{
		service => Client::Service::DSP_MALACO_RECORDS,
        version => 1,
        lines =>
        [
			[
               'Icon', 'Reference', 'Line', 'Product Code', 'Title', 'Artist',
			   'Barcode', 'Parent Product', 'Territory', 'Distribution Channel',
			   'Price Category', 'Configuration', 'Currency', 'Exchange Rate',
			   'Withholding Tax', 'Artist SixMonthly', 'Copyright Quarterly',
			   'Copyright Semi-annually', 'RETAIL', 'WHOLESALE', 'Receipts',
			   'Net Receipts', 'Mech Deduct Amount', 'Sale Date', 'Net Units',
			   'Gross Units', 'Source',
            ]
        ],
    },
    
	# Believe Digital
	{
		service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 1,
        lines =>
        [
			[
               'Month', 'Music stores', 'COUNTRY', 'Label', 'Artist', 'TITLE',
               'UPC', 'producer reference', 'TYPE', 'pLine', 'QUANTITY', 'Price', 
               'DRM', 'TOTAL',
            ]
        ],
    },    
    
	# Believe Digital
	{
		service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 2,
        lines =>
        [
			[
               'Reporting month', 'Mois doperation', 'Store', 'Country', 'Account', 'Label', 'Artist', 'Album', 'Track', 'UPC', 'Believe UPC', 'ISRC', 'Believe ISRC', 'Catalogue', 'Neighboring Rights', 'Type', 'Quantity', 'Price', 'Mechanicals \(US...\)', 'Total', undef, 'Royalty rate', 'Account total'
            ]
        ],
    },
    
	# Believe Digital
	{
		service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 3,
        lines =>
        [
			[
               'Reporting month', 'Transaction Month', 'Store', 'Country', 'Account', 'Label', 'Artist', 'Album', 'Track', 'UPC', 'ISRC', 'Catalogue', 'Type', 'Quantity', 'Price', 'Mechanicals \(US...\)', 'Total', 'Royalty rate', 'Account total'
            ]
        ],
    },    
    
	# Believe Digital
	{
		service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 4,
        lines =>
        [
			      [
               'Reporting month', 'Mois doperation', 'Store', 'Country', 'Account', 'Label', 'Artist', 'Album', 'Track', 'UPC', 'P Line', 'ISRC', 'Catalogue', 'Neighboring Rights', 'Type', 'Quantity', 'Price', 'Mechanicals \(US...\)', 'Total', undef, 'Royalty rate', 'Account total'
            ]
        ],
    },         
    
	# Believe Digital
	{
		service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 5,
        lines =>
        [
			      [
               'Reporting month', 'Operation month', 'Store', 'Country', 'Account', 'Label', 'Artist', 'Album', 'Track', 'UPC', 'P Line', 'ISRC', 'Catalogue', 'Type', 'Quantity', 'Price', 'Mechanicals \(US...\)', 'Total', 'Royalty rate', 'Account total'
            ]
        ],
    },       
	# Believe Digital (FB17229)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 6,
        lines =>
        [
		[
'Reporting month', 'Months of Operation', 'Store', 'Country', 'Account', 'Label', 'Artist', 'Album', 'Track', 'UPC', 'ISRC', 'Catalogue #', 'Assets', 'Type', 'Quantity', 'Currency', 'Price', 'Mechanicals \(US...\)', 'Total', undef, 'Royalty rate', 'Account total'
		]
        ],
        },       
	# Believe Digital (FB17660)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 7,
        lines =>
        [
            [
'Account', 'Artist', 'Label', 'Album', 'Album P Line', 'Assets', 'Track', 'ISRC', 'Believe ISRC', 'Song P Line', 'Currency', 'UPC', 'Believe UPC', 'Catalogue #', 'Country', 'Months of Operation', 'Reporting month', 'Quantity', 'Price', 'Mechanicals \(US...\)', 'Total', 'Account total', 'Store', 'Type', 'Royalty rate', 'Offer Type'
            ]
        ],
    },
	# Believe Digital (FB4331)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 8,
        lines =>
        [
		[
'Reporting month', 'Months of Operation', 'Store', 'Country', 'Account', 'Label', 'Artist', 'Album', 'Track', 'UPC', 'ISRC', 'Catalogue #', '(Product|Assets)', 'Type', 'Offer Type', 'Quantity', 'Currency', 'Price', 'Mechanicals \(US...\)', 'Total', undef, 'Royalty rate', 'Account total'
		]
        ],
        },
	# Believe Digital (FB9532)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 9,
        lines =>
        [
            [
'Label', 'Account', 'Artist', 'UPC', 'Months of Operation', 'Type', 'Album', 'Album P Line', 'Product', 'Track', 'ISRC', 'Believe ISRC', 'Song P Line', 'Currency', 'Believe UPC', 'Catalogue #', 'Track catalogue #', 'Country', 'Reporting month', 'Quantity', 'Price', 'Mechanicals \(US...\)', 'Total', 'Account total', 'Royalty rate', 'Offer Type', undef, 'Store'
            ]
        ],
    },
	# Futureclassic - Believe Digital (FB11590)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 10,
        lines =>
        [
            [
'Artist', 'Account total', 'Album', 'Track', 'Label', 'UPC', 'Currency', 'Quantity', 'ISRC', 'Country', 'Reporting month', 'Price', 'Total', 'Type', 'Royalty rate', 'Believe ISRC'
            ]
        ],
    },
	# Futureclassic - Believe Digital (FB19498)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 11,
        lines =>
        [
            [
'Reporting month', 'Sales Month', 'Platform', 'Country', 'Label Name', 'Artist Name', 'Release title', 'Track title', 'UPC', 'ISRC', 'Release Catalog nb', 'Release type', 'Sales Type', 'Streaming Subscription Type', 'Quantity', 'Client Payment Currency', 'Unit Price', 'Mechanical Fee', 'Gross Revenue', 'Blank column', 'Client share rate', 'Net Revenue'
            ]
        ],
    },
	# Believe Digital (FB20315)
	{
	service => Client::Service::DSP_BELIEVE_DIGITAL,
        version => 12,
        lines =>
        [
            [
'Reporting month', 'Sales Month', 'Platform', 'Country', 'Label Name', 'Artist Name', 'Release title', 'Track title', 'UPC', 'ISRC', 'Release Catalog nb', 'Release type', 'Sales Type', 'Quantity', 'Client Payment Currency', 'Unit Price', 'Mechanical Fee', 'Gross Revenue', 'Client share rate', 'Net Revenue'
            ]
        ],
    },
	# memphis - pias Digital (FB17691)
    {
        service => Client::Service::DSP_PIAS_DIGITAL,
        version => 3,
        match_on_any_row => 1,
        lines =>
        [
            [
'Artist', 'Product', 'ISRC', 'Barcode', 'Territory', 'Format Type', 'Price Category', 'DMS', 'Download', 'Gross', 'Mechanical', 'Net', 'Fee %', 'Total Fee', 'Total', 'Artist'
            ],
            [
undef, undef, undef, undef, undef, undef, undef, undef, 'Qty', 'Revenue', 'Deduction', 'Revenue', undef, undef, 'Payable', 'Total'
            ]
        ],
    },
	# PIAS physical (FB10711) - same header as PIAS Digital version 4
	{
	service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 5,
        match_on_any_row => 1,
        sheet => 'any',
        file_name => 'physical',
        lines =>
        [
            [
undef, undef, undef, undef, undef, undef, 'FORMAT', 'PRICE', undef, 'PRODUCT', 'ROYALTY', 'DED.', 'ROYALTY', undef, 'UNIT', undef, 'AMOUNT'
            ],
            [
'ARTIST', 'PRODUCT', 'ISRC', 'BARCODE', 'TERRITORY', 'DMS', 'TYPE', 'CAT.', 'SALES REF', 'SHARE', 'BASE PRICE', 'RATE', 'RATE', 'SALES %', 'RATE', 'UNITS', 'DUE'
            ]
        ],
    },
	# ato - pias Digital (FB17670)
	{
	service => Client::Service::DSP_PIAS_DIGITAL,
        version => 4,
        match_on_any_row => 1,
        sheet => 'any',
        lines =>
        [
            [
undef, undef, undef, undef, undef, undef, 'FORMAT', 'PRICE', undef, 'PRODUCT', 'ROYALTY', 'DED.', 'ROYALTY', undef, 'UNIT', undef, 'AMOUNT'
            ],
            [
'ARTIST', 'PRODUCT', 'ISRC', 'BARCODE', 'TERRITORY', 'DMS', 'TYPE', 'CAT.', 'SALES REF', 'SHARE', 'BASE PRICE', 'RATE', 'RATE', 'SALES %', 'RATE', 'UNITS', 'DUE'
            ]
        ],
    },
	# Ato - PIAS Digital (FB11776)
	{
	service => Client::Service::DSP_PIAS_DIGITAL,
        version => 6,
        match_on_any_row => 1,
        file_name => 'digital',
        sheet => 'any',
        lines =>
        [
            [
undef, undef, undef, undef, undef, undef, undef, 'FORMAT', 'PRICE', undef, 'PRODUCT', 'ROYALTY', 'DED.', 'ROYALTY', undef, 'UNIT', undef, 'AMOUNT'
            ],
            [
undef, 'ARTIST', 'PRODUCT', 'ISRC', 'BARCODE', 'TERRITORY', 'DMS', 'TYPE', 'CAT.', 'SALES REF', 'SHARE', 'BASE PRICE', 'RATE', 'RATE', 'SALES %', 'RATE', 'UNITS', 'DUE'
            ]
        ],
    },
	# Ato - PIAS Physical (FB11777)
	{
	service => Client::Service::DSP_PIAS_PHYSICAL,
        version => 6,
        match_on_any_row => 1,
        file_name => 'physical',
        sheet => 'any',
        lines =>
        [
            [
undef, undef, undef, undef, undef, undef, undef, 'FORMAT', 'PRICE', undef, 'PRODUCT', 'ROYALTY', 'DED.', 'ROYALTY', undef, 'UNIT', undef, 'AMOUNT'
            ],
            [
undef, 'ARTIST', 'PRODUCT', 'ISRC', 'BARCODE', 'TERRITORY', 'DMS', 'TYPE', 'CAT.', 'SALES REF', 'SHARE', 'BASE PRICE', 'RATE', 'RATE', 'SALES %', 'RATE', 'UNITS', 'DUE'
            ]
        ],
    },
	# Alliance - (FB10805)
	{
	service => Client::Service::DSP_ALLIANCE,
        version => 1,
        match_on_any_row => 1,
        sheet => 'any',
        lines =>
        [
            [
'Vendor#', 'Vendor Name', 'Invoice #', 'Inv Date', 'Due Date', 'Inv Amount', 'Paid Amount', 'Check#', 'Type', 'Product #', 'UPC', 'Artist', 'Title', 'Qty', 'Whsle Price', 'Whsle Ext', 'Distr Fee', 'Unit Cost', 'Extended', 'Week End', 'Cust #', 'Cntry', 'Customer Name', 'Class', 'A/R Date', 'Invoice#'
            ],
        ],
    },
	# Alliance - (FB11535)
	{
	service => Client::Service::DSP_ALLIANCE,
        version => 2,
        match_on_any_row => 1,
        sheet => 'any',
        lines =>
        [
            [
'Vendor#', 'Vendor Name', 'Invoice #', 'Inv Date', 'Due Date', 'Inv Amount', 'Paid Amount', 'Check#', 'Type', 'Product #', 'UPC', 'Artist', 'Title', 'Qty', 'Whsle Price', 'Whsle Ext', 'Unit Cost', 'Extended', 'Distr Fee', 'Week End', 'Cust #', 'Cntry', 'Customer Name', 'Class', 'A/R Date', 'Invoice#'
            ],
        ],
    },
	# Alliance - (FB14220)
	{
	service => Client::Service::DSP_ALLIANCE,
        version => 3,
        match_on_any_row => 1,
        sheet => 'any',
        lines =>
        [
            [
'Vendor#', 'Vendor Name', 'Invoice #', 'Inv Date', 'Due Date', 'Inv Amount', 'Paid Amount', 'Check#', 'Div', 'Reference', 'Ref P/O', 'Batch#', 'Type', 'Product #', 'UPC', 'Description', 'Qty', 'Whsle Price', 'Whsle Ext', 'Unit Cost', 'Extended', 'Refurb Fee', 'Week End', 'Cust #', 'Customer Name', 'Class', 'A/R Date', 'Invoice#', 'Ctry Cd'
            ],
        ],
    },
	# Cosmo (FB17655)
    {
        service => Client::Service::DSP_COSMOS,
        version => 1,
        lines =>
        [
            [
'comsale_country', 'comsale_cat_no_report', 'comsale_label', 'comsale_artist', 'comsale_title', 'comsale_format', 'comsale_eancode', 'comsale_currency', 'comsale_store_exchange_rate', 'comsale_ppd', 'comsale_return_value', 'comsale_nslr', 'comsale_net_value', 'comsale_discount', 'comsale_gross_qty', 'comsale_free_qty', 'comsale_return_qty', 'comsale_delivered_qty', 'comsale_promo_qty', 'comsale_groval_', 'comsale_iciceqty', 'comsale_iciceamt', 'comsale_icothqty', 'comsale_icothamt', 'comsale_clubqty', 'comsale_clubamt', 'comsale_store_distr_percent', 'comsale_store_distr_fee', 'comsale_return_distribution_fee_', 'comsale_return_handling_fee_sek_', 'comsale_store_ncb_percent', 'comsale_store_ncb_fee', 'sale_promo_fee_sek_', 'comsale_priceadj_amt_in', 'comsale_priceadj_amt_out', 'comsale_priceadj_qty_in', 'comsale_priceadj_qty_out', 'sale_other_sales_qty', 'sale_other_sales_amt', 'sale_other_promo_qty', 'comsale_note_external'
            ]
        ],
    },
	# vprecords - rhapsody (FB17680)
	{
	service => Client::Service::DSP_REAL,
        version => 6,
        match_on_any_row => 1,
        lines =>
        [
            [
'Label Name', 'Label Code', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Unit Price', 'Sale Amount', 'Sale Type', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt'
            ],
        ],
    },
	# skint/virtual - rhapsody (FB5)
	{
	service => Client::Service::DSP_REAL,
        version => 7,
        match_on_any_row => 1,
        lines =>
        [
            [
'Label Name', 'Label Code', 'Country', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt', 'Demand Play', 'Free Trial Stream', 'Price'
            ],
        ],
    },
	# vp - rhapsody (FB1728)
	{
	service => Client::Service::DSP_REAL,
        version => 8,
        lines =>
        [
            [
                'Label Name', 'Label Code', 'Country', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs',
                'Album Sequence', 'ISRC', '# Streams|Sale Count', 'Unit Price', 'Sale Amount', 'Sale Type', 'Album ID',
                'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt'
            ],
        ],
    },
	# rhapsody (FB2942, FB6764, FB6941)
	{
	service => Client::Service::DSP_REAL,
        version => 9,
        lines =>
        [
            [ 'Label Name', 'Label Code', 'Country', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Unit(e)? Price', '(Total )?Price', 'Sale Ty(o|p)e', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt'
            ],
        ],
    },
        # rhapsody (FB6939)
        {
        service => Client::Service::DSP_REAL,
        version => 10,
        lines =>
        [
            [
               'Label Name', 'Label Code', 'Country', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'Unit Price', 'Total Price', 'Sale Type', 'ISRC', '# Streams', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt'
            ],
        ],
    },
        # VP Records / Real Digital (FB18104)
        {
        service => Client::Service::DSP_REAL,
        version => 11,
        lines =>
        [
            [
		'Label Name', 'Label Code', 'Country', 'Artist Name', 'Album Name', 'Track Name', 'UPC', '# Discs', 'Album Sequence', 'ISRC', '# Streams', 'Unit Price', 'Total Price', 'Sales Type', 'Album ID', 'Track ID', 'Catalog ID', 'Report Start Dt', 'Report End Dt'
            ],
        ],
    },
        # X5 (FB6942)
        {
        service => Client::Service::DSP_X5_MUSIC_GROUP,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines =>
        [
            [
'Artist', 'Album', 'UPC', 'Title', 'ISRC', 'Sales Channel', 'Country', 'NCB', 'Original Currency', 'Revenue \(Origin_Currency\)', 'Catalog Currency', 'Revenue \(Cat_Currency\)', 'Revenue Excl. NCB \(Cat_Currency\)', 'Label Revenue', 'Royalty', 'Royalty Level', 'Quant', 'Delivery Way', 'Sales Start', 'Sales End', 'Insertion Date'
            ],
        ],
    },
        # Amazon Prime (FB7129)
        {
        service => Client::Service::DSP_AMAZON_PRIME,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines =>
        [
	    ['Amazon (\w{2}) Prime Music'],
	    [undef],
	    [undef],
            [
'ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'PLAYS', 'DOWNLOADS', 'STREAMS', 'ARTIST_NAME', 'ALBUM_NAME', 'TRACK_NAME', 'LABEL_NAME', '^$'
            ],
        ],
    },
        # Amazon Prime (FB7186) - alternate version 1, only one undef line between top line and header
        {
        service => Client::Service::DSP_AMAZON_PRIME,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines =>
        [
	    ['Amazon (\w{2}) Prime Music'],
	    [undef],
            [
'ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'PLAYS', 'DOWNLOADS', 'STREAMS', 'ARTIST_NAME', 'ALBUM_NAME', 'TRACK_NAME', 'LABEL_NAME','^$'
            ],
        ],
    },
        # Amazon Prime (FB20517)
        {
        service => Client::Service::DSP_AMAZON_PRIME,
        version => 2,
        sheet => 'any',
        match_on_any_row => 1,
        lines =>
        [
	    ['Amazon (\w{2}) Prime Music'],
	    [undef],
            [
'ASIN', 'ALBUM_ID', 'RELATED_UPC', 'Track_ID', 'ISRC', 'PLAYS', 'DOWNLOADS', 'STREAMS', 'ARTIST_NAME', 'ALBUM_NAME', 'TRACK_NAME', 'LABEL_NAME','TERRITORY_CODE','DEALER_PRICE','^$'
            ],
        ],
    },
	# GrooveShark
	{
        service => Client::Service::DSP_GROOVESHARK,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
			[
               'Label', 'Artist', 'Album', 'Track Title', 'UPC', 'ISRC', 'Plays', 'Ad Revenue Share', 'Sub Revenue Share', 'Total Revenue Share', 'Total'
            ]
        ],
    },             
    
	# GrooveShark
	{
        service => Client::Service::DSP_GROOVESHARK,
        version => 2,
        match_on_any_row => 1,
        lines =>
        [
			[
               'Label', 'Artist', 'Album', 'Track', 'UPC', 'ISRC', 'Plays', 'Ad Revenue Share', 'Total'
            ]
        ],
    },       
    # GrooveShark - ATO/BFM
    {
        service => Client::Service::DSP_GROOVESHARK,
        version => 3,
        match_on_any_row => 1,
        lines =>
        [
            [
                'licensee', 'distributor', 'label', 'artist', 'album', 'track', 'upc', 'isrc', 'country', 'total_plays', 'net_royalty', 'currency'
            ]
        ],
    },       
	# Rdio
	{
        service => Client::Service::DSP_RDIO,
        version => 2,
        lines =>
        [
			[
               '2009\/dsr-flat\/10', 'PA-DPIDA-2010062101-4', 'PA-DPIDA-\S', '\d{4}-\d{2}-\d{2}', '\d{4}-\d{2}-\d{2}', '\d{4}-\d{2}-\d{2}', '\d+', '\d+', '\w{3}', '\d+', '\d+', '\d+', '\d+', '\d+', '\w*Model' 
            ]
        ],
    },            

	# Rdio (FB17368)
	{
        service => Client::Service::DSP_RDIO,
        version => 3,
        lines =>
        [
			[
'DSP', 'SalesDate', 'UPC', 'ISRC', 'ReleaseTitle', 'ResourceTitle', 'Contributors', 'NumberOfConsumerSalesGross', 'NumberOfUnitAdjustments', 'CurrencyCode', 'PriceConsumerPaidExcSalesTax', 'RoyaltyRate', 'PriceRangeType', 'UseType', 'UserInterfaceType', 'DistributionChannelType', 'ReleaseType', 'TerritoryCode'
            ]
        ],
    },            
	# Rdio (FB2753) - similar to v3, but no header
	{
        service => Client::Service::DSP_RDIO,
        version => 4,
        lines =>
        [
            [
#'DSP',                 'SalesDate',     'UPC',       'ISRC', 'ReleaseTitle', 'ResourceTitle', 'Contributors', 'NumberOfConsumerSalesGross',
'\w{2}-DPIDA-\d{10}-\d', '\d{8}',     '\w{12,13}', '\w{12,13}', '^.*$',          '^.*$',          '^.*$',                '\d+',
#'NumberOfUnitAdjustments', 'CurrencyCode', 'PriceConsumerPaidExcSalesTax', 'RoyaltyRate',            'PriceRangeType', 'UseType',
'\d+',                       '\w{3}',          '^\d{1,3}\.\d{1,2}$',         '^\d{1,3}\.?\d{0,7}$',     '^.*$',           '^(ConditionalDownload|OnDemandStream|NonInteractiveStream)$',
#'UserInterfaceType',                    'DistributionChannelType',        'ReleaseType',   'TerritoryCode'
'^(PortableDevice|PersonalComputer)$',  '^(InternetAndMobile|Internet)$', '^TrackRelease$', '\w{2}'
            ]
        ],
    },


	# TopSpin (Digital)
	{
		service => Client::Service::DSP_TOPSPIN_MEDIA,
        version => 1,
        file_name => 'Digital',
        lines =>
        [
			[
               'Order Number', 'Line Item Number', 'Transaction Reference Number', 'Artist ID', 'Artist Name', 'Order Date', 'Ship Date', 'Offer ID', 'Offer Currency', 'Offer List Price', 'Offer Ticket Face Values', 'Offer Wholesale', 'Offer Fees', 'Offer Sales Tax', 'Exchange Rate', 'Quantity', 'Sales', 'Tickets Paid to 3rd Party', 'Wholesale Paid to 3rd Party', 'Credit Card Fees', 'Topspin Fee', 'Margin', 'Sales Tax Collected', 'Shipping Collected', 'Ticket Fees Collected', 'Product ID', 'Product Name', 'Product Type', 'Product Catalog ID', 'Product Sku ID', 'Product Factory Sku', 'Product UPC', 'Product ISRC', 'Street Date Product ID', 'Street Date Product Name', 'Street Date Product Type', 'Street Date Product Catalog ID', 'Street Date Product Sku ID', 'Street Date Product Factory Sku', 'Street Date Product UPC', 'Street Date Product ISRC', 'Instant Gratification Product ID', 'Instant Gratification Product Name', 'Instant Gratification Product Type', 'Instant Gratification Product Catalog ID', 'Instant Gratification Product Sku ID', 'Instant Gratification Product Factory Sku', 'Instant Gratification Product UPC', 'Instant Gratification Product ISRC', 'Fan ID', 'Fan Email', 'Fan First Name', 'Fan Last Name', 'Billing Country',
            ]
        ],
    },    
	# TopSpin (Physical)
	{
		service => Client::Service::DSP_TOPSPIN_MEDIA,
        version => 2,
        file_name => 'Phys',
        lines =>
        [
			[
               'Order Number', 'Line Item Number', 'Transaction Reference Number', 'Artist ID', 'Artist Name', 'Order Date', 'Ship Date', 'Offer ID', 'Offer Currency', 'Offer List Price', 'Offer Ticket Face Values', 'Offer Wholesale', 'Offer Fees', 'Offer Sales Tax', 'Exchange Rate', 'Quantity', 'Sales', 'Tickets Paid to 3rd Party', 'Wholesale Paid to 3rd Party', 'Credit Card Fees', 'Topspin Fee', 'Margin', 'Sales Tax Collected', 'Shipping Collected', 'Ticket Fees Collected', 'Product ID', 'Product Name', 'Product Type', 'Product Catalog ID', 'Product Sku ID', 'Product Factory Sku', 'Product UPC', 'Product ISRC', 'Street Date Product ID', 'Street Date Product Name', 'Street Date Product Type', 'Street Date Product Catalog ID', 'Street Date Product Sku ID', 'Street Date Product Factory Sku', 'Street Date Product UPC', 'Street Date Product ISRC', 'Instant Gratification Product ID', 'Instant Gratification Product Name', 'Instant Gratification Product Type', 'Instant Gratification Product Catalog ID', 'Instant Gratification Product Sku ID', 'Instant Gratification Product Factory Sku', 'Instant Gratification Product UPC', 'Instant Gratification Product ISRC', 'Fan ID', 'Fan Email', 'Fan First Name', 'Fan Last Name', 'Billing Country',
            ]
        ],
    },      
    # Cricket / Muve (Zojak) FB16784
    { service => Client::Service::DSP_CRICKET_MUVE,
        version => 1,
        sheet => 0,
        lines => [
            ['upc', 'label id', 'isrc', 'date of transaction', 'Currency Type', 'Exchange Rate', 'quantity', 'unit Price', 'net Royalty', 'gross Royalty', 'product Type', 'sale Type', 'record Label', 'album Name', 'track Name', 'artist', 'carrier', 'country', 'Delimiter']
        ],
    },
    # Cricket / Muve (Zojak) FB16958
    { service => Client::Service::DSP_CRICKET_MUVE,
        version => 1,
        sheet => 0,
        lines => [
            ['upc', 'label id', 'isrc', 'date of transaction', 'Currency Type', 'Exchange Rate', 'quantity', 'unit Price', 'net Royalty', 'gross Royalty', 'product Type', 'sale Type', 'record Label', 'album Name', 'track Name', 'artist', 'carrier', 'country', undef ]
        ],
    },
    # Cricket / Muve (Virtual) FB17580
    { service => Client::Service::DSP_CRICKET_MUVE,
        version => 2,
        sheet => 0,
        lines => [
            [
'Distributor', 'Marketer', 'Label', 'Country', 'ISRC', 'UPC', 'ArtistName', 'TrackName', 'AlbumName', 'Units', 'UnitPrice', 'NetRoyalty', 'CurrencyCode', 'TransactionType', 'PlayType', 'UserType', 'ProductType', 'SalesType'
	    ]
        ],
    },
    # Hard Wax - FB50
    { service => Client::Service::DSP_HARDWAX,
        version => 1,
        sheet => 0,
        match_on_any_row => 1,
        lines => [
            [
'Supplier', 'Licensee', 'Date_of_report', 'Day_of_download', 'Time_of_download', 'Portal_Retailer', 'Country_of_sale', 'Product_Type', 'Format', 'Number_of_sales', 'EAN_UPC', 'ISRC', 'Artist', 'Title', 'Label', 'End_consumer_price_gross', 'VAT', 'Mechanical_paid_by', 'Mechanical_deduction', 'Currency_ECP', 'Exchange_rate_ECP', 'Basis_for_Royalty_Split', 'Licensor_Share', 'PPD_net_per_order', 'Currency_PPD', 'Exchange_rate_PPD', 'PPD_sum_EUR'
	    ]
        ],
    },
    # Bloom.fm - FB928
    { service => Client::Service::DSP_BLOOM_FM,
        version => 1,
        sheet => 0,
        lines => [
            [
				'SupplierKeyName', 'LabelName', 'ArtistName', 'AlbumName', 'TrackName', 'Isrc', 
				'Upc', 'StreamType', 'Qty', 'Royalty', 'CountryCode'
	    	]
        ],
    },    
    # Cleopatra - FB777
    { service => Client::Service::DSP_CLEOPATRA,
        version => 1,
        sheet => 0,
        lines => [
            [
				'Calc ID', 'Payee Site', 'Payee Code', 'Payee Name', 'Royaltor Site', 'Royaltor Code', 'Royaltor Name', 'Payee Contract Site', 'Payee Contract Code', 'Payee Contract Name', 'Contract Site', 'Contract Code', 'Subcontract Code', 'Contract Name', 'Company Code', 'Payment Frequency', 'Earnings', 'Recouped Earnings', 'Unrecouped Earnings', 'Units', 'Territory', 'Distribution Channel', 'Price Category', 'Configuration', 'Sale Date', 'Product Site', 'Product Code', 'Product Title', 'Product Artist', 'Product Barcode', 'Label Code', 'Product Grid Code', 'Sales Batch', 'Price', 'Pack Rate', 'Model Sales Recoup Perc', 'Model Sales Non Recoup Perc', 'Model Sales Perc', 'Model Unit Rate', 'Model Receipts Rate Perc', 'Gross Receipts', 'Net Receipts', 'Accounting System ID', 'Reserves Release', 'Run Type'
	    	]
        ],
    },        
    # Omnifone - FB812
    { service => Client::Service::DSP_OMNIFONE,
        version => 1,
        sheet => 0,
        lines => [
            [
				'Account Name', 'Application', 'Territory', 'Operator', 'Device', 'Tariff', 'Sales period begin', 'Sales period end', 'ISRC', 'Track Artist', 'Track Title', 'Source UPC', 'Album Artist', 'Album Title', 'Customer Period', 'Number of Transactions'
	    	]
        ],
    },        
    # YogiTunes - FB812
    { service => Client::Service::DSP_YOGITUNES,
        version => 1,
        sheet => 0,
        lines => [
            [ 
				'payment_id', 'payment_date', 'transaction_from_date', 'transaction_to_date', 'distributor', 'purchase_id', 'purchase_type', 'purchase_date', 'title', 'artist', 'label', 'upc', 'isrc', 'vendor_id', 'territory', 'price', 'payment', 'currency', 'memo'
	    	]
        ],
    },       
    # Qobuz - FB7584
    { service => Client::Service::DSP_QOBUZ,
        version => 1,
        sheet => 'any',
        lines => [
            [
				'Period', 'Retail Identifier', 'Sales Type', 'Per Album or Per track', 'Quality \/ Offer', 'Periodicity', 'Purchasing Date', 'Product UPC', 'Catalog Number', 'Album Name', 'Album Artist', 'Track Name', 'Track Artist', 'Label', 'ISRC', 'Support Number', 'Track Number', 'Retail Price \(incl VAT\)', 'Retail Price Currency', 'PPD \(excl VAT\)', 'Discount %', 'Royalty per Unit \(excl VAT\)', 'Quantity', 'Total Amount \(excl VAT\)', 'Currency Code', 'Exchange Rate', 'Total Amount in EUR \(excl VAT\)', 'Country'
	    	]
        ],
    },    
    # Qobuz - FB7585
    { service => Client::Service::DSP_QOBUZ,
        version => 2,
        sheet => 'any',
        lines => [
            [
				'Period', 'Retail Identifier', 'Sales Type', 'Per Album or Per track', 'Quality', 'Purchasing Date', 'Product Code Barre \(UPC\)', 'Catalog number', 'Album Name', 'Album Artist', 'Track Name', 'Track Artist', 'Label', 'ISRC', 'Support Number', 'Track Number', 'Retail Price \(incl VAT\)', 'Retail Price Currency', 'PPD \(excl VAT\)', 'Discount %', 'Royalty per Unit \(excl VAT\)', 'Quantity', 'Total Amount \(excl VAT\)', 'Total Amount Currency', 'Country'
	    	]
        ],
    }, 
    # Vevo
    { service => Client::Service::DSP_VEVO,
        version => 1,
        lines => [
            [
				'Source', 'Isrc', 'Title', 'Artist', 'Label', 'Country Code', 'All Streams', 'Per Stream Rate', 'Total Revenue from Market Share Streams', '^$'
	    	]
        ],
    },                       
	# EMI Music Subscriptions - Vevo (VEB - Brand Sponsorship)
	{
		service => Client::Service::DSP_VEVO,
        version => 101,
        lines =>
        [
			[
                'H',
                '^\d{6}$',
                '1010015060',
                '1010015060',
                '^.$',
                '^\d{1,11}$',
                '^\w{3}$',
                '^\d{1,9}\.\d{2}$',
                '^\d{8}$',
                '^.*$',
                '^\d{3}$',
            ]
        ],
    },

	# EMI Music Subscriptions - Vevo (VEV - Main)
	{
		service => Client::Service::DSP_VEVO,
        version => 101,
        lines =>
        [
			[
                'H',
                '^\d{6}$',
                '1010015059',
                '1010015059',
                '^.$',
                '^\d{1,11}$',
                '^\w{3}$',
                '^\d{1,9}\.\d{2}$',
                '^\d{8}$',
                '^.*$',
                '^\d{3}$',
            ]
        ],
    },
    
	# EMI Music Subscriptions - Spotify
    # !!! Seems like they are missing the 'submission date' column.
    # !!! We don't have a good syntax for 'this column may or may not exist'
    # !!! Which might useful.
	{
		service => Client::Service::DSP_SPOTIFY,
        version => 101,
        lines =>
        [
			[
                'H',
                '^\d{6}$',
                '1010012679',
                '1010012679',
                '^.$',
                '^\d{1,11}$',
                '^\w{3}$',
                '^\d{1,9}\.\d{2}$',
#                '^\d{8}$',
                '^.*$',
                '^\d{3}$',
            ]
        ],
    },
	{
		service => Client::Service::DSP_YOUTUBE,
        version => 101,
        lines =>
        [
			[
                'H',
                '^\d{6}$',
                '1010008958',
                '^\d{10}$',
                '^.$',
                '^\d{1,11}$',
                '^\w{3}$',
                '^\d{1,9}\.\d{2}$',
                '^\d{8}$',
                '^.*$',
                '^\d{3}$',
            ]
        ],
    },
    # EMI Amazon
	{
		service => Client::Service::DSP_AMAZON,
        version => 101,
        lines =>
        [
			[
                '^\d{8}$',
                '^\d{1,6}$',
                '^\d{10}$',
                '^Amazon$',
                undef,
                '^\d{8}$',
                '^\d{1,6}$',
                undef,
                undef,
                '^\w{12,13}$',
                undef,
                undef,
                '^\d{1,5}$',
                '^\d{1,3}\.\d{1,2}$',
                '^\w{3}$',
                '^\d{1,3}\.\d{1,2}$',
                '^\w{3}$',
                '^\w{3}$',
                undef,
                '^\w{2}$',
            ]
        ],
    },
    # iTunes weekly, for EMI
    {
		service => Client::Service::DSP_ITUNES_WEEKLY,
        version => 1,
        lines =>
        [
			[
                '^Provider$',
                '^Provider Country$',
                '^Vendor Identifier$',
                '^UPC$', 
                '^ISRC$',
                '^Artist\s+Show$',
                '^Title$',
                '^Label Studio Network$',
                '^Product Type Identifier$',
                '^Units$',
                '^Royalty Price$',
                '^Download Date \(PST\)$',
                '^Order Id$',
                '^Postal Code$',
                '^Customer Identifier$',
                '^Report Date \(Local\)$',
                '^Sale Return$',
                '^Customer Currency$',
                '^Country Code$',
                '^Royalty Currency$',
                '^PreOrder$',
                '^ISAN$',
                '^Customer Price$',
                '^Apple Identifier$',
                '^CMA$',
                '^Asset Content Flavor$',
                '^Vendor Offer Code$',
                '^Grid$',
                '^Promo Code$',
                '^Parent Identifier$',
            ]
        ],
    },
    # EMI Vodafone Mobile
	{
		service => Client::Service::DSP_VODAFONE,
        version => 101,
        lines =>
        [
			[
                '^1010009540$',    # This is EMI's Distributor Identifier for Vodafone
                '^VODAFONE$',
                '^\d{8}$',
                '^[A-Z]{5}\d{7,8}$',  # A DTI
                undef,
                undef,
                undef,
                '^\d{1,3}\.\d{2}$',
                '^\d{1,3}\.?\d{0,2}$',
                '^[A-Z]{3}$',
                '^[A-Z]{3}$',
                undef,
                '^[A-Z]{2}$',
            ]
        ],
    },
    # Osea Media -> MusicMe
    # JPK - Moved this down the list, because it's extremely vague.
    #
    { service => Client::Service::DSP_MUSICME,
        version => 1,
        sheet => 0,
        lines => [
            ['\d{10}',undef,'^\d+$','\w+','\w+','\w+','\w+'],
        ],
    },
    # Warner Mobile
    { service => Client::Service::DSP_WARNER_MOBILE,
        version => 1,
        lines =>
        [
            [
'DIVISION_NM', 'PROVIDER', 'REPORT_START_DATE', 'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL', 'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE', 'WMG_UNIT_PRICE', 'GROSS_AMOUNT', 'NET_AMOUNT', 'MEDIA_CD', 'FORMAT', 'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD', 'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT', 'ORACLE_COMPANY', 'ORACLE_LABEL', 'ORG_ID', 'REPERTOIRE_OWNER', 'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'PROFIT_CENTER', 'WBS_ELEMENT', 'SAP_COMPANY_CODE', 'INCOME_OWNER', 'INCOME_OWN_DOMESTIC_TERRITORY', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME', 'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD', 'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM', 'SALES_TYPE', 'TRX_TYPE', 'Revenue Category'
            ]
        ],
    },
    # Warner Mobile (FB3141)
    { service => Client::Service::DSP_WARNER_MOBILE,
        version => 1,
        lines =>
        [
            [
'DIVISION_NM', 'PROVIDER', 'REPORT_START_DATE', 'REPORT_END_DATE', 'PERIOD', 'LOAD_DATE', 'ARTIST', 'LABEL', 'TITLE', 'UNITS', 'RETAIL_PRICE', 'TOTAL_RETAIL_PRICE', 'WMG_UNIT_PRICE', 'GROSS_AMOUNT', 'NET_AMOUNT', 'MEDIA_CD', 'FORMAT', 'ROYALTY_PRODUCT_IDENTIFIER', 'ROYALTY_PRODUCT_ID_TYPE_CD', 'FIRST_REL_UPC', 'STREET_DATE', 'FR_UPC_TITLE', 'FIN_REC_PROJECT', 'ORACLE_COMPANY', 'ORACLE_LABEL', 'ORG_ID', 'REPERTOIRE_OWNER', 'PRESENTATION_LABEL', 'LEGACY_LABEL_CODE', 'PROFIT_CENTER', 'WBS_ELEMENT', 'SAP_COMPANY_CODE', 'INCOME_OWNER', 'INCOME_OWN_DOMESTIC_TERRITORY', 'WEA_EXTFAMILYCODE', 'WEA_IMDFAMILYCODE', 'WEA_COMPANYCODE', 'WEA_COMPANYNAME', 'WEA_LABELCODE', 'GRID', 'INCOME_TYPE_CD', 'INTERFACE_GROUP_CD', 'COMM_MODEL_TYPE', 'REPORTED_DISTRIBUTION_MEDIUM', 'SALES_TYPE', 'TRX_TYPE' #, 'Revenue Category'
            ]
        ],
    },
    # Warner Mobile (FB5576)
    { service => Client::Service::DSP_WARNER_MOBILE,
        version => 2,
        lines =>
        [
            [
'DSP Name', 'Start Date', 'End Date', 'Artist', 'Title', 'Product', 'Product Type', 'Media Code', 'Format Code', 'Artist Number', 'Project suffix', 'Label Code', 'Extended Family', 'Oracle Co.', 'ORG ID', 'GL Account', 'WBS Element', 'SAP Profit Center', 'SAP Company Code', 'Comm Model Type', 'Interface Group', 'WMG SRP', 'Posted Date', 'Suspense', 'Units', 'Gross Amt', 'Net Amt', 'WMG Amt'
            ]
        ],
    },
    # Warner Mobile (FB5740)
    { service => Client::Service::DSP_WARNER_MOBILE,
        version => 3,
        lines =>
        [
            [
'Invoice Date', 'Reporting Date', 'Customer Number', 'Customer Name', 'Customer Type', 'Product Id', 'Artist', 'Title', 'Configuration', 'UPC/EAN', 'Published Price', 'Price Type', 'Sale Type', 'Gross Units', 'Return Units', 'GSLR Units', 'Base Price', 'Gross Base Amt', 'Return Base Amt', 'GSLR Base Amt', 'Unit Price', 'Gross Unit Amt', 'Return Unit Amt', 'GSLR Unit Amt', 'Free Goods Percent', 'Free Goods Units', 'Vol Discount Percent', 'Vol Discount Amount', 'Total Discount Amount'
            ]
        ],
    },
    # Warner Mobile (FB9528)
    { service => Client::Service::DSP_WARNER_MOBILE,
        version => 4,
        lines =>
        [
            [
'DSP Name', 'Account Id', 'Retailer Name', 'Dealer Account Id', 'Start Date', 'End Date', 'Artist', 'Title', 'Product', 'Product Type', 'Media Code', 'Format Code', 'Artist Number', 'Project suffix', 'Label Code', 'Extended Family', 'Oracle Co\.', 'ORG ID', 'GL Account', 'WBS Element', 'SAP Profit Center', 'SAP Company Code', 'Comm Model Type', 'Interface Group', 'WMG SRP', 'Posted Date', 'Suspense', 'Units', 'Gross Amt', 'Net Amt', 'WMG Amt', '^$'
            ]
        ],
    },    
    # Warner Mobile (FB14082)
    { service => Client::Service::DSP_WARNER_MOBILE,
        version => 5,
        lines =>
        [
            [
'DSP Name', 'Account Id', 'Retailer Name', 'Dealer Account Id', 'Start Date', 'End Date', 'Artist', 'Title', 'Product', 'Product Type', 'Media Code', 'Format Code', 'Price Grade', 'Selection Prefix', 'Selection Number', 'Artist Number', 'Project suffix', 'Label Code', 'Extended Family', 'Oracle Co.', 'ORG ID', 'GL Account', 'WBS Element', 'SAP Profit Center', 'SAP Company Code', 'Comm Model Type', 'Interface Group', 'WMG SRP', 'Posted Date', 'Process ID', 'Suspense', 'Units', 'Gross Amt', 'Net Amt', 'WMG Amt', 'Product Media type', 'Grid', 'Sales Type Cd', 'Income Type Cd', 'WBS Element\(Old Structure\)'
            ]
        ],
    },    
    # Bandcamp, v1
    { service => Client::Service::DSP_BANDCAMP,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'order date|Order.*Date', 'item type|Item Type', 'item name|Item Name', 'package|Package', 'artist|Artist', 'upc|UPC', 'isrc|ISRC', 'item price|Item Price', 'quantity|Quantity'
            ]
        ],
    },
    # Bandcamp, v4 (FB10411)
    { service => Client::Service::DSP_BANDCAMP,
        version => 4,
        match_on_any_row => 1,
        lines =>
        [
            [
'order date|Order.*Date', 'item type|Item Type', 'item name|Item Name', 'package|Package', 'artist|Artist',
'item price|Item Price', 'quantity|Quantity', undef,
'upc|UPC', 'isrc|ISRC'
            ]
        ],
    },
    # Bandcamp, v2 (updated for FB10250)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Digital',
        version => 2,
        lines =>
        [
            [
                'order date', 'seller paypal email', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'paypal fee', 'item total', 'amount received', 'paypal transaction id', 'assessed revenue share(?: \(\w{3}\))?', 'collected revenue share(?: \(\w{3}\))?', 'balance of revenue share(?: \(\w{3}\))?', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'region\/state', 'city', 'referrer', 'referrer url', '^$'
            ]
        ],
    },    
    # Bandcamp, v3 (updated for FB10249)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Physical',
        version => 3,
        lines =>
        [
            [
                'order date', 'seller paypal email', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'paypal fee', 'item total', 'amount received', 'paypal transaction id', 'assessed revenue share(?: \(\w{3}\))?', 'collected revenue share(?: \(\w{3}\))?', 'balance of revenue share(?: \(\w{3}\))?', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'region\/state', 'city', 'referrer', 'referrer url', '^$'
            ]
        ],
    },        
    # Bandcamp, v5 (FB11729)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Phys',
        version => 5,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(AUD\)', 'balance of revenue share \(USD\)', 'change to payout balance', 'payout balance \(AUD\)', 'payout balance \(USD\)', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v6 (FB11730)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Dig',
        version => 6,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(AUD\)', 'balance of revenue share \(USD\)', 'change to payout balance', 'payout balance \(AUD\)', 'payout balance \(USD\)', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v7 (FB12504)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Dig',
        version => 7,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share', 'change to payout balance', 'payout balance', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v8 (FB12505)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Phys',
        version => 8,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share', 'change to payout balance', 'payout balance', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v9 (FB12505)
    { service => Client::Service::DSP_BANDCAMP,
        version => 9,
        lines =>
        [
            [
'Order Date', 'Item Type', 'Item Name', 'Package', 'Artist', 'Item Price', 'Quantity', 'upc', 'isrc', 'Net Amount'

            ]
        ],
    },        
    # Bandcamp, v9 (FB17039)
    { service => Client::Service::DSP_BANDCAMP,
        version => 9,
        lines =>
        [
            [
'Date', 'Item Type', 'Item Name', 'Package', 'Artist', 'Item Price', 'Quantity', 'upc', 'isrc', 'Net Amount'
            ]
        ],
    },        
    # Bandcamp, v10 (FB12797)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Dig',
        version => 10,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(AUD\)', 'balance of revenue share \(USD\)', 'change to payout balance', 'payout balance \(AUD\)', 'payout balance \(USD\)', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp - FB15172
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Phys',
        version => 11,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(GBP\)', 'balance of revenue share \(EUR\)', 'change to payout balance', 'payout balance \(GBP\)', 'payout balance \(EUR\)', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'buyer name', 'buyer email', 'buyer phone', 'buyer note', 'ship to name', 'ship to street', 'ship to street 2', 'ship to city', 'ship to state', 'ship to zip', 'ship to country', 'ship to country code', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp - FB15171
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Dig',
        version => 12,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(GBP\)', 'balance of revenue share \(EUR\)', 'change to payout balance', 'payout balance \(GBP\)', 'payout balance \(EUR\)', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'buyer name', 'buyer email', 'buyer phone', 'buyer note', 'ship to name', 'ship to street', 'ship to street 2', 'ship to city', 'ship to state', 'ship to zip', 'ship to country', 'ship to country code', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v13 (FB15534) similar to v7, but with additional column
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Dig',
        version => 13,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share', 'change to payout balance', 'payout balance', 'net amount', 'package', 'option', 'item url', 'sku', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v14 (FB17404)
    { service => Client::Service::DSP_BANDCAMP,
        file_name => 'Dig',
        version => 14,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'ship from country name', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share', 'change to payout balance', 'payout balance', 'net amount', 'package', 'option', 'item url', 'sku', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v16 (FB18951)
    { service => Client::Service::DSP_BANDCAMP,
        version => 16, # digital file; same header as v15 (physical), below
        file_name => 'Dig',
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'ship from country name', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(GBP\)', 'balance of revenue share \(EUR\)', 'change to payout balance', 'payout balance \(GBP\)', 'payout balance \(EUR\)', 'net amount', 'less VAT', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v15 (FB18952)
    { service => Client::Service::DSP_BANDCAMP,
        version => 15,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'ship from country name', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share \(GBP\)', 'balance of revenue share \(EUR\)', 'change to payout balance', 'payout balance \(GBP\)', 'payout balance \(EUR\)', 'net amount', 'less VAT', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v16 (FB19905)
    { service => Client::Service::DSP_BANDCAMP,
        version => 17,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'ship from country name', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share', 'change to payout balance', 'payout balance', 'net amount', 'package', 'option', 'item url', 'catalog number', 'upc', 'isrc', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # Bandcamp, v18 (FB20212)
    { service => Client::Service::DSP_BANDCAMP,
        version => 18,
        lines =>
        [
            [
'date', 'paid to', 'item type', 'item name', 'artist', 'currency', 'item price', 'quantity', 'discount code', 'sub total', 'tax', 'shipping', 'ship from country name', 'transaction fee', 'fee type', 'item total', 'amount you received', 'bandcamp transaction id', 'paypal transaction id', 'assessed revenue share', 'collected revenue share', 'balance of revenue share', 'change to payout balance', 'payout balance', 'net amount', 'package', 'option', 'item url', 'sku', 'catalog number', 'upc', 'isrc', 'buyer name', 'buyer email', 'buyer phone', 'buyer note', 'ship to name', 'ship to street', 'ship to street 2', 'ship to city', 'ship to state', 'ship to zip', 'ship to country', 'ship to country code', 'ship date', 'ship notes', 'country', 'country code', 'region/state', 'city', 'referrer', 'referrer url'
            ]
        ],
    },        
    # iHeartRadio, v1 (FB20286)
    { service => Client::Service::DSP_IHEARTRADIO,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'\^iHeartMedia\^', undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, '^$'
            ]
        ],
    },
    # Pandora, v1 (FB17069)
    { service => Client::Service::DSP_PANDORA,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'DSP', 'SalesDate', 'ISRC', 'UPC', 'ReleaseTitle', 'ResourceTitle', 'Contributors', 'NumberOfConsumerSalesGross', 'NumberOfUnitAdjustments', 'CurrencyCode', 'EffectiveRoyaltyRate', 'RoyaltyRate', 'PriceRangeType', 'UseType', 'UserInterfaceType', 'DistributionChannelType', 'ReleaseType', 'TerritoryCode', 'RightSharePercentage', 'DataToBeForwarded', '^$'
            ]
        ],
    },
    # Pandora, v2 (FB17181)
    { service => Client::Service::DSP_PANDORA,
        version => 2,
        match_on_any_row => 1,
        lines =>
        [
            [
'DSP', 'SalesDate', 'ISRC', 'UPC', 'ReleaseTitle', 'ResourceTitle', 'Contributors', 'NumberOfConsumerSalesGross', 'NumberOfUnitAdjustments', 'CurrencyCode', 'EffectiveRoyaltyRate', 'RoyaltyRate', 'PriceRangeType', 'UseType', 'UserInterfaceType', 'DistributionChannelType', 'ReleaseType', 'TerritoryCode', 'RightSharePercentage', 'DataToBeForwarded', 'Member', 'LabelName'
            ]
        ],
    },
    # Merlin Pandora, (FB19910)
    { service => Client::Service::DSP_MERLIN,
        version => 42,
        match_on_any_row => 1,
        lines =>
        [
            [
'DSP', 'SalesDate', 'ISRC', 'UPC', 'ReleaseTitle', 'ResourceTitle', 'Contributors', 'NumberOfConsumerSalesGross', 'NumberOfUnitAdjustments', 'CurrencyCode', 'EffectiveRoyaltyRate', 'RoyaltyRate', 'PriceRangeType', 'UseType', 'UserInterfaceType', 'DistributionChannelType', 'ReleaseType', 'TerritoryCode', 'RightSharePercentage', 'DataToBeForwarded', 'PlanName', 'Member', 'LabelName'
            ]
        ],
    },
    # GoodToGo (FB20064)
    { service => Client::Service::DSP_GOODTOGO,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'catalog no', 'identifier', 'artist', 'title', 'product title', 'bundle single', 'tracks on bundle', 'distributor', 'country', 'download type', 'sales', 'avg ppu', 'ppu total', 'royalty%', 'royalty', 'service type', 'platform'
            ]
        ],
    },
    # Secretly, (FB19867)
    { service => Client::Service::DSP_SECRETLY,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'Internal Invoice Number', 'Customer', 'Catalog Number', 'Titledesc', 'digpay first rel UPC', 'digpay product ID', 'digpay cosmetic artist from agg', 'digpay cosmetic title from agg', 'digpay cosmetic dsp', 'digpay cosmetic country code from agg', 'DigAlbumTrackorStream', 'digpay quantity', 'xradjDIGPRICE', 'digpay total', 'DISTRODigTotal', 'shareDigLABELxradjust', 'LABELDigTotalxradjust', 'datePaidlast', 'dateProcessedlast', 'flag for mech obligation', 'integrity serial number', 'Label'
            ]
        ],
    },
    # Secretly (FB19936)
    { service => Client::Service::DSP_SECRETLY,
        version => 2,
        match_on_any_row => 1,
        lines =>
        [
            [
'Internal Invoice Number', 'Customer', 'Catalog Number', 'Titledesc', 'Artist', 'Title', 'Region', 'digest invoiceform', 'signedQuantity', 'xradjPRICE', 'shareLABELxradjust', 'Total', 'DISTROTotal', 'MnDTotal', 'LABELTotalxradjust', 'datePaidlast', 'dateProcessedlast', 'flag for mech obligation', 'integrity serial number', 'Label', 'POnumber'
            ]
        ],
    },
    # Secretly (FB20119)
    { service => Client::Service::DSP_SECRETLY,
        version => 3,
        match_on_any_row => 1,
        lines =>
        [
            [
'Internal Invoice Number', 'Customer', 'Catalog Number', 'Titledesc', 'Artist', 'Title', 'Region', 'digest invoiceform', 'signedQuantity', 'xradjPRICE', 'shareLABELxradjust', 'Total', 'DISTROTotal', 'MnDTotal', 'LABELTotalxradjust', 'datePaidlast', 'dateProcessedlast', 'flag for mech obligation', 'integrity serial number', 'Label'
            ]
        ],
    },
    # Zvooq, v1 (FB12726) # Subscription / Stream header
    { service => Client::Service::DSP_ZVOOQ,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'#', 'ISRC', 'Track Title', 'Authors', 'Artist', 'Number of streams per item', 'Revenue per stream', 'Author Rights Royalty \(\w{3}\)', 'Percentage', 'Related Rights Royalty \(\w{3}\)', 'Total Sum for Licensor \(\w{3}\)'
            ]
        ],
    },        
    # Zvooq, v1 (FB12726) #  Download/releases header
    { service => Client::Service::DSP_ZVOOQ,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'#', 'ISRC', 'Track Title', 'Authors', 'Artist', 'Number of downloads per item', 'End User Price per item \(\w{3}, before VAT\)', 'Author Rights Royalty \(\w{3}\)', 'Percentage', 'Related Rights Royalty \(\w{3}\)', 'Total Sum for Licensor \(\w{3}\)'
            ]
        ],
    },        
    # Tidal, v1 (FB12726)
    { service => Client::Service::DSP_TIDAL,
        version => 1,
        match_on_any_row => 1,
        lines =>
        [
            [
'transdate', 'tier', 'trackid', 'albumid', 'artistid', 'channelid', 'streams', 'album_title', 'album_upc', 'album_internalid', 'track_title', 'track_duration', 'track_amwkey', 'track_isrc', 'track_internalid', 'artistname', 'unit_content_cost', 'content_cost', 'cost_currency', 'partner_name', 'country', 'countrycode'
            ]
        ],
    },
	# Seed - FB15170
	#
	{ service => Client::Service::DSP_SEED,
	  version => 1,
	  sheet => 'any',
	  lines => [
	  	[
'Label', 'Catalog No', 'Release Artist', 'Release Title', 'Release Type', 'Release Date', 'UPC', 'ISRC', 'GRID', 'SR1 Release ID', 'Vendor Sales ID', 'Vendor', 'Sales Report End Date / Transaction Date', 'Country of Sale', 'Country Code', 'Delivery Type', 'Delivery Format', 'Mechanicals Withheld \(Y/N\)', 'Units Sold', 'Units Returned', 'Net Units', 'Sales', 'Returns', 'Net Sales', 'Vendor Fees', 'Mechanical Withheld Amount', 'Net Income', 'seed Distribution Fee', 'Net Payable'
		],
	  ]
	},
	# Ministry Of Sound - MusicQubed (FB1726)
	# Note: we don't have a traditional header to work with, hence the regular expressions.
	#
	{ service => Client::Service::DSP_MUSIC_QUBED,
	  version => 1,
	  sheet => 'any',
	  lines => [
	  	[
	#	9999593	11/02/2013	01/01/2013	31/01/2013	38
	    '(\d{7})', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d+'
		],
		[
	#	9999593	11/02/2013	01/01/2013	31/01/2013	Stream	Subs	Wireless	Electronic Single	GBCEN1102199	DJ Fresh Feat. Rita Ora	Hot Right Now	1	4.33	0.0147	0	0.0147	9999593	MusicQubed	GB	GB		GBP
		'\d{7}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '(stream|download)', '\w+', '\w+', 'electronic single', '\w+', '\w+', '\w+', '\d+', '\d*\.?\d+', '\d*\.?\d+', '\d+', '\d*\.?\d+', '\d{7}', 'MusicQubed', '\w{2}', '\w{2}', undef, '\w{3}'
		]
	  ]
	},

	# Ministry Of Sound - MusicQubed (FB3100)
	# Note: this matches the 'a la carte' tab for version 4.  I'm placing it ahead of v2 because
	# the 'subscriptions' tab is the same as v2
	#
	{ service => Client::Service::DSP_MUSIC_QUBED,
	  version => 4,
	  sheet => 'any',
	  lines => [
	  	[
		# 15/03/2013	01/02/2013	28/02/2013	49  (note: the dates are returned in YYYY-MM-DD format)
		'\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d+'
		],
		[
		#15/03/2013              01/02/2013               28/02/2013               Stream   Subs   Wireless
		'\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\w+',   '\w+', '\w+',
		#Electronic Single   GBCEN1201191   Example  Perfect Replacement  844     4.33         0.0207
		'\w+',               '\w{12,13}',   '\w+',   '\w+',               '\d+',  '\d*\.?\d+', '\d*\.?\d+',
		#0     17.5078       MusicQubed      GB     Premium    GBP
		'\d+', '\d*\.?\d+', 'MusicQubed',   '\w+',  'Premium', '\w+'
		]
	  ]
	},

	# Ministry Of Sound - MusicQubed (FB2114)
	# Note: we don't have a traditional header to work with, hence the regular expressions.
	#
	{ service => Client::Service::DSP_MUSIC_QUBED,
	  version => 2,
	  sheet => 'any',
	  lines => [
	  	[
		# 15/03/2013	01/02/2013	28/02/2013	49  (note: the dates are returned in YYYY-MM-DD format)
		'\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d+'
		],
		[
		#15/03/2013              01/02/2013               28/02/2013               Stream   Subs   Wireless
		'\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\w+',   '\w+', '\w+',
		#Electronic Single   GBCEN1201191   Example  Perfect Replacement  844     4.33         0.0207
		'\w+',               '\w{12,13}',   '\w+',   '\w+',               '\d+',  '\d*\.?\d+', '\d*\.?\d+',
		#0     17.5078       MusicQubed      GB     GBP
		'\d+', '\d*\.?\d+', 'MusicQubed',   '\w+', '\w+'
		]
	  ]
	},

	# Ministry Of Sound - MusicQubed (FB3099)
	# Note: we don't have a traditional header to work with, hence the regular expressions.
	#
	{ service => Client::Service::DSP_MUSIC_QUBED,
	  version => 3,
	  sheet => 'any',
	  lines => [
	  	[
		# 15/07/2013             01/06/2013               30/06/2013               113 (note: the dates are returned in YYYY-MM-DD format)
		'\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d+'
		],
		[
                # 15/07/2013	         01/06/2013               30/06/2013               Stream    Subs  Wireless
		'\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\d{4}-\d{1,2}-\d{1,2}', '\w+',   '\w+', '\w+',
		# Electronic Single  GBCEN1201191   Example  Perfect Replacement  1       4.33         0.0444
		'\w+',               '\w{12,13}',   '\w+',   '\w+',               '\d+',  '\d*\.?\d+', '\d*\.?\d+',

		# 0    0.0444       9999593	MusicQubed      GB     GB             GBP
		'\d+', '\d*\.?\d+', '\d+',      'MusicQubed',   '\w+', '\w+',  undef, '\w+'


		]
	  ]
	},

    # PC Music (FBoD8233)
    #
    {
        service => Client::Service::DSP_PCMUSIC,
        version => 1,
        lines =>
        [
            [
                'Start Date', 'End Date', 'Partner', 'Country', 'Unit ID', 'ISRC', 'Media Type',
                'Number of Units', 'Unit Price', 'Total Price', 'Currency', 'Artist', 'Album', 'Title'
            ],
        ]
    },
    # PCMusic (FB19984)
    { service => Client::Service::DSP_PCMUSIC,
        version => 2,
        match_on_any_row => 1,
        lines =>
        [
            [
'Start Date', 'End Date', 'Partner', 'Country', 'Unit ID', 'ISRC', 'Media Type', 'Number of Units', 'Unit Price', 'Total Price', 'Artist', 'Album', 'Title'
            ]
        ],
    },
    # A Train (FB8344, FB10477)
    #
    {
        service => Client::Service::DSP_ATRAIN,
        version => 1,
        sheet => 'any',
        match_on_any_row => 1,
        lines =>
        [
            [
                'SOURCE', 'PERIOD', 'ISRC', 'UPC', 'TRACK TITLE', 'ARTIST', 'ALBUM TITLE', 'UNITS', 'ROYALTY', '(IF NON USA|TERRITORY)'
            ],
        ]
    },
    # Music Key (FB9372)
    #
    {
        service => Client::Service::DSP_MUSIC_KEY,
        version => 1,
        lines =>
        [
            [
                'Video ID', 'Asset ID', 'ISRC', 'Custom ID', 'GRid', 'UPC', 'Artist', 'Title', 'Day', 'Country', 'Content Type', 'Claim Type', 'Plays Audio', 'Plays Audiovisual', 'Plays', '^$'
            ],
        ]
    },
    # Select Physical (FB9378)
    #
    {
        service => Client::Service::DSP_SELECT_PHYSICAL,
        version => 1,
        lines =>
        [
            ([undef]) x 2,
            [
                '#FOUR\.', '#PROD\.', 'AUTEUR', 'TITRE', 'MEDIUM', 'P\.D\.S\.', 'P\.D\.B\.', 'INVENT', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', 'PERIODE DE', 'PERIDOE A', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', 'PRIX UNI', 'MONTANT', 'INVENT', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', '^$'
            ],
        ]
    },    
    # Select Physical (FB10204)
    #
    {
        service => Client::Service::DSP_SELECT_PHYSICAL,
        version => 2,
        lines =>
        [
            ([undef]) x 2,
            [
                '#FOUR\.', 'UPC', '#PROD\.', 'AUTEUR', 'TITRE', 'MEDIUM', 'P\.D\.S\.', 'P\.D\.B\.', 'INVENT', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', 'PERIODE DE', 'PERIDOE A', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', 'PRIX UNI', 'MONTANT', 'INVENT', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', '^$'
#                '#FOUR\.', 'UPC', '#PROD\.', 'AUTEUR', 'TITRE', 'MEDIUM', 'P\.D\.S\.', 'P\.D\.B\.', 'INVENT', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', 'PERIODE DE', 'PERIDOE A', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', 'PRIX UNI', 'MONTANT', 'INVENT', 'PRESS', 'PROMO', 'F\.G\.', 'DEFECT\.', 'AJU\/DES', 'VENTES', 'VEN NET', '^$'
            ],
        ]
    },    
    # Bandit.fm
    #
    {
        service => Client::Service::DSP_BANDIT_FM,
        version => 1,
        lines =>
        [
            [
                'Month', 'Site_Name', 'Product_Type', 'Artist', 'Product_Title', 'Label', 'Distributor', 'Reporting_ID', 'Quantity', 'Wholesale', 'Retail', 'Extended', 'Country', 'Currency'
            ],
        ]
    }, 
    # Cadence (FBoD18233)
    #
    {
        service => Client::Service::DSP_CADENCE,
        version => 1,
        lines =>
        [
            [
                'transaction_date', 'quantity_sold', 'dollars_sold', 'description', 'import_from', 'upc', 'isrc', 'sales_channel_universal', 'catalog_number', 'artist_name', 'title', 'label_id', 'company_name', 'division_id', 'division_name', '^$'
            ],
        ]
    },         
    # Cadence (FB18235)
    #
    {
        service => Client::Service::DSP_CADENCE,
        version => 2,
        lines =>
        [
            [
#                'transaction_date', 'quantity_sold', 'dollars_sold', 'description', 'import_from', 'upc', 'isrc', 'sales_channel_universal', 'catalog_number', 'artist_name', 'title', 'label_id', 'company_name', 'division_id', 'division_name', '^$'
                 'transaction_date', 'quantity_sold', 'dollars_sold', 'quantity_returned', 'dollars_returned', 'import_from', 'upc', 'isrc', 'net_paid_universal', 'catalog_number', 'artist_name', 'title', 'label_id', 'company_name', 'division_id', 'division_name', '^$'
            ],
        ]
    },         
    # SiriusXM (FB19835)
    #
    {
        service => Client::Service::DSP_SIRIUS_XM,
        version => 1,
        lines =>
        [
            [
                '#LICENSOR_REFERENCE', 'LICENSOR_NAME', 'WORK_NUMBER', 'TRACK_TITLE', 'TRACK_ARTIST', 'ALBUM', 'ISRC', 'CHANNEL_PERFORMANCES', 'PERCENTAGE_RECEIVED', 'AMOUNT', 'DATE_FROM', 'DATE_TO', 'TERRITORY', 'LICENSEE', 'SERVICE', 'UPC', '^$'
            ],
        ]
    },  

  ];
  return $rules
}

1;
