From e04c21b012d8196f716f093a5bbc46f16cc4a1fb Mon Sep 17 00:00:00 2001 From: David Steele Date: Sun, 22 Nov 2015 17:27:30 -0500 Subject: [PATCH] v0.88: Documentation and Minor Bug Fixes * Added documentation in the user guide for delta restores, expiration, dedicated backup hosts, starting and stopping pgBackRest, and replication. * Fixed an issue where the start/stop commands required the --config option. * Fixed an issue where log files were being overwritten instead of appended. * Fixed an issue where backup-user was not optional. * Symlinks are no longer created in backup directories in the repository. These symlinks could point virtually anywhere and potentially be dangerous. Symlinks are still recreated during a restore. * Added better messaging for backup expiration. Full and differential backup expirations are logged on a single line along with a list of all dependent backups expired. * Archive retention is automatically set to full backup retention if not explicitly configured. --- .gitignore | 3 +- CHANGELOG.md | 17 + doc/doc.pl | 160 +- doc/lib/BackRestDoc/Common/Doc.pm | 209 +- doc/lib/BackRestDoc/Common/DocConfig.pm | 27 +- doc/lib/BackRestDoc/Common/DocExecute.pm | 621 ++ doc/lib/BackRestDoc/Common/DocManifest.pm | 536 ++ doc/lib/BackRestDoc/Common/DocRender.pm | 324 +- doc/lib/BackRestDoc/Html/DocHtmlBuilder.pm | 29 +- doc/lib/BackRestDoc/Html/DocHtmlElement.pm | 3 + doc/lib/BackRestDoc/Html/DocHtmlPage.pm | 424 +- doc/lib/BackRestDoc/Html/DocHtmlSite.pm | 139 +- doc/lib/BackRestDoc/Latex/DocLatex.pm | 137 + doc/lib/BackRestDoc/Latex/DocLatexSection.pm | 417 ++ doc/manifest.xml | 46 + doc/{css => resource/html}/default.css | 114 +- doc/resource/latex/cds-logo.eps | 6131 ++++++++++++++++++ doc/resource/latex/preamble.tex | 135 + doc/xml/change-log.xml | 28 +- doc/xml/dtd/doc.dtd | 102 +- doc/xml/dtd/manifest.dtd | 21 + doc/xml/index.xml | 63 +- doc/xml/reference.xml | 217 +- doc/xml/user-guide.xml | 1509 +++-- lib/BackRest/Backup.pm | 37 +- lib/BackRest/Common/Lock.pm | 3 +- lib/BackRest/Common/Log.pm | 2 +- lib/BackRest/Config/Config.pm | 22 +- lib/BackRest/Config/ConfigHelpData.pm | 15 +- lib/BackRest/Expire.pm | 108 +- lib/BackRest/Protocol/IO.pm | 2 +- lib/BackRest/Version.pm | 2 +- test/lib/BackRestTest/Common/ExecuteTest.pm | 83 +- test/lib/BackRestTest/Common/HostTest.pm | 224 + test/lib/BackRestTest/Common/LogTest.pm | 22 +- test/log/backup-archive-get-001.log | 4 +- test/log/backup-archive-get-003.log | 4 +- test/log/backup-archive-get-005.log | 4 +- test/log/backup-archive-get-007.log | 4 +- test/log/backup-archive-push-001.log | 4 +- test/log/backup-archive-push-002.log | 8 +- test/log/backup-archive-push-005.log | 4 +- test/log/backup-archive-push-006.log | 8 +- test/log/backup-archive-stop-001.log | 5 + test/log/backup-archive-stop-002.log | 5 + test/log/backup-archive-stop-003.log | 5 + test/log/backup-archive-stop-004.log | 9 +- test/log/backup-archive-stop-005.log | 5 + test/log/backup-archive-stop-006.log | 9 +- test/log/backup-expire-001.log | 47 +- test/log/backup-synthetic-001.log | 45 +- test/log/backup-synthetic-002.log | 45 +- test/log/backup-synthetic-003.log | 32 +- test/log/backup-synthetic-004.log | 45 +- test/log/backup-synthetic-005.log | 59 +- test/log/backup-synthetic-006.log | 45 +- test/log/backup-synthetic-007.log | 32 +- test/log/backup-synthetic-008.log | 45 +- test/vm/Vagrantfile | 55 +- test/vm/docker/co6-backup | 19 + test/vm/docker/co6-base | 31 + test/vm/docker/co6-db | 16 + test/vm/docker/u14-backup | 19 + test/vm/docker/u14-base | 41 + test/vm/docker/u14-db | 17 + test/vm/ssh/config | 1 + 66 files changed, 10986 insertions(+), 1618 deletions(-) create mode 100644 doc/lib/BackRestDoc/Common/DocExecute.pm create mode 100644 doc/lib/BackRestDoc/Common/DocManifest.pm create mode 100644 doc/lib/BackRestDoc/Latex/DocLatex.pm create mode 100644 doc/lib/BackRestDoc/Latex/DocLatexSection.pm create mode 100644 doc/manifest.xml rename doc/{css => resource/html}/default.css (79%) create mode 100644 doc/resource/latex/cds-logo.eps create mode 100644 doc/resource/latex/preamble.tex create mode 100644 doc/xml/dtd/manifest.dtd create mode 100644 test/lib/BackRestTest/Common/HostTest.pm create mode 100644 test/vm/docker/co6-backup create mode 100644 test/vm/docker/co6-base create mode 100644 test/vm/docker/co6-db create mode 100644 test/vm/docker/u14-backup create mode 100644 test/vm/docker/u14-base create mode 100644 test/vm/docker/u14-db diff --git a/.gitignore b/.gitignore index bdc58ec7d..bb732d401 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ test/test test/vm/.vagrant test/nytprof.out test/nytprof/* -doc/html/* +doc/output/* +test/vm/package/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c5b39492..4d823debd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # pgBackRest
Change Log +## v0.88: Documentation and Minor Bug Fixes +__Released November 22, 2015__ + +* Added documentation in the user guide for delta restores, expiration, dedicated backup hosts, starting and stopping pgBackRest, and replication. + +* Fixed an issue where the `start`/`stop` commands required the `--config` option. + +* Fixed an issue where log files were being overwritten instead of appended. + +* Fixed an issue where `backup-user` was not optional. + +* Symlinks are no longer created in backup directories in the repository. These symlinks could point virtually anywhere and potentially be dangerous. Symlinks are still recreated during a restore. + +* Added better messaging for backup expiration. Full and differential backup expirations are logged on a single line along with a list of all dependent backups expired. + +* Archive retention is automatically set to full backup retention if not explicitly configured. + ## v0.87: Website and User Guide __Released October 28, 2015__ diff --git a/doc/doc.pl b/doc/doc.pl index c9c63e516..37f43cfb7 100755 --- a/doc/doc.pl +++ b/doc/doc.pl @@ -16,18 +16,22 @@ use Cwd qw(abs_path); use File::Basename qw(dirname); use Getopt::Long qw(GetOptions); use Pod::Usage qw(pod2usage); +use Storable; use XML::Checker::Parser; use lib dirname($0) . '/lib'; use BackRestDoc::Common::Doc; use BackRestDoc::Common::DocConfig; -use BackRestDoc::Html::DocHtmlSite; +use BackRestDoc::Common::DocManifest; use BackRestDoc::Common::DocRender; +use BackRestDoc::Html::DocHtmlSite; +use BackRestDoc::Latex::DocLatex; use lib dirname($0) . '/../lib'; use BackRest::Common::Log; use BackRest::Common::String; use BackRest::Config::Config; +use BackRest::FileCommon; #################################################################################################################################### # Usage @@ -60,19 +64,25 @@ my $bHelp = false; # Display usage my $bVersion = false; # Display version my $bQuiet = false; # Sets log level to ERROR my $strLogLevel = 'info'; # Log level for tests -my $strProjectName = 'pgBackRest'; # Project name to use in docs -my $strExeName = 'pg_backrest'; # Exe name to use in docs -my $bHtml = false; # Generate full html documentation -my $strHtmlRoot = '/'; # Root html page my $bNoExe = false; # Should commands be executed when buildng help? (for testing only) +my $bUseCache = false; # Use cached data to generate the docs (for testing code changes only) +my $oVariableOverride = {}; # Override variables +my $strDocPath; # Document path to render +my @stryOutput; # Output types +my @stryKeyword; # Keyword used to filter output +my @stryRequire; # Required sections of the document (to speed testing) GetOptions ('help' => \$bHelp, 'version' => \$bVersion, 'quiet' => \$bQuiet, 'log-level=s' => \$strLogLevel, - 'html' => \$bHtml, - 'html-root=s' => \$strHtmlRoot, - 'no-exe', \$bNoExe) + 'out=s@' => \@stryOutput, + 'keyword=s@' => \@stryKeyword, + 'require=s@' => \@stryRequire, + 'no-exe', \$bNoExe, + 'use-cache', \$bUseCache, + 'var=s%', $oVariableOverride, + 'doc-path=s', \$strDocPath) or pod2usage(2); # Display version and exit if requested @@ -89,16 +99,29 @@ if ($bHelp || $bVersion) exit 0; } +# Set no-exe if use-cache is set +if ($bUseCache) +{ + $bNoExe = true; +} + # Set console log level if ($bQuiet) { - $strLogLevel = 'off'; + $strLogLevel = 'error'; +} + +# If no keyword we passed then use default +if (@stryKeyword == 0) +{ + @stryKeyword = ('default') } logLevelSet(undef, uc($strLogLevel)); # Get the base path my $strBasePath = abs_path(dirname($0)); +my $strOutputPath = "${strBasePath}/output"; sub docProcess { @@ -108,7 +131,7 @@ sub docProcess $strOperation, $strXmlIn, $strMdOut, - $oHtmlSite + $oManifest ) = logDebugParam ( @@ -122,33 +145,98 @@ sub docProcess my $oDoc = new BackRestDoc::Common::Doc($strXmlIn); # Write markdown - my $oRender = new BackRestDoc::Common::DocRender('markdown', $strProjectName, $strExeName); - $oRender->save($strMdOut, $oHtmlSite->variableReplace($oRender->process($oDoc))); + my $oRender = new BackRestDoc::Common::DocRender('markdown', $oManifest); + $oRender->save($strMdOut, $oManifest->variableReplace($oRender->process($oDoc))); } -my $oRender = new BackRestDoc::Common::DocRender('text', $strProjectName, $strExeName); -my $oDocConfig = new BackRestDoc::Common::DocConfig(new BackRestDoc::Common::Doc("${strBasePath}/xml/reference.xml"), $oRender); -$oDocConfig->helpDataWrite(); - -# !!! Create Html Site Object to perform variable replacements on markdown and test -# !!! This should be replaced with a more generic site object in the future -my $oHtmlSite = - new BackRestDoc::Html::DocHtmlSite - ( - new BackRestDoc::Common::DocRender('html', $strProjectName, $strExeName), - $oDocConfig, - "${strBasePath}/xml", - "${strBasePath}/html", - "${strBasePath}/css/default.css", - $strHtmlRoot, - !$bNoExe - ); - -docProcess("${strBasePath}/xml/index.xml", "${strBasePath}/../README.md", $oHtmlSite); -docProcess("${strBasePath}/xml/change-log.xml", "${strBasePath}/../CHANGELOG.md", $oHtmlSite); - -# Only generate the HTML site when requested -if ($bHtml) +# Create the out path if it does not exist +if (!-e $strOutputPath) { - $oHtmlSite->process(); + mkdir($strOutputPath) + or confess &log(ERROR, "unable to create path ${strOutputPath}"); +} + +# Load the manifest +my $oManifest; +my $strManifestCache = "${strOutputPath}/manifest.cache"; + +if ($bUseCache && -e $strManifestCache) +{ + $oManifest = retrieve($strManifestCache); +} +else +{ + $oManifest = new BackRestDoc::Common::DocManifest(\@stryKeyword, \@stryRequire, $oVariableOverride, $strDocPath); +} + +# If no outputs were given +if (@stryOutput == 0) +{ + @stryOutput = $oManifest->renderList(); + + if ($oManifest->isBackRest()) + { + push(@stryOutput, 'help'); + push(@stryOutput, 'markdown'); + } +} + +for my $strOutput (@stryOutput) +{ + if (!(($strOutput eq 'help' || $strOutput eq 'markdown') && $oManifest->isBackRest())) + { + $oManifest->renderGet($strOutput); + } + + &log(INFO, "render ${strOutput} output"); + + if ($strOutput eq 'markdown' && $oManifest->isBackRest()) + { + # Generate the markdown + docProcess("${strBasePath}/xml/index.xml", "${strBasePath}/../README.md", $oManifest); + docProcess("${strBasePath}/xml/change-log.xml", "${strBasePath}/../CHANGELOG.md", $oManifest); + } + elsif ($strOutput eq 'help' && $oManifest->isBackRest()) + { + # Generate the command-line help + my $oRender = new BackRestDoc::Common::DocRender('text', $oManifest); + my $oDocConfig = + new BackRestDoc::Common::DocConfig( + new BackRestDoc::Common::Doc("${strBasePath}/xml/reference.xml"), $oRender); + $oDocConfig->helpDataWrite($oManifest); + } + elsif ($strOutput eq 'html') + { + my $oHtmlSite = + new BackRestDoc::Html::DocHtmlSite + ( + $oManifest, + "${strBasePath}/xml", + "${strOutputPath}/html", + "${strBasePath}/resource/html/default.css", + !$bNoExe + ); + + $oHtmlSite->process(); + } + elsif ($strOutput eq 'pdf') + { + my $oLatex = + new BackRestDoc::Latex::DocLatex + ( + $oManifest, + "${strBasePath}/xml", + "${strOutputPath}/latex", + "${strBasePath}/resource/latex/preamble.tex", + !$bNoExe + ); + + $oLatex->process(); + } +} + +# Cache the manifest (mostly useful for testing rendering changes in the code) +if (!$bUseCache) +{ + store($oManifest, $strManifestCache); } diff --git a/doc/lib/BackRestDoc/Common/Doc.pm b/doc/lib/BackRestDoc/Common/Doc.pm index 83ef499fb..e20cab030 100644 --- a/doc/lib/BackRestDoc/Common/Doc.pm +++ b/doc/lib/BackRestDoc/Common/Doc.pm @@ -15,6 +15,7 @@ use Scalar::Util qw(blessed); use lib dirname($0) . '/../lib'; use BackRest::Common::Log; use BackRest::Common::String; +use BackRest::FileCommon; #################################################################################################################################### # Operation constants @@ -27,8 +28,10 @@ use constant OP_DOC_NEW => OP_DOC . use constant OP_DOC_NODE_BLESS => OP_DOC . '->nodeBless'; use constant OP_DOC_NODE_GET => OP_DOC . '->nodeGet'; use constant OP_DOC_NODE_LIST => OP_DOC . '->nodeList'; +use constant OP_DOC_NODE_REMOVE => OP_DOC . '->nodeRemove'; use constant OP_DOC_PARAM_GET => OP_DOC . '->paramGet'; use constant OP_DOC_PARAM_SET => OP_DOC . '->paramSet'; +use constant OP_DOC_PARAM_TEST => OP_DOC . '->paramSet'; use constant OP_DOC_PARSE => OP_DOC . '->parse'; use constant OP_DOC_VALUE_GET => OP_DOC . '->valueGet'; use constant OP_DOC_VALUE_SET => OP_DOC . '->valueSet'; @@ -49,44 +52,60 @@ sub new # Assign function parameters, defaults, and log debug info ( my $strOperation, - $self->{strFileName} + $self->{strFileName}, + my $bCached ) = logDebugParam ( OP_DOC_NEW, \@_, - {name => 'strFileName', required => false} + {name => 'strFileName', required => false}, + {name => 'bCached', default => false} ); # Load the doc from a file if one has been defined if (defined($self->{strFileName})) { - my $oParser = XML::Checker::Parser->new(ErrorContext => 2, Style => 'Tree'); - $oParser->set_sgml_search_path(dirname($self->{strFileName}) . '/dtd'); - - my $oTree; - - eval + if ($bCached) { - local $XML::Checker::FAIL = sub - { - my $iCode = shift; + $self->oDoc = XMLin(fileStringRead($self->{strFileName})); + } + else + { + my $oParser = XML::Checker::Parser->new(ErrorContext => 2, Style => 'Tree'); - die XML::Checker::error_string($iCode, @_); + if (-e dirname($0) . '/dtd') + { + $oParser->set_sgml_search_path(dirname($0) . '/dtd') + } + else + { + $oParser->set_sgml_search_path(dirname($0) . '/xml/dtd'); + } + + my $oTree; + + eval + { + local $XML::Checker::FAIL = sub + { + my $iCode = shift; + + die XML::Checker::error_string($iCode, @_); + }; + + $oTree = $oParser->parsefile($self->{strFileName}); }; - $oTree = $oParser->parsefile($self->{strFileName}); - }; + # Report any error that stopped parsing + if ($@) + { + $@ =~ s/at \/.*?$//s; # remove module line number + die "malformed xml in '$self->{strFileName}':\n" . trim($@); + } - # Report any error that stopped parsing - if ($@) - { - $@ =~ s/at \/.*?$//s; # remove module line number - die "malformed xml in '$self->{strFileName}':\n" . trim($@); + # Parse and build the doc + $self->{oDoc} = $self->build($self->parse(${$oTree}[0], ${$oTree}[1])); } - - # Parse and build the doc - $self->{oDoc} = $self->build($self->parse(${$oTree}[0], ${$oTree}[1])); - } # Else create a blank doc else @@ -129,8 +148,8 @@ sub parse my %oOut; my $iIndex = 0; - my $bText = $strName eq 'text' || $strName eq 'li' || $strName eq 'code-block' || $strName eq 'p' || $strName eq 'title' || - $strName eq 'summary'; + my $bText = $strName eq 'text' || $strName eq 'li' || $strName eq 'p' || $strName eq 'title' || + $strName eq 'summary' || $strName eq 'table-cell' || $strName eq 'table-column'; # Store the node name $oOut{name} = $strName; @@ -244,7 +263,8 @@ sub build } } - if ($$oDoc{name} eq 'p' || $$oDoc{name} eq 'title' || $$oDoc{name} eq 'summary') + if ($$oDoc{name} eq 'p' || $$oDoc{name} eq 'title' || $$oDoc{name} eq 'summary' || + $$oDoc{name} eq 'table-cell' || $$oDoc{name} eq 'table-column') { $$oOut{field}{text} = $oDoc; } @@ -255,7 +275,7 @@ sub build my $oSub = $$oDoc{children}[$iIndex]; my $strName = $$oSub{name}; - if ($strName eq 'text' || $strName eq 'code-block') + if ($strName eq 'text') { $$oOut{field}{text} = $oSub; } @@ -351,6 +371,18 @@ sub nodeGet return $self->nodeGetById(shift, undef, shift); } +#################################################################################################################################### +# nodeTest +# +# Test that a node exists +#################################################################################################################################### +sub nodeTest +{ + my $self = shift; + + return defined($self->nodeGetById(shift, undef, false)); +} + #################################################################################################################################### # nodeAdd # @@ -470,6 +502,55 @@ sub nodeList ); } +#################################################################################################################################### +# nodeRemove +# +# Remove a child node. +#################################################################################################################################### +sub nodeRemove +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oChildRemove + ) = + logDebugParam + ( + OP_DOC_NODE_REMOVE, \@_, + {name => 'oChildRemove', required => false, trace => true} + ); + + my $bRemove = false; + my $oDoc = $self->{oDoc}; + + # Error if there are no children + if (!defined($$oDoc{children})) + { + confess &log(ERROR, "node has no children"); + } + + for (my $iIndex = 0; $iIndex < @{$$oDoc{children}}; $iIndex++) + { + if ($$oDoc{children}[$iIndex] == $oChildRemove->{oDoc}) + { + splice(@{$$oDoc{children}}, $iIndex, 1); + $bRemove = true; + last; + } + } + + if (!$bRemove) + { + confess &log(ERROR, "child was not found in node"); + } + + # Return from function and log return values if any + return logDebugReturn($strOperation); +} + #################################################################################################################################### # nameGet #################################################################################################################################### @@ -539,6 +620,7 @@ sub paramGet $strOperation, $strName, $bRequired, + $strDefault, $strType ) = logDebugParam @@ -546,14 +628,20 @@ sub paramGet OP_DOC_PARAM_GET, \@_, {name => 'strName', trace => true}, {name => 'bRequired', default => true, trace => true}, + {name => 'strDefault', required => false, trace => true}, {name => 'strType', default => 'param', trace => true} ); my $strValue = ${$self->{oDoc}}{$strType}{$strName}; - if (!defined($strValue) && $bRequired) + if (!defined($strValue)) { - confess "${strType} '${strName}' in required in node '$self->{strName}'"; + if ($bRequired) + { + confess "${strType} '${strName}' in required in node '$self->{strName}'"; + } + + $strValue = $strDefault; } # Return from function and log return values if any @@ -564,6 +652,51 @@ sub paramGet ); } +#################################################################################################################################### +# paramTest +# +# Test that a parameter exists or has a certain value. +#################################################################################################################################### +sub paramTest +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strName, + $strExpectedValue, + $strType + ) = + logDebugParam + ( + OP_DOC_PARAM_TEST, \@_, + {name => 'strName', trace => true}, + {name => 'strExpectedValue', required => false, trace => true}, + {name => 'strType', default => 'param', trace => true} + ); + + my $bResult = true; + my $strValue = $self->paramGet($strName, false, undef, $strType); + + if (!defined($strValue)) + { + $bResult = false; + } + elsif (defined($strExpectedValue) && $strValue ne $strExpectedValue) + { + $bResult = false; + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'bResult', value => $bResult, trace => true} + ); +} + #################################################################################################################################### # paramSet # @@ -585,7 +718,7 @@ sub paramSet ( OP_DOC_PARAM_SET, \@_, {name => 'strName', trace => true}, - {name => 'strValue', trace => true}, + {name => 'strValue', required => false, trace => true}, {name => 'strType', default => 'param', trace => true} ); @@ -604,7 +737,19 @@ sub fieldGet { my $self = shift; - return $self->paramGet(shift, shift, 'field'); + return $self->paramGet(shift, shift, shift, 'field'); +} + +#################################################################################################################################### +# fieldTest +# +# Test if a field exists. +#################################################################################################################################### +sub fieldTest +{ + my $self = shift; + + return $self->paramTest(shift, shift, 'field'); } #################################################################################################################################### @@ -616,7 +761,7 @@ sub textGet { my $self = shift; - return $self->nodeBless($self->paramGet('text', shift, 'field')); + return $self->nodeBless($self->paramGet('text', shift, shift, 'field')); } #################################################################################################################################### diff --git a/doc/lib/BackRestDoc/Common/DocConfig.pm b/doc/lib/BackRestDoc/Common/DocConfig.pm index 8f5b66340..d622a6d90 100644 --- a/doc/lib/BackRestDoc/Common/DocConfig.pm +++ b/doc/lib/BackRestDoc/Common/DocConfig.pm @@ -235,18 +235,28 @@ sub helpDataWrite my $self = shift; # Assign function parameters, defaults, and log debug info - my $strOperation = logDebugParam(OP_DOC_CONFIG_HELP_DATA_WRITE); + my + ( + $strOperation, + $oManifest + ) = + logDebugParam + ( + OP_DOC_CONFIG_HELP_DATA_WRITE, \@_, + {name => 'oManifest'} + ); # Internal function used to format text by quoting it and splitting lines so it looks good in the module. sub formatText { + my $oManifest = shift; my $oDocRender = shift; my $oText = shift; my $iIndent = shift; my $iLength = shift; # Split the string into lines for processing - my @stryText = split("\n", trim($oDocRender->processText($oText))); + my @stryText = split("\n", trim($oManifest->variableReplace($oDocRender->processText($oText)))); my $strText; my $iIndex = 0; @@ -321,9 +331,9 @@ sub helpDataWrite (defined($$oOptionHash{&CONFIG_HELP_SECTION}) ? ' ' . &CONFIG_HELP_SECTION . ' => \'' . $$oOptionHash{&CONFIG_HELP_SECTION} . "',\n" : '') . ' ' . &CONFIG_HELP_SUMMARY . " =>\n" . - formatText($self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_SUMMARY}, 16, 112) . ",\n" . + formatText($oManifest, $self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_SUMMARY}, 16, 112) . ",\n" . ' ' . &CONFIG_HELP_DESCRIPTION . " =>\n" . - formatText($self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_DESCRIPTION}, 16, 112) . "\n" . + formatText($oManifest, $self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_DESCRIPTION}, 16, 112) . "\n" . " }"; } @@ -346,9 +356,9 @@ sub helpDataWrite " '${strCommand}' =>\n" . " {\n" . ' ' . &CONFIG_HELP_SUMMARY . " =>\n" . - formatText($self->{oDocRender}, $$oCommandHash{&CONFIG_HELP_SUMMARY}, 16, 112) . ",\n" . + formatText($oManifest, $self->{oDocRender}, $$oCommandHash{&CONFIG_HELP_SUMMARY}, 16, 112) . ",\n" . ' ' . &CONFIG_HELP_DESCRIPTION . " =>\n" . - formatText($self->{oDocRender}, $$oCommandHash{&CONFIG_HELP_DESCRIPTION}, 16, 112) . ",\n" . + formatText($oManifest, $self->{oDocRender}, $$oCommandHash{&CONFIG_HELP_DESCRIPTION}, 16, 112) . ",\n" . "\n"; # Iterate options @@ -385,9 +395,9 @@ sub helpDataWrite " '${strOption}' =>\n" . " {\n" . ' ' . &CONFIG_HELP_SUMMARY . " =>\n" . - formatText($self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_SUMMARY}, 24, 104) . ",\n" . + formatText($oManifest, $self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_SUMMARY}, 24, 104) . ",\n" . ' ' . &CONFIG_HELP_DESCRIPTION . " =>\n" . - formatText($self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_DESCRIPTION}, 24, 104) . "\n" . + formatText($oManifest, $self->{oDocRender}, $$oOptionHash{&CONFIG_HELP_DESCRIPTION}, 24, 104) . "\n" . " }"; $bExtraLinefeed = true; @@ -612,7 +622,6 @@ sub helpCommandDocGet return $oOption, $strSection; } - # Working variables my $oConfigHash = $self->{oConfigHash}; my $oOperationDoc = $self->{oDoc}->nodeGet('operation'); diff --git a/doc/lib/BackRestDoc/Common/DocExecute.pm b/doc/lib/BackRestDoc/Common/DocExecute.pm new file mode 100644 index 000000000..82324bad0 --- /dev/null +++ b/doc/lib/BackRestDoc/Common/DocExecute.pm @@ -0,0 +1,621 @@ +#################################################################################################################################### +# DOC EXECUTE MODULE +#################################################################################################################################### +package BackRestDoc::Common::DocExecute; +use parent 'BackRestDoc::Common::DocRender'; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname); +use Storable qw(dclone); + +use lib dirname($0) . '/../lib'; +use BackRest::Common::Ini; +use BackRest::Common::Log; +use BackRest::Common::String; +use BackRest::FileCommon; + +use lib dirname($0) . '/../test/lib'; +use BackRestTest::Common::ExecuteTest; +use BackRestTest::Common::HostTest; + +use BackRestDoc::Common::DocManifest; + +#################################################################################################################################### +# Operation constants +#################################################################################################################################### +use constant OP_DOC_EXECUTE => 'DocExecute'; + +use constant OP_DOC_EXECUTE_BACKREST_CONFIG => OP_DOC_EXECUTE . '->backrestConfig'; +use constant OP_DOC_EXECUTE_EXECUTE => OP_DOC_EXECUTE . '->execute'; +use constant OP_DOC_EXECUTE_NEW => OP_DOC_EXECUTE . '->new'; +use constant OP_DOC_EXECUTE_POSTGRES_CONFIG => OP_DOC_EXECUTE . '->postresConfig'; +use constant OP_DOC_EXECUTE_SECTION_CHILD_PROCESS => OP_DOC_EXECUTE . '->sectionChildProcess'; + +#################################################################################################################################### +# CONSTRUCTOR +#################################################################################################################################### +sub new +{ + my $class = shift; # Class name + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strType, + $oManifest, + $strRenderOutKey, + $bExe + ) = + logDebugParam + ( + OP_DOC_EXECUTE_NEW, \@_, + {name => 'strType'}, + {name => 'oManifest'}, + {name => 'strRenderOutKey'}, + {name => 'bExe'} + ); + + # Create the class hash + my $self = $class->SUPER::new($strType, $oManifest, $strRenderOutKey); + bless $self, $class; + + $self->{bExe} = $bExe; + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'self', value => $self} + ); +} + +#################################################################################################################################### +# execute +#################################################################################################################################### +sub execute +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oSection, + $strHostName, + $oCommand, + $iIndent + ) = + logDebugParam + ( + OP_DOC_EXECUTE_EXECUTE, \@_, + {name => 'oSection'}, + {name => 'strHostName'}, + {name => 'oCommand'}, + {name => 'iIndent', default => 1} + ); + + # Working variables + my $strCommand; + my $strOutput; + + if ($oCommand->fieldTest('actual-command')) + { + $strCommand = $oCommand->fieldGet('actual-command'); + $strOutput = $oCommand->fieldGet('actual-output', false); + } + else + { + # Command variables + $strCommand = trim($oCommand->fieldGet('exe-cmd')); + my $strUser = $oCommand->paramGet('user', false, 'postgres'); + my $bExeOutput = $oCommand->paramTest('output', 'y'); + my $strVariableKey = $oCommand->paramGet('variable-key', false); + my $iExeExpectedError = $oCommand->paramGet('err-expect', false); + + $strCommand = $self->{oManifest}->variableReplace( + (defined($strUser) && $strUser eq 'vagrant' ? '' : + ('sudo ' . ($strUser eq 'root' ? '' : "-u ${strUser} "))) . $strCommand); + + # Add continuation chars and proper spacing + $strCommand =~ s/[ ]*\n[ ]*/ \\\n /smg; + + if (!$oCommand->paramTest('show', 'n') && $self->{bExe} && $self->isRequired($oSection)) + { + # Make sure that no lines are greater than 80 chars + foreach my $strLine (split("\n", $strCommand)) + { + if (length(trim($strLine)) > 80) + { + confess &log(ERROR, "command has a line > 80 characters:\n${strCommand}"); + } + } + } + + &log(DEBUG, (' ' x $iIndent) . "execute: $strCommand"); + + if (!$oCommand->paramTest('skip', 'y')) + { + if ($self->{bExe} && $self->isRequired($oSection)) + { + # Check that the host is valid + my $oHost = $self->{host}{$strHostName}; + + if (!defined($oHost)) + { + confess &log(ERROR, "cannot execute on host ${strHostName} because the host does not exist"); + } + + my $oExec = $oHost->execute($strCommand, + {iExpectedExitStatus => $iExeExpectedError, + bSuppressError => $oCommand->paramTest('err-suppress', 'y'), + iRetrySeconds => $oCommand->paramGet('retry', false)}); + $oExec->begin(); + $oExec->end(); + + if ($bExeOutput && defined($oExec->{strOutLog}) && $oExec->{strOutLog} ne '') + { + $strOutput = $oExec->{strOutLog}; + + # Trim off extra linefeeds before and after + $strOutput =~ s/^\n+|\n$//g; + + if ($strCommand =~ / pg\_backrest /) + { + $strOutput =~ s/^ //smg; + $strOutput =~ s/^[0-9]{4}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-6][0-9]:[0-6][0-9]\.[0-9]{3} T[0-9]{2} //smg; + } + } + + if (defined($iExeExpectedError)) + { + $strOutput .= trim($oExec->{strErrorLog}); + } + + # Output is assigned to a var + if (defined($strVariableKey)) + { + $self->{oManifest}->variableSet($strVariableKey, trim($oExec->{strOutLog})); + } + elsif (!$oCommand->paramTest('filter', 'n') && $bExeOutput && defined($strOutput)) + { + my $strHighLight = $self->{oManifest}->variableReplace($oCommand->fieldGet('exe-highlight', false)); + + if (!defined($strHighLight)) + { + confess &log(ERROR, 'filter requires highlight definition: ' . $strCommand); + } + + my $iFilterContext = $oCommand->paramGet('filter-context', false, 2); + + my @stryOutput = split("\n", $strOutput); + undef($strOutput); + # my $iFiltered = 0; + my $iLastOutput = -1; + + for (my $iIndex = 0; $iIndex < @stryOutput; $iIndex++) + { + if ($stryOutput[$iIndex] =~ /$strHighLight/) + { + # Determine the first line to output + my $iFilterFirst = $iIndex - $iFilterContext; + + # Don't go past the beginning + $iFilterFirst = $iFilterFirst < 0 ? 0 : $iFilterFirst; + + # Don't repeat lines that have already been output + $iFilterFirst = $iFilterFirst <= $iLastOutput ? $iLastOutput + 1 : $iFilterFirst; + + # Determine the last line to output + my $iFilterLast = $iIndex + $iFilterContext; + + # Don't got past the end + $iFilterLast = $iFilterLast >= @stryOutput ? @stryOutput -1 : $iFilterLast; + + # Mark filtered lines if any + if ($iFilterFirst > $iLastOutput + 1) + { + my $iFiltered = $iFilterFirst - ($iLastOutput + 1); + + if ($iFiltered > 1) + { + $strOutput .= (defined($strOutput) ? "\n" : '') . + " [filtered ${iFiltered} lines of output]"; + } + else + { + $iFilterFirst -= 1; + } + } + + # Output the lines + for (my $iOutputIndex = $iFilterFirst; $iOutputIndex <= $iFilterLast; $iOutputIndex++) + { + $strOutput .= (defined($strOutput) ? "\n" : '') . $stryOutput[$iOutputIndex]; + } + + $iLastOutput = $iFilterLast; + } + } + + if (@stryOutput - 1 > $iLastOutput + 1) + { + my $iFiltered = (@stryOutput - 1) - ($iLastOutput + 1); + + if ($iFiltered > 1) + { + $strOutput .= (defined($strOutput) ? "\n" : '') . + " [filtered ${iFiltered} lines of output]"; + } + else + { + $strOutput .= (defined($strOutput) ? "\n" : '') . $stryOutput[@stryOutput - 1]; + } + } + } + } + elsif ($bExeOutput) + { + $strOutput = 'Output suppressed for testing'; + } + } + + if (defined($strVariableKey) && !defined($self->{oManifest}->variableGet($strVariableKey))) + { + $self->{oManifest}->variableSet($strVariableKey, '[Test Variable]'); + } + + $oCommand->fieldSet('actual-command', $strCommand); + $oCommand->fieldSet('actual-output', $strOutput); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'strCommand', value => $strCommand, trace => true}, + {name => 'strOutput', value => $strOutput, trace => true} + ); +} + +#################################################################################################################################### +# backrestConfig +#################################################################################################################################### +sub backrestConfig +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oSection, + $oConfig, + $iDepth + ) = + logDebugParam + ( + OP_DOC_EXECUTE_BACKREST_CONFIG, \@_, + {name => 'oSection'}, + {name => 'oConfig'}, + {name => 'iDepth'} + ); + + # Working variables + my $strFile; + my $strConfig; + + if ($oConfig->fieldTest('actual-file')) + { + $strFile = $oConfig->fieldGet('actual-file'); + $strConfig = $oConfig->fieldGet('actual-config'); + } + else + { + # Get filename + $strFile = $self->{oManifest}->variableReplace($oConfig->paramGet('file')); + + &log(DEBUG, (' ' x $iDepth) . 'process backrest config: ' . $strFile); + + if ($self->{bExe} && $self->isRequired($oSection)) + { + # Check that the host is valid + my $strHostName = $self->{oManifest}->variableReplace($oConfig->paramGet('host')); + my $oHost = $self->{host}{$strHostName}; + + if (!defined($oHost)) + { + confess &log(ERROR, "cannot configure backrest on host ${strHostName} because the host does not exist"); + } + + # Reset all options + if ($oConfig->paramTest('reset', 'y')) + { + delete(${$self->{config}}{$strHostName}{$strFile}) + } + + foreach my $oOption ($oConfig->nodeList('backrest-config-option')) + { + my $strSection = $oOption->paramGet('section'); + my $strKey = $oOption->paramGet('key'); + my $strValue; + + if (!$oOption->paramTest('remove', 'y')) + { + $strValue = $self->{oManifest}->variableReplace(trim($oOption->valueGet(false))); + } + + if (!defined($strValue)) + { + delete(${$self->{config}}{$strHostName}{$strFile}{$strSection}{$strKey}); + + if (keys(${$self->{config}}{$strHostName}{$strFile}{$strSection}) == 0) + { + delete(${$self->{config}}{$strHostName}{$strFile}{$strSection}); + } + + &log(DEBUG, (' ' x ($iDepth + 1)) . "reset ${strSection}->${strKey}"); + } + else + { + ${$self->{config}}{$strHostName}{$strFile}{$strSection}{$strKey} = $strValue; + &log(DEBUG, (' ' x ($iDepth + 1)) . "set ${strSection}->${strKey} = ${strValue}"); + } + } + + my $strLocalFile = "/home/vagrant/data/db-master/etc/pg_backrest.conf"; + + # Save the ini file + iniSave($strLocalFile, $self->{config}{$strHostName}{$strFile}, true); + + $strConfig = fileStringRead($strLocalFile); + + $oHost->copyTo($strLocalFile, $strFile, $oConfig->paramGet('owner', false, 'postgres:postgres'), '640'); + } + else + { + $strConfig = 'Config suppressed for testing'; + } + + $oConfig->fieldSet('actual-file', $strFile); + $oConfig->fieldSet('actual-config', $strConfig); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'strFile', value => $strFile, trace => true}, + {name => 'strConfig', value => $strConfig, trace => true}, + {name => 'bShow', value => $oConfig->paramTest('show', 'n') ? false : true, trace => true} + ); +} + +#################################################################################################################################### +# postgresConfig +#################################################################################################################################### +sub postgresConfig +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oSection, + $oConfig, + $iDepth + ) = + logDebugParam + ( + OP_DOC_EXECUTE_POSTGRES_CONFIG, \@_, + {name => 'oSection'}, + {name => 'oConfig'}, + {name => 'iDepth'} + ); + + # Working variables + my $strFile; + my $strConfig; + + if ($oConfig->fieldTest('actual-file')) + { + $strFile = $oConfig->fieldGet('actual-file'); + $strConfig = $oConfig->fieldGet('actual-config'); + } + else + { + # Get filename + $strFile = $self->{oManifest}->variableReplace($oConfig->paramGet('file')); + + if ($self->{bExe} && $self->isRequired($oSection)) + { + # Check that the host is valid + my $strHostName = $self->{oManifest}->variableReplace($oConfig->paramGet('host')); + my $oHost = $self->{host}{$strHostName}; + + if (!defined($oHost)) + { + confess &log(ERROR, "cannot configure postgres on host ${strHostName} because the host does not exist"); + } + + my $strLocalFile = '/home/vagrant/data/db-master/etc/postgresql.conf'; + $oHost->copyFrom($strFile, $strLocalFile); + + if (!defined(${$self->{'pg-config'}}{$strHostName}{$strFile}{base}) && $self->{bExe}) + { + ${$self->{'pg-config'}}{$strHostName}{$strFile}{base} = fileStringRead($strLocalFile); + } + + my $oConfigHash = $self->{'pg-config'}{$strHostName}{$strFile}; + my $oConfigHashNew; + + if (!defined($$oConfigHash{old})) + { + $oConfigHashNew = {}; + $$oConfigHash{old} = {} + } + else + { + $oConfigHashNew = dclone($$oConfigHash{old}); + } + + &log(DEBUG, (' ' x $iDepth) . 'process postgres config: ' . $strFile); + + foreach my $oOption ($oConfig->nodeList('postgres-config-option')) + { + my $strKey = $oOption->paramGet('key'); + my $strValue = $self->{oManifest}->variableReplace(trim($oOption->valueGet())); + + if ($strValue eq '') + { + delete($$oConfigHashNew{$strKey}); + + &log(DEBUG, (' ' x ($iDepth + 1)) . "reset ${strKey}"); + } + else + { + $$oConfigHashNew{$strKey} = $strValue; + &log(DEBUG, (' ' x ($iDepth + 1)) . "set ${strKey} = ${strValue}"); + } + } + + # Generate config text + foreach my $strKey (sort(keys(%$oConfigHashNew))) + { + if (defined($strConfig)) + { + $strConfig .= "\n"; + } + + $strConfig .= "${strKey} = $$oConfigHashNew{$strKey}"; + } + + # Save the conf file + if ($self->{bExe}) + { + fileStringWrite($strLocalFile, $$oConfigHash{base} . + (defined($strConfig) ? "\n# pgBackRest Configuration\n${strConfig}\n" : '')); + + $oHost->copyTo($strLocalFile, $strFile, 'postgres:postgres', '640'); + } + + $$oConfigHash{old} = $oConfigHashNew; + } + else + { + $strConfig = 'Config suppressed for testing'; + } + + $oConfig->fieldSet('actual-file', $strFile); + $oConfig->fieldSet('actual-config', $strConfig); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'strFile', value => $strFile, trace => true}, + {name => 'strConfig', value => $strConfig, trace => true}, + {name => 'bShow', value => $oConfig->paramTest('show', 'n') ? false : true, trace => true} + ); +} + +#################################################################################################################################### +# sectionChildProcesss +#################################################################################################################################### +sub sectionChildProcess +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oSection, + $oChild, + $iDepth + ) = + logDebugParam + ( + OP_DOC_EXECUTE_SECTION_CHILD_PROCESS, \@_, + {name => 'oSection'}, + {name => 'oChild'}, + {name => 'iDepth'} + ); + + &log(DEBUG, (' ' x ($iDepth + 1)) . 'process child: ' . $oChild->nameGet()); + + # Execute a command + if ($oChild->nameGet() eq 'host-add') + { + if ($self->{bExe} && $self->isRequired($oSection) && !$oChild->paramTest('created', true)) + { + my $strName = $self->{oManifest}->variableReplace($oChild->paramGet('name')); + my $strUser = $self->{oManifest}->variableReplace($oChild->paramGet('user')); + my $strImage = $self->{oManifest}->variableReplace($oChild->paramGet('image')); + my $strOS = $self->{oManifest}->variableReplace($oChild->paramGet('os', false)); + my $strMount = $self->{oManifest}->variableReplace($oChild->paramGet('mount', false)); + + if (defined($self->{host}{$strName})) + { + confess &log(ERROR, 'cannot add host ${strName} because the host already exists'); + } + + my $oHost = new BackRestTest::Common::HostTest($strName, $strImage, $strUser, $strOS, $strMount); + $self->{host}{$strName} = $oHost; + $self->{oManifest}->variableSet("host-${strName}-ip", $oHost->{strIP}); + + # Execute cleanup commands + foreach my $oExecute ($oChild->nodeList('execute')) + { + $self->execute($oSection, $strName, $oExecute, $iDepth + 1); + } + + $oHost->executeSimple("sh -c 'echo \"\" >> /etc/hosts\'"); + $oHost->executeSimple("sh -c 'echo \"# Test Hosts\" >> /etc/hosts'"); + + # Add all other host IPs to this host + foreach my $strOtherHostName (sort(keys($self->{host}))) + { + if ($strOtherHostName ne $strName) + { + my $oOtherHost = $self->{host}{$strOtherHostName}; + + $oHost->executeSimple("sh -c 'echo \"$oOtherHost->{strIP} ${strOtherHostName}\" >> /etc/hosts'"); + } + } + + # Add this host IP to all other hosts + foreach my $strOtherHostName (sort(keys($self->{host}))) + { + if ($strOtherHostName ne $strName) + { + my $oOtherHost = $self->{host}{$strOtherHostName}; + + $oOtherHost->executeSimple("sh -c 'echo \"$oHost->{strIP} ${strName}\" >> /etc/hosts'"); + } + } + + $oChild->paramSet('created', true); + } + } + # Skip children that have already been processed and error on others + elsif ($oChild->nameGet() ne 'title') + { + confess &log(ASSERT, 'unable to process child type ' . $oChild->nameGet()); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation + ); +} + +1; diff --git a/doc/lib/BackRestDoc/Common/DocManifest.pm b/doc/lib/BackRestDoc/Common/DocManifest.pm new file mode 100644 index 000000000..f4bfb2692 --- /dev/null +++ b/doc/lib/BackRestDoc/Common/DocManifest.pm @@ -0,0 +1,536 @@ +#################################################################################################################################### +# DOC MANIFEST MODULE +#################################################################################################################################### +package BackRestDoc::Common::DocManifest; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Cwd qw(abs_path); +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname); +use Scalar::Util qw(blessed); + +use lib dirname($0) . '/../lib'; +use BackRest::Common::Log; +use BackRest::Common::String; +use BackRest::FileCommon; + +#################################################################################################################################### +# Operation constants +#################################################################################################################################### +use constant OP_DOC_MANIFEST => 'DocManifest'; + +use constant OP_DOC_MANIFEST_NEW => OP_DOC_MANIFEST . '->new'; +use constant OP_DOC_MANIFEST_RENDER_GET => OP_DOC_MANIFEST . '->renderGet'; +use constant OP_DOC_MANIFEST_RENDER_LIST => OP_DOC_MANIFEST . '->renderList'; +use constant OP_DOC_MANIFEST_RENDER_OUT_GET => OP_DOC_MANIFEST . '->renderOutGet'; +use constant OP_DOC_MANIFEST_RENDER_OUT_LIST => OP_DOC_MANIFEST . '->renderOutList'; +use constant OP_DOC_MANIFEST_SOURCE_GET => OP_DOC_MANIFEST . '->sourceGet'; +use constant OP_DOC_MANIFEST_VARIABLE_LIST_PARSE => OP_DOC_MANIFEST . '->variableListParse'; + +#################################################################################################################################### +# File constants +#################################################################################################################################### +use constant FILE_MANIFEST => 'manifest.xml'; + +#################################################################################################################################### +# Render constants +#################################################################################################################################### +use constant RENDER => 'render'; +use constant RENDER_FILE => 'file'; + +use constant RENDER_TYPE => 'type'; +use constant RENDER_TYPE_HTML => 'html'; + push @EXPORT, qw(RENDER_TYPE_HTML); +use constant RENDER_TYPE_PDF => 'pdf'; + push @EXPORT, qw(RENDER_TYPE_PDF); + +#################################################################################################################################### +# CONSTRUCTOR +#################################################################################################################################### +sub new +{ + my $class = shift; # Class name + + # Create the class hash + my $self = {}; + bless $self, $class; + + # Assign function parameters, defaults, and log debug info + ( + my $strOperation, + $self->{stryKeyword}, + $self->{stryRequire}, + my $oVariableOverride, + $self->{strDocPath} + ) = + logDebugParam + ( + OP_DOC_MANIFEST_NEW, \@_, + {name => 'stryKeyword'}, + {name => 'stryRequire'}, + {name => 'oVariableOverride', required => false}, + {name => 'strDocPath', required => false}, + ); + + # Set the base path if it was not passed in + if (!defined($self->{strDocPath})) + { + $self->{strDocPath} = abs_path(dirname($0)); + } + + # Load the manifest + $self->{oManifestXml} = new BackRestDoc::Common::Doc("$self->{strDocPath}/manifest.xml"); + + # Iterate the sources + $self->{oManifest} = {}; + + foreach my $oSource ($self->{oManifestXml}->nodeGet('source-list')->nodeList('source')) + { + my $oSourceHash = {}; + my $strKey = $oSource->paramGet('key'); + + logDebugMisc + ( + $strOperation, 'load source', + {name => 'strKey', value => $strKey} + ); + + $$oSourceHash{doc} = new BackRestDoc::Common::Doc("$self->{strDocPath}/xml/${strKey}.xml"); + + # Read variables from source + $self->variableListParse($$oSourceHash{doc}->nodeGet('variable-list', false), $oVariableOverride); + + ${$self->{oManifest}}{source}{$strKey} = $oSourceHash; + } + + # Iterate the renderers + foreach my $oRender ($self->{oManifestXml}->nodeGet('render-list')->nodeList('render')) + { + my $oRenderHash = {}; + my $strType = $oRender->paramGet(RENDER_TYPE); + + # Only one instance of each render type can be defined + if (defined(${$self->{oManifest}}{&RENDER}{$strType})) + { + confess &log(ERROR, "render ${strType} has already been defined"); + } + + # Get the file param + $${oRenderHash}{file} = $oRender->paramGet(RENDER_FILE, false); + + logDebugMisc + ( + $strOperation, ' load render', + {name => 'strType', value => $strType}, + {name => 'strFile', value => $${oRenderHash}{file}} + ); + + # Error if file is set and render type is not pdf + if (defined($${oRenderHash}{file}) && $strType ne RENDER_TYPE_PDF) + { + confess &log(ERROR, 'only the pdf render type can have file set') + } + + # Iterate the render sources + foreach my $oRenderOut ($oRender->nodeList('render-source')) + { + my $oRenderOutHash = {}; + my $strKey = $oRenderOut->paramGet('key'); + my $strSource = $oRenderOut->paramGet('source', false, $strKey); + + $$oRenderOutHash{source} = $strSource; + + # Get the filename if this is a pdf + $$oRenderOutHash{menu} = $oRenderOut->paramGet('menu', false); + + if (defined($$oRenderOutHash{menu}) && $strType ne RENDER_TYPE_HTML) + { + confess &log(ERROR, 'only the html render type can have menu set') + } + + logDebugMisc + ( + $strOperation, ' load render source', + {name => 'strKey', value => $strKey}, + {name => 'strSource', value => $strSource}, + {name => 'strMenu', value => $${oRenderOutHash}{menu}} + ); + + $${oRenderHash}{out}{$strKey} = $oRenderOutHash; + } + + ${$self->{oManifest}}{render}{$strType} = $oRenderHash; + } + + # Read variables from manifest + $self->variableListParse($self->{oManifestXml}->nodeGet('variable-list', false), $oVariableOverride); + + # use Data::Dumper; confess Dumper($self->{oVariable}); + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'self', value => $self} + ); +} + +#################################################################################################################################### +# isBackRest +# +# Until all the backrest specific code can be abstracted, this function will identify when BackRest docs are being built. +#################################################################################################################################### +sub isBackRest +{ + my $self = shift; + + return($self->variableTest('project-exe', 'pg_backrest')); +} + +#################################################################################################################################### +# keywordMatch +# +# See if all the keywords were on the command line. +#################################################################################################################################### +sub keywordMatch +{ + my $self = shift; + my $strKeywordRequired = shift; + + if (defined($strKeywordRequired)) + { + for my $strKeyword (split(',', $strKeywordRequired)) + { + $strKeyword = trim($strKeyword); + + if (!grep(/^$strKeyword$/, @{$self->{stryKeyword}})) + { + return false; + } + } + } + + return true; +} + +#################################################################################################################################### +# variableListParse +# +# Parse a variable list and store variables. +#################################################################################################################################### +sub variableListParse +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oVariableList, + $oVariableOverride + ) = + logDebugParam + ( + OP_DOC_MANIFEST_VARIABLE_LIST_PARSE, \@_, + {name => '$oVariableList', required => false}, + {name => '$oVariableOverride', required => false} + ); + + if (defined($oVariableList)) + { + foreach my $oVariable ($oVariableList->nodeList('variable')) + { + if ($self->keywordMatch($oVariable->paramGet('keyword', false))) + { + my $strKey = $oVariable->paramGet('key'); + my $strValue = $oVariable->valueGet(); + + if ($oVariable->paramTest('eval', 'y')) + { + $strValue = eval $strValue; + + if ($@) + { + confess &log(ERROR, "unable to evaluate ${strKey}: $@\n" . $oVariable->valueGet()); + } + } + + $self->variableSet($strKey, defined($$oVariableOverride{$strKey}) ? $$oVariableOverride{$strKey} : $strValue); + + logDebugMisc + ( + $strOperation, ' load variable', + {name => 'strKey', value => $strKey}, + {name => 'strValue', value => $strValue} + ); + } + } + } + + # Return from function and log return values if any + return logDebugReturn($strOperation); +} + +#################################################################################################################################### +# variableReplace +# +# Replace variables in the string. +#################################################################################################################################### +sub variableReplace +{ + my $self = shift; + my $strBuffer = shift; + my $strType = shift; + + if (!defined($strBuffer)) + { + return undef; + } + + foreach my $strName (sort(keys(%{$self->{oVariable}}))) + { + my $strValue = $self->{oVariable}{$strName}; + + $strBuffer =~ s/\{\[$strName\]\}/$strValue/g; + } + + if (defined($strType) && $strType eq 'latex') + { + $strBuffer =~ s/\\\_/\_/g; + $strBuffer =~ s/\_/\\\_/g; + $strBuffer =~ s/\\\#/\#/g; + $strBuffer =~ s/\#/\\\#/g; + } + + return $strBuffer; +} + +#################################################################################################################################### +# variableSet +# +# Set a variable to be replaced later. +#################################################################################################################################### +sub variableSet +{ + my $self = shift; + my $strKey = shift; + my $strValue = shift; + my $bForce = shift; + + if (defined(${$self->{oVariable}}{$strKey}) && (!defined($bForce) || !$bForce)) + { + confess &log(ERROR, "${strKey} variable is already defined"); + } + + ${$self->{oVariable}}{$strKey} = $self->variableReplace($strValue); +} + +#################################################################################################################################### +# variableGet +# +# Get the current value of a variable. +#################################################################################################################################### +sub variableGet +{ + my $self = shift; + my $strKey = shift; + + return ${$self->{oVariable}}{$strKey}; +} + +#################################################################################################################################### +# variableTest +# +# Test that a variable is defined or has an expected value. +#################################################################################################################################### +sub variableTest +{ + my $self = shift; + my $strKey = shift; + my $strExpectedValue = shift; + + # Get the variable + my $strValue = ${$self->{oVariable}}{$strKey}; + + # Return false if it is not defined + if (!defined($strValue)) + { + return false; + } + + # Return false if it does not equal the expected value + if (defined($strExpectedValue) && $strValue ne $strExpectedValue) + { + return false; + } + + return true; +} + +#################################################################################################################################### +# sourceGet +#################################################################################################################################### +sub sourceGet +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strSource + ) = + logDebugParam + ( + OP_DOC_MANIFEST_SOURCE_GET, \@_, + {name => 'strSource', trace => true} + ); + + if (!defined(${$self->{oManifest}}{source}{$strSource})) + { + confess &log(ERROR, "source ${strSource} does not exist"); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'oSource', value => ${$self->{oManifest}}{source}{$strSource}} + ); +} + +#################################################################################################################################### +# renderList +#################################################################################################################################### +sub renderList +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my ($strOperation) = logDebugParam(OP_DOC_MANIFEST_RENDER_LIST); + + # Check that the render output exists + my @stryRender; + + if (defined(${$self->{oManifest}}{render})) + { + @stryRender = sort(keys(${$self->{oManifest}}{render})); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'stryRender', value => \@stryRender} + ); +} + +#################################################################################################################################### +# renderGet +#################################################################################################################################### +sub renderGet +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strType + ) = + logDebugParam + ( + OP_DOC_MANIFEST_RENDER_GET, \@_, + {name => 'strType', trace => true} + ); + + # Check that the render exists + if (!defined(${$self->{oManifest}}{render}{$strType})) + { + confess &log(ERROR, "render type ${strType} does not exist"); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'oRenderOut', value => ${$self->{oManifest}}{render}{$strType}} + ); +} + +#################################################################################################################################### +# renderOutList +#################################################################################################################################### +sub renderOutList +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strType + ) = + logDebugParam + ( + OP_DOC_MANIFEST_RENDER_OUT_LIST, \@_, + {name => 'strType'} + ); + + # Check that the render output exists + my @stryRenderOut; + + if (defined(${$self->{oManifest}}{render}{$strType})) + { + @stryRenderOut = sort(keys(${$self->{oManifest}}{render}{$strType}{out})); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'stryRenderOut', value => \@stryRenderOut} + ); +} + +#################################################################################################################################### +# renderOutGet +#################################################################################################################################### +sub renderOutGet +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strType, + $strKey + ) = + logDebugParam + ( + OP_DOC_MANIFEST_RENDER_OUT_GET, \@_, + {name => 'strType', trace => true}, + {name => 'strKey', trace => true} + ); + + # use Data::Dumper; print Dumper(${$self->{oManifest}}{render}); + + if (!defined(${$self->{oManifest}}{render}{$strType}{out}{$strKey})) + { + confess &log(ERROR, "render out ${strKey} does not exist"); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'oRenderOut', value => ${$self->{oManifest}}{render}{$strType}{out}{$strKey}} + ); +} + +1; diff --git a/doc/lib/BackRestDoc/Common/DocRender.pm b/doc/lib/BackRestDoc/Common/DocRender.pm index ab5dd72f1..c4598d585 100644 --- a/doc/lib/BackRestDoc/Common/DocRender.pm +++ b/doc/lib/BackRestDoc/Common/DocRender.pm @@ -15,6 +15,8 @@ use lib dirname($0) . '/../lib'; use BackRest::Common::Log; use BackRest::Common::String; +use BackRestDoc::Common::DocManifest; + #################################################################################################################################### # Operation constants #################################################################################################################################### @@ -26,8 +28,6 @@ use constant OP_DOC_RENDER_PROCESS_TEXT => OP_DOC_RE use constant OP_DOC_RENDER_NEW => OP_DOC_RENDER . '->new'; use constant OP_DOC_RENDER_SAVE => OP_DOC_RENDER . '->save'; -# use HTML::HTML5::Builder qw[:standard JQUERY]; - #################################################################################################################################### # Render tags for various output types #################################################################################################################################### @@ -35,9 +35,10 @@ my $oRenderTag = { 'markdown' => { + 'quote' => ['"', '"'], 'b' => ['**', '**'], 'i' => ['_', '_'], - 'bi' => ['_**', '**_'], + # 'bi' => ['_**', '**_'], 'ul' => ["\n", "\n"], 'ol' => ["\n", "\n"], 'li' => ['- ', "\n"], @@ -48,17 +49,18 @@ my $oRenderTag = 'param' => ['`', '`'], 'setting' => ['`', '`'], 'code' => ['`', '`'], - 'code-block' => ['```', '```'], - 'exe' => [undef, ''], + # 'code-block' => ['```', '```'], + # 'exe' => [undef, ''], 'backrest' => [undef, ''], 'postgres' => ['PostgreSQL', ''] }, 'text' => { + 'quote' => ['"', '"'], 'b' => ['', ''], 'i' => ['', ''], - 'bi' => ['', ''], + # 'bi' => ['', ''], 'ul' => ["\n", "\n"], 'ol' => ["\n", "\n"], 'li' => ['* ', "\n"], @@ -76,15 +78,47 @@ my $oRenderTag = 'postgres' => ['PostgreSQL', ''] }, + 'latex' => + { + 'quote' => ['``', '"'], + 'b' => ['\textbf{', '}'], + 'i' => ['\textit{', '}'], + # 'bi' => ['', ''], + # 'ul' => ["\n", "\n"], + # 'ol' => ["\n", "\n"], + # 'li' => ['* ', "\n"], + 'id' => ['\textnormal{\texttt{', '}}'], + 'host' => ['\textnormal{\textbf{', '}}'], + 'file' => ['\textnormal{\texttt{', '}}'], + 'path' => ['\textnormal{\texttt{', '}}'], + 'cmd' => ['\textnormal{\texttt{', "}}"], + 'user' => ['\textnormal{\texttt{', '}}'], + 'br-option' => ['', ''], + # 'param' => ['\texttt{', '}'], + # 'setting' => ['\texttt{', '}'], + 'br-option' => ['\textnormal{\texttt{', '}}'], + 'br-setting' => ['\textnormal{\texttt{', '}}'], + 'pg-option' => ['\textnormal{\texttt{', '}}'], + 'pg-setting' => ['\textnormal{\texttt{', '}}'], + 'code' => ['\textnormal{\texttt{', '}}'], + # 'code' => ['\texttt{', '}'], + # 'code-block' => ['', ''], + # 'exe' => [undef, ''], + 'backrest' => [undef, ''], + 'postgres' => ['PostgreSQL', ''] + }, + 'html' => { + 'quote' => ['', ''], 'b' => ['', ''], 'i' => ['', ''], - 'bi' => ['', ''], + # 'bi' => ['', ''], 'ul' => [''], 'ol' => ['
    ', '
'], 'li' => ['
  • ', '
  • '], 'id' => ['', ''], + 'host' => ['', ''], 'file' => ['', ''], 'path' => ['', ''], 'cmd' => ['', ''], @@ -93,9 +127,9 @@ my $oRenderTag = 'br-setting' => ['', ''], 'pg-option' => ['', ''], 'pg-setting' => ['', ''], - 'code' => ['', ''], + 'code' => ['', ''], 'code-block' => ['', ''], - 'exe' => ['', ''], + 'exe' => [undef, ''], 'setting' => ['', ''], # !!! This will need to be fixed 'backrest' => [undef, ''], 'postgres' => ['PostgreSQL', ''] @@ -117,22 +151,76 @@ sub new ( my $strOperation, $self->{strType}, - $self->{strProjectName}, - $self->{strExeName} + $self->{oManifest}, + $self->{strRenderOutKey}, ) = logDebugParam ( OP_DOC_RENDER_NEW, \@_, {name => 'strType'}, - {name => 'strProjectName'}, - {name => 'strExeName'} + {name => 'oManifest'}, + {name => 'strRenderOutKey', required => false} ); - $$oRenderTag{markdown}{backrest}[0] = $self->{strProjectName}; - $$oRenderTag{markdown}{exe}[0] = $self->{strExeName}; - $$oRenderTag{text}{backrest}[0] = $self->{strProjectName}; - $$oRenderTag{text}{exe}[0] = $self->{strExeName}; - $$oRenderTag{html}{backrest}[0] = "$self->{strProjectName}"; + # Initialize project tags + $$oRenderTag{markdown}{backrest}[0] = "{[project]}"; + $$oRenderTag{markdown}{exe}[0] = "{[project-exe]}"; + + $$oRenderTag{text}{backrest}[0] = "{[project]}"; + $$oRenderTag{text}{exe}[0] = "{[project-exe]}"; + + $$oRenderTag{latex}{backrest}[0] = "{[project]}"; + $$oRenderTag{latex}{exe}[0] = "\\textnormal\{\\texttt\{[project-exe]}}\}\}"; + + $$oRenderTag{html}{backrest}[0] = "{[project]}"; + $$oRenderTag{html}{exe}[0] = "{[project-exe]}"; + + if (defined($self->{strRenderOutKey})) + { + # Copy page data to self + my $oRenderOut = $self->{oManifest}->renderOutGet($self->{strType} eq 'latex' ? 'pdf' : $self->{strType}, $self->{strRenderOutKey}); + + # Get the reference if this is the backrest project + if ($self->{oManifest}->isBackRest()) + { + $self->{oReference} = new BackRestDoc::Common::DocConfig(${$self->{oManifest}->sourceGet('reference')}{doc}, $self); + } + + if (defined($$oRenderOut{source}) && $$oRenderOut{source} eq 'reference') + { + if ($self->{strRenderOutKey} eq 'configuration') + { + $self->{oDoc} = $self->{oReference}->helpConfigDocGet(); + } + elsif ($self->{strRenderOutKey} eq 'command') + { + $self->{oDoc} = $self->{oReference}->helpCommandDocGet(); + } + else + { + confess &log(ERROR, "cannot render $self->{strRenderOutKey} from source $$oRenderOut{source}"); + } + } + else + { + $self->{oDoc} = ${$self->{oManifest}->sourceGet($self->{strRenderOutKey})}{doc}; + } + } + + if (defined($self->{strRenderOutKey})) + { + # Build the doc + $self->build($self->{oDoc}); + + # Get required sections + foreach my $strPath (@{$self->{oManifest}->{stryRequire}}) + { + if (defined(${$self->{oSection}}{$strPath})) + { + $self->required($strPath); + } + } + } # Return from function and log return values if any return logDebugReturn @@ -142,6 +230,183 @@ sub new ); } +#################################################################################################################################### +# variableReplace +# +# Replace variables in the string. +#################################################################################################################################### +sub variableReplace +{ + my $self = shift; + + return $self->{oManifest}->variableReplace(shift, $self->{strType}); +} + +#################################################################################################################################### +# variableSet +# +# Set a variable to be replaced later. +#################################################################################################################################### +sub variableSet +{ + my $self = shift; + + return $self->{oManifest}->variableSet(shift, shift); +} + +#################################################################################################################################### +# variableGet +# +# Get the current value of a variable. +#################################################################################################################################### +sub variableGet +{ + my $self = shift; + + return $self->{oManifest}->variableGet(shift); +} + +#################################################################################################################################### +# build +# +# Build the section map and perform keyword matching. +#################################################################################################################################### +sub build +{ + my $self = shift; + my $oNode = shift; + my $oParent = shift; + my $strPath = shift; + + # &log(INFO, " node " . $oNode->nameGet()); + + my $strName = $oNode->nameGet(); + + if (defined($oParent)) + { + if (!$self->{oManifest}->keywordMatch($oNode->paramGet('keyword', false))) + { + my $strDescription; + + if (defined($oNode->nodeGet('title', false))) + { + $strDescription = $self->processText($oNode->nodeGet('title')->textGet()); + } + + &log(DEBUG, " filtered ${strName}" . (defined($strDescription) ? ": ${strDescription}" : '')); + + $oParent->nodeRemove($oNode); + } + } + else + { + &log(DEBUG, ' build document'); + $self->{oSection} = {}; + } + + if ($strName eq 'section') + { + if (defined($strPath)) + { + $oNode->paramSet('path-parent', $strPath); + } + + $strPath .= '/' . $oNode->paramGet('id'); + + &log(DEBUG, " path ${strPath}"); + ${$self->{oSection}}{$strPath} = $oNode; + $oNode->paramSet('path', $strPath); + } + + # Iterate all nodes + foreach my $oChild ($oNode->nodeList(undef, false)) + { + $self->build($oChild, $oNode, $strPath); + } +} + +#################################################################################################################################### +# required +# +# Build a list of required sections +#################################################################################################################################### +sub required +{ + my $self = shift; + my $strPath = shift; + my $bDepend = shift; + + # If node is not found that means the path is invalid + my $oNode = ${$self->{oSection}}{$strPath}; + + if (!defined($oNode)) + { + confess &log(ERROR, "invalid path ${strPath}"); + } + + # Only add sections that are listed dependencies + if (!defined($bDepend) || $bDepend) + { + # Match section and all child sections + foreach my $strChildPath (sort(keys($self->{oSection}))) + { + if ($strChildPath =~ /^$strPath$/ || $strChildPath =~ /^$strPath\/.*$/) + { + &log(INFO, " require section: ${strChildPath}"); + + ${$self->{oSectionRequired}}{$strChildPath} = true; + } + } + } + + # Get the path of the current section's parent + my $strParentPath = $oNode->paramGet('path-parent', false); + + if ($oNode->paramTest('depend')) + { + foreach my $strDepend (split(',', $oNode->paramGet('depend'))) + { + if ($strDepend !~ /^\//) + { + if (!defined($strParentPath)) + { + $strDepend = "/${strDepend}"; + } + else + { + $strDepend = "${strParentPath}/${strDepend}"; + } + } + + $self->required($strDepend, true); + } + } + elsif (defined($strParentPath)) + { + $self->required($strParentPath, false); + } +} + +#################################################################################################################################### +# isRequired +# +# Is it required to execute the section statements? +#################################################################################################################################### +sub isRequired +{ + my $self = shift; + my $oSection = shift; + + if (!defined($self->{oSectionRequired})) + { + return true; + } + + my $strPath = $oSection->paramGet('path'); + + defined(${$self->{oSectionRequired}}{$strPath}) ? true : false; +} + #################################################################################################################################### # process # @@ -168,7 +433,6 @@ sub process ); my $strType = $self->{strType}; - my $strProjectName = $self->{strProjectName}; my $strBuffer = ""; my $bList = $oDoc->nameGet() =~ /.*-bullet-list$/; @@ -211,7 +475,7 @@ sub process $strBuffer .= 'v' . $oDoc->paramGet('version') . ': '; } - $strBuffer .= ($iDepth == 1 ? "${strProjectName}
    " : '') . $strTitle; + $strBuffer .= ($iDepth == 1 ? "{[project]}
    " : '') . $strTitle; if (defined($oDoc->paramGet('date', false))) { @@ -369,6 +633,10 @@ sub processTag $strBuffer = '' . $oTag->valueGet() . ''; } + elsif ($strType eq 'latex') + { + $strBuffer = $oTag->valueGet(); + } else { confess "tag link not valid for type ${strType}"; @@ -439,6 +707,11 @@ sub processText { if (ref(\$oNode) eq "SCALAR") { + if ($oNode =~ /\"/) + { + confess &log(ERROR, "unable to process quotes in string (use instead):\n${oNode}"); + } + $strBuffer .= $oNode; } else @@ -462,6 +735,17 @@ sub processText $strBuffer =~ s/^ //smg; # } + if ($strType eq 'latex') + { + $strBuffer =~ s/\&mdash\;/---/g; + $strBuffer =~ s/\<\;/\\=/\$\\geq\$/g; + # $strBuffer =~ s/\_/\\_/g; + } + + $strBuffer = $self->variableReplace($strBuffer); + # Return from function and log return values if any return logDebugReturn ( diff --git a/doc/lib/BackRestDoc/Html/DocHtmlBuilder.pm b/doc/lib/BackRestDoc/Html/DocHtmlBuilder.pm index 19ed4edb7..109097b33 100644 --- a/doc/lib/BackRestDoc/Html/DocHtmlBuilder.pm +++ b/doc/lib/BackRestDoc/Html/DocHtmlBuilder.pm @@ -44,13 +44,15 @@ sub new ( my $strOperation, $self->{strName}, - $self->{strTitle} + $self->{strTitle}, + $self->{bPretty} ) = logDebugParam ( OP_DOC_HTML_BUILDER_NEW, \@_, {name => 'strName'}, - {name => 'strTitle'} + {name => 'strTitle'}, + {name => 'bPretty', default => false} ); $self->{oBody} = new BackRestDoc::Html::DocHtmlElement(HTML_BODY); @@ -73,7 +75,7 @@ sub indent my $self = shift; my $iDepth = shift; - return (' ' x $iDepth); + return $self->{bPretty} ? (' ' x $iDepth) : ''; } #################################################################################################################################### @@ -85,7 +87,7 @@ sub lf { my $self = shift; - return "\n"; + return $self->{bPretty} ? "\n" : ''; } #################################################################################################################################### @@ -118,8 +120,8 @@ sub htmlRender logDebugParam ( OP_DOC_HTML_BUILDER_HTML_RENDER, \@_, - {name => 'oElement'}, - {name => 'iDepth'} + {name => 'oElement', trace => true}, + {name => 'iDepth', trace => true} ); # Build the header @@ -131,8 +133,19 @@ sub htmlRender if (defined($oElement->{strContent})) { - $oElement->{strContent} =~ s/\n/\\n/g; - $strHtml .= $self->lf() . trim($oElement->{strContent}) . $self->lf() . $self->indent($iDepth); + if (!defined($oElement->{bPre}) || !$oElement->{bPre}) + { + $oElement->{strContent} =~ s/\n/\\n/g; + $oElement->{strContent} = trim($oElement->{strContent}); + $strHtml .= $self->lf(); + } + + $strHtml .= $oElement->{strContent}; + + if (!defined($oElement->{bPre}) || !$oElement->{bPre}) + { + $strHtml .= $self->lf() . $self->indent($iDepth); + } } else { diff --git a/doc/lib/BackRestDoc/Html/DocHtmlElement.pm b/doc/lib/BackRestDoc/Html/DocHtmlElement.pm index e533d3b04..3e656c7ca 100644 --- a/doc/lib/BackRestDoc/Html/DocHtmlElement.pm +++ b/doc/lib/BackRestDoc/Html/DocHtmlElement.pm @@ -32,6 +32,8 @@ use constant HTML_A => 'a'; push @EXPORT, qw(HTML_A); use constant HTML_BODY => 'body'; push @EXPORT, qw(HTML_BODY); +use constant HTML_PRE => 'pre'; + push @EXPORT, qw(HTML_PRE); use constant HTML_DIV => 'div'; push @EXPORT, qw(HTML_DIV); use constant HTML_SPAN => 'span'; @@ -69,6 +71,7 @@ sub new $self->{strContent} = $$oParam{strContent}; $self->{strId} = $$oParam{strId}; $self->{strRef} = $$oParam{strRef}; + $self->{bPre} = $$oParam{bPre}; # Return from function and log return values if any return logDebugReturn diff --git a/doc/lib/BackRestDoc/Html/DocHtmlPage.pm b/doc/lib/BackRestDoc/Html/DocHtmlPage.pm index b320ccd44..9eb66bc03 100644 --- a/doc/lib/BackRestDoc/Html/DocHtmlPage.pm +++ b/doc/lib/BackRestDoc/Html/DocHtmlPage.pm @@ -2,6 +2,7 @@ # DOC HTML PAGE MODULE #################################################################################################################################### package BackRestDoc::Html::DocHtmlPage; +use parent 'BackRestDoc::Common::DocExecute'; use strict; use warnings FATAL => qw(all); @@ -15,15 +16,11 @@ use File::Copy; use Storable qw(dclone); use lib dirname($0) . '/../lib'; -use BackRest::Common::Ini; use BackRest::Common::Log; use BackRest::Common::String; use BackRest::Config::ConfigHelp; -use BackRest::FileCommon; - -use lib dirname($0) . '/../test/lib'; -use BackRestTest::Common::ExecuteTest; +use BackRestDoc::Common::DocManifest; use BackRestDoc::Html::DocHtmlBuilder; use BackRestDoc::Html::DocHtmlElement; @@ -33,7 +30,6 @@ use BackRestDoc::Html::DocHtmlElement; use constant OP_DOC_HTML_PAGE => 'DocHtmlPage'; use constant OP_DOC_HTML_PAGE_BACKREST_CONFIG_PROCESS => OP_DOC_HTML_PAGE . '->backrestConfigProcess'; -use constant OP_DOC_HTML_PAGE_EXECUTE => OP_DOC_HTML_PAGE . '->execute'; use constant OP_DOC_HTML_PAGE_NEW => OP_DOC_HTML_PAGE . '->new'; use constant OP_DOC_HTML_PAGE_POSTGRES_CONFIG_PROCESS => OP_DOC_HTML_PAGE . '->postgresConfigProcess'; use constant OP_DOC_HTML_PAGE_PROCESS => OP_DOC_HTML_PAGE . '->process'; @@ -46,35 +42,25 @@ sub new { my $class = shift; # Class name - # Create the class hash - my $self = {}; - bless $self, $class; - - $self->{strClass} = $class; - # Assign function parameters, defaults, and log debug info + my ( - my $strOperation, - $self->{oSite}, - $self->{strPageId}, - $self->{bExe} + $strOperation, + $oManifest, + $strRenderOutKey, + $bExe ) = logDebugParam ( OP_DOC_HTML_PAGE_NEW, \@_, - {name => 'oSite'}, - {name => 'strPageId'}, - {name => 'bExe', default => true} + {name => 'oManifest'}, + {name => 'strRenderOutKey'}, + {name => 'bExe'} ); - # - # use Data::Dumper; - # confess Dumper(${$self->{oSite}->{oSite}}{common}{oRender}); - # Copy page data to self - $self->{oPage} = ${$self->{oSite}->{oSite}}{page}{$self->{strPageId}}; - $self->{oDoc} = ${$self->{oPage}}{'oDoc'}; - $self->{oRender} = ${$self->{oSite}->{oSite}}{common}{oRender}; - $self->{oReference} = ${$self->{oSite}->{oSite}}{common}{oReference}; + # Create the class hash + my $self = $class->SUPER::new(RENDER_TYPE_HTML, $oManifest, $strRenderOutKey, $bExe); + bless $self, $class; # Return from function and log return values if any return logDebugReturn @@ -84,100 +70,6 @@ sub new ); } -#################################################################################################################################### -# execute -#################################################################################################################################### -sub execute -{ - my $self = shift; - - # Assign function parameters, defaults, and log debug info - my - ( - $strOperation, - $oCommand, - $iIndent - ) = - logDebugParam - ( - OP_DOC_HTML_PAGE_EXECUTE, \@_, - {name => 'oCommand'}, - {name => 'iIndent', default => 1} - ); - - # Working variables - my $strOutput; - - # Command variables - my $strCommand = trim($oCommand->fieldGet('exe-cmd')); - my $strUser = $oCommand->fieldGet('exe-user', false); - my $bSuppressError = defined($oCommand->fieldGet('exe-err-suppress', false)) ? $oCommand->fieldGet('exe-err-suppress') : false; - my $bSuppressStdErr = defined($oCommand->fieldGet('exe-err-suppress-stderr', false)) ? - $oCommand->fieldGet('exe-err-suppress-stderr') : false; - my $bExeSkip = defined($oCommand->fieldGet('exe-skip', false)) ? $oCommand->fieldGet('exe-skip') : false; - my $bExeOutput = defined($oCommand->fieldGet('exe-output', false)) ? $oCommand->fieldGet('exe-output') : false; - my $bExeRetry = defined($oCommand->fieldGet('exe-retry', false)) ? $oCommand->fieldGet('exe-retry') : false; - my $strExeVar = defined($oCommand->fieldGet('exe-var', false)) ? $oCommand->fieldGet('exe-var') : undef; - my $iExeExpectedError = defined($oCommand->fieldGet('exe-err-expect', false)) ? $oCommand->fieldGet('exe-err-expect') : undef; - - if ($bExeRetry) - { - sleep(1); - } - - $strUser = defined($strUser) ? $strUser : 'postgres'; - $strCommand = $self->{oSite}->variableReplace( - ($strUser eq 'vagrant' ? '' : 'sudo ' . ($strUser eq 'root' ? '' : "-u ${strUser} ")) . $strCommand); - - &log(INFO, (' ' x $iIndent) . "execute: $strCommand"); - - if (!$bExeSkip) - { - if ($self->{bExe}) - { - my $oExec = new BackRestTest::Common::ExecuteTest($strCommand, - {bSuppressError => $bSuppressError, - bSuppressStdErr => $bSuppressStdErr, - iExpectedExitStatus => $iExeExpectedError}); - $oExec->begin(); - $oExec->end(); - - if ($bExeOutput && defined($oExec->{strOutLog}) && $oExec->{strOutLog} ne '') - { - $strOutput = trim($oExec->{strOutLog}); - $strOutput =~ s/^[0-9]{4}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-6][0-9]:[0-6][0-9]\.[0-9]{3} T[0-9]{2} //smg; - } - - if (defined($strExeVar)) - { - $self->{oSite}->variableSet($strExeVar, trim($oExec->{strOutLog})); - } - - if (defined($iExeExpectedError)) - { - $strOutput .= trim($oExec->{strErrorLog}); - } - } - elsif ($bExeOutput) - { - $strOutput = 'Output suppressed for testing'; - } - } - - if (defined($strExeVar) && !defined($self->{oSite}->variableGet($strExeVar))) - { - $self->{oSite}->variableSet($strExeVar, '[Unset Variable]'); - } - - # Return from function and log return values if any - return logDebugReturn - ( - $strOperation, - {name => '$strCommand', value => $strCommand, trace => true}, - {name => '$strOutput', value => $strOutput, trace => true} - ); -} - #################################################################################################################################### # process # @@ -194,23 +86,13 @@ sub process my $oPage = $self->{oDoc}; # Initialize page - my $strTitle = ${$self->{oRender}}{strProjectName} . + my $strTitle = "{[project]}" . (defined($oPage->paramGet('title', false)) ? ' ' . $oPage->paramGet('title') : ''); my $strSubTitle = $oPage->paramGet('subtitle', false); - my $oHtmlBuilder = new BackRestDoc::Html::DocHtmlBuilder("${$self->{oRender}}{strProjectName} - Reliable PostgreSQL Backup", - $strTitle . (defined($strSubTitle) ? " - ${strSubTitle}" : '')); - - # Execute cleanup commands - if (defined($self->{oDoc}->nodeGet('cleanup', false))) - { - &log(INFO, "do cleanup"); - - foreach my $oExecute ($oPage->nodeGet('cleanup')->nodeList('execute')) - { - $self->execute($oExecute); - } - } + my $oHtmlBuilder = new BackRestDoc::Html::DocHtmlBuilder("{[project]} - Reliable PostgreSQL Backup", + $strTitle . (defined($strSubTitle) ? " - ${strSubTitle}" : ''), + $self->{bPretty}); # Generate header my $oPageHeader = $oHtmlBuilder->bodyGet()->addNew(HTML_DIV, 'page-header'); @@ -229,24 +111,24 @@ sub process # Generate menu my $oMenuBody = $oHtmlBuilder->bodyGet()->addNew(HTML_DIV, 'page-menu')->addNew(HTML_DIV, 'menu-body'); - if ($self->{strPageId} ne 'index') + if ($self->{strRenderOutKey} ne 'index') { - my $oPage = ${$self->{oSite}->{oSite}}{page}{'index'}; + my $oRenderOut = $self->{oManifest}->renderOutGet(RENDER_TYPE_HTML, 'index'); $oMenuBody-> addNew(HTML_DIV, 'menu')-> - addNew(HTML_A, 'menu-link', {strContent => $$oPage{strMenuTitle}, strRef => '{[backrest-url-root]}'}); + addNew(HTML_A, 'menu-link', {strContent => $$oRenderOut{menu}, strRef => '{[project-url-root]}'}); } - foreach my $strPageId(sort(keys(${$self->{oSite}->{oSite}}{page}))) + foreach my $strRenderOutKey ($self->{oManifest}->renderOutList(RENDER_TYPE_HTML)) { - if ($strPageId ne $self->{strPageId} && $strPageId ne 'index') + if ($strRenderOutKey ne $self->{strRenderOutKey} && $strRenderOutKey ne 'index') { - my $oPage = ${$self->{oSite}->{oSite}}{page}{$strPageId}; + my $oRenderOut = $self->{oManifest}->renderOutGet(RENDER_TYPE_HTML, $strRenderOutKey); $oMenuBody-> addNew(HTML_DIV, 'menu')-> - addNew(HTML_A, 'menu-link', {strContent => $$oPage{strMenuTitle}, strRef => "${strPageId}.html"}); + addNew(HTML_A, 'menu-link', {strContent => $$oRenderOut{menu}, strRef => "${strRenderOutKey}.html"}); } } @@ -284,7 +166,7 @@ sub process my $oPageFooter = $oHtmlBuilder->bodyGet()-> addNew(HTML_DIV, 'page-footer', - {strContent => ${$self->{oSite}->{oSite}}{common}{strFooter}}); + {strContent => '{[html-footer]}'}); # Return from function and log return values if any return logDebugReturn @@ -317,7 +199,7 @@ sub sectionProcess {name => 'iDepth'} ); - &log(INFO, (' ' x ($iDepth - 1)) . 'process section: ' . $oSection->paramGet('id')); + &log($iDepth == 1 ? INFO : DEBUG, (' ' x ($iDepth + 1)) . 'process section: ' . $oSection->paramGet('id')); if ($iDepth > 3) { @@ -326,7 +208,6 @@ sub sectionProcess # Working variables $strAnchor = (defined($strAnchor) ? "${strAnchor}-" : '') . $oSection->paramGet('id'); - my $oRender = $self->{oRender}; # Create the section toc element my $oSectionTocElement = new BackRestDoc::Html::DocHtmlElement(HTML_DIV, "section${iDepth}-toc"); @@ -338,7 +219,7 @@ sub sectionProcess $oSectionElement->addNew(HTML_A, undef, {strId => $strAnchor}); # Add the section title to section and toc - my $strSectionTitle = $oRender->processText($oSection->nodeGet('title')->textGet()); + my $strSectionTitle = $self->processText($oSection->nodeGet('title')->textGet()); $oSectionElement-> addNew(HTML_DIV, "section${iDepth}-title", @@ -356,7 +237,7 @@ sub sectionProcess { $oSectionElement-> addNew(HTML_DIV, "section-intro", - {strContent => $oRender->processText($oSection->textGet())}); + {strContent => $self->processText($oSection->textGet())}); } # Add the section body @@ -367,39 +248,51 @@ sub sectionProcess foreach my $oChild ($oSection->nodeList()) { - &log(INFO, (' ' x $iDepth) . 'process child ' . $oChild->nameGet()); + &log(DEBUG, (' ' x ($iDepth + 2)) . 'process child ' . $oChild->nameGet()); # Execute a command if ($oChild->nameGet() eq 'execute-list') { my $oSectionBodyExecute = $oSectionBodyElement->addNew(HTML_DIV, "execute"); my $bFirst = true; + my $strHostName = $self->{oManifest}->variableReplace($oChild->paramGet('host')); $oSectionBodyExecute-> addNew(HTML_DIV, "execute-title", - {strContent => $oRender->processText($oChild->nodeGet('title')->textGet()) . ':'}); + {strContent => "${strHostName} " . + $self->processText($oChild->nodeGet('title')->textGet())}); my $oExecuteBodyElement = $oSectionBodyExecute->addNew(HTML_DIV, "execute-body"); foreach my $oExecute ($oChild->nodeList('execute')) { - my $bExeShow = defined($oExecute->fieldGet('exe-no-show', false)) ? false : true; - my $bExeExpectedError = defined($oExecute->fieldGet('exe-err-expect', false)) ? true : false; - my ($strCommand, $strOutput) = $self->execute($oExecute, $iDepth + 1); + my $bExeShow = !$oExecute->paramTest('show', 'n'); + my $bExeExpectedError = defined($oExecute->paramGet('err-expect', false)); + + my ($strCommand, $strOutput) = $self->execute($oSection, $strHostName, $oExecute, $iDepth + 3); if ($bExeShow) { + # Add continuation chars and proper spacing + $strCommand =~ s/\n/\n /smg; + $oExecuteBodyElement-> - addNew(HTML_DIV, "execute-body-cmd" . ($bFirst ? '-first' : ''), - {strContent => $strCommand}); + addNew(HTML_PRE, "execute-body-cmd", + {strContent => $strCommand, bPre => true}); + + my $strHighLight = $self->{oManifest}->variableReplace($oExecute->fieldGet('exe-highlight', false)); + my $bHighLightFound = false; if (defined($strOutput)) { - my $strHighLight = $self->{oSite}->variableReplace($oExecute->fieldGet('exe-highlight', false)); my $bHighLightOld; - my $bHighLightFound = false; my $strHighLightOutput; + if ($oExecute->fieldTest('exe-highlight-type', 'error')) + { + $bExeExpectedError = true; + } + foreach my $strLine (split("\n", $strOutput)) { my $bHighLight = defined($strHighLight) && $strLine =~ /$strHighLight/; @@ -407,13 +300,14 @@ sub sectionProcess if (defined($bHighLightOld) && $bHighLight != $bHighLightOld) { $oExecuteBodyElement-> - addNew(HTML_DIV, 'execute-body-output' . ($bHighLightOld ? '-highlight' : '') . - ($bExeExpectedError ? '-error' : ''), {strContent => $strHighLightOutput}); + addNew(HTML_PRE, 'execute-body-output' . + ($bHighLightOld ? '-highlight' . ($bExeExpectedError ? '-error' : '') : ''), + {strContent => $strHighLightOutput, bPre => true}); undef($strHighLightOutput); } - $strHighLightOutput .= "${strLine}\n"; + $strHighLightOutput .= (defined($strHighLightOutput) ? "\n" : '') . $strLine; $bHighLightOld = $bHighLight; $bHighLightFound = $bHighLightFound ? true : $bHighLight ? true : false; @@ -422,19 +316,18 @@ sub sectionProcess if (defined($bHighLightOld)) { $oExecuteBodyElement-> - addNew(HTML_DIV, 'execute-body-output' . ($bHighLightOld ? '-highlight' : ''), - {strContent => $strHighLightOutput}); - - undef($strHighLightOutput); - } - - if ($self->{bExe} && defined($strHighLight) && !$bHighLightFound) - { - confess &log(ERROR, "unable to find a match for highlight: ${strHighLight}"); + addNew(HTML_PRE, 'execute-body-output' . + ($bHighLightOld ? '-highlight' . ($bExeExpectedError ? '-error' : '') : ''), + {strContent => $strHighLightOutput, bPre => true}); } $bFirst = true; } + + if ($self->{bExe} && $self->isRequired($oSection) && defined($strHighLight) && !$bHighLightFound) + { + confess &log(ERROR, "unable to find a match for highlight: ${strHighLight}"); + } } $bFirst = false; @@ -452,7 +345,7 @@ sub sectionProcess { $oSectionBodyElement-> addNew(HTML_DIV, 'section-body-text', - {strContent => $oRender->processText($oChild->textGet())}); + {strContent => $self->processText($oChild->textGet())}); } # Add option descriptive text elsif ($oChild->nameGet() eq 'option-description') @@ -467,17 +360,27 @@ sub sectionProcess $oSectionBodyElement-> addNew(HTML_DIV, 'section-body-text', - {strContent => $oRender->processText($oDescription)}); + {strContent => $self->processText($oDescription)}); } # Add/remove backrest config options elsif ($oChild->nameGet() eq 'backrest-config') { - $oSectionBodyElement->add($self->backrestConfigProcess($oChild, $iDepth)); + my $oConfigElement = $self->backrestConfigProcess($oSection, $oChild, $iDepth + 3); + + if (defined($oConfigElement)) + { + $oSectionBodyElement->add($oConfigElement); + } } # Add/remove postgres config options elsif ($oChild->nameGet() eq 'postgres-config') { - $oSectionBodyElement->add($self->postgresConfigProcess($oChild, $iDepth)); + my $oConfigElement = $self->postgresConfigProcess($oSection, $oChild, $iDepth + 3); + + if (defined($oConfigElement)) + { + $oSectionBodyElement->add($oConfigElement); + } } # Add a subsection elsif ($oChild->nameGet() eq 'section') @@ -488,10 +391,10 @@ sub sectionProcess $oSectionBodyElement->add($oChildSectionElement); $oSectionTocElement->add($oChildSectionTocElement); } - # Skip children that have already been processed and error on others - elsif ($oChild->nameGet() ne 'title') + # Check if the child can be processed by a parent + else { - confess &log(ASSERT, 'unable to find child type ' . $oChild->nameGet()); + $self->sectionChildProcess($oSection, $oChild, $iDepth + 1); } } @@ -515,69 +418,45 @@ sub backrestConfigProcess my ( $strOperation, + $oSection, $oConfig, $iDepth ) = logDebugParam ( OP_DOC_HTML_PAGE_BACKREST_CONFIG_PROCESS, \@_, + {name => 'oSection'}, {name => 'oConfig'}, {name => 'iDepth'} ); - # Get filename - my $strFile = $self->{oSite}->variableReplace($oConfig->paramGet('file')); + # Generate the config + my $oConfigElement; + my ($strFile, $strConfig, $bShow) = $self->backrestConfig($oSection, $oConfig, $iDepth); - &log(INFO, (' ' x $iDepth) . 'process backrest config: ' . $strFile); - - foreach my $oOption ($oConfig->nodeList('backrest-config-option')) + if ($bShow) { - my $strSection = $oOption->fieldGet('backrest-config-option-section'); - my $strKey = $oOption->fieldGet('backrest-config-option-key'); - my $strValue = $self->{oSite}->variableReplace(trim($oOption->fieldGet('backrest-config-option-value'), false)); + my $strHostName = $self->{oManifest}->variableReplace($oConfig->paramGet('host')); - if (!defined($strValue)) - { - delete(${$self->{config}}{$strFile}{$strSection}{$strKey}); + # Render the config + $oConfigElement = new BackRestDoc::Html::DocHtmlElement(HTML_DIV, "config"); - if (keys(${$self->{config}}{$strFile}{$strSection}) == 0) - { - delete(${$self->{config}}{$strFile}{$strSection}); - } + $oConfigElement-> + addNew(HTML_DIV, "config-title", + {strContent => "${strHostName}:${strFile}" . + " " . $self->processText($oConfig->nodeGet('title')->textGet())}); - &log(INFO, (' ' x ($iDepth + 1)) . "reset ${strSection}->${strKey}"); - } - else - { - ${$self->{config}}{$strFile}{$strSection}{$strKey} = $strValue; - &log(INFO, (' ' x ($iDepth + 1)) . "set ${strSection}->${strKey} = ${strValue}"); - } + my $oConfigBodyElement = $oConfigElement->addNew(HTML_DIV, "config-body"); + # + # $oConfigBodyElement-> + # addNew(HTML_DIV, "config-body-title", + # {strContent => "${strFile}:"}); + + $oConfigBodyElement-> + addNew(HTML_DIV, "config-body-output", + {strContent => $strConfig}); } - # Save the ini file - executeTest("sudo chmod 777 $strFile", {bSuppressError => true}); - iniSave($strFile, $self->{config}{$strFile}, true); - - # Generate config element - my $oConfigElement = new BackRestDoc::Html::DocHtmlElement(HTML_DIV, "config"); - - $oConfigElement-> - addNew(HTML_DIV, "config-title", - {strContent => $self->{oRender}->processText($oConfig->nodeGet('title')->textGet()) . ':'}); - - my $oConfigBodyElement = $oConfigElement->addNew(HTML_DIV, "config-body"); - - $oConfigBodyElement-> - addNew(HTML_DIV, "config-body-title", - {strContent => "${strFile}:"}); - - $oConfigBodyElement-> - addNew(HTML_DIV, "config-body-output", - {strContent => fileStringRead($strFile)}); - - executeTest("sudo chown postgres:postgres $strFile"); - executeTest("sudo chmod 640 $strFile"); - # Return from function and log return values if any return logDebugReturn ( @@ -597,97 +476,46 @@ sub postgresConfigProcess my ( $strOperation, + $oSection, $oConfig, $iDepth ) = logDebugParam ( OP_DOC_HTML_PAGE_POSTGRES_CONFIG_PROCESS, \@_, + {name => 'oSection'}, {name => 'oConfig'}, {name => 'iDepth'} ); - # Get filename - my $strFile = $self->{oSite}->variableReplace($oConfig->paramGet('file')); + # Generate the config + my $oConfigElement; + my ($strFile, $strConfig, $bShow) = $self->postgresConfig($oSection, $oConfig, $iDepth); - if (!defined(${$self->{'pg-config'}}{$strFile}{base})) + if ($bShow) { - ${$self->{'pg-config'}}{$strFile}{base} = fileStringRead($strFile); + # Render the config + my $strHostName = $self->{oManifest}->variableReplace($oConfig->paramGet('host')); + $oConfigElement = new BackRestDoc::Html::DocHtmlElement(HTML_DIV, "config"); + + $oConfigElement-> + addNew(HTML_DIV, "config-title", + {strContent => "${strHostName}:${strFile}" . + " " . $self->processText($oConfig->nodeGet('title')->textGet())}); + + my $oConfigBodyElement = $oConfigElement->addNew(HTML_DIV, "config-body"); + + # $oConfigBodyElement-> + # addNew(HTML_DIV, "config-body-title", + # {strContent => "append to ${strFile}:"}); + + $oConfigBodyElement-> + addNew(HTML_DIV, "config-body-output", + {strContent => defined($strConfig) ? $strConfig : ''}); + + $oConfig->fieldSet('actual-config', $strConfig); } - my $oConfigHash = $self->{'pg-config'}{$strFile}; - my $oConfigHashNew; - - if (!defined($$oConfigHash{old})) - { - $oConfigHashNew = {}; - $$oConfigHash{old} = {} - } - else - { - $oConfigHashNew = dclone($$oConfigHash{old}); - } - - &log(INFO, (' ' x $iDepth) . 'process postgres config: ' . $strFile); - - foreach my $oOption ($oConfig->nodeList('postgres-config-option')) - { - my $strKey = $oOption->paramGet('key'); - my $strValue = $self->{oSite}->variableReplace(trim($oOption->valueGet())); - - if ($strValue eq '') - { - delete($$oConfigHashNew{$strKey}); - - &log(INFO, (' ' x ($iDepth + 1)) . "reset ${strKey}"); - } - else - { - $$oConfigHashNew{$strKey} = $strValue; - &log(INFO, (' ' x ($iDepth + 1)) . "set ${strKey} = ${strValue}"); - } - } - - # Generate config text - my $strConfig; - - foreach my $strKey (sort(keys(%$oConfigHashNew))) - { - if (defined($strConfig)) - { - $strConfig .= "\n"; - } - - $strConfig .= "${strKey} = $$oConfigHashNew{$strKey}"; - } - - # Save the conf file - executeTest("sudo chown vagrant $strFile"); - - fileStringWrite($strFile, $$oConfigHash{base} . - (defined($strConfig) ? "\n# pgBackRest Configuration\n${strConfig}" : '')); - - executeTest("sudo chown postgres $strFile"); - - # Generate config element - my $oConfigElement = new BackRestDoc::Html::DocHtmlElement(HTML_DIV, "config"); - - $oConfigElement-> - addNew(HTML_DIV, "config-title", - {strContent => $self->{oRender}->processText($oConfig->nodeGet('title')->textGet()) . ':'}); - - my $oConfigBodyElement = $oConfigElement->addNew(HTML_DIV, "config-body"); - - $oConfigBodyElement-> - addNew(HTML_DIV, "config-body-title", - {strContent => "append to ${strFile}:"}); - - $oConfigBodyElement-> - addNew(HTML_DIV, "config-body-output", - {strContent => defined($strConfig) ? $strConfig : ''}); - - $$oConfigHash{old} = $oConfigHashNew; - # Return from function and log return values if any return logDebugReturn ( diff --git a/doc/lib/BackRestDoc/Html/DocHtmlSite.pm b/doc/lib/BackRestDoc/Html/DocHtmlSite.pm index e8adcb8b9..c05da279d 100644 --- a/doc/lib/BackRestDoc/Html/DocHtmlSite.pm +++ b/doc/lib/BackRestDoc/Html/DocHtmlSite.pm @@ -25,6 +25,7 @@ use lib dirname($0) . '/../test/lib'; use BackRestTest::Common::ExecuteTest; use BackRestDoc::Common::DocConfig; +use BackRestDoc::Common::DocManifest; use BackRestDoc::Html::DocHtmlPage; #################################################################################################################################### @@ -51,23 +52,19 @@ sub new # Assign function parameters, defaults, and log debug info ( my $strOperation, - $self->{oRender}, - $self->{oReference}, + $self->{oManifest}, $self->{strXmlPath}, $self->{strHtmlPath}, $self->{strCssFile}, - $self->{strHtmlRoot}, $self->{bExe} ) = logDebugParam ( OP_DOC_HTML_SITE_NEW, \@_, - {name => 'oRender'}, - {name => 'oReference'}, + {name => 'oManifest'}, {name => 'strXmlPath'}, {name => 'strHtmlPath'}, {name => 'strCssFile'}, - {name => 'strHtmlRoot'}, {name => 'bExe'} ); @@ -83,74 +80,6 @@ sub new or confess &log(ERROR, "unable to create path $self->{strHtmlPath}"); } - # Create the footer - $self->{strFooter} = 'Copyright © 2015' . (strftime('%Y', localtime) ne '2015' ? '-' . strftime('%Y', localtime) : '') . - ', The PostgreSQL Global Development Group, MIT License. Updated ' . - strftime('%B ', localtime) . trim(strftime('%e,', localtime)) . strftime(' %Y.', localtime); - - # Insert pages into the site hash - $self->{oSite} = - { - 'common' => - { - 'oRender' => $self->{oRender}, - 'oReference' => $self->{oReference}, - 'strFooter' => $self->{strFooter} - }, - - 'page' => - { - 'index' => - { - strMenuTitle => 'Home', - oDoc => new BackRestDoc::Common::Doc("$self->{strXmlPath}/index.xml") - }, - - 'command' => - { - strMenuTitle => 'Commands', - oDoc => $self->{oReference}->helpCommandDocGet() - }, - - 'configuration' => - { - strMenuTitle => 'Configuration', - oDoc => $self->{oReference}->helpConfigDocGet() - # } - }, - - 'user-guide' => - { - strMenuTitle => 'User Guide', - oDoc => new BackRestDoc::Common::Doc("$self->{strXmlPath}/user-guide.xml") - } - } - }; - - # Create common variables - ${$self->{var}}{version} = $VERSION; - ${$self->{var}}{'backrest-exe'} = $self->{oRender}->{strExeName}; - ${$self->{var}}{'postgres'} = 'PostgreSQL'; - ${$self->{var}}{'backrest-url-root'} = $self->{strHtmlRoot}; - ${$self->{var}}{'dash'} = '-'; - - # Read variables from pages - foreach my $strPageId (sort(keys(${$self->{oSite}}{page}))) - { - my $oPage = ${$self->{oSite}}{page}{$strPageId}; - - if (defined($$oPage{oDoc}->nodeGet('variable-list', false))) - { - foreach my $oVariable ($$oPage{oDoc}->nodeGet('variable-list')->nodeList('variable')) - { - my $strName = $oVariable->fieldGet('variable-name'); - my $strValue = $oVariable->fieldGet('variable-value'); - - ${$self->{var}}{$strName} = $self->variableReplace($strValue); - } - } - } - # Return from function and log return values if any return logDebugReturn ( @@ -159,58 +88,6 @@ sub new ); } -#################################################################################################################################### -# variableReplace -# -# Replace variables in the string. -#################################################################################################################################### -sub variableReplace -{ - my $self = shift; - my $strBuffer = shift; - - if (!defined($strBuffer)) - { - return undef; - } - - foreach my $strName (sort(keys(%{$self->{var}}))) - { - my $strValue = $self->{var}{$strName}; - - $strBuffer =~ s/\{\[$strName\]\}/$strValue/g; - } - - return $strBuffer; -} - -#################################################################################################################################### -# variableSet -# -# Set a variable to be replaced later. -#################################################################################################################################### -sub variableSet -{ - my $self = shift; - my $strKey = shift; - my $strValue = shift; - - ${$self->{var}}{$strKey} = $strValue; -} - -#################################################################################################################################### -# variableGet -# -# Get the current value of a variable. -#################################################################################################################################### -sub variableGet -{ - my $self = shift; - my $strKey = shift; - - return ${$self->{var}}{$strKey}; -} - #################################################################################################################################### # process # @@ -228,14 +105,14 @@ sub process copy($self->{strCssFile}, $strCssFileDestination) or confess &log(ERROR, "unable to copy $self->{strCssFile} to ${strCssFileDestination}"); - # Render pages - my $oSite = $self->{oSite}; - - foreach my $strPageId (sort(keys($$oSite{'page'}))) + foreach my $strPageId ($self->{oManifest}->renderOutList(RENDER_TYPE_HTML)) { + &log(INFO, " render out: ${strPageId}"); + # Save the html page fileStringWrite("$self->{strHtmlPath}/${strPageId}.html", - $self->variableReplace((new BackRestDoc::Html::DocHtmlPage($self, $strPageId, $self->{bExe}))->process()), + $self->{oManifest}->variableReplace((new BackRestDoc::Html::DocHtmlPage($self->{oManifest}, + $strPageId, $self->{bExe}))->process()), false); } diff --git a/doc/lib/BackRestDoc/Latex/DocLatex.pm b/doc/lib/BackRestDoc/Latex/DocLatex.pm new file mode 100644 index 000000000..d2b2ab8ec --- /dev/null +++ b/doc/lib/BackRestDoc/Latex/DocLatex.pm @@ -0,0 +1,137 @@ +#################################################################################################################################### +# DOC LATEX MODULE +#################################################################################################################################### +package BackRestDoc::Latex::DocLatex; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Data::Dumper; +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname); +use File::Copy; +use POSIX qw(strftime); +use Storable qw(dclone); + +use lib dirname($0) . '/../lib'; +use BackRest::Common::Log; +use BackRest::Common::String; +use BackRest::FileCommon; +use BackRest::Version; + +use lib dirname($0) . '/../test/lib'; +use BackRestTest::Common::ExecuteTest; + +use BackRestDoc::Common::DocConfig; +use BackRestDoc::Common::DocManifest; +use BackRestDoc::Latex::DocLatexSection; + +#################################################################################################################################### +# Operation constants +#################################################################################################################################### +use constant OP_DOC_LATEX => 'DocLatex'; + +use constant OP_DOC_LATEX_NEW => OP_DOC_LATEX . '->new'; +use constant OP_DOC_LATEX_PROCESS => OP_DOC_LATEX . '->process'; + +#################################################################################################################################### +# CONSTRUCTOR +#################################################################################################################################### +sub new +{ + my $class = shift; # Class name + + # Create the class hash + my $self = {}; + bless $self, $class; + + $self->{strClass} = $class; + + # Assign function parameters, defaults, and log debug info + ( + my $strOperation, + $self->{oManifest}, + $self->{strXmlPath}, + $self->{strLatexPath}, + $self->{strPreambleFile}, + $self->{bExe} + ) = + logDebugParam + ( + OP_DOC_LATEX_NEW, \@_, + {name => 'oManifest'}, + {name => 'strXmlPath'}, + {name => 'strLatexPath'}, + {name => 'strPreambleFile'}, + {name => 'bExe'} + ); + + # Remove the current html path if it exists + if (-e $self->{strLatexPath}) + { + executeTest("rm -rf $self->{strLatexPath}/*"); + } + # Else create the html path + else + { + mkdir($self->{strLatexPath}) + or confess &log(ERROR, "unable to create path $self->{strLatexPath}"); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'self', value => $self} + ); +} + +#################################################################################################################################### +# process +# +# Generate the site html +#################################################################################################################################### +sub process +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my $strOperation = logDebugParam(OP_DOC_LATEX_PROCESS); + + my $oRender = $self->{oManifest}->renderGet(RENDER_TYPE_PDF); + + # Copy the logo + copy('/backrest/doc/resource/latex/cds-logo.eps', "$self->{strLatexPath}/logo.eps") + or confess &log(ERROR, "unable to copy logo"); + + my $strLatex = $self->{oManifest}->variableReplace(fileStringRead($self->{strPreambleFile}), 'latex') . "\n"; + + foreach my $strPageId ($self->{oManifest}->renderOutList(RENDER_TYPE_PDF)) + { + &log(INFO, " render out: ${strPageId}"); + + my $oDocLatexSection = + new BackRestDoc::Latex::DocLatexSection($self->{oManifest}, $strPageId, $self->{bExe}); + + # Save the html page + $strLatex .= $oDocLatexSection->process(); + } + + $strLatex .= "\n% " . ('-' x 130) . "\n% End document\n% " . ('-' x 130) . "\n\\end{document}\n"; + + my $strLatexFileName = $self->{oManifest}->variableReplace("$self->{strLatexPath}/" . $$oRender{file} . '.tex'); + + fileStringWrite($strLatexFileName, $strLatex, false); + + executeTest("pdflatex -output-directory=$self->{strLatexPath} -shell-escape $strLatexFileName", + {bSuppressStdErr => true}); + executeTest("pdflatex -output-directory=$self->{strLatexPath} -shell-escape $strLatexFileName", + {bSuppressStdErr => true}); + + # Return from function and log return values if any + logDebugReturn($strOperation); +} + +1; diff --git a/doc/lib/BackRestDoc/Latex/DocLatexSection.pm b/doc/lib/BackRestDoc/Latex/DocLatexSection.pm new file mode 100644 index 000000000..d71f536fd --- /dev/null +++ b/doc/lib/BackRestDoc/Latex/DocLatexSection.pm @@ -0,0 +1,417 @@ +#################################################################################################################################### +# DOC LATEX SECTION MODULE +#################################################################################################################################### +package BackRestDoc::Latex::DocLatexSection; +use parent 'BackRestDoc::Common::DocExecute'; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Data::Dumper; +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname); +use File::Copy; +use Storable qw(dclone); + +use lib dirname($0) . '/../lib'; +use BackRest::Common::Ini; +use BackRest::Common::Log; +use BackRest::Common::String; +use BackRest::Config::ConfigHelp; +use BackRest::FileCommon; + +use BackRestDoc::Common::DocManifest; + +#################################################################################################################################### +# Operation constants +#################################################################################################################################### +use constant OP_DOC_LATEX_SECTION => 'DocLatexSection'; + +use constant OP_DOC_LATEX_SECTION_CONFIG_PROCESS => OP_DOC_LATEX_SECTION . '->configProcess'; +use constant OP_DOC_LATEX_SECTION_NEW => OP_DOC_LATEX_SECTION . '->new'; +use constant OP_DOC_LATEX_SECTION_PROCESS => OP_DOC_LATEX_SECTION . '->process'; +use constant OP_DOC_LATEX_SECTION_SECTION_PROCESS => OP_DOC_LATEX_SECTION . '->sectionProcess'; + +#################################################################################################################################### +# CONSTRUCTOR +#################################################################################################################################### +sub new +{ + my $class = shift; # Class name + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oManifest, + $strRenderOutKey, + $bExe + ) = + logDebugParam + ( + OP_DOC_LATEX_SECTION_NEW, \@_, + {name => 'oManifest'}, + {name => 'strRenderOutKey'}, + {name => 'bExe'} + ); + + # Create the class hash + my $self = $class->SUPER::new('latex', $oManifest, $strRenderOutKey, $bExe); + bless $self, $class; + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'self', value => $self} + ); +} + +#################################################################################################################################### +# process +# +# Generate the site html +#################################################################################################################################### +sub process +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my $strOperation = logDebugParam(OP_DOC_LATEX_SECTION_PROCESS); + + # Working variables + my $oPage = $self->{oDoc}; + my $strLatex; + + # Initialize page + my $strTitle = "{[project]}" . + (defined($oPage->paramGet('title', false)) ? ' ' . $oPage->paramGet('title') : ''); + my $strSubTitle = $oPage->paramGet('subtitle', false); + + # Render sections + foreach my $oSection ($oPage->nodeList('section')) + { + $strLatex .= (defined($strLatex) ? "\n" : '') . $self->sectionProcess($oSection, undef, 1); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'strHtml', value => $strLatex, trace => true} + ); +} + +#################################################################################################################################### +# sectionProcess +#################################################################################################################################### +sub sectionProcess +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oSection, + $strSection, + $iDepth + ) = + logDebugParam + ( + OP_DOC_LATEX_SECTION_SECTION_PROCESS, \@_, + {name => 'oSection'}, + {name => 'strSection', required => false}, + {name => 'iDepth'} + ); + + &log($iDepth == 1 ? INFO : DEBUG, (' ' x ($iDepth + 1)) . 'process section: ' . $oSection->paramGet('id')); + + # Create the section + my $strSectionTitle = $self->processText($oSection->nodeGet('title')->textGet()); + $strSection .= (defined($strSection) ? ', ' : '') . "'${strSectionTitle}' " . ('Sub' x ($iDepth - 1)) . "Section"; + + my $strLatex = + "% ${strSection}\n% " . ('-' x 130) . "\n\\"; + + if ($iDepth <= 3) + { + $strLatex .= ($iDepth > 1 ? ('sub' x ($iDepth - 1)) : '') . "section"; + } + elsif ($iDepth == 4) + { + $strLatex .= 'paragraph'; + } + else + { + confess &log(ASSERT, "section depth of ${iDepth} exceeds maximum"); + } + + $strLatex .= "\{${strSectionTitle}\}\n"; + + foreach my $oChild ($oSection->nodeList()) + { + &log(DEBUG, (' ' x ($iDepth + 2)) . 'process child ' . $oChild->nameGet()); + + # Execute a command + if ($oChild->nameGet() eq 'execute-list') + { + my $strHostName = $self->{oManifest}->variableReplace($oChild->paramGet('host')); + + $strLatex .= + "\n\\begin\{lstlisting\}[title=\{\\textnormal{\\textbf\{${strHostName}}} --- " . + $self->processText($oChild->nodeGet('title')->textGet()) . "}]\n"; + + foreach my $oExecute ($oChild->nodeList('execute')) + { + my $bExeShow = !$oExecute->paramTest('show', 'n'); + my ($strCommand, $strOutput) = $self->execute($oSection, + $self->{oManifest}->variableReplace($oChild->paramGet('host')), + $oExecute, $iDepth + 3); + + if ($bExeShow) + { + $strLatex .= "${strCommand}\n"; + + if (defined($strOutput)) + { + $strLatex .= "\nOutput:\n\n${strOutput}\n"; + } + } + } + + $strLatex .= + "\\end{lstlisting}\n"; + } + # Add code block + elsif ($oChild->nameGet() eq 'code-block') + { + my $strTitle = $oChild->paramGet("title", false); + + if (defined($strTitle) && $strTitle eq '') + { + undef($strTitle) + } + + # Begin the code listing + if (!defined($strTitle)) + { + $strLatex .= + "\\vspace{.75em}\n"; + } + + $strLatex .= + "\\begin\{lstlisting\}"; + + # Add the title if one is provided + if (defined($strTitle)) + { + $strLatex .= "[title=\{${strTitle}:\}]"; + } + + # End the code listing + $strLatex .= + "\n" . + trim($oChild->valueGet()) . "\n" . + "\\end{lstlisting}\n"; + } + # Add table + elsif ($oChild->nameGet() eq 'table') + { + my $oHeader = $oChild->nodeGet('table-header'); + my @oyColumn = $oHeader->nodeList('table-column'); + + my $strWidth = '{' . ($oHeader->paramTest('width') ? $oHeader->paramGet('width') : '\textwidth') . '}'; + + # Build the table header + $strLatex .= "\\vspace{1em}\\newline\n"; + + $strLatex .= "\\begin{tabularx}${strWidth}{ | "; + + foreach my $oColumn (@oyColumn) + { + my $strAlignCode; + my $strAlign = $oColumn->paramGet("align", false); + + if ($oColumn->paramTest('fill', 'y')) + { + if (!defined($strAlign) || $strAlign eq 'left') + { + $strAlignCode = 'X'; + } + elsif ($strAlign eq 'right') + { + $strAlignCode = 'R'; + } + else + { + confess &log(ERROR, "align '${strAlign}' not valid when fill=y"); + } + } + else + { + if (!defined($strAlign) || $strAlign eq 'left') + { + $strAlignCode = 'l'; + } + elsif ($strAlign eq 'center') + { + $strAlignCode = 'c'; + } + elsif ($strAlign eq 'right') + { + $strAlignCode = 'r'; + } + else + { + confess &log(ERROR, "align '${strAlign}' not valid"); + } + } + + # $strLatex .= 'p{' . $oColumn->paramGet("width") . '} | '; + $strLatex .= $strAlignCode . ' | '; + } + + $strLatex .= "}\n"; + + if ($oChild->nodeGet("title", false)) + { + $strLatex .= "\\caption{" . $self->processText($oChild->nodeGet("title")->textGet()) . ":}\\\\\n"; + } + + $strLatex .= "\\hline"; + $strLatex .= "\\rowcolor{ltgray}\n"; + + my $strLine; + + foreach my $oColumn (@oyColumn) + { + $strLine .= (defined($strLine) ? ' & ' : '') . '\textbf{' . $self->processText($oColumn->textGet()) . '}'; + } + + $strLatex .= "${strLine}\\\\"; + + # Build the rows + foreach my $oRow ($oChild->nodeGet('table-data')->nodeList('table-row')) + { + $strLatex .= "\\hline\n"; + undef($strLine); + + foreach my $oRowCell ($oRow->nodeList('table-cell')) + { + $strLine .= (defined($strLine) ? ' & ' : '') . $self->processText($oRowCell->textGet()); + } + + $strLatex .= "${strLine}\\\\"; + } + + $strLatex .= "\\hline\n\\end{tabularx}\n"; + } + # Add descriptive text + elsif ($oChild->nameGet() eq 'p') + { + $strLatex .= "\n" . $self->processText($oChild->textGet()) . "\n"; + } + # Add option descriptive text + elsif ($oChild->nameGet() eq 'option-description') + { + my $strOption = $oChild->paramGet("key"); + my $oDescription = ${$self->{oReference}->{oConfigHash}}{&CONFIG_HELP_OPTION}{$strOption}{&CONFIG_HELP_DESCRIPTION}; + + if (!defined($oDescription)) + { + confess &log(ERROR, "unable to find ${strOption} option in sections - try adding command?"); + } + + $strLatex .= "\n" . $self->processText($oDescription) . "\n"; + } + # Add/remove config options + elsif ($oChild->nameGet() eq 'backrest-config' || $oChild->nameGet() eq 'postgres-config') + { + $strLatex .= $self->configProcess($oSection, $oChild, $iDepth + 3); + } + # Add a subsection + elsif ($oChild->nameGet() eq 'section') + { + $strLatex .= "\n" . $self->sectionProcess($oChild, $strSection, $iDepth + 1); + } + # Check if the child can be processed by a parent + else + { + $self->sectionChildProcess($oSection, $oChild, $iDepth + 1); + } + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'strSection', value => $strLatex, trace => true} + ); +} + +#################################################################################################################################### +# configProcess +#################################################################################################################################### +sub configProcess +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $oSection, + $oConfig, + $iDepth + ) = + logDebugParam + ( + OP_DOC_LATEX_SECTION_CONFIG_PROCESS, \@_, + {name => 'oSection'}, + {name => 'oConfig'}, + {name => 'iDepth'} + ); + + # Working variables + my $strLatex = ''; + my $strFile; + my $strConfig; + my $bShow = true; + + # Generate the config + if ($oConfig->nameGet() eq 'backrest-config') + { + ($strFile, $strConfig, $bShow) = $self->backrestConfig($oSection, $oConfig, $iDepth); + } + else + { + ($strFile, $strConfig, $bShow) = $self->postgresConfig($oSection, $oConfig, $iDepth); + } + + if ($bShow) + { + my $strHostName = $self->{oManifest}->variableReplace($oConfig->paramGet('host')); + + # Replace _ in filename + $strFile = $self->variableReplace($strFile); + + # Render the config + $strLatex = + "\n\\begin\{lstlisting\}[title=\{\\textnormal{\\textbf\{${strHostName}}}:\\textnormal{\\texttt\{${strFile}}} --- " . + $self->processText($oConfig->nodeGet('title')->textGet()) . "}]\n" . + ${strConfig} . + "\\end{lstlisting}\n"; + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'strConfig', value => $strLatex, trace => true} + ); +} + +1; diff --git a/doc/manifest.xml b/doc/manifest.xml new file mode 100644 index 000000000..6aa3eb63d --- /dev/null +++ b/doc/manifest.xml @@ -0,0 +1,46 @@ + + + + + + pgBackRest + use BackRest::Version; $VERSION + pg_backrest + / + PostgreSQL + - + + + /backrest/doc/output/latex/logo + + + + use POSIX qw(strftime); 'Copyright &copy; 2015' . (strftime('%Y', localtime) ne '2015' ? '-' . strftime('%Y', localtime) : '') . + ', The PostgreSQL Global Development Group, <a href="{[github-url-license]}">MIT License</a>. Updated ' . + strftime('%B ', localtime) . trim(strftime('%e,', localtime)) . strftime(' %Y.', localtime) + + + {[project]} User Guide + Open Source PostgreSQL Backup and Restore Utility + CrunchyBackRest-UserGuide-{[version]} + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/css/default.css b/doc/resource/html/default.css similarity index 79% rename from doc/css/default.css rename to doc/resource/html/default.css index b07c822cb..df2281f47 100644 --- a/doc/css/default.css +++ b/doc/resource/html/default.css @@ -17,6 +17,7 @@ body margin: 0px auto; padding: 0px; width: 100%; + text-align: justify; } @media (min-width: 1000px) @@ -43,7 +44,6 @@ Header { width:100%; text-align:center; - /*float:left;*/ } .page-header-title @@ -63,24 +63,19 @@ Header /******************************************************************************* Menu *******************************************************************************/ -.page-menu -{ - /*margin-top: .25em;*/ - /*font-size: 14pt;*/ -} +/*.page-menu*/ .menu-body { text-align: center; - /*font-weight: 600;*/ - /*border-bottom: 2px #dddddd solid;*/ } .menu { white-space: nowrap; display: inline; - margin-left: 6px; + margin-left: .5em; + font-size: 13pt; } .menu:first-of-type @@ -91,20 +86,14 @@ Menu .menu:before { content: "["; - /*margin-right: .5em;*/ } .menu:after { content: "]"; - /*margin-left: .5em;*/ } -.menu-link -{ - /*margin-left: 2px; - margin-right: 2px;*/ -} +/*.menu-link*/ a.menu-link:link, a.menu-link:visited, a.menu-link:active { @@ -122,6 +111,7 @@ Table of Contents .page-toc-body { margin-top: .25em; + margin-bottom: 2em; } .section1-toc:first-of-type @@ -156,46 +146,51 @@ Section *******************************************************************************/ .section1 { - /*display:block;*/ + margin-top: 2.5em; +} + +.section1:first-of-type +{ margin-top: 1em; } .section2, .section3 { - /*display:block;*/ - margin-top: .5em; + margin-top: 1em; } .section1-title, .section2-title, .section3-title, .page-toc-title { - /*display:block;*/ margin-top: .5em; font-weight: 500; } .section1-title, .page-toc-title { - background-color: #dddddd; - font-size: 16pt; + border-radius: 3px; + background-color: #396a93; + color: #f8f8f8; + font-size: 22pt; padding-left: .5em; + margin-bottom: .5em; } .section2 { - /*margin-left: 2em;*/ + margin-top: 1em; } .section2-title { - border-bottom: 2px #cccccc solid; - font-size: 14pt; + border-bottom: 2px #396a93 solid; + color: #396a93; + font-size: 16pt; } .section3 { margin-left: 1em; margin-top: 1em; - /*border-top: 1px #cccccc solid;*/ } .section3:first-of-type @@ -206,9 +201,9 @@ Section .section3-title { display: inline; - font-size: 13pt; - /*text-decoration: underline;*/ - border-bottom: 1px #bbbbbb solid; + font-size: 14pt; + color: #396a93; + border-bottom: 1px #396a93 solid; } .section-intro @@ -216,9 +211,7 @@ Section margin-top: .75em; } -.section-body -{ -} +/*.section-body*/ /******************************************************************************* Config, Execute, and Code Block Elements @@ -240,7 +233,7 @@ Config, Execute, and Code Block Elements /*white-space: nowrap;*/ margin-left: 1em; margin-right: 1em; - margin-top: 1em; + margin-top: .8em; margin-bottom: 1em; } @@ -255,15 +248,16 @@ Config, Execute, and Code Block Elements .config-body, .code-block { + border-radius: 3px; background-color: #444444; - /*overflow-x:auto;*/ font-family: monospace; unicode-bidi: embed; - color: white; + color: #f8f8f8; + /*color: white;*/ font-size: 10pt; } -.execute-body-cmd-first, .execute-body-cmd, +.execute-body-cmd, .execute-body-output, .execute-body-output-highlight, .config-body-title, .code-block @@ -272,16 +266,31 @@ Config, Execute, and Code Block Elements padding-right: .5em; } -.execute-body-cmd-first, .execute-body-output, +/* Would rather not use pre at all, but Firefox won't copy code samples correctly without it */ +pre +{ + margin: 0px; + padding: 0px; + white-space: pre-wrap; +} + +.execute-body-cmd:before +{ + content: "$ "; +} + +.execute-body-cmd:first-of-type, .execute-body-output, .config-body-title, .config-body-output, -.code-block +.code-block, +.execute-body-output-highlight, .execute-body-output-highlight-error { padding-top: .25em; } -.execute-body-cmd-first, .execute-body-cmd, .execute-body-output, +.execute-body-cmd, .execute-body-output, .config-body-title, .config-body-output, -.code-block +.code-block, +.execute-body-output-highlight, .execute-body-output-highlight-error { padding-bottom: .25em; } @@ -290,32 +299,31 @@ Config, Execute, and Code Block Elements .config-body-output, .code-block { + border-radius: 3px; background-color: #606060; } .execute-body-output-highlight { - background-color: green; + border-radius: 3px; + background-color: #1e7b1e; } .execute-body-output-highlight-error { - background-color: firebrick; + border-radius: 3px; + background-color: #a32929; } .execute-body-output, .execute-body-output-highlight, .execute-body-output-highlight-error, .config-body-output { - padding-left: 2em; + padding-left: 1.75em; } -.code-block -{ -} +/*.code-block*/ -.section-body-execute-output -{ -} +/*.section-body-execute-output*/ /******************************************************************************* Keywords @@ -325,14 +333,16 @@ Keywords font-weight: 500; } +.host +{ + font-weight: 700; +} + .path, .br-option, .br-setting, .pg-option, .pg-setting, .id, .user, .file, .path { - /*font-weight: 600;*/ - /*background-color: #e8e8e8;*/ unicode-bidi: embed; font-family: monospace; white-space: nowrap; - /*font-size: 11pt;*/ } /******************************************************************************* diff --git a/doc/resource/latex/cds-logo.eps b/doc/resource/latex/cds-logo.eps new file mode 100644 index 000000000..0ec500080 --- /dev/null +++ b/doc/resource/latex/cds-logo.eps @@ -0,0 +1,6131 @@ +%!PS-Adobe-3.1 EPSF-3.0 +%ADO_DSC_Encoding: MacOS Roman +%%Title: cds-logo.eps +%%Creator: Adobe Illustrator(R) 13.0 +%%CreationDate: 12/19/14 +%%BoundingBox: 0 0 395 119 +%%HiResBoundingBox: 0 0 394.9766 118.4248 +%%CropBox: 0 0 394.9766 118.4248 +%%LanguageLevel: 2 +%%DocumentData: Clean7Bit +%ADOBeginClientInjection: DocumentHeader "AI11EPS" +%%AI8_CreatorVersion: 13.0.0 %AI9_PrintingDataBegin %ADO_BuildNumber: Adobe Illustrator(R) 13.0.0 x406 R agm 4.4378 ct 5.1039 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 128 40 8 %%BeginData: 7628 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1AFFA852FD7EFF282752FD7CFFA82727277DFFA87E527DFD0752 %7D7DA8A8FD27FFA9FD43FFA8F827F82727525253527E7DA87DA87D7D5252 %2727277D7DFD1BFFA8A87D7D525227522727F8272752527D7DA8A8FD3BFF %52275253A8A8FD07FFA8FF7D527DFFA8845227277DA8FD15FF7D7D522720 %2727272027275227525252FD04272027275252A8A8FD35FF7D277DA8FFFD %05A8FFFFA8525227275252A8A8A8FFA87D2727277DA8FD0DFFA87E5227F8 %27F827527D7DA8A8AFA8FD07FFA8FFA8A87D7D5227F82727527DA9FD2FFF %7D5227A8A8FFA8FFA8FFA8FFFFFFA8522727275227FD04A8AFA8FFA87D27 %2752A8FD08FF7E7DFD0427527DA8FD19FF7D7D2727F82753A8FD2AFF7DF8 %2752FD05A87D7D7DA8FFFFFFA852522727F8277DA8A8FFA8FFA8FFFFFF7D %52F8277DA87D7D5252F827F85253A8FD20FFA8A85252F82752A8FD26FF7D %27A8A8FFFD04A82752A8FD05FFA8A8A87D272752FD05FFAFAFAFFD04FFAF %522720272727202752FD29FF7D5327527DFD24FF2027A8FFFD04A8272752 %7D27A8FFA8A8FFFFA828527DFFFFFF3C1B141B14151461AFFFFFFFA852F8 %7DA87D522752FD2BFF7D52527DA8FD20FFA827F8527DA87DFF7D27F82727 %2752FF7D27527D272727FFFF85141B1415141B1415141B85FD04FFA87EFF %FFFFA87DA8FD2DFF7DA8A8FD1FFFA8F827F827F87DA87DF827F85227277D %FF27277DA85252FF8514141415141414151414141584FFA8AFA9AFA8FD06 %FFAFA8FD05FFA9AFA8FFA9AFFD06FFA9AFA8FD06FFAF84AFA9FD05FFA8AF %A9FD04FFAFA8AFA9AFA8FD06FFAFA8AFFD13FFA8272027277DA8A8272720 %527D52277DA87DA8FD04FFAF1415141561AFFFFFA93D14151415A9AF1415 %141B141B36FFFFFF141514FFFFFF851514AF85151485FD05FF1B141BFD04 %FF851B1415141536AFFFFFFF1B141BFD04FF141514AF141514FD04FFAF14 %1514FD13FFA8F8272E7DA8A82727F827F8522727537DFD05A8FFFD041484 %FD06FF8514141461841414140EFD0414FFFF140E3DFFFFFF85141484A914 %1414AFFD04FF141414FFFFFFFD04140EFD041485FFFF141414FD04FF140E %15FF360E1484FFFFFF14141485FD13FF522752527DFF7D27F8FD04277D7D %59A8FFA8A8A8FF8514141485FD09FFAFFFFFA9141514615A15141436FF14 %1436FFFFFF841414A98415141414FD04FF151415FFFF1414141536855A15 %14141485FF141415FD04FF141414FFA914143DFFFF84151437FD12FFAF27 %27522752FFA8A8F827F82752A859527DFFFD04A8FF610E1414FD0DFF8414 %0E85FFFFA8140E14A8140E36FFFFFF850E1484850E140E145AFFFFFF1414 %14FF5A140E14A8FD04FF850E140EA9141414FFFFFFA9140E14FFFF14140E %AFFF360E1484FD11FFA827527D2752FFFFA85227202752FF7D7DA8FFA8FF %A8A8A8FF5A140E85FD0DFFA90E1460FFFFFF5A1414AF141436FFFFFF8414 %14A9841414140E14A9FFFF371436A9141414A9FD06FFAF84AFA9140E37FD %04FF141414FFFFA90E145AAF0E1436FD0CFFA8FFAFFFA852F85252527DFF %A8A87DFFA82727A8A8FF7D7DA8A87DA8A8A8FF5A0E145AFD0DFF84140D85 %FFFFFF360E1484140E36FFFFFF850D1484850D140E140D36FFFF0E143685 %0D145AFD0BFF0E140EA984A984140E14FFFFFF140D1414140DA9FD0AFF7D %F8FD06527D52527DA87D7DA8AFA8FF7DA8FFFF5252847D27A8A8FFFFFF5A %140E85FD0DFFA90E145AAFA95A0E1414FF0E1436FFFFFF84140EA984140E %8536140E85FF360E5A5A140EA9FD0AFFAF140E140E140E140E1414FFFFFF %84140E140E36FD0AFFA8F87DA8A87D527DFFFFFF7D27F87DFD07A8FF2727 %522727A8FFFFA8FFFF5A0D140EFD0DFF84140D0E0D140D0E0DA9FF140D5A %FFFFFF850D0E7EA90D0E7EAF0D0E0DA9300E307E0D0E84FD0BFF0D140D0E %0D0E0D0E0D36FD04FF0D0E0D0E84FD0AFF7D27A8FFA85252FD05FFA87DFF %FFA8A9A8AFA8FF2752522753FFFFFFA8FFA8FF84140E147EFD09FFA9AFA9 %A90E140E140E1430A9FFFF0E1436FFFFFF84140DA984140DA9FF850D140E %360D5A84140D85FD0BFF360E145A855A5A0E1436FD04FF850D1436FD0AFF %7D2752A8A87D20A8FD07FFFD06A8FF522752277DFFFD07A8FF2F0E0D0E7E %FD06FF7E0D140D5A840E0D0E0D0E0DFFFFFFAF0E0D5AFFFFFF850D0E7EA9 %0D0E7EFFFF360D0E0D0E2FAF0D0E0DFD07FFA8AFA8A90D0E30FD04FF360D %36FD04FF7E0E0D85FD09FF7D277DFFA87DF852A8A8A8FFFFFFA8AFA8A8A8 %FFFFFFA852A8527DFFA8A8A8FF7D7DA8FFFFA90D140D0E5AA9A9AF7E5A0D %0E0D14A9A90D0E7E5A0D0E5AFFFFFF300E0DFFFFFF300E0DAF840E0D85FF %FFA90E0D140D36FF5A0D0E30FD05FF7E0E0D1484360D36FD04FF300E30FD %04FF850D0E7EFD08FFA82752FFA87DF827F8FD0AA8FD04FFA8847E52FFA8 %A8A87D27527DFD04FF840D0E0D0D0D0E0D0E0D0E0D0E7EFF840E0784FF0E %0D0E7EFFFF5A0D0E0D7E300E0D30FF840D0E7EFFFFFF5A0D0D0E2FFFA830 %0D0E0D7E7E7E2F0E0D0D5AFF0D0E0DFFFFFFA9360D30A9FFFFFF7E0E0D84 %FD08FF7D2727525227272027277DA8AFA8A87DA8A8FD07FFA8A8A8FFA8A8 %5227A8FD06FFA90D0E0D0E0D0E0D0E0D36A8FFFFA90D0E7EFF840E0D0EA8 %FFA90E0D0E0D0E0D0E7EFF7E0E0D85FD04FF300E0D36FFFFA9360D0E0D0E %0D0E0D0E5AFFFF300D36FD04FF300E2FFD04FF850D0E7EFD04FFA87D5252 %F827F827F827F827F827F827F827F82727A8A8FD04FFFD09A8F8A8FD08FF %5A300D0E0D0E2F7EAFFFFFFF840D077EFFFF5A0E0D30A9FFA8300D0E0D30 %7EFFFF84070E7EFD04FFA90D0E2FFFFFFFA95A0D0E0D0D0D367EFFFFFF0D %0D2FFD04FF360D30FD04FF7E0E0D84FD05FFA8FFA8FD12527E7DA8FFFFA8 %FFA8FFA8FFA8FFA87DA8FD0BFFA8AFA9FD07FFA8A9A9FFFFFFA8A9A8FD04 %FFA97EA9FD04FFAFA9A8FD06FFAF84AFFD06FF84A984AFFD05FFA9A8A9FD %04FFA8A9A9FD05FFA8A9AFFD1AFFA8FFA8FFA8FD24FFA8A8FD0DFFA9FD23 %FFA8FD2BFFA87D7D7D84FD06FFA8A8A8FD13FF7D7DFD0CFFA8FD047DFD0B %FFA8A8A8FD10FFA87D7D7DFFFFA87D7DA8FFA87DA8FD20FF7D537D847DFD %06FF7D52A8FD14FFA8FD0CFF7E527D7D527DFFFFFFAFFD06FFA852A8FD0F %FFA8527D7D7DA87D52A87D527DA8527EFD20FFA852FFFFFFA8FD047DA852 %7D52FFA87D52A8FF7D7D7D7E7D537D7DFF7D7D7DA87D7DFF7E527DA8FF7D %7D7DFFFFFF7D52A8FF527DA9A8527D7DFFA87D527D7D7D52A8A87D527D7D %A8527D7DFF7D7D7DFF7D527EFFFFA8527DFFFFFD057DFD20FF7D52527D7D %A8277D53527D7D52A87D527D7D52A8525252A8527D7D527D7D28527D5252 %A8277DA8A859527D7D52FFFFA828A87D52527D27A87D527D5252A8A87D52 %7DA8527DA82E847D5252A87D527D7D53A8525252FF7D527DFFFF7D527D52 %7DFD20FFA8527D7DA87D52A8FF27A87D52A8A8527D52527D7D52FFA8527E %FF527D7D52A8FF527DA85252A8A87D527D5252A8FF7DFD0452FF7D52FFFF %527E7D5259FFA852A8FF527D7D52A8A827A8FF53527D5252FFFF7D52527E %27A8FFFF7D527D527DFD20FF7D52A8FFFF7E27A8A8527D7E27FF7D527DA8 %7DA8527DFFA827A8FF52527D27FFFF5252FFA87D277D52527DA87DFFFF7D %277DA8FFFF7D27FFA8277DFF7D5252A827A8FF7D27527DFF7D52A8FF5252 %7DA87DFFFFFFFD045259FFFF52527D277DFD20FF7E277D7D847D2784FF27 %7D7D277DA8277DA87E7D5252FF7D527D7D27A87D52A8FF277D7DA87D277D %7D277D7D7DFFFF7D27A8FFFFFF7D277D7D277D7DA852527D5252A9595253 %A8FF7D27A8FF7D277D7DA8527D7D5252FF52527D7D27A8A827527D52FD1E %FF7DFD04527D27A8A8527DA82752A8A8272752A8527DFFA82752527DFF7D %28A8FF525284275252FFA87D272752FFFF7D27A8FD04FF5352277EA85227 %527DFF52277D522727277E7D52A8FFA87D27277DA8272852A8FFA85227F8 %27A8A852522752FD35FF7D277DFD28FFA820A8A82752FD12FF7E27277DFD %39FF7DF87DFD28FFA852275227A8FD14FF52A8FD39FFA87DA8FD2AFFA87D %FD50FFA8FFFFFFA8FD46FFFF %%EndData +%ADOEndClientInjection: DocumentHeader "AI11EPS" +%%Pages: 1 +%%DocumentNeededResources: +%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 +%%+ procset Adobe_CoolType_Utility_T42 1.0 0 +%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 +%%+ procset Adobe_CoolType_Core 2.31 0 +%%+ procset Adobe_AGM_Core 2.0 0 +%%+ procset Adobe_AGM_Utils 1.0 0 +%%DocumentFonts: +%%DocumentNeededFonts: +%%DocumentNeededFeatures: +%%DocumentSuppliedFeatures: +%%DocumentProcessColors: Cyan Magenta Black +%%DocumentCustomColors: +%%CMYKCustomColor: +%%RGBCustomColor: +%%EndComments + + + + + + +%%BeginDefaults +%%ViewingOrientation: 1 0 0 1 +%%EndDefaults +%%BeginProlog +%%BeginResource: procset Adobe_AGM_Utils 1.0 0 +%%Version: 1.0 0 +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{currentpacking true setpacking}if +userdict/Adobe_AGM_Utils 73 dict dup begin put +/bdf +{bind def}bind def +/nd{null def}bdf +/xdf +{exch def}bdf +/ldf +{load def}bdf +/ddf +{put}bdf +/xddf +{3 -1 roll put}bdf +/xpt +{exch put}bdf +/ndf +{ + exch dup where{ + pop pop pop + }{ + xdf + }ifelse +}def +/cdndf +{ + exch dup currentdict exch known{ + pop pop + }{ + exch def + }ifelse +}def +/gx +{get exec}bdf +/ps_level + /languagelevel where{ + pop systemdict/languagelevel gx + }{ + 1 + }ifelse +def +/level2 + ps_level 2 ge +def +/level3 + ps_level 3 ge +def +/ps_version + {version cvr}stopped{-1}if +def +/set_gvm +{currentglobal exch setglobal}bdf +/reset_gvm +{setglobal}bdf +/makereadonlyarray +{ + /packedarray where{pop packedarray + }{ + array astore readonly}ifelse +}bdf +/map_reserved_ink_name +{ + dup type/stringtype eq{ + dup/Red eq{ + pop(_Red_) + }{ + dup/Green eq{ + pop(_Green_) + }{ + dup/Blue eq{ + pop(_Blue_) + }{ + dup()cvn eq{ + pop(Process) + }if + }ifelse + }ifelse + }ifelse + }if +}bdf +/AGMUTIL_GSTATE 22 dict def +/get_gstate +{ + AGMUTIL_GSTATE begin + /AGMUTIL_GSTATE_clr_spc currentcolorspace def + /AGMUTIL_GSTATE_clr_indx 0 def + /AGMUTIL_GSTATE_clr_comps 12 array def + mark currentcolor counttomark + {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop + /AGMUTIL_GSTATE_fnt rootfont def + /AGMUTIL_GSTATE_lw currentlinewidth def + /AGMUTIL_GSTATE_lc currentlinecap def + /AGMUTIL_GSTATE_lj currentlinejoin def + /AGMUTIL_GSTATE_ml currentmiterlimit def + currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf + /AGMUTIL_GSTATE_sa currentstrokeadjust def + /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def + /AGMUTIL_GSTATE_op currentoverprint def + /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def + /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def + currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf + cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf + /AGMUTIL_GSTATE_ht currenthalftone def + /AGMUTIL_GSTATE_flt currentflat def + end +}def +/set_gstate +{ + AGMUTIL_GSTATE begin + AGMUTIL_GSTATE_clr_spc setcolorspace + AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor + AGMUTIL_GSTATE_fnt setfont + AGMUTIL_GSTATE_lw setlinewidth + AGMUTIL_GSTATE_lc setlinecap + AGMUTIL_GSTATE_lj setlinejoin + AGMUTIL_GSTATE_ml setmiterlimit + AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash + AGMUTIL_GSTATE_sa setstrokeadjust + AGMUTIL_GSTATE_clr_rnd setcolorrendering + AGMUTIL_GSTATE_op setoverprint + AGMUTIL_GSTATE_bg cvx setblackgeneration + AGMUTIL_GSTATE_ucr cvx setundercolorremoval + AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx + AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer + AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or + { + currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne + { + mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark + }if + }{ + AGMUTIL_GSTATE_ht sethalftone + }ifelse + AGMUTIL_GSTATE_flt setflat + end +}def +/get_gstate_and_matrix +{ + AGMUTIL_GSTATE begin + /AGMUTIL_GSTATE_ctm matrix currentmatrix def + end + get_gstate +}def +/set_gstate_and_matrix +{ + set_gstate + AGMUTIL_GSTATE begin + AGMUTIL_GSTATE_ctm setmatrix + end +}def +/AGMUTIL_str256 256 string def +/AGMUTIL_src256 256 string def +/AGMUTIL_dst64 64 string def +/AGMUTIL_srcLen nd +/AGMUTIL_ndx nd +/AGMUTIL_cpd nd +/capture_cpd{ + //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf +}def +/thold_halftone +{ + level3 + {sethalftone currenthalftone} + { + dup/HalftoneType get 3 eq + { + sethalftone currenthalftone + }{ + begin + Width Height mul{ + Thresholds read{pop}if + }repeat + end + currenthalftone + }ifelse + }ifelse +}def +/rdcmntline +{ + currentfile AGMUTIL_str256 readline pop + (%)anchorsearch{pop}if +}bdf +/filter_cmyk +{ + dup type/filetype ne{ + exch()/SubFileDecode filter + }{ + exch pop + } + ifelse + [ + exch + { + AGMUTIL_src256 readstring pop + dup length/AGMUTIL_srcLen exch def + /AGMUTIL_ndx 0 def + AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ + 1 index exch get + AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put + /AGMUTIL_ndx AGMUTIL_ndx 1 add def + }for + pop + AGMUTIL_dst64 0 AGMUTIL_ndx getinterval + } + bind + /exec cvx + ]cvx +}bdf +/filter_indexed_devn +{ + cvi Names length mul names_index add Lookup exch get +}bdf +/filter_devn +{ + 4 dict begin + /srcStr xdf + /dstStr xdf + dup type/filetype ne{ + 0()/SubFileDecode filter + }if + [ + exch + [ + /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx + currentdict/srcStr get/readstring cvx/pop cvx + /dup cvx/length cvx 0/gt cvx[ + Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx + names_index Names length currentdict/srcStr get length 1 sub{ + 1/index cvx/exch cvx/get cvx + currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx + Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx + }for + currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx + ]cvx/if cvx + /end cvx + ]cvx + bind + /exec cvx + ]cvx + end +}bdf +/AGMUTIL_imagefile nd +/read_image_file +{ + AGMUTIL_imagefile 0 setfileposition + 10 dict begin + /imageDict xdf + /imbufLen Width BitsPerComponent mul 7 add 8 idiv def + /imbufIdx 0 def + /origDataSource imageDict/DataSource get def + /origMultipleDataSources imageDict/MultipleDataSources get def + /origDecode imageDict/Decode get def + /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def + imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse + { + /imbufCnt imageDict/DataSource get length def + /imbufs imbufCnt array def + 0 1 imbufCnt 1 sub{ + /imbufIdx xdf + imbufs imbufIdx imbufLen string put + imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put + }for + DeviceN_PS2{ + imageDict begin + /DataSource[DataSource/devn_sep_datasource cvx]cvx def + /MultipleDataSources false def + /Decode[0 1]def + end + }if + }{ + /imbuf imbufLen string def + Indexed_DeviceN level3 not and DeviceN_NoneName or{ + /srcDataStrs[imageDict begin + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi string + }repeat + end]def + imageDict begin + /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def + /Decode[0 1]def + end + }{ + imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put + imageDict/Decode[0 1]put + }ifelse + }ifelse + imageDict exch + load exec + imageDict/DataSource origDataSource put + imageDict/MultipleDataSources origMultipleDataSources put + imageDict/Decode origDecode put + end +}bdf +/write_image_file +{ + begin + {(AGMUTIL_imagefile)(w+)file}stopped{ + false + }{ + Adobe_AGM_Utils/AGMUTIL_imagefile xddf + 2 dict begin + /imbufLen Width BitsPerComponent mul 7 add 8 idiv def + MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{ + /imbuf imbufLen string def + }if + 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ + pop + MultipleDataSources{ + 0 1 DataSource length 1 sub{ + DataSource type dup + /arraytype eq{ + pop DataSource exch gx + }{ + /filetype eq{ + DataSource exch get imbuf readstring pop + }{ + DataSource exch get + }ifelse + }ifelse + AGMUTIL_imagefile exch writestring + }for + }{ + DataSource type dup + /arraytype eq{ + pop DataSource exec + }{ + /filetype eq{ + DataSource imbuf readstring pop + }{ + DataSource + }ifelse + }ifelse + AGMUTIL_imagefile exch writestring + }ifelse + }for + end + true + }ifelse + end +}bdf +/close_image_file +{ + AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile +}def +statusdict/product known userdict/AGMP_current_show known not and{ + /pstr statusdict/product get def + pstr(HP LaserJet 2200)eq + pstr(HP LaserJet 4000 Series)eq or + pstr(HP LaserJet 4050 Series )eq or + pstr(HP LaserJet 8000 Series)eq or + pstr(HP LaserJet 8100 Series)eq or + pstr(HP LaserJet 8150 Series)eq or + pstr(HP LaserJet 5000 Series)eq or + pstr(HP LaserJet 5100 Series)eq or + pstr(HP Color LaserJet 4500)eq or + pstr(HP Color LaserJet 4600)eq or + pstr(HP LaserJet 5Si)eq or + pstr(HP LaserJet 1200 Series)eq or + pstr(HP LaserJet 1300 Series)eq or + pstr(HP LaserJet 4100 Series)eq or + { + userdict/AGMP_current_show/show load put + userdict/show{ + currentcolorspace 0 get + /Pattern eq + {false charpath f} + {AGMP_current_show}ifelse + }put + }if + currentdict/pstr undef +}if +/consumeimagedata +{ + begin + AGMIMG_init_common + currentdict/MultipleDataSources known not + {/MultipleDataSources false def}if + MultipleDataSources + { + DataSource 0 get type + dup/filetype eq + { + 1 dict begin + /flushbuffer Width cvi string def + 1 1 Height cvi + { + pop + 0 1 DataSource length 1 sub + { + DataSource exch get + flushbuffer readstring pop pop + }for + }for + end + }if + dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and + { + Width Height mul cvi + { + 0 1 DataSource length 1 sub + {dup DataSource exch gx length exch 0 ne{pop}if}for + dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if + } + { + /DataSource load type + dup/filetype eq + { + 1 dict begin + /flushbuffer Width Decode length 2 idiv mul cvi string def + 1 1 Height{pop DataSource flushbuffer readstring pop pop}for + end + }if + dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and + { + Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul + { + DataSource length dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if + }ifelse + end +}bdf +/addprocs +{ + 2{/exec load}repeat + 3 1 roll + [5 1 roll]bind cvx +}def +/modify_halftone_xfer +{ + currenthalftone dup length dict copy begin + currentdict 2 index known{ + 1 index load dup length dict copy begin + currentdict/TransferFunction known{ + /TransferFunction load + }{ + currenttransfer + }ifelse + addprocs/TransferFunction xdf + currentdict end def + currentdict end sethalftone + }{ + currentdict/TransferFunction known{ + /TransferFunction load + }{ + currenttransfer + }ifelse + addprocs/TransferFunction xdf + currentdict end sethalftone + pop + }ifelse +}def +/clonearray +{ + dup xcheck exch + dup length array exch + Adobe_AGM_Core/AGMCORE_tmp -1 ddf + { + Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf + dup type/dicttype eq + { + Adobe_AGM_Core/AGMCORE_tmp get + exch + clonedict + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + dup type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_tmp get exch + clonearray + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + exch dup + Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put + }forall + exch{cvx}if +}bdf +/clonedict +{ + dup length dict + begin + { + dup type/dicttype eq + {clonedict}if + dup type/arraytype eq + {clonearray}if + def + }forall + currentdict + end +}bdf +/DeviceN_PS2 +{ + /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and +}bdf +/Indexed_DeviceN +{ + /indexed_colorspace_dict AGMCORE_gget dup null ne{ + dup/CSDBase known{ + /CSDBase get/CSD get_res/Names known + }{ + pop false + }ifelse + }{ + pop false + }ifelse +}bdf +/DeviceN_NoneName +{ + /Names where{ + pop + false Names + { + (None)eq or + }forall + }{ + false + }ifelse +}bdf +/DeviceN_PS2_inRip_seps +{ + /AGMCORE_in_rip_sep where + { + pop dup type dup/arraytype eq exch/packedarraytype eq or + { + dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and + { + /currentcolorspace exch AGMCORE_gput + false + }{ + true + }ifelse + }{ + true + }ifelse + }{ + true + }ifelse +}bdf +/base_colorspace_type +{ + dup type/arraytype eq{0 get}if +}bdf +/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse +{ + /pdfmark_5{cleartomark}bind def +}{ + /pdfmark_5{pdfmark}bind def +}ifelse +/ReadBypdfmark_5 +{ + currentfile exch 0 exch/SubFileDecode filter + /currentdistillerparams where + {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse + {flushfile cleartomark} + {/PUT pdfmark}ifelse +}bdf +/xpdfm +{ + { + dup 0 get/Label eq + { + aload length[exch 1 add 1 roll/PAGELABEL + }{ + aload pop + [{ThisPage}<<5 -2 roll>>/PUT + }ifelse + pdfmark_5 + }forall +}bdf +/ds{ + Adobe_AGM_Utils begin +}bdf +/dt{ + currentdict Adobe_AGM_Utils eq{ + end + }if +}bdf +systemdict/setpacking known +{setpacking}if +%%EndResource +%%BeginResource: procset Adobe_AGM_Core 2.0 0 +%%Version: 2.0 0 +%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{ + currentpacking + true setpacking +}if +userdict/Adobe_AGM_Core 209 dict dup begin put +/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def +/AGMCORE_str256 256 string def +/AGMCORE_save nd +/AGMCORE_graphicsave nd +/AGMCORE_c 0 def +/AGMCORE_m 0 def +/AGMCORE_y 0 def +/AGMCORE_k 0 def +/AGMCORE_cmykbuf 4 array def +/AGMCORE_screen[currentscreen]cvx def +/AGMCORE_tmp 0 def +/AGMCORE_&setgray nd +/AGMCORE_&setcolor nd +/AGMCORE_&setcolorspace nd +/AGMCORE_&setcmykcolor nd +/AGMCORE_cyan_plate nd +/AGMCORE_magenta_plate nd +/AGMCORE_yellow_plate nd +/AGMCORE_black_plate nd +/AGMCORE_plate_ndx nd +/AGMCORE_get_ink_data nd +/AGMCORE_is_cmyk_sep nd +/AGMCORE_host_sep nd +/AGMCORE_avoid_L2_sep_space nd +/AGMCORE_distilling nd +/AGMCORE_composite_job nd +/AGMCORE_producing_seps nd +/AGMCORE_ps_level -1 def +/AGMCORE_ps_version -1 def +/AGMCORE_environ_ok nd +/AGMCORE_CSD_cache 0 dict def +/AGMCORE_currentoverprint false def +/AGMCORE_deltaX nd +/AGMCORE_deltaY nd +/AGMCORE_name nd +/AGMCORE_sep_special nd +/AGMCORE_err_strings 4 dict def +/AGMCORE_cur_err nd +/AGMCORE_current_spot_alias false def +/AGMCORE_inverting false def +/AGMCORE_feature_dictCount nd +/AGMCORE_feature_opCount nd +/AGMCORE_feature_ctm nd +/AGMCORE_ConvertToProcess false def +/AGMCORE_Default_CTM matrix def +/AGMCORE_Default_PageSize nd +/AGMCORE_Default_flatness nd +/AGMCORE_currentbg nd +/AGMCORE_currentucr nd +/AGMCORE_pattern_paint_type 0 def +/knockout_unitsq nd +currentglobal true setglobal +[/CSA/Gradient/Procedure] +{ + /Generic/Category findresource dup length dict copy/Category defineresource pop +}forall +setglobal +/AGMCORE_key_known +{ + where{ + /Adobe_AGM_Core_Id known + }{ + false + }ifelse +}ndf +/flushinput +{ + save + 2 dict begin + /CompareBuffer 3 -1 roll def + /readbuffer 256 string def + mark + { + currentfile readbuffer{readline}stopped + {cleartomark mark} + { + not + {pop exit} + if + CompareBuffer eq + {exit} + if + }ifelse + }loop + cleartomark + end + restore +}bdf +/getspotfunction +{ + AGMCORE_screen exch pop exch pop + dup type/dicttype eq{ + dup/HalftoneType get 1 eq{ + /SpotFunction get + }{ + dup/HalftoneType get 2 eq{ + /GraySpotFunction get + }{ + pop + { + abs exch abs 2 copy add 1 gt{ + 1 sub dup mul exch 1 sub dup mul add 1 sub + }{ + dup mul exch dup mul add 1 exch sub + }ifelse + }bind + }ifelse + }ifelse + }if +}def +/np +{newpath}bdf +/clp_npth +{clip np}def +/eoclp_npth +{eoclip np}def +/npth_clp +{np clip}def +/graphic_setup +{ + /AGMCORE_graphicsave save store + concat + 0 setgray + 0 setlinecap + 0 setlinejoin + 1 setlinewidth + []0 setdash + 10 setmiterlimit + np + false setoverprint + false setstrokeadjust + //Adobe_AGM_Core/spot_alias gx + /Adobe_AGM_Image where{ + pop + Adobe_AGM_Image/spot_alias 2 copy known{ + gx + }{ + pop pop + }ifelse + }if + /sep_colorspace_dict null AGMCORE_gput + 100 dict begin + /dictstackcount countdictstack def + /showpage{}def + mark +}def +/graphic_cleanup +{ + cleartomark + dictstackcount 1 countdictstack 1 sub{end}for + end + AGMCORE_graphicsave restore +}def +/compose_error_msg +{ + grestoreall initgraphics + /Helvetica findfont 10 scalefont setfont + /AGMCORE_deltaY 100 def + /AGMCORE_deltaX 310 def + clippath pathbbox np pop pop 36 add exch 36 add exch moveto + 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto + 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath + 0 AGMCORE_&setgray + gsave 1 AGMCORE_&setgray fill grestore + 1 setlinewidth gsave stroke grestore + currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto + /AGMCORE_deltaY 12 def + /AGMCORE_tmp 0 def + AGMCORE_err_strings exch get + { + dup 32 eq + { + pop + AGMCORE_str256 0 AGMCORE_tmp getinterval + stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt + { + currentpoint AGMCORE_deltaY sub exch pop + clippath pathbbox pop pop pop 44 add exch moveto + }if + AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show + 0 1 AGMCORE_str256 length 1 sub + { + AGMCORE_str256 exch 0 put + }for + /AGMCORE_tmp 0 def + }{ + AGMCORE_str256 exch AGMCORE_tmp xpt + /AGMCORE_tmp AGMCORE_tmp 1 add def + }ifelse + }forall +}bdf +/AGMCORE_CMYKDeviceNColorspaces[ + [/Separation/None/DeviceCMYK{0 0 0}] + [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind] + [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind] + [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind] + [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind] + [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind] + [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind] + [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind] + [/Separation(Cyan)/DeviceCMYK{0 0 0}] + [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind] + [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind] + [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind] + [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}] + [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind] + [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}] + [/DeviceCMYK] +]def +/ds{ + Adobe_AGM_Core begin + /currentdistillerparams where + { + pop currentdistillerparams/CoreDistVersion get 5000 lt + {<>setdistillerparams}if + }if + /AGMCORE_ps_version xdf + /AGMCORE_ps_level xdf + errordict/AGM_handleerror known not{ + errordict/AGM_handleerror errordict/handleerror get put + errordict/handleerror{ + Adobe_AGM_Core begin + $error/newerror get AGMCORE_cur_err null ne and{ + $error/newerror false put + AGMCORE_cur_err compose_error_msg + }if + $error/newerror true put + end + errordict/AGM_handleerror get exec + }bind put + }if + /AGMCORE_environ_ok + ps_level AGMCORE_ps_level ge + ps_version AGMCORE_ps_version ge and + AGMCORE_ps_level -1 eq or + def + AGMCORE_environ_ok not + {/AGMCORE_cur_err/AGMCORE_bad_environ def}if + /AGMCORE_&setgray systemdict/setgray get def + level2{ + /AGMCORE_&setcolor systemdict/setcolor get def + /AGMCORE_&setcolorspace systemdict/setcolorspace get def + }if + /AGMCORE_currentbg currentblackgeneration def + /AGMCORE_currentucr currentundercolorremoval def + /AGMCORE_Default_flatness currentflat def + /AGMCORE_distilling + /product where{ + pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and + }{ + false + }ifelse + def + /AGMCORE_GSTATE AGMCORE_key_known not{ + /AGMCORE_GSTATE 21 dict def + /AGMCORE_tmpmatrix matrix def + /AGMCORE_gstack 32 array def + /AGMCORE_gstackptr 0 def + /AGMCORE_gstacksaveptr 0 def + /AGMCORE_gstackframekeys 14 def + /AGMCORE_&gsave/gsave ldf + /AGMCORE_&grestore/grestore ldf + /AGMCORE_&grestoreall/grestoreall ldf + /AGMCORE_&save/save ldf + /AGMCORE_&setoverprint/setoverprint ldf + /AGMCORE_gdictcopy{ + begin + {def}forall + end + }def + /AGMCORE_gput{ + AGMCORE_gstack AGMCORE_gstackptr get + 3 1 roll + put + }def + /AGMCORE_gget{ + AGMCORE_gstack AGMCORE_gstackptr get + exch + get + }def + /gsave{ + AGMCORE_&gsave + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gstackptr 1 add + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gdictcopy + }def + /grestore{ + AGMCORE_&grestore + AGMCORE_gstackptr 1 sub + dup AGMCORE_gstacksaveptr lt{1 add}if + dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known + {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse + /AGMCORE_gstackptr exch store + }def + /grestoreall{ + AGMCORE_&grestoreall + /AGMCORE_gstackptr AGMCORE_gstacksaveptr store + }def + /save{ + AGMCORE_&save + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gstackptr 1 add + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + /AGMCORE_gstacksaveptr AGMCORE_gstackptr store + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gdictcopy + }def + /setoverprint{ + dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint + }def + 0 1 AGMCORE_gstack length 1 sub{ + AGMCORE_gstack exch AGMCORE_gstackframekeys dict put + }for + }if + level3/AGMCORE_&sysshfill AGMCORE_key_known not and + { + /AGMCORE_&sysshfill systemdict/shfill get def + /AGMCORE_&sysmakepattern systemdict/makepattern get def + /AGMCORE_&usrmakepattern/makepattern load def + }if + /currentcmykcolor[0 0 0 0]AGMCORE_gput + /currentstrokeadjust false AGMCORE_gput + /currentcolorspace[/DeviceGray]AGMCORE_gput + /sep_tint 0 AGMCORE_gput + /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput + /sep_colorspace_dict null AGMCORE_gput + /devicen_colorspace_dict null AGMCORE_gput + /indexed_colorspace_dict null AGMCORE_gput + /currentcolor_intent()AGMCORE_gput + /customcolor_tint 1 AGMCORE_gput + /absolute_colorimetric_crd null AGMCORE_gput + /relative_colorimetric_crd null AGMCORE_gput + /saturation_crd null AGMCORE_gput + /perceptual_crd null AGMCORE_gput + currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf + cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf + << + /MaxPatternItem currentsystemparams/MaxPatternCache get + >> + setuserparams + end +}def +/ps +{ + /setcmykcolor where{ + pop + Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put + }if + Adobe_AGM_Core begin + /setcmykcolor + { + 4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput + 1 sub 4 1 roll + 3{ + 3 index add neg dup 0 lt{ + pop 0 + }if + 3 1 roll + }repeat + setrgbcolor pop + }ndf + /currentcmykcolor + { + /currentcmykcolor AGMCORE_gget aload pop + }ndf + /setoverprint + {pop}ndf + /currentoverprint + {false}ndf + /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def + /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def + /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def + /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def + /AGMCORE_plate_ndx + AGMCORE_cyan_plate{ + 0 + }{ + AGMCORE_magenta_plate{ + 1 + }{ + AGMCORE_yellow_plate{ + 2 + }{ + AGMCORE_black_plate{ + 3 + }{ + 4 + }ifelse + }ifelse + }ifelse + }ifelse + def + /AGMCORE_have_reported_unsupported_color_space false def + /AGMCORE_report_unsupported_color_space + { + AGMCORE_have_reported_unsupported_color_space false eq + { + (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)== + Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf + }if + }def + /AGMCORE_composite_job + AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def + /AGMCORE_in_rip_sep + /AGMCORE_in_rip_sep where{ + pop AGMCORE_in_rip_sep + }{ + AGMCORE_distilling + { + false + }{ + userdict/Adobe_AGM_OnHost_Seps known{ + false + }{ + level2{ + currentpagedevice/Separations 2 copy known{ + get + }{ + pop pop false + }ifelse + }{ + false + }ifelse + }ifelse + }ifelse + }ifelse + def + /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def + /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def + /AGM_preserve_spots + /AGM_preserve_spots where{ + pop AGM_preserve_spots + }{ + AGMCORE_distilling AGMCORE_producing_seps or + }ifelse + def + /AGM_is_distiller_preserving_spotimages + { + currentdistillerparams/PreserveOverprintSettings known + { + currentdistillerparams/PreserveOverprintSettings get + { + currentdistillerparams/ColorConversionStrategy known + { + currentdistillerparams/ColorConversionStrategy get + /sRGB ne + }{ + true + }ifelse + }{ + false + }ifelse + }{ + false + }ifelse + }def + /convert_spot_to_process where{pop}{ + /convert_spot_to_process + { + //Adobe_AGM_Core begin + dup map_alias{ + /Name get exch pop + }if + dup dup(None)eq exch(All)eq or + { + pop false + }{ + AGMCORE_host_sep + { + gsave + 1 0 0 0 setcmykcolor currentgray 1 exch sub + 0 1 0 0 setcmykcolor currentgray 1 exch sub + 0 0 1 0 setcmykcolor currentgray 1 exch sub + 0 0 0 1 setcmykcolor currentgray 1 exch sub + add add add 0 eq + { + pop false + }{ + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + }ifelse + grestore + }{ + AGMCORE_distilling + { + pop AGM_is_distiller_preserving_spotimages not + }{ + //Adobe_AGM_Core/AGMCORE_name xddf + false + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq + AGMUTIL_cpd/OverrideSeparations known and + { + AGMUTIL_cpd/OverrideSeparations get + { + /HqnSpots/ProcSet resourcestatus + { + pop pop pop true + }if + }if + }if + { + AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not + }{ + gsave + [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace + false + AGMUTIL_cpd/SeparationColorNames 2 copy known + { + get + {AGMCORE_name eq or}forall + not + }{ + pop pop pop true + }ifelse + grestore + }ifelse + }ifelse + }ifelse + }ifelse + end + }def + }ifelse + /convert_to_process where{pop}{ + /convert_to_process + { + dup length 0 eq + { + pop false + }{ + AGMCORE_host_sep + { + dup true exch + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process and}ifelse + } + forall + { + true exch + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + (Black)eq or and + }forall + not + }{pop false}ifelse + }{ + false exch + { + /PhotoshopDuotoneList where{pop false}{true}ifelse + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process or}ifelse + } + { + convert_spot_to_process or + } + ifelse + } + forall + }ifelse + }ifelse + }def + }ifelse + /AGMCORE_avoid_L2_sep_space + version cvr 2012 lt + level2 and + AGMCORE_producing_seps not and + def + /AGMCORE_is_cmyk_sep + AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or + def + /AGM_avoid_0_cmyk where{ + pop AGM_avoid_0_cmyk + }{ + AGM_preserve_spots + userdict/Adobe_AGM_OnHost_Seps known + userdict/Adobe_AGM_InRip_Seps known or + not and + }ifelse + { + /setcmykcolor[ + { + 4 copy add add add 0 eq currentoverprint and{ + pop 0.0005 + }if + }/exec cvx + /AGMCORE_&setcmykcolor load dup type/operatortype ne{ + /exec cvx + }if + ]cvx def + }if + /AGMCORE_IsSeparationAProcessColor + { + dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or + }def + AGMCORE_host_sep{ + /setcolortransfer + { + AGMCORE_cyan_plate{ + pop pop pop + }{ + AGMCORE_magenta_plate{ + 4 3 roll pop pop pop + }{ + AGMCORE_yellow_plate{ + 4 2 roll pop pop pop + }{ + 4 1 roll pop pop pop + }ifelse + }ifelse + }ifelse + settransfer + } + def + /AGMCORE_get_ink_data + AGMCORE_cyan_plate{ + {pop pop pop} + }{ + AGMCORE_magenta_plate{ + {4 3 roll pop pop pop} + }{ + AGMCORE_yellow_plate{ + {4 2 roll pop pop pop} + }{ + {4 1 roll pop pop pop} + }ifelse + }ifelse + }ifelse + def + /AGMCORE_RemoveProcessColorNames + { + 1 dict begin + /filtername + { + dup/Cyan eq 1 index(Cyan)eq or + {pop(_cyan_)}if + dup/Magenta eq 1 index(Magenta)eq or + {pop(_magenta_)}if + dup/Yellow eq 1 index(Yellow)eq or + {pop(_yellow_)}if + dup/Black eq 1 index(Black)eq or + {pop(_black_)}if + }def + dup type/arraytype eq + {[exch{filtername}forall]} + {filtername}ifelse + end + }def + level3{ + /AGMCORE_IsCurrentColor + { + dup AGMCORE_IsSeparationAProcessColor + { + AGMCORE_plate_ndx 0 eq + {dup(Cyan)eq exch/Cyan eq or}if + AGMCORE_plate_ndx 1 eq + {dup(Magenta)eq exch/Magenta eq or}if + AGMCORE_plate_ndx 2 eq + {dup(Yellow)eq exch/Yellow eq or}if + AGMCORE_plate_ndx 3 eq + {dup(Black)eq exch/Black eq or}if + AGMCORE_plate_ndx 4 eq + {pop false}if + }{ + gsave + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + grestore + }ifelse + }def + /AGMCORE_filter_functiondatasource + { + 5 dict begin + /data_in xdf + data_in type/stringtype eq + { + /ncomp xdf + /comp xdf + /string_out data_in length ncomp idiv string def + 0 ncomp data_in length 1 sub + { + string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put + }for + string_out + }{ + string/string_in xdf + /string_out 1 string def + /component xdf + [ + data_in string_in/readstring cvx + [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx + [/pop cvx()]cvx/ifelse cvx + ]cvx/ReusableStreamDecode filter + }ifelse + end + }def + /AGMCORE_separateShadingFunction + { + 2 dict begin + /paint? xdf + /channel xdf + dup type/dicttype eq + { + begin + FunctionType 0 eq + { + /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def + currentdict/Decode known + {/Decode Decode channel 2 mul 2 getinterval def}if + paint? not + {/Decode[1 1]def}if + }if + FunctionType 2 eq + { + paint? + { + /C0[C0 channel get 1 exch sub]def + /C1[C1 channel get 1 exch sub]def + }{ + /C0[1]def + /C1[1]def + }ifelse + }if + FunctionType 3 eq + { + /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def + }if + currentdict/Range known + {/Range[0 1]def}if + currentdict + end}{ + channel get 0 paint? AGMCORE_separateShadingFunction + }ifelse + end + }def + /AGMCORE_separateShading + { + 3 -1 roll begin + currentdict/Function known + { + currentdict/Background known + {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if + Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf + /ColorSpace[/DeviceGray]def + }{ + ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def + }{ + ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put + }ifelse + ColorSpace 0 get/Separation eq + { + { + [1/exch cvx/sub cvx]cvx + }{ + [/pop cvx 1]cvx + }ifelse + ColorSpace 3 3 -1 roll put + pop + }{ + { + [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx + }{ + pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx + }ifelse + ColorSpace 3 3 -1 roll bind put + }ifelse + ColorSpace 2/DeviceGray put + }ifelse + end + }def + /AGMCORE_separateShadingDict + { + dup/ColorSpace get + dup type/arraytype ne + {[exch]}if + dup 0 get/DeviceCMYK eq + { + exch begin + currentdict + AGMCORE_cyan_plate + {0 true}if + AGMCORE_magenta_plate + {1 true}if + AGMCORE_yellow_plate + {2 true}if + AGMCORE_black_plate + {3 true}if + AGMCORE_plate_ndx 4 eq + {0 false}if + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + currentdict + end exch + }if + dup 0 get/Separation eq + { + exch begin + ColorSpace 1 get dup/None ne exch/All ne and + { + ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and + { + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace + [ + /Separation + ColorSpace 1 get + /DeviceGray + [ + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx + ]cvx + ]def + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + currentdict 0 false AGMCORE_separateShading + }if + }ifelse + }{ + currentdict ColorSpace 1 get AGMCORE_IsCurrentColor + 0 exch + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + }ifelse + }if + currentdict + end exch + }if + dup 0 get/DeviceN eq + { + exch begin + ColorSpace 1 get convert_to_process + { + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace + [ + /DeviceN + ColorSpace 1 get + /DeviceGray + [ + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx + ]cvx + ]def + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + currentdict 0 false AGMCORE_separateShading + /ColorSpace[/DeviceGray]def + }if + }ifelse + }{ + currentdict + false -1 ColorSpace 1 get + { + AGMCORE_IsCurrentColor + { + 1 add + exch pop true exch exit + }if + 1 add + }forall + exch + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + }ifelse + currentdict + end exch + }if + dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not + { + exch begin + ColorSpace dup type/arraytype eq + {0 get}if + /DeviceGray ne + { + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + ColorSpace 0 get/CIEBasedA eq + { + /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def + }if + ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or + { + /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def + }if + ColorSpace 0 get/CIEBasedDEFG eq + { + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def + }if + currentdict 0 false AGMCORE_separateShading + }if + }if + currentdict + end exch + }if + pop + dup/AGMCORE_ignoreshade known + { + begin + /ColorSpace[/Separation(None)/DeviceGray{}]def + currentdict end + }if + }def + /shfill + { + AGMCORE_separateShadingDict + dup/AGMCORE_ignoreshade known + {pop} + {AGMCORE_&sysshfill}ifelse + }def + /makepattern + { + exch + dup/PatternType get 2 eq + { + clonedict + begin + /Shading Shading AGMCORE_separateShadingDict def + Shading/AGMCORE_ignoreshade known + currentdict end exch + {pop<>}if + exch AGMCORE_&sysmakepattern + }{ + exch AGMCORE_&usrmakepattern + }ifelse + }def + }if + }if + AGMCORE_in_rip_sep{ + /setcustomcolor + { + exch aload pop + dup 7 1 roll inRip_spot_has_ink not { + 4{4 index mul 4 1 roll} + repeat + /DeviceCMYK setcolorspace + 6 -2 roll pop pop + }{ + //Adobe_AGM_Core begin + /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf + end + [/Separation 4 -1 roll/DeviceCMYK + {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} + ] + setcolorspace + }ifelse + setcolor + }ndf + /setseparationgray + { + [/Separation(All)/DeviceGray{}]setcolorspace_opt + 1 exch sub setcolor + }ndf + }{ + /setseparationgray + { + AGMCORE_&setgray + }ndf + }ifelse + /findcmykcustomcolor + { + 5 makereadonlyarray + }ndf + /setcustomcolor + { + exch aload pop pop + 4{4 index mul 4 1 roll}repeat + setcmykcolor pop + }ndf + /has_color + /colorimage where{ + AGMCORE_producing_seps{ + pop true + }{ + systemdict eq + }ifelse + }{ + false + }ifelse + def + /map_index + { + 1 index mul exch getinterval{255 div}forall + }bdf + /map_indexed_devn + { + Lookup Names length 3 -1 roll cvi map_index + }bdf + /n_color_components + { + base_colorspace_type + dup/DeviceGray eq{ + pop 1 + }{ + /DeviceCMYK eq{ + 4 + }{ + 3 + }ifelse + }ifelse + }bdf + level2{ + /mo/moveto ldf + /li/lineto ldf + /cv/curveto ldf + /knockout_unitsq + { + 1 setgray + 0 0 1 1 rectfill + }def + level2/setcolorspace AGMCORE_key_known not and{ + /AGMCORE_&&&setcolorspace/setcolorspace ldf + /AGMCORE_ReplaceMappedColor + { + dup type dup/arraytype eq exch/packedarraytype eq or + { + /AGMCORE_SpotAliasAry2 where{ + begin + dup 0 get dup/Separation eq + { + pop + dup length array copy + dup dup 1 get + current_spot_alias + { + dup map_alias + { + false set_spot_alias + dup 1 exch setsepcolorspace + true set_spot_alias + begin + /sep_colorspace_dict currentdict AGMCORE_gput + pop pop pop + [ + /Separation Name + CSA map_csa + MappedCSA + /sep_colorspace_proc load + ] + dup Name + end + }if + }if + map_reserved_ink_name 1 xpt + }{ + /DeviceN eq + { + dup length array copy + dup dup 1 get[ + exch{ + current_spot_alias{ + dup map_alias{ + /Name get exch pop + }if + }if + map_reserved_ink_name + }forall + ]1 xpt + }if + }ifelse + end + }if + }if + }def + /setcolorspace + { + dup type dup/arraytype eq exch/packedarraytype eq or + { + dup 0 get/Indexed eq + { + AGMCORE_distilling + { + /PhotoshopDuotoneList where + { + pop false + }{ + true + }ifelse + }{ + true + }ifelse + { + aload pop 3 -1 roll + AGMCORE_ReplaceMappedColor + 3 1 roll 4 array astore + }if + }{ + AGMCORE_ReplaceMappedColor + }ifelse + }if + DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if + }def + }if + }{ + /adj + { + currentstrokeadjust{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform + }if + }def + /mo{ + adj moveto + }def + /li{ + adj lineto + }def + /cv{ + 6 2 roll adj + 6 2 roll adj + 6 2 roll adj curveto + }def + /knockout_unitsq + { + 1 setgray + 8 8 1[8 0 0 8 0 0]{}image + }def + /currentstrokeadjust{ + /currentstrokeadjust AGMCORE_gget + }def + /setstrokeadjust{ + /currentstrokeadjust exch AGMCORE_gput + }def + /setcolorspace + { + /currentcolorspace exch AGMCORE_gput + }def + /currentcolorspace + { + /currentcolorspace AGMCORE_gget + }def + /setcolor_devicecolor + { + base_colorspace_type + dup/DeviceGray eq{ + pop setgray + }{ + /DeviceCMYK eq{ + setcmykcolor + }{ + setrgbcolor + }ifelse + }ifelse + }def + /setcolor + { + currentcolorspace 0 get + dup/DeviceGray ne{ + dup/DeviceCMYK ne{ + dup/DeviceRGB ne{ + dup/Separation eq{ + pop + currentcolorspace 3 gx + currentcolorspace 2 get + }{ + dup/Indexed eq{ + pop + currentcolorspace 3 get dup type/stringtype eq{ + currentcolorspace 1 get n_color_components + 3 -1 roll map_index + }{ + exec + }ifelse + currentcolorspace 1 get + }{ + /AGMCORE_cur_err/AGMCORE_invalid_color_space def + AGMCORE_invalid_color_space + }ifelse + }ifelse + }if + }if + }if + setcolor_devicecolor + }def + }ifelse + /sop/setoverprint ldf + /lw/setlinewidth ldf + /lc/setlinecap ldf + /lj/setlinejoin ldf + /ml/setmiterlimit ldf + /dsh/setdash ldf + /sadj/setstrokeadjust ldf + /gry/setgray ldf + /rgb/setrgbcolor ldf + /cmyk[ + /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx + /setcmykcolor load dup type/operatortype ne{/exec cvx}if + ]cvx bdf + level3 AGMCORE_host_sep not and{ + /nzopmsc{ + 6 dict begin + /kk exch def + /yy exch def + /mm exch def + /cc exch def + /sum 0 def + cc 0 ne{/sum sum 2#1000 or def cc}if + mm 0 ne{/sum sum 2#0100 or def mm}if + yy 0 ne{/sum sum 2#0010 or def yy}if + kk 0 ne{/sum sum 2#0001 or def kk}if + AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace + sum 0 eq{0}if + end + setcolor + }bdf + }{ + /nzopmsc/cmyk ldf + }ifelse + /sep/setsepcolor ldf + /devn/setdevicencolor ldf + /idx/setindexedcolor ldf + /colr/setcolor ldf + /csacrd/set_csa_crd ldf + /sepcs/setsepcolorspace ldf + /devncs/setdevicencolorspace ldf + /idxcs/setindexedcolorspace ldf + /cp/closepath ldf + /clp/clp_npth ldf + /eclp/eoclp_npth ldf + /f/fill ldf + /ef/eofill ldf + /@/stroke ldf + /nclp/npth_clp ldf + /gset/graphic_setup ldf + /gcln/graphic_cleanup ldf + /ct/concat ldf + /cf/currentfile ldf + /fl/filter ldf + /rs/readstring ldf + /AGMCORE_def_ht currenthalftone def + /clonedict Adobe_AGM_Utils begin/clonedict load end def + /clonearray Adobe_AGM_Utils begin/clonearray load end def + currentdict{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ + bind + }if + def + }forall + /getrampcolor + { + /indx exch def + 0 1 NumComp 1 sub + { + dup + Samples exch get + dup type/stringtype eq{indx get}if + exch + Scaling exch get aload pop + 3 1 roll + mul add + }for + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /sssetbackground{ + aload pop + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /RadialShade + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /r2 xdf + /c2y xdf + /c2x xdf + /r1 xdf + /c1y xdf + /c1x xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + c1x c2x eq + { + c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if + c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if + }ifelse + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax xdf + /xMax xdf + /yMin xdf + /xMin xdf + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + /max{2 copy gt{pop}{exch pop}ifelse}bdf + /min{2 copy lt{pop}{exch pop}ifelse}bdf + rampdict begin + 40 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 + { + 0 getrampcolor + c2y r2 add r1 sub 0.0001 lt + { + c1x c1y r1 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + /hires xdf + hires mul + /numpix xdf + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + np + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + }{ + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + }repeat + pop + }ifelse + ext1 + { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + }{ + c2y r1 add r2 sub 0.0001 le + { + c2x c2y r2 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + grestore + grestore + end + end + end + }ifelse + }bdf + /GenStrips + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /y2 xdf + /x2 xdf + /y1 xdf + /x1 xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + x1 x2 eq + { + y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if + x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + rampdict begin + 20 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + mul + /numpix xdf + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + ext0 + { + 0 getrampcolor + xMin xStart lt + { + xMin yMin xMin neg ySpan rectfill + }if + }if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + }repeat + pop + ext1{ + xMax xEnd gt + { + xEnd yMin xMax xEnd sub ySpan rectfill + }if + }if + grestore + grestore + end + end + end + }ifelse + }bdf +}def +/pt +{ + end +}def +/dt{ +}def +/pgsv{ + //Adobe_AGM_Core/AGMCORE_save save put +}def +/pgrs{ + //Adobe_AGM_Core/AGMCORE_save get restore +}def +systemdict/findcolorrendering known{ + /findcolorrendering systemdict/findcolorrendering get def +}if +systemdict/setcolorrendering known{ + /setcolorrendering systemdict/setcolorrendering get def +}if +/test_cmyk_color_plate +{ + gsave + setcmykcolor currentgray 1 ne + grestore +}def +/inRip_spot_has_ink +{ + dup//Adobe_AGM_Core/AGMCORE_name xddf + convert_spot_to_process not +}def +/map255_to_range +{ + 1 index sub + 3 -1 roll 255 div mul add +}def +/set_csa_crd +{ + /sep_colorspace_dict null AGMCORE_gput + begin + CSA get_csa_by_name setcolorspace_opt + set_crd + end +} +def +/map_csa +{ + currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse + {pop}{get_csa_by_name/MappedCSA xdf}ifelse +}def +/setsepcolor +{ + /sep_colorspace_dict AGMCORE_gget begin + dup/sep_tint exch AGMCORE_gput + TintProc + end +}def +/setdevicencolor +{ + /devicen_colorspace_dict AGMCORE_gget begin + Names length copy + Names length 1 sub -1 0 + { + /devicen_tints AGMCORE_gget 3 1 roll xpt + }for + TintProc + end +}def +/sep_colorspace_proc +{ + /AGMCORE_tmp exch store + /sep_colorspace_dict AGMCORE_gget begin + currentdict/Components known{ + Components aload pop + TintMethod/Lab eq{ + 2{AGMCORE_tmp mul NComponents 1 roll}repeat + LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll + }{ + TintMethod/Subtractive eq{ + NComponents{ + AGMCORE_tmp mul NComponents 1 roll + }repeat + }{ + NComponents{ + 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll + }repeat + }ifelse + }ifelse + }{ + ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get + aload pop + }ifelse + end +}def +/sep_colorspace_gray_proc +{ + /AGMCORE_tmp exch store + /sep_colorspace_dict AGMCORE_gget begin + GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get + end +}def +/sep_proc_name +{ + dup 0 get + dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{ + pop[/DeviceGray] + /sep_colorspace_gray_proc + }{ + /sep_colorspace_proc + }ifelse +}def +/setsepcolorspace +{ + current_spot_alias{ + dup begin + Name map_alias{ + exch pop + }if + end + }if + dup/sep_colorspace_dict exch AGMCORE_gput + begin + CSA map_csa + /AGMCORE_sep_special Name dup()eq exch(All)eq or store + AGMCORE_avoid_L2_sep_space{ + [/Indexed MappedCSA sep_proc_name 255 exch + {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx + ]setcolorspace_opt + /TintProc{ + 255 mul round cvi setcolor + }bdf + }{ + MappedCSA 0 get/DeviceCMYK eq + currentdict/Components known and + AGMCORE_sep_special not and{ + /TintProc[ + Components aload pop Name findcmykcustomcolor + /exch cvx/setcustomcolor cvx + ]cvx bdf + }{ + AGMCORE_host_sep Name(All)eq and{ + /TintProc{ + 1 exch sub setseparationgray + }bdf + }{ + AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and + AGMCORE_host_sep or + Name()eq and{ + /TintProc[ + MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{ + cvx/setcmykcolor cvx + }{ + cvx/setgray cvx + }ifelse + ]cvx bdf + }{ + AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{ + /TintProc[ + /dup cvx + MappedCSA sep_proc_name cvx exch + 0 get/DeviceGray eq{ + 1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx + }if + /Name cvx/findcmykcustomcolor cvx/exch cvx + AGMCORE_host_sep{ + AGMCORE_is_cmyk_sep + /Name cvx + /AGMCORE_IsSeparationAProcessColor load/exec cvx + /not cvx/and cvx + }{ + Name inRip_spot_has_ink not + }ifelse + [ + /pop cvx 1 + ]cvx/if cvx + /setcustomcolor cvx + ]cvx bdf + }{ + /TintProc{setcolor}bdf + [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt + }ifelse + }ifelse + }ifelse + }ifelse + }ifelse + set_crd + setsepcolor + end +}def +/additive_blend +{ + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 + 0 1 numarrays 1 sub + { + 1 exch add/index cvx + c1/get cvx/mul cvx + }for + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end +}def +/subtractive_blend +{ + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 1 + 0 1 numarrays 1 sub + { + 1 3 3 -1 roll add/index cvx + c1/get cvx/sub cvx/mul cvx + }for + /sub cvx + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end +}def +/exec_tint_transform +{ + /TintProc[ + /TintTransform cvx/setcolor cvx + ]cvx bdf + MappedCSA setcolorspace_opt +}bdf +/devn_makecustomcolor +{ + 2 dict begin + /names_index xdf + /Names xdf + 1 1 1 1 Names names_index get findcmykcustomcolor + /devicen_tints AGMCORE_gget names_index get setcustomcolor + Names length{pop}repeat + end +}bdf +/setdevicencolorspace +{ + dup/AliasedColorants known{false}{true}ifelse + current_spot_alias and{ + 7 dict begin + /names_index 0 def + dup/names_len exch/Names get length def + /new_names names_len array def + /new_LookupTables names_len array def + /alias_cnt 0 def + dup/Names get + { + dup map_alias{ + exch pop + dup/ColorLookup known{ + dup begin + new_LookupTables names_index ColorLookup put + end + }{ + dup/Components known{ + dup begin + new_LookupTables names_index Components put + end + }{ + dup begin + new_LookupTables names_index[null null null null]put + end + }ifelse + }ifelse + new_names names_index 3 -1 roll/Name get put + /alias_cnt alias_cnt 1 add def + }{ + /name xdf + new_names names_index name put + dup/LookupTables known{ + dup begin + new_LookupTables names_index LookupTables names_index get put + end + }{ + dup begin + new_LookupTables names_index[null null null null]put + end + }ifelse + }ifelse + /names_index names_index 1 add def + }forall + alias_cnt 0 gt{ + /AliasedColorants true def + /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def + 0 1 names_len 1 sub{ + /names_index xdf + new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{ + /AliasedColorants false def + exit + }{ + new_LookupTables names_index get 0 get null eq{ + dup/Names get names_index get/name xdf + name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq + or or or not{ + /AliasedColorants false def + exit + }if + }if + }ifelse + }for + lut_entry_len 1 eq{ + /AliasedColorants false def + }if + AliasedColorants{ + dup begin + /Names new_names def + /LookupTables new_LookupTables def + /AliasedColorants true def + /NComponents lut_entry_len def + /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def + /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def + currentdict/TTTablesIdx known not{ + /TTTablesIdx -1 def + }if + end + }if + }if + end + }if + dup/devicen_colorspace_dict exch AGMCORE_gput + begin + currentdict/AliasedColorants known{ + AliasedColorants + }{ + false + }ifelse + dup not{ + CSA map_csa + }if + /TintTransform load type/nulltype eq or{ + /TintTransform[ + 0 1 Names length 1 sub + { + /TTTablesIdx TTTablesIdx 1 add def + dup LookupTables exch get dup 0 get null eq + { + 1 index + Names exch get + dup(Cyan)eq + { + pop exch + LookupTables length exch sub + /index cvx + 0 0 0 + } + { + dup(Magenta)eq + { + pop exch + LookupTables length exch sub + /index cvx + 0/exch cvx 0 0 + }{ + (Yellow)eq + { + exch + LookupTables length exch sub + /index cvx + 0 0 3 -1/roll cvx 0 + }{ + exch + LookupTables length exch sub + /index cvx + 0 0 0 4 -1/roll cvx + }ifelse + }ifelse + }ifelse + 5 -1/roll cvx/astore cvx + }{ + dup length 1 sub + LookupTables length 4 -1 roll sub 1 add + /index cvx/mul cvx/round cvx/cvi cvx/get cvx + }ifelse + Names length TTTablesIdx add 1 add 1/roll cvx + }for + Names length[/pop cvx]cvx/repeat cvx + NComponents Names length + TintMethod/Subtractive eq + { + subtractive_blend + }{ + additive_blend + }ifelse + ]cvx bdf + }if + AGMCORE_host_sep{ + Names convert_to_process{ + exec_tint_transform + } + { + currentdict/AliasedColorants known{ + AliasedColorants not + }{ + false + }ifelse + 5 dict begin + /AvoidAliasedColorants xdf + /painted? false def + /names_index 0 def + /names_len Names length def + AvoidAliasedColorants{ + /currentspotalias current_spot_alias def + false set_spot_alias + }if + Names{ + AGMCORE_is_cmyk_sep{ + dup(Cyan)eq AGMCORE_cyan_plate and exch + dup(Magenta)eq AGMCORE_magenta_plate and exch + dup(Yellow)eq AGMCORE_yellow_plate and exch + (Black)eq AGMCORE_black_plate and or or or{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf + /painted? true def + }if + painted?{exit}if + }{ + 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf + /painted? true def + exit + }if + }ifelse + /names_index names_index 1 add def + }forall + AvoidAliasedColorants{ + currentspotalias set_spot_alias + }if + painted?{ + /devicen_colorspace_dict AGMCORE_gget/names_index names_index put + }{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx + 0 0 0 0/setcmykcolor cvx + ]cvx ddf + }ifelse + end + }ifelse + } + { + AGMCORE_in_rip_sep{ + Names convert_to_process not + }{ + level3 + }ifelse + { + [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt + /TintProc level3 not AGMCORE_in_rip_sep and{ + [ + Names/length cvx[/pop cvx]cvx/repeat cvx + ]cvx bdf + }{ + {setcolor}bdf + }ifelse + }{ + exec_tint_transform + }ifelse + }ifelse + set_crd + /AliasedColorants false def + end +}def +/setindexedcolorspace +{ + dup/indexed_colorspace_dict exch AGMCORE_gput + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + currentdict devncs + }{ + 1 currentdict sepcs + }ifelse + AGMCORE_host_sep{ + 4 dict begin + /compCnt/Names where{pop Names length}{1}ifelse def + /NewLookup HiVal 1 add string def + 0 1 HiVal{ + /tableIndex xdf + Lookup dup type/stringtype eq{ + compCnt tableIndex map_index + }{ + exec + }ifelse + /Names where{ + pop setdevicencolor + }{ + setsepcolor + }ifelse + currentgray + tableIndex exch + 255 mul cvi + NewLookup 3 1 roll put + }for + [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt + end + }{ + level3 + { + currentdict/Names known{ + [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt + }{ + [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt + }ifelse + }{ + [/Indexed MappedCSA HiVal + [ + currentdict/Names known{ + Lookup dup type/stringtype eq + {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx} + {/exec cvx}ifelse + /TintTransform load/exec cvx + }{ + Lookup dup type/stringtype eq + {/exch cvx/get cvx 255/div cvx} + {/exec cvx}ifelse + CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx + }ifelse + ]cvx + ]setcolorspace_opt + }ifelse + }ifelse + end + set_crd + } + { + CSA map_csa + AGMCORE_host_sep level2 not and{ + 0 0 0 0 setcmykcolor + }{ + [/Indexed MappedCSA + level2 not has_color not and{ + dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{ + pop[/DeviceGray] + }if + HiVal GrayLookup + }{ + HiVal + currentdict/RangeArray known{ + { + /indexed_colorspace_dict AGMCORE_gget begin + Lookup exch + dup HiVal gt{ + pop HiVal + }if + NComponents mul NComponents getinterval{}forall + NComponents 1 sub -1 0{ + RangeArray exch 2 mul 2 getinterval aload pop map255_to_range + NComponents 1 roll + }for + end + }bind + }{ + Lookup + }ifelse + }ifelse + ]setcolorspace_opt + set_crd + }ifelse + }ifelse + end +}def +/setindexedcolor +{ + AGMCORE_host_sep{ + /indexed_colorspace_dict AGMCORE_gget + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + map_indexed_devn + devn + } + { + Lookup 1 3 -1 roll map_index + sep + }ifelse + end + }{ + Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll + map_index + MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse + }ifelse + end + }{ + level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{ + /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin + map_indexed_devn + devn + end + } + { + setcolor + }ifelse + }ifelse +}def +/ignoreimagedata +{ + currentoverprint not{ + gsave + dup clonedict begin + 1 setgray + /Decode[0 1]def + /DataSourcedef + /MultipleDataSources false def + /BitsPerComponent 8 def + currentdict end + systemdict/image gx + grestore + }if + consumeimagedata +}def +/add_res +{ + dup/CSD eq{ + pop + //Adobe_AGM_Core begin + /AGMCORE_CSD_cache load 3 1 roll put + end + }{ + defineresource pop + }ifelse +}def +/del_res +{ + { + aload pop exch + dup/CSD eq{ + pop + {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall + }{ + exch + {1 index undefineresource}forall + pop + }ifelse + }forall +}def +/get_res +{ + dup/CSD eq{ + pop + dup type dup/nametype eq exch/stringtype eq or{ + AGMCORE_CSD_cache exch get + }if + }{ + findresource + }ifelse +}def +/get_csa_by_name +{ + dup type dup/nametype eq exch/stringtype eq or{ + /CSA get_res + }if +}def +/paintproc_buf_init +{ + /count get 0 0 put +}def +/paintproc_buf_next +{ + dup/count get dup 0 get + dup 3 1 roll + 1 add 0 xpt + get +}def +/cachepaintproc_compress +{ + 5 dict begin + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + /string_size 16000 def + /readbuffer string_size string def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt + setglobal + /LZWFilter + { + exch + dup length 0 eq{ + pop + }{ + ppdict dup length 1 sub 3 -1 roll put + }ifelse + {string_size}{0}ifelse string + }/LZWEncode filter def + { + ReadFilter readbuffer readstring + exch LZWFilter exch writestring + not{exit}if + }loop + LZWFilter closefile + ppdict + end +}def +/cachepaintproc +{ + 2 dict begin + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt + setglobal + { + ReadFilter 16000 string readstring exch + ppdict dup length 1 sub 3 -1 roll put + not{exit}if + }loop + ppdict dup dup length 1 sub()put + end +}def +/make_pattern +{ + exch clonedict exch + dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform + exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub + exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub + matrix translate exch matrix concatmatrix + 1 index begin + BBox 0 get XStep div cvi XStep mul/xshift exch neg def + BBox 1 get YStep div cvi YStep mul/yshift exch neg def + BBox 0 get xshift add + BBox 1 get yshift add + BBox 2 get xshift add + BBox 3 get yshift add + 4 array astore + /BBox exch def + [xshift yshift/translate load null/exec load]dup + 3/PaintProc load put cvx/PaintProc exch def + end + gsave 0 setgray + makepattern + grestore +}def +/set_pattern +{ + dup/PatternType get 1 eq{ + dup/PaintType get 1 eq{ + currentoverprint sop[/DeviceGray]setcolorspace 0 setgray + }if + }if + setpattern +}def +/setcolorspace_opt +{ + dup currentcolorspace eq{pop}{setcolorspace}ifelse +}def +/updatecolorrendering +{ + currentcolorrendering/RenderingIntent known{ + currentcolorrendering/RenderingIntent get + } + { + Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/Saturation eq + { + /saturation_crd AGMCORE_gget dup null eq + } + { + /perceptual_crd AGMCORE_gget dup null eq + }ifelse + }ifelse + }ifelse + { + pop null + } + { + /RenderingIntent known{null}{Intent}ifelse + }ifelse + }ifelse + Intent ne{ + Intent/ColorRendering{findresource}stopped + { + pop pop systemdict/findcolorrendering known + { + Intent findcolorrendering + { + /ColorRendering findresource true exch + } + { + /ColorRendering findresource + product(Xerox Phaser 5400)ne + exch + }ifelse + dup Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd exch AGMCORE_gput + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd exch AGMCORE_gput + } + { + Intent/Saturation eq + { + /saturation_crd exch AGMCORE_gput + } + { + Intent/Perceptual eq + { + /perceptual_crd exch AGMCORE_gput + } + { + pop + }ifelse + }ifelse + }ifelse + }ifelse + 1 index{exch}{pop}ifelse + } + {false}ifelse + } + {true}ifelse + { + dup begin + currentdict/TransformPQR known{ + currentdict/TransformPQR get aload pop + 3{{}eq 3 1 roll}repeat or or + } + {true}ifelse + currentdict/MatrixPQR known{ + currentdict/MatrixPQR get aload pop + 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq + and and and and and and and and + } + {true}ifelse + end + or + { + clonedict begin + /TransformPQR[ + {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div + 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind + {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div + 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind + {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div + 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind + ]def + /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def + /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def + currentdict end + }if + setcolorrendering_opt + }if + }if +}def +/set_crd +{ + AGMCORE_host_sep not level2 and{ + currentdict/ColorRendering known{ + ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if + }{ + currentdict/Intent known{ + updatecolorrendering + }if + }ifelse + currentcolorspace dup type/arraytype eq + {0 get}if + /DeviceRGB eq + { + currentdict/UCR known + {/UCR}{/AGMCORE_currentucr}ifelse + load setundercolorremoval + currentdict/BG known + {/BG}{/AGMCORE_currentbg}ifelse + load setblackgeneration + }if + }if +}def +/set_ucrbg +{ + dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration + dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval +}def +/setcolorrendering_opt +{ + dup currentcolorrendering eq{ + pop + }{ + clonedict + begin + /Intent Intent def + currentdict + end + setcolorrendering + }ifelse +}def +/cpaint_gcomp +{ + convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not + { + (%end_cpaint_gcomp)flushinput + }if +}def +/cpaint_gsep +{ + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get + { + (%end_cpaint_gsep)flushinput + }if +}def +/cpaint_gend +{np}def +/T1_path +{ + currentfile token pop currentfile token pop mo + { + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 exch rlineto + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 rlineto + }loop +}def +/T1_gsave + level3 + {/clipsave} + {/gsave}ifelse + load def +/T1_grestore + level3 + {/cliprestore} + {/grestore}ifelse + load def +/set_spot_alias_ary +{ + dup inherit_aliases + //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf +}def +/set_spot_normalization_ary +{ + dup inherit_aliases + dup length + /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if + array + //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf + /AGMCORE_SpotAliasAry where{ + pop + AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval + AGMCORE_SpotAliasAry length + }{0}ifelse + AGMCORE_SpotAliasAry2 3 1 roll exch putinterval + true set_spot_alias +}def +/inherit_aliases +{ + {dup/Name get map_alias{/CSD put}{pop}ifelse}forall +}def +/set_spot_alias +{ + /AGMCORE_SpotAliasAry2 where{ + /AGMCORE_current_spot_alias 3 -1 roll put + }{ + pop + }ifelse +}def +/current_spot_alias +{ + /AGMCORE_SpotAliasAry2 where{ + /AGMCORE_current_spot_alias get + }{ + false + }ifelse +}def +/map_alias +{ + /AGMCORE_SpotAliasAry2 where{ + begin + /AGMCORE_name xdf + false + AGMCORE_SpotAliasAry2{ + dup/Name get AGMCORE_name eq{ + /CSD get/CSD get_res + exch pop true + exit + }{ + pop + }ifelse + }forall + end + }{ + pop false + }ifelse +}bdf +/spot_alias +{ + true set_spot_alias + /AGMCORE_&setcustomcolor AGMCORE_key_known not{ + //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put + }if + /customcolor_tint 1 AGMCORE_gput + //Adobe_AGM_Core begin + /setcustomcolor + { + //Adobe_AGM_Core begin + dup/customcolor_tint exch AGMCORE_gput + 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not + current_spot_alias and{1 index 4 get map_alias}{false}ifelse + { + false set_spot_alias + /sep_colorspace_dict AGMCORE_gget null ne + 3 1 roll 2 index{ + exch pop/sep_tint AGMCORE_gget exch + }if + mark 3 1 roll + setsepcolorspace + counttomark 0 ne{ + setsepcolor + }if + pop + not{/sep_tint 1.0 AGMCORE_gput}if + pop + true set_spot_alias + }{ + AGMCORE_&setcustomcolor + }ifelse + end + }bdf + end +}def +/begin_feature +{ + Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put + count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put + {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if +}def +/end_feature +{ + 2 dict begin + /spd/setpagedevice load def + /setpagedevice{get_gstate spd set_gstate}def + stopped{$error/newerror false put}if + end + count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse + countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse + {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if +}def +/set_negative +{ + //Adobe_AGM_Core begin + /AGMCORE_inverting exch def + level2{ + currentpagedevice/NegativePrint known AGMCORE_distilling not and{ + currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{ + true begin_feature true{ + <>setpagedevice + }end_feature + }if + /AGMCORE_inverting false def + }if + }if + AGMCORE_inverting{ + [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer + AGMCORE_distilling{ + erasepage + }{ + gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse + /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore + }ifelse + }if + end +}def +/lw_save_restore_override{ + /md where{ + pop + md begin + initializepage + /initializepage{}def + /pmSVsetup{}def + /endp{}def + /pse{}def + /psb{}def + /orig_showpage where + {pop} + {/orig_showpage/showpage load def} + ifelse + /showpage{orig_showpage gR}def + end + }if +}def +/pscript_showpage_override{ + /NTPSOct95 where + { + begin + showpage + save + /showpage/restore load def + /restore{exch pop}def + end + }if +}def +/driver_media_override +{ + /md where{ + pop + md/initializepage known{ + md/initializepage{}put + }if + md/rC known{ + md/rC{4{pop}repeat}put + }if + }if + /mysetup where{ + /mysetup[1 0 0 1 0 0]put + }if + Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put + level2 + {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if +}def +/driver_check_media_override +{ + /PrepsDict where + {pop} + { + Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne + Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and + Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and + }if + { + Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix + }if + }ifelse +}def +AGMCORE_err_strings begin + /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def + /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def + /AGMCORE_invalid_color_space(This job contains an invalid color space. )def +end +/set_def_ht +{AGMCORE_def_ht sethalftone}def +/set_def_flat +{AGMCORE_Default_flatness setflat}def +end +systemdict/setpacking known +{setpacking}if +%%EndResource +%%BeginResource: procset Adobe_CoolType_Core 2.31 0 %%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.31 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def} if userdict/Adobe_CoolType_Core 70 dict dup begin put /Adobe_CoolType_Version 2.31 def /Level2? systemdict/languagelevel known dup {pop systemdict/languagelevel get 2 ge} if def Level2? not { /currentglobal false def /setglobal/pop load def /gcheck{pop false}bind def /currentpacking false def /setpacking/pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict/Adobe_CoolType_Data 2 copy known not {2 copy 10 dict put} if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal currentglobal true setglobal userdict/Adobe_CoolType_GVMFonts known not {userdict/Adobe_CoolType_GVMFonts 10 dict put} if setglobal currentglobal false setglobal userdict/Adobe_CoolType_LVMFonts known not {userdict/Adobe_CoolType_LVMFonts 10 dict put} if setglobal /ct_VMDictPut { dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse 3 1 roll put }bind def /ct_VMDictUndef { dup Adobe_CoolType_GVMFonts exch known {Adobe_CoolType_GVMFonts exch undef} { dup Adobe_CoolType_LVMFonts exch known {Adobe_CoolType_LVMFonts exch undef} {pop} ifelse }ifelse }bind def /ct_str1 1 string def /ct_xshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { _ct_x _ct_y moveto 0 rmoveto } ifelse /_ct_i _ct_i 1 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /ct_yshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { _ct_x _ct_y moveto 0 exch rmoveto } ifelse /_ct_i _ct_i 1 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /ct_xyshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { {_ct_na _ct_i 1 add get}stopped {pop pop pop} { _ct_x _ct_y moveto rmoveto } ifelse } ifelse /_ct_i _ct_i 2 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def /ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def /xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def currentglobal true setglobal /ct_T3Defs { /BuildChar { 1 index/Encoding get exch get 1 index/BuildGlyph get exec }bind def /BuildGlyph { exch begin GlyphProcs exch get exec end }bind def }bind def setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup/args 7 index 5 add array put put get } { get dup/args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch/args exch put } {pop} ifelse } ifelse begin count 1 sub 1 index lt {pop count} if dup/argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } {pop} ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end }bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt {{pop}repeat} {pop} ifelse args 0 argCount getinterval{}forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt {{end}repeat} {pop} ifelse }bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end }bind def /@Raise { exch cvx exch errordict exch get exec stop }bind def /@ReRaise { cvx $error/errorname get errordict exch get exec stop }bind def /@Stopped { 0 @#Stopped }bind def /@#Stopped { @_SaveStackLevels stopped {@_RestoreStackLevels true} {@_PopStackLevels false} ifelse }bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end }bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put begin count @_SaveStackLevels {(*){pop stop}128 string/Category resourceforall} stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq {pop exit} if } loop } if } { pop end } ifelse } {false} ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark {/steveamerige/Category resourcestatus} stopped {cleartomark true} {cleartomark currentglobal not} ifelse } {false} ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec {cleartomark false} {{3 2 roll pop true}{cleartomark false}ifelse} ifelse end }bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad/ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup/CMap CTHasResourceStatusBug {CTResourceStatus} {resourcestatus} ifelse { pop dup 0 eq exch 1 eq or { dup/CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug {exit} {stop} ifelse } ifelse } {pop} ifelse } 128 string/CMap resourceforall } stopped {cleartomark} stopped pop setglobal } if } if }bind def /ds { Adobe_CoolType_Core begin CTWorkAroundBugs /mo/moveto load def /nf/newencodedfont load def /msf{makefont setfont}bind def /uf{dup undefinefont ct_VMDictUndef}bind def /ur/undefineresource load def /chp/charpath load def /awsh/awidthshow load def /wsh/widthshow load def /ash/ashow load def /@xshow/xshow load def /@yshow/yshow load def /@xyshow/xyshow load def /@cshow/cshow load def /sh/show load def /rp/repeat load def /.n/.notdef def end currentglobal false setglobal userdict/Adobe_CoolType_Data 2 copy known not {2 copy 10 dict put} if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal }bind def /dt { currentdict Adobe_CoolType_Core eq {end} if }bind def /ps { Adobe_CoolType_Core begin Adobe_CoolType_GVMFonts begin Adobe_CoolType_LVMFonts begin SharedFontDirectory begin }bind def /pt { end end end end }bind def /unload { systemdict/languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known {undef} {pop pop} ifelse } if } if }bind def /ndf { 1 index where {pop pop pop} {dup xcheck{bind}if def} ifelse }def /findfont systemdict begin userdict begin /globaldict where{/globaldict get begin}if dup where pop exch get /globaldict where{pop end}if end end Adobe_CoolType_Core_Defined {/systemfindfont exch def} { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont {pop}ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq{0}{dup length}ifelse 2 index length add 1 add dict begin exch { 1 index/FID eq {pop pop} {def} ifelse } forall dup null eq {pop} {{def}forall} ifelse currentdict end exch setglobal }bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal }bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known {SharedFontDirectory 3 index get/FontReferenced known} {false} ifelse } { FontDirectory 3 index known {FontDirectory 3 index get/FontReferenced known} { SharedFontDirectory 3 index known {SharedFontDirectory 3 index get/FontReferenced known} {false} ifelse } ifelse } ifelse dup { 3 index findfont/FontReferenced get 2 index dup type/nametype eq {findfont} if ne {pop false} if } if dup { 1 index dup type/nametype eq {findfont} if dup/CharStrings known { /CharStrings get length 4 index findfont/CharStrings get length ne { pop false } if } {pop} ifelse } if { pop 1 index findfont /Encoding get exch 0 1 255 {2 copy get 3 index 3 1 roll put} for pop pop pop } { currentglobal 4 1 roll dup type/nametype eq {findfont} if dup gcheck setglobal dup dup maxlength 2 add dict begin exch { 1 index/FID ne 2 index/Encoding ne and {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type/stringtype eq{cvn}if def dup currentdict end definefont ct_VMDictPut setglobal } ifelse }bind def /SetSubstituteStrategy { $SubstituteFont begin dup type/dicttype ne {0 dict} if currentdict/$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin {def}forall {def}forall currentdict dup/$Init known {dup/$Init get exec} if end /$Strategy exch def } {pop pop pop} ifelse } {pop pop} ifelse end }bind def /scff { $SubstituteFont begin dup type/stringtype eq {dup length exch} {null} ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } {$sname} ifelse def end {findfont} @Stopped { dup length 8 add string exch 1 index 0(BadFont:)putinterval 1 index exch 8 exch dup length string cvs putinterval cvn {findfont} @Stopped {pop/Courier findfont} if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end }bind def /isWidthsOnlyFont { dup/WidthsOnly known {pop pop true} { dup/FDepVector known {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall} { dup/FDArray known {/FDArray get{isWidthsOnlyFont dup{exit}if}forall} {pop} ifelse } ifelse } ifelse }bind def /ct_StyleDicts 4 dict dup begin /Adobe-Japan1 4 dict dup begin Level2? { /Serif /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiMin-W3} { /CIDFont/Category resourcestatus { pop pop /HeiseiMin-W3/CIDFont resourcestatus {pop pop/HeiseiMin-W3} {/Ryumin-Light} ifelse } {/Ryumin-Light} ifelse } ifelse def /SansSerif /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiKakuGo-W5} { /CIDFont/Category resourcestatus { pop pop /HeiseiKakuGo-W5/CIDFont resourcestatus {pop pop/HeiseiKakuGo-W5} {/GothicBBB-Medium} ifelse } {/GothicBBB-Medium} ifelse } ifelse def /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiMaruGo-W4} { /CIDFont/Category resourcestatus { pop pop /HeiseiMaruGo-W4/CIDFont resourcestatus {pop pop/HeiseiMaruGo-W4} { /Jun101-Light-RKSJ-H/Font resourcestatus {pop pop/Jun101-Light} {SansSerif} ifelse } ifelse } { /Jun101-Light-RKSJ-H/Font resourcestatus {pop pop/Jun101-Light} {SansSerif} ifelse } ifelse } ifelse /RoundSansSerif exch def /Default Serif def } { /Serif/Ryumin-Light def /SansSerif/GothicBBB-Medium def { (fonts/Jun101-Light-83pv-RKSJ-H)status }stopped {pop}{ {pop pop pop pop/Jun101-Light} {SansSerif} ifelse /RoundSansSerif exch def }ifelse /Default Serif def } ifelse end def /Adobe-Korea1 4 dict dup begin /Serif/HYSMyeongJo-Medium def /SansSerif/HYGoThic-Medium def /RoundSansSerif SansSerif def /Default Serif def end def /Adobe-GB1 4 dict dup begin /Serif/STSong-Light def /SansSerif/STHeiti-Regular def /RoundSansSerif SansSerif def /Default Serif def end def /Adobe-CNS1 4 dict dup begin /Serif/MKai-Medium def /SansSerif/MHei-Medium def /RoundSansSerif SansSerif def /Default Serif def end def end def Level2?{currentglobal true setglobal}if /ct_BoldRomanWidthProc { stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth 0 0 }bind def /ct_Type0WidthProc { dup stringwidth 0 0 moveto 2 index true charpath pathbbox 0 -1 7 index 2 div .88 setcachedevice2 pop 0 0 }bind def /ct_Type0WMode1WidthProc { dup stringwidth pop 2 div neg -0.88 2 copy moveto 0 -1 5 -1 roll true charpath pathbbox setcachedevice }bind def /cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def /ct_BoldBaseFont 11 dict begin /FontType 3 def /FontMatrix[1 0 0 1 0 0]def /FontBBox[0 0 1 1]def /Encoding cHexEncoding def /_setwidthProc/ct_BoldRomanWidthProc load def /_bcstr1 1 string def /BuildChar { exch begin _basefont setfont _bcstr1 dup 0 4 -1 roll put dup _setwidthProc 3 copy moveto show _basefonto setfont moveto show end }bind def currentdict end def systemdict/composefont known { /ct_DefineIdentity-H { /Identity-H/CMap resourcestatus { pop pop } { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering(Identity)def /Supplement 0 def end def /CMapName/Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse } def /ct_BoldBaseCIDFont 11 dict begin /CIDFontType 1 def /CIDFontName/ct_BoldBaseCIDFont def /FontMatrix[1 0 0 1 0 0]def /FontBBox[0 0 1 1]def /_setwidthProc/ct_Type0WidthProc load def /_bcstr2 2 string def /BuildGlyph { exch begin _basefont setfont _bcstr2 1 2 index 256 mod put _bcstr2 0 3 -1 roll 256 idiv put _bcstr2 dup _setwidthProc 3 copy moveto show _basefonto setfont moveto show end }bind def currentdict end def }if Level2?{setglobal}if /ct_CopyFont{ { 1 index/FID ne 2 index/UniqueID ne and {def}{pop pop}ifelse }forall }bind def /ct_Type0CopyFont { exch dup length dict begin ct_CopyFont [ exch FDepVector { dup/FontType get 0 eq { 1 index ct_Type0CopyFont /_ctType0 exch definefont } { /_ctBaseFont exch 2 index exec } ifelse exch } forall pop ] /FDepVector exch def currentdict end }bind def /ct_MakeBoldFont { dup/ct_SyntheticBold known { dup length 3 add dict begin ct_CopyFont /ct_StrokeWidth .03 0 FontMatrix idtransform pop def /ct_SyntheticBold true def currentdict end definefont } { dup dup length 3 add dict begin ct_CopyFont /PaintType 2 def /StrokeWidth .03 0 FontMatrix idtransform pop def /dummybold currentdict end definefont dup/FontType get dup 9 ge exch 11 le and { ct_BoldBaseCIDFont dup length 3 add dict copy begin dup/CIDSystemInfo get/CIDSystemInfo exch def ct_DefineIdentity-H /_Type0Identity/Identity-H 3 -1 roll[exch]composefont /_basefont exch def /_Type0Identity/Identity-H 3 -1 roll[exch]composefont /_basefonto exch def currentdict end /CIDFont defineresource } { ct_BoldBaseFont dup length 3 add dict copy begin /_basefont exch def /_basefonto exch def currentdict end definefont } ifelse } ifelse }bind def /ct_MakeBold{ 1 index 1 index findfont currentglobal 5 1 roll dup gcheck setglobal dup /FontType get 0 eq { dup/WMode known{dup/WMode get 1 eq}{false}ifelse version length 4 ge and {version 0 4 getinterval cvi 2015 ge} {true} ifelse {/ct_Type0WidthProc} {/ct_Type0WMode1WidthProc} ifelse ct_BoldBaseFont/_setwidthProc 3 -1 roll load put {ct_MakeBoldFont}ct_Type0CopyFont definefont } { dup/_fauxfont known not 1 index/SubstMaster known not and { ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put ct_MakeBoldFont } { 2 index 2 index eq {exch pop } { dup length dict begin ct_CopyFont currentdict end definefont } ifelse } ifelse } ifelse pop pop pop setglobal }bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 1 index def /$doSmartSub false def end dup findfont $SubstituteFont begin $substituteFound {false} { dup/FontName known { dup/FontName get $fontname eq 1 index/DistillerFauxFont known not and /currentdistillerparams where {pop false 2 index isWidthsOnlyFont not and} if } {false} ifelse } ifelse exch pop /$doSmartSub true def end { 5 1 roll pop pop pop pop findfont } { 1 index findfont dup/FontType get 3 eq { 6 1 roll pop pop pop pop pop false } {pop true} ifelse { $SubstituteFont begin pop pop /$styleArray 1 index def /$regOrdering 2 index def pop pop 0 1 $styleArray length 1 sub { $styleArray exch get ct_StyleDicts $regOrdering 2 copy known { get exch 2 copy known not {pop/Default} if get dup type/nametype eq { ?str1 cvs length dup 1 add exch ?str1 exch(-)putinterval exch dup length exch ?str1 exch 3 index exch putinterval add ?str1 exch 0 exch getinterval cvn } { pop pop/Unknown } ifelse } { pop pop pop pop/Unknown } ifelse } for end findfont }if } ifelse currentglobal false setglobal 3 1 roll null copyfont definefont pop setglobal }bind def setpacking userdict/$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known {get} {pop pop{pop/Courier}bind} ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams/CannotEmbedFontPolicy 2 copy known {get/Error eq} {pop pop false} ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup/WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type/stringtype eq{cvn}if def /FontType 3 def /FontMatrix[.001 0 0 .001 0 0]def /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def /FontBBox[0 0 0 0]def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth/y exch def/x exch def x y setcharwidth $SubstituteFont/$Strategy get/$Underprint get exec 0 0 moveto cc show x y moveto end end }bind def currentdict end exch setglobal }bind def /$GetaTint 2 dict dup begin /$BuildFont { dup/WMode known {dup/WMode get} {0} ifelse /$WMode exch def $fontname exch dup/FontName known { dup/FontName get dup type/stringtype eq{cvn}if } {/unnamedfont} ifelse exch Adobe_CoolType_Data/InVMDeepCopiedFonts get 1 index/FontName get known { pop Adobe_CoolType_Data/InVMDeepCopiedFonts get 1 index get null copyfont } {$deepcopyfont} ifelse exch 1 index exch/FontBasedOn exch put dup/FontName $fontname dup type/stringtype eq{cvn}if put definefont Adobe_CoolType_Data/InVMDeepCopiedFonts get begin dup/FontBasedOn get 1 index def end }bind def /$Underprint { gsave x abs y abs gt {/y 1000 def} {/x -1000 def 500 120 translate} ifelse Level2? { [/Separation(All)/DeviceCMYK{0 0 0 1 pop}] setcolorspace } {0 setgray} ifelse 10 setlinewidth x .8 mul [7 3] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? {.2 setcolor} {.8 setgray} ifelse fill grestore stroke } forall pop grestore }bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict/FontName known { FontName dup type/stringtype eq{cvn}if } {/unnamedfont} ifelse def /FontName $fontname dup type/stringtype eq{cvn}if def /currentdistillerparams where {pop} { /FontInfo currentdict/FontInfo known {FontInfo null copyfont} {2 dict} ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [1 0 ItalicAngle dup sin exch cos div 1 0 0] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal }bind def end def /$None 1 dict dup begin /$BuildFont{}bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type/stringtype eq{cvn}if dup/$fontname exch def $sname null eq {$str cvs dup length $slen sub $slen getinterval} {pop $sname} ifelse $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval /$match false def $SubstituteFont/$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval {/$match exch def exit} $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont/$dstack get { exch { 1 index eq {pop false} {true} ifelse } {begin false} ifelse } forall pop } if cleartomark /$slen 0 def $match false ne {$match(fonts/)anchorsearch pop pop cvn} {/Courier} ifelse }bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [/Ryumin-Light/HeiseiMin-W3 /GothicBBB-Medium/HeiseiKakuGo-W5 /HeiseiMaruGo-W4/Jun101-Light]def /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def /GB1 [/STSong-Light/STHeiti-Regular]def /CNS1 [/MKai-Medium/MHei-Medium]def end def end def /$cmapname null def /$deepcopyfont { dup/FontType get 0 eq { 1 dict dup/FontName/copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup/FontName/copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } {$Strategies/$Type3Underprint get exec} ifelse }bind def /$buildfontname { dup/CIDFont findresource/CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index(-)putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy(-)putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch {pop pop 3 2 roll putinterval cvn/$cmapname exch def} {pop pop pop pop pop} ifelse length $str 1 index(-)putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn }bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known {get} {pop pop[]} ifelse } {pop pop[]} ifelse false exch { dup/CIDFont resourcestatus { pop pop save 1 index/CIDFont findresource dup/WidthsOnly known {dup/WidthsOnly get} {false} ifelse exch pop exch restore {pop} {exch pop true exit} ifelse } {pop} ifelse } forall {$str cvs $buildfontname} { false(*) { save exch dup/CIDFont findresource dup/WidthsOnly known {dup/WidthsOnly get not} {true} ifelse exch/CIDSystemInfo get dup/Registry get Registry eq exch/Ordering get Ordering eq and and {exch restore exch pop true exit} {pop restore} ifelse } $str/CIDFont resourceforall {$buildfontname} {$fontname $findfontByEnum} ifelse } ifelse }bind def end end currentdict/$error known currentdict/languagelevel known and dup {pop $error/SubstituteFont known} if dup {$error} {Adobe_CoolType_Core} ifelse begin { /SubstituteFont /CMap/Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq {dup $str cvs dup length $slen sub $slen getinterval cvn} {$sname} ifelse Adobe_CoolType_Data/InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known {exch pop true exit} {pop} ifelse } { FontDirectory 1 index known {exch pop true exit} { GlobalFontDirectory 1 index known {exch pop true exit} {pop} ifelse } ifelse } ifelse } forall } {pop pop false} ifelse { exch pop exch pop } { dup/CMap resourcestatus { pop pop dup/$cmapname exch def /CMap findresource/CIDSystemInfo get{def}forall $findfontByROS } { 128 string cvs dup(-)search { 3 1 roll search { 3 1 roll pop {dup cvi} stopped {pop pop pop pop pop $findfontByEnum} { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup/CMap resourcestatus { pop pop 4 1 roll pop pop pop dup/$cmapname exch def /CMap findresource/CIDSystemInfo get{def}forall $findfontByROS true exit } {pop} ifelse } for dup type/booleantype eq {pop} {pop pop pop $findfontByEnum} ifelse } ifelse } {pop pop pop $findfontByEnum} ifelse } {pop pop $findfontByEnum} ifelse } ifelse } ifelse } {//SubstituteFont exec} ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and {$findfontByEnum} {//SubstituteFont exec} ifelse end } } ifelse bind readonly def Adobe_CoolType_Core/scfindfont/systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup/FontName known {dup/FontName get dup 3 index ne} {/noname true} ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def/$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin {1 index/FID eq{pop pop}{def}ifelse} forall currentdict end definefont dup/FontName known{dup/FontName get}{null}ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using )print dup/FontName known {dup/FontName get}{(unspecified font)} ifelse $str cvs print(.\n)print } if } {exch pop} ifelse } {exch pop} ifelse end }bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core/findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type/stringtype ne{$str cvs}if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne {dup $inVMIndex $AddInVMFont} if $doSmartSub { currentdict/$Strategy known {$Strategy/$BuildFont get exec} if } if } if end }bind put } if } if end /$AddInVMFont { exch/FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data/InVMFontsByCMap get exch $DictAdd } {pop pop pop} ifelse }bind def /$DictAdd { 2 copy known not {2 copy 4 index length dict put} if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get{forall}def 2 copy currentdict put end } {pop} ifelse } if get begin {def} forall end }bind def end end %%EndResource currentglobal true setglobal %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 %%Copyright: Copyright 1987-2006 Adobe Systems Incorporated. %%Version: 1.23 0 systemdict/languagelevel known dup {currentglobal false setglobal} {false} ifelse exch userdict/Adobe_CoolType_Utility 2 copy known {2 copy get dup maxlength 27 add dict copy} {27 dict} ifelse put Adobe_CoolType_Utility begin /@eexecStartData def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch/eCCRun known not ct_Level2? and or def ct_Level2? {globaldict begin currentglobal true setglobal} if /ct_AddStdCIDMap ct_Level2? {{ mark Adobe_CoolType_Utility/@recognizeCIDFont currentdict put { ((Hex)57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility/@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq {1 index length exch sub 1 sub{end}repeat exit} {pop} ifelse } for pop pop Adobe_CoolType_Utility/@eexecStartData get eexec } {cleartomark} ifelse }} {{ Adobe_CoolType_Utility/@eexecStartData get eexec }} ifelse bind def userdict/cid_extensions known dup{cid_extensions/cid_UpdateDB known and}if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type/stringtype eq {exch cvn exch} if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq {pop pop cid_UpdateDB} { exch 1 index/Created get eq {exch pop exch pop} {pop cid_UpdateDB} ifelse } ifelse } {pop cid_UpdateDB} ifelse } {cid_UpdateDB} ifelse end }bind def end } if ct_Level2? {end setglobal} if /ct_UseNativeCapability? systemdict/composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring()def /usewidths? true def end def ct_Level2?{setglobal}{pop}ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict/languagelevel known {pop/CIDFont findresource/GlyphDirectory get} { 1 index/CIDFont findresource/GlyphDirectory get dup type/dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + }def /+ { systemdict/languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } {1 dict begin} ifelse /$ exch def systemdict/languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ?{$ begin}if }def /?{$ type/dicttype eq}def /|{ userdict/Adobe_CoolType_Data known { Adobe_CoolType_Data/AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data/CC 3 index put ?{def}{$ 3 1 roll put}ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont/Widths get exch CC exch put } {?{def}{$ 3 1 roll put}ifelse} ifelse end end } {?{def}{$ 3 1 roll put}ifelse} ifelse } {?{def}{$ 3 1 roll put}ifelse} ifelse }def /! { ?{end}if systemdict/languagelevel known {gvm setglobal} if end }def /:{string currentfile exch readstring pop}executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx[.001 0 0 .001 0 0]def /ct_1000Mtx[1000 0 0 1000 0 0]def /ct_raise{exch cvx exch errordict exch get exec stop}bind def /ct_reraise {cvx $error/errorname get(Error: )print dup( )cvs print errordict exch get exec stop }bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop }bind def /ct_GetInterval { Adobe_CoolType_Utility/ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt {dup string/dst_string exch def} if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add/dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add/dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt {arrayIndex get} { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end }bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal {/unknowninstancename/Category resourcestatus} stopped {cleartomark setglobal true} {cleartomark currentglobal not exch setglobal} ifelse { { mark 3 1 roll/Category findresource begin ct_Vars/vm currentglobal put ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec {cleartomark false} {{3 2 roll pop true}{cleartomark false}ifelse} ifelse ct_Vars/vm get setglobal end } } {{resourcestatus}} ifelse bind def /CIDFont/Category ct_resourcestatus {pop pop} { currentglobal true setglobal /Generic/Category findresource dup length dict copy dup/InstanceType/dicttype put /CIDFont exch/Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering(Identity)def /Supplement 0 def end def /CMapName/Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } {pop pop/defineresource/undefined ct_raise} ifelse }bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known {get 3 1 roll pop pop} {pop pop/findresource/undefinedresource ct_raise} ifelse } {pop pop/findresource/undefined ct_raise} ifelse }bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } {pop pop/findresource/undefined ct_raise} ifelse }bind def /ct_resourcestatus/resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup(Binary)eq { pop null currentfile ct_Level2? { {cid_BYTE_COUNT()/SubFileDecode filter} stopped {pop pop pop} if } if /readstring load exit } if dup(Hex)eq { pop currentfile ct_Level2? { {null exch/ASCIIHexDecode filter/readstring} stopped {pop exch pop(>)exch/readhexstring} if } {(>)exch/readhexstring} ifelse load exit } if /StartData/typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch/GlyphData exch put 2 index null eq { pop pop pop } { pop/readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse }bind def /StartData { mark { currentdict dup/FDArray get 0 get/FontMatrix get 0 get 0.001 eq { dup/CDevProc known not { /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known {get} { pop pop {pop pop pop pop pop 0 -1000 7 index 2 div 880} } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp/cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul }def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup/cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup/SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup/SubrMapOffset undef dup/SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } {pop} ifelse } forall } if cleartomark pop pop end CIDFontName currentdict/CIDFont defineresource pop end end } stopped {cleartomark/StartData ct_reraise} if }bind def currentdict end def /ct_saveCIDInit { /CIDInit/ProcSet ct_resourcestatus {true} {/CIDInitC/ProcSet ct_resourcestatus} ifelse { pop pop /CIDInit/ProcSet findresource ct_UseNativeCapability? {pop null} {/CIDInit ct_CIDInit/ProcSet defineresource pop} ifelse } {/CIDInit ct_CIDInit/ProcSet defineresource pop null} ifelse ct_Vars exch/ct_oldCIDInit exch put }bind def /ct_restoreCIDInit { ct_Vars/ct_oldCIDInit get dup null ne {/CIDInit exch/ProcSet defineresource pop} {pop} ifelse }bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility/ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge {pop 0} if /cid exch def { GlyphDirectory cid 2 copy known {get} {pop pop nullstring} ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne {0 FDBytes ct_cvnsi} {pop 0} ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq {/charstring nullstring def exit} if /cid 0 def } ifelse } loop }def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto }def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont/Widths get cid 2 copy known {get exch pop aload pop} {pop pop stringwidth} ifelse } {stringwidth} ifelse setcharwidth 0 0 moveto } ifelse }def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known {get} { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup/FontMatrix 2 copy known {get} {pop pop ct_defaultFontMtx} ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont/Widths get def /CharStrings 1 dict dup/.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup/CharStrings get 1 index/Encoding get ct_dfCharCode get charstring put rootfont/WMode 2 copy known {get} {pop pop 0} ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } {ct_str1 show} ifelse }def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not {ct_1000Mtx matrix concatmatrix concat} {pop} ifelse /Private get Adobe_CoolType_Utility/ct_Level2? get not { ct_dfDict/Private 3 -1 roll {put} 1183615869 internaldict/superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility/ct_Level2? get {1 index} {3 index/Private get mark 6 1 roll} ifelse dup/RunInt known {/RunInt get} {pop/CCRun} ifelse get exec Adobe_CoolType_Utility/ct_Level2? get not {cleartomark} if }bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility/ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped {stop} if end end end end }bind def /BaseFontNameStr(BF00)def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0]def /FontBBox [-250 -250 1250 1250]def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0]def /FontBBox [-250 -250 1250 1250]def /Encoding ct_cHexEncoding def /BuildChar/ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString/ct_Type3ShowCharString load def /ct_dfSetCacheProc/ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup/lenIV 4 put def /CharStrings 1 dict dup/.notdefput def /PaintType 0 def /ct_ShowCharString/ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not {exit} if } for exch pop exch pop }bind def /ct_makeocf { 15 dict begin exch/WMode exch def exch/FontName exch def /FontType 0 def /FMapType 2 def dup/FontMatrix known {dup/FontMatrix get/FontMatrix exch def} {/FontMatrix matrix def} ifelse /bfCount 1 index/CIDCount get 256 idiv 1 add dup 256 gt{pop 256}if def /Encoding 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for bfCount 1 255{2 copy bfCount put pop}for def /FDepVector bfCount dup 256 lt{1 add}if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont/FontBBox known {CIDFont/FontBBox get/FontBBox exch def} if CIDFont/CDevProc known {CIDFont/CDevProc get/CDevProc exch def} if currentdict end BaseFontNameStr 3(0)putinterval 0 1 bfCount dup 256 eq{1 sub}if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup/CIDFirstByte exch 256 mul def FontType 3 eq {/ct_FDDict 2 dict def} if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def} if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont/Widths get begin exch/CIDFont get/GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } {exch pop} ifelse }bind def currentglobal true setglobal /ct_ComposeFont { ct_UseNativeCapability? { 2 index/CMap ct_resourcestatus {pop pop exch pop} { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch/WMode exch def /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-)search { pop pop (-)search { dup length string copy exch pop exch pop } {pop(Identity)} ifelse } {pop (Identity)} ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get/CIDFont findresource ct_makeocf } ifelse }bind def setglobal /ct_MakeIdentity { ct_UseNativeCapability? { 1 index/CMap ct_resourcestatus {pop pop} { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-)search { pop pop (-)search {dup length string copy exch pop exch pop} {pop(Identity)} ifelse } {pop(Identity)} ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse composefont } { exch pop 0 get/CIDFont findresource ct_makeocf } ifelse }bind def currentdict readonly pop end end %%EndResource setglobal %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict/ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge }bind def /AllocGlyphStorage { Is2015? { pop } { {string}forall }ifelse }bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix[1 0 0 1 0 0]def 4 array astore cvx/FontBBox exch def /sfnts }bind def /Type42DictEnd { currentdict dup/FontName get exch definefont end ct_T42Dict exch dup/FontName get exch put }bind def /RD{string currentfile exch readstring pop}executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop }ifelse }bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop }ifelse }bind def /T0AddT42Mtx2 { /CIDFont findresource/Metrics2 get begin def end }bind def end %%EndResource currentglobal true setglobal %%BeginFile: MMFauxFont.prc %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. %%All Rights Reserved. userdict /ct_EuroDict 10 dict put ct_EuroDict begin /ct_CopyFont { { 1 index /FID ne {def} {pop pop} ifelse} forall } def /ct_GetGlyphOutline { gsave initmatrix newpath exch findfont dup length 1 add dict begin ct_CopyFont /Encoding Encoding dup length array copy dup 4 -1 roll 0 exch put def currentdict end /ct_EuroFont exch definefont 1000 scalefont setfont 0 0 moveto [ <00> stringwidth <00> false charpath pathbbox [ {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall grestore counttomark 8 add } def /ct_MakeGlyphProc { ] cvx /ct_PSBuildGlyph cvx ] cvx } def /ct_PSBuildGlyph { gsave 8 -1 roll pop 7 1 roll 6 -2 roll ct_FontMatrix transform 6 2 roll 4 -2 roll ct_FontMatrix transform 4 2 roll ct_FontMatrix transform currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse dup 9 1 roll { currentdict /StrokeWidth 2 copy known { get 2 div 0 ct_FontMatrix dtransform pop 5 1 roll 4 -1 roll 4 index sub 4 1 roll 3 -1 roll 4 index sub 3 1 roll exch 4 index add exch 4 index add 5 -1 roll pop } { pop pop } ifelse } if setcachedevice ct_FontMatrix concat ct_PSPathOps begin exec end { currentdict /StrokeWidth 2 copy known { get } { pop pop 0 } ifelse setlinewidth stroke } { fill } ifelse grestore } def /ct_PSPathOps 4 dict dup begin /m {moveto} def /l {lineto} def /c {curveto} def /cp {closepath} def end def /ct_matrix1000 [1000 0 0 1000 0 0] def /ct_AddGlyphProc { 2 index findfont dup length 4 add dict begin ct_CopyFont /CharStrings CharStrings dup length 1 add dict copy begin 3 1 roll def currentdict end def /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def /ct_PSBuildGlyph /ct_PSBuildGlyph load def /ct_PSPathOps /ct_PSPathOps load def currentdict end definefont pop } def systemdict /languagelevel known { /ct_AddGlyphToPrinterFont { 2 copy ct_GetGlyphOutline 3 add -1 roll restore ct_MakeGlyphProc ct_AddGlyphProc } def } { /ct_AddGlyphToPrinterFont { pop pop restore Adobe_CTFauxDict /$$$FONTNAME get /Euro Adobe_CTFauxDict /$$$SUBSTITUTEBASE get ct_EuroDict exch get ct_AddGlyphProc } def } ifelse /AdobeSansMM { 556 0 24 -19 541 703 { 541 628 m 510 669 442 703 354 703 c 201 703 117 607 101 444 c 50 444 l 25 372 l 97 372 l 97 301 l 49 301 l 24 229 l 103 229 l 124 67 209 -19 350 -19 c 435 -19 501 25 509 32 c 509 131 l 492 105 417 60 343 60 c 267 60 204 127 197 229 c 406 229 l 430 301 l 191 301 l 191 372 l 455 372 l 479 444 l 194 444 l 201 531 245 624 348 624 c 433 624 484 583 509 534 c cp 556 0 m } ct_PSBuildGlyph } def /AdobeSerifMM { 500 0 10 -12 484 692 { 347 298 m 171 298 l 170 310 170 322 170 335 c 170 362 l 362 362 l 374 403 l 172 403 l 184 580 244 642 308 642 c 380 642 434 574 457 457 c 481 462 l 474 691 l 449 691 l 433 670 429 657 410 657 c 394 657 360 692 299 692 c 204 692 94 604 73 403 c 22 403 l 10 362 l 70 362 l 69 352 69 341 69 330 c 69 319 69 308 70 298 c 22 298 l 10 257 l 73 257 l 97 57 216 -12 295 -12 c 364 -12 427 25 484 123 c 458 142 l 425 101 384 37 316 37 c 256 37 189 84 173 257 c 335 257 l cp 500 0 m } ct_PSBuildGlyph } def end %%EndFile setglobal Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 +%%Version: 1.0 0 +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{ + currentpacking + true setpacking +}if +userdict/Adobe_AGM_Image 71 dict dup begin put +/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def +/nd{ + null def +}bind def +/AGMIMG_&image nd +/AGMIMG_&colorimage nd +/AGMIMG_&imagemask nd +/AGMIMG_mbuf()def +/AGMIMG_ybuf()def +/AGMIMG_kbuf()def +/AGMIMG_c 0 def +/AGMIMG_m 0 def +/AGMIMG_y 0 def +/AGMIMG_k 0 def +/AGMIMG_tmp nd +/AGMIMG_imagestring0 nd +/AGMIMG_imagestring1 nd +/AGMIMG_imagestring2 nd +/AGMIMG_imagestring3 nd +/AGMIMG_imagestring4 nd +/AGMIMG_imagestring5 nd +/AGMIMG_cnt nd +/AGMIMG_fsave nd +/AGMIMG_colorAry nd +/AGMIMG_override nd +/AGMIMG_name nd +/AGMIMG_maskSource nd +/AGMIMG_flushfilters nd +/invert_image_samples nd +/knockout_image_samples nd +/img nd +/sepimg nd +/devnimg nd +/idximg nd +/ds +{ + Adobe_AGM_Core begin + Adobe_AGM_Image begin + /AGMIMG_&image systemdict/image get def + /AGMIMG_&imagemask systemdict/imagemask get def + /colorimage where{ + pop + /AGMIMG_&colorimage/colorimage ldf + }if + end + end +}def +/ps +{ + Adobe_AGM_Image begin + /AGMIMG_ccimage_exists{/customcolorimage where + { + pop + /Adobe_AGM_OnHost_Seps where + { + pop false + }{ + /Adobe_AGM_InRip_Seps where + { + pop false + }{ + true + }ifelse + }ifelse + }{ + false + }ifelse + }bdf + level2{ + /invert_image_samples + { + Adobe_AGM_Image/AGMIMG_tmp Decode length ddf + /Decode[Decode 1 get Decode 0 get]def + }def + /knockout_image_samples + { + Operator/imagemask ne{ + /Decode[1 1]def + }if + }def + }{ + /invert_image_samples + { + {1 exch sub}currenttransfer addprocs settransfer + }def + /knockout_image_samples + { + {pop 1}currenttransfer addprocs settransfer + }def + }ifelse + /img/imageormask ldf + /sepimg/sep_imageormask ldf + /devnimg/devn_imageormask ldf + /idximg/indexed_imageormask ldf + /_ctype 7 def + currentdict{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ + bind + }if + def + }forall +}def +/pt +{ + end +}def +/dt +{ +}def +/AGMIMG_flushfilters +{ + dup type/arraytype ne + {1 array astore}if + dup 0 get currentfile ne + {dup 0 get flushfile}if + { + dup type/filetype eq + { + dup status 1 index currentfile ne and + {closefile} + {pop} + ifelse + }{pop}ifelse + }forall +}def +/AGMIMG_init_common +{ + currentdict/T known{/ImageType/T ldf currentdict/T undef}if + currentdict/W known{/Width/W ldf currentdict/W undef}if + currentdict/H known{/Height/H ldf currentdict/H undef}if + currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if + currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if + currentdict/D known{/Decode/D ldf currentdict/D undef}if + currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if + currentdict/O known{ + /Operator/O load 1 eq{ + /imagemask + }{ + /O load 2 eq{ + /image + }{ + /colorimage + }ifelse + }ifelse + def + currentdict/O undef + }if + currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if + currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if + currentdict/I known{/Interpolate/I ldf currentdict/I undef}if + currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if + /DataSource load xcheck not{ + DataSource type/arraytype eq{ + DataSource 0 get type/filetype eq{ + /_Filters DataSource def + currentdict/MultipleDataSources known not{ + /DataSource DataSource dup length 1 sub get def + }if + }if + }if + currentdict/MultipleDataSources known not{ + /MultipleDataSources DataSource type/arraytype eq{ + DataSource length 1 gt + } + {false}ifelse def + }if + }if + /NComponents Decode length 2 div def + currentdict/SkipImageProc known not{/SkipImageProc{false}def}if +}bdf +/imageormask_sys +{ + begin + AGMIMG_init_common + save mark + level2{ + currentdict + Operator/imagemask eq{ + AGMIMG_&imagemask + }{ + use_mask{ + process_mask AGMIMG_&image + }{ + AGMIMG_&image + }ifelse + }ifelse + }{ + Width Height + Operator/imagemask eq{ + Decode 0 get 1 eq Decode 1 get 0 eq and + ImageMatrix/DataSource load + AGMIMG_&imagemask + }{ + BitsPerComponent ImageMatrix/DataSource load + AGMIMG_&image + }ifelse + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + cleartomark restore + end +}def +/overprint_plate +{ + currentoverprint{ + 0 get dup type/nametype eq{ + dup/DeviceGray eq{ + pop AGMCORE_black_plate not + }{ + /DeviceCMYK eq{ + AGMCORE_is_cmyk_sep not + }if + }ifelse + }{ + false exch + { + AGMOHS_sepink eq or + }forall + not + }ifelse + }{ + pop false + }ifelse +}def +/process_mask +{ + level3{ + dup begin + /ImageType 1 def + end + 4 dict begin + /DataDict exch def + /ImageType 3 def + /InterleaveType 3 def + /MaskDict 9 dict begin + /ImageType 1 def + /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def + /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def + /ImageMatrix[Width 0 0 Height neg 0 Height]def + /NComponents 1 def + /BitsPerComponent 1 def + /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def + /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def + currentdict end def + currentdict end + }if +}def +/use_mask +{ + dup/Mask known {dup/Mask get}{false}ifelse +}def +/imageormask +{ + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + } + { + save mark + level2 AGMCORE_host_sep not and{ + currentdict + Operator/imagemask eq DeviceN_PS2 not and{ + imagemask + }{ + AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{ + [/Separation/Black/DeviceGray{}]setcolorspace + /Decode[Decode 1 get Decode 0 get]def + }if + use_mask{ + process_mask image + }{ + DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and + { + Names convert_to_process not{ + 2 dict begin + /imageDict xdf + /names_index 0 def + gsave + imageDict write_image_file{ + Names{ + dup(None)ne{ + [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace + Operator imageDict read_image_file + names_index 0 eq{true setoverprint}if + /names_index names_index 1 add def + }{ + pop + }ifelse + }forall + close_image_file + }if + grestore + end + }{ + Operator/imagemask eq{ + imagemask + }{ + image + }ifelse + }ifelse + }{ + Operator/imagemask eq{ + imagemask + }{ + image + }ifelse + }ifelse + }ifelse + }ifelse + }{ + Width Height + Operator/imagemask eq{ + Decode 0 get 1 eq Decode 1 get 0 eq and + ImageMatrix/DataSource load + /Adobe_AGM_OnHost_Seps where{ + pop imagemask + }{ + currentgray 1 ne{ + currentdict imageormask_sys + }{ + currentoverprint not{ + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse + }ifelse + }ifelse + }{ + BitsPerComponent ImageMatrix + MultipleDataSources{ + 0 1 NComponents 1 sub{ + DataSource exch get + }for + }{ + /DataSource load + }ifelse + Operator/colorimage eq{ + AGMCORE_host_sep{ + MultipleDataSources level2 or NComponents 4 eq and{ + AGMCORE_is_cmyk_sep{ + MultipleDataSources{ + /DataSource DataSource 0 get xcheck + { + [ + DataSource 0 get/exec cvx + DataSource 1 get/exec cvx + DataSource 2 get/exec cvx + DataSource 3 get/exec cvx + /AGMCORE_get_ink_data cvx + ]cvx + }{ + DataSource aload pop AGMCORE_get_ink_data + }ifelse def + }{ + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + /DataSource load + filter_cmyk 0()/SubFileDecode filter def + }ifelse + /Decode[Decode 0 get Decode 1 get]def + /MultipleDataSources false def + /NComponents 1 def + /Operator/image def + invert_image_samples + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentoverprint not Operator/imagemask eq and{ + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse + }ifelse + }{ + MultipleDataSources NComponents AGMIMG_&colorimage + }ifelse + }{ + true NComponents colorimage + }ifelse + }{ + Operator/image eq{ + AGMCORE_host_sep{ + /DoImage true def + currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse + { + AGMCORE_black_plate not Operator/imagemask ne and{ + /DoImage false def + currentdict ignoreimagedata + }if + }if + 1 AGMCORE_&setgray + DoImage + {currentdict imageormask_sys}if + }{ + use_mask{ + process_mask image + }{ + image + }ifelse + }ifelse + }{ + Operator/knockout eq{ + pop pop pop pop pop + currentcolorspace overprint_plate not{ + knockout_unitsq + }if + }if + }ifelse + }ifelse + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end +}def +/sep_imageormask +{ + /sep_colorspace_dict AGMCORE_gget begin + CSA map_csa + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + }{ + save mark + AGMCORE_avoid_L2_sep_space{ + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def + }if + AGMIMG_ccimage_exists + MappedCSA 0 get/DeviceCMYK eq and + currentdict/Components known and + Name()ne and + Name(All)ne and + Operator/image eq and + AGMCORE_producing_seps not and + level2 not and + { + Width Height BitsPerComponent ImageMatrix + [ + /DataSource load/exec cvx + { + 0 1 2 index length 1 sub{ + 1 index exch + 2 copy get 255 xor put + }for + }/exec cvx + ]cvx bind + MappedCSA 0 get/DeviceCMYK eq{ + Components aload pop + }{ + 0 0 0 Components aload pop 1 exch sub + }ifelse + Name findcmykcustomcolor + customcolorimage + }{ + AGMCORE_producing_seps not{ + level2{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{ + [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if + currentdict imageormask + }{ + currentdict + Operator/imagemask eq{ + imageormask + }{ + sep_imageormask_lev1 + }ifelse + }ifelse + }{ + AGMCORE_host_sep{ + Operator/knockout eq{ + currentdict/ImageMatrix get concat + knockout_unitsq + }{ + currentgray 1 ne{ + AGMCORE_is_cmyk_sep Name(All)ne and{ + level2{ + Name AGMCORE_IsSeparationAProcessColor + { + Operator/imagemask eq{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor + }if + }{ + invert_image_samples + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + [/Separation Name[/DeviceGray] + { + sep_colorspace_proc AGMCORE_get_ink_data + 1 exch sub + }bind + ]AGMCORE_&setcolorspace + /sep_tint AGMCORE_gget AGMCORE_&setcolor + }if + }ifelse + currentdict imageormask_sys + }{ + currentdict + Operator/imagemask eq{ + imageormask_sys + }{ + sep_image_lev1_sep + }ifelse + }ifelse + }{ + Operator/imagemask ne{ + invert_image_samples + }if + currentdict imageormask_sys + }ifelse + }{ + currentoverprint not Name(All)eq or Operator/imagemask eq and{ + currentdict imageormask_sys + }{ + currentoverprint not + { + gsave + knockout_unitsq + grestore + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + currentcolorspace 0 get/Separation ne{ + [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if + }if + currentoverprint + MappedCSA 0 get/DeviceCMYK eq and + Name AGMCORE_IsSeparationAProcessColor not and + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse + Name(All)ne and{ + imageormask_l2_overprint + }{ + currentdict imageormask + }ifelse + }ifelse + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end + end +}def +/colorSpaceElemCnt +{ + mark currentcolor counttomark dup 2 add 1 roll cleartomark +}bdf +/devn_sep_datasource +{ + 1 dict begin + /dataSource xdf + [ + 0 1 dataSource length 1 sub{ + dup currentdict/dataSource get/exch cvx/get cvx/exec cvx + /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx + }for + ]cvx bind + end +}bdf +/devn_alt_datasource +{ + 11 dict begin + /convProc xdf + /origcolorSpaceElemCnt xdf + /origMultipleDataSources xdf + /origBitsPerComponent xdf + /origDecode xdf + /origDataSource xdf + /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def + /DataSource origMultipleDataSources + { + [ + BitsPerComponent 8 idiv origDecode length 2 idiv mul string + 0 1 origDecode length 2 idiv 1 sub + { + dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch + origDataSource exch get 0()/SubFileDecode filter + BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx + }for + ]bind cvx + }{origDataSource}ifelse 0()/SubFileDecode filter def + [ + origcolorSpaceElemCnt string + 0 2 origDecode length 2 sub + { + dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div + 1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx + }for + /convProc load/exec cvx + origcolorSpaceElemCnt 1 sub -1 0 + { + /dup cvx 2/add cvx/index cvx + 3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx + }for + ]bind cvx 0()/SubFileDecode filter + end +}bdf +/devn_imageormask +{ + /devicen_colorspace_dict AGMCORE_gget begin + CSA map_csa + 2 dict begin + dup + /srcDataStrs[3 -1 roll begin + AGMIMG_init_common + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi + { + dup 65535 gt{1 add 2 div cvi}{exit}ifelse + }loop + string + }repeat + end]def + /dstDataStr srcDataStrs 0 get length string def + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + }{ + save mark + AGMCORE_producing_seps not{ + level3 not{ + Operator/imagemask ne{ + /DataSource[[ + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def + /MultipleDataSources true def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + }if + }if + currentdict imageormask + }{ + AGMCORE_host_sep{ + Names convert_to_process{ + CSA get_csa_by_name 0 get/DeviceCMYK eq{ + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + 4/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + filter_cmyk 0()/SubFileDecode filter def + /MultipleDataSources false def + /Decode[1 0]def + /DeviceGray setcolorspace + currentdict imageormask_sys + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate{ + /DataSource + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + /MultipleDataSources false def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + currentdict imageormask_sys + }{ + gsave + knockout_unitsq + grestore + currentdict consumeimagedata + }ifelse + }ifelse + } + { + /devicen_colorspace_dict AGMCORE_gget/names_index known{ + Operator/imagemask ne{ + MultipleDataSources{ + /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def + /MultipleDataSources false def + }{ + /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def + }ifelse + invert_image_samples + }if + currentdict imageormask_sys + }{ + currentoverprint not Operator/imagemask eq and{ + currentdict imageormask_sys + }{ + currentoverprint not + { + gsave + knockout_unitsq + grestore + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + currentdict imageormask + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end + end + end +}def +/imageormask_l2_overprint +{ + currentdict + currentcmykcolor add add add 0 eq{ + currentdict consumeimagedata + }{ + level3{ + currentcmykcolor + /AGMIMG_k xdf + /AGMIMG_y xdf + /AGMIMG_m xdf + /AGMIMG_c xdf + Operator/imagemask eq{ + [/DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ]/DeviceCMYK{}]setcolorspace + AGMIMG_c 0 ne{AGMIMG_c}if + AGMIMG_m 0 ne{AGMIMG_m}if + AGMIMG_y 0 ne{AGMIMG_y}if + AGMIMG_k 0 ne{AGMIMG_k}if + setcolor + }{ + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def + [/Indexed + [ + /DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ] + /DeviceCMYK{ + AGMIMG_k 0 eq{0}if + AGMIMG_y 0 eq{0 exch}if + AGMIMG_m 0 eq{0 3 1 roll}if + AGMIMG_c 0 eq{0 4 1 roll}if + } + ] + 255 + { + 255 div + mark exch + dup dup dup + AGMIMG_k 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_y 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_m 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_c 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + counttomark 1 add -1 roll pop + } + ]setcolorspace + }ifelse + imageormask_sys + }{ + write_image_file{ + currentcmykcolor + 0 ne{ + [/Separation/Black/DeviceGray{}]setcolorspace + gsave + /Black + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Yellow/DeviceGray{}]setcolorspace + gsave + /Yellow + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Magenta/DeviceGray{}]setcolorspace + gsave + /Magenta + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Cyan/DeviceGray{}]setcolorspace + gsave + /Cyan + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + close_image_file + }{ + imageormask + }ifelse + }ifelse + }ifelse +}def +/indexed_imageormask +{ + begin + AGMIMG_init_common + save mark + currentdict + AGMCORE_host_sep{ + Operator/knockout eq{ + /indexed_colorspace_dict AGMCORE_gget dup/CSA known{ + /CSA get get_csa_by_name + }{ + /Names get + }ifelse + overprint_plate not{ + knockout_unitsq + }if + }{ + Indexed_DeviceN{ + /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{ + indexed_image_lev2_sep + }{ + currentoverprint not{ + knockout_unitsq + }if + currentdict consumeimagedata + }ifelse + }{ + AGMCORE_is_cmyk_sep{ + Operator/imagemask eq{ + imageormask_sys + }{ + level2{ + indexed_image_lev2_sep + }{ + indexed_image_lev1_sep + }ifelse + }ifelse + }{ + currentoverprint not{ + knockout_unitsq + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + level2{ + Indexed_DeviceN{ + /indexed_colorspace_dict AGMCORE_gget begin + }{ + /indexed_colorspace_dict AGMCORE_gget dup null ne + { + begin + currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse + get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and + AGMCORE_in_rip_sep and{ + [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup] + setcolorspace + }if + end + } + {pop}ifelse + }ifelse + imageormask + Indexed_DeviceN{ + end + }if + }{ + Operator/imagemask eq{ + imageormask + }{ + indexed_imageormask_lev1 + }ifelse + }ifelse + }ifelse + cleartomark restore + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end +}def +/indexed_image_lev2_sep +{ + /indexed_colorspace_dict AGMCORE_gget begin + begin + Indexed_DeviceN not{ + currentcolorspace + dup 1/DeviceGray put + dup 3 + currentcolorspace 2 get 1 add string + 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub + { + dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put + }for + put setcolorspace + }if + currentdict + Operator/imagemask eq{ + AGMIMG_&imagemask + }{ + use_mask{ + process_mask AGMIMG_&image + }{ + AGMIMG_&image + }ifelse + }ifelse + end end +}def + /OPIimage + { + dup type/dicttype ne{ + 10 dict begin + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /ImageType 1 def + /Decode[0 1 def] + currentdict + end + }if + dup begin + /NComponents 1 cdndf + /MultipleDataSources false cdndf + /SkipImageProc{false}cdndf + /Decode[ + 0 + currentcolorspace 0 get/Indexed eq{ + 2 BitsPerComponent exp 1 sub + }{ + 1 + }ifelse + ]cdndf + /Operator/image cdndf + end + /sep_colorspace_dict AGMCORE_gget null eq{ + imageormask + }{ + gsave + dup begin invert_image_samples end + sep_imageormask + grestore + }ifelse + }def +/cachemask_level2 +{ + 3 dict begin + /LZWEncode filter/WriteFilter xdf + /readBuffer 256 string def + /ReadFilter + currentfile + 0(%EndMask)/SubFileDecode filter + /ASCII85Decode filter + /RunLengthDecode filter + def + { + ReadFilter readBuffer readstring exch + WriteFilter exch writestring + not{exit}if + }loop + WriteFilter closefile + end +}def +/spot_alias +{ + /mapto_sep_imageormask + { + dup type/dicttype ne{ + 12 dict begin + /ImageType 1 def + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /MultipleDataSources false def + }{ + begin + }ifelse + /Decode[/customcolor_tint AGMCORE_gget 0]def + /Operator/image def + /SkipImageProc{false}def + currentdict + end + sep_imageormask + }bdf + /customcolorimage + { + Adobe_AGM_Image/AGMIMG_colorAry xddf + /customcolor_tint AGMCORE_gget + << + /Name AGMIMG_colorAry 4 get + /CSA[/DeviceCMYK] + /TintMethod/Subtractive + /TintProc null + /MappedCSA null + /NComponents 4 + /Components[AGMIMG_colorAry aload pop pop] + >> + setsepcolorspace + mapto_sep_imageormask + }ndf + Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put + /customcolorimage + { + Adobe_AGM_Image/AGMIMG_override false put + current_spot_alias{dup 4 get map_alias}{false}ifelse + { + false set_spot_alias + /customcolor_tint AGMCORE_gget exch setsepcolorspace + pop + mapto_sep_imageormask + true set_spot_alias + }{ + //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec + }ifelse + }bdf +}def +/snap_to_device +{ + 6 dict begin + matrix currentmatrix + dup 0 get 0 eq 1 index 3 get 0 eq and + 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop + { + 1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def + 0 0 transform + AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + itransform/AGMIMG_llY exch def/AGMIMG_llX exch def + 1 1 transform + AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + itransform/AGMIMG_urY exch def/AGMIMG_urX exch def + [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat + }{ + }ifelse + end +}def +level2 not{ + /colorbuf + { + 0 1 2 index length 1 sub{ + dup 2 index exch get + 255 exch sub + 2 index + 3 1 roll + put + }for + }def + /tint_image_to_color + { + begin + Width Height BitsPerComponent ImageMatrix + /DataSource load + end + Adobe_AGM_Image begin + /AGMIMG_mbuf 0 string def + /AGMIMG_ybuf 0 string def + /AGMIMG_kbuf 0 string def + { + colorbuf dup length AGMIMG_mbuf length ne + { + dup length dup dup + /AGMIMG_mbuf exch string def + /AGMIMG_ybuf exch string def + /AGMIMG_kbuf exch string def + }if + dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop + } + addprocs + {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage + end + }def + /sep_imageormask_lev1 + { + begin + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + { + 255 mul round cvi GrayLookup exch get + }currenttransfer addprocs settransfer + currentdict imageormask + }{ + /sep_colorspace_dict AGMCORE_gget/Components known{ + MappedCSA 0 get/DeviceCMYK eq{ + Components aload pop + }{ + 0 0 0 Components aload pop 1 exch sub + }ifelse + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf + AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ + {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer + currentdict imageormask + }{ + currentcolortransfer + {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }ifelse + }{ + MappedCSA 0 get/DeviceGray eq{ + {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer + currentdict imageormask + }{ + MappedCSA 0 get/DeviceCMYK eq{ + currentcolortransfer + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }{ + currentcolortransfer + {pop 1}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }ifelse + }ifelse + }ifelse + }ifelse + end + }def + /sep_image_lev1_sep + { + begin + /sep_colorspace_dict AGMCORE_gget/Components known{ + Components aload pop + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf + {AGMIMG_c mul 1 exch sub} + {AGMIMG_m mul 1 exch sub} + {AGMIMG_y mul 1 exch sub} + {AGMIMG_k mul 1 exch sub} + }{ + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} + }ifelse + AGMCORE_get_ink_data currenttransfer addprocs settransfer + currentdict imageormask_sys + end + }def + /indexed_imageormask_lev1 + { + /indexed_colorspace_dict AGMCORE_gget begin + begin + currentdict + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer + imageormask + }{ + MappedCSA 0 get/DeviceGray eq{ + {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer + imageormask + }{ + MappedCSA 0 get/DeviceCMYK eq{ + currentcolortransfer + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + tint_image_to_color + }{ + currentcolortransfer + {pop 1}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi Lookup exch get HiVal div}exch addprocs 4 1 roll + setcolortransfer + tint_image_to_color + }ifelse + }ifelse + }ifelse + end end + }def + /indexed_image_lev1_sep + { + /indexed_colorspace_dict AGMCORE_gget begin + begin + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} + AGMCORE_get_ink_data currenttransfer addprocs settransfer + currentdict imageormask_sys + end end + }def +}if +end +systemdict/setpacking known +{setpacking}if +%%EndResource +currentdict Adobe_AGM_Utils eq {end} if +%%EndProlog +%%BeginSetup +Adobe_AGM_Utils begin +2 2010 Adobe_AGM_Core/ds gx +Adobe_CoolType_Core/ds get exec Adobe_AGM_Image/ds gx +currentdict Adobe_AGM_Utils eq {end} if +%%EndSetup +%%Page: (Page 1) 1 +%%EndPageComments +%%BeginPageSetup +%ADOBeginClientInjection: PageSetup Start "AI11EPS" +%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 +%ADOEndClientInjection: PageSetup Start "AI11EPS" +Adobe_AGM_Utils begin +Adobe_AGM_Core/ps gx +Adobe_AGM_Utils/capture_cpd gx +Adobe_CoolType_Core/ps get exec Adobe_AGM_Image/ps gx +%ADOBeginClientInjection: PageSetup End "AI11EPS" +/currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 + + + + application/postscript + + + Kelik + + + + + Crunchy Data Solutions, Inc. + + + + + Adobe Illustrator CS3 + 2014-12-19T19:56:59+07:00 + 2014-12-19T19:56:59+07:00 + 2014-12-19T19:56:59+07:00 + + + + 256 + 80 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXz3/ AM5Z+ctZ0y20HRNPlktY7mR76e4iYoxe2ZPRVWG/wO3P58TikJp+W/8Azkn5YuPJ1u3m69MXmKCQ 2zwQwySyXXEApMiQqwXmDQ1oOQPtitMl/wCV1S3Z/wBwvknzJqKdFuGsxbwtWlOLyP8AwxQv/wCV pecv/Lc6z/yMt/8AmrFVjfnVJZlRrPkrzFYKx4+slolzEDSu7RSV+W2KphpP55flfqM/1b9Nx2N3 UK9tqCSWbqx6AmdUT/hsVZvbXVtdQrPbTJPA+6SxsHQj2Zag4qqYq7FXYq7FXYq7FUv1PzF5f0oE 6nqdpYBd2NzPHDTav7bL2xVjN3+dn5UWpIl8z2TEGn7pzMPviD4qgE/5yG/Jx5jCPMaB1qCWt7tV 28HMIU/fiqZWn5zflXdkCLzRYLypT1pRD18fV4UxVkuna9oepgNpuo2t6pFQbaaOUU6/sFsVR2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KsM87fm75H8nXKWWq3jS6pIAY9MtEM9yQ32aquy8u3IiuKvM /Mmi63+bGo2V95ksG0Hyxp5ZtN01+P6RmMlObztT9wrcR8HXb5NhVlOlaX5T8n2ypp8dro8dKery WJ27fFKx5ufmcUM58rapJfxSOky3Vquyzqwccv5eQJrtiUvO/wA8vN3mzRHiTRWKQrb3FzcOE9Q0 gWIJGqkFau0xYkg/Cppir55vPzFvzevfa3NcX/mG0e2lsXr6UNrKkyyyokS8UWka+m9V5Ek9h8Sm n1JqOj6frcQtdSsIdTjpRYrmJZ6D/J5Biv8AscWLFm/I6bT52vfJOo6j5TvSSxit5Wms3NP27eVq mvu5A/lxSif+VgfnD5MX/ndPLg8w6Qn2tb0QfvVX+aW3IX6dkX3wKzHyp+cH5deaEX9Ga1Atyw3s 7lvq84Phwk48v9jUYqitZ/NL8utGqNR8x2ETjrEk6Syj/nnEXf8ADFWB6n/zlH5GWYWvl+x1HzBe PURR20BjRv8AkZ+9+6M4rSBfzn/zkj5oH+4Hytb+WLN+lzqLAzLXp8M/A/8AJDFUO35Gfm7r+/mz 8wpkjbd7Wx9Z4jXtx5Wsf/CYqjdN/wCcS/y9gPPUL7Ur+UmrVljiQ19kj51/2eKbT63/AOca/wAn Ik4vojznb4pLu7B/4SVBii01i/Iz8pYgQvlm0Nf5/Uf/AIkxxVQufyA/J+5BEnluFankfSmuYt/+ ecq7e2KpBf8A/OLH5XzkNZnUNNlU8o3t7nkVYUof3yy9xitoQfkd+Y2ifF5T/Ma+ijX7Fnfq0sQP /Bun/JLFV6a7/wA5L+Wx/uT0TTfNlrH9uaxkEM5p4D93+EGKo/S/+cjfKa3KWPmvTtQ8p6g2xj1C B/Sr7Oq8+vdowMVemaRrej6zZre6TewX9o/2Z7eRZV3FaEqTQ+2Ko3FXYq7FXYq7FXYq7FXYqh9R uxZafdXhXkLaGSYr4+mpan4Yq+Nvyk/OCx0DzLruoeaopLs+YeLT6nEoknhlVmbZWI/dv6lGAPYY pIe6WPnfRtS8t3uv6b6sthaQyTCSaJ4A/pozsFMgWtONCRt74WL5n8tfmR5ts/Ok3mSCK31TXbxH ijN7GZljLspDQryXgU48V3oBtgZU+iPym/OXzH5n0S/tr97WfzBbfvraVYpYoWheqrzXinSRWUlD hQUPafnDr/mPT7uW18h6le6zprvbXL2bKbP1oyVIErLyr/khSRirFPyd/LzRNa1PXvMPnHRZdLuN KvTOY7tHggiRwZFQIVjDvGRvyB6rthhEyNAWSxyZIwiZSNRDONf/ADhuFd7Xy1ClnaIaC7kUPK9P 2grVVQf8oE/LpnS6XsWAF5dz3dHiNf7TZJExwDhj/OO5Pw5D7fgx/wD5Wh515cv0o9f9SKn3cKZn fyZp/wCb9/63Vfy5rf8AVD8o/qZP5Y/Oq7jmS38wIs9uxAN7EoWRK92RfhYf6oB+eYGq7FiReLY9 zt+z/abICI5xxR/nDmPeOR+FfFNPP/5J/l153s21JUi07UbhecOs2fFQ5YVDSoKRyg+J+L/KGc2Y EGiN3tI5ImIkD6Swzyh/zi95STSprPzRcR3eomUm1v8ATbmRGMRAorRSKUDKR1ANa+26YEdEjID1 Zf5E/KzX/wAvNVWPQNRj1XyzdsFvLC9RIruCrf30VxGtJONalGCgjpvkWT01rm2R+DSor/ylgDv7 ZIRPcxMwNrVCQASTQDck5Fkppc2z14So3EVajA0HiaZIxI6MRMHq3HPBLX0pFenXiwNPuwGJHNRI HkV+Bkppc2ztwSVGf+UMCfuGSMSOjETB6qmRZKMt7ZwuEmnjjdvsq7qpPyBOSEJHkGEskRsSFYEE Ag1B6HIs0JqdrpF3bm21SG3uLeTrDdKjo1P8lwQcIiTyQZAc2DXP5IeSfrZ1Ty29z5Y1Jh8N5o05 hQ07NCecLL2I44kUkG070eXzlpUy2WtXdnrdtXiuoRcbO8Wv2TNbsxhf3ZHX2Q4REnoxMwOrJfrV tz9P1k9SvHhyFa+FMeE86XjF1apkWSk91aoxR5kVh1VmAP3E5IQJ6MTMDmVXIsnYq7FXYqwn81Pz B8s+VPL1zBqdwW1DUYJIdP06EepcTPIpQcUHRandjt9O2KvlfyD+WE2oeYYdLvY/V1YUlurLZorG Ift3hGxlP7NvXr/eUAKlSSy//nIDU7/QtF0ny1pjrBpF4jm5VTWaT0StFf8AyDyr7n2FMJQHlv5c webZfM8P+F4PX1AKyvzWsSxOOLmVtuC+9Qa9N8CS9c/Knybe2Hmq6+r3VtPeRRtFfTWAd7DToWcP Ipmk/vrqTjxSPfj1Y0FMKC9r053061W00+ltbqzMIogFHKRi7tt1LMxJPc4oYr+ePmO6gXT/AC6s po0Qur0g/bNSkamnYFWNPlnQdiYBvkPuH6Xk/abUn04hy+o/o/HuVPym/LixvLCPzBrUQuFmJ+o2 cgrHxU09SRT9qpHwg7U33qKHtTtKUZeHA13n9DHsTsWEo+LlF3yj0957/Lp193WjZWZtvqpgjNsB xEBReFPDjSmc/wAcru93rPDjXDQruefeZfyV0fU74XWl3X6JDA+tbpF6sZavVF5x8PkNvCmbfTdt ThGpDj+Lz+s9m8WWXFA+H3irH3ikl86eVrzyt+Ws+nzal+kLf65C9uDEYjFy5c1H7ySoJ37b18cy dJqxn1IkI8J4Te/P7HF13Z8tNojAy448Qraq7+p/FsK8q/l95i8z6fJf6aYBBFMYG9Vyrc1VXOwV tqOM2Wp7Rx4ZcMrurdJouxsuogZQ4aBrdF6B5n8y+RPMq6fqTSpaxSBL6xZucZjf9uPqK0PIFevT K9RgxarHxR59C5Gk1GbQ5hCd8IO8eld4+/ZV/MWdf+VrXHE1BnsiCOhBghyPZ/8Aig90vvLLtSN6 8/1ofdF7j5s/5RbWf+YG5/5MtnMaX+9h/WH3vZ68Xp8g/oS+4vCvyxfn/if20O7/AONc6ntE/wB3 /wAMi8N2Tj/vf+Ez/Qk3kzzjdeWtch1CIl4CeF5AP92RE/EP9YdV98yNZphmxmJ59Pe4/Z2rlpso mOXUd4/HJ9OWF9aX9nDe2comtrhBJDIvQqwqM4mcDEmJ5h9Jx5IziJRNgvnz8pXr+Y1ivh9Z/wCT Emdd2qf8Gl8PvD592FjrVw8uL/clP/zH/NbULnUZND8uSvFBG/ozXUNfVmkrQpGRuFDbVXdvl1w+ z+zYxj4mQb93d73adr9sTlPwsJIHIkcye4fjf3JTZfk756vrY3cywWsjjn6VzKfVau+4RZACf8oj MmfbGCJoWfcNnBx+zupmOI8IPmd/0oK31jz1+XuqJb3AkgjPxmzlbnbTLXcqQSv0qajvlk8eDVxs b+fUNePJqtBMA7Du/hP48t06/NzzNYa/ovlnVbI0jnF2JIyatHIvoB0b3B+8b5jdlYJYZ5In+j+l zO3tRHUY8U48jxfD6Xo/5UGv5f6SfFZj/wAl5M0/an+MS+H3B6DsKNaSA9/+6LyL82np+Y18vj9W /wCTEedB2Uf8Gj8fvLyPbuO9XPz4f9yE1/OnQ5dJ8xwa5a1jh1CjF1NClzFSpFOnJeLD3rlHY+o4 8Zxn+H7i5ntDozjzDLHYS/3Q/H3vTNF882N15FXzPcsAsEDG8RaCk8fwsgHYu1OI9xmkzaKUc/hD qdvc9Np+0Iy03jS6Df3j9Z5PH/I+nXfnbz011fj1IBIb3UDuV4hvhiFezNRafy18M6LWZhpsFR58 h+v8dXkOztNLWarinuL4pfq/RXc+ic499BWTzxQQSTzMEhiUvI56BVFST8hiryPR/wA8vM/mJ5rv yx5Hm1HQI5Xhj1KfULeyaUoeqRzqAfcBziqpdfmJ+aevXE2h+WfL9jpOqoB9ZvL3UrW8+rK3QtBa GRg2xpz+44q8q17yX508sTT+YPNMGotLO3+5Lzbbpb6hcxIfhPoD11+qLQ058CwGysv2cKvQ/wAs rzy3H5ekh8g6TcR6ZKxF75j1McDNJ0ZY1r6k7+NOKL/MOmKlS8/flL5V806PdzelLF5q4F7TVGmk dXdR8MMkbH00iPT4F+Hr1ryVBQun6T5E/KbyXHbawz3eo6qvH6lalheahMfhogUh0iBPEGo/4I7q obSfzJljjg8uaNpMV1rDt+68u6QqpYacp2C3FyFIaT/fr7/FsAO6r1rTtD1IxwSXhjhkAUydQC21 eINTSvSuKHkX5+M8fniPlsHsoWX5c5B+sZ1PYx/c/wCcf0PGe0Ef8IH9UfeXs/5eXdtdeRtCltiD GLKGNqf78iURydP8tWzn9dEjNO/5xeo7OkDp4V/NH2bFkOYrmOxV57+ercfIbn/l6h/jm07H/v8A 4F0/bovTH3hhH5T/AJneWPLPly5sNVaYXEl486CKPmODRRoN6jeqHNj2loMmbIJRqqr7S6rsftDF gxGMyb4r5eQYx5u8wXHn7zvGdKtWU3Hp2llCwHMqpJ5ycagfaLHwHfbMzS4hpsPqPLcuv1uU6zUD gHOgP2/jkjPzF/cfmxNBWvpy2CV8aW8AyGhN6W/633lu7Qh/hvxh90Xv/mz/AJRbWf8AmBuf+TLZ y+m/vY/1h972GqF4p/1T9zwL8ppOX+KfbQ7r/jXOn7SP93/XDx/Y8P73/hZY55Z8t33mGPU1sKvd afam7SACpkVXVXRf8ri1R40p3zLz6kYuHi5SNODpdDLMJcPOIv3s+/I/8wPql6PLGoSUtbpidOdj 9idusW/aTt/lf62avtfR8Q8SPMc/d+x3PYWu4D4MuR+n393x+/3sR8j6jNZeaby8hNJrWy1KaMja jR2krD8RmfrIiWIA9ZR+8Ot0FwzSkOcYzP8AsSyH8hNMtL/zZcXdwodtPtzJbqdwJHYIG+ha0zF7 ZymOIAfxFzPZ/TxlmMj/AAjb4voTOWeyUbmysroKLq3jnC7qJUV6V8OQOSjMx5GmMoCXMW8Y/wCc hbe1s08vx20McEbG8YpGoQE/6OK0UDfOg7EmTx2b+n9Ly/tFjA8OhX1f71j/AJY/O3VdA0K10iHT reeK1DBZXZwx5Oz7gbftZk6jsqOWZmZHdxdJ21PDjGMRBpjHmLzVceZPM51eeFIJbholMUZJUcFV Bud/2czMGAYcfADdW6/U5zqM3GRV0+kfzB8sjzH5UvdPRQbpV9eyO208YJUb9OW6H2OcnodR4WUS 6dfc9v2jpBnwmHXmPf8AjZ8wp5g1SDR7jRBKyWM86TzQGo/eRAr/ABFR7DwzsDiiZif8QFPBjLOO M4/4SbI8x+PsfRn5S+VDoHlSFp046hqNLm6qPiUMP3cZ/wBVe3iTnK9p6nxcu30x2D2vZGj8DCL+ qW5/UzXNc7R41+Zvn/V/MGu335ZeTXgS9Nq58wavOx420DcUkihVd2lIlAJHStNjUqqxXzL5x0b8 qfJ1h5WsXe+1WK3k+pKwAoZZHkaeanRfUduK7nt74V5sm/5x6uNL07yJa3cP+kz6k0k+p3NeUzXH qMG5k7kgUG/zxUvVrjVtHuLSWOYrNDIjJLbuteasKFSpFCCNsCsbtLNWSCw062WC0tkEVpaRDjHF EuwA/rhQnUehW9pbyXV5yn9JGkaGIE1CitAB8THwGKXztr/k/wA3a/5lS7vGEXmrzCzkuDyh0XSY qKEQggeqwbgCP8qndsVes+W9G8s+Q9AFjo4jtYYl5XupzFVeRqbu7tT7z9FBiqnonm7T/MuoPDo7 y6kkbcJdQQH6sJP5Flcj1G/1OQHemKGvzt8h3ms6Hb6tYqZ9T0qMidF+1LBSrED+ZCOQHep9s2vZ WrGOXDL6Zfe6jtjQnLASj9UfueZfln+bN35Qd7K7ia80WZubwKQJInNAXj5bGoG6kj5jvttd2eM+ 42m6fs7tA6f0neH3e56y35+/l4Lcyia5aQCv1cQNzJ8Kk8K/7LNN/JGe6ofN3p7XwVdn5PMvNv57 +Z9T1ANocjaTYRgqkYCPLIT+1IxUj5AdPfNtp+yscI+v1F0+q7Xyzl+79MU882xebx+Tz33mm7ln vr28t5IbeVVUww0biCFVaM1amvt3rmPpzi/NVjFAA/FydTHKdITlNyJHwecQ+VL+48lSeabastvb Xr2d5GBvGojjdJf9UtJxPhtm0OpAy+GeZFj7XTR0ROHxB0lR+zd6z/zj7qXlWe1ntI7OK38yQAmW 43aSeAn7Sly3HiaB1Wg6H5abtiGQEG7h9xd72IcXCQABkH2hhX5zGXTvzTubx1qH+qXMQOwZUiRP +JREZn9mHi04HvDru1IcGq4v6p+X9j1Xzh+avkyTyLfz2Wow3Fzf2jw21krL64edOA9SOvJeHKrV 8Ns0+m0GUZgCKAPPps7zVa/F4JIkCSOXXfyeZfk5aTvp/nG/APoQ6PNAzducqs4H3RHNt2nMcWMf 0w6fsjF6ch/o0jv+ccX5ea9S/wCYA/8AJ6PK+2v7uP8AW/Qz7BjWSXuQ/wCdnkWTy/rS6/pqGPTb +Tk/p1AguftECnQP9pfeo8Ml2XrPEhwS+ofaGHa2g8OfiR5H7Ckn5PQRaj58gs7gloru3vIpt9ys lvIrfgcyO0pGOEkdCPvaOycYlno9Qfub8vazqn5Z+fJkv4GdYS1texD4fVgcgrJHXbsHX7sGbHHV Ydj5j3rp5S0ec2PI+Y730Hpv5j+RtQshdwa3ZpHSrJPMkMi/6ySFWH3Zzc9FmiaMS9TDWYpCxIfN hHm7/nILRtNvUtdBt11dVB9e5LtFED2VPhJb3PTwrmfp+x5SFzPC67U9swgagONhv5w69qut+XvK mq6lYjT5Lv69JBbhix9E/V+DmoX7XUe1MzuzcUcc8kYm64f0uv7WnLLDHKQ4b4tvkz/8rvJPlDUf IWk3t9pFrc3UySGWaSMMzETOBUn2Ga7X6vLHNICRA/Y7Ps/RYZYYkxiTXc8o/NPTtO0r8yJ7LT7d LW1jNsUgiAVQWjQmgHiTm40GSU8FyNnd0vaGCMNTURQ2fUmci9i+XprSzn/Ot7KWJWtZNcKPDSil Tcbig7Z1omRpLHPg/Q8ecMTraI2431DnJPYMU1zSfzKuKtpHmLT7LwjfTHf/AIdrpv8AiOKvmy+/ 5x1/Ou61u61lzbfpG6nkuZLpLpY3MkrFmYcfs1LHpim0Jcf84yfnBczNPcR200zmryyXaszHpuxq Titpr5e/Iz8//LkjvotxDZeoayRpdRtGxHdo3DIT8xitsiuvJf8AzlLcQCE31nEKcWeJ7VHb35CO oP8Aq0woekeRIvzM0mwtrfW9ESWeCJIZri3vIpPWCKAHIlMZDGm/xHFWeTSX89kypbGGWRaFXdPh r13UsPuwKkY8t34YuETmQAWqKkCtBX2qcNqhdV8ktq2nz6fqFvFcWlwpSWNyCKHuK9COx7Yqhfyd 8han5Q8pWmmau8Ut7bGUK0JqoWSV3G9BU8WGBWfYq8686fkh5W8x3Ml9bO2k6jKS0ssChonY9WeE 8fi91YV75stN2pkxij6out1PZePKb+mXkwof84z3/q0Ovxel/P8AV25df5fUp+OZ38tj+b9rg/yF /T+z9rOfJf5KeVfLdxHfTF9U1KM1jnuABHGw6NHEKgH3Yn2pmBqe08mUV9MXP03ZmLEb+qXmnP5k eT7jzb5abSLe5S1kaaOX1ZFLCiV2oPnlOi1Aw5OIi2/WafxsZhdID8v/ACLF5P8AKV/pOsXUF3a3 NxJNPIw4RenLFHEUfmafsfjk9ZrPFyCcdqDXo9H4OMwJ4rLC9N/I7UtP1+PXvK3mCCO2imMtgWVp P3daGN2RqOtKqfEZmy7VjPHwzjd83Dh2SYZOOEqZ359/LXR/OlnD9dY2mp260gvoRyK13KMppzSu 9Kg+BG9cHSa2WA7bxPRztXooZx6tiOrzOD/nGnUzdAXGtwi1B3eOFzIR/qkhQf8AZZtD23Gto7ur HYe+8tvc9W0zyHpOjeULzy5pA9JbuCaOS5k+J3lmjKepIRSv0ds1GTVynkE5dC7fHpY48ZhFjP5X flLf+TNYur+51CK7S4tzAEjRlIJdXrUn/JzK13aAzxAAqi4uh7POCRN3bPde0TT9c0i60nUE9S0u 0KSDuO6svgysAR75r8WWWOQlHmHPy4oziYy5F5n5A/JLUfK3mu31qXVIrqG3WVfSWNlY+pGyA7kj 9rNpq+0xlxmNU6zR9l+Dk4uK2Zeefy68vecbVV1BDDewgrbX8NBKg68TXZ0r+yfopmFpdZPCfTy7 nN1WjhmFS597ym4/5xp1lZiLbWreSGuzSROjU/1VLj8c247bjW8S6g9hnpL7GU+T/wDnH7QdJuo7 3Wbk6vPGQ0dvw9O3DD+ZSWMlPcgeIzE1Pa85iojhH2uVpuyMeM3I8R+xNvzW/LO887DSha3sdkNP 9fl6iM3L1vTpTj0p6WU6DWjBxWLuv0t2v0Pj8O9cN/bTJPJHl6by55WsNFmmW4ks1dWmQFVblIz7 A/62YuqzeJkMx1crTYfDxiPcwPz1+S+peZfOEuvQ6nDbxSejSB42Zh6SKp3BpvxzYaXtKOLFwEXz cHVdmnLl47rk9YzUO1eT/wDKl9S/5WJ/iv8AScPofpH6/wDVfTbnx9Tnw5VpXNv/AClHwPDr+GnV fyafH8W+t09YzUO1dirsVdirsVdirsVdirAPzou3tfLVpIjlCb1FqDT/AHVIe3ywhUr8tnydp7rr Fprkt/fWNpNdyafyBDcIGMi/ZHT54oVB+eEH1Rbs6JOIDL6TTep+7GwIAfhQv1+H8caSlWveeNWn 89afJZW1xLa8YZbHT/UZBcq6llkC0oOQbwPTFDKNT/NRYb24sdN0ibUrmxjMmohH4rAVH7xSeDk8 DsTQb40lR1L85NItdM06/gtHuBfhw8fqBDE0RUOrfC1T8VR4jGlU5vzjhVdPMWjzSvqRb6tEJBzZ RMYRRQhqxZT8I+VcaVVsfzes5V1KK+02WxvtOiaX6o71ZwhAZalUKsK1pTGlSy4/NfStd0XUYrjS phawQCW5CzAbfWI4kVW4dSZAT/HGkIy3/MrStI0LQ7XTtMkludQQta6eJq8VMzxrWVlJJd1P7OKp pdfmXDp2iNfaxpk9hfG4a2g01jWSQqqOXViqjhSTrTGkqvlv8wl1TW30PUdNl0jU+HqQQTMWLrx5 HqqUPHfGlYn+YvKb8xdM02W4eC3vYoFZ0anFXldCd9u2IQo+XPMZ0Hzxd6WdVa+0OCOV55y3NAsU Bl5Chb4lYcPh6nFU5X85o/SF/JodwuiGb0BqAcH4qVpw4ha03pzxpKP1T80YI9ZTSNE059ZumjSW scgjUrJGJRx+F+XwMCcaViXmjzxr8/mjRqafdWYDW8kelvIy/WH9WtKcQKlvg3GKGU6h+abwXn6O tdFmu9Tgtxc6hbCQKIP3YkdOXBixQNQ/CN9saSgU/OcfoaTVZdFeOD1kt4CJ6rI7K7MORjFOAQV2 PXGlRcX5w6QdEk1SWzkj/fC2tLfkGeaQIryU2AVU5jf3HjjSrovzLubsappkmmTaXr0FpLPZW0h9 RpCsZcUBRPiA+LjTfGlYT5OOha2XW+1650/zFJL/AKMzNRHrSnxHcuWJ/aHtXFCdXVzf+dPzCvNC N3Jb6XpxkEkcZp8MDCNzToWaRupGwxVC3Gqah5U8zah5cN5Jdadc2kvpCQ1ZS8DMjezArxNOoxVk P5K3j3WhXzu5crdUBJr/ALrXxxKXoeBXYq7FXYq7FXYq7FXl3/OQzzL5PsTEjO36QjqEBJp6E3hh CsWsvPfky40a903TPLE9pq82lXcP10QIvxLaOzmqkt8XDFUrt55m/Iq5Jif1l1gKEKNyr6aHYEeB xQu1bWZtD8w+RdevrWY6eul2PL0lLMTEGjZRy4jn0NK98VQesW8Giebr648ywavbaJqpe6s7rTyi uUuG9RVkLho2Kh+LqG2PiKYqpa1Dpcdp5abSbS/XTLu9uJGGoBWmI5wRkn0kVQpCbDf54qy3859a g0n8zPK93OGaC3W3nlWMcnKR3ZZgo2qaDbFKR3w1nzRqPmjzqmnXFnpKWbi29ZWUyN6a26BR+0eI LNSoBxQnNm0n/Qut86ROJzODInFuRP12MVpT+UDFKR6le+WJfJegWus21/b6glhJLZalbRepGztd TL9XlRuPdQdj+127qEDc6P581HyDZazcQ3dzaafdTCGJw7TrBKkX7xAat6YaIjpt16Yqyn8tJ/Jm pedNPm0lNel1GBZWuJr94GgiIiZSjMicmryoPs/wxSu/NC0OqfnBoumXMcjWNxFawSMgIojzScvi A9zirNdS/LHR9O8oa1ZeXrY/pG8t2VJZHLyOUIdYgx2UMVptSvfFXkknmm5l/L+28ixaTfHzCl6T JEYWHw82cbfb5VbjTj2xQv8AOY0WxgispoNRsvOGmQWtvzijL2106QoKq3wspShUMvUL3xVV8wXv mTSG8ieYPMUNzL6KpJcM6ky8Ybwyojlv2zEy05b+OKoXz95w02Pz1Jf6XNeaXBqNlC+oOgR5St1C rkelzUCsbJVS/wBrfwxSj/Ndx5bP5VaSPK8817AupN9caRKTCdoWJ9RFqF+EClKinc4oZN+bmh6r c+TfLGp6ZbyT2+lwAXMUAJkWOWKIq4ABNF9Lc02rilj/AJW1vysmrjWfL9j5g1PWNMt5p5YrxoWi UrEUMZaONpGrzp28fbFCX+cNe0rztqdjD5W8u3Vrrkr0vjwCqxalOQQldupkbjt1xSndxcax+Wf5 iXOs6nZz32i6gkgmvYF51ExWV6E0UMsq9GIqMVS201aTz/501vzBbp6Gn6fYTypC7L6pCWzJEvEG pLP8RpsOlemKFv5afmrH5S0u6srrSLu7kuJ/WV4xxAHBVp8Q/wAnFL6OwK7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq8x/MH8s/MnmH8x/K/mXT7i0i07RpLZ72Kd5VmYQ3XrN6apG6mqdKsN8VenYq7FXY q7FXYq7FXYq7FXYq7FXkuuflF5ri84ar5h8razZwx64hj1Gz1K2FwoDkM3AkNyHJQQpA+nCrJ/ys /LeDyJoMlh9bN9eXUnr3dyV4KW4hQqJVqKtO5qfwwKzPFXYq7FWmVWUqwDKwoyncEHscVYNd/kx5 Hl8zWHmK1tW0+8sp1uWitTwgmZN15xU4j4qH4aV74qzrFX//2Q== + + + + + + uuid:9FF31C844B89E4118B38AD403A6910BE + uuid:A0F31C844B89E4118B38AD403A6910BE + + uuid:9EF31C844B89E4118B38AD403A6910BE + uuid:9DF31C844B89E4118B38AD403A6910BE + + + + + + + + + 15.000000 + 6.000000 + Centimeters + + 1 + False + False + + + Cyan + Magenta + Black + + + + + + Default Swatch Group + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 +%ADOEndClientInjection: PageSetup End "AI11EPS" +%%EndPageSetup +1 -1 scale 0 -118.425 translate +pgsv +[1 0 0 1 0 0 ]ct +gsave +np +gsave +0 0 mo +0 118.425 li +394.977 118.425 li +394.977 0 li +cp +clp +[1 0 0 1 0 0 ]ct +19.7549 69.0186 mo +25.5771 66.1777 li +28.5205 58.6543 li +25.5771 66.1797 li +19.7549 69.0186 li +cp +82.2852 15.5752 mo +84.7217 13.3574 li +96.2686 10.7109 li +96.3955 10.8467 li +88.6777 13.9385 li +88.6777 13.9385 99.0977 13.165 102.572 15.0986 cv +106.043 17.0293 106.043 20.1211 106.043 20.1211 cv +106.075 20.1699 li +105.454 21.5303 104.063 23.8545 101.815 23.8545 cv +98.6377 23.8545 96.1934 23.1201 94.7256 24.5859 cv +93.2588 26.0537 92.2822 28.9873 92.2822 28.9873 cv +93.9922 31.1865 li +93.9922 31.1865 100.593 29.2314 101.815 29.2314 cv +103.037 29.2314 107.193 31.6758 107.193 31.6758 cv +107.927 28.7422 li +107.927 28.7422 111.35 30.21 114.527 31.1865 cv +117.706 32.165 118.438 32.6543 119.66 32.165 cv +120.883 31.6758 122.839 29.4766 122.839 29.4766 cv +122.839 29.4766 118.683 29.7207 116.728 28.0088 cv +114.772 26.2979 114.283 21.6523 114.772 19.4531 cv +115.262 17.2539 116.728 15.7861 116.728 15.7861 cv +116.728 15.7861 115.731 16.7813 114.257 18.042 cv +114.477 16.5674 115.365 14.8818 118.008 13.9385 cv +126.554 10.8828 133.218 12.0322 141.788 14.5225 cv +149.307 16.709 157.038 19.4346 163.837 22.2197 cv +163.428 22.1738 li +151.748 20.9717 140.362 22.8691 131.74 31.4922 cv +130.414 32.8193 129.225 34.2129 128.177 35.6689 cv +127.334 35.2031 126.146 34.5889 125.065 34.1943 cv +123.127 33.4883 120.129 34.1943 118.017 34.373 cv +115.901 34.5498 113.608 40.0205 113.608 40.0205 cv +114.137 40.374 117.838 38.7861 124.184 39.667 cv +124.722 39.7422 125.196 39.8203 125.615 39.9014 cv +123.506 44.1309 122.433 48.8018 122.433 53.8604 cv +122.433 54.5771 122.454 55.2881 122.497 55.9922 cv +116.783 56.8545 114.653 58.2793 109.652 60.6357 cv +103.88 63.3516 93.6904 75.2373 93.6904 75.2373 cv +93.6904 75.2373 100.822 70.8223 105.916 66.748 cv +111.01 62.6729 121.879 60.9736 121.879 60.9736 cv +124.131 64.3604 li +124.386 65.0996 124.669 65.8281 124.981 66.543 cv +124.364 67.5469 122.562 70.4414 117.802 77.9531 cv +116.644 79.7852 116.043 81.2168 115.837 82.3408 cv +14.7275 82.3408 li +16.8047 75.5186 li +22.6475 76.7725 li +22.6475 76.7725 21.5977 73.8828 21.5977 72.3057 cv +21.5977 70.7305 23.1729 70.2031 25.5342 68.8906 cv +27.8926 67.5771 29.4668 64.6865 30.5186 61.7979 cv +31.5703 58.9082 39.6992 61.0098 45.7363 59.4326 cv +46.0195 59.3594 46.2881 59.2881 46.5459 59.2178 cv +44.8896 60.6709 40.3984 65.1582 44.5313 67.8672 cv +49.5156 71.1377 57.25 72.3398 58.626 71.8252 cv +60 71.3105 62.5762 67.5225 67.7354 62.5322 cv +72.8916 57.541 73.374 55.9209 76.2959 55.0615 cv +79.2188 54.2002 82.9795 60.835 85.6982 56.0654 cv +86.1523 55.3848 81.3145 51.3447 80.2832 51.3447 cv +79.251 51.3447 72.7188 54.4404 69.625 56.6797 cv +66.5322 58.918 61.7207 62.3594 61.7207 62.3594 cv +61.7207 62.3594 58.7979 58.4023 55.876 57.8838 cv +54.1602 57.5811 51.4395 57.9307 49.4844 58.2705 cv +51.9932 57.2949 52.7881 56.3555 56.2275 54.4434 cv +60.9512 51.8145 82.9863 31.8506 82.9863 31.8506 cv +82.9863 31.8506 81.4131 32.1123 77.4775 32.1123 cv +73.542 32.1123 71.4443 29.4863 71.4443 26.8584 cv +71.4443 24.2334 75.1162 24.2334 77.4775 23.1816 cv +79.2549 22.3916 82.8809 15.54 82.2852 15.5752 cv +cp +74.9365 44.0313 mo +74.9365 44.0313 67.5205 53.3809 63.9746 54.3496 cv +60.4277 55.3154 58.8164 55.9619 58.8164 55.9619 cv +58.8164 55.9619 63.9746 58.2188 67.5205 56.2822 cv +71.0674 54.3496 72.0342 52.4131 72.6797 50.8027 cv +73.3252 49.1885 74.6143 44.6758 74.9365 44.0313 cv +cp +111.285 40.6963 mo +111.285 40.6963 105.684 47.4189 101.481 49.6602 cv +97.2793 51.9023 88.5947 58.9043 87.4736 61.7051 cv +87.2842 62.1797 86.9492 62.8242 86.5244 63.5664 cv +84.6221 64.4219 70.2422 70.9756 68.5449 74.0361 cv +66.7266 77.3135 73.2734 81.6855 78.0039 81.6855 cv +82.7324 81.6855 83.4619 81.3184 84.1875 79.5 cv +84.9141 77.6787 87.8252 68.5713 87.8252 68.5713 cv +87.7754 68.3389 li +89.3232 65.0498 91.3223 60.666 97.2793 56.9453 cv +104.001 52.7422 110.725 47.4189 111.005 44.6172 cv +111.285 41.8164 111.285 40.6963 111.285 40.6963 cv +cp +183.195 25.4912 mo +185.947 24.9873 li +187.441 29.9678 li +183.195 25.4912 li +cp +false sop +/0 +[/DeviceCMYK] /CSA add_res +0 0 0 0.2 cmyk +ef +61.3281 44.1543 mo +55.1865 48.2129 50.9814 52.3965 43.6748 55.8047 cv +43.1602 55.9365 38.2422 57.0195 32.9072 55.5977 cv +27.6162 55.1182 25.0918 57.7158 24.3955 59.8018 cv +23.7012 61.8877 23.7793 64.6689 21.6934 66.0586 cv +19.6074 67.4502 15.0879 70.9268 14.043 75.4463 cv +13.002 79.9658 12.6543 82.252 12.6543 82.252 cv +33.7949 82.2422 54.9355 82.2305 76.0742 82.2207 cv +62.0518 81.6533 62.1406 78.1113 63.0674 75.4463 cv +58.3457 79.0215 35.4531 79.5947 39.7725 66.0586 cv +41.1631 62.584 44.292 59.8018 44.292 59.8018 cv +44.292 59.8018 38.0322 60.4971 36.9912 64.6689 cv +35.9492 68.8408 30.6631 70.9268 30.6631 70.9268 cv +28.3242 79.9326 11.4922 72.9551 24.752 68.2148 cv +26.4902 66.1299 27.6045 66.0586 27.6045 64.3213 cv +27.6045 62.584 27.6045 58.4102 33.5137 58.4102 cv +39.4238 58.4102 44.292 59.4531 50.8975 55.6299 cv +57.5049 51.8047 80.4512 33.3779 80.4512 33.3779 cv +80.4512 33.3779 73.498 34.4199 70.0195 31.9863 cv +66.5449 29.5527 67.2393 24.6846 70.3672 24.6846 cv +78.1592 23.0488 79.8252 18.127 89.7666 13.8242 cv +102.715 9.4541 122.715 8.00391 139.905 12.168 cv +151.376 14.9502 179.54 26.0762 186.146 31.6406 cv +187.235 32.5537 189.251 31.7793 190.784 31.7793 cv +188.468 29.2822 188.928 27.8154 188.928 27.8154 cv +188.928 27.8154 196.228 28.1611 201.444 30.249 cv +204.53 31.4834 206.762 32.4756 208.071 33.0791 cv +208.071 32.1699 li +206.768 30.7266 204.817 28.6729 203.53 27.8154 cv +201.444 26.4238 199.009 26.4238 199.009 26.4238 cv +216.259 20.8223 240.3 15.5498 258.23 15.1221 cv +290.347 11.502 335.718 26.3477 356.526 33.5781 cv +336.302 20.4961 295.238 10.8369 268.892 9.73633 cv +254.43 8.62305 228.911 13.5596 218.132 16.6875 cv +207.355 19.8184 187.884 24.3379 184.06 24.3379 cv +180.234 24.3379 160.633 14.8193 149.639 11.8213 cv +130.78 6.52246 112.891 5.17871 94.0117 9.73633 cv +91.5771 10.083 90.5342 10.4307 90.5342 10.4307 cv +93.2041 8.8291 85.3389 1.17578 83.9268 0 cv +83.9268 0 79.7549 5.5625 79.7549 9.04004 cv +79.7549 12.5176 81.4922 14.9502 81.4922 14.9502 cv +81.4922 14.9502 76.9746 19.8184 72.1074 20.8613 cv +67.2393 21.9043 63.416 25.0332 62.0244 29.2041 cv +60.6338 33.3779 61.3281 38.9404 61.3281 40.6777 cv +61.3281 42.417 61.3281 44.1543 61.3281 44.1543 cv +0 0 0 1 cmyk +ef +129.473 13.5596 mo +131.212 12.5176 132.951 11.8213 132.951 11.8213 cv +134.479 14.9385 137.84 24.3486 133.646 26.7725 cv +130.863 28.5107 127.735 28.8574 127.735 28.8574 cv +128.083 30.4805 128.432 32.1025 128.778 33.7236 cv +129.188 34.3369 li +128.866 34.7383 128.557 35.1436 128.259 35.5557 cv +126.76 34.6396 125.137 33.2842 124.954 31.6406 cv +124.606 28.5107 125.301 27.4668 125.301 27.4668 cv +125.301 27.4668 132.951 25.3809 133.3 22.251 cv +133.646 19.1221 132.302 14.1963 132.302 14.1963 cv +132.302 14.1963 126.344 17.3838 125.301 20.8613 cv +124.26 24.3379 122.521 24.3379 122.521 24.3379 cv +121.314 23.9268 120.583 22.5762 120.781 20.8613 cv +121.459 16.9961 125.854 15.7324 129.473 13.5596 cv +ef +93.6631 25.0332 mo +88.7412 24.7881 85.1309 29.9209 85.3184 35.8115 cv +83.5811 39.2881 79.4092 43.1123 79.4092 43.1123 cv +79.8711 44.7354 80.334 46.3574 80.7979 47.9795 cv +79.0605 49.7197 77.3213 51.457 75.584 53.1963 cv +75.584 53.1963 79.4092 50.4141 82.5381 53.1963 cv +85.666 55.9766 85.666 57.7158 85.666 57.7158 cv +85.666 57.7158 93.5713 47.6592 97.7422 45.2246 cv +102.865 44.6953 105.324 42.8623 106.18 40.5537 cv +107.222 38.8145 106.227 36.4395 106.227 36.4395 cv +105.479 38.4326 99.54 43.2715 96.0967 40.5742 cv +93.9189 39.0029 94.252 36.5713 96.9131 34.6787 cv +99.5742 32.5439 104.094 33.0293 104.094 33.0293 cv +104.094 33.0293 103.051 28.5098 100.617 28.5098 cv +98.1826 28.5098 94.7061 30.5957 94.0117 28.5098 cv +93.3145 26.4238 93.6631 25.0332 93.6631 25.0332 cv +ef +109.196 30.5498 mo +111.975 31.8916 112.797 35.0342 112.124 39.0215 cv +113.693 39.0215 115.053 34.5322 119.366 34.5322 cv +120.85 34.5322 125.373 34.9561 127.54 36.584 cv +128.06 35.8076 128.616 35.0469 129.213 34.3027 cv +127.66 31.5342 126.934 30.5957 124.954 30.5957 cv +122.867 30.5957 119.591 32.7021 116.238 32.3447 cv +114.019 32.1377 112.034 29.0205 109.196 30.5498 cv +ef +110.699 40.3291 mo +110.699 40.3291 105.831 45.5459 102.008 47.6318 cv +98.1826 49.7197 96.791 52.1514 96.791 52.1514 cv +96.791 52.1514 101.659 50.7627 105.137 47.6318 cv +108.613 44.5029 110.699 40.3291 110.699 40.3291 cv +ef +104.441 52.499 mo +104.441 52.499 94.0117 58.7588 90.5342 62.9297 cv +87.0566 67.1016 85.3184 72.666 85.3184 72.666 cv +85.3184 72.666 94.0117 64.6699 97.4873 60.8447 cv +100.965 57.0195 104.441 52.499 104.441 52.499 cv +ef +112.437 54.585 mo +112.437 54.585 102.354 58.4102 97.4873 63.2773 cv +92.6201 68.1455 91.5771 75.0996 91.5771 75.0996 cv +91.5771 75.0996 100.269 63.9727 105.484 61.1904 cv +110.699 58.4102 112.437 54.585 112.437 54.585 cv +ef +124.023 26.2744 mo +125.671 22.1143 127.697 17.6133 130.58 16.7393 cv +130.58 16.7393 128.472 20.0527 129.665 21.2432 cv +130.857 22.4355 133.499 19.3496 133.773 18.334 cv +134.604 21.8398 133.959 25.877 129.785 26.6719 cv +125.613 27.4668 124.023 26.2744 124.023 26.2744 cv +ef +95.2402 38.0352 mo +94.8633 35.8799 101.882 31.4043 105.548 34.75 cv +105.546 38.6484 100.375 40.4961 97.3486 39.9102 cv +99.1445 39.248 103.124 38.0859 103.258 35.4717 cv +100.435 34.6602 97.7715 35.6523 95.2402 38.0352 cv +ef +100.445 34.6191 mo +101.738 34.6191 102.785 35.6689 102.785 36.9609 cv +102.785 38.2539 101.738 39.3037 100.445 39.3037 cv +99.1523 39.3037 98.1045 38.2539 98.1045 36.9609 cv +98.1045 35.6689 99.1523 34.6191 100.445 34.6191 cv +ef +78.1514 36.7051 mo +78.1514 36.7051 63.8828 49.2383 58.376 52.9971 cv +55.3379 54.9238 54.3398 55.3633 48.5801 56.7578 cv +56.5605 56.5664 62.7471 54.7754 68.1396 48.9883 cv +71.4883 43.6992 78.1514 36.7051 78.1514 36.7051 cv +ef +119.811 69.3398 mo +115.662 70.9775 111.518 72.6172 107.37 74.2568 cv +110.973 75.8018 111.531 78.3604 111.531 82.0762 cv +111.531 82.0762 113.916 82.3115 114.244 80.0176 cv +114.571 77.7217 113.588 75.5215 113.588 75.5215 cv +114.773 73.1777 118.063 70.9775 119.811 69.3398 cv +ef +49.6133 58.0928 mo +54.7139 57.292 59.9609 59.6162 62.0723 64.2617 cv +62.0723 64.2617 63.3408 62.0439 66.1943 59.8232 cv +69.0479 57.6035 75.3887 53.7988 75.3887 53.7988 cv +75.3887 53.7988 65.7305 58.5566 63.1943 58.2393 cv +58.2764 57.0146 55.5146 56.0361 49.6133 58.0928 cv +ef +89.2461 26.9473 mo +90.6973 23.8691 99.5195 23.1572 103.017 23.8711 cv +103.017 23.8711 96.6387 24.3037 94.748 25.7363 cv +93.4551 26.7178 93.084 28.877 93.084 28.877 cv +92.2139 28.5762 90.1143 27.2471 89.2461 26.9473 cv +ef +124.654 16.5166 mo +119.8 16.7285 117.983 20.7813 119.496 25.0674 cv +114.891 21.041 117.998 13.5713 124.654 16.5166 cv +ef +15.0635 77.6289 mo +0 79.1367 li +18.0771 81.3965 li +15.0635 77.6289 li +cp +ef +gsave +154.107 80.6592 mo +146.741 80.6592 140.455 78.0361 135.249 72.7852 cv +130.044 67.5371 127.441 61.2266 127.441 53.8604 cv +127.441 46.5361 130.055 40.2617 135.283 35.0342 cv +140.51 29.8057 146.786 27.1914 154.107 27.1914 cv +159.447 27.1914 164.343 28.6592 168.801 31.5918 cv +173.255 34.5264 176.542 38.3525 178.66 43.0742 cv +167.476 43.0742 li +165.931 41.2217 163.958 39.71 161.555 38.541 cv +159.149 37.3711 156.668 36.7881 154.107 36.7881 cv +149.389 36.7881 145.362 38.4521 142.032 41.7842 cv +138.7 45.1123 137.036 49.1377 137.036 53.8604 cv +137.036 58.624 138.692 62.6621 142 65.9688 cv +145.308 69.2793 149.346 70.9316 154.107 70.9316 cv +156.668 70.9316 159.138 70.3477 161.521 69.1797 cv +163.903 68.0098 165.888 66.4775 167.476 64.5801 cv +178.66 64.5801 li +176.586 69.3438 173.321 73.2168 168.865 76.1943 cv +164.41 79.1709 159.49 80.6592 154.107 80.6592 cv +cp +360.11 36.9668 mo +368.553 36.9668 li +377.102 54.9521 li +386.04 36.9668 li +394.977 36.9668 li +380.688 64.8281 li +380.688 80.6592 li +372.579 80.6592 li +372.579 64.2754 li +360.11 36.9668 li +cp +327.471 36.999 mo +335.63 36.999 li +335.63 55.0244 li +349.135 55.0244 li +349.135 36.999 li +357.295 36.999 li +357.295 80.6592 li +349.135 80.6592 li +349.135 63.2939 li +335.63 63.2939 li +335.63 80.6592 li +327.471 80.6592 li +327.471 36.999 li +cp +304.758 81.1563 mo +298.62 81.1563 293.383 78.9697 289.047 74.5957 cv +284.71 70.2227 282.542 64.9668 282.542 58.8281 cv +282.542 52.7285 284.719 47.5 289.074 43.1455 cv +293.429 38.791 298.656 36.6133 304.758 36.6133 cv +309.205 36.6133 313.285 37.835 316.995 40.2783 cv +320.708 42.7227 323.446 45.9111 325.209 49.8428 cv +315.893 49.8428 li +314.607 48.2988 312.964 47.04 310.959 46.0674 cv +308.957 45.0947 306.89 44.6064 304.758 44.6064 cv +300.826 44.6064 297.472 45.9951 294.697 48.7676 cv +291.923 51.543 290.536 54.8965 290.536 58.8281 cv +290.536 62.7979 291.914 66.1621 294.671 68.918 cv +297.426 71.6748 300.788 73.0527 304.758 73.0527 cv +306.89 73.0527 308.947 72.5645 310.933 71.5908 cv +312.916 70.6182 314.569 69.3398 315.893 67.7598 cv +325.209 67.7598 li +323.482 71.7295 320.764 74.9551 317.052 77.4365 cv +313.339 79.915 309.24 81.1563 304.758 81.1563 cv +cp +245.772 36.999 mo +253.104 36.999 li +272.068 64.7813 li +272.068 36.999 li +280.227 36.999 li +280.227 80.6592 li +272.675 80.6592 li +253.931 52.9297 li +253.931 80.6592 li +245.772 80.6592 li +245.772 36.999 li +cp +213.08 36.999 mo +221.241 36.999 li +221.241 62.6328 li +221.241 64.1768 li +221.241 66.125 221.432 67.7695 221.817 69.1104 cv +222.203 70.4521 222.93 71.4268 223.997 72.0313 cv +225.062 72.6396 226.146 72.9424 227.248 72.9424 cv +228.424 72.9424 229.546 72.6484 230.61 72.0596 cv +231.678 71.4717 232.422 70.4141 232.843 68.8906 cv +233.266 67.3652 233.478 65.7207 233.478 63.9561 cv +233.478 62.8535 li +233.478 36.999 li +241.692 36.999 li +241.692 63.9004 li +241.692 67.2451 241.195 70.1768 240.205 72.6934 cv +239.211 75.2109 237.437 77.2422 234.884 78.7861 cv +232.33 80.3301 229.767 81.1016 227.193 81.1016 cv +224.694 81.1016 222.103 80.3193 219.421 78.7568 cv +216.737 77.1943 215.01 75.1465 214.238 72.6123 cv +213.467 70.0742 213.08 66.748 213.08 62.6328 cv +213.08 36.999 li +cp +181.328 36.999 mo +193.29 36.999 li +197.002 36.999 200.088 37.5137 202.552 38.543 cv +205.015 39.5723 206.906 41.4268 208.229 44.1104 cv +209.553 46.793 210.215 49.291 210.215 51.6084 cv +210.215 54.4746 209.525 56.9199 208.146 58.9385 cv +206.769 60.96 205.279 62.4131 203.683 63.2939 cv +202.084 64.1768 200.512 64.7109 198.969 64.8945 cv +210.491 80.6592 li +200.677 80.6592 li +189.486 65.5 li +189.486 80.6592 li +181.328 80.6592 li +181.328 36.999 li +cp +195.604 58.1133 mo +197.406 58.1133 198.95 57.4668 200.236 56.1816 cv +201.521 54.8965 202.166 53.333 202.166 51.498 cv +202.166 49.6602 201.541 48.0986 200.291 46.8105 cv +199.043 45.5254 197.48 44.8818 195.604 44.8818 cv +189.486 44.8818 li +189.486 58.1133 li +195.604 58.1133 li +cp +clp +394.977 81.1563 mo +394.977 27.1914 li +127.441 27.1914 li +127.441 81.1563 li +394.977 81.1563 li +cp +level3{ +gsave +clp +[-2.35879e-06 -53.9628 267.531 -4.75783e-07 261.265 81.1416 ]ct +/0 +<< +/ShadingType 2 +/ColorSpace /0 /CSA get_res +/Coords [0 0 1 0 ] +/Domain [0 1 ] +/Extend[ true true] +/Function +<< +/Domain[0 1 ] +/FunctionType 3 +/Functions [ +<< +/Domain[0 1 ] +/Range[0 1 0 1 0 1 0 1 ] +/FunctionType 0 +/Order 1 +/DataSource <~pRV?bpRM9apRD3`pR;-_pmM0_pm;$]pm1s\pltgZplb[XplYUWplGIUpl5=Spl#1Qpkf%OpkSnMq1\kL +q1J_Jq1/MGq0rAEq0`5Cq0N)Aq02l>q/u` +/BitsPerSample 8 +/Encode [0 63 ] +/Decode [0 1 0 1 0 1 0 1 ] +/Size [64 ] +>> +] +/Bounds [] +/Encode [0 1 ] +>> +>>/Gradient add_res /0 /Gradient get_res clonedict shfill grestore +}if +level3 not{ +gsave +[-2.35879e-06 -53.9628 267.531 -4.75783e-07 261.265 81.1416 ]ct +clp +/0 { +/0 /CSA get_res setcolorspace +<< +/NumSamples 256 +/NumComp 4 +/Scaling[[0.00392157 0 ][0.00392157 0 ][0.00392157 0 ][0.00392157 0 ]] +/Samples[ +<~p@e4Rp@e4Rp@e4Rp@n=Up\4FVp\4FVp\4FVp\4FVp\4FVp\4FVp\4FVp\4FVp\4FVp\4FVp\=OYq"XXZ +q"XXZq"XXZq"XXZq"XXZq"XXZq"XXZq"XXZq"X[\q>'j^q>'j^q>'j^q>'j^q>'j^q>'j^q>'j^q>'m` +qYL'bqYL'bqYL'bqYL'bqYL'bqYL'bqYL'bqYL'cqtp9fqtp9fqtp9fqtp9fqtp9fqtp9fqtp9gr;?Kj +r;?Kjr;?Kjr;?Kjr;?Kjr;?Kjr;?KjrVc]nrVc]nrVc]nrVc]nrVc]nrVc]nrr2ors8W-!s8W-!s8W-! +~> +<~SXl=BSXc4?S=?";S!oe7R[KS2R$X/+Q^3r&Q'@MsPEM)lP*(lgOH5H_NfB$WN/NUOMM[1GLkgb?L4t>7 +KS4u0JUr?%It)orI=6KjH[C'aG^+FVG'8"NFEDSEEcH&;Df9N1D/=!'C2.HsBP1phAS#C_@q&kT?sd5H +?!U`@>?Y35=BAR)<`N.!;c6Lj:esk^9he;S91hfJ84Z6?77BU36:*t'5X.Fq4Zkee3]T/Y2`g,pX][+sA*P+!)ID*#fh8)&O2,()7Ms&eP]e%hB-Z$k*LN#mgkB"pG,3!WiB& +~> +0 0 ] +>> +0 0 1 0 []true true [] +/DeviceCMYK +GenStrips +} /Gradient add_res /0 /Gradient get_res exec grestore +}if +np +grestore +gsave +99.4893 96.4805 mo +103.66 96.5508 li +106.966 96.5508 li +107.243 96.7246 li +107.104 98.4639 li +107.035 100.068 li +106.757 100.376 li +103.278 100.376 li +99.4893 100.376 li +99.4893 106.219 li +103.905 106.219 li +108.043 106.219 li +108.321 106.427 li +108.112 108.27 li +107.973 110.078 li +107.625 110.321 li +93.9248 110.321 li +93.7852 110.078 li +93.8887 98.5674 li +93.7852 87.3691 li +93.8887 87.125 li +107.451 87.125 li +107.833 87.4395 li +107.694 89.3164 li +107.625 91.1309 li +107.278 91.3691 li +103.348 91.3691 li +99.4893 91.3691 li +99.4893 96.4805 li +cp +118.325 97.1758 mo +118.068 97.0361 117.751 96.9688 117.379 96.9688 cv +116.841 96.9688 116.389 97.0947 116.012 97.3496 cv +115.207 98.0107 li +115.207 101.837 li +115.207 103.182 115.225 104.584 115.265 106.044 cv +115.306 107.505 115.34 108.849 115.38 110.078 cv +115.207 110.321 li +110.024 110.321 li +109.815 110.078 li +109.921 101.939 li +109.815 93.8037 li +110.061 93.4561 li +110.447 93.4316 110.837 93.3994 111.214 93.3506 cv +111.596 93.3057 112.076 93.2354 112.65 93.1416 cv +115.102 92.6904 li +115.38 93.0381 li +115.38 94.5332 li +116.882 93.3057 118.383 92.6904 119.885 92.6904 cv +120.765 92.6904 121.681 92.9502 122.638 93.4736 cv +123.599 93.9951 124.22 94.7881 124.51 95.8535 cv +124.799 96.9209 124.944 98.1504 124.944 99.541 cv +124.944 101.837 li +124.944 103.389 124.967 104.845 125.014 106.199 cv +125.061 107.557 125.118 108.849 125.188 110.078 cv +124.944 110.321 li +119.832 110.321 li +119.554 110.078 li +119.727 102.498 li +119.727 102.219 119.727 101.945 119.727 101.68 cv +119.727 101.413 119.727 101.141 119.727 100.861 cv +119.727 99.9346 119.635 99.1631 119.449 98.5498 cv +119.258 97.9346 118.888 97.4785 118.325 97.1758 cv +cp +127.97 96.4111 mo +126.16 96.5156 li +125.918 96.2021 li +126.127 93.1074 li +126.403 92.793 li +127.97 92.793 li +127.899 88.7617 li +128.109 88.4824 li +133.082 87.0908 li +133.289 87.3008 li +133.289 92.793 li +136.28 92.793 li +136.525 93.1074 li +136.211 96.2021 li +135.932 96.4111 li +133.22 96.4111 li +133.289 103.158 li +133.289 104.479 li +133.289 105.083 133.33 105.547 133.412 105.87 cv +133.493 106.194 133.679 106.467 133.967 106.688 cv +134.258 106.908 134.658 107.017 135.168 107.017 cv +135.632 107.017 136.06 106.891 136.455 106.636 cv +136.768 106.844 li +136.65 107.237 136.542 107.776 136.437 108.461 cv +136.333 109.145 136.28 109.729 136.28 110.217 cv +135.793 110.53 li +135.093 110.692 134.171 110.774 133.035 110.774 cv +132.287 110.774 131.633 110.722 131.059 110.618 cv +130.49 110.513 129.923 110.275 129.365 109.904 cv +128.811 109.533 128.422 108.879 128.212 107.939 cv +128.004 107.001 127.899 105.917 127.899 104.687 cv +127.899 103.782 li +127.97 96.4111 li +cp +152.625 102.741 mo +152.208 102.983 li +142.366 103.192 li +142.481 104.027 142.725 104.723 143.097 105.278 cv +143.467 105.835 144.012 106.246 144.73 106.513 cv +145.449 106.779 146.169 106.913 146.888 106.913 cv +148.464 106.913 150.052 106.462 151.652 105.557 cv +151.929 105.765 li +151.755 109.487 li +151.304 109.834 li +149.75 110.461 148.034 110.774 146.157 110.774 cv +145.137 110.774 144.175 110.668 143.271 110.461 cv +142.366 110.251 141.357 109.787 140.245 109.069 cv +139.132 108.351 138.344 107.302 137.881 105.922 cv +137.417 104.542 137.185 102.926 137.185 101.07 cv +137.185 99.4727 137.486 98.0225 138.089 96.7246 cv +138.692 95.4268 139.671 94.4297 141.028 93.7334 cv +142.383 93.0381 143.815 92.6904 145.321 92.6904 cv +146.898 92.6904 148.231 93.0313 149.322 93.7158 cv +150.41 94.4004 151.234 95.4512 151.789 96.8643 cv +152.347 98.2773 152.625 100.236 152.625 102.741 cv +cp +146.394 96.5508 mo +146.064 96.3418 145.612 96.2363 145.026 96.2363 cv +144.632 96.2363 144.214 96.3359 143.786 96.5342 cv +143.352 96.7305 143.01 97.125 142.749 97.7158 cv +142.494 98.3076 142.366 98.915 142.366 99.541 cv +147.513 99.541 li +147.513 98.8223 147.455 98.2305 147.34 97.7676 cv +147.224 97.3037 146.905 96.8975 146.394 96.5508 cv +cp +159.718 110.078 mo +159.58 110.321 li +154.399 110.321 li +154.189 110.078 li +154.295 101.939 li +154.189 93.8037 li +154.427 93.4561 li +154.821 93.4316 155.204 93.3994 155.58 93.3506 cv +155.958 93.3057 156.434 93.2354 157.006 93.1416 cv +159.447 92.6904 li +159.718 93.0381 li +159.718 95.6816 li +160.276 94.6602 160.92 93.9248 161.649 93.4736 cv +162.38 93.0215 163.173 92.7598 164.031 92.6904 cv +164.31 93.0381 li +164.263 93.2695 164.165 93.7207 164.014 94.3936 cv +163.862 95.0664 163.764 95.5176 163.718 95.751 cv +163.369 98.4277 li +163.023 98.5332 li +162.652 98.2998 162.211 98.1846 161.702 98.1846 cv +161.307 98.1846 160.912 98.3242 160.518 98.6025 cv +160.124 98.8818 159.869 99.4141 159.754 100.201 cv +159.639 100.99 159.58 101.743 159.58 102.462 cv +159.58 103.76 159.598 105.083 159.627 106.427 cv +159.655 107.771 159.689 108.988 159.718 110.078 cv +cp +171.231 94.0811 mo +171.786 93.6172 172.436 93.2695 173.189 93.0381 cv +173.938 92.8057 174.674 92.6904 175.392 92.6904 cv +176.451 92.6904 177.46 92.9502 178.422 93.4736 cv +179.379 93.9951 180.166 94.9971 180.782 96.4805 cv +181.392 97.9639 181.697 99.3086 181.697 100.516 cv +181.697 102.162 181.368 103.819 180.707 105.488 cv +180.046 107.156 179.106 108.346 177.889 109.053 cv +176.673 109.759 175.565 110.211 174.568 110.407 cv +173.572 110.605 172.414 110.703 171.092 110.703 cv +171.231 118.181 li +171.022 118.425 li +165.84 118.425 li +165.631 118.181 li +165.77 105.174 li +165.631 93.8037 li +165.874 93.4561 li +166.27 93.4316 166.657 93.3994 167.039 93.3506 cv +167.423 93.3057 167.903 93.2354 168.482 93.1416 cv +170.952 92.6904 li +171.231 93.0381 li +171.231 94.0811 li +cp +171.022 105.07 mo +171.126 106.947 li +171.856 106.947 172.43 106.918 172.841 106.861 cv +173.253 106.803 173.769 106.606 174.383 106.27 cv +175.003 105.934 175.479 105.268 175.808 104.271 cv +176.14 103.273 176.307 102.288 176.307 101.313 cv +176.307 100.388 176.181 99.541 175.926 98.7764 cv +175.67 98.0107 175.266 97.4551 174.708 97.1064 cv +174.15 96.7578 173.605 96.585 173.074 96.585 cv +172.655 96.585 172.262 96.6494 171.892 96.7764 cv +171.521 96.9043 171.266 97.0488 171.126 97.21 cv +171.022 105.07 li +cp +188.652 110.078 mo +188.514 110.321 li +183.332 110.321 li +183.124 110.078 li +183.227 101.939 li +183.124 93.8037 li +183.361 93.4561 li +183.756 93.4316 184.139 93.3994 184.515 93.3506 cv +184.893 93.3057 185.366 93.2354 185.94 93.1416 cv +188.38 92.6904 li +188.652 93.0381 li +188.652 95.6816 li +189.209 94.6602 189.853 93.9248 190.584 93.4736 cv +191.313 93.0215 192.107 92.7598 192.966 92.6904 cv +193.243 93.0381 li +193.197 93.2695 193.098 93.7207 192.948 94.3936 cv +192.797 95.0664 192.698 95.5176 192.652 95.751 cv +192.304 98.4277 li +191.957 98.5332 li +191.585 98.2998 191.145 98.1846 190.635 98.1846 cv +190.24 98.1846 189.847 98.3242 189.452 98.6025 cv +189.059 98.8818 188.804 99.4141 188.688 100.201 cv +188.571 100.99 188.514 101.743 188.514 102.462 cv +188.514 103.76 188.529 105.083 188.562 106.427 cv +188.589 107.771 188.623 108.988 188.652 110.078 cv +cp +199.815 84.6924 mo +200.023 85.0039 li +200.023 87.125 li +200.023 89.2129 li +199.647 89.5957 li +197.417 89.8047 li +195.087 90.1162 li +194.844 89.8721 li +194.844 87.7871 li +194.844 85.5957 li +195.255 85.2822 li +197.347 85.0732 li +197.781 85.0732 198.239 85.0283 198.72 84.9346 cv +199.194 84.8428 199.567 84.7617 199.815 84.6924 cv +cp +194.809 110.321 mo +194.6 110.078 li +194.704 101.939 li +194.6 93.8037 li +194.844 93.4561 li +195.238 93.4316 195.625 93.3994 196.009 93.3506 cv +196.392 93.3057 196.872 93.2354 197.451 93.1416 cv +199.921 92.6904 li +200.198 93.0381 li +200.158 94.3125 200.122 95.7383 200.082 97.3154 cv +200.043 98.8916 200.023 100.4 200.023 101.837 cv +200.023 103.182 200.043 104.584 200.082 106.044 cv +200.122 107.505 200.158 108.849 200.198 110.078 cv +199.921 110.321 li +194.809 110.321 li +cp +214.456 93.9082 mo +214.317 94.6035 214.218 95.1826 214.161 95.6465 cv +214.103 96.1104 214.073 96.666 214.073 97.3154 cv +213.692 97.4551 li +213.11 96.9912 212.475 96.6367 211.777 96.3955 cv +211.083 96.1504 210.398 96.0273 209.728 96.0273 cv +209.332 96.0273 209.025 96.0684 208.805 96.1504 cv +208.585 96.2314 208.365 96.3467 208.145 96.498 cv +207.924 96.6494 207.791 96.8516 207.743 97.1064 cv +207.651 97.6182 207.743 98.0107 208.021 98.29 cv +208.301 98.5674 208.719 98.8223 209.274 99.0537 cv +210.179 99.3672 li +211.731 100.016 212.926 100.59 213.762 101.09 cv +214.596 101.588 215.013 102.717 215.013 104.479 cv +215.013 105.522 214.81 106.542 214.403 107.54 cv +213.998 108.535 213.425 109.237 212.671 109.644 cv +211.917 110.049 211.117 110.333 210.259 110.496 cv +209.408 110.657 208.539 110.738 207.664 110.738 cv +206.619 110.738 205.629 110.646 204.696 110.461 cv +203.758 110.275 203.015 109.997 202.458 109.627 cv +202.111 109.208 li +202.203 108.535 202.261 107.887 202.285 107.262 cv +202.309 106.636 202.33 106.032 202.354 105.453 cv +202.703 105.313 li +204.232 106.658 205.798 107.331 207.397 107.331 cv +207.722 107.331 208.034 107.291 208.335 107.21 cv +208.637 107.127 208.887 107.001 209.084 106.827 cv +209.28 106.653 209.425 106.443 209.519 106.199 cv +209.61 105.957 209.658 105.777 209.658 105.662 cv +209.658 105.384 209.564 105.121 209.379 104.879 cv +209.194 104.636 208.289 104.126 206.667 103.348 cv +205.044 102.572 204.024 101.935 203.606 101.436 cv +203.188 100.938 202.893 100.4 202.72 99.8184 cv +202.547 99.2393 202.458 98.6729 202.458 98.1152 cv +202.458 97.5596 202.615 96.7246 202.929 95.6123 cv +203.241 94.499 204.07 93.7334 205.415 93.3164 cv +206.759 92.8994 207.987 92.6904 209.101 92.6904 cv +210.956 92.6904 212.625 92.9912 214.107 93.5957 cv +214.456 93.9082 li +cp +231.496 102.741 mo +231.079 102.983 li +221.237 103.192 li +221.354 104.027 221.597 104.723 221.967 105.278 cv +222.34 105.835 222.885 106.246 223.604 106.513 cv +224.321 106.779 225.039 106.913 225.758 106.913 cv +227.334 106.913 228.922 106.462 230.523 105.557 cv +230.801 105.765 li +230.628 109.487 li +230.175 109.834 li +228.622 110.461 226.906 110.774 225.027 110.774 cv +224.008 110.774 223.046 110.668 222.142 110.461 cv +221.237 110.251 220.229 109.787 219.116 109.069 cv +218.003 108.351 217.214 107.302 216.75 105.922 cv +216.288 104.542 216.056 102.926 216.056 101.07 cv +216.056 99.4727 216.356 98.0225 216.96 96.7246 cv +217.563 95.4268 218.543 94.4297 219.898 93.7334 cv +221.256 93.0381 222.687 92.6904 224.193 92.6904 cv +225.771 92.6904 227.104 93.0313 228.192 93.7158 cv +229.282 94.4004 230.106 95.4512 230.661 96.8643 cv +231.219 98.2773 231.496 100.236 231.496 102.741 cv +cp +225.266 96.5508 mo +224.934 96.3418 224.482 96.2363 223.898 96.2363 cv +223.504 96.2363 223.086 96.3359 222.656 96.5342 cv +222.223 96.7305 221.881 97.125 221.621 97.7158 cv +221.366 98.3076 221.237 98.915 221.237 99.541 cv +226.385 99.541 li +226.385 98.8223 226.327 98.2305 226.21 97.7676 cv +226.095 97.3037 225.775 96.8975 225.266 96.5508 cv +cp +244.781 102.498 mo +244.919 110.078 li +244.746 110.321 li +239.218 110.321 li +239.078 110.078 li +239.182 98.5674 li +239.078 87.3691 li +239.182 87.125 li +245.522 87.125 li +248.356 87.125 250.455 87.3584 251.816 87.8223 cv +253.174 88.2861 254.106 88.9277 254.622 89.752 cv +255.132 90.5752 255.469 91.3574 255.631 92.0986 cv +255.794 92.8418 255.875 93.6172 255.875 94.4297 cv +255.875 96.167 255.526 97.6514 254.832 98.8818 cv +254.136 100.109 253.104 101.019 251.735 101.609 cv +250.368 102.202 248.444 102.498 245.964 102.498 cv +244.781 102.498 li +cp +244.781 98.4277 mo +245.928 98.4277 li +246.3 98.4277 246.752 98.3887 247.285 98.3076 cv +247.819 98.2256 248.345 98.0342 248.866 97.7334 cv +249.39 97.4307 249.76 97.0195 249.979 96.498 cv +250.2 95.9766 250.311 95.2979 250.311 94.4639 cv +250.311 93.6533 250.137 92.9971 249.782 92.498 cv +249.429 92.001 248.936 91.6641 248.305 91.4893 cv +247.667 91.3164 246.843 91.2295 245.834 91.2295 cv +244.781 91.2295 li +244.781 98.4277 li +cp +263.664 92.793 mo +264.082 92.7256 264.568 92.6904 265.125 92.6904 cv +266.307 92.6904 267.473 92.876 268.621 93.2461 cv +269.767 93.6172 270.683 94.2041 271.367 95.002 cv +272.052 95.8027 272.545 96.8398 272.845 98.1152 cv +273.146 99.3916 273.296 100.689 273.296 102.01 cv +273.296 102.773 273.262 103.453 273.192 104.045 cv +273.122 104.636 272.96 105.354 272.705 106.199 cv +272.451 107.048 271.958 107.857 271.228 108.634 cv +270.498 109.412 269.61 109.956 268.567 110.268 cv +267.524 110.582 266.389 110.738 265.161 110.738 cv +264.023 110.738 262.97 110.611 261.995 110.356 cv +261.021 110.102 260.118 109.627 259.281 108.93 cv +258.447 108.235 257.833 107.291 257.438 106.097 cv +257.044 104.903 256.848 103.61 256.848 102.219 cv +256.848 101.779 256.854 101.431 256.864 101.175 cv +256.877 100.92 256.929 100.312 257.022 99.3506 cv +257.114 98.3887 257.456 97.3496 258.048 96.2363 cv +258.639 95.124 259.584 94.2207 260.882 93.5244 cv +261.369 93.3164 261.826 93.1543 262.256 93.0381 cv +262.685 92.9229 263.154 92.8418 263.664 92.793 cv +cp +262.585 105.139 mo +262.771 105.743 262.999 106.206 263.265 106.531 cv +263.532 106.856 263.827 107.053 264.152 107.122 cv +264.477 107.192 264.754 107.227 264.986 107.227 cv +265.657 107.227 266.231 107.035 266.708 106.653 cv +267.183 106.27 267.513 105.633 267.698 104.739 cv +267.883 103.848 267.977 102.856 267.977 101.768 cv +267.977 101.256 267.964 100.811 267.942 100.427 cv +267.919 100.045 267.854 99.4941 267.751 98.7764 cv +267.645 98.0576 267.473 97.5195 267.229 97.1592 cv +266.984 96.7998 266.679 96.54 266.307 96.376 cv +265.937 96.2148 265.576 96.1328 265.23 96.1328 cv +264.719 96.1328 264.255 96.248 263.838 96.4805 cv +263.282 96.8516 262.876 97.5459 262.621 98.5674 cv +262.366 99.5879 262.239 100.712 262.239 101.939 cv +262.239 102.613 262.272 103.232 262.342 103.801 cv +262.412 104.369 262.494 104.815 262.585 105.139 cv +cp +286.511 93.9082 mo +286.373 94.6035 286.274 95.1826 286.217 95.6465 cv +286.157 96.1104 286.128 96.666 286.128 97.3154 cv +285.747 97.4551 li +285.168 96.9912 284.53 96.6367 283.834 96.3955 cv +283.14 96.1504 282.454 96.0273 281.782 96.0273 cv +281.389 96.0273 281.08 96.0684 280.859 96.1504 cv +280.641 96.2314 280.42 96.3467 280.199 96.498 cv +279.98 96.6494 279.846 96.8516 279.801 97.1064 cv +279.707 97.6182 279.801 98.0107 280.079 98.29 cv +280.356 98.5674 280.773 98.8223 281.33 99.0537 cv +282.233 99.3672 li +283.787 100.016 284.982 100.59 285.816 101.09 cv +286.651 101.588 287.067 102.717 287.067 104.479 cv +287.067 105.522 286.866 106.542 286.461 107.54 cv +286.054 108.535 285.479 109.237 284.728 109.644 cv +283.974 110.049 283.173 110.333 282.316 110.496 cv +281.463 110.657 280.595 110.738 279.718 110.738 cv +278.676 110.738 277.686 110.646 276.751 110.461 cv +275.812 110.275 275.069 109.997 274.514 109.627 cv +274.166 109.208 li +274.26 108.535 274.317 107.887 274.341 107.262 cv +274.363 106.636 274.388 106.032 274.41 105.453 cv +274.758 105.313 li +276.287 106.658 277.853 107.331 279.452 107.331 cv +279.776 107.331 280.091 107.291 280.391 107.21 cv +280.693 107.127 280.941 107.001 281.139 106.827 cv +281.335 106.653 281.482 106.443 281.573 106.199 cv +281.667 105.957 281.713 105.777 281.713 105.662 cv +281.713 105.384 281.619 105.121 281.434 104.879 cv +281.249 104.636 280.346 104.126 278.723 103.348 cv +277.1 102.572 276.078 101.935 275.662 101.436 cv +275.244 100.938 274.949 100.4 274.775 99.8184 cv +274.601 99.2393 274.514 98.6729 274.514 98.1152 cv +274.514 97.5596 274.67 96.7246 274.983 95.6123 cv +275.297 94.499 276.126 93.7334 277.47 93.3164 cv +278.814 92.8994 280.042 92.6904 281.157 92.6904 cv +283.012 92.6904 284.68 92.9912 286.164 93.5957 cv +286.511 93.9082 li +cp +289.259 96.4111 mo +287.45 96.5156 li +287.207 96.2021 li +287.416 93.1074 li +287.695 92.793 li +289.259 92.793 li +289.189 88.7617 li +289.398 88.4824 li +294.371 87.0908 li +294.58 87.3008 li +294.58 92.793 li +297.57 92.793 li +297.814 93.1074 li +297.502 96.2021 li +297.223 96.4111 li +294.511 96.4111 li +294.58 103.158 li +294.58 104.479 li +294.58 105.083 294.621 105.547 294.701 105.87 cv +294.782 106.194 294.967 106.467 295.259 106.688 cv +295.549 106.908 295.948 107.017 296.458 107.017 cv +296.922 107.017 297.352 106.891 297.745 106.636 cv +298.057 106.844 li +297.941 107.237 297.831 107.776 297.728 108.461 cv +297.622 109.145 297.57 109.729 297.57 110.217 cv +297.084 110.53 li +296.383 110.692 295.46 110.774 294.326 110.774 cv +293.577 110.774 292.923 110.722 292.349 110.618 cv +291.781 110.513 291.212 110.275 290.655 109.904 cv +290.101 109.533 289.711 108.879 289.504 107.939 cv +289.294 107.001 289.189 105.917 289.189 104.687 cv +289.189 103.782 li +289.259 96.4111 li +cp +314.575 92.8633 mo +314.714 93.1074 li +314.611 94.6035 li +314.575 96.2725 li +314.263 96.5508 li +312.211 96.376 li +312.651 97.3262 312.871 98.2666 312.871 99.1934 cv +312.871 100.027 312.675 100.827 312.281 101.593 cv +311.887 102.356 311.278 102.99 310.455 103.487 cv +309.631 103.986 308.92 104.3 308.316 104.427 cv +307.713 104.555 307.134 104.624 306.578 104.636 cv +306.021 104.648 305.604 104.653 305.325 104.653 cv +304.873 105.628 li +307.064 106.322 li +308.989 106.901 310.455 107.446 311.464 107.956 cv +312.471 108.468 313.121 109.117 313.41 109.904 cv +313.7 110.692 313.845 111.376 313.845 111.956 cv +313.845 112.65 313.741 113.318 313.533 113.956 cv +313.324 114.592 312.912 115.26 312.297 115.955 cv +311.683 116.651 310.755 117.189 309.516 117.572 cv +308.276 117.953 306.972 118.146 305.604 118.146 cv +304.792 118.146 304.017 118.088 303.273 117.973 cv +302.206 117.74 301.257 117.347 300.422 116.79 cv +299.588 116.233 299.048 115.619 298.805 114.946 cv +298.562 114.272 298.439 113.693 298.439 113.208 cv +298.439 112.65 298.526 112.113 298.701 111.591 cv +298.874 111.07 299.112 110.623 299.413 110.251 cv +299.715 109.881 299.958 109.608 300.144 109.434 cv +300.329 109.261 300.527 109.093 300.733 108.93 cv +300.527 108.79 300.329 108.641 300.144 108.479 cv +299.958 108.314 299.773 108.13 299.588 107.921 cv +299.588 107.505 li +299.982 106.926 300.363 106.304 300.733 105.645 cv +301.106 104.984 301.406 104.351 301.64 103.75 cv +299.97 102.658 299.09 101.62 298.996 100.636 cv +298.903 99.6514 298.858 98.9971 298.858 98.6729 cv +298.858 98 298.974 97.3213 299.205 96.6367 cv +299.436 95.9531 299.883 95.2637 300.544 94.5684 cv +301.205 93.8721 302.127 93.415 303.309 93.1953 cv +304.491 92.9746 305.882 92.8633 307.481 92.8633 cv +314.575 92.8633 li +cp +303.97 99.7852 mo +304.225 100.736 304.591 101.274 305.065 101.401 cv +305.54 101.529 305.835 101.593 305.95 101.593 cv +306.368 101.593 306.753 101.448 307.099 101.156 cv +307.447 100.869 307.696 100.498 307.848 100.045 cv +307.997 99.5928 308.072 99.1123 308.072 98.6025 cv +308.072 98.4873 308.062 98.3584 308.038 98.2188 cv +308.014 98.0791 307.992 97.8896 307.968 97.6445 cv +307.944 97.4014 307.806 97.0947 307.55 96.7246 cv +307.295 96.3535 307.019 96.1104 306.716 95.9932 cv +306.415 95.8779 306.159 95.8213 305.95 95.8213 cv +305.604 95.8213 305.256 95.9365 304.907 96.167 cv +304.562 96.4004 304.299 96.7764 304.127 97.2988 cv +303.951 97.8193 303.864 98.334 303.864 98.8447 cv +303.864 99.2168 303.899 99.5303 303.97 99.7852 cv +cp +302.961 113.208 mo +303.055 113.672 303.298 114.071 303.691 114.407 cv +304.086 114.744 304.508 114.962 304.961 115.068 cv +305.412 115.174 305.882 115.225 306.368 115.225 cv +306.693 115.225 306.983 115.2 307.238 115.155 cv +307.492 115.109 307.737 115.011 307.968 114.859 cv +308.201 114.708 308.392 114.471 308.542 114.147 cv +308.693 113.821 308.768 113.497 308.768 113.173 cv +308.768 113.012 308.722 112.795 308.63 112.53 cv +308.537 112.263 308.112 111.985 307.359 111.695 cv +306.605 111.404 305.87 111.145 305.152 110.912 cv +304.004 110.53 li +303.309 111.411 302.961 112.199 302.961 112.894 cv +302.961 113.208 li +cp +321.704 110.078 mo +321.564 110.321 li +316.385 110.321 li +316.176 110.078 li +316.281 101.939 li +316.176 93.8037 li +316.414 93.4561 li +316.807 93.4316 317.189 93.3994 317.567 93.3506 cv +317.943 93.3057 318.419 93.2354 318.992 93.1416 cv +321.433 92.6904 li +321.704 93.0381 li +321.704 95.6816 li +322.262 94.6602 322.905 93.9248 323.636 93.4736 cv +324.365 93.0215 325.159 92.7598 326.017 92.6904 cv +326.296 93.0381 li +326.249 93.2695 326.151 93.7207 326 94.3936 cv +325.849 95.0664 325.749 95.5176 325.704 95.751 cv +325.356 98.4277 li +325.008 98.5332 li +324.638 98.2998 324.198 98.1846 323.688 98.1846 cv +323.292 98.1846 322.897 98.3242 322.504 98.6025 cv +322.109 98.8818 321.854 99.4141 321.739 100.201 cv +321.623 100.99 321.564 101.743 321.564 102.462 cv +321.564 103.76 321.584 105.083 321.612 106.427 cv +321.642 107.771 321.675 108.988 321.704 110.078 cv +cp +342.535 102.741 mo +342.119 102.983 li +332.277 103.192 li +332.393 104.027 332.637 104.723 333.007 105.278 cv +333.378 105.835 333.923 106.246 334.642 106.513 cv +335.36 106.779 336.078 106.913 336.797 106.913 cv +338.374 106.913 339.962 106.462 341.562 105.557 cv +341.84 105.765 li +341.666 109.487 li +341.215 109.834 li +339.661 110.461 337.945 110.774 336.067 110.774 cv +335.048 110.774 334.085 110.668 333.182 110.461 cv +332.277 110.251 331.269 109.787 330.156 109.069 cv +329.042 108.351 328.255 107.302 327.79 105.922 cv +327.328 104.542 327.096 102.926 327.096 101.07 cv +327.096 99.4727 327.396 98.0225 327.999 96.7246 cv +328.603 95.4268 329.582 94.4297 330.937 93.7334 cv +332.294 93.0381 333.727 92.6904 335.233 92.6904 cv +336.809 92.6904 338.142 93.0313 339.23 93.7158 cv +340.322 94.4004 341.146 95.4512 341.701 96.8643 cv +342.259 98.2773 342.535 100.236 342.535 102.741 cv +cp +336.305 96.5508 mo +335.975 96.3418 335.522 96.2363 334.937 96.2363 cv +334.544 96.2363 334.126 96.3359 333.697 96.5342 cv +333.263 96.7305 332.919 97.125 332.659 97.7158 cv +332.404 98.3076 332.277 98.915 332.277 99.541 cv +337.425 99.541 li +337.425 98.8223 337.366 98.2305 337.248 97.7676 cv +337.133 97.3037 336.813 96.8975 336.305 96.5508 cv +cp +357.802 88.2383 mo +357.419 92.5508 li +357.14 92.6904 li +355.425 91.3691 353.758 90.708 352.133 90.708 cv +351.508 90.708 350.877 90.8809 350.238 91.2295 cv +349.601 91.5781 349.283 92.2021 349.283 93.1074 cv +349.283 93.6865 349.566 94.2041 350.134 94.6553 cv +350.703 95.1074 351.393 95.4961 352.202 95.8213 cv +353.073 96.167 li +354.836 96.8867 356.161 97.7451 357.054 98.7422 cv +357.947 99.7373 358.462 101.024 358.602 102.602 cv +358.602 103.853 358.393 105.1 357.977 106.339 cv +357.559 107.58 356.893 108.506 355.977 109.122 cv +355.061 109.737 354.115 110.164 353.142 110.407 cv +352.169 110.652 351.113 110.774 349.979 110.774 cv +348.702 110.774 347.515 110.641 346.413 110.373 cv +345.312 110.107 344.355 109.718 343.544 109.208 cv +343.302 108.825 li +343.347 108.525 343.412 108.148 343.493 107.696 cv +343.572 107.245 343.613 106.96 343.613 106.844 cv +343.788 104.653 li +344.102 104.514 li +345.955 105.929 347.798 106.636 349.63 106.636 cv +350.441 106.636 351.241 106.422 352.03 105.992 cv +352.818 105.563 353.211 104.85 353.211 103.853 cv +353.211 103.134 352.945 102.555 352.411 102.115 cv +351.878 101.674 351.078 101.198 350.012 100.689 cv +349.074 100.236 li +347.428 99.4482 346.153 98.5918 345.249 97.6641 cv +344.343 96.7363 343.892 95.4727 343.892 93.8721 cv +343.892 92.7129 344.112 91.5713 344.553 90.4463 cv +344.992 89.3223 345.764 88.4258 346.866 87.7529 cv +347.967 87.0801 349.56 86.7441 351.647 86.7441 cv +352.781 86.7441 353.896 86.8711 354.985 87.125 cv +356.075 87.3799 357.014 87.7529 357.802 88.2383 cv +cp +375.259 109.627 mo +375.746 109.857 376.291 110.107 376.893 110.373 cv +377.495 110.641 378 110.856 378.405 111.017 cv +378.813 111.179 379.269 111.342 379.779 111.505 cv +380.29 111.666 380.741 111.816 381.136 111.956 cv +381.24 112.304 li +379.502 115.955 li +379.084 116.128 li +378.344 115.688 377.536 115.231 376.667 114.749 cv +375.797 114.272 374.934 113.816 374.076 113.377 cv +373.218 112.935 372.204 112.433 371.034 111.875 cv +369.862 111.317 369.023 110.912 368.513 110.657 cv +367.424 110.542 366.426 110.309 365.521 109.956 cv +364.617 109.608 363.661 108.994 362.652 108.112 cv +361.645 107.227 360.891 105.998 360.394 104.415 cv +359.895 102.839 359.645 101.129 359.645 99.292 cv +359.645 98.8047 359.667 98.2998 359.714 97.7744 cv +359.761 97.252 359.854 96.4111 359.991 95.2471 cv +360.131 94.0889 360.624 92.7314 361.47 91.1885 cv +362.316 89.6416 363.336 88.5918 364.53 88.0371 cv +365.726 87.4736 366.56 87.125 367.034 86.9863 cv +367.51 86.8496 368.036 86.7783 368.617 86.7783 cv +369.081 86.7783 369.485 86.7783 369.833 86.7783 cv +371.318 86.7783 372.803 87.0332 374.285 87.5439 cv +375.77 88.0527 376.94 88.8359 377.797 89.8906 cv +378.655 90.9453 379.269 92.2266 379.642 93.7334 cv +380.012 95.2393 380.196 96.8271 380.196 98.498 cv +380.196 100.561 379.966 102.322 379.502 103.782 cv +379.038 105.244 378.48 106.443 377.831 107.382 cv +377.183 108.321 376.326 109.069 375.259 109.627 cv +cp +368.096 91.3691 mo +367.284 91.8779 366.628 92.8057 366.131 94.1504 cv +365.632 95.4961 365.383 97.0264 365.383 98.7422 cv +365.383 100.341 365.504 101.779 365.748 103.053 cv +365.991 104.329 366.42 105.186 367.034 105.628 cv +367.649 106.066 368.17 106.344 368.6 106.462 cv +369.028 106.577 369.463 106.636 369.902 106.636 cv +370.506 106.636 371.056 106.531 371.556 106.322 cv +372.054 106.113 372.528 105.703 372.981 105.088 cv +373.433 104.473 373.752 103.732 373.937 102.862 cv +374.122 101.993 374.261 101.164 374.354 100.376 cv +374.446 99.5879 374.494 98.7998 374.494 98.0107 cv +374.494 96.6904 374.366 95.4961 374.11 94.4297 cv +373.855 93.3623 373.473 92.5801 372.963 92.0811 cv +372.454 91.583 371.983 91.248 371.556 91.0732 cv +371.126 90.8984 370.669 90.8135 370.182 90.8135 cv +369.857 90.8135 369.562 90.8477 369.296 90.917 cv +369.028 90.9873 368.803 91.0508 368.617 91.1084 cv +368.433 91.167 368.258 91.2529 368.096 91.3691 cv +cp +381.762 110.321 mo +381.623 110.078 li +381.726 98.5674 li +381.623 87.3691 li +381.726 87.125 li +387.291 87.125 li +387.466 87.3691 li +387.418 88.9922 387.384 90.7998 387.361 92.793 cv +387.337 94.7881 387.326 96.7119 387.326 98.5674 cv +387.326 106.079 li +394.733 105.974 li +394.977 106.356 li +394.697 109.974 li +394.456 110.321 li +381.762 110.321 li +cp +clp +394.977 118.425 mo +394.977 84.6924 li +93.7852 84.6924 li +93.7852 118.425 li +394.977 118.425 li +cp +/0 +<< +/Name (Black) +/CSA /0 get_csa_by_name +/MappedCSA /0 /CSA get_res +/TintMethod /Subtractive +/TintProc null +/NComponents 4 +/Components [ 0 0 0 1 ] +>> +/CSD add_res +1 /0 /CSD get_res sepcs +level3{ +gsave +clp +[0 -33.7323 301.188 0 244.39 118.423 ]ct +/1 +<< +/ShadingType 2 +/ColorSpace [/Separation /sep_colorspace_dict AGMCORE_gget dup /Name get exch /MappedCSA get /sep_colorspace_proc load] +/Coords [0 0 1 0 ] +/Domain [0 1 ] +/Extend[ true true] +/Function +<< +/Domain[0 1 ] +/FunctionType 3 +/Functions [ +<< +/Domain[0 1 ] +/FunctionType 2 +/C0 [1 ] +/C1 [0.5 ] +/N 1 +>> +] +/Bounds [] +/Encode [0 1 ] +>> +>>/Gradient add_res /1 /Gradient get_res clonedict shfill grestore +}if +level3 not{ +gsave +[0 -33.7323 301.188 0 244.39 118.423 ]ct +clp +/1 { +<< +/NumSamples 256 +/NumComp 1 +/Scaling[[0.00392157 0 ]] +/Samples[ +<~s8N#rrVZTjqtg0bq=saZp\+=Rp%7nJoCDJBnaQ&:n*]W2mHj3*lg!d"l0.?okN:pgjlGL_j5T(WiS`YO +hqm5Gh;$f?gY1B7g"=s/f@JO'e^W*te'c[ldEp7dcd'h\c-4DTbK@uLaiMQDa2Z-<`Pf^4_ns:,_8*k$ +^V7Fq]tD"i]=PSa\[]/Y\$i`Q[C!fV50o^US=KVTqJ'N +T:VXFSXc4>S!oe6R@'A.Q^3r&Q'@MsPEM)kOcYZcO,f6[NJrgSMi*CKM26tCLPCP;KnP,3K7\]+JUi9# +~> +] +>> +0 0 1 0 []true true [] +/Separation +GenStrips +} /Gradient add_res /1 /Gradient get_res exec grestore +}if +np +grestore +%ADOBeginClientInjection: EndPageContent "AI11EPS" +userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse +%ADOEndClientInjection: EndPageContent "AI11EPS" +grestore +grestore +pgrs +%%PageTrailer +%ADOBeginClientInjection: PageTrailer Start "AI11EPS" +[/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 +%ADOEndClientInjection: PageTrailer Start "AI11EPS" +[ +[/CSA [/0 ]] +[/CSD [/0 ]] +[/Gradient [/0 /1 ]] +] del_res +Adobe_AGM_Image/pt gx +Adobe_CoolType_Core/pt get exec Adobe_AGM_Core/pt gx +currentdict Adobe_AGM_Utils eq {end} if +%%Trailer +Adobe_AGM_Image/dt get exec +Adobe_CoolType_Core/dt get exec Adobe_AGM_Core/dt get exec +%%EOF +%AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (Fitri Ardiwahyudi) () %%Title: (Crunchy_EnterprisePostgreSQL.eps) %%CreationDate: 12/19/14 7:57 PM %AI9_DataStream %Gb!R&q-NX9Z7,Y,!;?IC1./ni"r/"B5X@hY_O3ta&2:n'q`TG!CHpA*ktGVsf\bEG4T6D?Uf5fL;cctCV7ka6F?/Rr-XW_7J*#H: %PAqr_S3+\8h8pAonp5)hS&&@e-H`X@!#e>UaUC"$7%"IMKdTbq2BC,\A,N^Cr#JHH9l\l+bie*PGUh![md`T5M>O%="a<#qd^[aF %\\,nfe@RCS%tpqWgKD%m;$L<9j6ri+E8835rcSNUcCJK*F?/lO6/Bcd#(T(ualTj#DnPEIRK.EU5Pp/hF*&Z*Nk`%-MZr_pHGDl1 %aqsHV\mo\ZqXHf-%).JfL"KN:Vj#^4JUKWTSW,^h!?Q]AiM%cF,+Cokb'0g2N!$PH0[V/`-Fbo/`[%huQZ.!s)bjm"S3*9QUKNUK %P%PJ,%K84)r&Y/Ukm]"ul27$0[5mRc+r/'cC\YYPfZ?,"3Ql!hC`7i%1MLn0AiUogGE^teL5B>O$%RqJIk]0Yj"_?/Y#!)27"q-m_aq7e)3)p+"-LqB+h3sM-F_HNh![chOc:^9E?HMGa58j8'BM1r!h5$Zh-'NBc!YWB`gojrLfo\,,o@1U %"HB.,Tm<-C^ajF"24Wae5eT]N'2>CX'Obo[*;1-8VW7(Qq7m)iAlSf:oKVS#&7Mg\9Vdf$\sU_OPG^AM[0#?-kS(A`37NiG"G+G6Al5%6 %(:D9$5P0%UMcs\uW"o/`5#JA$)7:r\d?EZI\l15V2M-JI$3J8AVZd+W(Bj:;kqVEUkmtU$m\2)nrC"Na7A$Ln)ADs8XjEI!8BF"O %,4p`GTFmkn1i>nlngk[mqF#h,&YVu'M9q)E7O(6lB\_f1\r+L\E"Zmur2:>K(]$O:"9Df'r'7Hd[,d2hE(C %SFVKE+TG7g1d:Pg+;#*H;3Q?[A*>jdKuQVC9W1:L7H6b-kV"bR_LM2LHB,/$:Xf`2%t,'C&h+uG-28'A.KcX4<.67A8H/tG;(Fsl %8f'7'dX0JbdP$3=5c4H'/a,FK#*"X8-5mnNRZ*]j7H6b-W"kG51d45>ngsW*D:%KO?7OW-G6m:9"sVl&L8h7NBgY$2P!W]1l368u %Tf_KZTfU"_k_=CY3C:bUqMn`Vli]@pT%k^n8C*-)&nr[T-aY$."T4>%YG1FF)4-\)X.ia]:5\BOl)&L)a<,_3OWgah$C<3,'gA93 %;+dR\'l)+0df*.W">4s4Hj'?Xr?bR-Q2\b_jGrf#r(ABYho]m.cfIlta;*eqq3Oj?^Qm^;?RA/>c=A?kN:a;U,^5L1jBnlSr`4K3 %IkED#P:Odonukq7Ik/:U5=YWBloF&GqBUG7J()0RD\uhD=\bgsSh1:90p@J&I(CL-nOu')^R*?uGT-OVH1X7*8]BX-cbOsq2pJ8r %@]#M)pim_FAd(Ad5ck067_m?Hip`.^B.Bi+q4HfsYW0`I/$hNOs'6ZgD'XA.7UPgf'#.5"W\QMRnPh!*e[b5oVEc^$L/3O<)?$pm=;WbbV=-n@T*3SrXdo\n`Pp#+B^S*6jVoB@9jIBJ?H@U)]6f\[1TJB_\PPBWb9l`diA?$cPOV&6U""Y`BV3L+Qe:\=--':+& %H\pn[$G'#&J=pOQ$;T],-7+X3KCg#6:;V@:#t$$pbmJ2K'dV&"r#i;'Su,DEGsZHs-!Znr)2o5BSs?+>6VgA4&O3Ra*+gp,3'l(- %[EBhRfR?BhKV%5=Op"6Of,@qG0dJ%1`6_g_[YdBK-5<@YLVf5NS>'7VY?60Q)ZC&V@PGh8t&!M+ZjB2fl`[o4* %V7'&$oc/()@k%bU9K1B@O,)Fl7DaoS6.Q#qQDGLSIa\m:qIU=V#e-amV2@\7&;Ng&.BggKMqO%?SPgOa2j@Vlc=BfY%N.2C(V-<; %!61HQ'I-Ef?sD;Dl4qiGU8>Bg)/A%pCU0+g^t&Yd'GaONpP:1[Kt4!GkZQ+P.RMJODg=/g6;R.krD+.Cg7k/@?&S>HdVmj*oUGC_ %rIqE'B+`/q.%+R-b7]4IFp>Ko!uDs5@[K&h'ZPK*_;aj)q4eE;1MHM]4KNk1CbU:h#+tX\Z(^U6bIB#gt:]"3-UbSqLe+(6&8U;-CVb$.n %V7A@N'$EOf9[n8A$PJq!B4!D86=VlsQjUQ^Ij95*hpJqKmP'n_oN1l@d$>6s<"_m9K)S6.J9`A*66'Jbj?N&mU69U%[k3b,'>9L? %a:t%baUAS&bYeo_$](lCob#8p8tC&mZ?Kur6OBNhR[OP;BZUUJG_o(g./'0[,, %\VEdM&\"F\K\Amd(.XMud%DrL(ARVmKU^%*\jj\iY+es[eR4WhPOHT$8\HCtP,2'83)#p`UJ'#)+:EhA8Ol@JQWcgM7H3>@HVVU4 %c+-9r++bmI`?j^e[>NHQ`ip^o_ESe.J&E;]mrSb<%5l0sT,EG1aU"SY&gVL)C4SC&0II^;@h=d`M8`@5is]hH8:/g %<517rTqL%\=`Q:IgE*-$`))BqhkC'VqR7>DRYl3t59OJteYG:Pj!C7F6qlDZ!kIs7e%="3BKM %kRY[=7/3]u+aZa3$=$0G]W=qu,>LfE!KN<>co/#k=dF)nN0Hp9qFPXjqcHL93]=iRNP6a="i^MXe"ZX?U6ifqWrG^5IYl&e17,=H %UQNHtYVij1e._P!MkT*KqVpBEcF5,_Mi`3hDT66#!c].g`3<3!Q051`e4rb9ZeG8PV\E@A&t^YEC`/OB.;A %JW*Cpc'5^N7CNO)H6.CXOiS2#T9N`M&_0H*6CEJf(bHt$g!VuPg1,7UGMGOu&Q$RDYDO#9 %A$:ZJ;XV:bE[%k\'Jb5*k:H0_Z>6f^V&-jITiPKO%G\m)!(Mgkaj\=gi#EN9*]oA-Di`G\WoG`'ZiJF"=a:"^!MfN0=hZu.Q^QhYgoZjC^7sfl06bmEi$f^OcNJ/-N=c-2J&684b"GK3i:2j-- %O5a%.7ClD@[LL-UTSs/A7>5Jep*5q2Q*Ec9;b=oTQ+^j_&)jCOL-.a]8:*iMb4DE$+t:R2X:hP/Z4sA#Iuodl8DHkNF>Sas0:1bV %0Y^3AU-bh(b>qfk7ESVnXWbHYY#(aTI]'D!+/SL^^EN%ACCpB,P5lW;Z2C5mTif?_->r;"O.$Z2#d[PK9?<+;92!7F#F%WkW3(5qXL5qTgrJ5[Y5'WN!OrID);nn]'=^jZ1=d6[h^M'F=]#8eJn'1A8DH4[?EcsA:S@\X; %rj4b+2`lq9GA01,o]H7aFH-4_-;VG-`pd=;E\5u_c2s=$DFLq)i6-Q!r>G5Cn?@"#q:8^Z(B]"LXWCY#(YpBW3WF9[:8_U4J(e+I %2l4^m.VeuJ"%O"h0Y*V`9!;]e)X&mj`Pqj:/C<)j"5NgH%)(F6O,%(OBD+LT)'L]D04Q4#ej(R@45rMN*ref]3tTSbI_4)!E;ln/ %UZtIX,;+_anY#R$HnkE(LW0igVrFn;D"qaVnuolS3`C0!^=&GAh%(NGAd'*Xl#SiKK8*c^8[,Htk+3R/sj^7&Q\Ckg3?7CL.#=dUjF[*HV0j7,N"#nmgSZWK='cc1n5;S4"4it+O'Qirn7-PD8H,*h(!ksQk\ %9b\8;6oi(2.L@8T1@amF,+2-%P$Bc5bTsO:@^;4L-i%:!.C`8LMT'A7a]'b/V:$gRJJM1\<&qpq.OfpY30oJD#qj>rcrMSJ_e$A& %=5q@BcW)qJc(nL0jq?oh3gJjUBid?ZcDHNa;S%flXpj@5],8$O]d*YFaGql"RW>`JM\XFn4"Zfnh;D%BmUG6/==Nl2doO0im7P%8 %:d$YD#30I\GXq5H@QOoDlobs.;p@op*jIsC4U$pQ'9K7\(708"a> %3jTsGaJ$j*Z_/mQd&8Lo>o$BQGYs#6*e)879F600:RB$^1X[/&r=%m[-CFllK?+J.28c3nS;uSphTI&77JOuV%\S:kW'gt,,Ct8; %es1tt)1F'.3G%t7JKAA79[G7!Zmu;@Q2k1m6bkE*!ORmm/M)N,(88&?EuGsn5Z8?;[nX-#]L`.2R"q:hk]@DY)^5I\iBZ.]T_3;h %dnL,;;ZV5A#.m]b&SJmSUqp61^hP.1HE[]&/q>h9)aX-3\P'*g&+YQ@oPSjf^47JP!AkgRmYZsK$u)htfKOGmE^ %lrt&6P=`C%kWpT4!5e=9[KZ0<;L?4%HT\^e@-'GT"jq-)D:a`q4.0bCbJmOo_6ecqKeRIqZfDVMe%5&ihpZ"L-a#SPCJP6#d-f#U,k?#[ZLT?Ip/nF#aqlUd(bDoiq(ncT? %\:ZINV0aQk?SIV::o,-NaU,),GUS6/Mu[BZompG$NiHY/=WfN"(H82-=,C6.h5o %h0MTXhi\VR,paOjJ(X"G#>PEZQE1$o7IMhkMs9\[Q`C)CAArThE]c>2e@@"-pW6i]hEc#eRe&e`S;Q?V]3[a0rWdT-rrk!FJ,]=p %n8/"E(:.g($6`cr*P322`o^e0*XoftSS4AFnipoE'A4YLFrY-RY($uZMf0u\OrF=47jZcdg5P=3*9lI4H8N"]en-W9 %3#Tq)s67@M0e#hp(;o?2(Z=d>#+l9$puu %q:D:KR#:3UV6OTq"Tj],8c,Abom<]9UNa9CS^uZok\1=rJ?Z#2QtM>)/&)kG+&ZL]qm2lAIS3refjTKc]\Wq_3Ef6(d@7Z#3-G-BAJcN@TM=&$+>N9q2gc_7)DotKf``e:+NCt,D03d%.9+C_8T-*&W5BX93Y:u %>)c*!Xm$`8hRPmfUs>AAg^q+EQm`]qLNHSQX=*_:8A<-8=nH&2gO3:6SV^85b`)a?djGN4dUWBAAq1N%;oPj&XD'2-_!^@jT>6)n]DIYY(Pi#Wf#PZ^^7?0S^d:K(#W2Qrkd--S.iZ3QCXArr/1dDVQK!oc?MT_fs^dE7F,tKfspd;\YPro!=&Z0hq$kq^SU+c+OGDM36AWt6o$QRZG=cIb(OZ,#io)_HB&C8DV^^SBUEQ$ %XPm3'-31BC%L5B %31=W0m@^^n0'q>mHL7B5c=E=;:G_N^3jDQfm'Za8*Lg9>(d*tt6L/MskJ_,/(\K89_a:,a?VZh)Gpc"h(Foe!j)u[iCZ?sZ@QHj] %MtduaZotn&IsCN2$+Jd[5?8OgBfKCG)^fHZ[(/)+ZX1@@.W=5K.7\p4aE4j5dD%T?E^&m%YK/:q-G_=GIQe^3Qe4,g7J@R8LnS@P %@7&kn$XWYn^F*QUa\$S5DId?R*l`-@/U"&ALZe"F/Lu-E+&;[pgc'TFHJ).NY1<]WMOf5T*N/U6r@k?7N1MlnYJkQ!e&euk/P^d# %$=8ES`b*'P=oET/QF&sibf?2pK\MTtL/sX)H\J"?!?NkNMgnOA;8[]$0R^*72r0ibH"/WrQp,aV>q:nQ"B3H'_L5lh'Fcr,@3)Q@ %W)ABHk8c*<)2>fLQdJL>B!(K87\e#YdaPY1jY;ij@HCO;C>i4r.4f*]3[9R;Pd?6`YSGIB6!a:Af9TrGsm2.0W"^$lI(Ock3c\ %Va6sk#'@V@IH.Xt^`%Y3#GV/&9[GjDJ;2jZaUG;:5u5[p)-J[5;RZC>^S.nO'jAK(m?V3ZpKW$H[ent>K8Fs3q%jr]BAut'hi)Kjr^0hD)h!rHWAFO*3Uh&uIpdOgEHJG\U?-YOYlKdc9lAFcK/E,aWk.0@m9\;,=ZV;iV@r^#kUS_4EB7$MH#m!YYs %SP=>K(+N\t[L"AF&pcM8<6u0=mc@u4MHZb"QjfX7ic&MslH//m<;'bI7INjXDgXA9\j1/,,kBH^!VJHK#-^(B+ %G4['eWIBB/Wo\4mLbmWB5qPh'aIpPdiVb">m4)N3"BTsJoc[TZ(WMNHcdMQ^r1/:G %2<=NljEk_'YAemSHQ[:#bOb;Zf@q"R*WGSArA.4uP5.*d[NbS^dYGk %qt'dTUL(,[6JmNkb%Kb(?tPg/-S5f=5'"QMo6tE?4nV7^d*&`IBH@)GrW`d#kMPJgLnjk!6?1HFrJ"'"Nah81Q]ki=*LhO*MIQ%5 %%?5D0%'djFcgQF$C#:'3OC7pq@6)m>rj!=fr^_91)Q0(>A-D:S[no7MhLDJWZ`,tSjm8Dic_nt8\'XYns#Cnam_<58q2#mlPimYq %LaCC&"*ZmoFNTq>!A5RQk'b"\Ycmp?I&qC:.!S'S,/V3j)fHQ#DW:4Bh7^-?rZ92ia3qHWLJ"*o08D&""B`;W56K;]A4$*>,ol)D %^J6%6%k#CfrL_7lbXo@_!:QqPP-@3Hd^e.a=/?##s5XAA)C4j\Pc)I7@o@sT4ABilgeY+ubQ!7jcWL.LdcpN:8mM,Y3ns9jhA*6: %V'c5q)ZCKN??9I+D^jARI4)s\iqcH9G;aPM8j4#o"TITC]fc5O@Rm'*hCkT#).\;Kq2]XoVE\)MAQjSup#8sr=;U`t^J8H0#u+qP %\A+D"Y=#5^SNem&4I>:HNc#Y[`S:"'Ecl%Vb,XYj)=],$.&[npc;f/KnlD@YhQQ^pnL;ci080NEJ`Df$JHtEFL-qeOp.`j`/S3Ik %V2QO[F8A%,@Of2re9!`iPX>)@pE=X05C7tZ-@jXo=qoL!"pnl`]VBTJ*uMd*48T*1#6Tja48?]M0l" %EFZ4_E8e8Kp2YqA>AF+q[?"+eb*-qYhUuPe(XE8^mf0E)8&*!lfm]'24)^a%iS.i`Y&t*:C[>+/564m9/N_C5FoPO25556;!neoG %7XCLI+E.UjR/lVLDrB@\:RXh6B*=.J4k*"3#@mSkocR5)Q_-5Zom*MqUe@Y-(^fm9@3NP,&5f>,V&$Tg!Q1\L=O>NC'$4G1,AeDn %ZjEBa>/9mq;q9@[MlU?$FE\'6cUB]?0m`k(JPu%5>"&KZcR7TrL%88D-js.aN&##4\r>"@6,jQ3<%5)FUJg^H4Je6r*2K.r-]o2r %3=,4k+&']6KI(jGj;We$h:;F[_ufJJ6ng11ilTYGO%L"L?\0Bg*)9J3DdR`<@!8dO!+['$RnR<6hl9$Y=iV7H,1bU,XYL@9P1s.$rOpGnj[)E=X":k;[dFs_B%R;kVkUH %1^l-;hi$(Y$Pm[LlP#uM)r-%Cru"m6(tmmOk/sl^n8Zk$$(bN=AhdoEc"6*T+#s>IKc_$Np@#`<_mfA,V)S64,ZC,RSOb?$k2D9Q %m0Gl5E!Bc+D*W_8b'uh]Vo87DScrGb3DL6)1&HZOT0HQZ?J[g7p%i#e4eU7#TQi9OY6qBjYmVW>\F@[VZ%R)_OLo&Cn&LP$@B.'] %gC$,2&:-RAoYS)B&f6Qu<,j-el@/8U@&9aqs]`b]@#ceA-glR5\an:/($t@\r-:[,i_K"Z`.RQc8Dm.!*Te]c&U;J18`@Bhu\9D6mJq7kRbgcg62rX`=Au?S6GRo&5d7=q)j6kZtn8KC/b^G7M6^[eW5?Q32ep/Qm;2ar, %@do#kfW)l7.XBH?emAk?BA+X?1A0_',S<;IB+HAhgu.43+OR1>N0VE1)]!t4-J7^)GmVL6]?G'PrQY3J %ScA6pr^q*XH,f]HjUS@EGMiWsAC&Vmo2Y%pSq^Dj#$^G,*4nl8FlNilV=_[EXJMK"8^$aGU,&[[?$5&@2`X2/k;,s!Kp\39d\"2W %oCn=i^4:l#Z!TIS]fY<$IYZ7GeGWmaGTCUL'lRtW!pGQOqO0$rfY4;-1e*=XOXkn=Gj0uXo4.H.]2]*S70],tcr'*[qjbZnJe!+N`r.-P<7j%b9Bg+bg0U_G1Y@cH.VL];1=9Zt>eK+nT7 %nu=[kT1t;U#k8')h:8kkb?fS9f]#o6;D0#TAnoXrlIiGW+@`Y0Ap3S(b[bHWJA17Rc>a`SaPNrqSX5f,q:d/0e_>NluFOZToPlO0SRA2V;2+Yd6@H%4WG,^(akK]EAoVN]Zj=YpO.d%d8 %DRho=;O3VTA9Ii$`Z)_l?^UdKjS+XDhh/BK9'S]?9odrXP-;RDkBsci;`\Cd@-<\ZE7Ji9 %r9(0f_&i4DX4"eiq$i3`Kh,JAtP(ja8+E&=r4.W"Q0&1'c!-^pkd2O,qHr6Uje:3"hTWq %2o6S`'B6KUF4-Z,QrJC2$"/c]!sZ^7("98m!I2t/(8o,I^G-LsHp(sD_@PK:o9Hon-"&(54nL_^t,mUkMJP/Mq#t7gXRu4r=,:BLU/8teeF_&+?gX_A"6H<(hnqeegOD3% %(GbI[0#1ptU6sVa`PSN4HDlM"Hm'Wj>K!OIrW:TRIK5ahW"EX.=2t283$&G.[1BDFehYi=Ur%WCb=_I1:FMq7r$eZ`8$J:m814E& %5T<-?Qa,LumT=LCBd;Sb*94h(EoTL_nZ,R3<9FXroGnPAkE5WsHhTTd)WVBX@E^Y22H=l-j[Tr;GF.6P7mUiV5J(`n0OsHh(XNr\p?[l9Sp5 %4-,)@i,Og]T-lnjpId=0X?mUh%L+m\.e&Y,OlGq]_/m=lmYpr!0\0I5=gGT$/X:.J?8S,PRSW2&O*qTD>f";))tUoE1%QPrq'e]f %We=cmGo/Rk&]O55cCrfjSJi3D=6ts]+dG8QeuJ[6N>8bCt9!(=RH(8M"gjISpK3? %",KkuIk;iYD`jc$LI)(Y=nZ&RRFQ@p,F,n!>N5N&mRJb\FWUiIV4XB-Xa9jS@4r(S0pNh2SW?nZ(cKX8n(pA_RaB!kH=0D+#^]d( %b1ths"8@B)Tn@qE[G[Zr/G/)UPa@doQNha&?Q`c:k3e]:)!L;c/Y?hOYQ]p'sPeUnBG6d61\a1'FS;`#*]nlZTR]#e+bkH/&& %q!M)9$q.RD<5/M'M$ZE;kFPI=PK;G'UH1O1]TV]c2[^F5br&l77UYkX,*p7lkaf<&_8_]/A-m6\]`LZ#A'6''_<^.@X*'A?DqN"q+U2N+Y$0XP4o^]jb_rgK_DNe;EX3Ki%dtO/;]#F:cT0$!IP@%Cq+"@d6o4+!#/XO %e(a>Le?P@$BCI#/hF*hXaf&Jpngm:2=NKB%@&(V]hT0C".+_?=C-*JEp/6]1t %[-kmXA#.6?.jM^XD@B%H-d7XaUY("<#UtG?eaW.XA?=S#Dt$c:1)[&=-I-8K",&M@6JcK$Ga^70/c]U3k47fXg.7Ra'%1sAY=$I? %)P_Y2[.5sb1a@Du0TG6fap=ui45[+;c-rHdCC[,i,J=A?6W9e7d' %]__JMjH"qJ87*1\CQ&tP0<8U]D2&NBc&`:Vqt8jO1"**h5^Y30b;uFI[=Zb+INk9gJMT10_^3bS83;0VW`Eh/`T>!Y&g7^d.*^$$[ZNTNl^Co+[f2EBdHj&^" %,'U15Dr<6i<'(,Y'VUMgR_h-EP&;9=!)d7)7k,!E!ts&;F]:HNg0MgIG`7b3:@B)1N"f\DA)2X+Vn12KKToU_n7D<4mr<>q#"[c) %elaPI-[-_Pin4$D.0DK=IFi^(2nZolG`J2uQdEV1XtS+Ek08=L]>+Fjm.$AOG]_QY_UQ..H3jg-]"]FIHaW;[S]ZoZ:;leTCFuBp %.s&J6=Cg(^;qh$2ZU7OIlCi68Ed)M&5VNK7K@skcag>m-4&b<"( %`En2CZ?396rVh":m@hAPc=?c_0:Wg%-oQ=_'Gc$s"66:DRFcB7ce4oK?15[Rs5*4T4>j]#MC7lE/oRJ'mJ!CQdFJ-adb3/nkni/] %0g]@>rHI[Tp$mc\QQJ5;d!P-T^irj.#5:mp_88RDUHG*>"cd59`&GS'.\Eg`r*\j0e39=43AaAJKkBVk_@s!mZ(DHkdDmOCG&W]`HNt"mr!V#UP.M2$d[!#C'Mu-8<&Ll?mR&[(B %r-e^8s79S1luWbU7d>8+NA_Z!0h8f&]L>MV1.$i01-s(M6^0E!*5*k92+ZJ?(.bKtPW@0,:hR5*-#]5,arK@g<[C&5>LXco"2E0h$u4nLB_Y*@phS9T^NKjN`^s@0J+M %0!o+O44J88%>1j8dGo-X,;,=28+!JQ#eZ93.VjUT/6g;Yo2D4F_UDqCW&1&P''Y0iA`Wl^@DYj`ar4X#\cE^V %KVa`.7[:^(q&pGR-GqcWI;0gTH1X7dV1*W+9$ku@1dCU+DtR6X5[TCs%sTc(fU!0QF_NHWgB7D"k1O/,7mN%H"GC7Xo(e/Eo`:@U %n[G>_QE"rrn;fJiL+DF>TZbQ)b3R"g8/O17L=EO[Gm&LChbDU""B3R*[1OH4Rtr]<;;e>]t_7bj'VRJOr"fC+W4K)+nYIVBMC&@r2[7Q0UB,&AHD/S>hE=g#NDlt %Mu!#D4Z\iZ7BU0YW?l?&Fq/o-[4#r_pR!/H>>r6t\#-d\MHDpgdgf1GVPiu_SuE=CUXtqUQe.NBD\]_O3j6[K'#k'Uedj()bYTf? %038P)ra=J%7N]tAV!ABT.O]nO)jtPaXULR,/TG`/DlbfQm4:^trN^?;l9h:5AfY:aSbG3W<,*<"N%/e&7qHL+gYnQDR]mZkM1qqA %n551!Ok!8QkKKS:4k0>nC,Y1S07T??E^"b)_L1MD:M-s*[4F.CPpD,9J)69E>%"k2EH1$XJp$S^8IYf;VmHbN3jRbV&=flBc*W*!8!\q=OulG]c*@R+B]'8MR>9>FT)"AkNcDGj2IRd0?a2UahZ&]jmnB37!Z^ %ZcLm'%[BCsCra8)VXCk8]Ad3;q[,3/,eet5Ib!G]b>NbJ5ae_9Y&\Q&l;_LB7H3W3a*H;B[#oaZ($\bf^J<5`-=b0D'r,060+QWF %(#nI=69HR3Y1QkX-QUV3Q5e5i:@2acBT*@k<5qsYG3N88i+X'>`$aTpD11%jF*1*h^/*(gpt"iUsLZKI,F:*k2a1^S^%4&'W9 %bATKLSZb`1)l,EAc^DUso\f;/jBI^oS#JFS"=# %KX"8f\lP^i'42MP-b\A!,l=mc+4Eu-!ImYPIfi15fWs'iCTZ&X1)SuPf-aDc4e`neb,VDhHkc\uF.tb*k;EZaC!H-nkFe]uh\*")#l(:DN=;!7S(^Xu2&Ned(`(gm[Fo8p"oO.h$YC=Z>;US9R>J2-]]-?fNq` %+s(YCP#CCj]"CN&\STZF"r?TDI>_^'+T^EOJOQ&hoW-Nf4a7':k)2EFY&q1*KRh%NpQWf3,..'PebqQSMme3)hlUhEN,f^OcLr%@ %DDu@7(s]bXdTM,=/FHtLHsEP:XXajuNYp4N>-iWpr5#1Ce`jFNjk7TRgMY@hGJfK)J;lb9?d %D9pejrLd6S:Z#O-jk\WV6!Fgcc7Fo+*5*T+gb.B5FF3QF^aUM;b0X*F@ITCMu=NXo_B>]LAr-OEb^AQs# %E4^o:79DG]Qu'h0B0u[],^_G>$T4%M!8BQt;?dU?%^r"K*nF,$)9u\%g\CL].+2A1eL^E%jPLnBEHuE[31:;Yk<`ol3dV\5D.Z/k %>_ohALR#DH_QpKAAY\W`B_7?TF.k?jW]*^&gFurk %J,6-5`L!u5D\0.,@j/:WR$2p'fuei2P=UiogM\ZpRCF*qBZsrW/P$#uTdn/PbX&/.d_ZdB--sY1%S1RVaJNnYI-Pp^phpYjT()JM %$WY2(4HW=uh5GqNjkWW?STP+l9#]/320@CaFr'Uq2@i6gNS>gd^Oph]Q.NM,cJ%ESc&PW` %R9lObF.L#*k%f?=TD;6g[HOu$A[Ats/Ej;T/E@q1U0Zfc!#FF;I+X(ZYFKYt^8RU:3$u4S0uq"$k*:ucBeYGtXd72)m-'m,F3\Sr %402=qc/,&b$E2P.$:8jlCbs.:AN+CGAFHI*1!t;7ZZP$b>rT42DVCYClQlc"r3C1ZQkm:O0AG]c,hle;NOFFPXX+Ou@U3%URbEK> %#aAT=5j&#&JSDT$6-NLABif*R>tf-4q<61;FnQlY[lC=/JeMKk4C/dI* %fo"<.@p[f++(_SjVOiX-=*orV2[8"cmeQLn1s;LnLo5s[g.AA3kgID]*@u\ %W8k4dM(oeN9b"9/X>S[jA19#Nk*7C]!7T4C>>jh,->H\A@cg<,CCa=KBU_mnS+o^9.iY#pq74cmgG"0QWnA.A8ucct\$W*#dp!29 %!/eTIXaIcmabPk!02<#t">MMV_;7e!f-8j'Gt198eD<:B"p?En15oDddAt,u':PjmjYl2HlH4p.b[Xu=B!;+*j=jqMe;:jf0i[UA %YTnpgk>JX8jb`oD'5)c)r,pkUCAl40];et20k=GQ6S!R3l_H+567(nG=Vf'r=<7!j-mK4ENn+ejZ)=:Q/Cu)T!cjVZbb3fc&ASCCBA.5IAZ[\H^&6AC;V':&gqRgr+1+%9q6lM$c0o)>oelf!eH61;B+DQ=eXNpGY?G,Xi-*Y-rcXYnJ.*mX87 %TVhSg2m%kamtRR[J%Mh<1O/@:!k.-83!X@.fKhZjMD+6HI64Te1Pj"DQ??"NA^^fD?+lV5/O5?j7-\)5D!kLgfb:p%94B^5^Y?K8 %*Z6,V4!AJ"=R?N?]Y]Tbk^qu?H6`;s(s]QIp&rNQghaV.hVP!_=XM)Zqjf%h[o>_IV*%_oAmL4f;*t*N+6,tsSQ&!_/R7$loG#rk %\`T:30iKs2]X0UG-e3M&5jo_l@=,GH[fKtuS:!7XJ2$0Y'`JiX-d+"^hhU[KP(t.NMco#$/ %g+&ardO`Bdk%ma)#tlBEu(6.@_8_G$><_bU"8VQoHV;j[qZR[qT?\8MpRO^npoik[Zm.U;@B^X)3HQgII$6^R>nLfi6VK'';a4Z.c'Gd@o9$B!k_AD2"O` %fWCR!X,q'h_!k4M1/`P*)`f*_CfXu2$s6K]m0T>^.8iX6+#coUU@\/ma\2WNXOuprWn?]h1IkW^hLAFbY+3Pq]c(4!b`L[`OS?&0 %Di,7q=J^$cBXrFS?a]f9CpTb`HCos4^$b543MUZV%,\%ieOadsB&QcsHF@fNjOE:&Cu-D>h:H:bLn)`(^)\4[O@On&mZDmcs-=3kJ)SqUK\Wk$ciAVDF)3PUtUmWp,IWl&=L1ZV<>[6F@H7LD=pZ)l&5VPG$[mUZs'c@#CbuR3hok>IIt+!24[V?R!*%O(Y*Us[<29@Ac$4',@Y=]bM#NFSV'P;*E:K*e^@Tja1$Hs %Gj=H\*!#9L(]1LX0cUsbH$"-e31IfgiKIbe6+i+]T3#[T,tm]9U\!b%]aJIpZ9?lA,G[)[oQB/+%NGjh,/>jr!X7&QBB)ahG0,jq %E-/\H>4Q4R-*k/CbX"D*;`Ye5Up.-Y(3CHSeQtrrQSp$C=F:$1f1lVVgT2t^F/iBer1LYZC=\?)\^S:Ub*bo:r\8WZ(?XDgqQSFY %mOTiuS/'I4H7-5qrab8d].F80^''=1>MS5rQocZ5`Uib`q_?>D=r_YIUfOI2Fj(l.I9U>+Y\@,dEI>2]D9kn%"n;G?/?rR_*`B %r+`u8$&4c;DdCOBX#o$n!V.].*AoIFZT52(?9[]'If:?%db4'eFZHHU1uH71ZmlLsL>0fsZFXc8:G9gb:>!EAEj_L;q.i%=)8@-5 %CqU(=X$ns,:dMi8WjTIp:p"$kL2&a(%:ulN\bYPjq.qN&"'[F4?mqnU"*]%BK58oP.a@3"Slj=ecJJtbJ<^pdH$JI856;UEZnkrEGF=WbB+WRTd_U44(/>#'ecP[ge8S-38C?62LRuU*j:?%]In`U\*\r^@F'jfsJ"]l$KI"/Si.1XmIWtXocqF]d( %mP[t\PnWRD5IYs0'CIEaEI>d^/h.t=d#LlDZV_gb-fs`k0$3I=]u-!s_,jVXe^3Ks`R`7b-nl^?:Bh=Z;g]oSs3-Z\-+u"GL`8ZAuojiL%@r:;+&)ohJ',18]i7lIub) %HDXs_r=:km*69mi=n %r>W2'$^PE5DL^GOGE/R`7odn/(9MHLL+-EYZW3!cU:j5oG`N^#ULe%iZ7)6mh\5i@;l#@k>Il^ZlLL*Zf[No1 %HDDW`a4s+h.\tcJ0l`cmbuM:^rBYYLa7%$18aYE,hm>47>^io37+=9k7iVGFr1blR-h:1ee6 %f@sJ?;#mJCoAo%6Bm)QpV1#S.jCtV-c;"',nEXoD[-NlU1_')r1!uQ\d_bfjX&;4S4Rnm:@^/_05l.gu2ca^sU=5CHlZQBQ?D_]g %QSW^UN72hq`CfIHE6C?Pm<';Z@.2gXg3TR2?M3aQE8\cYP!X/hJIH1#8^h %DLAIfRdKH!XN0\W_K=h]?,akpd_QEW_1LpC3O5+3jS1bFYqF7-G%HoD_\BF<+%dPN-tCA=8/MR44.( %akl[Y3Dd5tG)_cXo;9XLdOqZQ^\CP.VXHNai/OeL['EJAMc)gB]f.M(e@k%f]G,<8rb:XKHmeZNSI*2^<&a8a"YAf/?eXdK$XgDu %s/n^Dg[fi`%l1jlMC!F;Z(rhQQ#bh`mnhDu9r\2aec=uZFDjtujrj;lDq-ND@9[pAW!3fQJ+G-T4o``@!*)*[2lHebY2NJc(Yc/$ %:a[`i&a&@B=>LG(F.s_LfVVZ!)O=LT!3XgRR?D'L'D55R(R%U"h)Qqo2EB<+([m)FkPFSAP&"_!L>)'# %5OHhiKhWNQ[P^2!cT3Re:h-o\\UHT=e=Gm6l+X)-. %AX:W,kEddHos5^nlM6^7Sa0p:Wo$8nJ/FgBB0@Bt*NJFtlY"9claN=$E3>i+N\clC6#3I[[/A"PpdjN>D0<"RogFR:H$4/0TCo14 %CVGABoNXWH:tK4oo\/L))=X.Pk=bDU]NR%2Q?;R>nqWUaff_A^deST9j;uPoD %V2`YsUiZL9NLaC".oJ;jf2#>[[;r;)b'U9L4P.oJJFl7JHWEpfp&L-"?K%[d0LMBC3g)ReQ3qos6j4D`:[1G5F(#hVF^fB>*0'haOd6\UN,-qJC3nh\qt@XNok\qIM_YWI?oh %O3]_MG4>3[eT:]?3JpUF@CA8LDl))QF/kj;0sp&QI^429T'EdVH*3d)S+H1Unbu;/p"MpkX8TSXcK\`F4kEJaip^dV %c-GudDpO]b\UL"a_ontSC!K4LY:?Y[o43!DT>b$[eiMF/`/[E,^re4:iOOEg)kC#M8fOAfB3$(?[%j#[R\u\5R9"3RY2=PFjeh5; %BaiV9WIEUg*`SctB.X]JLIkgaF8`0\6[9ttbB*W`$Y#A=H+S.rXAALFnAdFJf?_SG,!O4'cLl8D_eaP"T9b];;uJ8JCY(Ptc['W9 %WT&#IY+PCJ+F-RmWA;%?4Z&<;>pf0[lAcD2H_h>[fhm^Pql8-u?H"a$BBtQOg9O/<*D;-*[&Z-@)R]>>W`*6V0Zs]Qi%b=:!gQV1 %]Ce7A:dpblru>-e+u.tD1ssAccpj#*.)tF=:[h#iN^^Uk_o0G]WgMd4oC'$lhbuf^8o7+QM9juJH,S]*")VN;a4?uc-Xl$/G)nDLu+HT-]3`_ce`at %NHpqEn"[ZsUN[g&L+`E"^OtDJdXCS;(WFj.dh@,2??kJ+X)[@%QRjflF.-`pgBW;/mS>L(lIG"*-k9#tipo2"S,:'h>r6M]<,%d# %X+X5'Qd:I6*aJEY<:86(ir&+i+)0ie^sF2qI)5KPq>#Vl&rI.WUj14Q>iF,T.>9hS@W]-#3+PXB(r(moYcX7IGhnD_3D*;e@+/ %*DY'I(C8;CSub&=rpC0!7?A$kPMK??'!E&.g;S?roBu=X=Q;Rt6eTu2WK99Ql'Gc'pM5#LnPVGJ+_m!<48EfD8o&f(k5s3W9$GLkq_%@DY-pNY876HVk3;g@fq:%Yg?Q.N-$O!lYLFpbN`'J)[pqh>G*C %!f#_;Lk@D\Q8gifrXdogcZSCAXmf=MC3W/1G?s%P0JiNdDZnTLb20:K"77(/h7@+nnu\ke`n/>1I"P;PL`Dq5di4VS4ArWAf^$W1 %6Fa;D9:Ar>U-8=JQa=53@9S:Fj[6Bl3+=G*Dk@*^bRCDCi"TM*4e3E %\bob(ZC$+.qai>>M?f_V*_DOLcgg#`ZnX5b+!*T[6&Pu6r=L?m6Wdc&S?JJ+TC@EQH(9@F@u19V]rMkH#*R2kn)DdGjmsElqfjF6 %H!csAdEJJfRQ['a<:EoslC>Qc0X;HIenef(]T,1u.fdX?2r3Fea1,K!Bo5c3\4T?_$$(0oV=g:!f4*HXl2FJM?s+*4dUPK/( %q"&'Wm`%SYqo9U!jbpL@3Q:jb0q7r+9_^Ca,eDmdCF(]G']":6QFHt,O,L-&:[nQDqn5P=FO3]''BAn6Q[:VaNdt\cOebDE5W@?" %mlQ9r32"h#liQ9rlQNg^YL'7)k[V>cm>i@KlFU!:o&\2,9WD;]-2&IR^9?*J"5h&QP8j"c'\6!IHnU,9gqn]u_5$43jm%n16r/%VNdr)@cM>TaMW?!#gi:s[U!c[iGNiF[DnT37Q7LJ4;Y7q!5RWf0LW<#jXX=5bBU'[fs7iVU-)nq9K1m/)j(p8S>\#=[+-=6k0Kj0&J]3+hs,%up"qP9iJ*Ar) %nnJY.`_L53819cp?]Ck5rV2OE8GA@X>bF*)O7l%CnK1_mi)r`q0aYY4T]<'f+p?%arAR?%BLG4@jI],!2`1p$?e7%>T%#$Yn(aQd %M>9U>c]/:%j%G(3MU3TW`:/"61Jj`NJ?_;(=q_#kF&e+2BqZSI\^IW$Z7c-arX!7?3f&6"WQ.4qG[EDO$/anDn>JuN%_Hg6pa %(Kkq8WnoMJCJB.>o(u+X/?>'kBhEJ4R.e=c^CFhVrB9%u3UMqhG?$D1$"C3q7U>Q;ki)e96dphPSol-2N*3,P\%AWZ;ZP^L,%DRD %(cc$&jc%uc/@NrN!:[JQG"-@ns3uN^mI+g%%/u'DSPRf6UqSU[ID6G8OdX%[OMRNV*&>:.6E8>ImgBGnI4&kE$DV]$cJ_0eW/Lq< %E_U#C-HDZ757VPWH4]X;CI&qKUGYg=Eo:,'qQh/1N`n"a5Gj8#%\Y4Xpdi;Mh)pVBk\_9&_P^uj %MOOTt7hG%L%>3GJ(-_TYcc8$%6a@e-SDJk4M`DV6L^%OqkR@%qYa!fc$#08dMQnF!R7-1Nn.tdMIriJ,Bq3l&W+/lH3Y\i.:bM\j %3P`1^XUf%ZarR6BEI#+,P?bYCGBiaWr_D'X`S9D5!==ATbg>kZI=/q`#CS-qmhla1Nc*L4Wk %'7gV=ap`cK4Ct2-'s$O+fm#nQTR%6hj25B;$t0gHADmK3hNcAs;XR4.PBOuaQK*O@,n@\E'6i)OjGF\u=S?X\T*jRcE'*iu"[DB+ %Ig;0k46MV=>NN2t9SsqaVYu&b^Oma'O]I1_"MZ4^$+#>Z,BS*2M>te#8%&;bP7IW7[.>aRa)aTj;*.(%7PNkL6M]$6-ZJmGon:)8 %E9lO?l3T%`/Pl0$OnV82M`AYdD8W2O72NH]me>s*nf^]U%gf+OOA!fiFGo,2ja!PkS`_f:j+jQeI7i?t`0VhU^V^_g[p[sr\j4oh %R]_:*!TFk0(n?&[,=AjYnTb=u3-Tk7=C_gLpm:ksrj&UoEejTb>,]8BQs5NeU8dWhnP?j9Ch=tU:o4:6b8IG$.1BW_pZbS %a$pNh/7Wd>CbYEp"fksP/H'R!+Tc8q+R %V@ETdO+PnqZ(a9+.A=SQPUV'mjctN6NWFknk$%@s3YV! %0fH\5KTu."<4r[VU@Ai)81J$57.rLr<=N[>K$,)a49R`fM#e!LP[2lo0H^mH_Z^7MgFBF=G+H$4#2&)P7[Y,?66Qrh]\r[>OrtW@ %8:Z"B;CsRFT:/BX.1oeQUXk'NQFBWAb!hW;omP#&moPHCC]3NR%i=8Aup)r3!bZYCI3WNj6\F81eNHV'62.-jnYD6;5 %a=`)!oqC^]dCj]a&.Z7eL)ZhjK0HfX(;74f,MT<q4FZ5 %3*$'ZV=;APmEglO%s>M(?BA&#c[-:9ab2(cQka&0Dc%n[2=A-%d%;c8ASV67aeC*A5g]?q:On %1GSQ^=]sD^WseGo^?SV0"1EO=QZp5OC3RIF0p&kj?:Jq)J5h^U_):EnP3GW*7%La7)t`=$)Ktj*KID1!"fB=%`9VP"98(@U>RR7IaS]Q[-OpALh]tBA?pkM\2\:,gQPgkOPW0:tbYiO<'>&U4dD[3*gGN %U"MUZNNZLkiQ\'\OW_b8G&VH7o`AL6G*iT7QceMYjh'h2^O,?SMLg?3Ee'2"(7[GnQ2*^qk#\ %3#4%g#RG`Eb=^oQ#u/n-^JCu>W\5IW#`t7*L_)RFdsLPteob!c;gd.\_>_9cqg=E<4JuBMQO<#uIsCf=gHNZM4b*D.dnd^UdpIM" %h4O`8ot0+0oD>`*rSdRu5l0#F`l!ODV;jq;DLYA@nRP/NrpAE$GApMn_SkBPHES)Bt)Qga')Mb`$0.GEGr:ZOk5VZ==l3_tY4_lL@k^\<1`+,A*;.@"E2FUh;13`KF+%h\,8X'@@E %fWfK3XLg>bV/[Erm.Ri2KDT%D%X'>+qO3A%NGfp=`!n]ml_VOd&So3[j7e;AT\,dB31X)e4-O:"Q]/q:0l/c;CruqISSWRLYS1#Q %%Y>]1RhIlP[bdj6Qd?,;1"faKRVd3=YTDNd\0s-NGM`\VGS$SCmhp*$hhArDmsqVgg?"+cg0]$FcF(Vp:rXg!W0f;It(V#uKeO%4k %D-4Jd9-u2>f$Y&VfuV`uCs3fM^kTl4gRiNGB$[ntG(rpM*aiWBYA#l`WG:cPG(-JKE2cm?2&]nF`h8r&O#E=fF6Ce_>NE[8B]L\> %:%%W\%`8P=q]R<`T"VHXD-?:hPgLg7/lWd@;eKI?i7(lg>`E5?Ru7^#R;h`JX@p!. %`lEg?dg*F*`cPW;aTUE"TA)4E1WL[F^m!8I^5A)0$JaHig92$&U %"!`7>XiqPP$`:FQ%6F97M/ZC7MC(GNX2=%Y2m$(/]qA<[BMJ)-Vk(Nf)4V5\)stj:`CPmt'FB,b,5,[t+/#9W\h\&Z4O#ua`\=pn %+.aZY8u;e;P0#1-8m?"'<5Y.B.7<.\Qopk(&?)ba4ESfFak6e;HMqUI!FP[%C14Eq-M'7W&E"e+nE`QcVBXP=NKbQqmF5!f@03r? %U)hG2];Dla@n/5O1a_n<9KafdWIleYdjEG[Ke<+brY1j,&"=&=K+2[V`L-4HkGnIm;\.Tep6b8fV'\"WZ;.Y$E\"VBTj+%[>ca9-h%7@ %,6Pr5#c$XWil"1L2(#7h32Pl,.+/ERFYFFW_Zebgq"G]7fA-d+T(dd3 %^?L+?6S2gM"k$FT4d?qgFtM:GApbjo*E0,9WL$FA_anT4fkoJ/1*=tS)^nTa9ep'@UQH3aU=_P_>+'V[`nHjJT\X18*'D"CEmC)TNr2%f"qOG-4%"pq$^VUj.=cEBDnUDkD:s/D<>a %V46&`$u8PDW>AQt$Epa2g'1(]3fZe4fsoNtL+TpAZ2Rj"`"'H4[W49[S4>N@/Ri>t-e&X:)kXRgA@#l4fLNN57I=*fbkMSoeWrF- %^+g>NJg33K+`g9haP\WaT6Lb[#'d?m[=l8U,0MW1'`iM!:i.=LBY;'":3m&8[Un_1Vq8@GS3njZC`b`G`pm=c9_Ak@R;s<^ftq6L %a)&5:LI*Q9,[8O52a`l&R*ZX'Q_@@bO%Bfl973i(T^$!efeI3*J3_arTe`@aE&-.Kdtcp!TX5 %'ShH1I*[B.R]5HoEG]bd?Ki32[HeQ&/tEe$=k'>qJm&-:nUk=f[c&qD%5r1RM6pH<265,$()If?b)u5d60!:-?p54f5Lh-1/1(mH4I`jE#-7-/"%21;6tAc %Wo0\(!fh+rTadB\5bSOn'Z#I:(X%PSL5ZEG'uX-*;_4i*OnkN(]m;)73KWF1P3#)LZ7ZRrV@3-*'Eb406N7WS5_p$E]MrUhd%d*4 %UC3BNM,2Ub0Gjg %Vf<#'!uA_-@dfMU+M6'm@BIN,&d1;ENd`U&NIYdK*#HbH9Wp$JlgR%PU(F'T`TL6SE0_YWq^I[QSq[FUhs&ag7BB6'8I&=O5T %8ho:ZYF/!Z@BMN?"0g5eG!1jd"S]8pTOpIdF]8hmL/b4ZcSHPofG,&`5jW.YjH?';'2*B[C^33W.P?V3VI?XkBF8XDReDJjG(8`,qq7';hZj]7Of5adQp1aoIB`V(.U %KCA808K7cB%N4CmFC6Ru5/fCG:^kH>\T&`4^ONgS89TbEqua1]kRc(%n;om(-.?qb`c.cc(Tbg>@[F6*$VRo!:i$Y:.K,#+a('OB %c?5(Q5Q0[W*!pcKZX#aX_#m!RDN>]b''Xs_=`*;ZF*5b2r%"b^jP]8&s+7q$ch6#Q.AA\sm9mt=cF*pk$V//I6aAS&]@,PRU<6NB %n5-T^$=+XZaF=qNac!nRTpTI6hDk!FN?i(,46s"E7!$9P%bYDpKjYo0@MCgc6a?SKt8-^ %juko_O_2"_s7AQRHtF(ikL@RAh;6jXd]&+!u/7=MWS6fEF^lp#TMroSWP@B@p8mKC%4Q6?D&\'PVo,KFAG %mRN*8*X9+/IeP@bX)5H6(T\!-QuJ=A;-I>Mo=KGE!LjU+q4=c7n;.WgC(R%Lg9a[.iNlpV#V%0]Gf%TJ&C=qt,5a2jpO`E8VD*sL %-uh3I1cTsBJY%LrYSVV^Q67h`)"NrE6;n:i$1:*aMb%.qi#%0!5/=.l9Z/!GQC1n(VE:!O2L8,H#]P(uR2h4#_q"%!#%FOXdnGHC %p7b+P(8kY%%,IoqSjMbdJ7;mDKn^9.HR]\mDGU`Qq?ah#h"@%h*9!EIFFJgE;#EZaWDjf#KVN$26K0]S@-f7R*_Em+_2$Eq/d]H" %Ui4&*'r!h[d)tnH3i1[MDs&:]@h^>aA4TM/S5CVl,fkQGMF>-5kWnke'`rVV&/DD[84?p>iE"$b11Z77377]mPj]J=?l)S5 %[(PTk%\"\p24m^P^'0_XeVp6p<"D&A=l0%o/FlD@_H%n>[L7BH.@g3@3!e2@j;>MB&[\)Y7i8I`R-N:L]D5:b!!gI<*!9NuG;& %jS\L:@HnP+K-)!qKm-0TmXjXH]P?)Y"1j'C`JhpsbeUa(JPhd7a/V8gQ?Cc`X1>o`eu;p53#^[lI^7)*nS3o9o-TulP][l`p\qcg %Ba5rFKA/"p>s2I4&pBAEN^s,#6'[=ZQ_q2[\-\./Kc]jENNhU`MZ)L_'b!P74qJZg^Or[Ebk(QK;<[X!\=_]-\(Fj)6\ZfD+c"\2 %'A8Bp[?kHKIDPV6Hn>$or+&+]^lZ,/a6kR"f<]k\N)\fY'RXNKV$3Jn;Nu#LQg+A+]7*>dZ*EKY_(']BT\s@+KV46WMMN-LO?dc: %X^,L+"d0B$#$Q)6"U#PC>K'dpc]7$o41aoMdhE<">+A#2Im=$VBhpZimlQMaj4rV %0p_*[1&DGb]#FOIEuO8XK+]4;6t;GugHq?2SDat_u0nq"BPcq %Fq/3?!RX#+BY1$0j:&6I%^cu]>".=P@piLbfYqgi]?s3^(r?jRadP*LBub+u6_jH/0S,#)0$5m9)\)uK6i[Y>(ucqNj6BIH3aCQaACBZ'?JW`V1Du*FpqGWp2I0WP1L(cApr!GXmi+q&o-BKc:[pQk#S`^_K)!KQ)/>/JO>Bb=5X#_uFLm)9qrtAlC1pZ>o %\(,bYWCRng$*.fY:lZesiJd?[g0S.t_+Z:ZiU4j^.+Ud*($;M:UcS-klLn%mb7p*de(#*4/qWZs/=:EX]\D=SHQ,ZMH[81"fTfQi %A'XdN9CbmmqXf5]*&P<+Pr]g+6rh7C=FJq3"f+TF4!TqZcG*R^R="s@5fLB_B1/M^-N[5*DanQk,d*;J_7%jXB62&,uoCr2=n %mQ)&,gBns?LZSk-^8Y"]lbY12HUTF?O>2@UFiQ#+3=n=>q1O)J$<4-Da<&4BVBc%,n-4kU-cGV0*hZ3eu6hNJ!XB/";\ao-C&.,#6I_jNhCGfanGAp7f$^'sS=s)89&:1eRB"B[_&ABP&j2,l, %(7Ycl9t>"e'--K9?E-`T_soa-j\kb-4#4*A?8t9lcbZ)DBEIhK5,KtmcRIQ&o^1.o`_3ZX[p5Q"UcpQIa_lSH5Ee\;nHi!7+DEI^ %=\j;Bi'=qh=1bktS+cQDQ!N^I&^$R:qV%AW4/.5lC;">?UQe9+O8&%90h;CT#d4ZF\gcCB2OO]Z`=^g,.h!d56I:C%^i[m?=;f-J %[4e1K''qBZOGA&fS05DYL$'R3BFt>k?UnC"46-J2\(!MSKrgK($NSK]bHscX&mjbU(?h`dYh1!Xb&k(I02ib0gH1 %T\'6qV?(:c!4P=H[/j5%_p_&,b@Df)]4q#^!%\m`s"'/ulNGi[)Ve+n!M^3A6$ru_C`2el@NoXa3*c^=GEgB.\Vj+GN<9s?aJR4Z %I-=tpPd>TeaQ\G--tI9tfEh\[#h^AXRt=d$Th+Er=p7-FGS0lN3?^H(0#9%!AcVD$nE!sFYREf`*"o>6.Sn1FdTkq3c%+FOYqkg@ %6PnN*@Uki:7=5(-1T+iW-U;:"3PCK'D9Sr8)CJ,H^mq-hOG$)'.j0 %R1?R:M:9l3hW*?)HObLq=Nf7;f&*aiI0COie0;J'-3Xrt?\%Y8d\<*sPYMYG/is/YG'#s0m;rVT\;qJ-gpFO<\=s7/5aM`")MG;e %6pN4W;?S4=VL"V&7AE`7\m3L2EDsCEJST2+gnT!!AdKm#G.3&)6AoX^bEFHlesQSu"!4cZd!Z9B8,tAhMH[\MVaYl5bY:``VX[+9 %_2ofpk]?B\OJu:#S_5B(M4#-qOQV!PVrtTT>BNds+8'NuPmd_O!qK4@!kblQahha-_Qg1E/_j1/DqeqY(M-hsluk&JVV)SknL)^# %0QD/Rk]5XM:oFl9W&[bW^AJL0;%J1BWW@jH;k[s+b@_`Ft=CBrJ`iCA]rd<0o/mR%)d%Aj<37n&tDU-d?"pK!JneR^OmV__mZa\Yodf7.#M[,1F7-&AnHb0VDlu:7_T,g64PH/2GhmBHI,<4W>F#9Oki37J' %9V9pM;KJe\IY6>\5Vm6!"%[^dL6)Oc;\Kh?V9dI"_mgm#n1bF3=g6Y; %WFs7!SkC+BgV_b[H`k18g=t/X-i(br#'7Snl,/I6%f.(Vns:1XB4SkCP=BNm@Y0+C-k-DD;HuHr!-B8dM>fl?R3IX^"d'-&5!:I< %aD"!R^VYATB'OZ*O,esiHCjEOaW9jT(e:k"%36>+(XImR`A.C6?B&]CTK[f#LfMqI?l&?sL/0L.8O4>d(+t3u;679Qo\r]mH7g,0 %KEW28]LdDpZ9$S2"L"ARK;"cjoFE-_`&V:fYp@'\`*fRN]WPLW]p %TW\=['-E0A0`99lLNrWI:\JBb=O5G?Z[pQn!oBgI4Y*$m'Dk#6@rS+Nj %HMd$3^AIVJs4a,nroo2Fr7/RV"oGo]r8ua0qNE;K56(6k^\R"6^Ad[>Il3?Oqd7)7iU,qa:N%:PC#efgIY42QrhuB,&q'l5R=fG( %5Q0:,YQ"Oc5NI%*&ZoMdlt>3D91)f@-H#=ER\YIu %,EiCd%Ob^XE[/9_ouuo=%eCeHg2F,"!!$hT.,On5:PVuJ*2V!eP%(D`1"#+2&R\]seF2ec#,nG*P,c3no'J6^]4=/(S:u\4=DZ0L %"DBSA;ja4p\=.bAC)G"8oX4,"(.N"/jSK,;s1ZT;fTPb3RHkXU@H*f:Wu`V.LQr %^u?M](dh_N*>A_7?9(,.h_;n=7:Qr7T,V\J)5YN;d?-2BVn*QQd$PjV8k"u2'LM@OJ?>dm$D&1D-XAE?:E5kd!bOPg^1X:$NBh+D9`-8+`;(JKcL@K:@C:@`q=r_/Og(;A=1E\0T#hgU6QsYiakE1<^5;L)j@D08'a6hDX:,,bq/B/ng%lP`L5jYA0fZ(VC;fKq>fJ^.&==*E@Onm1H@#M^0\7A)%B"%_LM %cT)IK,bdXkOl]J'],oagi'1&n,79kaTT^R5&/quL9Z>(O$C>Gs`+PJ/AWiN@i=eLe=r.E9s6'8,UL*@t2"W6o\fZB#TQJ>8A:^TmDC(P6d=tsQh(7%A$;*OAF*)K4ug0B"^`"0\T %@?=kME(]Y*nu[aS7''>m\dWHh+HYiIm(j?)M[.Jm3E+-`4>EMV5Qh6?"IV%Zi_e)'QiStMb5?2)QoI>X"qO8jrZ:PZU:1W/.\_mB %2U)a=.9rk[G??1XJS8OqbXU)l6d3opfq8lg$5V4WIm^f?KTRY0X-Z=G_R9RE)8RIMXMV)KUTK=aoh %-+]uo5^/'q/huX;%og@o+\eW\ep=8iets[KelnLb_.eWX-QN6PUH9u`G_qd>8b],fE@H$'5<_MCe8&*H/X9n^p\s4 %L.;OenX>J7.?M[b4@P]jWP+0*Cl3?O&jALdZH8oF`oUX/_sm.&c9rgd)=BX;@MIh+#7Ad)?kuj3^b$WVPYlbPC!e(ja9M&p>sW02 %pg,H"n:A^H>`:_.bR0g"*HG(-n$\5X>ot*u:`-;kd:/`),E!"-*b23tP@<4A@B?h4V23QW$?LPjKRs!VV&$Q&DWP'8U^E,H/)_Ur %R^d-D0#PeeX]6,3\nI0G+mV/]h1:E1pGOEV`Q1&T6`aDD<8/VR;[f=0kc)!'KWl$o-I68t1'o(MkLY5nu_#@N(RKo=9`?k;=c6j?m\M"0DF':=a[ %d:d8#%ET,hh%,H26f@PEKAA*o5\VS/.uR"NMADD$0W,Y1BP;-Li)uaFjhdS2"J0[E"asdX*Up=5:7pB9Qk-\#JSB_A"=\(LOi5[I %i4r=iU$j3Y$&SeA,qfq_.7cElIX"Yhj9?U]"Q]VKAU7&>3<^"^]%Y\j`A0\dL'K-TR7\#MT%mML('#;Y8FCh">u2@@'LgU`V+P+' %h$=$TWOZ\\2m#+.(EBEd<\`.("[>9h4AZCPS'n]f=YZ:)VPI,:&BXn2q0fLF^cMl=&,SE2moC%$R\IbEAoe/c"upS#DjgYt'\%o< %8g390`9C?b\feVU-I:J@Ca=c*'E^/.J2`#;ftAf8;[*SO1&+6WMhPQXR8Q>b8;@bX8"P2!:<#[UHC8tBB&k9fhf)5+P"pj#t@S8(5d8h*=hDcYLi&YoqU-2 %P3n3k1f^rTOuuF@'&%E*5=Ig?'LsK@12i8,EI.pVcm]'DZ?!`2j.\koeX^\]h7ZWd4etFoiaR5ZC"6?4Je-or@*oC?,)%D+k71q0 %nJmc2=1\as6H>K]\QqRVjuN4QV7je=AdH*s:IE+c-e`-GZ-<6DVfbk$\4dn>eZ)2d_2IN["-A@1i>+@:(g\s/IHo%TSIQf1^Cr.d %S:]s[0o$o1+'^T,+!D3V*(lQ!muQ_ahGK.sScEttIj0l,aQ;f#.QIL_5GD!k]cHI]6+W/V$"ikdY'H^$d=cCQ;;%X]UeNnhNO7.R %),4lsbma7M\ERENUa/b$'#6*-Mc+od"75,d".F4KMj,?'7EjCdn6i0'Wh`>D8etc$W)@rM-!J;@ipRET<@LWA>ElIW7hB0W?'aF_L_@KMa"loJJ>')u9-%IC9b()`1&h"1X %B.=uYR8?D:;.dBSM=5M>)&/D17.f?NL-6`KMhEmT-ZDmW2.C0^4I1Y;U%IQILP!R((V2W/Wr(%,l(/,*;]QStgiOkmS(8-Ek:E.3 %0U9UMdK"GU'H&;em,GRQ'Pn8_GtsKT0VTEm""ouF,u#.=TGQrAh5HjUV@jf?Yf=mU8a?ugeamWDTal[Y#B@"c)+mI(YOn34oK]B2 %cN1!5jA&`&(^Rf07:F3A-B^C>TJ7%<$c%E:.(b?*NU1f#Q?2bPesiS7GgWWPm[OpG0.t<*fj?fAm\1t>*Ue11%E)eC$B?,AM,0q@ %*[CɲTfQ!oAC2i1jW&X9F*Kn['Z6"-QiZ4FSie3\SZ/;A;rW;huHc&kbXiY;7YWYa7ZkE8egjhe5(8bPOjSuJmQ!+RgEof6'U!f[l;Ys__J$\Bf2q::nl %_TU>Z`D#s)bUC&u>&n:jC,0!2maE(RS1)_uo0m-%bao:(heP/P4VVL50GENSK"'.b:'6GKM&!Uf;bYD/=uSS-e.TR4Cbec2<8cUE?kr]nRt]=qrYGT=FH9Pob9jO9/c_Lo87UpqmgT*'.cPh03hnMkt3^c"VM/t$MKnTktj.26OEQJoBe %X=5^PaA@]cNAR5Jc9^t]+2mVeO0O`'U"J:V[XXsl5YDLS %`ZmV'"d2eh"+_F.YL/PiBhh&41@iH%h,RQteIM1iP@HVTU8Nm27[Ml_Lga<+aDsghMKnD+=V_J:!$BmL.$`KGmr-')cfqSmS\?sp %fQSksJ7M]X?^8@c@&ud9jY(.9G/.uoVT[hu5aFtcl3eATP9H#MU^^YV>Ye0unrfN7Q1Jn9rnaLu$$j6VcF^#ikq%6eZ7+=G.\9\R %_ZD5>/KoG&L-gN=Kg`=3kd=t2?_8+!"%4/?o#F-.`+ednNp;SP'cI\>OI+YfF=m-'q?:mejmmT5ffY$Q,B)AI`;-jo)Xfa %<2,?s7h=\.E8);EF=!aHN@`be*8koFBQRa0.Mua%.3RR@6u2sQ,[#SKSu"@gZOh1DT/^WZ&>S"Ar[,6&@U=S]-BFC_gT30fhp'/YgIO:_a"[9qilS %1!!@WCY4p_e_@X(@'tRc/iJGH5%7?^Msrj64JnTMWb-ZXlIl:`F>#2+f=6$$0u2_8-BKL3hWnASr_Y<>&;Dek/0g\$2heoC/I8,H %):?'^:RengP[-!1PtA40;HU;!m7j15#g6:@S]gG',*XPs+\[gbqADT2F.udiDp&)TU%ml/g#:@Nd.P]F,\2AEY0f$^-lVE8?)!d1 %L7,NZOF/.RD`lJ'Q-iQg8i2eSDI,`H":p*YrVU+4n:[>-jT$Z$nSfZIM=V8)$P(FlcX28GXip>)^nL>=@/oA4,6hQpG^^=eqm:CqYT;ai+;P\Pdi,caM?%s@,n*hlG"TTF]4ljd. %baV)U(&NAi/t-P#S5sVie;J&d+9@0$^Nf#UZDFE'I*dT0$<[$Q4d(2TYl>+/(>ZgtNjeh/o@/!#VD %YuiT8bC-=tVfYk;QQ,sD*PDW@Gl%mg3"2PV[YH*2&^C@p@t@i+B9f.K-Ats+#;WIjl;=C*0PS-NUI>n=M@`m#Wq9O<8lq,doJl/, %g253*hFM.B2IWi-Z_)s/=UZ3/9!`aBMi]4V+hfqM5cWLB:du:>oEbWTb>Ykup(Xf`kBq*A]MhX_]L5aZ\gc42?^V@\?nXMJpHD3p %8qA(%0+uto4b2\f#lnid8-L63eq(JAAo5>Fj442V3]d[@%qHGsoQfH!]NRa0,h\K\P>FK+tW&W23u9\+_s7DHp> %OA7YRa@`:f(=$1:#o!X5-n@3cIRjFU>dj^kJ@"%L>X5XTQ&`4s*7X>J5jjQgd0&&1=?9k'SV$$DdnY7'<07udA)1_td-'*VXG1=Wp+0gK0\R*o%F)+J>MfjHD0eJJ0JIS@hi:$HSLH1 %![PfQ8AKfgUcI3=,N?C`?#e[A_Phh>1QT-: %Ueq\@*R1]VW^JrD.fJQ]:rQ^,Bm2n;?l4LElrGN=U(_4P]J!80^Bd_0,s#1@!:D&<+k(Arg+h %I]f,@C?X'KU0t54(:E^h+ZDUtXZ\8FqUcOb]AL'8K1%@TMda05,,F'FRC+Jg%NbB$mT+;&Xi$I<+pBdqpW:9n$_TKom,Opb8Z.@n %[FMJRJD-dPI%\#](*-f0(LW;<)m.n[]J(K>1koL+TT9FT5CO=]fV@6Po"pM9b_s*Tf`;,D&[[8d&)AN&L6S6G%F+Fm>rUU0M?$_6 %>4o_;&._2o9O0g$3#NHaY)*j"+>CiO82UJMpPp::9_\*rP^E %?7"&lO@?O@OB6=08*q]B#)'Y+QV7Fl.!]UJLR(mRJeT!K!8^21:P.2B_05#kqK%PZ_(DA?-Xl,e"BC2+J(ee$Fs]Pj>^#<1=Y6"d@9Gk %0@>IJZH>F#O3K>ji'm0.[n>\CZsn36PS\_[/9&JKE(d7h;oDPWEW"\\+J5`5iFfhBgOP&nfS/,(2QDZLGesS %VCNIQ!hT=B=$XIZ-oVcj&LE.#*/A#$#$."^\5%AqNAZMN9sa""'29#P0^>,8J8+t7!gXg'UANLAVI+.)flbigk7^B8W#,t?RHmIO %m4&T?A%fH`9fVdglij;D*X`]4"1jsge<:\?*WdHH@U4a'?1Y5eT&rEkT\eM#8,gL(>1Yd\D:L,:IKp5o,(dF^M=h"SG_hW8dnsOl %/"mJE)FBfmD?[L&r=4bViEE3LHi)%Ph'N*(^NueBZ1sNiM?>S3#0`X2r6Yn)NVI"P_`Q2N0]H\*1A>[0d_C"4PNbe(!Y=+]@6Dg5 %#`D.W"s\M?f`G$mphsIfk>as\F@MbSCb3u\j9eosR^T@m7eN4GV+302@N;BoNKrhDW0.36HOpoolX#`=2]%QQVi7TamZPq%gP[?P7&M) %ZY0;Ued+mpR5iERf4Wq?EDZAN'f$Kt/[k?Q&8+_RHi_/gG]6,lia&&#[D<"X#AHQ8'd#k9_f>jt0?OKTU[k(NRKjsad?]7i'["2p %&-mmq()K6+<=FM$56ebSGAb/V5lBF@5:D>t(J#.=%1ich?#gl,ILTfi`&RiR+<2NL=UK2+W=EtZ.mC3-iLlG>]U"G-6Mghf3^+PL %`nKDg5TD;WH7K@GcDln9?I3VN^5WAJG[B"E?EO'\/'+qbak?#h63i<&7SI1N!Jn)5,M`_4+:_QnNrX1LNV'H+]>;jPTTT<@$;C(U %56Ac+]/&4CEUI5cRp5r5ei6p&=_TpE("jN^AP\B3tZ/bU\J?"VB"YZ]rT9&8/Dhp&GZe4]>.iOS:7s%6gJ4$('h9cehCTO+tBF&8ZL9G7r0!\'-;!;gW[!TbZ:^Kl\QP0nG[*t_ViupYkAP_E\4c]d6 %Sn$sR&0Thog>VQ5<_Sdp/8so&S7otfm9iIW.T^VA+hRh>pP3,^p/l9]Lj]+c;e>-r$AK,U(@smIKU63AI%hdo,pIWie;J7+'q@J8 %OP"[llA:6,"?ak=pL<*-\L=X4r@J!BBpFCO3RJDf=q&^K(U&iLLO)HX=T?'@_%9Yr>dtf8L&d<$-?;OBii7^FB*o>nm2ZXmIUh^b %%Dh-R65Zn>86c=CG;s,?OE-%BE2SB'GJYN=&Jks.-l`9o88tAb[Mgegn)GQ2Jt8MU)RWT(@bLV1p53:KE(KWNa:f'"\XlQYh%Wpb %O"29'j"^L%6s4)'pZsnR>0,oM#]2bd/3Lo[#9h^U+-cY*"8Y,Fm5f`-ec?uX!2 %XJcC\+P^F0;%Z.=*U'8s#WT:%ZR+C:GI58a!jF_']=acs2p3<.nn]'.]Ab%'V"$o+i9$KlC$o=-%(-"qS<\rA.4^:pjK-nsUh9.& %/5L=bZgt\QF6@/?I"1kcd(R#a82+;Z=eJd@AS,Zm#e[BTVe5HkJ``8oVe2Xb4Fb"aZZmVp@iQj($8eJLY]*Ja6-1aY`AMo_5[)5e %^[-'SAX]bH,D?L$hN`kZFkN]X-^nDCID%)n)R8lsYWA$i3PBHPiTW>+NQLWrd-sd7d$]VeMXC@7T0;,AD:$fD'C+&s@G^(ho!O6r %GrH3Bgn0hF;S9((hacL,6+PIEC>XF"cA9q`Tsj[)Kh8tg?KZ+Qe=V],QNU#D %q.U#BPl*klQK2Ts>l0_4"<(FYo$h*QVRl$FP$G^IXZ]mOqjS44AP;G3^QKlR@HU6(P,Cp85d9-tKTab(C["],dcS2_-.sSEnap). %pP86u&0qrF;fF#'1[p5X@2t/35P.F6?ic1O&2[V**o(VS!+8J1%a`1tXP]ORon/#A']%-QqUW)F&s5DZ)F<;0*GJg85rB06Ht$7Q %+iFHBBV;G)N(dB!APqA2Pk]cdL>N`o::emH&3PkPc\PPbX2C:Jb8gk?)e;#=O,lAM`!o.3jOSCQ40_EF.(@/%)H.*E?cC1P:nf.- %='Q7;MHq-BW*Uf(-m;ip>d%BgR<@'!BB%`YH4N]TZdNuso^@"B_aQq;"7:a'V(f;a=9Eqta0dkk4:DA1E^9AZDC*lQ %FEEG@M%c.Q/dB:;^DX"OChl;mW&eh*V0/!8B0=rhE\./1'r)ngE$)V5D%(R=6-<:p":$=4"s.pg\Usp(5?CRC.M0cl.8n(VPgcr+ %6JtR%o%,tHjjsdZKLr>)mEuip_)UML7).inU/qp#T!G0#@aSMM'pI'W^f<*fbT'Q$l%B11)m_&"_'o_FFn$)9R+8@!Uf%:KUk)Y0 %/dYk0QBVp35/?R<#^:a1Fq3<0&oafu0D.tW9,hZ=Pca3YHD^`%'4^+))5D5&(Zj&j52uWC=GT21'RTmLP$ZBTl3h4aSc-XiikS#\#6. %iliIeToO0<*b&po'(+@>gc`6WZ"@o["E;]DSrZN!g9aL-6m'I-S2QRDSW7_GFF %hQ_E)4bIj_25&d:Rrq\hpo7=D7=#Q[Vo#*"0*6imV3Y:Q_B,o1,1$H23,0%=DG_F^BG^JLC/Nk[X\7W(E=cEj=_\O&$*c]QP*:*j %7;_h5R$UtZlj+?oV&#aYVn0Fg+tOeOI@",jC/nRk<*I]+nQRS+PbT$8g/6AS@KOu>@PT:ZR+S;Dp %5\R/-P!!a26ZTXo#bHh<@8KeC&s"(<"\f.f4:2FIb.Xl)kkk1h_k*V3l$(A=!7-?Yd+>(kd[?0.hIR=H\q85#j&G;Hj)hkH#fQoKbcd*hssgA(j^6"iK[l#P4Qb@n@79<=h\p5F'@c_BGIni]qGB2@7F7GDOO%lDDF&l79gBqleqS^a2g %WpA_eIGS\5TI;4odRJM+r(87-Zr,3@#'7SNc7A)4SMl?uUQfqGdRI/+ %cPtuX8peVu"g&J_Mf?_-F^03e(M2chU@3,QS\.g[OV]7F]MZn*gu=ejQ3G+8ph0sa;e`YV[A;p0)[/Z*Vis)tS%05">)B#Im!MaO %//&@DoZ+mICjb%A^(Nq7?<6Sg*!O;[:j:nIBO1h`,C&BRXi/US3JjLID't@XB*?rr8o9h#kmA8VHI?Zm_dNnbPq;;:LnQo25k-8Y %fXFtV&mf^.R(%*$od\`!JetG0GjblDJt5t,,\?GbS*".<\!uMg$rU?*TN@#(?LK!@82MbXL;Dc$Zgnq;.C;d/#(""+)1B"*DrJYo %D)pE*6SP\t6]_Io4O\`sJgl%,ji\4jo5PY"LDI>7 %KB6DFC]A!.10(WB(I?UH+@19cj6\c,5&S=akr&SgWB?W1JA1haa_:m>&ioZsGR,!`o7pk9ZMAN=I0XX]khlG9ZS'DJ_%5pL %^I*qMNfhc'n10VhT[;sdTlQ;q-+lm!"N=gLCBnId^#In"qfCA,_ef<36A+$r>'YpkJgOU_JsO,6dMT^0-s;@f#>4O0ibfZoqMS5S %(jqu-TC\aVKsJ@;o5Ycg1IHD:lT6RTPu**'f+L3mnj4[#[hMOJ2jjSQ3_9qf %5TuM=TG7tNY7#qGo!;XalHi<#5"!5R_6W"PjC[+?CEBa/Ui#[C %hp"p/(123NnH7&)alj)"Lo),m=Tc=%LE8BgDn]bPj)l#fk.Ql&*n$Y>7=4pU:AO[?/f/Vjl)4E-5S(*U"90@c++8M9[Qf#C@.a?W %FJU*>rA4s:FtsZcITK3",P#Mg3LVQghI3VM?$!O?0AAd]W5[,#=F?c$?jIjX\3nVL?d/`HR-eN*s#c_i6>6ohHG=_',N&I=+8'MG %<\". %AI9_PrivateDataEnd \ No newline at end of file diff --git a/doc/resource/latex/preamble.tex b/doc/resource/latex/preamble.tex new file mode 100644 index 000000000..fb9816848 --- /dev/null +++ b/doc/resource/latex/preamble.tex @@ -0,0 +1,135 @@ +% ---------------------------------------------------------------------------------------------------------------------------------- +% pgBackRest User Guide +% ---------------------------------------------------------------------------------------------------------------------------------- +\documentclass[letterpaper,12pt]{article} + +% Add hyperlinks to TOC +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{hyperref} + +% Allow EPS files +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{graphicx} +\usepackage{epstopdf} + +% Use the caption package to enable captions that are not numbered (caption*) +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage[font=small,textfont=it,justification=justified,singlelinecheck=false]{caption} + +% Create a light gray color to use for source code listings +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage[table]{xcolor} +\definecolor{ltgray}{HTML}{E8E8E8} + +% Use listings package instead of verbatim for displaying code +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{courier} + +\usepackage{textcomp} +\usepackage{listings} +\lstset +{ + basicstyle=\small\ttfamily, + columns=flexible, + breaklines=true, + frame=tb, + backgroundcolor=\color{ltgray}, + upquote=true +} + +% Use tabularx for tables +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{tabularx} +\newcolumntype{R}{>{\raggedleft\arraybackslash}X}% +\renewcommand{\arraystretch}{1.3} + +% \usepackage{ltablex} + +% Allow four section levels (The fourth is implemented with paragraph) +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{titlesec} +\setcounter{secnumdepth}{4} + +\titleformat{\paragraph} +{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{} +\titlespacing*{\paragraph}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex} + +% Define source code highlighting +% ---------------------------------------------------------------------------------------------------------------------------------- +\newcommand{\Hilight}{\makebox[0pt][l]{\color{cyan}\rule[-4pt]{0.65\linewidth}{14pt}}} + +% Set the font to Helvetica +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{helvet} +\renewcommand{\familydefault}{\sfdefault} + +% Set margins +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage[top=.9in, bottom=1in, left=.5in, right=.5in]{geometry} + +% Sections start a new page +% ---------------------------------------------------------------------------------------------------------------------------------- +\let\stdsection\section +\renewcommand\section{\newpage\stdsection} + +% Format paragraphs with no indent and a blank line between paragraphs +% ---------------------------------------------------------------------------------------------------------------------------------- +\setlength\parindent{0pt} +\usepackage{parskip} + +% Add page headers and footers +% ---------------------------------------------------------------------------------------------------------------------------------- +\usepackage{fancyhdr} + +\fancyhead[LE,RO]{\slshape \rightmark} +\fancyhead[LO,RE]{\slshape \leftmark} + +\fancypagestyle{plain} +{ + \fancyhead{} + \lhead[]{TABLE OF CONTENTS} +} + +\lfoot[]{{[pdf-title]}\\ + Version {[version]}} +\cfoot[]{\ \\-\ \thepage\ -} +\rfoot[]{Crunchy Data Solutions, Inc.\\\today} +\pagestyle{fancy} + +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\footrulewidth}{0.4pt} + +% ---------------------------------------------------------------------------------------------------------------------------------- +% Begin document +% ---------------------------------------------------------------------------------------------------------------------------------- +\begin{document} + +% Create the title page +% ---------------------------------------------------------------------------------------------------------------------------------- +\makeatletter + \begin{titlepage} + \begin{center} + {\large \ }\\[18ex] + {\huge \bfseries {[pdf-title]}}\\[1ex] + {\large \bfseries Version {[version]}}\\[4ex] + {\large {[pdf-subtitle]}}\\[12ex] + \includegraphics[width=6in]{{[logo]}}\\[12ex] + {\large Crunchy Data Solutions, Inc.}\\[1ex] + {\large \today} + \end{center} + \end{titlepage} +\makeatother +\thispagestyle{empty} +\newpage + +% Generate TOC +% ---------------------------------------------------------------------------------------------------------------------------------- +\setcounter{tocdepth}{3} +\topskip0in +\thispagestyle{plain} +\renewcommand\contentsname{Table of Contents} +\tableofcontents + +% ---------------------------------------------------------------------------------------------------------------------------------- +% Content +% ---------------------------------------------------------------------------------------------------------------------------------- diff --git a/doc/xml/change-log.xml b/doc/xml/change-log.xml index 5c27a77e3..4d629d289 100644 --- a/doc/xml/change-log.xml +++ b/doc/xml/change-log.xml @@ -6,6 +6,32 @@ + + + + Added documentation in the user guide for delta restores, expiration, dedicated backup hosts, starting and stopping , and replication. + + + Fixed an issue where the start/stop commands required the --config option. + + + Fixed an issue where log files were being overwritten instead of appended. + + + Fixed an issue where backup-user was not optional. + + + Symlinks are no longer created in backup directories in the repository. These symlinks could point virtually anywhere and potentially be dangerous. Symlinks are still recreated during a restore. + + + Added better messaging for backup expiration. Full and differential backup expirations are logged on a single line along with a list of all dependent backups expired. + + + Archive retention is automatically set to full backup retention if not explicitly configured. + + + + @@ -120,7 +146,7 @@ Added vagrant test configurations for Ubuntu 14.04 and CentOS 7. - Split most of README.md out into USERGUIDE.md and CHANGELOG.md because it was becoming unwieldy. Changed most references to "database" in the user guide to "database cluster" for clarity. + Split most of README.md out into USERGUIDE.md and CHANGELOG.md because it was becoming unwieldy. Changed most references to database in the user guide to database cluster for clarity. diff --git a/doc/xml/dtd/doc.dtd b/doc/xml/dtd/doc.dtd index 02f512339..a44cb3fc8 100644 --- a/doc/xml/dtd/doc.dtd +++ b/doc/xml/dtd/doc.dtd @@ -50,45 +50,65 @@ - + + + + + + + + + + + + + - - - - - - - - - + - - - + + + + + + + + + - - - - + + + + + + + + + - + - + + @@ -115,26 +135,54 @@ - - + + + + + + + + + + + + + + + + + + + + + + + - + + - - + + + + + diff --git a/doc/xml/dtd/manifest.dtd b/doc/xml/dtd/manifest.dtd new file mode 100644 index 000000000..e1d739899 --- /dev/null +++ b/doc/xml/dtd/manifest.dtd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/xml/index.xml b/doc/xml/index.xml index 555834d37..3de6115b3 100644 --- a/doc/xml/index.xml +++ b/doc/xml/index.xml @@ -3,54 +3,21 @@ - - github-url-base - https://github.com/pgmasters/backrest - - - github-url-master - {[github-url-base]}/blob/master - - - github-url-issues - {[github-url-base]}/issues - - - github-url-change-log - {[github-url-master]}/CHANGELOG.md - - - github-url-license - {[github-url-master]}/LICENSE - - - backrest-url-base - http://www.pgbackrest.org - - - backrest-page-user-guide - user-guide.html - - - backrest-page-configuration - configuration.html - - - backrest-page-command - command.html - - - crunchy-url-base - http://www.crunchydatasolutions.com - - - crunchy-url-cbm - {[crunchy-url-base]}/crunchy-backup-manager - - - resonate-url-base - http://www.resonate.com - + https://github.com/pgmasters/backrest + {[github-url-base]}/blob/master + {[github-url-base]}/issues + {[github-url-master]}/CHANGELOG.md + {[github-url-master]}/LICENSE + + http://www.pgbackrest.org + user-guide.html + configuration.html + command.html + + http://www.crunchydatasolutions.com + {[crunchy-url-base]}/crunchy-backup-manager + + http://www.resonate.com
    diff --git a/doc/xml/reference.xml b/doc/xml/reference.xml index 63b1d1ea3..42e987070 100644 --- a/doc/xml/reference.xml +++ b/doc/xml/reference.xml @@ -1,162 +1,9 @@ - - - - + can be used entirely with command-line parameters but a configuration file is more practical for installations that are complex or set a lot of options. The default location for the configuration file is /etc/pg_backrest.conf. - @@ -171,7 +18,7 @@ Required only if the path to is different on the local and remote systems. If not defined, the remote exe path will be set the same as the local exe path. same as local - /usr/lib/backrest/bin/pg_backrest_remote.pl + /usr/lib/backrest/bin/pg_backrest @@ -583,6 +430,7 @@ + Commands are used to execute the various functions. Here the command options are listed exhaustively, that is, each option applicable to a command is listed with that command even if it applies to one or more other commands. This includes all the options that may also configured in pg_backrest.conf. @@ -657,8 +505,8 @@ - - --stanza=db --type=full backup + + {[backrest-exe]} --stanza=db --type=full backup Run a full backup on the db stanza. --type can also be set to incr or diff for incremental or differential backups. However, if no full backup exists then a full backup will be forced even if incr or diff is requested. @@ -673,8 +521,8 @@ - - --stanza=db archive-push %p + + {[backrest-exe]} --stanza=db archive-push %p Accepts a WAL segment from and archives it in the repository defined by repo-path. %p is how specifies the location of the WAL segment to be archived. @@ -689,8 +537,8 @@ - - --stanza=db archive-get %f %p + + {[backrest-exe]} --stanza=db archive-get %f %p Retrieves a WAL segment from the repository. This command is used in recovery.conf to restore a backup, perform PITR, or as an alternative to streaming for keeping a replica up to date. %f is how specifies the WAL segment it needs and %p is the location where it should be copied. @@ -705,8 +553,8 @@ - - --stanza=db expire + + {[backrest-exe]} --stanza=db expire Expire (rotate) any backups that exceed the defined retention. Expiration is run automatically after every successful backup, so there is no need to run this command separately unless you have reduced retention, usually to free up some space. @@ -793,6 +641,7 @@ Recover along a timeline. See recovery_target_timeline in the docs for more information. + 3 @@ -804,13 +653,16 @@ Note: The restore_command option will be automatically generated but can be overridden with this option. Be careful about specifying your own restore_command as is designed to handle this for you. Target Recovery options (recovery_target_name, recovery_target_time, etc.) are generated automatically by and should not be set with this option. - Recovery settings can also be set in the restore:recovery-option section of pg_backrest.conf. For example: - + Recovery settings can also be set in the restore:recovery-option section of pg_backrest.conf. + Since does not start after writing the recovery.conf file, it is always possible to edit/check recovery.conf before manually restarting. + primary_conninfo=db.mydomain.com @@ -821,14 +673,15 @@ Moves a tablespace to a new location during the restore. This is useful when tablespace locations are not the same on a replica, or an upgraded system has different mount points. Since 9.2 tablespace locations are not stored in pg_tablespace so moving tablespaces can be done with impunity. However, moving a tablespace to the data_directory is not recommended and may cause problems. For more information on moving tablespaces http://www.databasesoup.com/2013/11/moving-tablespaces.html is a good resource. + ts_01=/db/ts_01 - - --stanza=db --type=name --target=release restore + + {[backrest-exe]} --stanza=db --type=name --target=release restore Restores the latest database cluster backup and then recovers to the release restore point. @@ -860,16 +713,16 @@ - - --stanza=db --output=json info + + {[backrest-exe]} --stanza=db --output=json info Get information about backups in the db stanza. - - --output=json info + + {[backrest-exe]} --output=json info Get information about backups for all stanzas in the repository. @@ -885,16 +738,16 @@ - - help backup + + {[backrest-exe]} help backup Get help for the backup command. - - help backup force + + {[backrest-exe]} help backup force Get help for the force option of the backup command. @@ -910,8 +763,8 @@ - - --stanza=main start + + {[backrest-exe]} --stanza=main start Allows processes to run for the main stanza. @@ -940,8 +793,8 @@ - - stop + + {[backrest-exe]} stop Stop new processes for all stanzas but allow any current process to complete. @@ -957,8 +810,8 @@ - - version + + {[backrest-exe]} version Get version. diff --git a/doc/xml/user-guide.xml b/doc/xml/user-guide.xml index f6fff51fe..831cc870e 100644 --- a/doc/xml/user-guide.xml +++ b/doc/xml/user-guide.xml @@ -3,113 +3,90 @@ - - perl-lib-path - /usr/lib/perl5 - - - perl-bin-path - /usr/bin - - - backrest-repo-path - /var/lib/backrest - - - postgres-cluster-demo - demo - - - backrest-config-demo - /etc/{[backrest-exe]}.conf - - - postgres-config-demo - /etc/postgresql/9.4/{[postgres-cluster-demo]}/postgresql.conf - - - db-path - /var/lib/postgresql/9.4/{[postgres-cluster-demo]} - + /usr/lib/perl5 + /usr/share/perl5 + /usr/bin + + /var/lib/backrest + demo + /etc/{[project-exe]}.conf + + /var/lib/postgresql/9.4/{[postgres-cluster-demo]} + /var/lib/pgsql/9.4/data + + /etc/postgresql/9.4/{[postgres-cluster-demo]}/postgresql.conf + {[db-path]}/postgresql.conf + + /etc/postgresql/9.4/{[postgres-cluster-demo]}/pg_hba.conf + {[db-path]}/pg_hba.conf + + /home/postgres/.pgpass + + /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log + {[db-path]}/pg_log/postgresql.log + + /var/lib/pgsql/9.4/pgstartup.log + + {[db-path]}/recovery.conf + {[db-path]}/recovery.conf + + + u14 + co6 + + vagrant + /backrest:/backrest + {[host-user]} + + db-master + {[host-user]} + {[image-user]}/{[host-os]}-db + {[host-mount]} + + db-standby + {[host-user]} + {[image-user]}/{[host-os]}-db + {[host-mount]} + + backup + {[host-user]} + {[image-user]}/{[host-os]}-backup + {[host-mount]} - - cmd-backup-last - ls -1 /var/lib/backrest/backup/demo | tail -3 | head -1 - + ls -1 /var/lib/backrest/backup/demo | tail -3 | head -1 - - test-table-data - Very important data - - + Important Data - - - - pg_dropcluster {[dash]}-stop 9.4 {[postgres-cluster-demo]} - - - - apt-get remove -y libdbd-pg-perl libdbi-perl libnet-daemon-perl libplrpc-perl - root - - - chmod 777 /home/vagrant - root - - - rm {[backrest-config-demo]} - root - - - - chmod 777 /etc - root - - - rm -rf {[backrest-repo-path]} - root - - - rm -rf {[perl-lib-path]}/BackRest - root - - - rm {[perl-bin-path]}/{[backrest-exe]} - root - - - - rm -rf /home/vagrant/backrest-release-{[version]} - root - - - mkdir /home/vagrant/backrest-release-{[version]} - vagrant - - - cp -r /backrest/bin /home/vagrant/backrest-release-{[version]} - vagrant - - - cp -r /backrest/lib /home/vagrant/backrest-release-{[version]} - vagrant - - + + pg_createcluster 9.4 {[postgres-cluster-demo]} + service postgresql-9.4 initdb + + pg_ctlcluster 9.4 {[postgres-cluster-demo]} start + service postgresql-9.4 start + + pg_ctlcluster 9.4 {[postgres-cluster-demo]} stop + service postgresql-9.4 stop + + pg_ctlcluster 9.4 {[postgres-cluster-demo]} restart + service postgresql-9.4 restart + + pg_ctlcluster 9.4 {[postgres-cluster-demo]} reload + service postgresql-9.4 reload +
    Introduction -

    This user guide is intended to be followed sequentially from beginning to end &mdash; each section depends on the last. For example the Backup section relies on setup that is performed in the Quick Start section. Once you have up and running it possible to skip around but it is recommended to follow the user guide in order the first time through.

    +

    This user guide is intended to be followed sequentially from beginning to end &mdash; each section depends on the last. For example the Backup section relies on setup that is performed in the Quick Start section. Once you have up and running then skipping around is possible but it is recommended to follow the user guide in order the first time through.

    Although the examples are targeted at Ubuntu and 9.4 they will also work fine on Debian and it should be fairly easy to apply this guide to any Unix distribution and version. The only OS-specific commands are those to create, start, stop, and drop clusters. The commands will be the same on any Unix system though the locations to install Perl libraries and executables may vary. Configuring archiving is different on versions &lt;= 8.4 and configuration information can be found in the documentation.

    A somewhat novel approach is taken to documentation in this user guide. Each command is run on a virtual machine when the documentation is built from the XML source. This means you can have a high confidence that the commands work correctly in the order presented. Output is captured and displayed below the command when appropriate. If the output is not included it is because it was deemed not relevant or was considered a distraction from the narrative.

    -

    All commands are intended to be run as an unprivileged user that has sudo privileges for both the root and postgres users. It's also possible to run the commands directly as their respective users without modification though in that case you can also strip off the sudo commands if you like.

    +

    All commands are intended to be run as an unprivileged user that has sudo privileges for both the root and postgres users. It's also possible to run the commands directly as their respective users without modification and in that case the sudo commands can be stripped off.

    @@ -122,13 +99,13 @@
    Backup -

    A backup is a consistent copy of a database cluster that can be restored to recover from a hardware failure, to perform Point-In-Time Recovery, or to bring up a new replica.

    +

    A backup is a consistent copy of a database cluster that can be restored to recover from a hardware failure, to perform Point-In-Time Recovery, or to bring up a new standby.

    Full Backup: copies the entire contents of the database cluster to the backup server. The first backup of the database cluster is always a Full Backup. is always able to restore a full backup directly. The full backup does not depend on any files outside of the full backup for consistency.

    Differential Backup: copies only those database cluster files that have changed since the last full backup. restores a differential backup by copying all of the files in the chosen differential backup and the appropriate unchanged files from the previous full backup. The advantage of a differential backup is that it requires less disk space than a full backup, however, the differential backup and the full backup must both be valid to restore the differential backup.

    -

    Incremental Backup: copies only those database cluster file that have changed since the last backup (which can be another incremental backup, a differential backup, or a full backup). As an incremental backup only includes those files changed since the prior backup, they are generally much smaller than full or differential backups. As with the differential backup, the incremental backup depends on other backups to be valid to restore the incremental backup. Since the incremental backup includes only those files since the last backup, all prior incremental backups back to the prior differential, the prior differential backup, and the prior full backup must all be valid to perform a restore of the incremental backup. If no differential backup exists then all prior incremental backups back to the prior full backup, which must exist, and the full backup itself must be valid to restore the incremental backup.

    +

    Incremental Backup: copies only those database cluster files that have changed since the last backup (which can be another incremental backup, a differential backup, or a full backup). As an incremental backup only includes those files changed since the prior backup, they are generally much smaller than full or differential backups. As with the differential backup, the incremental backup depends on other backups to be valid to restore the incremental backup. Since the incremental backup includes only those files since the last backup, all prior incremental backups back to the prior differential, the prior differential backup, and the prior full backup must all be valid to perform a restore of the incremental backup. If no differential backup exists then all prior incremental backups back to the prior full backup, which must exist, and the full backup itself must be valid to restore the incremental backup.

    @@ -144,7 +121,7 @@

    WAL is the mechanism by which ensures that no committed changes are lost. Transactions are written sequentially to the WAL and a transaction is considered to be committed when those writes are flushed to disk. Afterwards, a background process writes the changes into the main database cluster files (also known as the heap). In the event of a crash, the WAL is replayed to make the database consistent.

    -

    WAL is conceptually infinite but in practice is broken up into individual 16MB files called segments. WAL segments follow the naming convention 0000000100000A1E000000FE where the first 8 hexadecimal digits represent the timeline and the next 16 digits are the WAL segment sequence number.

    +

    WAL is conceptually infinite but in practice is broken up into individual 16MB files called segments. WAL segments follow the naming convention 0000000100000A1E000000FE where the first 8 hexadecimal digits represent the timeline and the next 16 digits are the logical sequence number (LSN).

    A valid backup will always include at least one WAL segment even if no writes were made to the database between backups.

    @@ -154,70 +131,86 @@
    Installation -

    is written in Perl which is included with Ubuntu by default. A few additional modules are required which are all available as packages.

    + + + mkdir /home/vagrant/backrest-release-{[version]} + + + cp -r /backrest/bin /home/vagrant/backrest-release-{[version]} + + + cp -r /backrest/lib /home/vagrant/backrest-release-{[version]} + + - - Install required Perl modules +

    is written in Perl which is included with Ubuntu by default. A few additional modules are required which are all available as packages.

    - + + Install required Perl packages + + apt-get install libdbd-pg-perl libdbi-perl libnet-daemon-perl libplrpc-perl - root - -

    No Debian/Ubuntu packages are currently available for but it is easy to download the source and install manually.

    +

    is written in Perl, which is not included with RHEL/CentOS by default, however all required modules are all available as standard packages.

    - + + Install required Perl packages + + + yum -y install perl perl-Time-HiRes perl-parent perl-JSON + perl-Digest-SHA perl-DBD-Pg + + + +

    No Debian/Ubuntu packages are currently available for but it is easy to download the source and install manually.

    + +

    No RHEL/CentOS packages are currently available for but it is easy to download the source and install manually.

    + + Download version <id>{[version]}</id> of <backrest/> - - wget -O - https://github.com/pgmasters/backrest/archive/release/{[version]}.tar.gz | tar zxv -C ~ - vagrant - + + wget -q -O - + https://github.com/pgmasters/backrest/archive/release/{[version]}.tar.gz | + tar zx -C ~ - + Install <backrest/> - + cp -r ~/backrest-release-{[version]}/lib/BackRest {[perl-lib-path]} - root - - find /usr/lib/perl5/BackRest -type f -exec chmod 644 {} + - root + + find {[perl-lib-path]}/BackRest -type f -exec chmod 644 {} + - - find /usr/lib/perl5/BackRest -type d -exec chmod 755 {} + - root + + find {[perl-lib-path]}/BackRest -type d -exec chmod 755 {} + - - cp ~/backrest-release-{[version]}/bin/{[backrest-exe]} {[perl-bin-path]}/{[backrest-exe]} - root + + cp ~/backrest-release-{[version]}/bin/{[project-exe]} {[perl-bin-path]}/{[project-exe]} - - chmod 755 {[perl-bin-path]}/{[backrest-exe]} - root + + chmod 755 {[perl-bin-path]}/{[project-exe]}

    should now be properly installed but it is best to check. If any dependencies were missed then you will get an error when running from the command line.

    - + Make sure the installation worked - - {[backrest-exe]} - vagrant - + + {[project-exe]}
    -
    +
    Quick Start

    The Quick Start section will cover basic configuration of and and introduce the backup, restore, and info commands.

    @@ -226,21 +219,43 @@
    Setup Demo Cluster -

    You'll need to create a demo cluster to run the example commands in this user guide. This step is optional, but you may need to adjust commands in the user guide to work with your environment if you choose not to create the demo cluster.

    +

    Creating the demo cluster is optional but commands in the user guide may not work in other environments without significant modification. The cluster won't be started immediately because there is still some configuration to do.

    - - Create and start the demo cluster + + Create the demo cluster - - pg_createcluster 9.4 {[postgres-cluster-demo]} {[dash]}-start - root - + + {[db-cluster-create]} + +

    By default will only accept local connections. The examples in this guide will require connections from other servers so listen_addresses is configured to listen on all interfaces. This may not be appropriate for secure installations.

    + + + Set <pg-option>listen_addresses</pg-option> + + '*' + + +

    For demonstration purposes the log_line_prefix setting will be minimally configured. This keeps the log output as brief as possible to better illustrate important information.

    + + + Set <pg-option>log_line_prefix</pg-option> + + '' + + +

    By default CentOS/RHEL includes the day of the week in the log filename. This makes automating the user guide a bit more complicated so the log_filename is set to a constant.

    + + + Set <pg-option>log_filename</pg-option> + + 'postgresql.log' +
    -
    +
    Configure Cluster Stanza @@ -249,136 +264,142 @@

    needs to know where the base data directory for the cluster is located. The path can be requested from directly but in a recovery scenario the process will not be available. During backups the value supplied to will be compared against the path that is running on and they must be equal or the backup will return an error. Make sure that db-path is exactly equal to data_directory in postgresql.conf.

    -

    By default Ubuntu stores clusters in /var/lib/postgresql/[VERSION]/[CLUSTER-NAME] so it is easy to determine the correct path for the data directory.

    +

    By default Ubuntu stores clusters in /var/lib/postgresql/[version]/[cluster] so it is easy to determine the correct path for the data directory.

    - + Configure the <postgres/> cluster data directory - - demo - db-path - {[db-path]} - + {[db-path]} + +

    configuration files follow the Windows INI convention. Sections are denoted by text in brackets and key/value pairs are contained in each section. Lines beginning with # are ignored and can be used as comments.

    + +
    -
    +
    Create the Repository -

    For this simple configuration the repository will be stored on the same host as the server. This is the simplest configuration and is useful in cases where external backup software is employed to backup the database host.

    + - +

    For this demonstration the repository will be stored on the same host as the server. This is the simplest configuration and is useful in cases where traditional backup software is employed to backup the database host.

    + + Create the <backrest/> repository - + mkdir {[backrest-repo-path]} - root - + chmod 750 {[backrest-repo-path]} - root - + chown postgres:postgres {[backrest-repo-path]} - root

    The repository path must be configured so knows where to find it.

    - + Configure the <backrest/> repository path - - global:general - repo-path - {[backrest-repo-path]} - + {[backrest-repo-path]}
    -
    +
    Configure Archiving

    Backing up a running cluster requires WAL archiving to be enabled.

    - - Configure <postgres/> settings + + Configure archive settings - '{[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} archive-push %p' + '{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} archive-push %p' on - archive + hot_standby + 3 -

    The wal_level setting must be set to archive at a minimum but hot_standby and logical also work fine for backups. Setting wal_level to hot_standy is a good idea even if you do not currently run a hot standby since one can be added later without restarting the primary cluster.

    +

    The wal_level setting must be set to archive at a minimum but hot_standby and logical also work fine for backups. Setting wal_level to hot_standy and increasing max_wal_senders is a good idea even if you do not currently run a hot standby as this will allow them to be added later without restarting the master cluster.

    The cluster must be restarted after making these changes and before performing a backup.

    - + Restart the {[postgres-cluster-demo]} cluster - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} restart + + {[db-cluster-restart]}
    -
    +
    Perform a Backup

    To perform a backup of the cluster run with the backup command.

    - + Backup the {[postgres-cluster-demo]} cluster - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} backup - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} + --log-level-console=info backup + no prior backup exists|full backup size + + + + {[cmd-backup-last]}

    By default will attempt to perform an incremental backup. However, an incremental backup must be based on a full backup and since no full backup existed ran a full backup instead.

    -

    The type option can be used to specify and full or differential backup.

    +

    The type option can be used to specify a full or differential backup.

    - + Differential backup of the {[postgres-cluster-demo]} cluster - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=diff backup {[dash]}-log-level-console=info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=diff + --log-level-console=info backup + diff backup size -

    This time there was no warning because a full backup already existed. Like incremental backups, differential backups must be based on a full backup. An incremental backup can be performed by running the backup command with {[dash]}-type=incr.

    +

    This time there was no warning because a full backup already existed. While incremental backups can be based on a full or differential backup, differential backups must be based on a full backup. A full backup can be performed by running the backup command with {[dash]}-type=full.

    Use the info command to get information about backups.

    - + Get info for the {[postgres-cluster-demo]} cluster - - {[backrest-exe]} info - + + {[project-exe]} info (oldest|latest) backup label @@ -389,16 +410,16 @@
    -
    +
    Restore a Backup

    Backups can protect you from a number of disaster scenarios, the most common of which are hardware failure and data corruption. The easiest way to simulate data corruption is to remove an important cluster file.

    - + Stop the {[postgres-cluster-demo]} cluster and delete the <file>pg_control</file> file - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} stop + + {[db-cluster-stop]} @@ -408,19 +429,32 @@

    Starting the cluster without this important file will result in an error.

    - + Attempt to start the corrupted {[postgres-cluster-demo]} cluster - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} start - - 1 + + {[db-cluster-start]} + could not find the database system + + + + rm -f {[postgres-log-pgstartup-demo]} + + + + {[db-cluster-start]} + + + + cat {[postgres-log-pgstartup-demo]} + error + could not find the database system

    To restore a backup of the cluster run with the restore command. The cluster needs to be stopped (in this case it is already stopped) and all files must be removed from the data directory.

    - + Remove old files from {[postgres-cluster-demo]} cluster @@ -428,26 +462,26 @@ - + Restore the {[postgres-cluster-demo]} cluster and start <postgres/> - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} restore + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} restore - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} start + + {[db-cluster-start]} -

    This time the cluster started successfully since the restore replaced the missing pg_control file.

    +

    This time the cluster started successfully since the restore replaced the missing pg_control file.

    More information about the restore command can be found in the Restore section.

    -
    +
    Backup

    The Backup section introduces additional backup command features.

    @@ -458,34 +492,30 @@

    By default will wait for the next regularly scheduled checkpoint before starting a backup. Depending on the checkpoint_timeout and checkpoint_segments settings in it may be quite some time before a checkpoint completes and the backup can begin.

    - + Incremental backup of the {[postgres-cluster-demo]} cluster with the regularly scheduled checkpoint - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup {[dash]}-log-level-console=info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr + --log-level-console=info backup backup begins after the next regular checkpoint completes

    By setting start-fast on the command-line or in {[backrest-config-demo]} an immediate checkpoint is requested and the backup will start more quickly. This is convenient for testing and for ad-hoc backups. For instance, if a backup is being taken at the beginning of a release window it makes no sense to wait for a checkpoint. Since regularly scheduled backups generally only happen once per day it is unlikely that enabling the start-fast in {[backrest-config-demo]} will negatively affect performance, however for high-volume transactional systems you may want to pass {[dash]}-start-fast on the command-line instead.

    - + Enable the <br-option>start-fast</br-option> option - - global:backup - start-fast - y - + y - + Incremental backup of the {[postgres-cluster-demo]} cluster with an immediate checkpoint - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup {[dash]}-log-level-console=info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr + --log-level-console=info backup backup begins after the requested immediate checkpoint completes @@ -495,64 +525,56 @@
    Automatic Stop Option -

    Sometimes will exit unexpectedly and the backup in progress on the cluster will not be properly stopped. exits as quickly as possible when an error occurs so that the cause can be reported accurately and is not masked by another problem that could happen during a more extensive cleanup.

    +

    Sometimes will exit unexpectedly and the backup in progress on the cluster will not be properly stopped. exits as quickly as possible when an error occurs so that the cause can be reported accurately and is not masked by another problem that might happen during a more extensive cleanup.

    Here an error in intentionally caused by removing repository permissions.

    - + Revoke write privileges in the <backrest/> repository and attempt a backup - + chmod 550 {[backrest-repo-path]}/temp - root - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup {[dash]}-log-level-console=info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr + --log-level-console=info backup ERROR: - 199

    Even when the permissions are fixed will still be unable to perform a backup because the cluster is stuck in backup mode.

    - + Restore write privileges in the <backrest/> repository and attempt a backup - + chmod 750 {[backrest-repo-path]}/temp - root - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup {[dash]}-log-level-console=info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr + --log-level-console=info backup ERROR: - 132

    Enabling the stop-auto option allows to stop the current backup if it detects that no other backup process is running.

    - + Enable the <br-option>stop-auto</br-option> option - - global:backup - stop-auto - y - + y

    Now will stop the old backup and start a new one so the process completes successfully.

    - + Perform an incremental backup - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup {[dash]}-log-level-console=info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr + --log-level-console=info backup cluster is already in backup mode|backup begins after the requested immediate checkpoint completes @@ -563,224 +585,874 @@
    + +
    + Retention + +

    Generally it is best to retain as many backups as possible to provide a greater window for Point-in-Time Recovery, but practical concerns such as disk space must also be considered. Retention options remove older backups once they are no longer needed.

    + + +
    + Full Backup Retention + +

    Set full-retention to the number of full backups required. New backups must be completed before expiration will occur &mdash; that means if retention-full=2 then there will be three full backups stored before the oldest one is expired.

    + + + Configure <br-option>retention-full</br-option> + + 2 + + +

    Backup retention-full=2 but currently there is only one full backup so the next full backup to run will not expire any full backups.

    + + + Perform a full backup + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=full + --log-level-console=info backup + archive retention from backup {[backup-full-first]}|expire WAL segments + + + + {[cmd-backup-last]} + + + +

    Archive is expired because WAL segments were generated before the oldest backup. These are not useful for recovery &mdash; only WAL segments generated after a backup can be used to recover that backup.

    + + + Perform a full backup + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=full + --log-level-console=info backup + remove expired full backup set\: {[backup-full-first]}|archive retention from backup {[backup-full-second]}|expire WAL segments + + + +

    The {[backup-full-first]} full backup is expired and archive retention is based on the {[backup-full-second]} which is now the oldest full backup.

    +
    + + +
    + Differential Backup Retention + +

    Set retention-diff to the number of differential backups required. Differentials only rely on the prior full backup so it is possible to create a rolling set of differentials for the last day or more. This allows quick restores to recent points-in-time but reduces overall space consumption.

    + + + Configure <br-option>retention-diff</br-option> + + 1 + + +

    Backup retention-diff=2 so two differentials will need to be performed before one is expired. An incremental backup is added to demonstrate incremental expiration. Incremental backups cannot be expired independently &mdash; they are always expired with their related full or differential backup.

    + + + Perform differential and incremental backups + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=diff backup + + + + {[cmd-backup-last]} + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=incr backup + + + +

    Now performing a differential backup will expire the previous differential and incremental backups leaving only one differential backup.

    + + + Perform a differential backup + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=diff + --log-level-console=info backup + remove expired diff backup set: {[backup-diff-second]} + + +
    +
    + -
    +
    Restore

    The Restore section introduces additional restore command features.

    - -
    - Point-in-Time Recovery (PITR) + +
    + Delta Option -

    The restore example in Quick Start performed default recovery, which is to play all the way to the end of the WAL stream. In the case of a hardware failure this is probably the most appropriate action but for data corruption scenarios (whether machine or human in origin) there is a better alternative called Point-in-Time Recovery (PITR).

    +

    Restore a Backup in Quick Start required the database cluster directory to be cleaned before the restore could be performed. The delta allows to automatically determine which files in the database cluster directory can be preserved and which ones need to be restored from the backup. This is accomplished by calculating a SHA-1 cryptographic hash for each file in the database cluster directory. If the SHA-1 hash does not match the hash stored in the backup then that file will be restored. This operation is very efficient when combined with the thread-max option. Since the process is shut down during the restore, a larger number of threads can be used than might be desirable during a backup when the process is running.

    -

    PITR allows the WAL to be played from the last backup to a specified time, transaction id, or recovery point. For common recovery scenarios time-based recovery is arguably the most useful. A common recovery scenario is to restore a table or data was accidentally dropped or deleted. Recovering a dropped table is more dramatic so that's the example given here but deleted data would be recovered in exactly the same way.

    + + Stop the {[postgres-cluster-demo]} cluster, perform delta restore - - Create table with very important data + + {[db-cluster-stop]} + - - - psql -c "begin; - create table important_table (message text); - insert into important_table values ('{[test-table-data]}'); - commit; - select * from important_table"; - - - {[test-table-data]} + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta + --log-level-console=info restore + demo\/PG_VERSION - exists and matches backup|check\/clean db path|restore global\/pg_control -

    It is important to represent the time as reckoned by and to include timezone offsets. This reduces the possibility of unintended timezone conversions and an unexpected recovery result.

    + + Restart <postgres/> - - Get time from <postgres/> + + {[db-cluster-start]} + + +
    +
    - - - psql -Atc "select current_timestamp" - - time-recovery-timestamp - + +
    + Point-in-Time Recovery + +

    Restore a Backup in Quick Start performed default recovery, which is to play all the way to the end of the WAL stream. In the case of a hardware failure this is probably the most appropriate action but for data corruption scenarios (whether machine or human in origin) there is a better alternative called Point-in-Time Recovery (PITR).

    + +

    Point-in-Time Recovery (PITR) allows the WAL to be played from the last backup to a specified time, transaction id, or recovery point. For common recovery scenarios time-based recovery is arguably the most useful. A common recovery scenario is to restore a table that was accidentally dropped or data that was accidentally deleted. Recovering a dropped table is more dramatic so that's the example given here but deleted data would be recovered in exactly the same way.

    + + + Backup the {[postgres-cluster-demo]} cluster and create a table with very important data + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=diff backup + + + + + psql -c "begin; + create table important_table (message text); + insert into important_table values ('{[test-table-data]}'); + commit; + select * from important_table"; + + {[test-table-data]} + + + +

    It is important to represent the time as reckoned by and to include timezone offsets. This reduces the possibility of unintended timezone conversions and an unexpected recovery result.

    + + + Get the time from <postgres/> + + + + psql -Atc "select current_timestamp" + + + + +

    Now that the time has been recorded the table is dropped. In practice finding the exact time that the table was dropped is a lot harder than in this example. It may not be possible to find the exact time, but some forensic work should be able to get you close.

    + + + Drop the important table + + + psql -c "begin; + drop table important_table; + commit; + select * from important_table;" + does not exist + + + +

    Now the restore can be performed with time-based recovery to bring back the missing table.

    + + + Stop <postgres/>, restore the {[postgres-cluster-demo]} cluster to <id>{[time-recovery-timestamp]}</id>, and display <file>recovery.conf</file> + + + {[db-cluster-stop]} + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta + {[dash]}-type=time "{[dash]}-target={[time-recovery-timestamp]}" restore + + + + rm {[postgres-log-demo]} + + + + cat {[postgres-recovery-demo]} + recovery_target_time + + + +

    The recovery.conf file has been automatically generated by so can be started immediately. Once has finished recovery the table will exist again and can be queried.

    + + + Start <postgres/> and check that the important table exists + + + {[db-cluster-start]} + + + + psql -c "select * from important_table" + {[test-table-data]} + + + +

    The log also contains valuable information. It will indicate the time and transaction where the recovery stopped and also give the time of the last transaction to be applied.

    + + + Examine the <postgres/> log output + + + cat {[postgres-log-demo]} + recovery stopping before|last completed transaction|starting point-in-time recovery + + + +

    This example was rigged to give the correct result. If a backup after the required time is chosen then will not be able to recover the lost table. can only play forward, not backward. To demonstrate this the important table must be dropped (again).

    + + + Drop the important table (again) + + + psql -c "begin; + drop table important_table; + commit; + select * from important_table;" + does not exist + + + +

    Now take a new backup and attempt recovery from the new backup.

    + + + Perform a backup then attempt recovery from that backup + + + {[cmd-backup-last]} + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup + + + + {[db-cluster-stop]} + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta + {[dash]}-type=time "{[dash]}-target={[time-recovery-timestamp]}" restore + + + + rm {[postgres-log-demo]} + + + + {[db-cluster-start]} + + + + psql -c "select * from important_table" + does not exist + + + +

    Looking at the log output it's not obvious that recovery failed to restore the table. The key is to look for the presence of the recovery stopping before... and last completed transaction... log messages. If they are not present then the recovery to the specified point-in-time was not successful.

    + + + Examine the <postgres/> log output to discover the recovery was not successful + + + cat {[postgres-log-demo]} + starting point-in-time recovery + + + +

    Using an earlier backup will allow to play forward to the correct time again. The default behavior for restore is to use the most recent backup but an earlier backup can be specified with the {[dash]}-set option.

    + + + Stop <postgres/>, restore from the previous backup, and start <postgres/> + + + {[db-cluster-stop]} + + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta + {[dash]}-type=time "{[dash]}-target={[time-recovery-timestamp]}" + {[dash]}-set={[backup-last]} restore + + + + + rm {[postgres-log-demo]} + + + + {[db-cluster-start]} + + + + psql -c "select * from important_table" + {[test-table-data]} + + + +

    Now the the log output will contain the expected recovery stopping before... and last completed transaction... messages showing that the recovery was successful.

    + + + Examine the <postgres/> log output for log messages indicating success + + + cat {[postgres-log-demo]} + recovery stopping before|last completed transaction|starting point-in-time recovery + + +
    + + +
    + Dedicated Backup Host + +

    The configuration described in Quickstart is suitable for simple installations but for enterprise configurations it is more typical to have a dedicated backup host. This separates the backups and WAL archive from the database server so database host failures have less impact. It is still a good idea to employ traditional backup software to backup the backup host.

    + + +
    + Installation and Configuration + + + + cp -r /backrest/lib/BackRest {[perl-lib-path]} + + + find {[perl-lib-path]}/BackRest -type f -exec chmod 644 {} + + + + find {[perl-lib-path]}/BackRest -type d -exec chmod 755 {} + + + + cp /backrest/bin/{[project-exe]} {[perl-bin-path]}/{[project-exe]} + + + chmod 755 {[perl-bin-path]}/{[project-exe]} + + + + + Configure the <backrest/> repository path + + {[backrest-repo-path]} + + +

    For this example a new host named backup has been created to store the cluster backups. Follow the instructions in Installation to install and Create the Repository to create the repository. The backup host must also be configured with the database host/user and database path.

    + + + Configure <br-option>db-host</br-option>/<br-option>db-user</br-option> and <br-option>db-path</br-option> + + {[db-path]} + {[host-db-master]} + + y + + + +

    The database host must be configured with the backup host/user.

    + + + Configure <br-option>backup-host</br-option>/<br-option>backup-user</br-option> + + {[db-path]} + + {[backrest-repo-path]} + + + + {[host-backup]} + + +

    Commands are run the same as on a single host configuration except that the backup and expire command are run from the backup host and all other commands are run from the database host.

    +
    + + +
    + Perform a Backup + +

    To perform a backup of the cluster run with the backup command on the backup host.

    + + + Backup the {[postgres-cluster-demo]} cluster + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} backup -

    Now that the time has been recorded the table is dropped. In practice finding the exact time that the table was dropped is a lot harder than in this example. It may not be possible to find the exact time, but some forensic work should be able to get you close.

    +

    Since a new repository was created on the backup host the warning about the incremental backup changing to a full backup was emitted.

    +
    - - Drop the important table + +
    + Restore a Backup + +

    To perform a restore of the cluster run with the restore command on the database host.

    + + + Stop the {[postgres-cluster-demo]} cluster, restore, and restart <postgres/> + + + {[db-cluster-stop]} + - psql -c "begin; - drop table important_table; - commit; - select * from important_table;" - - does not exist - 1 + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta restore + + + + {[db-cluster-start]} -

    Now the restore can be performed with time-based recovery to {[time-recovery-timestamp]} to bring back the missing table.

    +

    A new backup must be performed to due to the timeline switch.

    - - Stop <postgres/>, restore the {[postgres-cluster-demo]} cluster to <id>{[time-recovery-timestamp]}</id>, and display <file>recovery.conf</file> + + Backup the {[postgres-cluster-demo]} cluster - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} stop + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} backup + + +
    +
    + + +
    + Starting and Stopping + +

    Sometimes it is useful to prevent from running on a system. For example, when failing over from a master to a standby it's best to prevent from running on the old master in case gets restarted or can't be completely killed. This will also prevent from running on cron.

    + + + + + Stop the <backrest/> services + + + {[project-exe]} stop + + + +

    New processes will no longer run.

    + + + Attempt a backup + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} backup + stop file exists for all stanzas + + + +

    Specify the --force option to terminate any process that are currently running. If is already stopped then stopping again will generate a warning.

    + + + Stop the <backrest/> services again + + + {[project-exe]} stop + + + +

    Start processes again with the start command.

    + + + Start the <backrest/> services + + + {[project-exe]} start + + + +

    It is also possible to stop for a single stanza.

    + + + Stop <backrest/> services for the <id>demo</id> stanza + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} stop + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} backup + stop file exists for stanza demo + + + +

    The stanza must also be specified when starting the processes for a single stanza.

    + + + Start the <backrest/> services for the <id>demo</id> stanza + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} start + + +
    + + +
    + Replication + +

    Replication allows multiple copies of a cluster (called standbys) to be created from a single master. The standbys are useful for balancing reads and to provide redundancy in case the master host fails.

    + +
    + Hot Standby + +

    A hot standby performs replication using the WAL archive and allows read-only queries.

    + +

    A new host named db-standby will be created to run the standby. Follow the instructions in Installation to install , Setup Demo Cluster to setup the demo cluster, and Create the Repository to create the repository on the db-standby host.

    + + + + + apt-get -y install libdbd-pg-perl libdbi-perl + libnet-daemon-perl libplrpc-perl - - rm /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log - + + yum -y install perl perl-Time-HiRes perl-parent + perl-JSON perl-Digest-SHA perl-DBD-Pg - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=time "--target={[time-recovery-timestamp]}" --delta restore + + + cp -r /backrest/lib/BackRest {[perl-lib-path]} + + + find {[perl-lib-path]}/BackRest -type f -exec chmod 644 {} + + + + find {[perl-lib-path]}/BackRest -type d -exec chmod 755 {} + + + + cp /backrest/bin/{[project-exe]} {[perl-bin-path]}/{[project-exe]} + + + chmod 755 {[perl-bin-path]}/{[project-exe]} + + + mkdir {[backrest-repo-path]} + + + chmod 750 {[backrest-repo-path]} + + + chown postgres:postgres {[backrest-repo-path]} + + + + + {[db-cluster-create]} + + + + + Set options + + '' + 'postgresql.log' + + +

    configuration is very similar to db-master except that the standby_mode setting will be enabled to keep the cluster in recovery mode when the end of the WAL stream has been reached.

    + + + Configure <backrest/> on the standby + + {[db-path]} + + {[backrest-repo-path]} + + + + {[host-backup]} + + on + + +

    Now the standby can be created with the restore command.

    + + + Restore the {[postgres-cluster-demo]} standby cluster + - cat /var/lib/postgresql/9.4/{[postgres-cluster-demo]}/recovery.conf - + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta restore + + + + cat {[postgres-recovery-demo]} -

    The recovery.conf file has been automatically generated by so can be started immediately. Once has finished recovery the table will exist again and can be queried.

    +

    Note that the standby_mode setting has been written into the recovery.conf file. Configuring recovery settings in means that the recovery.conf file does not need to be stored elsewhere since it will be properly recreated with each restore. The --type=preserve option can be used with the restore to leave the existing recovery.conf file in place if that behavior is preferred.

    - - Start <postgres/> and check that the important table exists +

    The hot_standby setting must be enabled before starting to allow read-only connections on db-standby. Otherwise, connection attempts will be refused.

    - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} start + + Enable <pg-option>hot_standby</pg-option> + + on + + + + Start <postgres/> + + + rm {[postgres-log-demo]} - - psql -c "select * from important_table" - - {[test-table-data]} + + {[db-cluster-start]} -

    The log also contains valuable information. It will indicate the time and transaction where the recovery stopped and also give the time of the last transaction to be applied.

    +

    The log gives valuable information about the recovery. Note especially that the cluster has entered standby mode and is ready to accept read-only connections.

    - - Examine the <postgres/> log output - - - cat /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log - - recovery stopping before|last completed transaction|starting point-in-time recovery - - - -

    This example was rigged to give the correct result. If a backup after the required time is chosen then will not be able to recover the lost table. can only play forward, not backward. To demonstrate this the important table must be dropped (again).

    - - - Drop the important table (again) - - - psql -c "begin; - drop table important_table; - commit; - select * from important_table;" - - does not exist - 1 - - - -

    Now take a new backup and attempt the recovery from the new backup.

    - - - Perform a backup then attempt recovery from that backup - - - {[cmd-backup-last]} - backup-last - - - - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-type=incr backup - - - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} stop - - - - rm /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log - - - - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=time "--target={[time-recovery-timestamp]}" --delta restore - - - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} start - - - - psql -c "select * from important_table" - - does not exist - 1 - - - -

    Looking at the log output it's not obvious that recovery failed to restore the table. The key is to look for the presence of the "recovery stopping before..." and "last completed transaction..." log messages. If they are not present then the recovery to the specified point-in-time was not successful.

    - - - Examine the <postgres/> log output to discover the recovery was not successful - - - cat /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log - - starting point-in-time recovery - - - -

    Using an earlier backup will allow to play forward to the correct time again. The default behavior for restore is to use the most recent backup but an earlier backup can be specified with the --set option.

    - - - Stop <postgres/>, YADA YADA! - - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} stop - - - - rm /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log - - - - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=time "--target={[time-recovery-timestamp]}" --set={[backup-last]} --delta restore - - - - pg_ctlcluster 9.4 {[postgres-cluster-demo]} start - - - - psql -c "select * from important_table" - - - - - -

    Now the the log output will contain the expected "recovery stopping before..." and "last completed transaction..." messages showing that the recovery was successful.

    - - + Examine the <postgres/> log output for log messages indicating success + + cat {[postgres-log-demo]} + entering standby mode|database system is ready to accept read only connections + + + +

    An easy way to test that replication is properly configured is to create a table on db-master.

    + + + Create a new table on the master + + + + psql -c " + begin; + create table replicated_table (message text); + insert into replicated_table values ('{[test-table-data]}'); + commit; + select * from replicated_table"; + + {[test-table-data]} + + + +

    And then query the same table on db-standby.

    + + + Query new table on the standby + + + psql -c "select * from replicated_table;" + does not exist + + + +

    So, what went wrong? Since is pulling WAL segments from the archive to perform replication, changes won't be seen on the standby until the WAL segment that contains those changes is pushed from db-master.

    + +

    This can be done manually by calling pg_switch_xlog() which pushes the current WAL segment to the archive (a new WAL segment is created to contain further changes).

    + + + Call <code>pg_switch_xlog()</code> + + + + psql -c "select *, current_timestamp from pg_switch_xlog()"; + + + + +

    Now after a short delay the table will appear on db-standby.

    + + + Now the new table exists on the standby (may require a few retries) + + + psql -c " + select *, current_timestamp from replicated_table" + {[test-table-data]} + + +
    + +
    + Streaming Replication + +

    Instead of relying solely on the WAL archive, streaming replication makes a direct connection to the master and applies changes as soon as they are made on the master. This results in much less lag between the master and standby.

    + +

    Streaming replication requires a user with the replication privilege.

    + + + Create replication user + + + + psql -c " + create user replicator password 'jw8s0F4' replication"; + + + + +

    The pg_hba.conf file must be updated to allow the standby to connection as the replication user. Be sure to replace the IP address below with the actual IP address of your db-master. A reload will be required after modifying the pg_hba.conf file.

    + + + Create <file>pg_hba.conf</file> entry for replication user + - cat /var/log/postgresql/postgresql-9.4-{[postgres-cluster-demo]}.log - - recovery stopping before|last completed transaction|starting point-in-time recovery + + sh -c 'echo + "host replication replicator {[host-db-standby-ip]}/32 md5" + >> {[postgres-hba-demo]}' + + + + + {[db-cluster-reload]} + + + + + +

    The standby needs to know how to contact the master so the primary_conninfo setting will be configured in .

    + + + Set <pg-option>primary_conninfo</pg-option> + + host={[host-db-master-ip]} port=5432 user=replicator + + +

    It is possible to configure a password in the primary_conninfo setting but using a .pgpass file is more flexible and secure.

    + + + Configure the replication password in the <file>.pgpass</file> file. + + + + sh -c 'echo + "{[host-db-master-ip]}:*:replication:replicator:jw8s0F4" + >> {[postgres-pgpass]}' + + + + + chmod 600 {[postgres-pgpass]} + + + +

    Now the standby can be created with the restore command.

    + + + Stop <postgres/> and restore the {[postgres-cluster-demo]} standby cluster + + + {[db-cluster-stop]} + + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-delta restore + + + + cat {[postgres-recovery-demo]} + + + +

    By default CentOS/RHEL stores the postgresql.conf file in the data directory. That means the change made to postgresql.conf was overwritten by the last restore and the hot_standby setting must be enabled again. Other solutions to this problem are to store the postgresql.conf file elsewhere or to enable the hot_standby setting on the db-master host where it will be ignored.

    + + + Enable <pg-option>hot_standby</pg-option> + + on + + + + Start <postgres/> + + + rm {[postgres-log-demo]} + + + + {[db-cluster-start]} + + + +

    The log will confirm that streaming replication has started.

    + + + Examine the <postgres/> log output for log messages indicating success + + + cat {[postgres-log-demo]} + started streaming WAL from primary + + + +

    Now when a table is created on db-master it will appear on db-standby quickly and without the need to call pg_switch_xlog().

    + + + Create a new table on the master + + + + psql -c " + begin; + create table stream_table (message text); + insert into stream_table values ('{[test-table-data]}'); + commit; + select *, current_timestamp from stream_table"; + + {[test-table-data]} + + + + + Query table on the standby + + + psql -c " + select *, current_timestamp from stream_table" + {[test-table-data]}
    @@ -792,12 +1464,11 @@

    - + Get detailed information - - {[backrest-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-output=json info - + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-output=json info
    --> diff --git a/lib/BackRest/Backup.pm b/lib/BackRest/Backup.pm index 4680195dd..ea161cd48 100644 --- a/lib/BackRest/Backup.pm +++ b/lib/BackRest/Backup.pm @@ -434,25 +434,28 @@ sub processManifest } # Create links - my $strSectionLink = "$strPathKey:link"; - - if ($oBackupManifest->test($strSectionLink)) - { - foreach my $strLink ($oBackupManifest->keys($strSectionLink)) - { - # Create links except in pg_tblspc because they have already been created - if (!($strPathKey eq 'base' && $strLink =~ /^pg_tblspc\/.*/)) - { - $self->{oFile}->linkCreate(PATH_BACKUP_ABSOLUTE, - $oBackupManifest->get($strSectionLink, $strLink, MANIFEST_SUBKEY_DESTINATION), - PATH_BACKUP_TMP, "${strBackupDestinationPath}/${strLink}", - false, false, false); - } - } - } + # + # Non-tablespace links are no longer created in backup directories because they are potentially dangerous. + # This feature may be brought back at a later date but more likely that it will be rethought completely. + # + # my $strSectionLink = "$strPathKey:link"; + # + # if ($oBackupManifest->test($strSectionLink)) + # { + # foreach my $strLink ($oBackupManifest->keys($strSectionLink)) + # { + # # Create links except in pg_tblspc because they have already been created + # if (!($strPathKey eq 'base' && $strLink =~ /^pg_tblspc\/.*/)) + # { + # $self->{oFile}->linkCreate(PATH_BACKUP_ABSOLUTE, + # $oBackupManifest->get($strSectionLink, $strLink, MANIFEST_SUBKEY_DESTINATION), + # PATH_BACKUP_TMP, "${strBackupDestinationPath}/${strLink}", + # false, false, false); + # } + # } + # } } - # Possible for the file section to exist with no files (i.e. empty tablespace) my $strSectionFile = "$strPathKey:file"; diff --git a/lib/BackRest/Common/Lock.pm b/lib/BackRest/Common/Lock.pm index 8d2c134f2..626bebe5b 100644 --- a/lib/BackRest/Common/Lock.pm +++ b/lib/BackRest/Common/Lock.pm @@ -238,7 +238,8 @@ sub lockStop # If the stop file already exists then warn if (-e $strStopFile) { - &log(WARN, 'stop file already exists' . (optionTest(OPTION_STANZA) ? ' for stanza ' . optionGet(OPTION_STANZA) : '')); + &log(WARN, 'stop file already exists' . + (optionTest(OPTION_STANZA) ? ' for stanza ' . optionGet(OPTION_STANZA) : ' for all stanzas')); return false; } diff --git a/lib/BackRest/Common/Log.pm b/lib/BackRest/Common/Log.pm index b37880f34..6552c72f9 100644 --- a/lib/BackRest/Common/Log.pm +++ b/lib/BackRest/Common/Log.pm @@ -113,7 +113,7 @@ sub logFileSet $bExists = true; } - sysopen($hLogFile, $strFile, O_WRONLY | O_CREAT, 0660) + sysopen($hLogFile, $strFile, O_WRONLY | O_CREAT | O_APPEND, 0660) or confess &log(ERROR, "unable to open log file ${strFile}", ERROR_FILE_OPEN); if ($bExists) diff --git a/lib/BackRest/Config/Config.pm b/lib/BackRest/Config/Config.pm index 3c67eb3c7..1f8f369fd 100644 --- a/lib/BackRest/Config/Config.pm +++ b/lib/BackRest/Config/Config.pm @@ -456,6 +456,8 @@ use constant OPTION_DEFAULT_BACKUP_STOP_AUTO => false; push @EXPORT, qw(OPTION_DEFAULT_BACKUP_STOP_AUTO); use constant OPTION_DEFAULT_BACKUP_START_FAST => false; push @EXPORT, qw(OPTION_DEFAULT_BACKUP_START_FAST); +use constant OPTION_DEFAULT_BACKUP_USER => 'backrest'; + push @EXPORT, qw(OPTION_DEFAULT_BACKUP_USER); # RESTORE SECTION #----------------------------------------------------------------------------------------------------------------------------------- @@ -500,9 +502,12 @@ my %oOptionRule = &CMD_ARCHIVE_GET => true, &CMD_ARCHIVE_PUSH => true, &CMD_BACKUP => true, + &CMD_EXPIRE => true, &CMD_INFO => true, &CMD_REMOTE => true, - &CMD_RESTORE => true + &CMD_RESTORE => true, + &CMD_START => true, + &CMD_STOP => true } }, @@ -1038,7 +1043,8 @@ my %oOptionRule = { &OPTION_RULE_TYPE => OPTION_TYPE_STRING, &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOG_LEVEL_CONSOLE, - &OPTION_RULE_SECTION => CONFIG_SECTION_LOG, + &OPTION_RULE_SECTION => true, + &OPTION_RULE_SECTION_INHERIT => CONFIG_SECTION_LOG, &OPTION_RULE_ALLOW_LIST => { lc(OFF) => true, @@ -1047,7 +1053,8 @@ my %oOptionRule = lc(INFO) => true, lc(DEBUG) => true, lc(TRACE) => true - }, + } + , &OPTION_RULE_COMMAND => { &CMD_ARCHIVE_GET => true, @@ -1055,7 +1062,9 @@ my %oOptionRule = &CMD_BACKUP => true, &CMD_EXPIRE => true, &CMD_INFO => true, - &CMD_RESTORE => true + &CMD_RESTORE => true, + &CMD_START => true, + &CMD_STOP => true } }, @@ -1080,7 +1089,9 @@ my %oOptionRule = &CMD_BACKUP => true, &CMD_EXPIRE => true, &CMD_INFO => true, - &CMD_RESTORE => true + &CMD_RESTORE => true, + &CMD_START => true, + &CMD_STOP => true } }, @@ -1163,6 +1174,7 @@ my %oOptionRule = &OPTION_BACKUP_USER => { &OPTION_RULE_TYPE => OPTION_TYPE_STRING, + &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_USER, &OPTION_RULE_SECTION => CONFIG_SECTION_BACKUP, &OPTION_RULE_COMMAND => { diff --git a/lib/BackRest/Config/ConfigHelpData.pm b/lib/BackRest/Config/ConfigHelpData.pm index 4ed124c9d..ca2f65cf8 100644 --- a/lib/BackRest/Config/ConfigHelpData.pm +++ b/lib/BackRest/Config/ConfigHelpData.pm @@ -736,6 +736,7 @@ my $oConfigHelpData = option => { + 'config' => 'default', 'log-level-console' => 'section', 'log-level-file' => 'section', 'repo-path' => 'section', @@ -871,12 +872,7 @@ my $oConfigHelpData = "this for you. Target Recovery options (recovery_target_name, recovery_target_time, etc.) are " . "generated automatically by pgBackRest and should not be set with this option.\n" . "\n" . - "Recovery settings can also be set in the restore:recovery-option section of pg_backrest.conf. For " . - "example:\n" . - "\n" . - "[restore:recovery-option]\n" . - "primary_conn_info=db.mydomain.com\n" . - "standby_mode=on\n" . + "Recovery settings can also be set in the restore:recovery-option section of pg_backrest.conf.\n" . "\n" . "Since pgBackRest does not start PostgreSQL after writing the recovery.conf file, it is always possible " . "to edit/check recovery.conf before manually restarting." @@ -996,6 +992,9 @@ my $oConfigHelpData = option => { + 'config' => 'default', + 'log-level-console' => 'section', + 'log-level-file' => 'section', 'repo-path' => 'section', 'stanza' => 'default' } @@ -1015,6 +1014,8 @@ my $oConfigHelpData = option => { + 'config' => 'default', + # FORCE Option Help #------------------------------------------------------------------------------------------------------------------- 'force' => @@ -1029,6 +1030,8 @@ my $oConfigHelpData = "process on the backup server." }, + 'log-level-console' => 'section', + 'log-level-file' => 'section', 'repo-path' => 'section', 'stanza' => 'default' } diff --git a/lib/BackRest/Expire.pm b/lib/BackRest/Expire.pm index 50c965dba..8fe2bfa4b 100644 --- a/lib/BackRest/Expire.pm +++ b/lib/BackRest/Expire.pm @@ -125,27 +125,35 @@ sub process # Make sure iFullRetention is valid if (!looks_like_number($iFullRetention) || $iFullRetention < 1) { - confess &log(ERROR, 'full_retention must be a number >= 1'); + confess &log(ERROR, 'retention-full must be a number >= 1'); } - my $iIndex = $iFullRetention; - @stryPath = $oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(true), 'reverse'); + @stryPath = $oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(true)); - while (defined($stryPath[$iIndex])) + if (@stryPath > $iFullRetention) { # Delete all backups that depend on the full backup. Done in reverse order so that remaining backups will still # be consistent if the process dies - foreach $strPath ($oFile->list(PATH_BACKUP_CLUSTER, undef, '^' . $stryPath[$iIndex] . '.*', 'reverse')) + for (my $iFullIdx = 0; $iFullIdx < @stryPath - $iFullRetention; $iFullIdx++) { - system("rm -rf ${strBackupClusterPath}/${strPath}") == 0 - or confess &log(ERROR, "unable to delete backup ${strPath}"); + my @stryRemoveList; - $oBackupInfo->delete($strPath); + foreach $strPath ($oFile->list(PATH_BACKUP_CLUSTER, undef, '^' . $stryPath[$iFullIdx] . '.*')) + { + system("rm -rf ${strBackupClusterPath}/${strPath}") == 0 + or confess &log(ERROR, "unable to delete backup ${strPath}"); + + $oBackupInfo->delete($strPath); + + if ($strPath ne $stryPath[$iFullIdx]) + { + push(@stryRemoveList, $strPath); + } + } + + &log(INFO, 'remove expired full backup ' . (@stryRemoveList > 0 ? 'set: ' : '') . $stryPath[$iFullIdx] . + (@stryRemoveList > 0 ? ', ' . join(', ', @stryRemoveList) : '')); } - - &log(INFO, 'remove expired full backup: ' . $stryPath[$iIndex]); - - $iIndex++; } } @@ -155,33 +163,61 @@ sub process # Make sure iDifferentialRetention is valid if (!looks_like_number($iDifferentialRetention) || $iDifferentialRetention < 1) { - confess &log(ERROR, 'differential_retention must be a number >= 1'); + confess &log(ERROR, 'retention-diff must be a number >= 1'); } - @stryPath = $oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(false, true), 'reverse'); + @stryPath = $oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(false, true)); - if (defined($stryPath[$iDifferentialRetention - 1])) + if (@stryPath > $iDifferentialRetention) { - logDebugMisc($strOperation, 'differential expiration based on ' . $stryPath[$iDifferentialRetention - 1]); + # $strDiffRetain = $stryPath[@stryPath - $iDifferentialRetention]; - # Get a list of all differential and incremental backups - foreach $strPath ($oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(false, true, true), 'reverse')) + # logDebugMisc($strOperation, 'differential expiration based on ' . $strDiffRetain); + + for (my $iDiffIdx = 0; $iDiffIdx < @stryPath - $iDifferentialRetention; $iDiffIdx++) { - logDebugMisc($strOperation, "checking ${strPath} for differential expiration"); + # Get a list of all differential and incremental backups + my @stryRemoveList; - # Remove all differential and incremental backups before the oldest valid differential - if ($strPath lt $stryPath[$iDifferentialRetention - 1]) + foreach $strPath ($oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(false, true, true))) { - system("rm -rf ${strBackupClusterPath}/${strPath}") == 0 - or confess &log(ERROR, "unable to delete backup ${strPath}"); - $oBackupInfo->delete($strPath); + logDebugMisc($strOperation, "checking ${strPath} for differential expiration"); - &log(INFO, "remove expired diff/incr backup ${strPath}"); + # Remove all differential and incremental backups before the oldest valid differential + if ($strPath lt $stryPath[$iDiffIdx + 1]) + { + system("rm -rf ${strBackupClusterPath}/${strPath}") == 0 + or confess &log(ERROR, "unable to delete backup ${strPath}"); + $oBackupInfo->delete($strPath); + + if ($strPath ne $stryPath[$iDiffIdx]) + { + push(@stryRemoveList, $strPath); + } + # &log(INFO, "remove expired diff/incr backup ${strPath}"); + } } + + &log(INFO, 'remove expired diff backup ' . (@stryRemoveList > 0 ? 'set: ' : '') . $stryPath[$iDiffIdx] . + (@stryRemoveList > 0 ? ', ' . join(', ', @stryRemoveList) : '')); } } } + # Default archive retention if not explicily set + if (defined($iFullRetention)) + { + if (!defined($iArchiveRetention)) + { + $iArchiveRetention = $iFullRetention; + } + + if (!defined($strArchiveRetentionType)) + { + $strArchiveRetentionType = BACKUP_TYPE_FULL; + } + } + # If no archive retention type is set then exit if (!defined($strArchiveRetentionType)) { @@ -192,20 +228,10 @@ sub process # Determine which backup type to use for archive retention (full, differential, incremental) if ($strArchiveRetentionType eq BACKUP_TYPE_FULL) { - if (!defined($iArchiveRetention)) - { - $iArchiveRetention = $iFullRetention; - } - @stryPath = $oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(true), 'reverse'); } elsif ($strArchiveRetentionType eq BACKUP_TYPE_DIFF) { - if (!defined($iArchiveRetention)) - { - $iArchiveRetention = $iDifferentialRetention; - } - @stryPath = $oFile->list(PATH_BACKUP_CLUSTER, undef, backupRegExpGet(true, true), 'reverse'); } elsif ($strArchiveRetentionType eq BACKUP_TYPE_INCR) @@ -228,7 +254,7 @@ sub process confess &log(ERROR, 'archive_retention must be a number >= 1'); } - # if no backups were found then preserve current archive logs - too scary to delete them! + # if no backups were found then preserve current archive logs - too soon to expire them my $iBackupTotal = scalar @stryPath; if ($iBackupTotal > 0) @@ -240,8 +266,7 @@ sub process { if ($strArchiveRetentionType eq BACKUP_TYPE_FULL && scalar @stryPath > 0) { - &log(INFO, 'fewer than required backups for retention, ' . - 'but since archive_retention_type = full using oldest full backup'); + &log(INFO, "full backup total < ${iArchiveRetention} - using oldest full backup for archive retention"); $strArchiveRetentionBackup = $stryPath[scalar @stryPath - 1]; } } @@ -253,8 +278,6 @@ sub process # Get the archive logs that need to be kept. To be cautious we will keep all the archive logs starting from this # backup even though they are also in the pg_xlog directory (since they have been copied more than once). - &log(INFO, 'archive retention based on backup ' . $strArchiveRetentionBackup); - my $oManifest = new BackRest::Manifest($oFile->pathGet(PATH_BACKUP_CLUSTER) . "/${strArchiveRetentionBackup}/backup.manifest"); my $strArchiveLast = $oManifest->get(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_ARCHIVE_START); @@ -264,7 +287,7 @@ sub process confess &log(ERROR, "invalid archive location retrieved ${strArchiveRetentionBackup}"); } - &log(INFO, 'archive retention starts at ' . $strArchiveLast); + &log(INFO, "archive retention from backup ${strArchiveRetentionBackup}, start = ${strArchiveLast}"); # Get archive info my $oArchive = new BackRest::Archive(); @@ -326,7 +349,8 @@ sub process } else { - &log(INFO, "expired WAL segments: start = ${strArchiveExpireStart}, stop = ${strArchiveExpireStop}"); + &log(INFO, 'expire WAL segments: start = ' . substr($strArchiveExpireStart, 0, 24) . + ', stop = ' . substr($strArchiveExpireStop, 0, 24)); } } } diff --git a/lib/BackRest/Protocol/IO.pm b/lib/BackRest/Protocol/IO.pm index 761431986..94fd20c41 100644 --- a/lib/BackRest/Protocol/IO.pm +++ b/lib/BackRest/Protocol/IO.pm @@ -557,7 +557,7 @@ sub waitPid confess &log(ERROR, 'remote process terminated' . ($iExitStatus < ERROR_MINIMUM && $iExitStatus > ERROR_MAXIMUM ? " (exit status ${iExitStatus}" : '') . - " : ${strError}", + ": ${strError}", $iExitStatus >= ERROR_MINIMUM && $iExitStatus <= ERROR_MAXIMUM ? $iExitStatus : ERROR_HOST_CONNECT); } diff --git a/lib/BackRest/Version.pm b/lib/BackRest/Version.pm index c59cdcfed..42f49de69 100644 --- a/lib/BackRest/Version.pm +++ b/lib/BackRest/Version.pm @@ -17,7 +17,7 @@ use Exporter qw(import); # repositories or manifests can be read - that's the job of the format number. #----------------------------------------------------------------------------------------------------------------------------------- our # 'our' keyword is on a separate line to make the ExtUtils::MakeMaker parser happy. -$VERSION = '0.87'; +$VERSION = '0.88'; push @EXPORT, qw($VERSION); diff --git a/test/lib/BackRestTest/Common/ExecuteTest.pm b/test/lib/BackRestTest/Common/ExecuteTest.pm index 6a87ac9fc..945a732ef 100644 --- a/test/lib/BackRestTest/Common/ExecuteTest.pm +++ b/test/lib/BackRestTest/Common/ExecuteTest.pm @@ -20,6 +20,7 @@ use Symbol 'gensym'; use lib dirname($0) . '/../lib'; use BackRest::Common::Log; +use BackRest::Common::Wait; #################################################################################################################################### # Operation constants @@ -28,6 +29,7 @@ use constant OP_EXECUTE_TEST => 'ExecuteT use constant OP_EXECUTE_TEST_BEGIN => OP_EXECUTE_TEST . "->begin"; use constant OP_EXECUTE_TEST_END => OP_EXECUTE_TEST . "->end"; +use constant OP_EXECUTE_TEST_END_RETRY => OP_EXECUTE_TEST . "->endRetry"; use constant OP_EXECUTE_TEST_NEW => OP_EXECUTE_TEST . "->new"; #################################################################################################################################### @@ -66,6 +68,7 @@ sub new $self->{bSuppressStdErr} = defined($self->{bSuppressStdErr}) ? $self->{bSuppressStdErr} : false; $self->{bShowOutput} = defined($self->{bShowOutput}) ? $self->{bShowOutput} : false; $self->{iExpectedExitStatus} = defined($self->{iExpectedExitStatus}) ? $self->{iExpectedExitStatus} : 0; + $self->{iRetrySeconds} = defined($self->{iRetrySeconds}) ? $self->{iRetrySeconds} : undef; $self->{strUserBackRest} = 'backrest'; #BackRestTestCommon_UserBackRestGet(); $self->{strHost} = '127.0.0.1'; #BackRestTestCommon_HostGet(); @@ -125,9 +128,9 @@ sub begin } #################################################################################################################################### -# end +# endRetry #################################################################################################################################### -sub end +sub endRetry { my $self = shift; @@ -139,8 +142,8 @@ sub end ) = logDebugParam ( - OP_EXECUTE_TEST_END, \@_, - {name => 'strTest', required => false} + OP_EXECUTE_TEST_END_RETRY, \@_, + {name => 'strTest', required => false, trace => true} ); # Create select objects @@ -225,11 +228,19 @@ sub end } else { - confess &log(ERROR, "command '$self->{strCommand}' returned " . $iExitStatus . - ($self->{iExpectedExitStatus} != 0 ? ", but $self->{iExpectedExitStatus} was expected" : '') . "\n" . - ($self->{strOutLog} ne '' ? "STDOUT (last 10,000 characters):\n" . substr($self->{strOutLog}, - length($self->{strOutLog}) - 10000) : '') . - ($self->{strErrorLog} ne '' ? "STDERR:\n$self->{strErrorLog}" : '')); + if (defined($self->{iRetrySeconds})) + { + $self->{bRetry} = true; + return; + } + else + { + confess &log(ERROR, "command '$self->{strCommand}' returned " . $iExitStatus . + ($self->{iExpectedExitStatus} != 0 ? ", but $self->{iExpectedExitStatus} was expected" : '') . "\n" . + ($self->{strOutLog} ne '' ? "STDOUT (last 10,000 characters):\n" . substr($self->{strOutLog}, + length($self->{strOutLog}) - 10000) : '') . + ($self->{strErrorLog} ne '' ? "STDERR:\n$self->{strErrorLog}" : '')); + } } } @@ -251,6 +262,60 @@ sub end return $iExitStatus; } +#################################################################################################################################### +# end +#################################################################################################################################### +sub end +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strTest + ) = + logDebugParam + ( + OP_EXECUTE_TEST_END, \@_, + {name => 'strTest', required => false} + ); + + # If retry is not defined then run endRetry() one time + my $iExitStatus; + + if (!defined($self->{iRetrySeconds})) + { + $iExitStatus = $self->endRetry($strTest); + } + # Else loop until success or timeout + else + { + my $oWait = waitInit($self->{iRetrySeconds}); + + do + { + $self->{bRetry} = false; + $self->begin(); + $iExitStatus = $self->endRetry($strTest); + + if ($self->{bRetry}) + { + &log(TRACE, 'error executing statement - retry'); + } + } + while ($self->{bRetry} && waitMore($oWait)); + + if ($self->{bRetry}) + { + $self->begin(); + $iExitStatus = $self->endRetry($strTest); + } + } + + return $iExitStatus; +} + #################################################################################################################################### # executeTest #################################################################################################################################### diff --git a/test/lib/BackRestTest/Common/HostTest.pm b/test/lib/BackRestTest/Common/HostTest.pm new file mode 100644 index 000000000..33aff413b --- /dev/null +++ b/test/lib/BackRestTest/Common/HostTest.pm @@ -0,0 +1,224 @@ +#################################################################################################################################### +# HostTest.pm - Encapsulate a docker host for testing +#################################################################################################################################### +package BackRestTest::Common::HostTest; + +#################################################################################################################################### +# Perl includes +#################################################################################################################################### +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Cwd qw(abs_path); +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname); + +use lib dirname($0) . '/../lib'; +use BackRest::Common::Log; +use BackRest::Common::String; + +use BackRestTest::Common::ExecuteTest; + +#################################################################################################################################### +# Operation constants +#################################################################################################################################### +use constant OP_HOST_TEST => 'LogTest'; + +use constant OP_HOST_TEST_COPY_FROM => OP_HOST_TEST . "->copyFrom"; +use constant OP_HOST_TEST_COPY_TO => OP_HOST_TEST . "->copyTo"; +use constant OP_HOST_TEST_EXECUTE => OP_HOST_TEST . "->execute"; +use constant OP_HOST_TEST_EXECUTE_SIMPLE => OP_HOST_TEST . "->executeSimple"; +use constant OP_HOST_TEST_NEW => OP_HOST_TEST . "->new"; + +#################################################################################################################################### +# new +#################################################################################################################################### +sub new +{ + my $class = shift; # Class name + + # Create the class hash + my $self = {}; + bless $self, $class; + + # Assign function parameters, defaults, and log debug info + ( + my $strOperation, + $self->{strName}, + $self->{strImage}, + $self->{strUser}, + $self->{strOS}, + $self->{strMount} + ) = + logDebugParam + ( + OP_HOST_TEST_NEW, \@_, + {name => 'strName', trace => true}, + {name => 'strImage', trace => true}, + {name => 'strUser', trace => true}, + {name => 'strOS', trace => true}, + {name => 'strMount', trace => true} + ); + + executeTest("docker kill $self->{strName}", {bSuppressError => true}); + executeTest("docker rm $self->{strName}", {bSuppressError => true}); + + executeTest("rm -rf ~/data/$self->{strName}"); + executeTest("mkdir -p ~/data/$self->{strName}/etc"); + + executeTest("docker run -itd -h $self->{strName} --name=$self->{strName} " . + (defined($self->{strMount}) ? "-v $self->{strMount} " : '') . + "$self->{strImage}"); + + $self->{strIP} = trim(executeTest("docker inspect --format '\{\{ .NetworkSettings.IPAddress \}\}' $self->{strName}")); + $self->{bActive} = true; + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'self', value => $self, trace => true} + ); +} + +#################################################################################################################################### +# execute +#################################################################################################################################### +sub execute +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strCommand, + $oParam, + $strUser + ) = + logDebugParam + ( + OP_HOST_TEST_EXECUTE, \@_, + {name => 'strCommand'}, + {name => 'oParam', required=> false}, + {name => 'strUser', required => false} + ); + + # Set the user + if (!defined($strUser)) + { + $strUser = $self->{strUser}; + } + + my $oExec = new BackRestTest::Common::ExecuteTest( + 'docker exec ' . ($strUser eq 'root' ? "-u ${strUser} " : '') . "$self->{strName} ${strCommand}" , $oParam); + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'oExec', value => $oExec, trace => true} + ); +} + +#################################################################################################################################### +# executeSimple +#################################################################################################################################### +sub executeSimple +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strCommand, + $oParam, + $strUser + ) = + logDebugParam + ( + OP_HOST_TEST_EXECUTE_SIMPLE, \@_, + {name => 'strCommand', trace => true}, + {name => 'oParam', required=> false, trace => true}, + {name => 'strUser', required => false, trace => true} + ); + + my $oExec = $self->execute($strCommand, $oParam, $strUser); + $oExec->begin(); + $oExec->end(); + + return $oExec->{strOutLog}; +} + +#################################################################################################################################### +# copyTo +#################################################################################################################################### +sub copyTo +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strSource, + $strDestination, + $strOwner, + $strMode + ) = + logDebugParam + ( + OP_HOST_TEST_COPY_TO, \@_, + {name => 'strSource'}, + {name => 'strDestination'}, + {name => 'strOwner', required => false}, + {name => 'strMode', required => false} + ); + + executeTest("docker cp ${strSource} $self->{strName}:${strDestination}"); + + if (defined($strOwner)) + { + $self->executeSimple("chown ${strOwner} ${strDestination}", undef, 'root'); + } + + if (defined($strMode)) + { + $self->executeSimple("chmod ${strMode} ${strDestination}", undef, 'root'); + } + + # Return from function and log return values if any + return logDebugReturn($strOperation); +} + +#################################################################################################################################### +# copyFrom +#################################################################################################################################### +sub copyFrom +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strSource, + $strDestination + ) = + logDebugParam + ( + OP_HOST_TEST_COPY_FROM, \@_, + {name => 'strSource'}, + {name => 'strDestination'} + ); + + executeTest("docker cp $self->{strName}:${strSource} ${strDestination}"); + + # Return from function and log return values if any + return logDebugReturn($strOperation); +} + +1; diff --git a/test/lib/BackRestTest/Common/LogTest.pm b/test/lib/BackRestTest/Common/LogTest.pm index 9c7ed244e..012dd6c33 100644 --- a/test/lib/BackRestTest/Common/LogTest.pm +++ b/test/lib/BackRestTest/Common/LogTest.pm @@ -210,9 +210,12 @@ sub logWrite default => sprintf("log/$self->{strModule}-$self->{strTest}-%03d.log", $self->{iRun}), trace => true} ); + my $strReferenceLogFile = "${strBasePath}/test/${strFileName}"; + my $strTestLogFile; + if ($self->{bForce}) { - $strFileName = "${strBasePath}/test/${strFileName}"; + $strTestLogFile = $strReferenceLogFile; } else { @@ -224,17 +227,22 @@ sub logWrite confess "unable to create test log path ${strTestLogPath}"; } - $strFileName = "${strTestPath}/${strFileName}"; + $strTestLogFile = "${strTestPath}/${strFileName}"; } - open(my $hFile, '>', $strFileName) - or confess "could not open test log file '${strFileName}': $!"; + open(my $hFile, '>', $strTestLogFile) + or confess "could not open test log file '${strTestLogFile}': $!"; syswrite($hFile, $self->{strLog}) - or confess "could not write to test log file '${strFileName}': $!"; + or confess "could not write to test log file '${strTestLogFile}': $!"; close($hFile); + if (!$self->{bForce}) + { + executeTest("diff ${strReferenceLogFile} ${strTestLogFile}"); + } + # Return from function and log return values if any logDebugReturn($strOperation); } @@ -364,6 +372,10 @@ sub regExpReplaceAll "${strTimestampRegExp}\$", false); $strLine = $self->regExpReplace($strLine, 'CHECKSUM', 'checksum=[\"]{0,1}[0-f]{40}', '[0-f]{40}$', false); + $strLine = $self->regExpReplace($strLine, 'REMOTE-PROCESS-TERMINATED-MESSAGE', + 'remote process terminated: (ssh.*|no output from terminated process)$', + '(ssh.*|no output from terminated process)$', false); + return $strLine; } diff --git a/test/log/backup-archive-get-001.log b/test/log/backup-archive-get-001.log index b5554780a..5ff6f69ee 100644 --- a/test/log/backup-archive-get-001.log +++ b/test/log/backup-archive-get-001.log @@ -33,7 +33,7 @@ db-version="9.3" > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/backrest + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -52,7 +52,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-get-003.log b/test/log/backup-archive-get-003.log index 621ed27cd..bd4ccd8f2 100644 --- a/test/log/backup-archive-get-003.log +++ b/test/log/backup-archive-get-003.log @@ -33,7 +33,7 @@ db-version="9.3" > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/backrest + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -52,7 +52,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-get-005.log b/test/log/backup-archive-get-005.log index 5218e6b85..cfccfe3ba 100644 --- a/test/log/backup-archive-get-005.log +++ b/test/log/backup-archive-get-005.log @@ -34,7 +34,7 @@ db-version="9.3" > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/local + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -53,7 +53,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-get-007.log b/test/log/backup-archive-get-007.log index 00a71ca21..ea7d3406b 100644 --- a/test/log/backup-archive-get-007.log +++ b/test/log/backup-archive-get-007.log @@ -34,7 +34,7 @@ db-version="9.3" > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/local + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -53,7 +53,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-push-001.log b/test/log/backup-archive-push-001.log index efac9ec60..0a734556f 100644 --- a/test/log/backup-archive-push-001.log +++ b/test/log/backup-archive-push-001.log @@ -75,7 +75,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -95,7 +95,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start db (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-push-002.log b/test/log/backup-archive-push-002.log index 99b85e723..7f0877dd4 100644 --- a/test/log/backup-archive-push-002.log +++ b/test/log/backup-archive-push-002.log @@ -125,16 +125,16 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --force stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --force --repo-path=[TEST_PATH]/backrest + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --force --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest INFO: sent term signal to process [PROCESS-ID] DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false -> [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --no-fork --stanza=db archive-push --test --test-delay=1 --test-point=archive-push-async-start=y [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 +> [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --no-fork --stanza=db archive-push --test --test-delay=5 --test-point=archive-push-async-start=y [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ - INFO: archive-push start: --archive-async --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --db-path=[TEST_PATH]/db/common --log-level-console=debug --log-level-file=trace --no-fork --repo-path=[TEST_PATH]/backrest --repo-remote-path=[TEST_PATH]/backrest --stanza=db --test --test-delay=1 --test-point=archive-push-async-start=y + INFO: archive-push start: --archive-async --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --db-path=[TEST_PATH]/db/common --log-level-console=debug --log-level-file=trace --no-fork --repo-path=[TEST_PATH]/backrest --repo-remote-path=[TEST_PATH]/backrest --stanza=db --test --test-delay=5 --test-point=archive-push-async-start=y INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db @@ -170,7 +170,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-push-005.log b/test/log/backup-archive-push-005.log index 57909eb91..83dcb49bb 100644 --- a/test/log/backup-archive-push-005.log +++ b/test/log/backup-archive-push-005.log @@ -57,7 +57,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/local --stanza=db + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -79,7 +79,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start db (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local --stanza=db + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-push-006.log b/test/log/backup-archive-push-006.log index 34e2d18ea..c12e1531a 100644 --- a/test/log/backup-archive-push-006.log +++ b/test/log/backup-archive-push-006.log @@ -111,16 +111,16 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --force stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --force --repo-path=[TEST_PATH]/local + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --force --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local INFO: sent term signal to process [PROCESS-ID] DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false -> [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --no-fork --stanza=db archive-push --test --test-delay=1 --test-point=archive-push-async-start=y [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 +> [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --no-fork --stanza=db archive-push --test --test-delay=5 --test-point=archive-push-async-start=y [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ - INFO: archive-push start: --archive-async --backup-host=127.0.0.1 --backup-user=backrest --cmd-remote=[BACKREST_BIN] --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --db-path=[TEST_PATH]/db/common --log-level-console=debug --log-level-file=trace --no-fork --repo-path=[TEST_PATH]/local --repo-remote-path=[TEST_PATH]/backrest --stanza=db --test --test-delay=1 --test-point=archive-push-async-start=y + INFO: archive-push start: --archive-async --backup-host=127.0.0.1 --backup-user=backrest --cmd-remote=[BACKREST_BIN] --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --db-path=[TEST_PATH]/db/common --log-level-console=debug --log-level-file=trace --no-fork --repo-path=[TEST_PATH]/local --repo-remote-path=[TEST_PATH]/backrest --stanza=db --test --test-delay=5 --test-point=archive-push-async-start=y INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db @@ -156,7 +156,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false diff --git a/test/log/backup-archive-stop-001.log b/test/log/backup-archive-stop-001.log index 1252a1599..dc43c062a 100644 --- a/test/log/backup-archive-stop-001.log +++ b/test/log/backup-archive-stop-001.log @@ -7,6 +7,7 @@ run 001 - rmt 0, cmp 0, error version INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000001, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->pathCreate(): bIgnoreExists = true, strMode = <0750>, strPath = [TEST_PATH]/backrest/archive/db/out, strPathType = absolute DEBUG: File->exists(): strPath = [TEST_PATH]/backrest/archive/db/out, strPathType = absolute @@ -62,6 +63,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000002, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000002-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000002.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -94,6 +96,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000003, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000003-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000003.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -135,6 +138,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000005, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000005-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000005.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -217,6 +221,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000006, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000006-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000006.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING diff --git a/test/log/backup-archive-stop-002.log b/test/log/backup-archive-stop-002.log index 22ce1fbb7..45e10939f 100644 --- a/test/log/backup-archive-stop-002.log +++ b/test/log/backup-archive-stop-002.log @@ -7,6 +7,7 @@ run 002 - rmt 0, cmp 1, error version INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000001, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->pathCreate(): bIgnoreExists = true, strMode = <0750>, strPath = [TEST_PATH]/backrest/archive/db/out, strPathType = absolute DEBUG: File->exists(): strPath = [TEST_PATH]/backrest/archive/db/out, strPathType = absolute @@ -62,6 +63,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000002, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000002-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000002.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -94,6 +96,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000003, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000003-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000003.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -135,6 +138,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000005, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000005-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000005.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -217,6 +221,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/backrest> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000006, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000006-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/archive/db/out/000000010000000100000006.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING diff --git a/test/log/backup-archive-stop-003.log b/test/log/backup-archive-stop-003.log index 763d4207e..8a1bc58ea 100644 --- a/test/log/backup-archive-stop-003.log +++ b/test/log/backup-archive-stop-003.log @@ -7,6 +7,7 @@ run 003 - rmt 1, cmp 0, error version INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000001, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->pathCreate(): bIgnoreExists = true, strMode = <0750>, strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute DEBUG: File->exists(): strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute @@ -50,6 +51,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000002, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -81,6 +83,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000003, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -121,6 +124,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000005, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -173,6 +177,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000006, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING diff --git a/test/log/backup-archive-stop-004.log b/test/log/backup-archive-stop-004.log index 3edcd9a14..7d97f2e4f 100644 --- a/test/log/backup-archive-stop-004.log +++ b/test/log/backup-archive-stop-004.log @@ -7,6 +7,7 @@ run 004 - rmt 1, cmp 0, error connect INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000001, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->pathCreate(): bIgnoreExists = true, strMode = <0750>, strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute DEBUG: File->exists(): strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute @@ -50,6 +51,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000002, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -63,7 +65,7 @@ DEBUG: File->manifest(): oManifestHashRef = [hash], strPath = [TEST_PATH]/lo DEBUG: File->manifestRecurse(): iDepth = 0, oManifestHashRef = [hash], strPathFileOp = [undef], strPathOp = [TEST_PATH]/local/archive/db/out, strPathType = db:absolute DEBUG: Protocol::RemoteMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = [BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote, strHost = bogus, strUser = [USER-1] DEBUG: Protocol::CommonMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = ssh -o Compression=no -o PasswordAuthentication=no backrest@bogus '[BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote', strName = remote -ERROR: [124]: remote process terminated : ssh: Could not resolve hostname bogus: Name or service not known +ERROR: [124]: remote process terminated: [REMOTE-PROCESS-TERMINATED-MESSAGE] DEBUG: Exit::exitSafe(): iExitCode = 124, strSignal = [undef] INFO: archive-push stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -74,6 +76,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000003, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -87,7 +90,7 @@ DEBUG: File->manifest(): oManifestHashRef = [hash], strPath = [TEST_PATH]/lo DEBUG: File->manifestRecurse(): iDepth = 0, oManifestHashRef = [hash], strPathFileOp = [undef], strPathOp = [TEST_PATH]/local/archive/db/out, strPathType = db:absolute DEBUG: Protocol::RemoteMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = [BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote, strHost = bogus, strUser = [USER-1] DEBUG: Protocol::CommonMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = ssh -o Compression=no -o PasswordAuthentication=no backrest@bogus '[BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote', strName = remote -ERROR: [124]: remote process terminated : ssh: Could not resolve hostname bogus: Name or service not known +ERROR: [124]: remote process terminated: [REMOTE-PROCESS-TERMINATED-MESSAGE] ERROR: local archive queue has exceeded limit of 24MB - WAL segments will be discarded until the stop file ([TEST_PATH]/local/lock/db-archive.stop) is removed DEBUG: Exit::exitSafe(): iExitCode = 124, strSignal = [undef] INFO: archive-push stop @@ -107,6 +110,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000005, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -159,6 +163,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000006, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING diff --git a/test/log/backup-archive-stop-005.log b/test/log/backup-archive-stop-005.log index 0ec43af69..e14383552 100644 --- a/test/log/backup-archive-stop-005.log +++ b/test/log/backup-archive-stop-005.log @@ -7,6 +7,7 @@ run 005 - rmt 1, cmp 1, error version INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000001, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->pathCreate(): bIgnoreExists = true, strMode = <0750>, strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute DEBUG: File->exists(): strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute @@ -50,6 +51,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000002, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -81,6 +83,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000003, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -121,6 +124,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000005, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -173,6 +177,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000006, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING diff --git a/test/log/backup-archive-stop-006.log b/test/log/backup-archive-stop-006.log index 019feec7b..ddbf016e5 100644 --- a/test/log/backup-archive-stop-006.log +++ b/test/log/backup-archive-stop-006.log @@ -7,6 +7,7 @@ run 006 - rmt 1, cmp 1, error connect INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000001, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000001, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->pathCreate(): bIgnoreExists = true, strMode = <0750>, strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute DEBUG: File->exists(): strPath = [TEST_PATH]/local/archive/db/out, strPathType = absolute @@ -50,6 +51,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000002, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000002, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000002.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -63,7 +65,7 @@ DEBUG: File->manifest(): oManifestHashRef = [hash], strPath = [TEST_PATH]/lo DEBUG: File->manifestRecurse(): iDepth = 0, oManifestHashRef = [hash], strPathFileOp = [undef], strPathOp = [TEST_PATH]/local/archive/db/out, strPathType = db:absolute DEBUG: Protocol::RemoteMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = [BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote, strHost = bogus, strUser = [USER-1] DEBUG: Protocol::CommonMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = ssh -o Compression=no -o PasswordAuthentication=no backrest@bogus '[BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote', strName = remote -ERROR: [124]: remote process terminated : ssh: Could not resolve hostname bogus: Name or service not known +ERROR: [124]: remote process terminated: [REMOTE-PROCESS-TERMINATED-MESSAGE] DEBUG: Exit::exitSafe(): iExitCode = 124, strSignal = [undef] INFO: archive-push stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -74,6 +76,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000003, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000003, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000003.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -87,7 +90,7 @@ DEBUG: File->manifest(): oManifestHashRef = [hash], strPath = [TEST_PATH]/lo DEBUG: File->manifestRecurse(): iDepth = 0, oManifestHashRef = [hash], strPathFileOp = [undef], strPathOp = [TEST_PATH]/local/archive/db/out, strPathType = db:absolute DEBUG: Protocol::RemoteMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = [BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote, strHost = bogus, strUser = [USER-1] DEBUG: Protocol::CommonMaster->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1830, strCommand = ssh -o Compression=no -o PasswordAuthentication=no backrest@bogus '[BACKREST_BIN] --command=archive-push --config=[TEST_PATH]/backrest/pg_backrest.conf --db-port=[PORT-1] --db-socket-path=[TEST_PATH]/db --repo-remote-path=[TEST_PATH]/backrest --stanza=db remote', strName = remote -ERROR: [124]: remote process terminated : ssh: Could not resolve hostname bogus: Name or service not known +ERROR: [124]: remote process terminated: [REMOTE-PROCESS-TERMINATED-MESSAGE] ERROR: local archive queue has exceeded limit of 24MB - WAL segments will be discarded until the stop file ([TEST_PATH]/local/lock/db-archive.stop) is removed DEBUG: Exit::exitSafe(): iExitCode = 124, strSignal = [undef] INFO: archive-push stop @@ -107,6 +110,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000005, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000005, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000005.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING @@ -159,6 +163,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false INFO: push WAL segment [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 asynchronously DEBUG: Archive->pushProcess(): bAsync = true, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006 DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/local, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db +DEBUG: Common:::Lock::lockStopTest(): strRepoPath = <[TEST_PATH]/local> DEBUG: File->copy(): bAppendChecksum = true, bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = , bSourceCompressed = false, lModificationTime = [undef], strDestinationFile = 000000010000000100000006, strDestinationPathType = backup:archive:out, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/pg_xlog/000000010000000100000006, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006-1c7e00fd09b9dd11fc2966590b3e3274645dd031, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/local/archive/db/out/000000010000000100000006.tmp, strSourcePathType = absolute DEBUG: Archive->pushProcess: no fork on archive local for TESTING diff --git a/test/log/backup-expire-001.log b/test/log/backup-expire-001.log index 07a270236..b88b073fd 100644 --- a/test/log/backup-expire-001.log +++ b/test/log/backup-expire-001.log @@ -33,9 +33,8 @@ db-version="9.2" Nothing to expire > [BACKREST_BIN] "--config=[TEST_PATH]/backrest/pg_backrest.conf" --stanza=db --log-level-console=info --retention-full=1 --retention-diff=1 --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db - INFO: archive retention based on backup [BACKUP-FULL-1] - INFO: archive retention starts at 000000010000000000000000 + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db + INFO: archive retention from backup [BACKUP-FULL-1], start = 000000010000000000000000 INFO: no WAL segments to expire INFO: expire stop @@ -97,11 +96,10 @@ db-version="9.2" Expire oldest full backup, archive expire falls on segment major boundary > [BACKREST_BIN] "--config=[TEST_PATH]/backrest/pg_backrest.conf" --stanza=db --log-level-console=info --retention-full=1 --retention-diff=1 --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db - INFO: remove expired full backup: [BACKUP-FULL-1] - INFO: archive retention based on backup [BACKUP-FULL-2] - INFO: archive retention starts at 000000010000000100000000 - INFO: expired WAL segments: start = 0000000100000000, stop = 0000000100000000 + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db + INFO: remove expired full backup set: [BACKUP-FULL-1], [BACKUP-INCR-1] + INFO: archive retention from backup [BACKUP-FULL-2], start = 000000010000000100000000 + INFO: expire WAL segments: start = 0000000100000000, stop = 0000000100000000 INFO: expire stop + supplemental file: [TEST_PATH]/backrest/backup/db/backup.info @@ -165,10 +163,9 @@ db-version="9.2" Expire oldest diff backup > [BACKREST_BIN] "--config=[TEST_PATH]/backrest/pg_backrest.conf" --stanza=db --log-level-console=info --retention-full=1 --retention-diff=1 --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db - INFO: remove expired diff/incr backup [BACKUP-DIFF-1] - INFO: archive retention based on backup [BACKUP-FULL-2] - INFO: archive retention starts at 000000010000000100000000 + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db + INFO: remove expired diff backup [BACKUP-DIFF-1] + INFO: archive retention from backup [BACKUP-FULL-2], start = 000000010000000100000000 INFO: no WAL segments to expire INFO: expire stop @@ -242,11 +239,10 @@ db-version="9.2" Expire oldest full backup, archive expire does not fall on major segment boundary > [BACKREST_BIN] "--config=[TEST_PATH]/backrest/pg_backrest.conf" --stanza=db --log-level-console=info --retention-full=1 --retention-diff=1 --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db - INFO: remove expired full backup: [BACKUP-FULL-2] - INFO: archive retention based on backup [BACKUP-DIFF-3] - INFO: archive retention starts at 000000010000000200000016 - INFO: expired WAL segments: start = 0000000100000001, stop = 000000010000000200000015-0000000000000000000000000000000000000000.gz + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db + INFO: remove expired full backup set: [BACKUP-FULL-2], [BACKUP-DIFF-2] + INFO: archive retention from backup [BACKUP-DIFF-3], start = 000000010000000200000016 + INFO: expire WAL segments: start = 0000000100000001, stop = 000000010000000200000015 INFO: expire stop + supplemental file: [TEST_PATH]/backrest/backup/db/backup.info @@ -321,12 +317,10 @@ db-version="9.2" Expire oldest diff backup (cascade to incr) > [BACKREST_BIN] "--config=[TEST_PATH]/backrest/pg_backrest.conf" --stanza=db --log-level-console=info --retention-full=1 --retention-diff=1 --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db - INFO: remove expired diff/incr backup [BACKUP-INCR-2] - INFO: remove expired diff/incr backup [BACKUP-DIFF-3] - INFO: archive retention based on backup [BACKUP-DIFF-4] - INFO: archive retention starts at 00000001000000020000001E - INFO: expired WAL segments: start = 000000010000000200000016-0000000000000000000000000000000000000000.gz, stop = 00000001000000020000001D-0000000000000000000000000000000000000000.gz + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db + INFO: remove expired diff backup set: [BACKUP-DIFF-3], [BACKUP-INCR-2] + INFO: archive retention from backup [BACKUP-DIFF-4], start = 00000001000000020000001E + INFO: expire WAL segments: start = 000000010000000200000016, stop = 00000001000000020000001D INFO: expire stop + supplemental file: [TEST_PATH]/backrest/backup/db/backup.info @@ -401,10 +395,9 @@ db-version="9.2" Expire archive based on newest incr backup > [BACKREST_BIN] "--config=[TEST_PATH]/backrest/pg_backrest.conf" --stanza=db --log-level-console=info --retention-full=1 --retention-diff=1 --retention-archive-type=incr --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=incr --retention-diff=1 --retention-full=1 --stanza=db - INFO: archive retention based on backup [BACKUP-INCR-3] - INFO: archive retention starts at 000000010000000200000024 - INFO: expired WAL segments: start = 00000001000000020000001E-0000000000000000000000000000000000000000.gz, stop = 000000010000000200000023-0000000000000000000000000000000000000000.gz + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=info --log-level-file=trace --repo-path=[TEST_PATH]/backrest --retention-archive=1 --retention-archive-type=incr --retention-diff=1 --retention-full=1 --stanza=db + INFO: archive retention from backup [BACKUP-INCR-3], start = 000000010000000200000024 + INFO: expire WAL segments: start = 00000001000000020000001E, stop = 000000010000000200000023 INFO: expire stop + supplemental file: [TEST_PATH]/backrest/backup/db/backup.info diff --git a/test/log/backup-synthetic-001.log b/test/log/backup-synthetic-001.log index 0784f38ba..0485ebac7 100644 --- a/test/log/backup-synthetic-001.log +++ b/test/log/backup-synthetic-001.log @@ -36,7 +36,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -59,7 +58,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -162,7 +161,7 @@ db-version="9.3" > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --force stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --force --repo-path=[TEST_PATH]/backrest + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --force --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest INFO: sent term signal to process [PROCESS-ID] DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] @@ -204,7 +203,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Exit::exitSafe(): iExitCode = -1, strSignal = TERM INFO: backup stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -223,14 +221,14 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db WARN: stop file already exists for stanza db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop @@ -250,7 +248,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start db (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -258,7 +256,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -266,7 +264,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest WARN: stop file does not exist DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop @@ -391,16 +389,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/link-test, file.tmp) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, file.tmp) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION DEBUG: Backup->processManifest(): bCompress = false, bHardLink = false, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = false, strFile = base/global/pg_control, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -420,7 +416,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -772,7 +768,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -966,7 +962,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1166,7 +1162,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1367,7 +1363,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1747,7 +1743,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1930,7 +1926,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2129,7 +2125,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2311,7 +2307,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2507,7 +2503,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2673,7 +2669,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -2707,7 +2702,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2898,7 +2893,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-002.log b/test/log/backup-synthetic-002.log index e8f62c80f..72a5fc824 100644 --- a/test/log/backup-synthetic-002.log +++ b/test/log/backup-synthetic-002.log @@ -36,7 +36,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -59,7 +58,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -280,16 +279,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/link-test, file.tmp) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, file.tmp) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION DEBUG: Backup->processManifest(): bCompress = false, bHardLink = true, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = false, strFile = base/global/pg_control, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -309,7 +306,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -641,7 +638,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -672,7 +668,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -840,8 +836,7 @@ DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPathFileOp = tablespace, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = tablespace/1, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/base/base1.txt, base/global/pg_control, base/link-test) -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/base/base1.txt, base/global/pg_control) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/base/base1.txt DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION @@ -850,7 +845,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -889,7 +883,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1063,7 +1057,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1102,7 +1095,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1277,7 +1270,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1316,7 +1308,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1674,7 +1666,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1708,7 +1699,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1874,7 +1865,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1908,7 +1898,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2076,7 +2066,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2113,7 +2102,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2283,7 +2272,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2317,7 +2305,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2489,7 +2477,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2522,7 +2509,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2689,7 +2676,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -2723,7 +2709,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2897,7 +2883,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-3] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-3]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2931,7 +2916,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-003.log b/test/log/backup-synthetic-003.log index 8df81ec78..dd0498a2d 100644 --- a/test/log/backup-synthetic-003.log +++ b/test/log/backup-synthetic-003.log @@ -36,7 +36,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control.gz, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -59,7 +58,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -278,16 +277,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/link-test, file.tmp.gz) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, file.tmp.gz) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp.gz -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION.gz DEBUG: Backup->processManifest(): bCompress = true, bHardLink = false, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = true, strFile = base/global/pg_control.gz, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -307,7 +304,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -658,7 +655,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -851,7 +848,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1050,7 +1047,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1250,7 +1247,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1629,7 +1626,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1811,7 +1808,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2009,7 +2006,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2190,7 +2187,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2385,7 +2382,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2550,7 +2547,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -2584,7 +2580,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2774,7 +2770,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-004.log b/test/log/backup-synthetic-004.log index 870cc601a..f0cff037e 100644 --- a/test/log/backup-synthetic-004.log +++ b/test/log/backup-synthetic-004.log @@ -36,7 +36,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control.gz, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -59,7 +58,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -279,16 +278,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/link-test, file.tmp.gz) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, file.tmp.gz) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp.gz -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION.gz DEBUG: Backup->processManifest(): bCompress = true, bHardLink = true, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = true, strFile = base/global/pg_control.gz, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -308,7 +305,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -639,7 +636,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -670,7 +666,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -837,8 +833,7 @@ DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPathFileOp = tablespace, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = tablespace/1, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/base/base1.txt.gz, base/global/pg_control.gz, base/link-test) -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/base/base1.txt.gz, base/global/pg_control.gz) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control.gz DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/base/base1.txt.gz DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION.gz @@ -847,7 +842,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -886,7 +880,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1059,7 +1053,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1098,7 +1091,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1272,7 +1265,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1311,7 +1303,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1668,7 +1660,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1702,7 +1693,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1867,7 +1858,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1901,7 +1891,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2068,7 +2058,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2105,7 +2094,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2274,7 +2263,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2308,7 +2296,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2479,7 +2467,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2512,7 +2499,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2678,7 +2665,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -2712,7 +2698,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2885,7 +2871,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-3] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-3]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2919,7 +2904,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = none, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-005.log b/test/log/backup-synthetic-005.log index 301b02369..3a4e69094 100644 --- a/test/log/backup-synthetic-005.log +++ b/test/log/backup-synthetic-005.log @@ -32,7 +32,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -55,7 +54,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -193,7 +192,7 @@ db-version="9.3" > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --force stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --force --repo-path=[TEST_PATH]/local + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --force --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local INFO: sent term signal to process [PROCESS-ID] DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] @@ -231,9 +230,8 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] -ERROR: [138]: remote process terminated : ERROR [138]: process terminated on a TERM signal +ERROR: [138]: remote process terminated: ERROR [138]: process terminated on a TERM signal DEBUG: Exit::exitSafe(): iExitCode = 138, strSignal = [undef] INFO: backup stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -255,21 +253,21 @@ DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup DEBUG: Backup->typeFind(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db, strType = full DEBUG: Backup->typeFind=>: strLabel = [undef] DEBUG: Db->info(): oFile = [object], strDbPath = [TEST_PATH]/db/common -ERROR: [137]: remote process terminated : ERROR [137]: stop file exists for all stanzas +ERROR: [137]: remote process terminated: ERROR [137]: stop file exists for all stanzas DEBUG: Exit::exitSafe(): iExitCode = 137, strSignal = [undef] INFO: backup stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/local --stanza=db + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --repo-path=[TEST_PATH]/local --stanza=db + INFO: stop start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local --stanza=db WARN: stop file already exists for stanza db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: stop stop @@ -292,7 +290,7 @@ DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup DEBUG: Backup->typeFind(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db, strType = full DEBUG: Backup->typeFind=>: strLabel = [undef] DEBUG: Db->info(): oFile = [object], strDbPath = [TEST_PATH]/db/common -ERROR: [137]: remote process terminated : ERROR [137]: stop file exists for stanza db +ERROR: [137]: remote process terminated: ERROR [137]: stop file exists for stanza db DEBUG: Exit::exitSafe(): iExitCode = 137, strSignal = [undef] INFO: backup stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -300,7 +298,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start db (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf --stanza=db start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local --stanza=db + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local --stanza=db DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -308,7 +306,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -316,7 +314,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (local) > [BACKREST_BIN] --config=[TEST_PATH]/db/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/local + INFO: start start: --config=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/local WARN: stop file does not exist DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop @@ -324,7 +322,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false > [BACKREST_BIN] --config=[TEST_PATH]/backrest/pg_backrest.conf --force stop ------------------------------------------------------------------------------------------------------------------------------------ - INFO: stop start: --force --repo-path=[TEST_PATH]/backrest + INFO: stop start: --config=[TEST_PATH]/backrest/pg_backrest.conf --force --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest INFO: sent term signal to process [PROCESS-ID] DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] @@ -363,15 +361,13 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/link-test, file.tmp) +DEBUG: Backup->fileNotInManifest=>: stryFile = (file.tmp) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->processManifest(): bCompress = false, bHardLink = false, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Exit::exitSafe(): iExitCode = -1, strSignal = TERM INFO: backup stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -391,7 +387,7 @@ DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false start (remote) > [BACKREST_BIN] --config=[TEST_PATH]/backrest/pg_backrest.conf start ------------------------------------------------------------------------------------------------------------------------------------ - INFO: start start: --repo-path=[TEST_PATH]/backrest + INFO: start start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest DEBUG: Exit::exitSafe(): iExitCode = 0, strSignal = [undef] INFO: start stop DEBUG: Common:::Lock::lockRelease(): bFailOnNoLock = false @@ -507,16 +503,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/link-test, file.tmp) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, file.tmp) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION DEBUG: Backup->processManifest(): bCompress = false, bHardLink = false, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = false, strFile = base/global/pg_control, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -536,7 +530,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -928,7 +922,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1151,7 +1145,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1380,7 +1374,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1610,7 +1604,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2028,7 +2022,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2235,7 +2229,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2458,7 +2452,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2664,7 +2658,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2884,7 +2878,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -3074,7 +3068,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -3108,7 +3101,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -3323,7 +3316,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-006.log b/test/log/backup-synthetic-006.log index 31405476a..407b10fad 100644 --- a/test/log/backup-synthetic-006.log +++ b/test/log/backup-synthetic-006.log @@ -32,7 +32,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -55,7 +54,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -303,16 +302,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/link-test, file.tmp) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, file.tmp) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION DEBUG: Backup->processManifest(): bCompress = false, bHardLink = true, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = false, strFile = base/global/pg_control, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -332,7 +329,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -704,7 +701,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -735,7 +731,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -932,8 +928,7 @@ DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPathFileOp = tablespace, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = tablespace/1, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/base/base1.txt, base/global/pg_control, base/link-test) -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION, base/base/base1.txt, base/global/pg_control) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/base/base1.txt DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION @@ -942,7 +937,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -981,7 +975,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1184,7 +1178,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1223,7 +1216,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1427,7 +1420,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1466,7 +1458,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1862,7 +1854,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1896,7 +1887,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2086,7 +2077,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2120,7 +2110,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2312,7 +2302,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2349,7 +2338,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2543,7 +2532,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2577,7 +2565,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2773,7 +2761,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2806,7 +2793,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2997,7 +2984,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = false, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -3031,7 +3017,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -3229,7 +3215,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-3] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-3]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -3263,7 +3248,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --no-compress --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --no-compress --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-007.log b/test/log/backup-synthetic-007.log index 63a64c337..105df9073 100644 --- a/test/log/backup-synthetic-007.log +++ b/test/log/backup-synthetic-007.log @@ -32,7 +32,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control.gz, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -55,7 +54,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -300,16 +299,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/link-test, file.tmp.gz) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, file.tmp.gz) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp.gz -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION.gz DEBUG: Backup->processManifest(): bCompress = true, bHardLink = false, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = true, strFile = base/global/pg_control.gz, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -329,7 +326,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -719,7 +716,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -940,7 +937,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1167,7 +1164,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1395,7 +1392,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1811,7 +1808,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2016,7 +2013,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2237,7 +2234,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2441,7 +2438,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2659,7 +2656,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2847,7 +2844,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -2881,7 +2877,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -3094,7 +3090,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/log/backup-synthetic-008.log b/test/log/backup-synthetic-008.log index 1491ed081..719fd95f0 100644 --- a/test/log/backup-synthetic-008.log +++ b/test/log/backup-synthetic-008.log @@ -32,7 +32,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] DEBUG: File->move(): bDestinationPathCreate = true, strDestinationFile = [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control.gz, strDestinationPathType = absolute, strSourceFile = [TEST_PATH]/backrest/temp/db.tmp/file.tmp, strSourcePathType = absolute INFO: backup file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -55,7 +54,7 @@ DEBUG: File->remove=>: bRemoved = false DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -301,16 +300,14 @@ DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/base, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/global, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/link-test, file.tmp.gz) +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, file.tmp.gz) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/file.tmp.gz -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION.gz DEBUG: Backup->processManifest(): bCompress = true, bHardLink = true, oBackupManifest = [object], strType = full DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/base, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->hashSize(): bCompressed = true, strFile = base/global/pg_control.gz, strHashType = , strPathType = backup:tmp DEBUG: File->hashSize=>: iSize = 8192, strHash = 56fe5780b8dca9705e0c22032a83828860a21235 INFO: checksum resumed file [TEST_PATH]/db/common/global/pg_control (8KB, 99%) checksum 56fe5780b8dca9705e0c22032a83828860a21235 @@ -330,7 +327,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -700,7 +697,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -731,7 +727,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -926,8 +922,7 @@ DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPa DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = base/path-test, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 1, oManifestHashRef = [hash], strPathFileOp = tablespace, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp DEBUG: File->manifestRecurse(): iDepth = 2, oManifestHashRef = [hash], strPathFileOp = tablespace/1, strPathOp = [TEST_PATH]/backrest/temp/db.tmp, strPathType = backup:tmp -DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/base/base1.txt.gz, base/global/pg_control.gz, base/link-test) -DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/link-test +DEBUG: Backup->fileNotInManifest=>: stryFile = (base/PG_VERSION.gz, base/base/base1.txt.gz, base/global/pg_control.gz) DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/global/pg_control.gz DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/base/base1.txt.gz DEBUG: Backup->tmpClean: remove file [TEST_PATH]/backrest/temp/db.tmp/base/PG_VERSION.gz @@ -936,7 +931,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -975,7 +969,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1176,7 +1170,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1215,7 +1208,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-1], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1417,7 +1410,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1456,7 +1448,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-2], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -1850,7 +1842,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -1884,7 +1875,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2072,7 +2063,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2106,7 +2096,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2296,7 +2286,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2333,7 +2322,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2525,7 +2514,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2559,7 +2547,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-INCR-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2753,7 +2741,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-2] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-2]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -2786,7 +2773,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-4], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -2975,7 +2962,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: File->linkCreate(): bHard = false, bPathCreate = true, bRelative = true, strDestinationFile = base/pg_tblspc/2, strDestinationPathType = backup:tmp, strSourceFile = tablespace/2, strSourcePathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base/pg_tblspc, strPathType = backup:absolute DEBUG: File->copy(): bAppendChecksum = , bDestinationCompress = true, bDestinationPathCreate = true, bIgnoreMissingSource = true, bSourceCompressed = false, lModificationTime = [MODIFICATION-TIME-1], strDestinationFile = base/global/pg_control.gz, strDestinationPathType = backup:tmp, strGroup = [undef], strMode = <0640>, strSourceFile = [TEST_PATH]/db/common-2/global/pg_control, strSourcePathType = db:absolute, strUser = [undef] @@ -3009,7 +2995,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-FULL-3], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired @@ -3205,7 +3191,6 @@ DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPat DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/global, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/path-test, strPathType = backup:tmp DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = base/pg_tblspc, strPathType = backup:tmp -DEBUG: File->linkCreate(): bHard = false, bPathCreate = false, bRelative = false, strDestinationFile = base/link-test, strDestinationPathType = backup:tmp, strSourceFile = /test, strSourcePathType = backup:absolute DEBUG: Backup->processManifest: hardlink [TEST_PATH]/db/common-2/PG_VERSION to [BACKUP-FULL-3] DEBUG: File->linkCreate(): bHard = true, bPathCreate = true, bRelative = false, strDestinationFile = base/PG_VERSION, strDestinationPathType = backup:tmp, strSourceFile = [BACKUP-FULL-3]/base/PG_VERSION, strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/temp/db.tmp/base, strPathType = backup:absolute @@ -3239,7 +3224,7 @@ DEBUG: File->remove=>: bRemoved = true DEBUG: File->linkCreate(): bHard = , bPathCreate = , bRelative = true, strDestinationFile = latest, strDestinationPathType = backup:cluster, strSourceFile = [BACKUP-DIFF-5], strSourcePathType = backup:cluster DEBUG: File->pathCreate(): bIgnoreExists = , strMode = <0750>, strPath = [TEST_PATH]/backrest/backup/db, strPathType = backup:absolute INFO: backup stop - INFO: expire start: --config-remote=[TEST_PATH]/db/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db + INFO: expire start: --config=[TEST_PATH]/backrest/pg_backrest.conf --log-level-console=debug --log-level-file=trace --repo-path=[TEST_PATH]/backrest --stanza=db DEBUG: File->new(): iThreadIdx = [undef], oProtocol = [object], strBackupPath = [TEST_PATH]/backrest, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strRemote = db, strStanza = db DEBUG: BackupInfo->new(): strBackupClusterPath = [TEST_PATH]/backrest/backup/db INFO: archive retention type not set - archive logs will not be expired diff --git a/test/vm/Vagrantfile b/test/vm/Vagrantfile index af8293d1b..773a7862f 100644 --- a/test/vm/Vagrantfile +++ b/test/vm/Vagrantfile @@ -36,7 +36,7 @@ Vagrant.configure(2) do |config| /backrest/test/vm/ssh/setup-cm.sh # Install required Perl modules - apt-get install libdbi-perl libdbd-pg-perl + apt-get install -y libdbi-perl libdbd-pg-perl # Install Perl modules required for building the docs apt-get install -y libxml-checker-perl libxml-writer-perl @@ -82,6 +82,59 @@ Vagrant.configure(2) do |config| SHELL end + config.vm.define "u14doc" do |u14doc| + u14doc.vm.box = "boxcutter/ubuntu1404" + + u14doc.vm.provider :virtualbox do |vb| + vb.name = "backrest-doc-test-ubuntu-14.04" + end + + # Provision the VM + u14doc.vm.provision "shell", inline: <<-SHELL + # Install docker + apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D + echo 'deb https://apt.dockerproject.org/repo ubuntu-trusty main' > /etc/apt/sources.list.d/docker.list + sudo apt-get update + sudo apt-get -y install linux-image-extra-$(uname -r) + sudo apt-get -y install docker-engine + sudo usermod -aG docker vagrant + + # This requires a reboot - maybe don't do it - see how it goes first + # sed -i 's/^GRUB_CMDLINE_LINUX\=.*$/GRUB_CMDLINE_LINUX\=\"cgroup_enable=memory swapaccount=1\"/' /etc/default/grub + + # Install Perl modules + apt-get install -y libxml-checker-perl ghostscript + + # Install texlive + mkdir /root/texlive + wget -q -O - http://mirror.hmc.edu/ctan/systems/texlive/tlnet/install-tl-unx.tar.gz | tar zxv -C /root//texlive --strip-components=1 + echo "collection-basic 1" >> /root/texlive/texlive.profile + echo "collection-latex 1" >> /root/texlive/texlive.profile + /root/texlive/install-tl -profile=/root/texlive/texlive.profile + + echo 'PATH=/usr/local/texlive/2015/bin/x86_64-linux:$PATH' >> /etc/profile + echo 'export PATH' >> /etc/profile + + /usr/local/texlive/2015/bin/x86_64-linux/tlmgr install caption xcolor listings parskip helvetic ltablex titlesec \ + epstopdf courier + + # Build images + docker build -f /backrest/test/vm/docker/u14-base -t vagrant/u14-base /backrest/test/vm + docker build -f /backrest/test/vm/docker/u14-db -t vagrant/u14-db /backrest/test/vm + docker build -f /backrest/test/vm/docker/u14-backup -t vagrant/u14-backup /backrest/test/vm + + docker build -f /backrest/test/vm/docker/co6-base -t vagrant/co6-base /backrest/test/vm + docker build -f /backrest/test/vm/docker/co6-db -t vagrant/co6-db /backrest/test/vm + docker build -f /backrest/test/vm/docker/co6-backup -t vagrant/co6-backup /backrest/test/vm + + # Sample docker commands + # docker inspect --format '{{ .NetworkSettings.IPAddress }}' db-master + # docker run -itd --name=db-master -v /backrest:/backrest vagrant/u14-db + # docker run -itd --name=backup -v /backrest:/backrest vagrant/u14-backup + # docker exec -it db-master bash + SHELL + end + config.vm.define "co6" do |co6| co6.vm.box = "boxcutter/centos67" diff --git a/test/vm/docker/co6-backup b/test/vm/docker/co6-backup new file mode 100644 index 000000000..fb3c78b7c --- /dev/null +++ b/test/vm/docker/co6-backup @@ -0,0 +1,19 @@ +# CentOS 6 Backup Container +FROM vagrant/co6-base + +# Create backrest user +RUN adduser -gpostgres -u5002 -n backrest + +# Setup SSH +RUN mkdir /home/backrest/.ssh +RUN cp -p /root/resource/.ssh/* /home/backrest/.ssh +RUN chown -R backrest:postgres /home/backrest +RUN chmod 700 /home/backrest/.ssh + +# Setup repository +RUN mkdir /var/lib/backrest +RUN chown -R backrest:postgres /var/lib/backrest +RUN chmod 750 /var/lib/backrest + +# Install Perl packages +RUN yum -y install perl perl-Time-HiRes perl-parent perl-JSON perl-Digest-SHA perl-DBD-Pg diff --git a/test/vm/docker/co6-base b/test/vm/docker/co6-base new file mode 100644 index 000000000..2a1eaded0 --- /dev/null +++ b/test/vm/docker/co6-base @@ -0,0 +1,31 @@ +# CentOS 6 Base Container +FROM centos:6.7 + +# Install SSH +RUN yum -y install openssh-server openssh-clients + +# Create postgres user and group +RUN groupadd -g5000 postgres +RUN adduser -gpostgres -u5000 -n postgres + +# Add Postgres packages +RUN rpm -ivh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm + +# Create vagrant user +RUN groupadd -g5001 admin +RUN adduser -gadmin -u5001 -n vagrant + +# Install sudo and add admin to sudoers +RUN yum -y install sudo +RUN echo '%admin ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/vagrant +RUN sed -i 's/^Defaults requiretty$/\# Defaults requiretty/' /etc/sudoers + +# Copy trusted SSH setup +COPY ssh/config /root/resource/.ssh/config +COPY ssh/id_rsa /root/resource/.ssh/id_rsa +COPY ssh/id_rsa.pub /root/resource/.ssh/authorized_keys +RUN chmod 700 /root/resource/.ssh +RUN chmod 600 /root/resource/.ssh/* + +# Start SSH when container starts +ENTRYPOINT service sshd restart && bash diff --git a/test/vm/docker/co6-db b/test/vm/docker/co6-db new file mode 100644 index 000000000..184026097 --- /dev/null +++ b/test/vm/docker/co6-db @@ -0,0 +1,16 @@ +# CentOS 6 Database Container +FROM vagrant/co6-base + +# Install Postgres +RUN yum -y install postgresql94-server + +# Create pg_backrest.conf +RUN touch /etc/pg_backrest.conf +RUN chmod 640 /etc/pg_backrest.conf +RUN chown postgres:postgres /etc/pg_backrest.conf + +# Setup SSH +RUN mkdir /home/postgres/.ssh +RUN cp /root/resource/.ssh/* /home/postgres/.ssh +RUN chown -R postgres:postgres /home/postgres/.ssh +RUN chmod 700 /home/postgres/.ssh diff --git a/test/vm/docker/u14-backup b/test/vm/docker/u14-backup new file mode 100644 index 000000000..5a374f41b --- /dev/null +++ b/test/vm/docker/u14-backup @@ -0,0 +1,19 @@ +# Ubuntu 14.04 Backup Container +FROM vagrant/u14-base + +# Create backrest user +RUN adduser --ingroup=postgres --disabled-password --gecos "" backrest + +# Setup SSH +RUN mkdir -p /home/backrest/.ssh +RUN cp /root/resource/.ssh/* /home/backrest/.ssh +RUN chown -R backrest:postgres /home/backrest/.ssh +RUN chmod 700 /home/backrest/.ssh + +# Setup repository +RUN mkdir /var/lib/backrest +RUN chown backrest:postgres /var/lib/backrest +RUN chmod 750 /var/lib/backrest + +# Install Perl packages +RUN apt-get -y install libdbd-pg-perl libdbi-perl libnet-daemon-perl libplrpc-perl diff --git a/test/vm/docker/u14-base b/test/vm/docker/u14-base new file mode 100644 index 000000000..451e3d2f6 --- /dev/null +++ b/test/vm/docker/u14-base @@ -0,0 +1,41 @@ +# Ubuntu 14.04 Base Container +FROM ubuntu:14.04 + +# Get packages that make up apt-get download +# apt-get -dy install ??? --print-uris -qq | sed -n "s/'\([^ ]\+\)' \([^ ]\+\) \([^ ]\+\) MD5Sum:\([^ ]\+\)/wget -c \1/p" + +# Install SSH +RUN apt-get -y install openssh-server + +# Create postgres user and group +RUN groupadd -g5000 postgres +RUN adduser --ingroup=postgres --disabled-password --gecos "" postgres + +# Add Postgres packages +RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main 9.5' >> /etc/apt/sources.list.d/pgdg.list +RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - +RUN sudo apt-get update + +# Create vagrant user +RUN addgroup admin +RUN adduser --ingroup=admin --disabled-password --gecos "" vagrant +RUN sed -i 's/^\%admin.*$/\%admin ALL\=\(ALL\) NOPASSWD\: ALL/' /etc/sudoers + +# Suppress dpkg interactive output +RUN rm /etc/apt/apt.conf.d/70debconf + +# Download Perl packages to be installed later +RUN apt-get -dy install libdbd-pg-perl libdbi-perl libnet-daemon-perl libplrpc-perl libpq5 + +# Download Postgres packages to be installed later +RUN apt-get -dy install postgresql-9.4 + +# Copy trusted SSH setup +COPY ssh/config /root/resource/.ssh/config +COPY ssh/id_rsa /root/resource/.ssh/id_rsa +COPY ssh/id_rsa.pub /root/resource/.ssh/authorized_keys +RUN chmod 700 /root/resource/.ssh +RUN chmod 600 /root/resource/.ssh/* + +# Start SSH when container starts +ENTRYPOINT service ssh restart && bash diff --git a/test/vm/docker/u14-db b/test/vm/docker/u14-db new file mode 100644 index 000000000..865e3fb8a --- /dev/null +++ b/test/vm/docker/u14-db @@ -0,0 +1,17 @@ +# Ubuntu 14.04 Database Container +FROM vagrant/u14-base + +# Install Postgres +RUN apt-get install -y postgresql-9.4 +RUN pg_dropcluster --stop 9.4 main + +# Create pg_backrest.conf +RUN touch /etc/pg_backrest.conf +RUN chmod 640 /etc/pg_backrest.conf +RUN chown postgres:postgres /etc/pg_backrest.conf + +# Setup SSH +RUN mkdir /home/postgres/.ssh +RUN cp /root/resource/.ssh/* /home/postgres/.ssh +RUN chown -R postgres:postgres /home/postgres/.ssh +RUN chmod 700 /home/postgres/.ssh diff --git a/test/vm/ssh/config b/test/vm/ssh/config index f30d239b6..c33ac8420 100644 --- a/test/vm/ssh/config +++ b/test/vm/ssh/config @@ -1,2 +1,3 @@ Host * StrictHostKeyChecking no + LogLevel quiet