From 88c9592b0861abd1547489fbb636108e44d21a1f Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Wed, 11 Mar 2026 17:51:41 +0100 Subject: [PATCH 01/14] argument 'wcol' is vectorized in gentlg() --- R/gentlg.R | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/R/gentlg.R b/R/gentlg.R index 1c9fe00..db05868 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -241,6 +241,23 @@ gentlg <- function(huxme = NULL, stopifnot("Each item of `alignments` must be a list" = is.list(alignment)) } + # if wcol is a list, then huxme must be a list with same length, + # and wcol[[i]] must be a vector with as many numeric values + # as number of columns in huxme[[i]] + if (is.list(wcol)) { + stopifnot(is.list(huxme)) + stopifnot(length(huxme) == length(wcol)) + # the following checks are also made inside gentlg_single() + formatcolumns <- c( + "anbr", "roworder", "boldme", "indentme", "newrows", "newpage", + "rowvar", "row_type", "nested_level", "group_level" + ) + for (i in seq_along(wcol)) { + stopifnot(is.numeric(wcol[[i]])) + stopifnot(length(wcol[[i]]) == length(dplyr::setdiff(colnames(huxme[[i]]), formatcolumns))) + } + } + adjfilename <- stringr::str_replace_all( stringr::str_to_lower(file), "(-|_)", "" @@ -332,6 +349,10 @@ gentlg <- function(huxme = NULL, alignments <- list(alignments) } + if (!is.list(wcol)) { + wcol <- list(wcol) + } + hts <- mapply( function(ht, colspan, @@ -343,7 +364,8 @@ gentlg <- function(huxme = NULL, bottom_borders, border_fns, alignments, - index) { + index, + wcol_i) { gentlg_single( huxme = ht, tlf = tlf, @@ -353,7 +375,7 @@ gentlg <- function(huxme = NULL, plotnames = plotnames, plotwidth = plotwidth, plotheight = plotheight, - wcol = wcol, + wcol = wcol_i, orientation = orientation, opath = opath, title_file = title_file, @@ -381,6 +403,7 @@ gentlg <- function(huxme = NULL, border_fns, alignments, seq_len(length(huxme)), + wcol, SIMPLIFY = FALSE ) From 9d82675b1b84f3f81e7a2a32220f1f6f2f21e630 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Thu, 12 Mar 2026 11:41:41 +0100 Subject: [PATCH 02/14] updated roxygen documentation and NEWS.md --- NEWS.md | 1 + R/gentlg.R | 9 ++++++--- inst/WORDLIST | 5 +++++ man/gentlg.Rd | 11 ++++++++--- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/NEWS.md b/NEWS.md index 2a61ca0..df92751 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ - Exported functions `get_file_name()` and `insert_empty_rows()`. - Updated `gentlg_single()` to replace, in the first column of tables/listings headers, every leading whitespace with 90 twips (0.0625 inches) left-indentation RTF markup. +- `gentlg()` argument wcol allows now for vectorized colwidths. # tidytlg 0.11.0 diff --git a/R/gentlg.R b/R/gentlg.R index db05868..416f8dd 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -34,9 +34,12 @@ #' cm for figure outputs. (Default = 6) #' @param plotheight (optional) Numerical value that indicates the plot height #' in cm for figure outputs. (Default = 5) -#' @param wcol (optional) Can be a single numerical value that represents the -#' width of the first column or a vector, specifying the lengths of all columns -#' in the final table or listing.\cr +#' @param wcol (optional) Can be one of: +#' - a single numerical value that represents the width of the first column +#' - a vector, specifying the widths of all columns in the final table or listing +#' - a list of vectors (applicable when huxme is a list), specifying +#' the widths of all columns for each element in huxme\cr +#' #' When a single numerical value is used, this will be taken as the column width #' for the first column. The other columns will be equally spaced across the #' remainder of the available space. Alternatively, a vector can be used to diff --git a/inst/WORDLIST b/inst/WORDLIST index 5e6903d..d5b8029 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -16,6 +16,9 @@ envsetup funder getFileName haesendonckx +colwidths +envsetup +funder hardcoded huxtable jnj @@ -26,3 +29,5 @@ shaesen tidyverse twips vectorized +vectorized +wcol diff --git a/man/gentlg.Rd b/man/gentlg.Rd index 3ecd12e..256d299 100644 --- a/man/gentlg.Rd +++ b/man/gentlg.Rd @@ -64,9 +64,14 @@ cm for figure outputs. (Default = 6)} \item{plotheight}{(optional) Numerical value that indicates the plot height in cm for figure outputs. (Default = 5)} -\item{wcol}{(optional) Can be a single numerical value that represents the -width of the first column or a vector, specifying the lengths of all columns -in the final table or listing.\cr +\item{wcol}{(optional) Can be one of: +\itemize{ +\item a single numerical value that represents the width of the first column +\item a vector, specifying the widths of all columns in the final table or listing +\item a list of vectors (applicable when huxme is a list), specifying +the widths of all columns for each element in huxme\cr +} + When a single numerical value is used, this will be taken as the column width for the first column. The other columns will be equally spaced across the remainder of the available space. Alternatively, a vector can be used to From 90e6dd9cc48bc15750dee6004c38e20af5a5c4e5 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Sat, 14 Mar 2026 16:05:07 +0100 Subject: [PATCH 03/14] informative error messages --- NEWS.md | 2 +- R/gentlg.R | 42 +++++++++++++++++++++++++++--------------- inst/WORDLIST | 1 + 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/NEWS.md b/NEWS.md index df92751..fe37ca8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,7 +2,7 @@ - Exported functions `get_file_name()` and `insert_empty_rows()`. - Updated `gentlg_single()` to replace, in the first column of tables/listings headers, every leading whitespace with 90 twips (0.0625 inches) left-indentation RTF markup. -- `gentlg()` argument wcol allows now for vectorized colwidths. +- `gentlg()` argument `wcol` now allows for a list of column width vectors when `huxme` is a list of tables. # tidytlg 0.11.0 diff --git a/R/gentlg.R b/R/gentlg.R index 416f8dd..823d595 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -249,15 +249,27 @@ gentlg <- function(huxme = NULL, # as number of columns in huxme[[i]] if (is.list(wcol)) { stopifnot(is.list(huxme)) - stopifnot(length(huxme) == length(wcol)) + if (!is.list(huxme)) { + stop("Argument 'wcol' is a list but 'huxme' isn't; please convert it to list when calling gentlg().") + } + if (length(huxme) != length(wcol)) { + stop("Arguments 'wcol' and 'huxme' must have the same length.") + } # the following checks are also made inside gentlg_single() formatcolumns <- c( "anbr", "roworder", "boldme", "indentme", "newrows", "newpage", "rowvar", "row_type", "nested_level", "group_level" ) for (i in seq_along(wcol)) { - stopifnot(is.numeric(wcol[[i]])) - stopifnot(length(wcol[[i]]) == length(dplyr::setdiff(colnames(huxme[[i]]), formatcolumns))) + if (!is.numeric(wcol[[i]])) { + stop("wcol[[", i, "]] must be (a vector of) numeric.") + } + # wcol[[i]] must be a length 1 vector or a vector of length equal of ncol(huxme[[i]]) + expected_length <- length(dplyr::setdiff(colnames(huxme[[i]]), formatcolumns)) + if (length(wcol[[i]]) != 1 && length(wcol[[i]]) != expected_length) { + stop("wcol[[", i, "]] must be a length 1 vector or contain as many values as number of columns (i.e. ", + expected_length, "), but its length is ", length(wcol[[i]]), ".") + } } } @@ -395,18 +407,18 @@ gentlg <- function(huxme = NULL, index_in_result = index ) }, - huxme, - colspan, - title, - footers, - watermark, - colheader, - pagenum, - bottom_borders, - border_fns, - alignments, - seq_len(length(huxme)), - wcol, + ht = huxme, + colspan = colspan, + title = title, + footers = footers, + watermark = watermark, + colheader = colheader, + pagenum = pagenum, + bottom_borders = bottom_borders, + border_fns = border_fns, + alignments = alignments, + index = seq_len(length(huxme)), + wcol_i = wcol, SIMPLIFY = FALSE ) diff --git a/inst/WORDLIST b/inst/WORDLIST index d5b8029..65f9dd0 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -20,6 +20,7 @@ colwidths envsetup funder hardcoded +huxme huxtable jnj neighbouring From f4fb1a37f65115fe3d10746f75a50bc918b3c2db Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Sat, 14 Mar 2026 16:07:19 +0100 Subject: [PATCH 04/14] Update gentlg.R --- R/gentlg.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/gentlg.R b/R/gentlg.R index 823d595..e2b4256 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -245,7 +245,7 @@ gentlg <- function(huxme = NULL, } # if wcol is a list, then huxme must be a list with same length, - # and wcol[[i]] must be a vector with as many numeric values + # and wcol[[i]] must be a length 1 vector or a vector with as many numeric values # as number of columns in huxme[[i]] if (is.list(wcol)) { stopifnot(is.list(huxme)) From 9a173e0a6174b78d46f72d30face866e5e33e7f7 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Mon, 16 Mar 2026 10:01:03 +0100 Subject: [PATCH 05/14] Update gentlg.R --- R/gentlg.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/gentlg.R b/R/gentlg.R index e2b4256..9a90f89 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -248,7 +248,6 @@ gentlg <- function(huxme = NULL, # and wcol[[i]] must be a length 1 vector or a vector with as many numeric values # as number of columns in huxme[[i]] if (is.list(wcol)) { - stopifnot(is.list(huxme)) if (!is.list(huxme)) { stop("Argument 'wcol' is a list but 'huxme' isn't; please convert it to list when calling gentlg().") } From bb6c777c059c77910f4c2e893c19f0fa3d2f9a08 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Mon, 16 Mar 2026 10:45:51 +0100 Subject: [PATCH 06/14] added unit tests --- tests/testthat/test-gentlg.R | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tests/testthat/test-gentlg.R b/tests/testthat/test-gentlg.R index e53ee99..6458b04 100644 --- a/tests/testthat/test-gentlg.R +++ b/tests/testthat/test-gentlg.R @@ -59,3 +59,63 @@ test_that("replace_lead_whitespaces_ind() is replacing whitespaces", { res <- as.character(res[[1]][2, 1]) expect_equal(res, "\\keepn\\trhdr Gender") }) + +test_that("gentlg() wcol checks", { + df <- data.frame(label = c("boy", "girl"), name = c("Bob", "Lily"), age = c(12, 15)) + + # example passing 1 colwidth per page + wcol <- list(c(0.5), c(0.25)) + expect_no_error(hux_tables <- gentlg( + huxme = list(df, df), + wcol = wcol, + print.hux = FALSE + )) + + for (i in seq_along(wcol)) { + ht <- hux_tables[[i]] + num_cols <- ncol(ht) + actual_colwidths <- huxtable::col_width(ht) + # expect that the 1st colwidth is what we specified in the function call + expect_equal(as.numeric(actual_colwidths[1]), wcol[[i]]) + # expect that the rest of columns have the same width + expect_true(length(unique(as.numeric(actual_colwidths[2:num_cols]))) == 1) + # expect that the sum of all colwidths is 1 + expect_true(sum(actual_colwidths) == 1) + } + + # example passing all colwidths explicitly + wcol <- list(c(0.5, 0.3, 0.2), c(0.4, 0.4, 0.2)) + expect_no_error(hux_tables <- gentlg( + huxme = list(df, df), + wcol = wcol, + print.hux = FALSE + )) + + for (i in seq_along(wcol)) { + ht <- hux_tables[[i]] + num_cols <- ncol(ht) + expected_colwidths <- wcol[[i]] + actual_colwidths <- as.numeric(huxtable::col_width(ht)) + expect_equal(expected_colwidths, actual_colwidths) + expect_true(sum(actual_colwidths) == 1) + } + + # examples passing wrong colwidths + wcol <- list(c(0.5, 0.3), c(0.4, 0.4, 0.2)) + expect_error(hux_tables <- gentlg( + huxme = list(df, df), + wcol = wcol, + print.hux = FALSE + ), + "must be a length 1 vector or contain as many values as number of columns" + ) + + wcol <- list(c(0.5, 0.2, 0.5), c(0.4, 0.4, 0.2)) + expect_error(hux_tables <- gentlg( + huxme = list(df, df), + wcol = wcol, + print.hux = FALSE + ), + "wcol not defined properly" + ) +}) From a701bb533f302ba209a289bccd806aa5669df7d3 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Tue, 17 Mar 2026 10:59:58 +0100 Subject: [PATCH 07/14] Update test-gentlg.R --- tests/testthat/test-gentlg.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-gentlg.R b/tests/testthat/test-gentlg.R index 6458b04..d2fcc82 100644 --- a/tests/testthat/test-gentlg.R +++ b/tests/testthat/test-gentlg.R @@ -80,7 +80,7 @@ test_that("gentlg() wcol checks", { # expect that the rest of columns have the same width expect_true(length(unique(as.numeric(actual_colwidths[2:num_cols]))) == 1) # expect that the sum of all colwidths is 1 - expect_true(sum(actual_colwidths) == 1) + expect_equal(sum(actual_colwidths), 1, tolerance = 1e-6) } # example passing all colwidths explicitly @@ -97,7 +97,7 @@ test_that("gentlg() wcol checks", { expected_colwidths <- wcol[[i]] actual_colwidths <- as.numeric(huxtable::col_width(ht)) expect_equal(expected_colwidths, actual_colwidths) - expect_true(sum(actual_colwidths) == 1) + expect_equal(sum(actual_colwidths), 1, tolerance = 1e-6) } # examples passing wrong colwidths From c7f95c71e56be3158b908956501b5ac1c0e556fa Mon Sep 17 00:00:00 2001 From: Ezequiel <4982139+eanokian@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:17:46 +0100 Subject: [PATCH 08/14] Update R/gentlg.R Co-authored-by: Gabe Becker --- R/gentlg.R | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/R/gentlg.R b/R/gentlg.R index 9a90f89..cbe4070 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -248,8 +248,12 @@ gentlg <- function(huxme = NULL, # and wcol[[i]] must be a length 1 vector or a vector with as many numeric values # as number of columns in huxme[[i]] if (is.list(wcol)) { - if (!is.list(huxme)) { - stop("Argument 'wcol' is a list but 'huxme' isn't; please convert it to list when calling gentlg().") + if (!(is.list(huxme) && !is.data.frame(huxme))) { + stop( + "'wcol' appears to be a list while huxme is not a list of tables/listings. ", + "If you intended 'wcol' to apply to the single output, convert it to a ", + "vector, otherwise pass a non-data.frame list to 'huxme'." + ) } if (length(huxme) != length(wcol)) { stop("Arguments 'wcol' and 'huxme' must have the same length.") From e046d79116f99d38d520e32a31edc6aedd3326f7 Mon Sep 17 00:00:00 2001 From: Ezequiel <4982139+eanokian@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:20:05 +0100 Subject: [PATCH 09/14] Update R/gentlg.R Co-authored-by: Gabe Becker --- R/gentlg.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/gentlg.R b/R/gentlg.R index cbe4070..5a89dce 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -255,6 +255,7 @@ gentlg <- function(huxme = NULL, "vector, otherwise pass a non-data.frame list to 'huxme'." ) } + ## already know wcol is a list and huxme is a non-data.frame list if (length(huxme) != length(wcol)) { stop("Arguments 'wcol' and 'huxme' must have the same length.") } From 87d284d6193e7ec000fe1d97f78d64d2f5fcd09f Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Wed, 25 Mar 2026 13:23:39 +0100 Subject: [PATCH 10/14] updated roxygen documentation about 'wcol' argument in gentlg() and added examples --- R/gentlg.R | 70 ++++++++++++++-------------- man/gentlg.Rd | 28 +++++++++-- tests/testthat/test-gentlg.R | 22 ++++++++- tests/testthat/test_outputs/png1.rtf | 2 +- tests/testthat/test_outputs/png2.rtf | 2 +- 5 files changed, 82 insertions(+), 42 deletions(-) mode change 100755 => 100644 tests/testthat/test_outputs/png1.rtf mode change 100755 => 100644 tests/testthat/test_outputs/png2.rtf diff --git a/R/gentlg.R b/R/gentlg.R index 5a89dce..0074443 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -35,10 +35,10 @@ #' @param plotheight (optional) Numerical value that indicates the plot height #' in cm for figure outputs. (Default = 5) #' @param wcol (optional) Can be one of: -#' - a single numerical value that represents the width of the first column -#' - a vector, specifying the widths of all columns in the final table or listing -#' - a list of vectors (applicable when huxme is a list), specifying -#' the widths of all columns for each element in huxme\cr +#' - a single numeric value that represents the width of the first column +#' - a numeric vector, specifying the widths of all columns in the final table or listing +#' - a list of numeric vectors (applicable when `huxme` is a list). Each element +#' can specify the widths of all columns or the width of the first column only\cr #' #' When a single numerical value is used, this will be taken as the column width #' for the first column. The other columns will be equally spaced across the @@ -194,6 +194,26 @@ #' ) #' ) #' +#' final_2 <- data.frame( +#' label = c( +#' "Overall", "Safety Analysis Set", +#' "Any Adverse event{\\super a}", "- Serious Adverse Event" +#' ), +#' Drug_A = c("", "40", "10 (25%)", "0"), +#' Drug_B = c("", "40", "10 (25%)", "0") +#' ) +#' +#' gentlg( +#' huxme = list(final_2, final_2), +#' wcol = list(c(0.70, 0.15, 0.15), c(0.5)), +#' file = "TSFAEX", +#' title = "This is Amazing Demonstration 1", +#' footers = c( +#' "Note: For demonstrative purposes only", +#' "{\\super a} Subjects are counted once for any given event." +#' ) +#' ) +#' #' # Produce output in HTML format #' hux <- gentlg( #' huxme = final, @@ -248,33 +268,15 @@ gentlg <- function(huxme = NULL, # and wcol[[i]] must be a length 1 vector or a vector with as many numeric values # as number of columns in huxme[[i]] if (is.list(wcol)) { - if (!(is.list(huxme) && !is.data.frame(huxme))) { - stop( - "'wcol' appears to be a list while huxme is not a list of tables/listings. ", - "If you intended 'wcol' to apply to the single output, convert it to a ", - "vector, otherwise pass a non-data.frame list to 'huxme'." - ) - } - ## already know wcol is a list and huxme is a non-data.frame list - if (length(huxme) != length(wcol)) { - stop("Arguments 'wcol' and 'huxme' must have the same length.") - } - # the following checks are also made inside gentlg_single() - formatcolumns <- c( - "anbr", "roworder", "boldme", "indentme", "newrows", "newpage", - "rowvar", "row_type", "nested_level", "group_level" - ) - for (i in seq_along(wcol)) { - if (!is.numeric(wcol[[i]])) { - stop("wcol[[", i, "]] must be (a vector of) numeric.") - } - # wcol[[i]] must be a length 1 vector or a vector of length equal of ncol(huxme[[i]]) - expected_length <- length(dplyr::setdiff(colnames(huxme[[i]]), formatcolumns)) - if (length(wcol[[i]]) != 1 && length(wcol[[i]]) != expected_length) { - stop("wcol[[", i, "]] must be a length 1 vector or contain as many values as number of columns (i.e. ", - expected_length, "), but its length is ", length(wcol[[i]]), ".") - } - } + assertthat::assert_that(is.list(huxme) && !is.data.frame(huxme), + msg = paste0( + "'wcol' appears to be a list while huxme is not a list of tables/listings. ", + "If you intended 'wcol' to apply to the single output, convert it to a ", + "vector, otherwise pass a non-data.frame list to 'huxme'." + )) + ## already know wcol is a list and huxme is a non-data.frame list + assertthat::assert_that(length(huxme) == length(wcol), + msg = "Arguments 'wcol' and 'huxme' must have the same length.") } adjfilename <- stringr::str_replace_all( @@ -384,7 +386,7 @@ gentlg <- function(huxme = NULL, border_fns, alignments, index, - wcol_i) { + wcol) { gentlg_single( huxme = ht, tlf = tlf, @@ -394,7 +396,7 @@ gentlg <- function(huxme = NULL, plotnames = plotnames, plotwidth = plotwidth, plotheight = plotheight, - wcol = wcol_i, + wcol = wcol, orientation = orientation, opath = opath, title_file = title_file, @@ -422,7 +424,7 @@ gentlg <- function(huxme = NULL, border_fns = border_fns, alignments = alignments, index = seq_len(length(huxme)), - wcol_i = wcol, + wcol = wcol, SIMPLIFY = FALSE ) diff --git a/man/gentlg.Rd b/man/gentlg.Rd index 256d299..de31f53 100644 --- a/man/gentlg.Rd +++ b/man/gentlg.Rd @@ -66,10 +66,10 @@ in cm for figure outputs. (Default = 5)} \item{wcol}{(optional) Can be one of: \itemize{ -\item a single numerical value that represents the width of the first column -\item a vector, specifying the widths of all columns in the final table or listing -\item a list of vectors (applicable when huxme is a list), specifying -the widths of all columns for each element in huxme\cr +\item a single numeric value that represents the width of the first column +\item a numeric vector, specifying the widths of all columns in the final table or listing +\item a list of numeric vectors (applicable when \code{huxme} is a list). Each element +can specify the widths of all columns or the width of the first column only\cr } When a single numerical value is used, this will be taken as the column width @@ -247,6 +247,26 @@ gentlg( ) ) +final_2 <- data.frame( + label = c( + "Overall", "Safety Analysis Set", + "Any Adverse event{\\\\super a}", "- Serious Adverse Event" + ), + Drug_A = c("", "40", "10 (25\%)", "0"), + Drug_B = c("", "40", "10 (25\%)", "0") +) + +gentlg( + huxme = list(final_2, final_2), + wcol = list(c(0.70, 0.15, 0.15), c(0.5)), + file = "TSFAEX", + title = "This is Amazing Demonstration 1", + footers = c( + "Note: For demonstrative purposes only", + "{\\\\super a} Subjects are counted once for any given event." + ) +) + # Produce output in HTML format hux <- gentlg( huxme = final, diff --git a/tests/testthat/test-gentlg.R b/tests/testthat/test-gentlg.R index d2fcc82..e5586be 100644 --- a/tests/testthat/test-gentlg.R +++ b/tests/testthat/test-gentlg.R @@ -84,7 +84,7 @@ test_that("gentlg() wcol checks", { } # example passing all colwidths explicitly - wcol <- list(c(0.5, 0.3, 0.2), c(0.4, 0.4, 0.2)) + wcol <- list(c(0.5, 0.3, 0.2), c(0.4)) expect_no_error(hux_tables <- gentlg( huxme = list(df, df), wcol = wcol, @@ -107,7 +107,7 @@ test_that("gentlg() wcol checks", { wcol = wcol, print.hux = FALSE ), - "must be a length 1 vector or contain as many values as number of columns" + "wcol\\'s length must be 1 or the length of final output" ) wcol <- list(c(0.5, 0.2, 0.5), c(0.4, 0.4, 0.2)) @@ -118,4 +118,22 @@ test_that("gentlg() wcol checks", { ), "wcol not defined properly" ) + + wcol <- list(c(0.5, 0.3), c(0.4, 0.4, 0.2)) + expect_error(hux_tables <- gentlg( + huxme = df, + wcol = wcol, + print.hux = FALSE + ), + "\\'wcol\\' appears to be" + ) + + wcol <- list(c(0.5, 0.2, 0.5), c(0.4, 0.4, 0.2)) + expect_error(hux_tables <- gentlg( + huxme = list(df, df, df), + wcol = wcol, + print.hux = FALSE + ), + "Arguments \\'wcol\\' and \\'huxme\\' must have the same length." + ) }) diff --git a/tests/testthat/test_outputs/png1.rtf b/tests/testthat/test_outputs/png1.rtf old mode 100755 new mode 100644 index f0a2236..ca62573 --- a/tests/testthat/test_outputs/png1.rtf +++ b/tests/testthat/test_outputs/png1.rtf @@ -9,7 +9,7 @@ { \trowd -\trqc \clbrdrt\brdrs\brdrw18\clbrdrl\clbrdrb\brdrs\brdrw18\brdrcf1\clbrdrr\clvertalt\cellx9189 \pard\intbl\ql\fs18 \qc{\pict\pngblip\picwgoal288000\pichgoal468000 89504e470d0a1a0a0000000d49484452000000c80000014508020000002663357b00000006624b474400ff00ff00ffa0bda79300001ef549444154789ceddd7b3c54f9ff07f0cf4894c888886e185d5c86a45446eeecaed1d056ab8deddb96457e6aa5624b6ddb652ba4f6abda6f33fba876cb77f3adf55562eb8b6e44bb6caed90a838a266b6830ae339cdf1fa3591964349fb1daf7f3af3967cef9bc3f73bc9cdbcc39874410040240d61446ba03e0dd04c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b60a138d21d900e97cbbd75ebd648f7e21da1a0a0c06030c68e1d8ba3f15116ac9b376f5eb972c5dede7ea43bf22e3877eedcbc79f328140a8ec64759b01042341acddfdf7fa47bf12ec8c9c9c1d738ec63012c2058000b396d0a857c6e7d8b225987ac8c84cf72e313efa185cb562d3150c65d3735353526264620104c993265fffefd140aa5bdbdfdd0a14377eedc515050707676debe7dbb9292d2e08de4e7e7efddbb97c7e38d1f3f5e4d4dadaeae4e4141415757b7a6a60621a4adadddd8d8d8dedeaeaaaaaaa4a4c4e3f1482492f85d1a8d161111317efcf8c14b3c7af468f7eedd5c2e574949494343e3c58b170a0a0a7a7a7aa246b4b4b45a5a5a5a5b5bc964f2ae5dbb162c58d06f231c0e272222a2aaaa4a414121303070e5ca9508a1fffdef7f31313142a1505757f7c08103060606c3588cc341602778fce37a2b841042da6effbcf5d3466d7d4b5b5b4b7d64b5f356b3b46dfde73fff3979f2e41027fee5975fe8747a4343034110252525341aadb1b131282888c9641204d1dddd7decd8b1eddbb70fdec8d3a74f972e5dfaf4e95382209c9c9c2c2c2c2a2a2a626262e6cf9fffdd77df959494989b9b7b78787476762e5ebcd8c2c2a2b6b6363c3cdcd2d2f2f2e5cb04419c3d7bd6cfcf6ff0125c2e9746a39595951104e1e5e565616151545474f6ec592b2bab83070f565555999b9bdbdbdb777777575757dbdbdb5756564a36d2d9d9e9e0e0f0ebafbf1204c1e7f37d7c7cae5ebd9a9595c56030783c1e4110c5c5c5341aadb9f9cf65be61c386f2f2f2212e4c69e10f5673d226fd15df16360b04cd85dfaed0d6de98d8401004d190b8517bed8fb503cf575757f79b847dfbf67dfdf5d743ac1c1c1c5c5454241e3c76ec586262a2939353ef69eceded076f243636362121812088aaaaaab56bd7262727474545393a3ab6b7b7bbbaba7ef9e59777eedcf9f0c30f6fdcb8111a1afac30f3f9c3973c6dedebebebe7ef9f2e5a2165c5d5d3b3a3a0629111717c762b10882686c6c5cb66c597676f6175f7cf1de7befb5b6b63a38387cf3cd378989897e7e7ea5a5a504412425251d397244b2919c9c9c6ddbb68907b95cee871f7e181818f8fbefbf8b474645452527278b07b1060bffa6b096f3649acd0673554584cc6d6c665b8d37d14008210d13aad5d9e66684b40798efc18307d7af5fef33f2c68d1b5a5a5a43accce3f1343434c4836432b9aeae4e59f9b5edefd8b1638542a1a2e280cb81c7e3999a9a22841a1b1bc964b28686866805a0acac2c1008783c1e994c2693c9cf9f3f17bd282f2f5750505055556d696911b5a0a2a2d2dada3ac806b7b1b171f2e4c908a1a6a6267575755189cecece71e3c6893a606161412693793c1e4248f46ebf8d90c964f1a0a803924ba0b1b1f10d4b4d46f0efbc5368ce632337fa6edbbd7b9befc6341d95cb91acecaaaa6c56e4e93f96580e720ac5c1c1e1b0045b5b5b7575f521567672728a8b8b13bdeeeeeebe74e9926875555151211af9f0e143151595415285107274741435626c6c9c9b9b7bfaf4692727270a85121d1d6d6e6eeee4e4f4dd77df3d7af4884ea7a7a5a59d3f7fded1d1515353333a3adad6d61621f4f4e9533e9fdffb4f2ec9cece2e3e3e9e208869d3a65555559d3a75cac9c9c9caca2a3a3a7afaf4e98e8e8e67cf9ecdcacaa252a908a1f3e7cf3b39394936626565959a9adadede2e1a8c8f8f5fba7469ef25d0d5d595909040a3d186b8f4de921c76de4d3727fcacc13c9d9c8f685fb282163dda435f6e10804c7c23ce052cc45a78ddba75c1c1c1cb962d9b3d7b766e6eae9f9f1f8542898d8dfdf4d34f8d8d8dbbbbbbcbcacabefffefbc11bb1b5b5cdcece767171b1b0b0100804e9e9e9aaaaaa4d4d4d478e1c7175754d4f4fbf7cf9f2f4e9d30f1c38c0e3f16a6a6ace9d3bd7d6d676fcf8713a9d1e1414f4e0c10326933978093333333737374747472b2b2b82207efae927a150d8d8d878eedc395b5bdb8484843b77ee686a6a464444141515393a3a3a3a3a4a36a2a1a1111616e6ecec6c6d6d5d5d5dada4a474f6ec594545c5a0a0200683316bd6acdcdcdcc0c0c09933670e7b794a07d32616939090106f6f6fa966a9adadcdcbcbebbdd32a140a1f3e7cf8f8f1e3aeaeae2136f2f2e5cbfbf7ef3734347474741416165655551104c166b38b8b8b3b3b3bebebebefdfbfdfd8d8d8d6d6565050505d5dddd5d5555a5a5a525222140a8758a2a9a9e9fefdfb5c2e572010141717b3d9eceeeeeeaaaaaac2c2c28e8e0e51075ebe7c3978236d6d6df9f9f9d5d5d5bd47be78f1222f2f8fcfe7f79918eb3e1689200839455816b66cd9c2e170e2e3e347ba23ef023f3fbf1d3b7660fa4a074e90022c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b0c01f2c219fcbebc05e05fcc5e00fd6931f3768d036b072ea84d84b81bf0eb96c0a6dada7dc0fb1b60b88bd5109ebaebf09b93c566ed2bcf5ccd8909c0b51fb9c666c9ee5fec95a7f4f5763431df2a04f954b4e4e3e77ee5c9f91050505f27bb602780b727b74afe264eb4fa2933fde53967bf9daf96ffc8fe6dccdaf6230892b033e84d7c9c9c9c4c4a4cfc803070e881f7e04fecae4fc4c6845d5594b7c672df1dd8c10421d7cfe2093aaa8a8181a1af619a9aeaededada8aaf7f4056f0074bc761eb56a4d3df3bcaaaaad8ab8311823f58aab3edecb017017f357082146001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8045ef2fa1330e2f8d48e97f32fad7995fc057c960e87a076bd67b3b7698f73f99ee2cb9f406bc337a074bd7d25dd712712a1f8ed7331efc67c300bc81e43e567dea574ef34ddd3efd92f5733e07ae7d00c323192cb380ffe495e45d0cb347bfc4fe63bee97cefa0d884fc6a3e5cbc05a431c051a132d9d8797dd8fec8e86087a6d4afbff45daa36cbe3f0dd97f2ed1b18c52483d5c17b782f2e36c87bfe2c2ae3f0ad312e07339f969454b6a7bc776fc591dbf2ef20189d247ff39e11bdf2db9701be5f244551a7a98adf56d6770f8befe87b35160003905c63b97e5dc85aa731766c4faa72cf1d4eaeec404885427334d1907bffc02825192cfeed3d1f04a5f05e0d8e47055f2dde7e75b02b0001902019ac7bd70eda1f885b6bd63368b636ee80eff1bbf7e4db2d30da49064b6faa637e51e19f27b084cf391c5b1d6d79760a8c7e923befa69fec735aed3ee307caec496310425d0da59d1e716916f2ef1a18cdfab9125ac376570adb3b37a3a8b8a846c59c6a6a6963a90b5ff000e9f47f89bda2eaac25eeb39638f36a79c2099a902a20b5d7f6b184a51782ddf6df460821f4322dc26686e5071f2c549bb5fa4c297ca103a4d33b58cf2f7c754039c86f094208dd3b19f2e093ccb2bcbcb23f8e4f8dd97e863d42fd03a354ef4d61c9830b3a0d946f0fdc47a8adec5a47f7e2f37b77238450834e52fc81dde4adfb3f321ba01500fae81d2c6d1d5ba4b3724fa885e2cb04ffff923f3fb16b0942485878d4ed3635045205a4d13b58169e9f69bb7859274e43d5d59651594b107a703168f7de6bb55eac1438dd00a4f2da5121656dfc23c6c3bc87c878bee827a49ab33c36c7ef5d4a9d2ce73b4a8251afef997765b2f19225b3149f567210426892810159d8d10ec784405a925fe9080b639751bde2ca102a89fd60cecafffbbff7a8ab5970be0148473258b95799d38fdcdd6d87ee2532d5f6276567df3d32e99f177347a06f6014ebe717a46d5cb5096a0815defb9f8e338d8290da04b5df9be16733402a927be50b5cfdb67deaf529ade1b6e1a62c53c4be14b02b6ed39ebd6f57a683cf1fa3aaaa889090cf2d2b2e6ed7b534d17fab2bccae5dbb76e6cc99969696850b1772389c8a8a0a7373f3b0b0b02953a620842e5dba74e1c2058140e0e9e9b97efd7a050585c6c6c6e8e8e89c9c1c3d3dbd2d5bb65858f47f982b140a592c564a4acaf8f1e3e7cf9f5f5454c4e3f19c9c9c366fde3c6edcb8b7e8af5c110471f1e2c5f8f878a150b87cf9f275ebd62928c8fd9277a22f81a0adb9343be566def376822088e22bccdb4f051253494190ff4f37ed15a7ab08c1e3d3defaafea6a2fd992f45ceab6424242bcbdbde3e3e3d7ac59f3e2c58bd2d2520303032f2f2f814070fbf66d1a8dd6d8d878f2e4c98d1b37d6d7d73737377ff5d557e1e1e19d9d9dcecece4949499d9d9d0f1f3e747070282c2cecb7fde0e0e0c8c8483e9f7ff1e2c5e9d3a71f3d7ab4bdbdfdf4e9d3ab56ad7a9b452067c78e1d0b0e0eaeafaf6f6a6adab56b57444444bf936dd8b0a1bcbc1c531f2483756ba7f6a6a456d955a8fd71ad49e8b50682a8fd712d6244fefa87802008c11fbf4632b43725350f3c5f67676783848d1b377ef4d147cececeededed04411c3c78302525854ea7f3783c8220984ce6b973e7ececec8442a1b81d0707879b376feedcb9533ca6a8a828303050b2626b6bab8b8b8be8b58787476d6dad83838368d0d7d7b7b2b2f26d1785bcd8d9d97575750d3428863558929bc2d98b3eaa48fbf9e192f76669a9cae2f4555b5bcb4c23430d849eb4b57cf0be97f564458490e2646baff7adb6736a111ae8e914d7ae5d8b8b8beb33b2a0a060c68c195d5d5dcacaca08210e87e3e1e1317dfa740e87a3aeae3e63c68cc2c2420505853163c68867d1d2d262b3d9d3a74f178f993163c6f3e7cf252b72b95c3d3d3dd16b3e9fafadaddd67167d7dfde12c01f92208425151b1f7b66fd2a4494d4d4d6432599edd90dcf496649d4839bed264b2da58d29fc2d3865d61a6bdbb4ad4cea3d99c29cb03a82927121ef23a84fcea6c56e4e976671a65e0f9180cc64509743a5d4b4b6bca94290f1e3c40082d5ab4e8f2e5cb05050546464608a1ab57af2e5ebc78c284094f9e3c1135c2e3f1381c8e8383c3f5ebd7c52d2727272f5ebc58b2e2b469d34a4b4bf97c3e4268eedcb9f1f1f1a23f865028cccccca452a9c35e06f24422919494949e3d7b261a6c6868a8afaf9773aa507f3bef763b5ebc08ed3b52f92dfa4559ffdd4fc2dd3b5c66a471b54c54a24c8e2384b44dbc02637e08321d5e8b5151511f7ffcb18b8b8b9a9adac99327e7cd9b77ead4a9ecececa953a7dadbdb6b6b6baf59b3c6dddd5d4949292929e9f0e1c34646467676760c06c3cdcdadacacaca2a2e2d2a54b92cd9248a4fdfbf7bbbbbb7b7a7aaaabab070606faf8f87cf3cd372929294141416a6a6ac35f06f2151d1dbd7af56a3a9daea8a878f5ead5a8a828f9f7814410c4e05308f9dc7aae40495ff7adaffd12f2b9f52d5d088d99a039dcadec962d5b381c4e7c7c7c6767676666666b6bab8d8d4d7575757979b99999d99c39734493b5b6b66665650904021a8da6aeae2e1a595555959f9fafa7a7676d6d4d2291062ad1d0d0909d9d3d6edc381b1b9bdcdc5c1e8fb778f1621d9d7e1f33f5d7d5d2d292959525140a7b2f813efcfcfc76ecd841a10cb2d9780b127b5daf1dbbf5d0fff20ea67d3c29898e0a47ba17ef08ac3beffd9c79bf1853fed1d5ca17d7224c56fcaba832effc267a182b04eeba06a4d2cf05abcdbf3bbb78e8ebd82eb0cf7c56af6fe97bd0af79dfd9c211e81b18c52483654861dc484fe674a81a18cdceb897cde73f7d56535a0f379a0152910c1665cdbef5cfc34f64208bd5dbe725d0d4d44c0fd46df1b01d81be8151ac9f8333558ba0f32508218418c77f698ea86dd798aa05578001e9f4f3dda4b0f442804d84e88ca8a26a71ecc21570cb3520ad7ecebc7f1b1843de19fcea30d02ee4b8e94f5ff6acc2001822c9603dafb965eff8bef8a27a655d0f17e75b35fd7cb506c0c02483b5c476d37f8fed49c8afaaadadadadadadcafe57dc8df50be02a1d2015c99d77d565d129bcadfff7a1c1ca2a8410d236f1dac23cb30a6e6304a42219ac0e1e4fefa313b73e3921e473f963b5c8ca423eb79ed781e09102400abd82d5f31df1dd835332ec5eecec3971555b8bdad2771b14ad22225d47a6876054ea152cc5a66b5ba6aebd801042b153627b4f64157ce52bb9f60a8c7abd77def53ef99120883b876c0ff5f92dc36fc7197a23d643302af5f343bf2f32ed3a78b5b5af3d464799ac03fb58400afdde8edb6686c694d71dca1881be81514c728d75efda3e8383a5a9ff9825934b29c0df94e41acb74deda8e4e621ca40abc0dc9fce8addae6eafd91c5f939f6ceb3355f8da47ac38dd78034fafb12faf3c0bc69bd530580d424d75875b525a1ffaa89791fb685e02d48aeb16cff71e88f7fc76657f1e0b1bd60f8248375ebf486b8b8ad34038d71b2b9121afc2dc9e14a68f07724192c65f268bbea17fc05c9fd7e5ce0ef018205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000bfcc1e2976664948a1e1e26acbb1dfba9c77c031d531bef3dc995f083af7718fe60d5de8e89b95d8b104225df7a7bc72bb9459c3c1b1d64f9f8abc5fe17e0e648ef2c39fe00999d7543b0f5f8c9cd568a08217737fd768b6fae3ff978fdcc0126cfcccc4c4949e933322b2b4b53137e8c3f0ac825580da50f1ed66a6a19cc1d9bd5262eac3671d2a033191919b9b8b8f41959565686a38340e6f0074b6d9a89faf9bdee53f2ab1042e8c676eb9f8fb96bf3ef1d0e3b6eb82e6ba0d51542485757575757b7cfc89494140e8783afb34056f0074bdbfd50b2fb21d15d929e95ddafd3544108b5b6cff44f095801b71a7967c96f1f4b51554bc758cbdd18218490b6e3c72be456198c00388f05b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b090e39329c4f8a5197968bedd6c5599b6dadddd7de1c285cccc4c2d2d2d3f3f3f7d7dfd37ce525d5dcd6432ebeaeaacadad5b5a5a8a8b8bf5f5f5030303274d1afcd90652a8adad6532993535359696962412292f2f4f4f4f8f4aa5debe7d5b5151d1ceceeeb7df7ee372b9341acdc7c74741e10dffe70441242424dcb871834c26dbd8d8646464b4b6b6dadbdbb3d9ec8a8a0a0b0b0b3f3fbf71e3c6f53baf4020f8fefbef7ffbedb7a953a7060404e8e8e8c8ea33f64b2e0f69faf975ff654544b0fefbf3cf3f6794cab08e9f9fdf93274f4242429c9d9d7d7d7d4b4a4a069fbeacacccdbdbdbdede7ef3e6cd919191717171dbb66d333131f1f0f0e072b932e9524d4d8d9797979595556868e8a953a74e9c38111212c2e572030202e874fad2a54bfdfcfc0882080909e170386bd7ae7d6383a1a1a1f9f9f99b376fd6d1d159b76e9db1b1b18f8fcfe79f7f5e5858b87dfbf6091326787878080402c919098258b56a554747c7d6ad5b172c58e0e5e5555d5d2d93cf382002b7da047f7d8490bea5ed2b4b4cb4b54d96d8dada7ef66f691b0b0909f1f6f6961c5f5656b666cd1af1606969a9afafefe04d7df6d9678585850441242727efdbb7cfcfcfafa8a8882088a4a4a4fdfbf74bdbb17e858787dfba758b2088ececec909010d1a0684db365cb960d1b36e4e5e52d5dba5434f1faf5eb1f3c7830486b757575743a5df4dad5d5b5acac8cc160444646262424d8dbdbb7b5b5110471f8f0e1848404c979efdebd1b1a1a2a1eccc8c8d8ba75eb860d1bcacbcb65f24925c9e1c9141f321f552c3bb8e9cbfb56e1c7777a18282336cb33141dbde24f1974be84848453a74ef51959515141a5522527aeacac343535150f1a1919d5d4d40cdeafaaaa2a636363519ba6a6a613274e64b3d9542ad5cccc2c313171689fed0d442d8b5f8c1b37aea4a4445353d3dcdc3c2626a6a5a5854aa52a29297575758d1933c6cccc8ccd66f7fe14929fd1c4c444f45a2010181919353535555454787a7ace9933e7e9d3a7b367cfa652a9fdaeaac53d113133333b76ec980cb7f892e4b2f3ae6ce0b137f9def185b99b96780cf939852b56ac489370e8d021373737c9894d4c4ceeddbb271ecccdcd9d3d7bf6e0ed9b9a9a6667672384a854eaddbb77efdebd2b8a6c666666bfd91d0651cb08213333b3bb77ef6666665a5b5b373434a4a7a753a954131393f4f47451aa1042e20e0c64ce9c39b9b9b904412084545555333333757474a8546a4646467171b1818181a8f3e6e6e683f44444869f7120f2db795736f0d87b7951ce995d3ef4cb6cf3fdb26d7cead4a90b172e5cb76eddca952babababcf9f3f7fe9d2a5c167d9b163c7f2e5cb7d7c7c66ce9c999c9caca9a9f9f8f1e3848484d4d4d4ab57afcaa4579f7ffef9b265cbaaaaaae6cc99535050d0d5d5e5e9e9696c6cfcd9679f1d3b76aca3a3c3dbdb7bfdfaf5292929898989262626a2700c64e2c4895e5e5eab57aff6f1f159b060019d4edfb367cfe4c9938383831d1c1cd2d2d23232329e3d7bd6ef3fdebc79f3545454366fdefcfefbef9796962626262625256dddba55261fb35f24d17f803c09eb8a331f2a2f1cd651e1c58b17b95c6e505050bfefe6e6e68a8e0a57ac583161c28437b6d6dada9a9090505757676363d3dcdc5c5050606868e8e9e9a9a828b3ffb7cececec4c4c467cf9e2d5cb8904422e5e6e6eae9e9cd9f3f3f3d3d7dcc9831cececebffcf24b5d5d1d8d465bb468d1501a2c2c2cbc75ebd6c48913ededed6fdebcd9d6d6e6e4e4545a5aca66b32d2c2cfa4d95584646464e4eceb469d3962f5faeacacece7e7b763c70e0a65f05d92611a8160bd8dc18305a48235587082146001c102588cc499f7b7a0aeae1e1414141111f1c693d4bdb5b5b58d1f3f7ee8d37776768e19334674b03644adadad2a2a2a439f5e2010904824a976e6a42d21140ab5b5b507f906e2d9b367522d16e9603a3f86cff6eddb737272863e7d57579793939354250e1e3c78fdfa75a966717070906a7a2693f9ef7f4b777e58da12972e5d3a7efcb854b3c8106c0a0116102c8005040b6001c1025840b00016a32f580a0a0a529d6b400849fb158db4e71ade99123234cabed24108f1f9fc0913269048a4a1cfd2dcdcaca6a636f4e95b5b5b959595a5faab485ba2a3a3834422292929e12b211008bababa06fa41296ea32f586054187d9b42302a40b00016102c8005040b6001c1025840b00016102c8005040b6031ca82c566799248241289149e86a9f5de0da7858b8a79b2d86fdff8abc65eefbc4c4bfc59a37773b22d316423f50bc3e1480d43282c9520887226033198b2bd3abc9cc940a8a7fd57c3a21ae2b26f21354cdcc49fcdc9b644af1ad84a0cdd680a563993f16ad1c83a59a961083198a97f162088d430710519ff4dc4cd612d218e13a6126f309a368515ec2406c510218410c5602e4a6257c8ac69d74882b8e26fd86b0cbbf2119a6b20bae4ce90c2408f2a65b52161573e420c8a21ce1269e951a296f195789351142c76e5233956ab6027616997cd0a0d40cca3fe144c25d82c4f12c92d8ac1f47745f83ec59b8da260510ce6cab19a218521fb46d92c4fa380b9a93d37dac15282e27f852088727a8a91278b8da7c4908ca26021430ae3d5e64fbc39c186623057bce1a86027893728c3c766791aa5d0cb8948576c25c45eed2a602cf106a329581483b9282a3d0d21c4be9192c4a03b635d4886144652ca0d3612edb184b9b8be718ec1f4a4eaf59b82c9bc84f84486b83dd9969086bc8e1264a3e79c00a6c39bf2de478584e8380a212483e34f71bf5fe97dee4136257ab7f65a7bb22d3154f00b5280c568da148251048205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b0806049a3efcd1d069dd09385bd3f7f61102c8005046b58d82c4f527878b8c4dd637aeeecf2da8d5dfadc02262d5cfcf6905780a310046bd8a21e517a6ebb117582c54608b1599e6e5161a904411ca53ceab9b49dcdf2747bc42c2708a29c89028cc2d3906b64393d2594c546288d15303735527e57fac915046bd87aae9875757975315f053ba9e7960914ff60d1c85e57d652fc83c344572553fc8fd253423d3dddd03b1b2b08d65be87bb9fa40372d490a30126d0adda25edd2187e21f3c37098942f88e8260c9cc40372d79eda26dd12a2a2ddc0d317b3688ef280896ecb8ba842505b0d210426cd6892884104214673aa3670f0ca585f7ecbfa785bba1d4487fffa3ef72b446d953ecffda5c2353c3486ea42884c2984c460a420851fcafa4b24946a40084100a4b25fc11cbd30da512a23db1a3744fa37003e25ddcd3827b37002c605308b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012cfe1f8182501b92791b8d0000000049454e44ae426082}\line \cell +\trqc \clbrdrt\brdrs\brdrw18\clbrdrl\clbrdrb\brdrs\brdrw18\brdrcf1\clbrdrr\clvertalt\cellx9189 \pard\intbl\ql\fs18 \qc{\pict\pngblip\picwgoal288000\pichgoal468000 89504e470d0a1a0a0000000d49484452000000c80000014508020000002663357b00000006624b474400ff00ff00ffa0bda79300001ef749444154789ceddd7b3c54f9ff07f0cf4894c888886e185d5c86a45446eeecaed1d056ab8deddb96457e6aa5624b6ddb652ba4f6abda6f631fd56ef96ebeb5be4a66eb8b6e44bb6caed90a838a640d0dc67586f3fb63342b838ce63376daf7f32fe738e7f3feccf132e732f339874410040240da1446bb03e0dd04c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b60a138da1d900c87c3b975ebd668f7e21da1a0a0c06030c68e1d8ba371390bd6cd9b37af5cb9626f6f3fda1d79179c3b776edebc79140a0547e372162c84108d46f3f7f71fed5ebc0b727272f0350ec758000b0816c04246bb42018fd3d0aa48d6212b23c1b3dc84a47b68e1b2554b0c9471d74d4d4d8d8989e1f3f953a64cd9bf7f3f8542e9e8e83874e8d09d3b771414149c9d9db76fdfaea4a4347423f9f9f97bf7eee572b9e3c78f575353abafaf575050d0d5d5ada9a94108696b6b373535757474a8aaaa2a292971b95c128924fa2d8d468b8888183f7efcd0251e3d7ab47bf76e0e87a3a4a4a4a1a1f1e2c50b0505053d3d3d61235a5a5aadadad6d6d6d643279d7ae5d0b162c18b091dadada888888aaaa2a050585c0c0c0952b572284fef7bfffc5c4c40804025d5ddd03070e1818188c60338e04811dfff18febad10420869bbfdf3d64f1bb5f52d6d6d2df591d5ce5b2d92b6f59ffffce7e4c993c35cf8975f7ea1d3e98d8d8d0441949494d068b4a6a6a6a0a02026934910444f4fcfb163c7b66fdf3e74234f9f3e5dba74e9d3a74f0982707272b2b0b0a8a8a8888989993f7ffe77df7d575252626e6eeee1e1d1d5d5b578f1620b0b8bbababaf0f0704b4bcbcb972f130471f6ec593f3fbfa14b70381c1a8d5656564610849797978585455151d1d9b367adacac0e1e3c585555656e6e6e6f6fdfd3d3535d5d6d6f6f5f595929de485757978383c3afbffe4a10048fc7f3f1f1b97af56a56561683c1e072b90441141717d368b496963fb7f9860d1bcacbcb87b93125853f582dc99bf4577c5bd8c2e7b7147ebb425b7b63522341104463d246edb53fd60dbe5e7d7dfd6f62f6eddbf7f5d75f0fb37270707051519168f2d8b1634949494e4e4e7d97b1b7b71fba91d8d8d8c4c4448220aaaaaad6ae5d9b9292121515e5e8e8d8d1d1e1eaeafae5975fdeb973e7c30f3fbc71e3466868e80f3ffc70e6cc197b7bfb868686e5cb970b5b707575edecec1ca2447c7c7c5c5c1c41104d4d4dcb962dcbcecefee28b2fde7befbdb6b6360707876fbef9262929c9cfcfafb4b4942088e4e4e423478e8837929393b36ddb36d12487c3f9f0c30f0303037ffffd77d1cca8a8a8949414d124d660e1df15d6d53e9966b3c15c551121731b9bd956e34d34104248c3846a75b6a50521ed41d67bf0e0c1f5ebd7fbcdbc71e3869696d6302b73b95c0d0d0dd124994caeafaf57567e6dff3b76ec588140a0a838e876e072b9a6a6a608a1a6a6263299aca1a1217c03505656e6f3f95c2e974c2693c9e4e7cf9f0b7f282f2f5750505055556d6d6d15b6a0a2a2d2d6d636c40eb7a9a969f2e4c908a1e6e6667575756189aeaeae71e3c6093b606161412693b95c2e4248f8db011b2193c9a2496107c4b7405353d31bb69a94e03f78a7d09cc7466ef4ddb67bf736df8d693a2a9723e3b2abaab2e3224fffb1c472884b280e0e0e87c5d8dadaaaabab0fb3b29393537c7cbcf0e79e9e9e4b972e09dfae2a2a2a84331f3e7ca8a2a23244aa10428e8e8ec2468c8d8d7373734f9f3eede4e444a150a2a3a3cdcdcd9d9c9cbefbeebb478f1ed1e9f4b4b4b4f3e7cf3b3a3a6a6a6a464747dbdada22849e3e7dcae3f1fafec9c5d9d9d92524241004316ddab4aaaaaa53a74e3939395959594547474f9f3eddd1d1f1ecd9b3595959542a152174fefc79272727f146acacac5253533b3a3a84930909094b972eedbb05babbbb1313136934da30b7de5b92c1c1bbe9e6c49f3598a753f211edcbb8a0458ff6d0971b042013df8873010bb1165eb76e5d7070f0b265cb66cf9e9d9b9bebe7e747a1506263633ffdf4536363e39e9e9eb2b2b2efbfff7ee8466c6d6db3b3b35d5c5c2c2c2cf87c7e7a7abaaaaa6a7373f39123475c5d5dd3d3d32f5fbe3c7dfaf403070e70b9dc9a9a9a73e7ceb5b7b71f3f7e9c4ea70705053d78f080c9640e5dc2cccccccdcdcdd1d1d1caca8a20889f7efa4920103435359d3b77ced6d6363131f1ce9d3b9a9a9a1111114545458e8e8e8e8e8ee28d686868848585393b3b5b5b5b5757572b29299d3d7b56515131282888c160cc9a352b373737303070e6cc9923de9e92c1b48bc5242424c4dbdb5ba255eaeaeaf2f2f2fa1eb40a0482870f1f3e7efcb8bbbb7b988dbc7cf9f2fefdfb8d8d8d9d9d9d8585855555550441b0d9ece2e2e2aeaeae868686fbf7ef373535b5b7b71714145457577777779796969694940804826196686e6ebe7fff3e87c3e1f3f9c5c5c56c36bba7a7a7aaaaaab0b0b0b3b353d881972f5f0edd487b7b7b7e7e7e757575df992f5ebcc8cbcbe3f178fd16c67a8c45220842461196862d5bb6d4d6d62624248c7647de057e7e7e3b76ecc0f4910e5c20055840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b60813f58021e87db89bd0af88bc11fac273f6ed0a06d88cba917602f05fe3a64b22bb4b59e723fc4da2e20f64625bc77fd4dc8e4b17293e6ad67c686e45c88dae73463f32cf74fd6fa7bba1a1bea90877caa5c4a4acab973e7facd2c282890ddb315c05b90d9a37b15275b7f129df2f19eb2dccbd7ce7fe37f34e76e7e1583495c19f421bc4e4e4e262626fd661e387040f4f023f05726e367422baace5ae23b6b89ef668410eae4f18658544545c5d0d0b0df4c7575f5b6b6367cfd03d2823f583a0e5bb7229d817ea3acaa8abd3a1825f883a53adbce0e7b11f0570317480116102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c10258f4fd103ae3f0d208d6c08bd1bfcefc023e4a06c3d73758b3dedbb1c37ce0c57467c9a437e09dd13758ba96eeba96a8b6f2e1783de3a1bf360cc01b881f6335a47ee534dfd4edd32fe37eceaf85b10f6064c4836516f09fbc92bc8b61f6e897d87fcc379def1d149b985fcd83c15b4012839c152a938d9dd787ed8f8c0efea03be7eb2f7d97aacdf2387cf7a56cfb06e49878b03ab90fefc5c70679cf9f45651cbe35861671f56949496507ebbd7b2b8edc967d07817c12ffce7b46f4ca6f5f06f87e911c459da62afab5b2be7b584267ffd158000c42fc1dcbf5ebc2b8751a63c7f6a62af7dce194ca4e8454283447130d99f70fc829f160f16eeff92088c57d35391e157cb578fbd5a146000220463c58f7ae1db43f10bfd6ac77d26c6dfc01dfe377efc9b65b40de89074b6faa637e51e19f17b004cf6b6b6d75b465d92920ffc40fde4d3fd9e7b4da7dc60f94d993c62084ba1b4bbb3ce2d32c64df3520cf061809ad61bb8bc5f6cecd282a2eaa5131a79a5ada58eac2073c4032030fb157549db5c47dd612676e1d57304113520524f6da3196a0f442b0dbfedb0821845ea645d8ccb0fce083856ab3569f29850f748064fa06ebf985af0e2807f92d4108a17b27431e7c9259969757f6c7f1a931dbcfb047a97f404ef5dd15963cb8a0d348f9f6c07d84dacbae75f62c3ebf7737420835ea24271cd84ddebaff23b3415a01a09fbec1d2d6b1453a2bf7845a28be4cf4ff2ff9f313bb962084048547dd6e5343205540127d8365e1f999b68b9775d234545d6d1995b504a107178376efbd56e715c782cb0d4022af9d1552d6263c623ccc7b888ce70bbf42aa39cb6373c2dea5d4c932bea324907bfdafbc2b938d972c99a5f8b4b216218426191890059d1d704e082425fe918ea0307619d52bbe0ca192d80fe6acfcbfff7b8fba3a0eae3700c988072bf72a73fa91bbbbedd0bd24a6dafee4ececbb4726fdf362ee28f40dc8b101be41dace519ba08650e1bdffe938d32808a94d50fbbd05be360324227e54bec0d56fdba75e9fd21a6f1b6eca3245ec4b01bbe237edd9fb76653a79bc31aaaa8a0809789cb2e2e20e5d4b13fdb71a6176eddab53367ceb4b6b62e5cb8b0b6b6b6a2a2c2dcdc3c2c2c6cca942908a14b972e5db87081cfe77b7a7aae5fbf5e4141a1a9a9293a3a3a2727474f4f6fcb962d1616039fe60a0482b8b838168b357efcf8f9f3e717151571b95c2727a7cd9b378f1b37ee2dfa2b5304415cbc783121214120102c5fbe7cddba750a0a321ff24ef4c7e7b7b79466b36ee63def20088228bec2bcfd942fb69404f8f9ff74d35e71ba8ae03f3eedadffaaaef6922dc9cf256e2b2424c4dbdb3b212161cd9a352f5ebc282d2d353030f0f2f2e2f3f9b76fdfa6d1684d4d4d274f9edcb871634343434b4bcb575f7d151e1eded5d5e5ecec9c9c9cdcd5d5f5f0e143070787c2c2c201db0f0e0e8e8c8ce4f178172f5e9c3e7dfad1a3473b3a3a4e9f3ebd6ad5aab7d9043276ecd8b1e0e0e0868686e6e6e65dbb764544440cb8d8860d1bcacbcb31f5413c58b7766a6f4a6e935e85ba1fd79a845e6b2488ba1fd72246e4af7ff00982e0fff16b24437b5372cbe0eb757575358ad9b871e3471f7de4ececdcd1d14110c4c18307592c169d4ee772b904413099cc73e7ced9d9d9090402513b0e0e0e376fdedcb973a7684e5151516060a078c5b6b636171717e1cf1e1e1e7575750e0e0ec2495f5fdfcacacab7dd14b2626767d7dddd3dd8a408d66089ef0a672ffaa822ede7874bde9ba5a52a8dcb57ededad338d0c35107ad2defac1fb5ed6931511428a93adbddeb7da5e5b87d0604fa7b876ed5a7c7c7cbf990505053366cce8eeee5656564608d5d6d67a78784c9f3ebdb6b6565d5d7dc68c198585850a0a0a63c68c11ada2a5a5c566b3a74f9f2e9a3363c68ce7cf9f8b57e470387a7a7ac29f793c9eb6b676bf55f4f5f547b205648b20084545c5befbbe49932635373793c9645976437cd75b927582757ca5c964b5b1a43f85a78db8c24c7b7795a89d47b36ba72c0fa0b24e243ee4760a78d5d97191a73b9c6994c1d763301817c5d0e9742d2dad2953a63c78f00021b468d1a2cb972f1714141819192184ae5ebdba78f1e20913263c79f244d80897cbadadad757070b87efdbaa8e5949494c58b178b579c366d5a6969298fc74308cd9d3b37212141f8c7100804999999542a75c4db40964824929292d2b367cf84938d8d8d0d0d0d324e151ae8e0dd6ec78b17a1fd672abf45bf28ebbffb49b07b87cb8c348e96894a94c9718490b6895760cc0f41a6236b312a2aeae38f3f7671715153533b79f2e4bc79f34e9d3a959d9d3d75ea547b7b7b6d6ded356bd6b8bbbb2b29292527271f3e7cd8c8c8c8cece8ec160b8b9b99595955554545cba7449bc591289b47fff7e7777774f4f4f7575f5c0c0401f1f9f6fbef986c562050505a9a9a98d7c1bc8567474f4ead5abe974baa2a2e2d5ab57a3a2a264df07124110432f21e0711a387c257dddb71efb25e0711a5abb111a334173a47bd92d5bb6d4d6d6262424747575656666b6b5b5d9d8d85457579797979b9999cd993347b8585b5b5b5656169fcfa7d168eaeaeac299555555f9f9f97a7a7ad6d6d6241269b0128d8d8dd9d9d9e3c68db3b1b1c9cdcde572b98b172fd6d119f031537f5dadadad5959590281a0ef16e8c7cfcf6fc78e1d14ca10bb8db72076d4f5dab95b2ffd2fef603ac69390f0ac70b47bf18ec07af03ec095f78b31e51f5dad7c712dc264c5bf8a2af3ce6fa287c585c05dd780440618b0daf2bbb38b87be8eed02fbcc670dfa96be07fd5af69d2d1c85be0139261e2c430ae3467a4a6da7aa81d1ec8c7bd93cded36735a50d70a3192011f16051d6ec5bff3cfc4406b258bd7d5e224d4dcdf440fd160fdb51e81b9063039c9ca95a049d2f410821c438fe4b4b445d87c6542d1801062433c0679382d20b013611c22ba28aaac5b10b57c02dd780a406b8f2fe6d600c7967f0abd340bb90e3a63f7dd9fb1606c0308907eb79cd2d7bc7f74583ea95753d5c9c6fd50cf0d11a0083130fd612db4dff3db62731bfaaaeaeaeaeaeae2afb5ff137d62f80513a4022e207efaacba259dcadfff7a1c1ca2a8410d236f1dac23cb30a6e630424221eac4e2e57efa313b73e3921e0717863b5c8ca021ea781db89e0910240027d82d5fb19f1dd835332ec5eececbd70555787dad3771b14ad22225d47a787402ef5099662f3b52d53d75e4008a1d829b17d17b20abef2954c7b05e45edf8377bd4f7e2408e2ce21db43fdbecbf0db7186dea8f510c8a501bee8f745a65d27b7aeeeb5c7e8289375e0180b4860c0db71dbccd098f2ba4319a3d03720c7c4dfb1ee5ddb6770b034f51fb3a4329402fc4d89bf6399ce5bdbd9458c835481b7219e1fbd55db5cbd3fb2383fc7de79b6e6ab99546fb8f11a90c4401f427f1e9837ad6faa009098f83b567d5d49e8bf6a62de877d21780be2ef58b6ff38f4c7bf63b3abb8f0d85e3072e2c1ba757a437cfc569a81c638e98c84067f4b3218090dfe8ec483a54c96b751bfe02f48e6f7e3027f0f102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c10258e00f16af3423a354f8f03041fdedd84f3de61be898da78ef49a9842f7cbdc3f007abee764ccced3a84102af9d6db3b41c92de2e4d9e820cbc75f2df6bf0037477a67c9f00bc8ecac1bfcadc74f6eb6524408b9bbe977587c73fdc9c7eb670eb2786666268bc5ea37332b2b4b5313be8c2f076412acc6d2070feb34b50ce68ecd6a1715569b3869c8958c8c8c5c5c5cfacd2c2b2bc3d1412075f883a536cd44fdfc5ef729f95508217463bbf5cfc7dcb579f70e871d375c9735d8db1542485757575757b7df4c168b555b5b8bafb3405af0074bdbfd508afb21e15d929e95ddafd7544108b575ccf46705ac805b8dbcb364778ca5a8aaa563ace56e8c104248dbf1e31532ab0c46015cc7025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c10258c8f0c91422bcd28c3c34df6eb6aa545bede9e9b970e1426666a69696969f9f9fbebefe1b57a9aeae663299f5f5f5d6d6d6adadadc5c5c5fafafa81818193260dfd6c0309d4d5d53199cc9a9a1a4b4b4b1289949797a7a7a747a5526fdfbeada8a8686767f7db6fbf71381c1a8de6e3e3a3a0f086ff7382201213136fdcb84126936d6c6c323232dadadaecededd96c764545858585859f9fdfb871e3065c97cfe77ffffdf7bffdf6dbd4a953030202747474a4f51a0724938734fdfcbaffc64544c4fdf7e79f7fce2895621d3f3fbf274f9e848484383b3bfbfafa9694940cbd7c595999b7b7b7bdbdfde6cd9b232323e3e3e3b76ddb666262e2e1e1c1e170a4d2a59a9a1a2f2f2f2b2babd0d0d053a74e9d387122242484c3e1040404d0e9f4a54b97faf9f91104111212525b5bbb76edda3736181a1a9a9f9fbf79f3661d1d9d75ebd6191b1bfbf8f87cfef9e7858585dbb76f9f3061828787079fcf175f91208855ab567576766eddba75c182055e5e5ed5d5d552798d832270ab4bf4d74708e95bdabeb2c4445bdb6489adaded67ff96b4b19090106f6f6ff1f96565656bd6ac114d969696fafafa0eddd4679f7d5658584810444a4acabe7dfbfcfcfc8a8a8a0882484e4edebf7fbfa41d1b507878f8ad5bb70882c8cece0e0909114e0adf69b66cd9b261c386bcbcbca54b970a175ebf7efd83070f8668adbebe9e4ea70b7f7675752d2b2b633018919191898989f6f6f6ededed04411c3e7c383131517cddbb77ef8686868a26333232b66eddba61c386f2f272a9bc5271327832c587cc4715cb0e6efaf2be55f8f19d1e06ca881de7198a8e5ef1a70cb95e6262e2a953a7facdaca8a8a052a9e20b5756569a9a9a8a268d8c8c6a6a6a86ee57555595b1b1b1b04d5353d3891327b2d96c2a956a666696949434bcd7f606c296453f8c1b37aea4a4445353d3dcdc3c2626a6b5b5954aa52a29297577778f1933c6cccc8ccd66f77d15e2afd1c4c444f8339fcf3732326a6e6eaea8a8f0f4f49c3367ced3a74f67cf9e4da552077cab16f544c8ccccecd8b16352dce38b93c9c1bbb281c7de947bc717e66e5ae231ece714ae58b1224dcca14387dcdcdcc417363131b977ef9e6832373777f6ecd943b76f6a6a9a9d9d8d10a252a977efdebd7bf7ae30b299999903667704842d2384cccccceedebd9b9999696d6dddd8d8989e9e4ea5524d4c4cd2d3d385a94208893a30983973e6e4e6e612048110525555cdccccd4d1d1a152a9191919c5c5c5060606c2ce9b9b9b0fd1132129bec6c1c8eee05dd9c063efe545396776f9d02fb3cdf74bb7f1a953a72e5cb870ddba752b57aeacaeae3e7ffefca54b97865e65c78e1dcb972ff7f1f1993973664a4a8aa6a6e6e3c78f131313535353af5ebd2a955e7dfef9e7cb962dabaaaa9a33674e4141417777b7a7a7a7b1b1f1679f7d76ecd8b1cece4e6f6feff5ebd7b358aca4a4241313136138063371e2442f2fafd5ab57fbf8f82c58b0804ea7efd9b367f2e4c9c1c1c10e0e0e696969191919cf9e3d1bf01f6fdebc792a2a2a9b376f7efffdf74b4b4b939292929393b76edd2a9597392092f03f409604f5c5990f95178ee8acf0e2c58b1c0e27282868c0dfe6e6e60acf0a57ac583161c28437b6d6d6d6969898585f5f6f6363d3d2d2525050606868e8e9e9a9a828b5ffb7aeaeaea4a4a467cf9e2d5cb8904422e5e6e6eae9e9cd9f3f3f3d3d7dcc9831cececebffcf24b7d7d3d8d465bb468d1701a2c2c2cbc75ebd6c48913ededed6fdebcd9dedeeee4e4545a5aca66b32d2c2c064c95484646464e4eceb469d3962f5faeacacece7e7b763c70e0a65e84392111a8560bd8da18305248235587081146001c102588cc695f7b7a0aeae1e1414141111f1c68bd47db5b7b78f1f3f7ef8cb7775758d19334678b2364c6d6d6d2a2a2ac35f9ecfe7934824890ee6242d211008b4b5b587f804e2d9b367126d16c960ba3e86cff6eddb73727286bf7c7777b793939344250e1e3c78fdfa7589567170709068792693f9ef7f4b767d58d212972e5d3a7efcb844ab4811ec0a0116102c8005040b6001c1025840b00016f2172c05050589ae35208424fd8846d26b0def4c092992b38f7410423c1e6fc28409241269f8abb4b4b4a8a9a90d7ff9b6b63665656589fe2a9296e8ecec2491484a4a4af84af0f9fceeeeeec1be508a9bfc050bc805f9db1502b900c1025840b00016102c8005040b6001c1025840b00016102c80859c058b1de7492291482452781aa6d6fb369c162e2ce619c77efbc65f35f67ae7a55ae2cf1a7d9b936e89611bad6f188e446a184261a9044194331988c194eee8f0722603a1def65f4d0b6b88cabe85d43051137f3627dd127d6a602b317cf214ac7226e3d5a69176b252c310623053ff2c4010a961a20a52fe9b889ac35a4214274c25de409e768515ec6406c510218410c5602e4a665748ad69d74882b8e26fd8670ebbf2119a6b201c72674861a04795d2da91b02b1f2106c5106789b4f42861cbf84abc891c058b5df94886d52ad8c958da65c7850620e6517f0aa612ec384f12c92d8ac1f47745f85ec59bc951b02806736558cd90c2907ea3ec384fa380b9a9bd37dac15282e27f852088723acbc8338e8da7c4b0c851b0902185f16af727da9d604331982bda7154b093453b94914b0b2719b1e8e544a42bb61222af0e1530967803790a16c5602e8a4a4f4308b16fb092197467ac1bc990c24866dd6023e1114b988beb1bd7180a3bced3ed11b3fcf59b8249bd84e84286a83de9969084acce12a4a3f79a00a6d39bf2be678584f03c0a212485f34f51bf5fe97bed413a25fab6f65a7bd22d315cf00d5280853ced0a811c8160012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c2058000b0816c0028205b08060012c205892e87f73872117f48cc3de9fbf300816c002823522ec384f527878b8d8dd637aefecf2da8d5dfadd02262d5cf4eb61bf01ca2108d688453da2f4de7623ea441c1b09c70e4685a512047194f2a877687bef78428220ca9928c0283c0db94696d359a1716c84d2e258f4f248d98df4932908d688f58e987575793598af829ddc7bcb048a7fb070669f91b514ffe030e1a8648aff513a2bd4d3d30d05fbcb6a60b2cc41b046acff70f5c16e5a921c6024dc15ba45bdba430ec53f786e321286f01d05c1929ac16e5af2daa06de19e2f2ddc0d317b7788ef280896f4b8ba842507c4a52184d87127a2104208519ce98cde23309416de7bfc9e16ee865223fdfd8fbecbd192b3a7d8ffb5b946a68691dc4851088531990c16420851fcafa4b24946a40084100a4b25fc519ca71b4a2584476247e99e46e106c4bb78000ff76e0058c0ae106001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c1025840b00016102c8005040b6001c10258fc3fd606501bc43965710000000049454e44ae426082}\line \cell \row } diff --git a/tests/testthat/test_outputs/png2.rtf b/tests/testthat/test_outputs/png2.rtf old mode 100755 new mode 100644 index 8bceec5..68d29cd --- a/tests/testthat/test_outputs/png2.rtf +++ b/tests/testthat/test_outputs/png2.rtf @@ -9,7 +9,7 @@ { \trowd -\trqc \clbrdrt\brdrs\brdrw18\clbrdrl\clbrdrb\brdrs\brdrw18\brdrcf1\clbrdrr\clvertalt\cellx9189 \pard\intbl\ql\fs18 \qc{\pict\pngblip\picwgoal774720\pichgoal277920 89504e470d0a1a0a0000000d494844520000021a000000c1080200000006bd8eb400000006624b474400ff00ff00ffa0bda79300001faf49444154789ceddd695c13d7de07f0136471add462504004236eadf5aa288b5cd9032204ad6b15b556c4e2d5ba3d42ddbadc7aada0d5aaadbde0f6b117ab75692b8228a8280ab855c42a7ba0a84040d420601602f3bc88c6c8044432248cfd7d5f79e2c999ffc909f96566320987a228020000a01d037d170000006f02c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c00043dd6c465153f9b0d6d0d4dcd48428ee5d3bf45b3a191530c5c9d6e475c7a9acac4c4e4e6e8b0a0100de780606060281c0c8c8a82d06e75014d516e3aa51e41d5c3063c6de3f08e1f2b7fd129233edff2e0fb022f72f19cc483eff1fb7aeaf35d6e1c3878f1f3feeeaeada46b5ea524141c1f9f3e767ce9cd9a953a7dcdcdc73e7ce7df2c9271c0ea7d5039e3f7fbeaaaacadfdfdfc0c0e0d2a54b15151593264d62b0609d49494979f4e8514040808181415a5a5a4949c9d4a953e9dd9e3c79b26fdfbe9933679a9999555454fcfcf3cfc1c1c15dbb6a78461d3c78d0d6d6d6d1d151a150fcfefbef161616cececef46e4545454949494141419d3b772e2828387dfa746868a88141e33df88686861f7ffcd1d7d797c7e3d5d6d6c6c4c4f8f8f8d8d8d8d0074c4d4d2d2f2f170804868686696969f7eedd9b366d5a6b1e117d4b4b4b2b2d2d9d306182a1a1e1e5cb978b8a8a3efcf0437ab79a9a9addbb77cf983183cbe55656561e387060eedcb96fbdf516bde7e1c3872d2d2d9d9d9d1b1a1a4e9c38d1a3478fb163c7d2bb151717272424cc9a35ab4b972e858585f1f1f10b172eecd0a103f3336cad63c78e71b95c171797868686b8b8385353536d5e9d288afaef7fffebe9e93960c000894472e0c0013737b7fefdfb3358f04f3ffdb47fff7e1e8fc7e0982f506dad3a76b1cda49d99d57575d5993b2771b9a1bf3da2288a7af45b2877f6cfe54ddf4f26933da2d9bd7bf777df7dd7e635ebc4f4e9d3efddbba76a2e5ebc382323439b015d5d5d150a85aae9e1e12193c9b419505fdcdcdcd427e2e5e5259148e8ddbefbeebb23478ea89a070e1cd8b97327bd5b6d6dad8f8f8faa2997cbdddddd356e77ce9c39050505aae68a152b2e5fbe4cef969696161616a66ae6e5e5cd9d3bb7a989d4d5d5a99a7c3effe9d3a71a7bb673eeeeee72b95cd5f4f5f5adaeaea677fbf1c71f63626254cda3478f6eddba95de4d2a957a7a7aaa9a0a85c2cdcd4de376e7cf9f9f9595a56aae5ebdfac2850bada8bf8d347a2e29140a5757576d06bc79f3e6a2458b54cdfbf7ef4f9b364d9b01e9e6cd9ba7fe246796fac1ae948dff5c13af3974c6ffe7e2671ade3cb4447959b195f3bcf7bb1a12f2beb3f380919d86bc4d08216f0f193a725f753521dc26ee77ead4a99898984637666666dad8d82c59b2a475b5b42b0f1f3eecd5ab97aa696969291289b41990c3e1a8bf71ebd9b3e7e3c78fcdcdcdb519535fd427626e6efef0e1434b4bcb467d442291838383aa696565959b9b4b1feac18307ea8fb3919111d5c41e79454585fa56acacac34ae88482452ef666969595e5eded4440c0d5ffc89f5ead5ebc18307d6d6d64d756eb7288a523f3c62616151515141df1114894483070f5635adacacae5dbb461fedd1a3475cee8bbffb66f636cacbcbadacacd407d4f26f845962b1d8cccc4cd5ecd0a18336471708eda9a57ce66b33a08ea9c7899dcfaa55ef6beed6dbaed55be08df134f2080d2af5b4254567ef985b3444440f5bc72789117b2a9c7e6c668f4b201008048246372e5bb6acacacacd5b5b42bf6f6f6274f9e54ceb1a1a1e1cc993373e7ced566c0b7de7a4b28142a7763c562f1fdfbf7599a25a6a6a6f9f9f97676768490aaaaaaa2a2227a9610421c1d1d6363631d1d1d95cdd8d8582f2f2f7a376b6bebdcdcdc9a9a1ae5cb5f7676b6fa4b803a07078713274e4c993285104251d4e9d3a777edda45ef3672e4c85dbb762d5ebc58f9da71e2c4092727278d03f6e8d123272767d0a0418490eaeaeafcfcfc3e7dfab4e0016877ccccccb2b2b2860c194208a9a9a9c9ceceb6b5b5a57753ae88ea684f6c6cacc647a677efdec5c5c5555555ddbb772784e4e7e79b9a9a6adcae72c09933671242288a4a4848d8b66d1b5393d25ecf9e3d4b4b4bc562b1b27ea150a8f1c85ecb0d1f3e7cd3a64d616161ca43ac090909a3468d62a6569d508f93dec3fd7a0f276545d99d2c069bbef659f226bdfbe9b1936f47ed89cb20633e8f5ee890f3c5f889b60bc890a0353f2d60d323c5b8d5ab574f9a34293939d9dadafad4a953ca23ceda0cb879f3e63973e678797975ecd8313e3e7ee3c68d4c95aa63ca89787a7a76eedc392e2eee9b6fbed1d82d3030f0d4a953b366cdb2b7b7bf72e50a97cbf5f5f5a577e37038ebd7aff7f3f3f3f7f7afa9a9494e4ea6eff52aad5cb972f2e4c9972e5db2b1b1494c4c9c3871a2fa5b63156b6beb808080f1e3c77b7b7b1715151516161e3972a4a989cc9a35cbd3d3b34b972e274e9cd8b0618396ef5ef565f3e6cd3367cef4f0f0e8dab56b5c5cdcd75f7fad7122bebebe0909093366cc707070b87efd7ab76edd020303350eb861c3067f7f7f7f7fffa74f9f9e3d7b76fffefd1abb2d5bb66cca9429972f5fe6f178494949e3c68dd318637ab471e346e593412a959e397366dfbe7dda8cc6e57267ce9c396edc385f5fdfbb77ef6665651d3b768ca95275807e2afe76d4b4d9db6f9b8d9e3479cac400cfe1bd99cb150628f74e0e1d3aa4ef42984151d4d5ab572b2a2a468d1aa57e40a6d56432596a6a6a5d5d9d939393966f94f44b2693a5a5a5c9e572474747e57bd8a6646767e7e5e50d1a3468e0c081cd747bfcf8f1952b573a76ece8ecec6c6c6cdc54378aa2ae5dbb261289eceded2d2c2c9a19b0a4a4e4faf5eb161616cdbf7f94cbe5a9a9a93299ccd1d1b1a9f7e0ac2097cbd3d2d2a452e92b27929b9b9b93933360c000f5035f74555555972f5f363636767676363169ee65e6faf5eb252525f6f6f61a7752f54e39112323a33163c6343f91162a2b2bbb7efd3a97cb1d3d7a34e3ef3f82838357ad5ad546a7e29bf864974c9c7de9f0c198a3c7ae56bee7fad1d4f91ff80cb5eaaaa30f1537e70d8b1300005d6ad33869e2324613d3c19e1f877d1db16991db93c4ff7c1ef4cf6e76fe1b2f3d6e8b0a0000e00d408f1399383b3d66fbc26923ec860a362677f0da70f1ee9d3b45d2789ff4499bcfebbe4000006003fa01ac944d93773e5e10f4596ca4faf12d131bbfb043b2213aad0d00005883be77e2fd9fcce88fde36327a9625d77eda18572423a4336f8cbbf28a11000080c6e8715273fe8b710be3c5cf9b9dc8cd2f1d579ea8d169550000c032f438494fd8e0ba3e66f67bcf9aefcd8e591fb4e352ba6ecb02000076a1c78985a57bc6ad4c99aaad282d2b7331d7eafa3a000078d3d14fc5bf3bebdf1ed3fdacf7f306f4e84008a97f9427f78f491aa6fbd20000803d345c9af8b6cbda78e1b46b29b7febc55d2f9fda1ef0e77d6cba5f172b9bcb6b6b6d18dcaafc8d57d310000d03ccd57ba1b76b573f2b373f214978b155dded1cfd7ac68fc46e19b376ff6eddb572ff5000040335e8a1345dec1a58b0a2627ae7323e471d29af1413f4b2d49c663873da7633e1ea0ebaf5879e3bf511800e04da27e2abef4e097eb4d16063b114248fa0f4b6fcfba987fe3467ec50ecb6f57ee15eaa93e00006005f57d8e3bb70f9a3fe2ed5cff072192fc045983e3ffbe5a4708218fcc630fad5f67bae2eba9ef35310a0000fccda9c709d7dc85984ffe62f930c3c7c7427e355df2fd5a27428822730bfffcd0a5c8120000689a7a9c0c0b9ccff59a30fa372b72fffef0c85427426e1f5eb8eeab84f209d1f1f8a030000034e3a513ecbcd9877204d937b2c9e011ca9f637cc7ceffd3435ffd7368cf76f053270000d08e35be2adec474b093939de1dda2324208e9616b6baa9049157a280c0000d884fe252b8acced014327c4e4137267fbb88193fff52f9fa1d3a3f390280000d00c7a9c5c3b11d567f3a5756349fa6f51ddbe8e4d4bbbb4b9c7b6c3d7f4501b0000b086865f63945476ebd28d90ccf4d3e69e63788474ebd22dab1a5f500f0000cda0c789bd77f085d00973834277f49b3ff95d223cb2606dcc621727ed3623aba9511e2e53d45466a72767fc2596bde21e0c108bc5ab57afe6f3f973e7cefdf3cf3f9be979e4c8910f3ef820202060f7eedd0d0d0d5a6eb7aeae6efbf6ed7e7e7e53a64c494848d0723442485555d59a356bf87cfe471f7d949999a9fd808cbb7af56a5050908f8fcf575f7d5553d3e47b8faaaaaa75ebd6f1f9fc3973e6646464e8b24200fdcacccc9c33670e9fcf5fbb76ad582c7ef51dd8886aacae4e529d97167fee46a994a228eacfe351e7efd6d17abd86ba8c6d7ceea43d7f5175b97ba6d93cdf2ed769596ce96b8fb574e9d269d3a6b5a4a74c267377778f8b8b93cbe5595959aeaeaeb76fdfd6d8f3871f7e080d0d7df8f0617575f5975f7e191e1efeda65bd2c383878dbb66db5b5b52291e8c30f3ffce5975fb4194d2e977b78789c3871422e97676767bbb9b9ddba754bcb0a99959e9eeeeded5d50502093c90e1f3eecebeb5b5f5f4fef565757e7e9e9f9fbefbfcbe5f2dcdc5c7777f78c8c0cdd570ba07bb76edd727777cfcece96cbe5b1b1b11e1e1e72b95c2f95cc9b37afa0a0a08d06a7c749f26aeee2d8a7cc6da1fce7d94396273ca2a8f29f671341c4958a3a8aa2ea2aae4408b88b63ab9bbe9f5c2e7f44131a1a3a75ead4966cf6ecd9b39f7ffeb9aa79e3c68d458b1669ec3976ec588542a16abab9b9d5d5b53e3fc562b19f9f9faa29954a3d3d3d5b3d1a4551e7cf9f5fb3668daa999999191a1aaacd808c0b0a0a2a2a2a5235972c5972fdfa757ab78b172f7ef6d967aae69d3b77e6cf9faf83f200f46ee1c285999999aae6dab56b939393f552499bc609fd8292010e530b934e663bf9d8997565e2721389a4b66fff7e6f13522ca91de73b61744f43428861cfd1137c47ae2c2b27a46b13f74b4848d0f88dc2d6d6d62dd96c5959599f3e7d544d6b6bebd2d2528d3d0d0c0c3a74e8a06a9a999989c5623333b3966c85aebcbc5c7dbb262626f5f5f5ad1b4aa9e513d1978a8a0a0b0b0b555359e1c891231b75a34f04dfe6097f13edffaf9811f473277752bf8fdf317948cf6e469c17c2935abd85beae7e9d23576f492beb3571c1d0f8ef8f658b658a9afb69d1117ba49e63784ddf4f20101ca6193f7e7c0b5fe8edededd5cf5bc4c5c5393a3a6aecd9a54b97e2e262e5bfc56271595959abb38410c2e3f1323333251289b279fbf66d7373f3568f4608b1b7b73f75ea94aad9cc44f445bd428aa2121313478c1841ef3672e4c8d3a74fab9a7171710e0e0e3a2a1140af1c1c1ce2e3e355cd93274f8e1a354a8ff5b411fafec7d85522d1f2c6379a98b67e13bc8f771d55ac5be5659d546936a473e4901d8410ee90099f7cbb7fe1bbad1ff555060e1ce8e8e83861c2042f2fafbcbcbce2e2e2c3870f6becb969d3a6193366f8f9f9191b1bc7c6c66edcb8519bed76e8d061eddab57e7e7e0101014f9e3c397bf6ecc18307b519b07ffffe2e2e2e818181dededef9f9f9858585478e1cd16640c6ad5ab5ea830f3e484949e9dbb76f4242c2c489132d2d2de9ddfaf5ebe7eeee1e1010e0e3e3535050909f9f7ff4e851dd570ba07b4b962c993c79f2b56bd7ececec121313dddcdcecececf45d14f338d4ab7edc505153f9b0b2ced8a6f7dbda6e4b5153f9b0b69e900e5dde69ed7134e5ef9d1c3a74a885fd8b8a8a323232acacac468f1edd4cb7a74f9fa6a6a6d6d5d58d1933a67bf7eead2aed25959595e9e9e95dba74717171313636d67ec0bffefa2b2323c3c2c2a27dbea3a7282a2d2dada2a262d4a851565656cdf42c2e2ebe71e346efdebd1d1c1c381c8ece2a04d02f8aa2ae5ebd5a5a5a3a62c4083dfe06607070f0aa55ab78bc660e0cb51e3d4e14797b837ce6fdf297fa6d369f5f28fa6a6c5b6cff35bd6e9c0000804a9bc68986abe20f7f5b30f544912861cd90493fde2abaf1bfc5e3c3a297b6872c010080768b1e2735d5599e5efe36e62ef6ae17ef3db4191eb421b8fadffbdae3b5730000d06ed0e3a41f4f70f64c5c99acab6dff0129e969353577ef95e43d7cac87da00008035e871c29bf1ef8f4bc3bf4f21c3a6affcc7b131ddbabdbbfec1327f173dd4060000aca1e103565d872dfcdf1d420821821d97abd7944bdfb63433d171590000c02ef4bd13a2c83bb8c0798df2ba45c3ae7f6e1f3569e3251ceb020080e668b82a7ee727df9aae5ef4fca35c6397ee78f7e8e7cf765700000034a2c7496949b2abbb6fefe787b74c7afb7b792697bc81df2f030000cca19f3b7172591cb2f50b67f3f92e169d082112e1af31673ff65fa1f3caeaeaeae8bf9c2193c95e79193f0000e81e3d4eba066c8a17aff8d707b693ff228410ee9009cba2f64ee1eaba306dbf5118000074891e2732b1d862eaf7c9b3be57d454d61899999a286a2a1f8a65c454c79fee1208040281a0d18dca2f59d16d210000f06a6a71f2ec1b1a2f6de8953256b4fad98526e5e54472669dedad295484b77e2a04000016508b13c32709cb2c671f248490edbdb6ab771ab9e8f8973aad0a00005846fd935d16b37ea628eac2372edf5c78f9271bafef1058343902000080a69fcffaece25899b8bc5ca67ea389a9b9aecf9d0000008b68f846e1f35f385bbfddeb65dfa4e8a1360000600dfade497ac2bf6d37e425ceb16be50f260200c0df107defe4dd7fcc96c9a98ec812000068397a6a584cf93fef695387fd6fa0abe780779edf3874dad753dfd369610000c0269abe0272c92737acd4b3040000e015e87b270fcaef2cffb1e45bdfb63bda55939772838c183ba06b9b6da18ddcbb772f32325228140e193264e5ca95e6e6e6faaea895eedfbf1f19195950503078f0e0952b57f6ead54b63378542b17bf7ee53a74e75ead469eedcb97c3e5fc775fe7d949696464646e6e5e50d1c3870e5ca9516169a3f99dfd0d0b067cf9e93274f9a9898cc993367dcb8714d0d78ebd6ad6ddbb68944222727a765cb9675e9d24563b7dadadaad5bb7a6a7a79b9b9b2f59b264d8b061cccc47e79e3e7dfadd77dfa5a6a672b9dc4f3ffd74f8f0e14df54c4c4cdcbb77af542af5f5f50d0e0e3634d4fc4a271289366dda949d9d6d6767b772e54a2b2bab36abbd95ce9c39b367cf1e8944e2e3e3337ffefca626a253546375b97b8282be4d2d7a2ca5fd57ab54e75e887fd9fe152e2e2bf6c7c7c75fc87dddc1962e5d3a6dda34660a7b4d2291c8d9d9392d2d4d22919c3d7b76cc98315555557aa9444be5e5e5cececea9a9a91289e4dcb973cecece62b15863cfd0d0d0888808b1587cfffefde9d3a71f3a7448c7a5fe4d5456563a3b3ba7a4a44824929494146767e7870f1f6aecb974e9d2f5ebd78bc5e2929292a0a0a09f7efa4963b78c8c0c7777f73b77ee3c7dfaf4975f7ef1f1f1512814f46ef5f5f5e3c68d3b78f0e0d3a74fb3b2b2dcddddfff8e30f2627a62bf5f5f57e7e7e070e1ca8adadcdcecef6f4f4bc7af5aac69e870e1d9a3e7dfabd7bf7aaaaaa222222162e5ca8b1dbe3c78fc78c19939c9c2c91485253539d9c9ccacbcbdb7206afede8d1a353a74ebd7bf76e5555d5e6cd9b172c58d0c23bce9b37afa0a0a08daaa2c749629886d0094b6cf516ca8f85d810426c86bb3ce73484cb1de2e4e2e232ff4033f793cbe58f68424343a74e9ddaea5ab4b179f3e65f7ffd55d5dcb56bd7be7dfbf4528996b66edd7ae4c8115573efdebdbb77efa677abaeaef6f1f15135a552a98787872eeafbfbd9b973674c4c8caa79e0c0811f7ef881de4d2291a82f815c2e777777d73860707070565696aab962c58af4f4747ab76bd7ae2d59b244d5cccbcbfbe8a38f5a51bfdeddb87163d1a245aa66616161505090c69e1e1e1e52e98b37cabebebed5d5d5f46e7bf6ecd9b3678faa79f4e8d12d5bb630572f033c3d3d251289aae9e7e7d7d49bc246da344e345cc6b84a245adef84613d356effe703f88ca290cd8b0f8f33f4686ef58ed6f6b4284d181cbc996e321bc66efa7f11b85737272060f1edcea5ab4515a5aeae1e1a16adad8d85cb972452f9568a9b4b4d4c5c545d5b4b1b1b978f122bd9b4824ead3a78faa696262d2d0d0a08bfafe7e4a4b4bdf7fff7d55d3c6c6263e3e9edeedc18307969696aaa6919111d5c48f35949696f6eddb577dc09292127ab79292121b1b1b55d3dada9aa5dfafda682256565622914863cf8686061393171764f7e9d3a7acacccceceae51b7d2d25267676755d3c6c6263d3d9dc98ab5565f5fdfb163475553b976ddbb77d7634944d3a9781353733aed2e8937b1f5ff2a2e7dc7a86b8b9dfcbf882b92bdfa1e84108140709866eddab5aeaeaedad4d26aa3468d4a484850354f9e3c397af468bd54a2a5164ec4d6d6f6f6eddb128944d9cccdcd7de71d7c3aa34db47045acacacf2f3f36b6b6b954da150d8d4cb47a301131313478e1c49ef367cf8f03367cea832e9d4a953f6f6f6ad9e851e359a4853f32584bcf3ce3bb9b9b9ca7f4b24923ffffcb35fbf7ef46eedff8f9dcbe566656529ff2d954a6fdebcd9bf7f7ffd964408e134f506a74d281e5cddbb76e937bf0bdfff3aed557b271a9d3e7d3a3c3cbc67cf9e3299ec8f3ffe50cf671d904aa5c6c6c6060606f5f5f57575758c6c9da228994cd63e27525757475194b1b1b1fa5d9a1a93a228a954daa953a7b62a5a57f43211a9546a6464d4a14387e65744a150343434a8564479177a37e593cad8d8582693191919a9ee422797cb0d0c0c0c0d0d9577313131e170380cce8b291289a4f91569e1441a1a1ae472b9f2e195cbe51c0ec7c8c848e380aa8757fd2e8c18316284f68348a5d28a8a0a2b2b2b0303838a8a0a4343c31e3d7ab4e48ef7eedd3b77ee5c539ff5d0561b1d446b465dc5ad731772351cb07c1dc5c5c5b367cf66a620bdba7ffffecc9933f55d0503cacacaa64f9faeef2a18f0e0c183c99327ebbb0a063c7af468e2c489faae82014f9e3c090808d077150ca8adadf5f3f3d377156d480f9f2d33ec39d4bda7ee370b00006da8c963170000002d873801000006204e000080018813000060005be3c4c0c0a0990fadb20826d2de6022ed0d26c216babdee8451d5d5d5ddba75d377150cc044da1b4ca4bdc1445881c571020000edc79bbce70500003a833801000006204e00008001881300006000e204000018803801000006204e000080018813000060004be324299cc3e170389cc068a1be4bd186303a90a3129ea4ef725a2729fce56560efdabc341356ae8d5ad16a0f3f0b5744d34458b922aa07ffa5479f852bd2226c8c136174203f27aa80a2a8c4410bfab3e679a541a130561055f0ec97cc22bcf55d4e2b248573f8916a6df6ae4de399b0706d84d1cbe3c72b4b2e88220b96470b093b5744e344d8b82224299c4f1229eaa5479f8d2bd2426c8c934261ac60bc278f10e2ed154622cfb0763d84453964902d4fdf65b496303a90c3278989616ab7b1736d34cc848d6bc30b397e3c445932cf73bc2036feac909d2ba271226c5c11e21df13cf8bcbdc2484e9190b073455a888571a2feb4eac7133c5b23362a14c692483ecb76de5fe0851c6ffc2e91a56ba361262c5f1b52288c25836c796c5d91179e4f84ed2b92742652390fd6af483358182785c2587d97c00c61510e79b6f79e1816c97f138ea3626dda87a4707e6458628437eb57e4c54458bc22c2e8400e871f29880af126ac5f9166b1304efaf104fa2e8119bc90e3d4b37d7aef90a867bbf4ec86b5690792c239fc9ca802e5de169b57e4a589b078457821c7298a2a181fdf3f305ac8ea15791516c609cf76906a0751b527fc2678032682b5d1b7a4700e9f243e7fe165f18a349e4863ac99c8733cdb41245658c8de15690116c609e9c77bfede24e94c2409f362c7673ce8d43e979a14bd2096bd135183b5d1a7672fc12f9d0562e58a6898082b5744181da83acfa37af859b9222d44b1d2f3cfe0bcf8e0202b15443ddfef65f14412c35eae9ebd6bf3d24c58b8362f7dc64ead70d6ad88e689b0704528f5b9a855cdba156921fc1a23000030808d07bb0000a0dd419c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c000000031027002d208c0ee48427b5b06360749bd703d0fe204e00008001881380d7218c0ee484878773945eecb024296f0a8c16bee89bf4bc9bf2d6a470d57fb7786707803d102700af2b328757405154621889fc3e5a4808114607f223c312298adac2cb895576124607f273a20a288a2a88220bfa872711ef8882f1f1cba3858424452f189418e1add74900300d7102f0ba04e33d7984106fafb06737140a63055121de84105ec822e58dc2b3f1b1cffaf1421685919c222121bc902de3e3970706f209c204de3c881380d735c896f7525b5894a3b15fec82feca835dfc48122b2c2484105ec8a241b144193d006f16c40980b678b68334de1e9648bda0dc1d490ae793a86787bc00de2c881300ad797b85c52e884e228408a3bf8f248410c2f31c2f7876668524853f3b1b9f14ce27891121215b1028f00632d47701006f00ef88c4300e9f134948585494209e10427821c713859cfe9c0584101296488590e8403e49a4946758b68c0fec1f6e4be10c0abc41381445e9bb060000603d1cec02000006204e00008001881300006000e204000018803801000006204e00008001881300006000e204000018803801000006204e00008001881300006000e204000018803801000006204e00008001881300006000e204000018803801000006204e00008001ff0f5289584e859a62b80000000049454e44ae426082}\line \cell +\trqc \clbrdrt\brdrs\brdrw18\clbrdrl\clbrdrb\brdrs\brdrw18\brdrcf1\clbrdrr\clvertalt\cellx9189 \pard\intbl\ql\fs18 \qc{\pict\pngblip\picwgoal774720\pichgoal277920 89504e470d0a1a0a0000000d494844520000021a000000c1080200000006bd8eb400000006624b474400ff00ff00ffa0bda79300001fb449444154789ceddd695c13d7de07f01364716da9c5a0800846dc5aeb555116b9b20764095ad72a6aad88c5ab757b84ba75b9f55a41ab555b7bc1ed632f56ebd256045150511470ab8855f640518180a8a1805908ccf3221a231310c99030f6f77de5892767fe2727e49799c9241c8aa208000080760cf45d000000bc0e10270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c000000030c75b319456dd5c33a4353735313a2b877edd0af196474e014275b93571da7aaaa2a2525a53d2a040078ed1918180804022323a3f6189c4351547b8cab46917f70c18c197b7f2784cbdff67368eeb4ffbb3cd08adcbf643023e5fc7fdcbabfd258870f1f3e7efcb8abab6b3bd5aa4b858585e7cf9f9f397366972e5df2f2f2ce9d3bf7f1c71f73389c360f78fefcf9eaeaea8080000303834b972e5556564e9a3489c18275263535f5d1a347818181060606e9e9e9a5a5a553a74ea577fbebafbff6eddb3773e64c3333b3cacaca9f7efa292424a47b770dcfa883070fdadada3a3a3a2a148adf7efbcdc2c2c2d9d999deadb8b8383939393838b86bd7ae858585a74f9f0e0b0b333068ba07dfd8d8f8c30f3ff8fafaf278bcbababad8d8581f1f1f1b1b1bfa806969691515150281c0d0d0303d3dfddebd7bd3a64d6bcb23a26fe9e9e965656513264c303434bc7cf9727171f1071f7c40ef565b5bbb7bf7ee19336670b9dcaaaaaa03070ecc9d3bf78d37dea0f73c7cf8b0a5a5a5b3b3736363e38913277af6ec396edc387ab7929292c4c4c459b36675ebd6ada8a828212161e1c2859d3a75627e866d75ecd8312e97ebe2e2d2d8d8181f1f6f6a6aaacdab134551fffdef7f3d3d3d070e1c2891480e1c38e0e6e63660c000060bfef1c71ff7efdfcfe3f1181cf339aabdd5c42db699b433aba6bebe266be7242e37ecd7471445518f7e0de3cefea9a2f9fbc964b24734bb77effef6db6fdbbd669d983e7dfabd7bf754cdc58b176766666a33a0ababab42a150353d3c3c6432993603ea8b9b9b9bfa44bcbcbc241209bddbb7df7e7be4c81155f3c081033b77eea477abababf3f1f15135e572b9bbbbbbc6edce9933a7b0b050d55cb162c5e5cb97e9ddd2d3d3c3c3c355cdfcfcfcb973e7363791fafa7a5593cfe73f79f24463cf0ecedddd5d2e97ab9abebebe353535f46e3ffcf0436c6cacaa79f4e8d1ad5bb7d2bb49a5524f4f4f5553a150b8b9b969dceefcf9f3b3b3b355cdd5ab575fb870a10df5b79326cf258542e1eaeaaacd80376fde5cb46891aa79fffefd69d3a6693320ddbc79f3d49fe4cc523fd895baf19f6b1234878eff7f2e7eaae1cd436b5494975839cf7bafbb2121ef393b0f1cd565e85b8410f2d6d061a3f6d5d410c26de67ea74e9d8a8d8d6d72635656968d8dcd92254bda564b87f2f0e1c3debd7bab9a9696962291489b01391c8efa1bb75ebd7a3d7efcd8dcdc5c9b31f5457d22e6e6e60f1f3eb4b4b46cd2472412393838a89a565656797979f4a11e3c78a0fe381b191951cdec91575656aa6fc5caca4ae38a884422f56e969696151515cd4dc4d0f0f99f58efdebd1f3c78606d6ddd5ce70e8ba228f5c323161616959595f41d4191483464c81055d3cacaeadab56bf4d11e3d7ac4e53effbb6f616fa3a2a2c2caca4a7d402dff469825168bcdcccc54cd4e9d3a69737481d09e5aca67be3603ea987a9cd8f9ac5af59ee66e7decdabc05de584f238fb0e0324f5b527cf68eb9456364ccf0757c9214b9a7d2e98716f6b804028140206872e3b265cbcacbcbdb5c4b87626f6f7ff2e449e51c1b1b1bcf9c393377ee5c6d067ce38d378442a17237562c16dfbf7f9fa559626a6a5a50506067674708a9aeae2e2e2ea6670921c4d1d1312e2eced1d151d98c8b8bf3f2f2a277b3b6b6cecbcbabadad55befce5e4e4a8bf04a87370703871e2c4942953082114459d3e7d7ad7ae5df46ea3468ddab56bd7e2c58b95af1d274e9c707272d23860cf9e3d737373070f1e4c08a9a9a9292828e8dbb76f2b1e800ec7cccc2c3b3b7be8d0a18490dadada9c9c1c5b5b5b7a37e58aa88ef6c4c5c5697c64faf4e9535252525d5dfde69b6f12420a0a0a4c4d4d356e5739e0cc9933092114452526266edbb68da94969af57af5e65656562b15859bf5028d47864aff5468c18b169d3a6f0f070e521d6c4c4c4d1a3473353ab4ea8c7499f117e7d4690f2e29c2e16434c5ff92c79b3def9e4d8c9b7a2f7c46792b19fc52c74c8fddc7fa2ed02323478cd8f0bd8f448316ef5ead593264d4a4949b1b6b63e75ea94f288b336036edebc79ce9c395e5e5e9d3b774e4848d8b8712353a5ea9872229e9e9e5dbb768d8f8ffffaebaf35760b0a0a3a75ead4ac59b3ecededaf5cb9c2e5727d7d7de9dd381ccefaf5ebfdfcfc0202026a6b6b535252e87bbd4a2b57ae9c3c79f2a54b976c6c6c929292264e9ca8fed658c5dada3a3030d0dfdfdfdbdbbbb8b8b8a8a8e8c89123cd4d64d6ac599e9e9eddba753b71e2c4860d1bb47cf7aa2f9b376f9e3973a6878747f7eedde3e3e3bffaea2b8d13f1f5f54d4c4c9c3163868383c3f5ebd77bf4e8111414a471c00d1b360404040404043c79f2e4ecd9b3fbf7efd7d86dd9b26553a64cb97cf9328fc74b4e4e1e3f7ebcc618d3a38d1b372a9f0c52a9f4cc9933fbf6edd366342e973b73e6ccf1e3c7fbfafadebd7b373b3bfbd8b1634c95aa03f453f1b7a3a7cdde7edb6ccca4c95326067a8ee8c35cae3040b97772e8d0217d17c20c8aa2ae5ebd5a5959397af468f503326d2693c9d2d2d2eaebeb9d9c9cb47ca3a45f32992c3d3d5d2e973b3a3a2adfc336272727273f3f7ff0e0c183060d6aa1dbe3c78faf5cb9d2b973676767676363e3e6ba511475edda359148646f6f6f6161d1c280a5a5a5d7af5fb7b0b068f9fda35c2e4f4b4b93c9648e8e8ecdbd076705b95c9e9e9e2e954a5f3a91bcbcbcdcdcdc810307aa1ff8a2abaeaebe7cf9b2b1b1b1b3b3b389494b2f33d7af5f2f2d2db5b7b7d7b893aa77ca891819198d1d3bb6e589b4527979f9f5ebd7b95cee983163187fff111212b26ad5aa763a15dfcc27bb64e29c4b870fc61e3d76b5ea5dd70fa7ce7fdf679855771d7da8b825af599c0000e852bbc6493397319a980ef1fc28fcabc84d8bc6375cfdcf67c1ffec6117b0f1d2e3f6a80000005e03f4389189733262b72f9c36d26e9860634aa7b16b4edcbd73a7589ae0933169f379dd170800006c403f8095ba69f2cec70b823f8d8b523fbe6562e3177e483654a7b50100006bd0f74ebcff9315f3e15b46464fb3e4da8f1be38b658474e58d75575e31020000d0143d4e6acf7f3e7e6182f859b30bb9f985e3ca13b53aad0a000058861e2719891b5cd7c7ce7ef769f3ddd9b1eb83775ccad06d590000c02ef438b1b074cfbc952553b51565e5e52ee65a5d5f070000af3bfaa9f87766fddb63ba9ff57edec09e9d08210d8ff2e501b1c9c3755f1a0000b087864b13df72599b209c762df5d61fb74abbbe37ec9d11ce7ab9345e2e97d7d5d535b951f915b9ba2f0600005aa6f94a77c3ee764e7e764e9ee20ab1a2dbdbfaf99a158ddf287cf3e6cd7efdfae9a51e000068c10b71a2c83fb87451e1e4a4756e843c4e5ee31ffc93d492643e76d8733af6a381bafe8a95d7fe1b8501005e27eaa7e2cb0e7eb1de646188132184647cbff4f6ac8b05376e1454eeb0fc66e55ea19eea0300005650dfe7b873fba0f923decef5bf1322294894353afeefcb758410f2c83ceed0fa75a62bbe9afa6e33a30000c0df9c7a9c70cd5d88f9e4cf970f377c7c2cf417d325dfad75228428b2b6f0cf0f5b8a2c010080e6a9c7c9f0a0f95caf09637eb522f7ef8f884a7322e4f6e185ebbe4cac981093800f0a0300400b5e38c1ce9b7d2857907323870c19a9fc39c6b7ed023e39f4e53f87f5ea003f750200001d58d3abe24d4c873839d919de2d2e2784909eb6b6a60a9954a187c20000804de85fb2a2c8da1e386c426c012177b68f1f34f95ffff219363d261f890200002da0c7c9b513d17d375f5a378e64fc1adde3abb8f4f44b9b7b6e3b7c4d0fb50100006b68f8354649558f6e3d08c9ca386dee399647488f6e3db26bf005f50000d0027a9cd87b875c089b3037386c47fff993df21c2230bd6c62e7671d26e33b2da5ae5e132456d554e464ae69f62d94beec100b158bc7af56a3e9f3f77eedc3ffef8a3859e478e1c79fffdf703030377efdeddd8d8a8e576ebebebb76fdfeee7e73765ca94c4c4442d472384545757af59b386cfe77ff8e187595959da0fc8b8ab57af060707fbf8f87cf9e597b5b5cdbef7a8aeae5eb76e1d9fcf9f33674e6666a62e2b04d0afacacac3973e6f0f9fcb56bd78ac5e297df818da8a6eaeb2535f9e909e76e9449298aa2fe381e7dfe6e3dadd72ba8cfdcc6e74edaf327559fb7679acdb3ed729d96c595bdf2584b972e9d366d5a6b7aca64327777f7f8f878b95c9e9d9dedeaea7afbf66d8d3dbffffefbb0b0b0870f1fd6d4d47cf1c517111111af5cd68b424242b66ddb5657572712893ef8e0839f7ffe599bd1e472b98787c7891327e472794e4e8e9b9bdbad5bb7b4ac9059191919dedede8585853299ecf0e1c3bebebe0d0d0df46ef5f5f59e9e9ebffdf69b5c2ecfcbcb737777cfccccd47db500ba77ebd62d7777f79c9c1cb95c1e1717e7e1e12197cbf552c9bc79f30a0b0bdb69707a9ca4ace62e8e7bc2dc162a7e9a3d7479e2238aaaf8693611445ea9aca728aabef24aa480bb38aea6f9fbc9e5f2473461616153a74e6dcd66cf9e3dfbd9679fa99a376edc58b46891c69ee3c68d532814aaa69b9b5b7d7ddbf3532c16fbf9f9a99a52a9d4d3d3b3cda3511475fefcf9356bd6a89a595959616161da0cc8b8e0e0e0e2e2625573c99225d7af5fa777bb78f1e2a79f7eaa6adeb97367fefcf93a280f40ef162e5c989595a56aae5dbb362525452f95b46b9cd02f2819e830b528f9648e938f9d5977262e379148eafa0de8ff16212592baf1be13c6f432248418f61a33c177d4caf20a42ba3773bfc4c4448ddf286c6d6ddd9acd969797f7eddb57d5b4b6b62e2b2bd3d8d3c0c0a053a74eaaa6999999582c3633336bcd56e82a2a2ad4b76b6262d2d0d0d0b6a1945a3f117da9acacb4b0b0503595158e1a35aa4937fa44f06d9ef037d1f1ff8a19413f777227edbb841d9387f6ea61c4792e22b9cd5be8e7ead7356af596f4f2de13170c4bf8ee588e58a6a8bd9f1e13b947ea3996d7fcfd0402c1611a7f7fff56bed0dbdbdbab9fb7888f8f777474d4d8b35bb76e252525ca7f8bc5e2f2f2f23667092184c7e365656549241265f3f6eddbe6e6e66d1e8d10626f6f7fead42955b38589e88b7a8514452525258d1c3992de6dd4a851a74f9f5635e3e3e31d1c1c745422805e393838242424a89a274f9e1c3d7ab41eeb6927f4fd8f71ab44a2e54d6f34316dfb26781fed3aaa58b7cacb3ab9ca6c68d7a8a13b0821dca1133efe66ffc277da3eeacb0c1a34c8d1d171c284095e5e5ef9f9f9252525870f1fd6d873d3a64d3366ccf0f3f33336368e8b8bdbb871a336dbedd4a9d3dab56bfdfcfc020303fffaebafb367cf1e3c78509b01070c18e0e2e2121414e4eded5d505050545474e4c8116d0664dcaa55abde7ffffdd4d4d47efdfa2526264e9c38d1d2d292dead7ffffeeeeeee8181813e3e3e858585050505478f1ed57db500bab764c992c993275fbb76cdcece2e2929c9cdcdcdcece4edf45318f43bdecc70d15b5550fabea8d6dfabca5edb614b5550feb1a08e9d4ededb61e4753fedec9a143875ad9bfb8b8383333d3caca6acc98312d747bf2e4495a5a5a7d7dfdd8b163df7cf3cd3695f682aaaaaa8c8c8c6eddbab9b8b8181b1b6b3fe09f7ffe999999696161d131dfd15314959e9e5e5959397af4682b2bab167a969494dcb871a34f9f3e0e0e0e1c0e47671502e817455157af5e2d2b2b1b3972a41e7f0330242464d5aa553c5e0b0786da8e1e278afcbdc13ef37efe53fd369bcf2e147f39ae3db6ff8a5e354e000040a55de344c355f187bf299c7aa25894b866e8a41f6e15dff8df62fff098a51d214b0000a0c3a2c7496d4db6a757808db98bbdebc57b0f6d46046f08a9f9f7be8e78ed1c00007418f438e9cf139c3d135f2eeb6e3b60606a467a6deddd7ba5f90f1feba1360000600d7a9cf066fcfba3b288ef52c9f0e92bff716c6c8f1eefac7fb02cc0450fb50100006b68f88055f7e10bff778710428860c7e59a3515d2b72ccd4c745c160000b00b7def8428f20f2e705ea3bc6ed1b0fb1fdb474fda7809c7ba0000a0251aae8adff9f137a6ab173dfb28d7b8a53bde39fad9d3dd150000008de87152569ae2eaeedbe7d9e12d933e015e9e29a5afe1f7cb00000073e8e74e9c5c16876efddcd97cbe8b4517428844f84becd98f0256e8bcb2fafa7afa2f67c864b2975ec60f0000ba478f93ee819b12c42bfef5beede43f0921843b74c2b2e8bd53b8ba2e4cdb6f140600005da2c7894c2cb698fa5dcaacef14b555b54666a6268adaaa87621931d5f1a7bb04028140206872a3f24b56745b080000bc9c5a9c3cfd86c64b1b7aa78e13ad7e7aa1494505919c59677b6b0a15e9ad9f0a01008005d4e2c4f0afc46596b30f1242c8f6dedbd53b8d5a74fc0b9d560500002ca3fec92e8b593f511475e16b97af2fbcf8938dd777082c9a1d01000040d3cf677d7a719c4c5c512153bfd1c4d45cd7e74e00008045347ca3f0f9cf9daddfeafda2af53f5501b0000b0067def2423f1dfb61bf293e6d8b5f107130100e06f88be77f2ce3f66cbe4546764090000b41e3d352ca6fc9ff7b4a9c3ff37c8d573e0dbcf6e1c36edaba9efeab430000060134d5f01b9e4e31b56ea59020000f012f4bd9307157796ff50fa8d6ffb1dedaacd4fbd41468e1bd8bdddb6d04eeeddbb17151525140a870e1dba72e54a7373737d57d446f7efdf8f8a8a2a2c2c1c3264c8ca952b7bf7eeadb19b42a1d8bd7bf7a953a7ba74e93277ee5c3e9fafe33aff3ecacacaa2a2a2f2f3f3070d1ab472e54a0b0bcd9fcc6f6c6cdcb367cfc993274d4c4ce6cc99337efcf8e606bc75ebd6b66ddb4422919393d3b265cbba75eba6b15b5d5dddd6ad5b333232cccdcd972c59327cf87066e6a3734f9e3cf9f6db6fd3d2d2b85cee279f7c3262c488e67a262525edddbb572a95fafafa868484181a6a7ea51389449b366dcac9c9b1b3b35bb972a5959555bbd5de4667ce9cd9b3678f4422f1f1f1993f7f7e7313d129aaa9fabc3dc1c1dfa4153f96d2feab4d6af22e24bc68ff0a179715fb1312122ee4bdea604b972e9d366d1a3385bd229148e4ecec9c9e9e2e9148ce9e3d3b76ecd8eaea6abd54a2a58a8a0a6767e7b4b434894472eedc39676767b158acb1675858586464a4582cbe7ffffef4e9d30f1d3aa4e352ff26aaaaaa9c9d9d5353532512496a6aaab3b3f3c3870f35f65cba74e9faf5ebc562716969697070f08f3ffea8b15b6666a6bbbbfb9d3b779e3c79f2f3cf3ffbf8f828140a7ab7868686f1e3c71f3c78f0c99327d9d9d9eeeeeebffffe3b9313d3958686063f3fbf03070ed4d5d5e5e4e4787a7a5ebd7a5563cf43870e4d9f3efddebd7bd5d5d59191910b172ed4d8edf1e3c763c78e4d49499148246969694e4e4e151515ed39835776f4e8d1a953a7debd7bb7baba7af3e6cd0b162c68e51de7cd9b575858d84e55d1e324295c43e88427b5790b15c7426d082136235c9e711acae50e75727171997fa085fbc9e5f2473461616153a74e6d732ddad8bc79f32fbffca26aeedab56bdfbe7d7aa9444b5bb76e3d72e488aab977efdeddbb77d3bbd5d4d4f8f8f8a89a52a9d4c3c34317f5fdfdecdcb933363656d53c70e0c0f7df7f4fef269148d497402e97bbbbbb6b1c302424243b3b5bd55cb16245464606bddbb56bd7962c59a26ae6e7e77ff8e1876da85fef6edcb8b168d12255b3a8a828383858634f0f0f0fa9f4f91b655f5fdf9a9a1a7ab73d7bf6ecd9b347d53c7af4e8962d5b98ab97019e9e9e128944d5f4f3f36bee4d6113ed1a271a2e635c25122d6f7aa389699b777fb8ef47e716056e58fcd9efa32276ac0eb03521c298a0e564cbf1505e8bf7d3f88dc2b9b9b943860c69732dda282b2bf3f0f050356d6c6cae5cb9a2974ab4545656e6e2e2a26adad8d85cbc7891de4d2412f5eddb57d5343131696c6cd4457d7f3f656565efbdf79eaa69636393909040eff6e0c1034b4b4b55d3c8c8886ae6c71acacacafaf5eba73e60696929bd5b6969a98d8d8daa696d6dcdd2ef576d32112b2b2b9148a4b1676363a389c9f30bb2fbf6ed5b5e5e6e6767d7a45b595999b3b3b3aa696363939191c164c55a6b6868e8dcb9b3aaa95cbb37df7c538f25114da7e24d4ccde9b4bb24dec436e0cbf88c1da3af2d760af83cbe58f6f27b10420402c1619ab56bd7bababa6a534b9b8d1e3d3a313151d53c79f2e4983163f45289965a39115b5bdbdbb76f4b241265332f2fefedb7f1e98c76d1ca15b1b2b22a2828a8abab5336854261732f1f4d064c4a4a1a356a14bddb881123ce9c39a3caa453a74ed9dbdbb779167ad46422cdcd9710f2f6db6fe7e5e529ff2d9148fef8e38ffefdfbd3bb75fc3f762e979b9d9dadfcb7542abd79f3e6800103f45b122184d3dc1b9c76a1787075efdaa55fff267cefabf497ed9d6874faf4e98888885ebd7ac964b2df7fff5d3d9f75402a951a1b1b1b1818343434d4d7d733b2758aa2643259c79c487d7d3d4551c6c6c6ea77696e4c8aa2a45269972e5ddaab685dd1cb44a452a9919151a74e9d5a5e118542d1d8d8a85a11e55de8dd944f2a636363994c666464a4ba0b9d5c2e37303030343454dec5c4c484c3e130382fa64824929657a49513696c6c94cbe5ca87572e9773381c2323238d03aa1e5ef5bb3062e4c891da0f22954a2b2b2badacac0c0c0c2a2b2b0d0d0d7bf6ecd99a3bdebb77efdcb973cd7dd6435bed7410ad05f595b7ce5dc8d370c0f255949494cc9e3d9b9982f4eafefdfb3367ced477150c282f2f9f3e7dbabeab60c083070f264f9eacef2a18f0e8d1a3891327eabb0a06fcf5d75f818181faae82017575757e7e7efaaea21de9e1b36586bd86b9f7d2fd660100a01d357bec020000a0f510270000c000c40900003000710200000c606b9c181818b4f0a15516c1443a1a4ca4a3c144d842b7d79d30aaa6a6a6478f1efaae82019848478389743498082bb0384e0000a0e3789df7bc0000406710270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c60699c244770381c0e87131423d47729da10c60471542292f55d4edb2447bcb80cec5d9b1766c2cab5512b5aede167e18a689a082b5744f5e0bff0e8b370455a858d71228c09e2e746175214953478c100d63caf342812c609a20b9ffe9259a4b7becb6983e4080e3f4aadcddeb5693a1316ae8d30667982bfb2e4c268b260798c90b07345344e848d2b429223f82489a25e78f4d9b822adc4c6382912c609fc3d7984106faf70127586b5eb212cce25836d79fa2ea3ad8431411c3e494a0a57bb8d9d6ba361266c5c1b5ee8f1e3a1ca92799efe82b884b34276ae88c689b071458877e4b3e0f3f60a27b9c542c2ce15692516c689fad3aa3f4ff0748dd8a8481847a2f82cdb797f8e177abce9bb4496ae8d8699b07c6d4891308e0cb6e5b175459e7b3611b6af48f29928e53c58bf222d60619c1409e3f45d023384c5b9e4e9de7b527814ff75388e8ab5e9189223f851e14991deac5f91e71361f18a086382381c7e94203ad49bb07e455ac4c238e9cf13e8bb0466f0428f534ff7e9bd43a39feed2b31bd6a603488ee0f073a30b957b5b6c5e911726c2e215e1851ea728aad03f6140508c90d52bf2322c8c139eed60d50ea26a4ff875f01a4c046ba3674fcf023d7be165ef8ad026d2145b26a2c2b31d4ce28445ac5d91d660619c90febc67ef4d92cf4491702f767cc6834eed73a9c9310be2d83b1135581b7d4a8e18b06070d28b678158b9221a26c2ca1511c604a9cef3a81e7e56ae482b51acf4ec3338cf3f38c84a85d1cff67b593c91a4f017ab67efdabc301316aecd0b9fb1532b9c752ba279222c5c114a7d2e6a55b36e455a09bfc60800000c60e3c12e0000e87010270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c40900003000710200000c409c0000000310270000c000c409402b0863823811c9adec1814d3eef500743c881300006000e204e055086382381111111ca5e73b2cc9ca9b826284cffb263feba6bc353942f5dfadded901600fc409c0ab8acae515521495144ea2be8b111242843141fca8f0248aa2b6f072e3949d843141fcdce8428aa20aa3c9820111c9c43bb2d03f61798c9090e49804ffc2486fbd4e0280698813805725f0f7e41142bcbdc29fde50248c1344877a134278a18b94370acf26c43dedc70b5d144e728b8584f042b7f8272c0f0ae29345a13c3d150fd05e102700af6ab0ed8b59202cced5d82f6ec100e5c12e7e148913161142082f74d1e038a28c1e80d70be204405b3cdbc11a6f0f4fa29e531edb4a8ee093e8a787bc005e2f881300ad797b85c72d884926840863be8b228410c2f3f4173c3db34292239e9e8d4f8ee093a4c8d0d02d0814780d19eabb0080d7807764523887cf8922243c3a5a90400821bcd0e34942ce00ce024208094fa242494c109f2451ca332c5bfc830644d852381d0faf110e4551faae010000580f07bb00008001881300006000e204000018803801000006204e00008001881300006000e204000018803801000006204e00008001881300006000e204000018803801000006204e00008001881300006000e204000018803801000006204e000080018813000060c0ff0319cc5a4e64de3a790000000049454e44ae426082}\line \cell \row } From 7976a4a902ea715b3d1cf61e1108a889cbf9c4bf Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Wed, 25 Mar 2026 15:59:36 +0100 Subject: [PATCH 11/14] Update test-gentlg.R --- tests/testthat/test-gentlg.R | 57 ++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/tests/testthat/test-gentlg.R b/tests/testthat/test-gentlg.R index e5586be..efb4676 100644 --- a/tests/testthat/test-gentlg.R +++ b/tests/testthat/test-gentlg.R @@ -1,3 +1,5 @@ +df <- data.frame(label = c("boy", "girl"), name = c("Bob", "Lily"), age = c(12, 15)) + test_that("custom alignments work", { df <- data.frame(label = c("boy", "girl"), name = c("Bob", "Lily"), age = c(12, 15)) @@ -60,11 +62,8 @@ test_that("replace_lead_whitespaces_ind() is replacing whitespaces", { expect_equal(res, "\\keepn\\trhdr Gender") }) -test_that("gentlg() wcol checks", { - df <- data.frame(label = c("boy", "girl"), name = c("Bob", "Lily"), age = c(12, 15)) - - # example passing 1 colwidth per page - wcol <- list(c(0.5), c(0.25)) +test_that("gentlg() sets the right colwidths when passing a combination of vectors and numeric values", { + wcol <- list(c(0.5, 0.3, 0.2), c(0.25)) expect_no_error(hux_tables <- gentlg( huxme = list(df, df), wcol = wcol, @@ -74,17 +73,18 @@ test_that("gentlg() wcol checks", { for (i in seq_along(wcol)) { ht <- hux_tables[[i]] num_cols <- ncol(ht) - actual_colwidths <- huxtable::col_width(ht) - # expect that the 1st colwidth is what we specified in the function call - expect_equal(as.numeric(actual_colwidths[1]), wcol[[i]]) - # expect that the rest of columns have the same width - expect_true(length(unique(as.numeric(actual_colwidths[2:num_cols]))) == 1) - # expect that the sum of all colwidths is 1 - expect_equal(sum(actual_colwidths), 1, tolerance = 1e-6) + actual_colwidths <- as.numeric(huxtable::col_width(ht)) + if (length(wcol[[i]]) == 1) { + expected_colwidths <- c(wcol[[i]], rep((1 - wcol[[i]])/(num_cols - 1), num_cols - 1)) + } else { + expected_colwidths <- wcol[[i]] + } + expect_equal(actual_colwidths, expected_colwidths) } +}) - # example passing all colwidths explicitly - wcol <- list(c(0.5, 0.3, 0.2), c(0.4)) +test_that("gentlg() sets the right colwidths when passing all colwidths explicitly", { + wcol <- list(c(0.5, 0.3, 0.2), c(0.25, 0.5, 0.25)) expect_no_error(hux_tables <- gentlg( huxme = list(df, df), wcol = wcol, @@ -97,38 +97,44 @@ test_that("gentlg() wcol checks", { expected_colwidths <- wcol[[i]] actual_colwidths <- as.numeric(huxtable::col_width(ht)) expect_equal(expected_colwidths, actual_colwidths) - expect_equal(sum(actual_colwidths), 1, tolerance = 1e-6) } +}) - # examples passing wrong colwidths - wcol <- list(c(0.5, 0.3), c(0.4, 0.4, 0.2)) +test_that("gentlg() validates that if hux is a single data.frame, wcol cannot be a list", { + wcol <- list(c(0.5), c(0.4, 0.4, 0.2)) expect_error(hux_tables <- gentlg( - huxme = list(df, df), + huxme = df, wcol = wcol, print.hux = FALSE ), - "wcol\\'s length must be 1 or the length of final output" + "\\'wcol\\' appears to be" ) +}) - wcol <- list(c(0.5, 0.2, 0.5), c(0.4, 0.4, 0.2)) +test_that("gentlg() validates each element in wcol has the correct length", { + wcol <- list(c(0.5, 0.3), c(0.4, 0.4, 0.2)) expect_error(hux_tables <- gentlg( huxme = list(df, df), wcol = wcol, print.hux = FALSE ), - "wcol not defined properly" + "wcol\\'s length must be 1 or the length of final output" ) +}) - wcol <- list(c(0.5, 0.3), c(0.4, 0.4, 0.2)) +test_that("gentlg() validates that the sum of colwidths is 1", { + wcol <- list(c(0.5, 0.2, 0.5), c(0.4, 0.4, 0.2)) expect_error(hux_tables <- gentlg( - huxme = df, + huxme = list(df, df), wcol = wcol, print.hux = FALSE ), - "\\'wcol\\' appears to be" + "wcol not defined properly" ) +}) - wcol <- list(c(0.5, 0.2, 0.5), c(0.4, 0.4, 0.2)) +test_that("gentlg() validates hux length equals wcol length if wcol is a list", { + wcol <- list(c(0.5), c(0.4, 0.4, 0.2)) expect_error(hux_tables <- gentlg( huxme = list(df, df, df), wcol = wcol, @@ -137,3 +143,4 @@ test_that("gentlg() wcol checks", { "Arguments \\'wcol\\' and \\'huxme\\' must have the same length." ) }) + From f82d77f79c2c65cc1d08ed700e3d2adaace40654 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Mon, 13 Apr 2026 22:49:57 +0200 Subject: [PATCH 12/14] Update test-gentlg.R --- tests/testthat/test-gentlg.R | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/testthat/test-gentlg.R b/tests/testthat/test-gentlg.R index efb4676..fc9102b 100644 --- a/tests/testthat/test-gentlg.R +++ b/tests/testthat/test-gentlg.R @@ -47,7 +47,6 @@ test_that("custom alignments work", { test_that("replace_lead_whitespaces_ind() is replacing whitespaces", { # case when there are 2 leading whitespaces, should insert 180 twips - df <- data.frame(label = c("boy", "girl"), name = c("Bob", "Lily"), age = c(12, 15)) expect_no_error(res <- gentlg(huxme = df, print.hux = FALSE, colheader = c(" Gender", "Name", "Age"))) From 664cf6803231fc5b70056e5820381b0728575621 Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Mon, 13 Apr 2026 22:51:08 +0200 Subject: [PATCH 13/14] Update test-gentlg.R --- tests/testthat/test-gentlg.R | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/testthat/test-gentlg.R b/tests/testthat/test-gentlg.R index fc9102b..7132700 100644 --- a/tests/testthat/test-gentlg.R +++ b/tests/testthat/test-gentlg.R @@ -74,7 +74,7 @@ test_that("gentlg() sets the right colwidths when passing a combination of vecto num_cols <- ncol(ht) actual_colwidths <- as.numeric(huxtable::col_width(ht)) if (length(wcol[[i]]) == 1) { - expected_colwidths <- c(wcol[[i]], rep((1 - wcol[[i]])/(num_cols - 1), num_cols - 1)) + expected_colwidths <- c(wcol[[i]], rep((1 - wcol[[i]]) / (num_cols - 1), num_cols - 1)) } else { expected_colwidths <- wcol[[i]] } @@ -142,4 +142,3 @@ test_that("gentlg() validates hux length equals wcol length if wcol is a list", "Arguments \\'wcol\\' and \\'huxme\\' must have the same length." ) }) - From 86fc9b847deeefec9a8819133c7c56e8d1ea44ab Mon Sep 17 00:00:00 2001 From: Ezequiel Anokian Date: Mon, 13 Apr 2026 23:05:12 +0200 Subject: [PATCH 14/14] Update gentlg.R --- R/gentlg.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/gentlg.R b/R/gentlg.R index 0074443..2616c1b 100644 --- a/R/gentlg.R +++ b/R/gentlg.R @@ -423,13 +423,13 @@ gentlg <- function(huxme = NULL, bottom_borders = bottom_borders, border_fns = border_fns, alignments = alignments, - index = seq_len(length(huxme)), + index = seq_along(huxme), wcol = wcol, SIMPLIFY = FALSE ) if (print.hux == FALSE) { - return(lapply(hts, function(ht) ht$ht)) + lapply(hts, function(ht) ht$ht) } else if (print.hux == TRUE && is_format_rtf(format)) { quick_rtf_jnj(lapply(hts, function(ht) ht$ht), file = paste(file.path(opath, adjfilename), ".rtf", sep = ""),