* // create a new instance of Services_JSON * $json = new Services_JSON(); * * // convert a complexe value to JSON notation, and send it to the browser * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); * $output = $json->encode($value); * * print($output); * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] * * // accept incoming POST data, assumed to be in JSON notation * $input = file_get_contents('php://input', 1000000); * $value = $json->decode($input); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( * array( * 'bottom' => array( * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, * 'color' => array( * 'rgb' => '808080' * ) * ), * 'top' => array( * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, * 'color' => array( * 'rgb' => '808080' * ) * ) * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( * array( * 'allborders' => array( * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, * 'color' => array( * 'rgb' => '808080' * ) * ) * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getLocked()->applyFromArray( array('locked' => true, 'hidden' => false) ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getFill()->applyFromArray( * array( * 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, * 'rotation' => 0, * 'startcolor' => array( * 'rgb' => '000000' * ), * 'endcolor' => array( * 'argb' => 'FFFFFFFF' * ) * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getTop()->applyFromArray( * array( * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, * 'color' => array( * 'rgb' => '808080' * ) * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->applyFromArray( * array( * 'name' => 'Arial', * 'bold' => true, * 'italic' => false, * 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, * 'strike' => false, * 'color' => array( * 'rgb' => '808080' * ) * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getNumberFormat()->applyFromArray( * array( * 'code' => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray( * array( * 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER, * 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER, * 'rotation' => 0, * 'wrap' => true * ) * ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->getColor()->applyFromArray( array('rgb' => '808080') ); *
* $objPHPExcel->getActiveSheet()->getStyle('B2')->applyFromArray( * array( * 'font' => array( * 'name' => 'Arial', * 'bold' => true, * 'italic' => false, * 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, * 'strike' => false, * 'color' => array( * 'rgb' => '808080' * ) * ), * 'borders' => array( * 'bottom' => array( * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, * 'color' => array( * 'rgb' => '808080' * ) * ), * 'top' => array( * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, * 'color' => array( * 'rgb' => '808080' * ) * ) * ) * ) * ); *
* $objDrawing->setResizeProportional(true); * $objDrawing->setWidthAndHeight(160,120); *
* References: *
* From the original documentation: *
* This routine calculates the LOG(GAMMA) function for a positive real argument X. * Computation is based on an algorithm outlined in references 1 and 2. * The program uses rational functions that theoretically approximate LOG(GAMMA) * to at least 18 significant decimal digits. The approximation for X > 12 is from * reference 3, while approximations for X < 12.0 are similar to those in reference * 1, but are unpublished. The accuracy achieved depends on the arithmetic system, * the compiler, the intrinsic functions, and proper selection of the * machine-dependent constants. *
* Error returns: * The program returns the value XINF for X .LE. 0.0 or when overflow would occur. * The computation is believed to be free of underflow and overflow. *
* Char. number range | UTF-8 octet sequence * (hexadecimal) | (binary) * --------------------+----------------------------------------------- * 0000 0000-0000 007F | 0xxxxxxx * 0000 0080-0000 07FF | 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx * 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * --------------------------------------------------------------------- * * ABFN notation: * --------------------------------------------------------------------- * UTF8-octets = *( UTF8-char ) * UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 * UTF8-1 = %x00-7F * UTF8-2 = %xC2-DF UTF8-tail * * UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / * %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) * UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / * %xF4 %x80-8F 2( UTF8-tail ) * UTF8-tail = %x80-BF * --------------------------------------------------------------------- *
* Encoding UTF-16: * * Encoding of a single character from an ISO 10646 character value to * UTF-16 proceeds as follows. Let U be the character number, no greater * than 0x10FFFF. * * 1) If U < 0x10000, encode U as a 16-bit unsigned integer and * terminate. * * 2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF, * U' must be less than or equal to 0xFFFFF. That is, U' can be * represented in 20 bits. * * 3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and * 0xDC00, respectively. These integers each have 10 bits free to * encode the character value, for a total of 20 bits. * * 4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order * bits of W1 and the 10 low-order bits of U' to the 10 low-order * bits of W2. Terminate. * * Graphically, steps 2 through 4 look like: * U' = yyyyyyyyyyxxxxxxxxxx * W1 = 110110yyyyyyyyyy * W2 = 110111xxxxxxxxxx *
'); //replace some blank characters $html = preg_replace('/]*)>[\n\r\t]+/', '<\\1\\2>', $html); $html = preg_replace('@(\r\n|\r)@', "\n", $html); $repTable = array("\t" => ' ', "\0" => ' ', "\x0B" => ' ', "\\" => "\\\\"); $html = strtr($html, $repTable); $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '', $offset)) !== false) { $html_a = substr($html, 0, $offset); $html_b = substr($html, $offset, ($pos - $offset + 6)); while (preg_match("']*)>(.*?)\n(.*?)'si", $html_b)) { // preserve newlines on tag $html_b = preg_replace("']*)>(.*?)\n(.*?)'si", "\\2\\3", $html_b); } $html = $html_a.$html_b.substr($html, $pos + 6); $offset = strlen($html_a.$html_b); } $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '</textarea>', $offset)) !== false) { $html_a = substr($html, 0, $offset); $html_b = substr($html, $offset, ($pos - $offset + 11)); while (preg_match("']*)>(.*?)\n(.*?)</textarea>'si", $html_b)) { // preserve newlines on tag $html_b = preg_replace("']*)>(.*?)\n(.*?)</textarea>'si", "\\2\\3</textarea>", $html_b); $html_b = preg_replace("']*)>(.*?)[\"](.*?)</textarea>'si", "\\2''\\3</textarea>", $html_b); } $html = $html_a.$html_b.substr($html, $pos + 11); $offset = strlen($html_a.$html_b); } $html = preg_replace("'([\s]*)([\s]*)'si", "", $html); $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '', $offset)) !== false) { $html_a = substr($html, 0, $offset); $html_b = substr($html, $offset, ($pos - $offset + 9)); while (preg_match("']*)>(.*?)'si", $html_b)) { $html_b = preg_replace("']*)>(.*?)'si", "\\2\t\\4\r", $html_b); $html_b = preg_replace("']*)>(.*?)'si", "\\2\r", $html_b); } $html = $html_a.$html_b.substr($html, $pos + 9); $offset = strlen($html_a.$html_b); } $html = preg_replace("']*)>'si", "'si", "\" />", $html); $html = str_replace("\n", ' ', $html); // restore textarea newlines $html = str_replace('', "\n", $html); // remove extra spaces from code $html = preg_replace('/[\s]+<\/(table|tr|td|th|ul|ol|li)>/', '\\1>', $html); $html = preg_replace('/[\s]+<(tr|td|th|ul|ol|li|br)/', '<\\1', $html); $html = preg_replace('/<\/(table|tr|td|th|blockquote|dd|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|ul|p)>[\s]+', '\\1><', $html); $html = preg_replace('/<\/(td|th)>/', '\\1>', $html); $html = preg_replace('/<\/table>([\s]*)/', '', $html); $html = preg_replace('/]*)>/xi', '', $html); $html = preg_replace('/]*)>/xi', '', $html); // trim string $html = preg_replace('/^[\s]+/', '', $html); $html = preg_replace('/[\s]+$/', '', $html); // pattern for generic tag $tagpattern = '/(<[^>]+>)/'; // explodes the string $a = preg_split($tagpattern, $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); // count elements $maxel = count($a); $elkey = 0; $key = 0; // create an array of elements $dom = array(); $dom[$key] = array(); // set first void element $dom[$key]['tag'] = false; $dom[$key]['value'] = ''; $dom[$key]['parent'] = 0; $dom[$key]['fontname'] = $this->FontFamily; $dom[$key]['fontstyle'] = $this->FontStyle; $dom[$key]['fontsize'] = $this->FontSizePt; $dom[$key]['bgcolor'] = false; $dom[$key]['fgcolor'] = $this->fgcolor; $dom[$key]['align'] = ''; $dom[$key]['listtype'] = ''; $dom[$key]['text-indent'] = 0; $thead = false; // true when we are inside the THEAD tag ++$key; $level = array(); array_push($level, 0); // root while ($elkey < $maxel) { $dom[$key] = array(); $element = $a[$elkey]; $dom[$key]['elkey'] = $elkey; if (preg_match($tagpattern, $element)) { // html tag $element = substr($element, 1, -1); // get tag name preg_match('/[\/]?([a-zA-Z0-9]*)/', $element, $tag); $tagname = strtolower($tag[1]); // check if we are inside a table header if ($tagname == 'thead') { if ($element{0} == '/') { $thead = false; } else { $thead = true; } ++$elkey; continue; } $dom[$key]['tag'] = true; $dom[$key]['value'] = $tagname; if ($element{0} == '/') { // closing html tag $dom[$key]['opening'] = false; $dom[$key]['parent'] = end($level); array_pop($level); $dom[$key]['fontname'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontname']; $dom[$key]['fontstyle'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontstyle']; $dom[$key]['fontsize'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontsize']; $dom[$key]['bgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['bgcolor']; $dom[$key]['fgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fgcolor']; $dom[$key]['align'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['align']; if (isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'])) { $dom[$key]['listtype'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype']; } // set the number of columns in table tag if (($dom[$key]['value'] == 'tr') AND (!isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']))) { $dom[($dom[($dom[$key]['parent'])]['parent'])]['cols'] = $dom[($dom[$key]['parent'])]['cols']; } if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { $dom[($dom[$key]['parent'])]['content'] = ''; for ($i = ($dom[$key]['parent'] + 1); $i < $key; ++$i) { $dom[($dom[$key]['parent'])]['content'] .= $a[$dom[$i]['elkey']]; } $key = $i; } // store header rows on a new table if (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['thead'] === true)) { if ($this->empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])) { $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] = $a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']]; } for ($i = $dom[$key]['parent']; $i <= $key; ++$i) { $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] .= $a[$dom[$i]['elkey']]; } } if (($dom[$key]['value'] == 'table') AND (!$this->empty_string($dom[($dom[$key]['parent'])]['thead']))) { $dom[($dom[$key]['parent'])]['thead'] .= ''; } } else { // opening html tag $dom[$key]['opening'] = true; $dom[$key]['parent'] = end($level); if (substr($element, -1, 1) != '/') { // not self-closing tag array_push($level, $key); $dom[$key]['self'] = false; } else { $dom[$key]['self'] = true; } // copy some values from parent $parentkey = 0; if ($key > 0) { $parentkey = $dom[$key]['parent']; $dom[$key]['fontname'] = $dom[$parentkey]['fontname']; $dom[$key]['fontstyle'] = $dom[$parentkey]['fontstyle']; $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize']; $dom[$key]['bgcolor'] = $dom[$parentkey]['bgcolor']; $dom[$key]['fgcolor'] = $dom[$parentkey]['fgcolor']; $dom[$key]['align'] = $dom[$parentkey]['align']; $dom[$key]['listtype'] = $dom[$parentkey]['listtype']; $dom[$key]['text-indent'] = $dom[$parentkey]['text-indent']; } // get attributes preg_match_all('/([^=\s]*)=["]?([^"]*)["]?/', $element, $attr_array, PREG_PATTERN_ORDER); $dom[$key]['attribute'] = array(); // reset attribute array while (list($id, $name) = each($attr_array[1])) { $dom[$key]['attribute'][strtolower($name)] = $attr_array[2][$id]; } // split style attributes if (isset($dom[$key]['attribute']['style'])) { // get style attributes preg_match_all('/([^;:\s]*):([^;]*)/', $dom[$key]['attribute']['style'], $style_array, PREG_PATTERN_ORDER); $dom[$key]['style'] = array(); // reset style attribute array while (list($id, $name) = each($style_array[1])) { $dom[$key]['style'][strtolower($name)] = trim($style_array[2][$id]); } // --- get some style attributes --- if (isset($dom[$key]['style']['font-family'])) { // font family if (isset($dom[$key]['style']['font-family'])) { $fontslist = preg_split('/[,]/', strtolower($dom[$key]['style']['font-family'])); foreach ($fontslist as $font) { $font = trim(strtolower($font)); if (in_array($font, $this->fontlist) OR in_array($font, $this->fontkeys)) { $dom[$key]['fontname'] = $font; break; } } } } // list-style-type if (isset($dom[$key]['style']['list-style-type'])) { $dom[$key]['listtype'] = trim(strtolower($dom[$key]['style']['list-style-type'])); if ($dom[$key]['listtype'] == 'inherit') { $dom[$key]['listtype'] = $dom[$parentkey]['listtype']; } } // text-indent if (isset($dom[$key]['style']['text-indent'])) { $dom[$key]['text-indent'] = $this->getHTMLUnitToUnits($dom[$key]['style']['text-indent']); if ($dom[$key]['text-indent'] == 'inherit') { $dom[$key]['text-indent'] = $dom[$parentkey]['text-indent']; } } // font size if (isset($dom[$key]['style']['font-size'])) { $fsize = trim($dom[$key]['style']['font-size']); switch ($fsize) { // absolute-size case 'xx-small': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 4; break; } case 'x-small': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 3; break; } case 'small': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 2; break; } case 'medium': { $dom[$key]['fontsize'] = $dom[0]['fontsize']; break; } case 'large': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 2; break; } case 'x-large': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 4; break; } case 'xx-large': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 6; break; } // relative-size case 'smaller': { $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] - 3; break; } case 'larger': { $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] + 3; break; } default: { $dom[$key]['fontsize'] = $this->getHTMLUnitToUnits($fsize, $dom[$parentkey]['fontsize'], 'pt', true); } } } // font style if (isset($dom[$key]['style']['font-weight']) AND (strtolower($dom[$key]['style']['font-weight']{0}) == 'b')) { $dom[$key]['fontstyle'] .= 'B'; } if (isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style']{0}) == 'i')) { $dom[$key]['fontstyle'] .= '"I'; } // font color if (isset($dom[$key]['style']['color']) AND (!$this->empty_string($dom[$key]['style']['color']))) { $dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['color']); } // background color if (isset($dom[$key]['style']['background-color']) AND (!$this->empty_string($dom[$key]['style']['background-color']))) { $dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['background-color']); } // text-decoration if (isset($dom[$key]['style']['text-decoration'])) { $decors = explode(' ', strtolower($dom[$key]['style']['text-decoration'])); foreach ($decors as $dec) { $dec = trim($dec); if (!$this->empty_string($dec)) { if ($dec{0} == 'u') { $dom[$key]['fontstyle'] .= 'U'; } elseif ($dec{0} == 'l') { $dom[$key]['fontstyle'] .= 'D'; } } } } // check for width attribute if (isset($dom[$key]['style']['width'])) { $dom[$key]['width'] = $dom[$key]['style']['width']; } // check for height attribute if (isset($dom[$key]['style']['height'])) { $dom[$key]['height'] = $dom[$key]['style']['height']; } // check for text alignment if (isset($dom[$key]['style']['text-align'])) { $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align']{0}); } // check for border attribute if (isset($dom[$key]['style']['border'])) { $dom[$key]['attribute']['border'] = $dom[$key]['style']['border']; } } // check for font tag if ($dom[$key]['value'] == 'font') { // font family if (isset($dom[$key]['attribute']['face'])) { $fontslist = preg_split('/[,]/', strtolower($dom[$key]['attribute']['face'])); foreach ($fontslist as $font) { $font = trim(strtolower($font)); if (in_array($font, $this->fontlist) OR in_array($font, $this->fontkeys)) { $dom[$key]['fontname'] = $font; break; } } } // font size if (isset($dom[$key]['attribute']['size'])) { if ($key > 0) { if ($dom[$key]['attribute']['size']{0} == '+') { $dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] + intval(substr($dom[$key]['attribute']['size'], 1)); } elseif ($dom[$key]['attribute']['size']{0} == '-') { $dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] - intval(substr($dom[$key]['attribute']['size'], 1)); } else { $dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']); } } else { $dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']); } } } // force natural alignment for lists if ((($dom[$key]['value'] == 'ul') OR ($dom[$key]['value'] == 'ol') OR ($dom[$key]['value'] == 'dl')) AND (!isset($dom[$key]['align']) OR $this->empty_string($dom[$key]['align']) OR ($dom[$key]['align'] != 'J'))) { if ($this->rtl) { $dom[$key]['align'] = 'R'; } else { $dom[$key]['align'] = 'L'; } } if (($dom[$key]['value'] == 'small') OR ($dom[$key]['value'] == 'sup') OR ($dom[$key]['value'] == 'sub')) { $dom[$key]['fontsize'] = $dom[$key]['fontsize'] * K_SMALL_RATIO; } if (($dom[$key]['value'] == 'strong') OR ($dom[$key]['value'] == 'b')) { $dom[$key]['fontstyle'] .= 'B'; } if (($dom[$key]['value'] == 'em') OR ($dom[$key]['value'] == 'i')) { $dom[$key]['fontstyle'] .= 'I'; } if ($dom[$key]['value'] == 'u') { $dom[$key]['fontstyle'] .= 'U'; } if ($dom[$key]['value'] == 'del') { $dom[$key]['fontstyle'] .= 'D'; } if (($dom[$key]['value'] == 'pre') OR ($dom[$key]['value'] == 'tt')) { $dom[$key]['fontname'] = $this->default_monospaced_font; } if (($dom[$key]['value']{0} == 'h') AND (intval($dom[$key]['value']{1}) > 0) AND (intval($dom[$key]['value']{1}) < 7)) { $headsize = (4 - intval($dom[$key]['value']{1})) * 2; $dom[$key]['fontsize'] = $dom[0]['fontsize'] + $headsize; $dom[$key]['fontstyle'] .= 'B'; } if (($dom[$key]['value'] == 'table')) { $dom[$key]['rows'] = 0; // number of rows $dom[$key]['trids'] = array(); // IDs of TR elements $dom[$key]['thead'] = ''; // table header rows } if (($dom[$key]['value'] == 'tr')) { $dom[$key]['cols'] = 0; // store the number of rows on table element ++$dom[($dom[$key]['parent'])]['rows']; // store the TR elements IDs on table element array_push($dom[($dom[$key]['parent'])]['trids'], $key); if ($thead) { $dom[$key]['thead'] = true; } else { $dom[$key]['thead'] = false; } } if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) { if (isset($dom[$key]['attribute']['colspan'])) { $colspan = intval($dom[$key]['attribute']['colspan']); } else { $colspan = 1; } $dom[$key]['attribute']['colspan'] = $colspan; $dom[($dom[$key]['parent'])]['cols'] += $colspan; } // set foreground color attribute if (isset($dom[$key]['attribute']['color']) AND (!$this->empty_string($dom[$key]['attribute']['color']))) { $dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['color']); } // set background color attribute if (isset($dom[$key]['attribute']['bgcolor']) AND (!$this->empty_string($dom[$key]['attribute']['bgcolor']))) { $dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['bgcolor']); } // check for width attribute if (isset($dom[$key]['attribute']['width'])) { $dom[$key]['width'] = $dom[$key]['attribute']['width']; } // check for height attribute if (isset($dom[$key]['attribute']['height'])) { $dom[$key]['height'] = $dom[$key]['attribute']['height']; } // check for text alignment if (isset($dom[$key]['attribute']['align']) AND (!$this->empty_string($dom[$key]['attribute']['align'])) AND ($dom[$key]['value'] !== 'img')) { $dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align']{0}); } } // end opening tag } else { // text $dom[$key]['tag'] = false; $dom[$key]['value'] = stripslashes($this->unhtmlentities($element)); $dom[$key]['parent'] = end($level); } ++$elkey; ++$key; } return $dom; } /** * Allows to preserve some HTML formatting (limited support). * IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting. * Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul * @param string $html text to display * @param boolean $ln if true add a new line after text (default = true) * @param int $fill Indicates if the background must be painted (true) or transparent (false). * @param boolean $reseth if true reset the last cell height (default false). * @param boolean $cell if true add the default cMargin space to each Write (default false). * @param string $align Allows to center or align the text. Possible values are:L : left alignC : centerR : right align'' : empty string : left for LTR or right for RTL * @access public */ public function writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='') { $gvars = $this->getGraphicVars(); // store current values $prevPage = $this->page; $prevlMargin = $this->lMargin; $prevrMargin = $this->rMargin; $curfontname = $this->FontFamily; $curfontstyle = $this->FontStyle; $curfontsize = $this->FontSizePt; $this->newline = true; $startlinepage = $this->page; $minstartliney = $this->y; $startlinex = $this->x; $startliney = $this->y; $yshift = 0; $newline = true; $loop = 0; $curpos = 0; $this_method_vars = array(); $undo = false; $blocktags = array('blockquote','br','dd','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','ul','tcpdf'); $this->premode = false; if (isset($this->PageAnnots[$this->page])) { $pask = count($this->PageAnnots[$this->page]); } else { $pask = 0; } if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $startlinepos = $this->footerpos[$this->page]; $lalign = $align; $plalign = $align; if ($this->rtl) { $w = $this->x - $this->lMargin; } else { $w = $this->w - $this->rMargin - $this->x; } $w -= (2 * $this->cMargin); if ($cell) { if ($this->rtl) { $this->x -= $this->cMargin; } else { $this->x += $this->cMargin; } } if ($this->customlistindent >= 0) { $this->listindent = $this->customlistindent; } else { $this->listindent = $this->GetStringWidth('0000'); } // save previous states $prev_listnum = $this->listnum; $prev_listordered = $this->listordered; $prev_listcount = $this->listcount; $prev_lispacer = $this->lispacer; $this->listnum = 0; $this->listordered = array(); $this->listcount = array(); $this->lispacer = ''; if (($this->empty_string($this->lasth)) OR ($reseth)) { //set row height $this->lasth = $this->FontSize * $this->cell_height_ratio; } $dom = $this->getHtmlDomArray($html); $maxel = count($dom); $key = 0; while ($key < $maxel) { if ($dom[$key]['tag'] AND $dom[$key]['opening'] AND isset($dom[$key]['attribute']['nobr']) AND ($dom[$key]['attribute']['nobr'] == 'true')) { if (isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { $dom[$key]['attribute']['nobr'] = false; } else { // store current object $this->startTransaction(); // save this method vars $this_method_vars['html'] = $html; $this_method_vars['ln'] = $ln; $this_method_vars['fill'] = $fill; $this_method_vars['reseth'] = $reseth; $this_method_vars['cell'] = $cell; $this_method_vars['align'] = $align; $this_method_vars['gvars'] = $gvars; $this_method_vars['prevPage'] = $prevPage; $this_method_vars['prevlMargin'] = $prevlMargin; $this_method_vars['prevrMargin'] = $prevrMargin; $this_method_vars['curfontname'] = $curfontname; $this_method_vars['curfontstyle'] = $curfontstyle; $this_method_vars['curfontsize'] = $curfontsize; $this_method_vars['minstartliney'] = $minstartliney; $this_method_vars['yshift'] = $yshift; $this_method_vars['startlinepage'] = $startlinepage; $this_method_vars['startlinepos'] = $startlinepos; $this_method_vars['startlinex'] = $startlinex; $this_method_vars['startliney'] = $startliney; $this_method_vars['newline'] = $newline; $this_method_vars['loop'] = $loop; $this_method_vars['curpos'] = $curpos; $this_method_vars['pask'] = $pask; $this_method_vars['lalign'] = $lalign; $this_method_vars['plalign'] = $plalign; $this_method_vars['w'] = $w; $this_method_vars['prev_listnum'] = $prev_listnum; $this_method_vars['prev_listordered'] = $prev_listordered; $this_method_vars['prev_listcount'] = $prev_listcount; $this_method_vars['prev_lispacer'] = $prev_lispacer; $this_method_vars['key'] = $key; $this_method_vars['dom'] = $dom; } } if ($dom[$key]['tag'] OR ($key == 0)) { if ((($dom[$key]['value'] == 'table') OR ($dom[$key]['value'] == 'tr')) AND (isset($dom[$key]['align']))) { $dom[$key]['align'] = ($this->rtl) ? 'R' : 'L'; } // vertically align image in line if ((!$this->newline) AND ($dom[$key]['value'] == 'img') AND (isset($dom[$key]['attribute']['height'])) AND ($dom[$key]['attribute']['height'] > 0)) { // get image height $imgh = $this->getHTMLUnitToUnits($dom[$key]['attribute']['height'], $this->lasth, 'px'); if (!$this->InFooter) { // check for page break $this->checkPageBreak($imgh); } if ($this->page > $startlinepage) { // fix line splitted over two pages if (isset($this->footerlen[$startlinepage])) { $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; } // line to be moved one page forward $pagebuff = $this->getPageBuffer($startlinepage); $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); $tstart = substr($pagebuff, 0, $startlinepos); $tend = substr($this->getPageBuffer($startlinepage), $curpos); // remove line from previous page $this->setPageBuffer($startlinepage, $tstart.''.$tend); $pagebuff = $this->getPageBuffer($this->page); $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); $tend = substr($pagebuff, $this->cntmrk[$this->page]); // add line start to current page $yshift = $minstartliney - $this->y; $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { $next_pask = count($this->PageAnnots[$this->page]); } else { $next_pask = 0; } if (isset($this->PageAnnots[$startlinepage])) { foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][] = $pac; unset($this->PageAnnots[$startlinepage][$pak]); $npak = count($this->PageAnnots[$this->page]) - 1; $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; } } } $pask = $next_pask; $startlinepos = $this->cntmrk[$this->page]; $startlinepage = $this->page; $startliney = $this->y; } $this->y += (($curfontsize / $this->k) - $imgh); $minstartliney = min($this->y, $minstartliney); } elseif (isset($dom[$key]['fontname']) OR isset($dom[$key]['fontstyle']) OR isset($dom[$key]['fontsize'])) { // account for different font size $pfontname = $curfontname; $pfontstyle = $curfontstyle; $pfontsize = $curfontsize; $fontname = isset($dom[$key]['fontname']) ? $dom[$key]['fontname'] : $curfontname; $fontstyle = isset($dom[$key]['fontstyle']) ? $dom[$key]['fontstyle'] : $curfontstyle; $fontsize = isset($dom[$key]['fontsize']) ? $dom[$key]['fontsize'] : $curfontsize; if (($fontname != $curfontname) OR ($fontstyle != $curfontstyle) OR ($fontsize != $curfontsize)) { $this->SetFont($fontname, $fontstyle, $fontsize); $this->lasth = $this->FontSize * $this->cell_height_ratio; if (is_numeric($fontsize) AND ($fontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($fontsize != $curfontsize) AND (!$this->newline) AND ($key < ($maxel - 1)) ) { if ((!$this->newline) AND ($this->page > $startlinepage)) { // fix lines splitted over two pages if (isset($this->footerlen[$startlinepage])) { $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; } // line to be moved one page forward $pagebuff = $this->getPageBuffer($startlinepage); $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); $tstart = substr($pagebuff, 0, $startlinepos); $tend = substr($this->getPageBuffer($startlinepage), $curpos); // remove line start from previous page $this->setPageBuffer($startlinepage, $tstart.''.$tend); $pagebuff = $this->getPageBuffer($this->page); $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); $tend = substr($pagebuff, $this->cntmrk[$this->page]); // add line start to current page $yshift = $minstartliney - $this->y; $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { $next_pask = count($this->PageAnnots[$this->page]); } else { $next_pask = 0; } if (isset($this->PageAnnots[$startlinepage])) { foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][] = $pac; unset($this->PageAnnots[$startlinepage][$pak]); $npak = count($this->PageAnnots[$this->page]) - 1; $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; } } } $pask = $next_pask; } if (($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) { $this->y += (($curfontsize - $fontsize) / $this->k); } $minstartliney = min($this->y, $minstartliney); } $curfontname = $fontname; $curfontstyle = $fontstyle; $curfontsize = $fontsize; } } if (($plalign == 'J') AND (in_array($dom[$key]['value'], $blocktags))) { $plalign = ''; } // get current position on page buffer $curpos = $this->pagelen[$startlinepage]; if (isset($dom[$key]['bgcolor']) AND ($dom[$key]['bgcolor'] !== false)) { $this->SetFillColorArray($dom[$key]['bgcolor']); $wfill = true; } else { $wfill = $fill | false; } if (isset($dom[$key]['fgcolor']) AND ($dom[$key]['fgcolor'] !== false)) { $this->SetTextColorArray($dom[$key]['fgcolor']); } if (isset($dom[$key]['align'])) { $lalign = $dom[$key]['align']; } if ($this->empty_string($lalign)) { $lalign = $align; } } // align lines if ($this->newline AND (strlen($dom[$key]['value']) > 0) AND ($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) { $newline = true; // we are at the beginning of a new line if (isset($startlinex)) { $yshift = $minstartliney - $startliney; if (($yshift > 0) OR ($this->page > $startlinepage)) { $yshift = 0; } if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl))))) OR ($yshift < 0)) { // the last line must be shifted to be aligned as requested $linew = abs($this->endlinex - $startlinex); $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = min($opentagpos, $this->footerpos[$startlinepage]); } elseif (isset($opentagpos)) { $midpos = $opentagpos; } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = $this->footerpos[$startlinepage]; } else { $midpos = 0; } if ($midpos > 0) { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); $pend = substr($this->getPageBuffer($startlinepage), $midpos); } else { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); $pend = ''; } // calculate shifting amount $tw = $w; if ($this->lMargin != $prevlMargin) { $tw += ($prevlMargin - $this->lMargin); } if ($this->rMargin != $prevrMargin) { $tw += ($prevrMargin - $this->rMargin); } $mdiff = abs($tw - $linew); $t_x = 0; if ($plalign == 'C') { if ($this->rtl) { $t_x = -($mdiff / 2); } else { $t_x = ($mdiff / 2); } } elseif (($plalign == 'R') AND (!$this->rtl)) { // right alignment on LTR document $t_x = $mdiff; } elseif (($plalign == 'L') AND ($this->rtl)) { // left alignment on RTL document $t_x = -$mdiff; } elseif (($plalign == 'J') AND ($plalign == $lalign)) { // Justification if ($this->rtl OR $this->tmprtl) { $t_x = $this->lMargin - $this->endlinex; } $no = 0; $ns = 0; $pmidtemp = $pmid; // escape special characters $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); // search spaces if (preg_match_all('/\[\(([^\)]*)\)\]/x', $pmidtemp, $lnstring, PREG_PATTERN_ORDER)) { $maxkk = count($lnstring[1]) - 1; for ($kk=0; $kk <= $maxkk; ++$kk) { // restore special characters $lnstring[1][$kk] = str_replace('#!#OP#!#', '(', $lnstring[1][$kk]); $lnstring[1][$kk] = str_replace('#!#CP#!#', ')', $lnstring[1][$kk]); if ($kk == $maxkk) { if ($this->rtl OR $this->tmprtl) { $tvalue = ltrim($lnstring[1][$kk]); } else { $tvalue = rtrim($lnstring[1][$kk]); } } else { $tvalue = $lnstring[1][$kk]; } // count spaces on line $no += substr_count($lnstring[1][$kk], chr(32)); $ns += substr_count($tvalue, chr(32)); } if ($this->rtl OR $this->tmprtl) { $t_x = $this->lMargin - $this->endlinex - (($no - $ns - 1) * $this->GetStringWidth(chr(32))); } // calculate additional space to add to each space $spacelen = $this->GetStringWidth(chr(32)); $spacewidth = (($tw - $linew + (($no - $ns) * $spacelen)) / ($ns?$ns:1)) * $this->k; $spacewidthu = -1000 * ($tw - $linew + ($no * $spacelen)) / ($ns?$ns:1) / $this->FontSize; $nsmax = $ns; $ns = 0; reset($lnstring); $offset = 0; $strcount = 0; $prev_epsposbeg = 0; global $spacew; while (preg_match('/([0-9\.\+\-]*)[\s](Td|cm|m|l|c|re)[\s]/x', $pmid, $strpiece, PREG_OFFSET_CAPTURE, $offset) == 1) { // check if we are inside a string section '[( ... )]' $stroffset = strpos($pmid, '[(', $offset); if (($stroffset !== false) AND ($stroffset <= $strpiece[2][1])) { // set offset to the end of string section $offset = strpos($pmid, ')]', $stroffset); while (($offset !== false) AND ($pmid{($offset - 1)} == '\\')) { $offset = strpos($pmid, ')]', ($offset + 1)); } if ($offset === false) { $this->Error('HTML Justification: malformed PDF code.'); } continue; } if ($this->rtl OR $this->tmprtl) { $spacew = ($spacewidth * ($nsmax - $ns)); } else { $spacew = ($spacewidth * $ns); } $offset = $strpiece[2][1] + strlen($strpiece[2][0]); $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, $offset); $epsposend = strpos($pmid, $this->epsmarker.'Q', $offset) + strlen($this->epsmarker.'Q'); if ((($epsposbeg > 0) AND ($epsposend > 0) AND ($offset > $epsposbeg) AND ($offset < $epsposend)) OR (($epsposbeg === false) AND ($epsposend > 0) AND ($offset < $epsposend))) { // shift EPS images $trx = sprintf('1 0 0 1 %.3F 0 cm', $spacew); $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, ($prev_epsposbeg - 6)); $pmid_b = substr($pmid, 0, $epsposbeg); $pmid_m = substr($pmid, $epsposbeg, ($epsposend - $epsposbeg)); $pmid_e = substr($pmid, $epsposend); $pmid = $pmid_b."\nq\n".$trx."\n".$pmid_m."\nQ\n".$pmid_e; $offset = $epsposend; continue; } $prev_epsposbeg = $epsposbeg; $currentxpos = 0; // shift blocks of code switch ($strpiece[2][0]) { case 'Td': case 'cm': case 'm': case 'l': { // get current X position preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); $currentxpos = $xmatches[1]; if (($strcount <= $maxkk) AND ($strpiece[2][0] == 'Td')) { if ($strcount == $maxkk) { if ($this->rtl OR $this->tmprtl) { $tvalue = $lnstring[1][$strcount]; } else { $tvalue = rtrim($lnstring[1][$strcount]); } } else { $tvalue = $lnstring[1][$strcount]; } $ns += substr_count($tvalue, chr(32)); ++$strcount; } if ($this->rtl OR $this->tmprtl) { $spacew = ($spacewidth * ($nsmax - $ns)); } // justify block $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', create_function('$matches', 'global $spacew; $newx = sprintf("%.2F",(floatval($matches[1]) + $spacew)); return "".$newx." ".$matches[2]." x*#!#*x".$matches[3].$matches[4];'), $pmid, 1); break; } case 're': { // get current X position preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); $currentxpos = $xmatches[1]; // justify block $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', create_function('$matches', 'global $spacew; $newx = sprintf("%.2F",(floatval($matches[1]) + $spacew)); return "".$newx." ".$matches[2]." ".$matches[3]." ".$matches[4]." x*#!#*x".$matches[5].$matches[6];'), $pmid, 1); break; } case 'c': { // get current X position preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); $currentxpos = $xmatches[1]; // justify block $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', create_function('$matches', 'global $spacew; $newx1 = sprintf("%.3F",(floatval($matches[1]) + $spacew)); $newx2 = sprintf("%.3F",(floatval($matches[3]) + $spacew)); $newx3 = sprintf("%.3F",(floatval($matches[5]) + $spacew)); return "".$newx1." ".$matches[2]." ".$newx2." ".$matches[4]." ".$newx3." ".$matches[6]." x*#!#*x".$matches[7].$matches[8];'), $pmid, 1); break; } } // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { foreach ($this->PageAnnots[$this->page] as $pak => $pac) { if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) { $this->PageAnnots[$this->page][$pak]['x'] += ($spacew / $this->k); $this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); break; } } } } // end of while // remove markers $pmid = str_replace('x*#!#*x', '', $pmid); if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { // multibyte characters $spacew = $spacewidthu; $pmidtemp = $pmid; // escape special characters $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); $pmid = preg_replace_callback("/\[\(([^\)]*)\)\]/x", create_function('$matches', 'global $spacew; $matches[1] = str_replace("#!#OP#!#", "(", $matches[1]); $matches[1] = str_replace("#!#CP#!#", ")", $matches[1]); return "[(".str_replace(chr(0).chr(32), ") ".($spacew)." (", $matches[1]).")]";'), $pmidtemp); $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\n".$pend); $endlinepos = strlen($pstart."\n".$pmid."\n"); } else { // non-unicode (single-byte characters) $rs = sprintf("%.3F Tw", $spacewidth); $pmid = preg_replace("/\[\(/x", $rs.' [(', $pmid); $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend); $endlinepos = strlen($pstart."\n".$pmid."\nBT 0 Tw ET\n"); } } } // end of J if (($t_x != 0) OR ($yshift < 0)) { // shift the line $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); $this->setPageBuffer($startlinepage, $pstart."\nq\n".$trx."\n".$pmid."\nQ\n".$pend); $endlinepos = strlen($pstart."\nq\n".$trx."\n".$pmid."\nQ\n"); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { foreach ($this->PageAnnots[$this->page] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][$pak]['x'] += $t_x; $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; } } } $this->y -= $yshift; } } } $this->newline = false; $pbrk = $this->checkPageBreak($this->lasth); $this->SetFont($fontname, $fontstyle, $fontsize); if ($wfill) { $this->SetFillColorArray($this->bgcolor); } $startlinex = $this->x; $startliney = $this->y; $minstartliney = $this->y; $startlinepage = $this->page; if (isset($endlinepos) AND (!$pbrk)) { $startlinepos = $endlinepos; unset($endlinepos); } else { if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $startlinepos = $this->footerpos[$this->page]; } $plalign = $lalign; if (isset($this->PageAnnots[$this->page])) { $pask = count($this->PageAnnots[$this->page]); } else { $pask = 0; } } if (isset($opentagpos)) { unset($opentagpos); } if ($dom[$key]['tag']) { if ($dom[$key]['opening']) { // get text indentation (if any) if (isset($dom[$key]['text-indent']) AND in_array($dom[$key]['value'], array('blockquote','dd','div','dt','h1','h2','h3','h4','h5','h6','li','ol','p','ul','table','tr','td'))) { $this->textindent = $dom[$key]['text-indent']; } if ($dom[$key]['value'] == 'table') { if ($this->rtl) { $wtmp = $this->x - $this->lMargin; } else { $wtmp = $this->w - $this->rMargin - $this->x; } $wtmp -= (2 * $this->cMargin); // calculate cell width if (isset($dom[$key]['width'])) { $table_width = $this->getHTMLUnitToUnits($dom[$key]['width'], $wtmp, 'px'); } else { $table_width = $wtmp; } } // table content is handled in a special way if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { $trid = $dom[$key]['parent']; $table_el = $dom[$trid]['parent']; if (!isset($dom[$table_el]['cols'])) { $dom[$table_el]['cols'] = $trid['cols']; } $oldmargin = $this->cMargin; if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'])) { $currentcmargin = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'], 1, 'px'); } else { $currentcmargin = 0; } $this->cMargin = $currentcmargin; if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellspacing'])) { $cellspacing = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellspacing'], 1, 'px'); } else { $cellspacing = 0; } if ($this->rtl) { $cellspacingx = -$cellspacing; } else { $cellspacingx = $cellspacing; } $colspan = $dom[$key]['attribute']['colspan']; $wtmp = ($colspan * ($table_width / $dom[$table_el]['cols'])); if (isset($dom[$key]['width'])) { $cellw = $this->getHTMLUnitToUnits($dom[$key]['width'], $table_width, 'px'); } else { $cellw = $wtmp; } if (isset($dom[$key]['height'])) { // minimum cell height $cellh = $this->getHTMLUnitToUnits($dom[$key]['height'], 0, 'px'); } else { $cellh = 0; } $cellw -= $cellspacing; if (isset($dom[$key]['content'])) { $cell_content = $dom[$key]['content']; } else { $cell_content = ' '; } $tagtype = $dom[$key]['value']; $parentid = $key; while (($key < $maxel) AND (!(($dom[$key]['tag']) AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == $tagtype) AND ($dom[$key]['parent'] == $parentid)))) { // move $key index forward ++$key; } if (!isset($dom[$trid]['startpage'])) { $dom[$trid]['startpage'] = $this->page; } else { $this->setPage($dom[$trid]['startpage']); } if (!isset($dom[$trid]['starty'])) { $dom[$trid]['starty'] = $this->y; } else { $this->y = $dom[$trid]['starty']; } if (!isset($dom[$trid]['startx'])) { $dom[$trid]['startx'] = $this->x; } $this->x += ($cellspacingx / 2); if (isset($dom[$parentid]['attribute']['rowspan'])) { $rowspan = intval($dom[$parentid]['attribute']['rowspan']); } else { $rowspan = 1; } // skip row-spanned cells started on the previous rows if (isset($dom[$table_el]['rowspans'])) { $rsk = 0; $rskmax = count($dom[$table_el]['rowspans']); while ($rsk < $rskmax) { $trwsp = $dom[$table_el]['rowspans'][$rsk]; $rsstartx = $trwsp['startx']; $rsendx = $trwsp['endx']; // account for margin changes if ($trwsp['startpage'] < $this->page) { if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$trwsp['startpage']]['orm'])) { $dl = ($this->pagedim[$this->page]['orm'] - $this->pagedim[$trwsp['startpage']]['orm']); $rsstartx -= $dl; $rsendx -= $dl; } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$trwsp['startpage']]['olm'])) { $dl = ($this->pagedim[$this->page]['olm'] - $this->pagedim[$trwsp['startpage']]['olm']); $rsstartx += $dl; $rsendx += $dl; } } if (($trwsp['rowspan'] > 0) AND ($rsstartx > ($this->x - $cellspacing - $currentcmargin - $this->feps)) AND ($rsstartx < ($this->x + $cellspacing + $currentcmargin + $this->feps)) AND (($trwsp['starty'] < ($this->y - $this->feps)) OR ($trwsp['startpage'] < $this->page))) { // set the starting X position of the current cell $this->x = $rsendx + $cellspacingx; if (($trwsp['rowspan'] == 1) AND (isset($dom[$trid]['endy'])) AND (isset($dom[$trid]['endpage'])) AND ($trwsp['endpage'] == $dom[$trid]['endpage'])) { // set ending Y position for row $dom[$table_el]['rowspans'][$rsk]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); $dom[$trid]['endy'] = $dom[$table_el]['rowspans'][$rsk]['endy']; } $rsk = 0; } else { ++$rsk; } } } // add rowspan information to table element if ($rowspan > 1) { if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $trintmrkpos = $this->footerpos[$this->page]; $trsid = array_push($dom[$table_el]['rowspans'], array('trid' => $trid, 'rowspan' => $rowspan, 'mrowspan' => $rowspan, 'colspan' => $colspan, 'startpage' => $this->page, 'startx' => $this->x, 'starty' => $this->y, 'intmrkpos' => $trintmrkpos)); } $cellid = array_push($dom[$trid]['cellpos'], array('startx' => $this->x)); if ($rowspan > 1) { $dom[$trid]['cellpos'][($cellid - 1)]['rowspanid'] = ($trsid - 1); } // push background colors if (isset($dom[$parentid]['bgcolor']) AND ($dom[$parentid]['bgcolor'] !== false)) { $dom[$trid]['cellpos'][($cellid - 1)]['bgcolor'] = $dom[$parentid]['bgcolor']; } $prevLastH = $this->lasth; // ****** write the cell content ****** $this->MultiCell($cellw, $cellh, $cell_content, false, $lalign, false, 2, '', '', true, 0, true); $this->lasth = $prevLastH; $this->cMargin = $oldmargin; $dom[$trid]['cellpos'][($cellid - 1)]['endx'] = $this->x; // update the end of row position if ($rowspan <= 1) { if (isset($dom[$trid]['endy'])) { if ($this->page == $dom[$trid]['endpage']) { $dom[$trid]['endy'] = max($this->y, $dom[$trid]['endy']); } elseif ($this->page > $dom[$trid]['endpage']) { $dom[$trid]['endy'] = $this->y; } } else { $dom[$trid]['endy'] = $this->y; } if (isset($dom[$trid]['endpage'])) { $dom[$trid]['endpage'] = max($this->page, $dom[$trid]['endpage']); } else { $dom[$trid]['endpage'] = $this->page; } } else { // account for row-spanned cells $dom[$table_el]['rowspans'][($trsid - 1)]['endx'] = $this->x; $dom[$table_el]['rowspans'][($trsid - 1)]['endy'] = $this->y; $dom[$table_el]['rowspans'][($trsid - 1)]['endpage'] = $this->page; } if (isset($dom[$table_el]['rowspans'])) { // update endy and endpage on rowspanned cells foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { if ($trwsp['rowspan'] > 0) { if (isset($dom[$trid]['endpage'])) { if ($trwsp['endpage'] == $dom[$trid]['endpage']) { $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); } elseif ($trwsp['endpage'] < $dom[$trid]['endpage']) { $dom[$table_el]['rowspans'][$k]['endy'] = $dom[$trid]['endy']; $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[$trid]['endpage']; } else { $dom[$trid]['endy'] = $this->pagedim[$dom[$trid]['endpage']]['hk'] - $this->pagedim[$dom[$trid]['endpage']]['bm']; } } } } } $this->x += ($cellspacingx / 2); } else { // opening tag (or self-closing tag) if (!isset($opentagpos)) { if (!$this->InFooter) { if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $opentagpos = $this->footerpos[$this->page]; } } $this->openHTMLTagHandler($dom, $key, $cell); } } else { // closing tag $this->closeHTMLTagHandler($dom, $key, $cell); } } elseif (strlen($dom[$key]['value']) > 0) { // print list-item if (!$this->empty_string($this->lispacer)) { $this->SetFont($pfontname, $pfontstyle, $pfontsize); $this->lasth = $this->FontSize * $this->cell_height_ratio; $minstartliney = $this->y; $this->putHtmlListBullet($this->listnum, $this->lispacer, $pfontsize); $this->SetFont($curfontname, $curfontstyle, $curfontsize); $this->lasth = $this->FontSize * $this->cell_height_ratio; if (is_numeric($pfontsize) AND ($pfontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($pfontsize != $curfontsize)) { $this->y += (($pfontsize - $curfontsize) / $this->k); $minstartliney = min($this->y, $minstartliney); } } // text $this->htmlvspace = 0; if ((!$this->premode) AND ($this->rtl OR $this->tmprtl)) { // reverse spaces order $len1 = strlen($dom[$key]['value']); $lsp = $len1 - strlen(ltrim($dom[$key]['value'])); $rsp = $len1 - strlen(rtrim($dom[$key]['value'])); $tmpstr = ''; if ($rsp > 0) { $tmpstr .= substr($dom[$key]['value'], -$rsp); } $tmpstr .= trim($dom[$key]['value']); if ($lsp > 0) { $tmpstr .= substr($dom[$key]['value'], 0, $lsp); } $dom[$key]['value'] = $tmpstr; } if ($newline) { if (!$this->premode) { if (($this->rtl OR $this->tmprtl)) { $dom[$key]['value'] = rtrim($dom[$key]['value']); } else { $dom[$key]['value'] = ltrim($dom[$key]['value']); } } $newline = false; $firstblock = true; } else { $firstblock = false; } $strrest = ''; if (!empty($this->HREF) AND (isset($this->HREF['url']))) { // HTML Link $strrest = $this->addHtmlLink($this->HREF['url'], $dom[$key]['value'], $wfill, true, $this->HREF['color'], $this->HREF['style']); } else { $ctmpmargin = $this->cMargin; $this->cMargin = 0; if ($this->rtl) { $this->x -= $this->textindent; } else { $this->x += $this->textindent; } // ****** write only until the end of the line and get the rest ****** $strrest = $this->Write($this->lasth, $dom[$key]['value'], '', $wfill, '', false, 0, true, $firstblock); $this->textindent = 0; $this->cMargin = $ctmpmargin; } if (strlen($strrest) > 0) { // store the remaining string on the previous $key position $this->newline = true; if ($cell) { if ($this->rtl) { $this->x -= $this->cMargin; } else { $this->x += $this->cMargin; } } if ($strrest == $dom[$key]['value']) { // used to avoid infinite loop ++$loop; } else { $loop = 0; } $dom[$key]['value'] = ltrim($strrest); if ($loop < 3) { --$key; } } else { $loop = 0; } } ++$key; if (isset($dom[$key]['tag']) AND $dom[$key]['tag'] AND (!isset($dom[$key]['opening']) OR !$dom[$key]['opening']) AND isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { if ((!$undo) AND ($this->start_transaction_page == ($this->numpages - 1))) { // restore previous object $this->rollbackTransaction(true); // restore previous values foreach ($this_method_vars as $vkey => $vval) { $$vkey = $vval; } // add a page $this->AddPage(); $undo = true; // avoid infinite loop } else { $undo = false; } } } // end for each $key // align the last line if (isset($startlinex)) { $yshift = $minstartliney - $startliney; if (($yshift > 0) OR ($this->page > $startlinepage)) { $yshift = 0; } if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl))))) OR ($yshift < 0)) { // the last line must be shifted to be aligned as requested $linew = abs($this->endlinex - $startlinex); $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = min($opentagpos, $this->footerpos[$startlinepage]); } elseif (isset($opentagpos)) { $midpos = $opentagpos; } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = $this->footerpos[$startlinepage]; } else { $midpos = 0; } if ($midpos > 0) { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); $pend = substr($this->getPageBuffer($startlinepage), $midpos); } else { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); $pend = ''; } // calculate shifting amount $tw = $w; if ($this->lMargin != $prevlMargin) { $tw += ($prevlMargin - $this->lMargin); } if ($this->rMargin != $prevrMargin) { $tw += ($prevrMargin - $this->rMargin); } $mdiff = abs($tw - $linew); if ($plalign == 'C') { if ($this->rtl) { $t_x = -($mdiff / 2); } else { $t_x = ($mdiff / 2); } } elseif (($plalign == 'R') AND (!$this->rtl)) { // right alignment on LTR document $t_x = $mdiff; } elseif (($plalign == 'L') AND ($this->rtl)) { // left alignment on RTL document $t_x = -$mdiff; } else { $t_x = 0; } if (($t_x != 0) OR ($yshift < 0)) { // shift the line $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); $this->setPageBuffer($startlinepage, $pstart."\nq\n".$trx."\n".$pmid."\nQ\n".$pend); $endlinepos = strlen($pstart."\nq\n".$trx."\n".$pmid."\nQ\n"); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { foreach ($this->PageAnnots[$this->page] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][$pak]['x'] += $t_x; $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; } } } $this->y -= $yshift; } } } if ($ln AND (!($cell AND ($dom[$key-1]['value'] == 'table')))) { $this->Ln($this->lasth); } // restore previous values $this->setGraphicVars($gvars); if ($this->page > $prevPage) { $this->lMargin = $this->pagedim[$this->page]['olm']; $this->rMargin = $this->pagedim[$this->page]['orm']; } // restore previous list state $this->listnum = $prev_listnum; $this->listordered = $prev_listordered; $this->listcount = $prev_listcount; $this->lispacer = $prev_lispacer; unset($dom); } /** * Process opening tags. * @param array $dom html dom array * @param int $key current element id * @param boolean $cell if true add the default cMargin space to each new line (default false). * @access protected */ protected function openHTMLTagHandler(&$dom, $key, $cell=false) { $tag = $dom[$key]; $parent = $dom[($dom[$key]['parent'])]; $firstorlast = ($key == 1); // check for text direction attribute if (isset($tag['attribute']['dir'])) { $this->tmprtl = $tag['attribute']['dir'] == 'rtl' ? 'R' : 'L'; } else { $this->tmprtl = false; } //Opening tag switch($tag['value']) { case 'table': { $cp = 0; $cs = 0; $dom[$key]['rowspans'] = array(); if (!$this->empty_string($dom[$key]['thead'])) { // set table header $this->thead = $dom[$key]['thead']; if (!isset($this->theadMargins) OR (empty($this->theadMargins))) { $this->theadMargins = array(); $this->theadMargins['cmargin'] = $this->cMargin; } } if (isset($tag['attribute']['cellpadding'])) { $cp = $this->getHTMLUnitToUnits($tag['attribute']['cellpadding'], 1, 'px'); $this->oldcMargin = $this->cMargin; $this->cMargin = $cp; } if (isset($tag['attribute']['cellspacing'])) { $cs = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px'); } $this->checkPageBreak((2 * $cp) + (2 * $cs) + $this->lasth); break; } case 'tr': { // array of columns positions $dom[$key]['cellpos'] = array(); break; } case 'hr': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); $this->htmlvspace = 0; $wtmp = $this->w - $this->lMargin - $this->rMargin; if ((isset($tag['attribute']['width'])) AND ($tag['attribute']['width'] != '')) { $hrWidth = $this->getHTMLUnitToUnits($tag['attribute']['width'], $wtmp, 'px'); } else { $hrWidth = $wtmp; } $x = $this->GetX(); $y = $this->GetY(); $prevlinewidth = $this->GetLineWidth(); $this->Line($x, $y, $x + $hrWidth, $y); $this->SetLineWidth($prevlinewidth); $this->addHTMLVertSpace(1, $cell, '', !isset($dom[($key + 1)]), $tag['value'], false); break; } case 'a': { if (array_key_exists('href', $tag['attribute'])) { $this->HREF['url'] = $tag['attribute']['href']; } $this->HREF['color'] = $this->htmlLinkColorArray; $this->HREF['style'] = $this->htmlLinkFontStyle; if (array_key_exists('style', $tag['attribute'])) { // get style attributes preg_match_all('/([^;:\s]*):([^;]*)/', $tag['attribute']['style'], $style_array, PREG_PATTERN_ORDER); $astyle = array(); while (list($id, $name) = each($style_array[1])) { $name = strtolower($name); $astyle[$name] = trim($style_array[2][$id]); } if (isset($astyle['color'])) { $this->HREF['color'] = $this->convertHTMLColorToDec($astyle['color']); } if (isset($astyle['text-decoration'])) { $this->HREF['style'] = ''; $decors = explode(' ', strtolower($astyle['text-decoration'])); foreach ($decors as $dec) { $dec = trim($dec); if (!$this->empty_string($dec)) { if ($dec{0} == 'u') { $this->HREF['style'] .= 'U'; } elseif ($dec{0} == 'l') { $this->HREF['style'] .= 'D'; } } } } } break; } case 'img': { if (isset($tag['attribute']['src'])) { // replace relative path with real server path if (($tag['attribute']['src'][0] == '/') AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { $tag['attribute']['src'] = $_SERVER['DOCUMENT_ROOT'].$tag['attribute']['src']; } $tag['attribute']['src'] = urldecode($tag['attribute']['src']); $tag['attribute']['src'] = str_replace(K_PATH_URL, K_PATH_MAIN, $tag['attribute']['src']); if (!isset($tag['attribute']['width'])) { $tag['attribute']['width'] = 0; } if (!isset($tag['attribute']['height'])) { $tag['attribute']['height'] = 0; } //if (!isset($tag['attribute']['align'])) { // the only alignment supported is "bottom" // further development is required for other modes. $tag['attribute']['align'] = 'bottom'; //} switch($tag['attribute']['align']) { case 'top': { $align = 'T'; break; } case 'middle': { $align = 'M'; break; } case 'bottom': { $align = 'B'; break; } default: { $align = 'B'; break; } } $fileinfo = pathinfo($tag['attribute']['src']); if (isset($fileinfo['extension']) AND (!$this->empty_string($fileinfo['extension']))) { $type = strtolower($fileinfo['extension']); } $prevy = $this->y; $xpos = $this->GetX(); if (isset($dom[($key - 1)]) AND ($dom[($key - 1)]['value'] == ' ')) { if ($this->rtl) { $xpos += $this->GetStringWidth(' '); } else { $xpos -= $this->GetStringWidth(' '); } } $imglink = ''; if (isset($this->HREF['url']) AND !$this->empty_string($this->HREF['url'])) { $imglink = $this->HREF['url']; if ($imglink{0} == '#') { // convert url to internal link $page = intval(substr($imglink, 1)); $imglink = $this->AddLink(); $this->SetLink($imglink, 0, $page); } } $border = 0; if (isset($tag['attribute']['border']) AND !empty($tag['attribute']['border'])) { // currently only support 1 (frame) or a combination of 'LTRB' $border = $tag['attribute']['border']; } $iw = ''; if (isset($tag['attribute']['width'])) { $iw = $this->getHTMLUnitToUnits($tag['attribute']['width'], 1, 'px', false); } $ih = ''; if (isset($tag['attribute']['height'])) { $ih = $this->getHTMLUnitToUnits($tag['attribute']['height'], 1, 'px', false); } if (($type == 'eps') OR ($type == 'ai')) { $this->ImageEps($tag['attribute']['src'], $xpos, $this->GetY(), $iw, $ih, $imglink, true, $align, '', $border); } else { $this->Image($tag['attribute']['src'], $xpos, $this->GetY(), $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border); } switch($align) { case 'T': { $this->y = $prevy; break; } case 'M': { $this->y = (($this->img_rb_y + $prevy - ($tag['fontsize'] / $this->k)) / 2) ; break; } case 'B': { $this->y = $this->img_rb_y - ($tag['fontsize'] / $this->k); break; } } } break; } case 'dl': { ++$this->listnum; $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], false); break; } case 'dt': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); break; } case 'dd': { if ($this->rtl) { $this->rMargin += $this->listindent; } else { $this->lMargin += $this->listindent; } $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); break; } case 'ul': case 'ol': { $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], false); $this->htmlvspace = 0; ++$this->listnum; if ($tag['value'] == 'ol') { $this->listordered[$this->listnum] = true; } else { $this->listordered[$this->listnum] = false; } if (isset($tag['attribute']['start'])) { $this->listcount[$this->listnum] = intval($tag['attribute']['start']) - 1; } else { $this->listcount[$this->listnum] = 0; } if ($this->rtl) { $this->rMargin += $this->listindent; } else { $this->lMargin += $this->listindent; } $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], false); $this->htmlvspace = 0; break; } case 'li': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); if ($this->listordered[$this->listnum]) { // ordered item if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { $this->lispacer = $parent['attribute']['type']; } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { $this->lispacer = $parent['listtype']; } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { $this->lispacer = $this->lisymbol; } else { $this->lispacer = '#'; } ++$this->listcount[$this->listnum]; if (isset($tag['attribute']['value'])) { $this->listcount[$this->listnum] = intval($tag['attribute']['value']); } } else { // unordered item if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { $this->lispacer = $parent['attribute']['type']; } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { $this->lispacer = $parent['listtype']; } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { $this->lispacer = $this->lisymbol; } else { $this->lispacer = '!'; } } break; } case 'blockquote': { if ($this->rtl) { $this->rMargin += $this->listindent; } else { $this->lMargin += $this->listindent; } $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], false); break; } case 'br': { $this->Ln('', $cell); break; } case 'div': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); break; } case 'p': { $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], false); break; } case 'pre': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); $this->premode = true; break; } case 'sup': { $this->SetXY($this->GetX(), $this->GetY() - ((0.7 * $this->FontSizePt) / $this->k)); break; } case 'sub': { $this->SetXY($this->GetX(), $this->GetY() + ((0.3 * $this->FontSizePt) / $this->k)); break; } case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': { $this->addHTMLVertSpace(1, $cell, ($tag['fontsize'] * 1.5) / $this->k, $firstorlast, $tag['value'], false); break; } // Form fields (since 4.8.000 - 2009-09-07) case 'form': { if (isset($tag['attribute']['action'])) { $this->form_action = $tag['attribute']['action']; } else { $this->form_action = K_PATH_URL.$_SERVER['SCRIPT_NAME']; } if (isset($tag['attribute']['enctype'])) { $this->form_enctype = $tag['attribute']['enctype']; } else { $this->form_enctype = 'application/x-www-form-urlencoded'; } if (isset($tag['attribute']['method'])) { $this->form_mode = $tag['attribute']['method']; } else { $this->form_mode = 'post'; } break; } case 'input': { if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { $name = $tag['attribute']['name']; } else { break; } $prop = array(); $opt = array(); if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { $value = $tag['attribute']['value']; } if (isset($tag['attribute']['maxlength']) AND !$this->empty_string($tag['attribute']['maxlength'])) { $opt['maxlen'] = intval($tag['attribute']['value']); } $h = $this->FontSize * $this->cell_height_ratio; if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { $w = intval($tag['attribute']['size']) * $this->GetStringWidth(chr(32)) * 2; } else { $w = $h; } if (isset($tag['attribute']['checked']) AND (($tag['attribute']['checked'] == 'checked') OR ($tag['attribute']['checked'] == 'true'))) { $checked = true; } else { $checked = false; } switch ($tag['attribute']['type']) { case 'text': { if (isset($value)) { $opt['v'] = $value; } $this->TextField($name, $w, $h, $prop, $opt, '', '', false); break; } case 'password': { if (isset($value)) { $opt['v'] = $value; } $prop['password'] = 'true'; $this->TextField($name, $w, $h, $prop, $opt, '', '', false); break; } case 'checkbox': { $this->CheckBox($name, $w, $checked, $prop, $opt, $value, '', '', false); break; } case 'radio': { $this->RadioButton($name, $w, $prop, $opt, $value, $checked, '', '', false); break; } case 'submit': { $w = $this->GetStringWidth($value) * 1.5; $h *= 1.6; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); $action = array(); $action['S'] = 'SubmitForm'; $action['F'] = $this->form_action; if ($this->form_enctype != 'FDF') { $action['Flags'] = array('ExportFormat'); } if ($this->form_mode == 'get') { $action['Flags'] = array('GetMethod'); } $this->Button($name, $w, $h, $value, $action, $prop, $opt, '', '', false); break; } case 'reset': { $w = $this->GetStringWidth($value) * 1.5; $h *= 1.6; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); $this->Button($name, $w, $h, $value, array('S'=>'ResetForm'), $prop, $opt, '', '', false); break; } case 'file': { $prop['fileSelect'] = 'true'; $this->TextField($name, $w, $h, $prop, $opt, '', '', false); if (!isset($value)) { $value = '*'; } $w = $this->GetStringWidth($value) * 2; $h *= 1.2; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); $jsaction = 'var f=this.getField(\''.$name.'\'); f.browseForFileToSubmit();'; $this->Button('FB_'.$name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); break; } case 'hidden': { if (isset($value)) { $opt['v'] = $value; } $opt['f'] = array('invisible', 'hidden'); $this->TextField($name, 0, 0, $prop, $opt, '', '', false); break; } case 'image': { // THIS TYPE MUST BE FIXED if (isset($tag['attribute']['src']) AND !$this->empty_string($tag['attribute']['src'])) { $img = $tag['attribute']['src']; } else { break; } $value = 'img'; //$opt['mk'] = array('i'=>$img, 'tp'=>1, 'if'=>array('sw'=>'A', 's'=>'A', 'fb'=>false)); if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { $jsaction = $tag['attribute']['onclick']; } else { $jsaction = ''; } $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); break; } case 'button': { $w = $this->GetStringWidth($value) * 1.5; $h *= 1.6; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { $jsaction = $tag['attribute']['onclick']; } else { $jsaction = ''; } $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); break; } } break; } case 'textarea': { $prop = array(); $opt = array(); if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { $name = $tag['attribute']['name']; } else { break; } if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { $opt['v'] = $tag['attribute']['value']; } if (isset($tag['attribute']['cols']) AND !$this->empty_string($tag['attribute']['cols'])) { $w = intval($tag['attribute']['cols']) * $this->GetStringWidth(chr(32)) * 2; } else { $w = 40; } if (isset($tag['attribute']['rows']) AND !$this->empty_string($tag['attribute']['rows'])) { $h = intval($tag['attribute']['rows']) * $this->FontSize * $this->cell_height_ratio; } else { $h = 10; } $prop['multiline'] = 'true'; $this->TextField($name, $w, $h, $prop, $opt, '', '', false); break; } case 'select': { $h = $this->FontSize * $this->cell_height_ratio; if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { $h *= ($tag['attribute']['size'] + 1); } $prop = array(); $opt = array(); if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { $name = $tag['attribute']['name']; } else { break; } $w = 0; if (isset($tag['attribute']['opt']) AND !$this->empty_string($tag['attribute']['opt'])) { $options = explode ("\r", $tag['attribute']['opt']); $values = array(); foreach ($options as $val) { if (strpos($val, "\t") !== false) { $opts = explode("\t", $val); $values[] = $opts; $w = max($w, $this->GetStringWidth($opts[1])); } else { $values[] = $val; $w = max($w, $this->GetStringWidth($val)); } } } else { break; } $w *= 2; if (isset($tag['attribute']['multiple']) AND ($tag['attribute']['multiple']='multiple')) { $prop['multipleSelection'] = 'true'; $this->ListBox($name, $w, $h, $values, $prop, $opt, '', '', false); } else { $this->ComboBox($name, $w, $h, $values, $prop, $opt, '', '', false); } break; } case 'tcpdf': { // NOT HTML: used to call TCPDF methods if (isset($tag['attribute']['method'])) { $tcpdf_method = $tag['attribute']['method']; if (method_exists($this, $tcpdf_method)) { if (isset($tag['attribute']['params']) AND (!empty($tag['attribute']['params']))) { eval('$params = array('.$this->unhtmlentities($tag['attribute']['params']).');'); call_user_func_array(array($this, $tcpdf_method), $params); } else { $this->$tcpdf_method(); } $this->newline = true; } } } default: { break; } } } /** * Process closing tags. * @param array $dom html dom array * @param int $key current element id * @param boolean $cell if true add the default cMargin space to each new line (default false). * @access protected */ protected function closeHTMLTagHandler(&$dom, $key, $cell=false) { $tag = $dom[$key]; $parent = $dom[($dom[$key]['parent'])]; $firstorlast = ((!isset($dom[($key + 1)])) OR ((!isset($dom[($key + 2)])) AND ($dom[($key + 1)]['value'] == 'marker'))); $in_table_head = false; //Closing tag switch($tag['value']) { case 'tr': { $table_el = $dom[($dom[$key]['parent'])]['parent']; if(!isset($parent['endy'])) { $dom[($dom[$key]['parent'])]['endy'] = $this->y; $parent['endy'] = $this->y; } if(!isset($parent['endpage'])) { $dom[($dom[$key]['parent'])]['endpage'] = $this->page; $parent['endpage'] = $this->page; } // update row-spanned cells if (isset($dom[$table_el]['rowspans'])) { foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { $dom[$table_el]['rowspans'][$k]['rowspan'] -= 1; if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { if ($dom[$table_el]['rowspans'][$k]['endpage'] == $parent['endpage']) { $dom[($dom[$key]['parent'])]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $parent['endy']); } elseif ($dom[$table_el]['rowspans'][$k]['endpage'] > $parent['endpage']) { $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; } } } // report new endy and endpage to the rowspanned cells foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { $dom[$table_el]['rowspans'][$k]['endpage'] = max($dom[$table_el]['rowspans'][$k]['endpage'], $dom[($dom[$key]['parent'])]['endpage']); $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $dom[($dom[$key]['parent'])]['endy']); $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; } } // update remaining rowspanned cells foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[($dom[$key]['parent'])]['endpage']; $dom[$table_el]['rowspans'][$k]['endy'] = $dom[($dom[$key]['parent'])]['endy']; } } } $this->setPage($dom[($dom[$key]['parent'])]['endpage']); $this->y = $dom[($dom[$key]['parent'])]['endy']; if (isset($dom[$table_el]['attribute']['cellspacing'])) { $cellspacing = $this->getHTMLUnitToUnits($dom[$table_el]['attribute']['cellspacing'], 1, 'px'); $this->y += $cellspacing; } $this->Ln(0, $cell); $this->x = $parent['startx']; // account for booklet mode if ($this->page > $parent['startpage']) { if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$parent['startpage']]['orm'])) { $this->x += ($this->pagedim[$this->page]['orm'] - $this->pagedim[$parent['startpage']]['orm']); } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$parent['startpage']]['olm'])) { $this->x += ($this->pagedim[$this->page]['olm'] - $this->pagedim[$parent['startpage']]['olm']); } } break; } case 'tablehead': // closing tag used for the thead part $in_table_head = true; case 'table': { // draw borders $table_el = $parent; if ((isset($table_el['attribute']['border']) AND ($table_el['attribute']['border'] > 0)) OR (isset($table_el['style']['border']) AND ($table_el['style']['border'] > 0))) { $border = 1; } else { $border = 0; } // fix bottom line alignment of last line before page break foreach ($dom[($dom[$key]['parent'])]['trids'] as $j => $trkey) { // update row-spanned cells if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { if ($trwsp['trid'] == $trkey) { $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] -= 1; } if (isset($prevtrkey) AND ($trwsp['trid'] == $prevtrkey) AND ($trwsp['mrowspan'] >= 0)) { $dom[($dom[$key]['parent'])]['rowspans'][$k]['trid'] = $trkey; } } } if (isset($prevtrkey) AND ($dom[$trkey]['startpage'] > $dom[$prevtrkey]['endpage'])) { $pgendy = $this->pagedim[$dom[$prevtrkey]['endpage']]['hk'] - $this->pagedim[$dom[$prevtrkey]['endpage']]['bm']; $dom[$prevtrkey]['endy'] = $pgendy; // update row-spanned cells if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { if (($trwsp['trid'] == $trkey) AND ($trwsp['mrowspan'] == 1) AND ($trwsp['endpage'] == $dom[$prevtrkey]['endpage'])) { $dom[($dom[$key]['parent'])]['rowspans'][$k]['endy'] = $pgendy; $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] = -1; } } } } $prevtrkey = $trkey; $table_el = $dom[($dom[$key]['parent'])]; } // for each row foreach ($table_el['trids'] as $j => $trkey) { $parent = $dom[$trkey]; // for each cell on the row foreach ($parent['cellpos'] as $k => $cellpos) { if (isset($cellpos['rowspanid']) AND ($cellpos['rowspanid'] >= 0)) { $cellpos['startx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['startx']; $cellpos['endx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['endx']; $endy = $table_el['rowspans'][($cellpos['rowspanid'])]['endy']; $startpage = $table_el['rowspans'][($cellpos['rowspanid'])]['startpage']; $endpage = $table_el['rowspans'][($cellpos['rowspanid'])]['endpage']; } else { $endy = $parent['endy']; $startpage = $parent['startpage']; $endpage = $parent['endpage']; } if ($endpage > $startpage) { // design borders around HTML cells. for ($page=$startpage; $page <= $endpage; ++$page) { $this->setPage($page); if ($page == $startpage) { $this->y = $parent['starty']; // put cursor at the beginning of row on the first page $ch = $this->getPageHeight() - $parent['starty'] - $this->getBreakMargin(); $cborder = $this->getBorderMode($border, $position='start'); } elseif ($page == $endpage) { $this->y = $this->tMargin; // put cursor at the beginning of last page $ch = $endy - $this->tMargin; $cborder = $this->getBorderMode($border, $position='end'); } else { $this->y = $this->tMargin; // put cursor at the beginning of the current page $ch = $this->getPageHeight() - $this->tMargin - $this->getBreakMargin(); $cborder = $this->getBorderMode($border, $position='middle'); } if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { $this->SetFillColorArray($cellpos['bgcolor']); $fill = true; } else { $fill = false; } $cw = abs($cellpos['endx'] - $cellpos['startx']); $this->x = $cellpos['startx']; // account for margin changes if ($page > $startpage) { if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { $this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); } elseif ((!$this->rtl) AND ($this->pagedim[$page]['lm'] != $this->pagedim[$startpage]['olm'])) { $this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); } } // design a cell around the text $ccode = $this->FillColor."\n".$this->getCellCode($cw, $ch, '', $cborder, 1, '', $fill, '', 0, true); if ($cborder OR $fill) { $pagebuff = $this->getPageBuffer($this->page); $pstart = substr($pagebuff, 0, $this->intmrk[$this->page]); $pend = substr($pagebuff, $this->intmrk[$this->page]); $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); $this->intmrk[$this->page] += strlen($ccode."\n"); } } } else { $this->setPage($startpage); if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { $this->SetFillColorArray($cellpos['bgcolor']); $fill = true; } else { $fill = false; } $this->x = $cellpos['startx']; $this->y = $parent['starty']; $cw = abs($cellpos['endx'] - $cellpos['startx']); $ch = $endy - $parent['starty']; // design a cell around the text $ccode = $this->FillColor."\n".$this->getCellCode($cw, $ch, '', $border, 1, '', $fill, '', 0, true); if ($border OR $fill) { if (end($this->transfmrk[$this->page]) !== false) { $pagemarkkey = key($this->transfmrk[$this->page]); $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; } elseif ($this->InFooter) { $pagemark = &$this->footerpos[$this->page]; } else { $pagemark = &$this->intmrk[$this->page]; } $pagebuff = $this->getPageBuffer($this->page); $pstart = substr($pagebuff, 0, $pagemark); $pend = substr($pagebuff, $pagemark); $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); $pagemark += strlen($ccode."\n"); } } } if (isset($table_el['attribute']['cellspacing'])) { $cellspacing = $this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'], 1, 'px'); $this->y += $cellspacing; } $this->Ln(0, $cell); $this->x = $parent['startx']; if ($endpage > $startpage) { if (($this->rtl) AND ($this->pagedim[$endpage]['orm'] != $this->pagedim[$startpage]['orm'])) { $this->x += ($this->pagedim[$endpage]['orm'] - $this->pagedim[$startpage]['orm']); } elseif ((!$this->rtl) AND ($this->pagedim[$endpage]['olm'] != $this->pagedim[$startpage]['olm'])) { $this->x += ($this->pagedim[$endpage]['olm'] - $this->pagedim[$startpage]['olm']); } } } if (!$in_table_head) { // we are not inside a thead section if (isset($parent['cellpadding'])) { $this->cMargin = $this->oldcMargin; } $this->lasth = $this->FontSize * $this->cell_height_ratio; if (isset($this->theadMargins['top'])) { // restore top margin $this->tMargin = $this->theadMargins['top']; $this->pagedim[$this->page]['tm'] = $this->tMargin; } // reset table header $this->thead = ''; $this->theadMargins = array(); } break; } case 'a': { $this->HREF = ''; break; } case 'sup': { $this->SetXY($this->GetX(), $this->GetY() + ((0.7 * $parent['fontsize']) / $this->k)); break; } case 'sub': { $this->SetXY($this->GetX(), $this->GetY() - ((0.3 * $parent['fontsize'])/$this->k)); break; } case 'div': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], true); break; } case 'blockquote': { if ($this->rtl) { $this->rMargin -= $this->listindent; } else { $this->lMargin -= $this->listindent; } $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); break; } case 'p': { $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); break; } case 'pre': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], true); $this->premode = false; break; } case 'dl': { --$this->listnum; if ($this->listnum <= 0) { $this->listnum = 0; $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); } break; } case 'dt': { $this->lispacer = ''; $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], true); break; } case 'dd': { $this->lispacer = ''; if ($this->rtl) { $this->rMargin -= $this->listindent; } else { $this->lMargin -= $this->listindent; } $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], true); break; } case 'ul': case 'ol': { --$this->listnum; $this->lispacer = ''; if ($this->rtl) { $this->rMargin -= $this->listindent; } else { $this->lMargin -= $this->listindent; } if ($this->listnum <= 0) { $this->listnum = 0; $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); } $this->lasth = $this->FontSize * $this->cell_height_ratio; break; } case 'li': { $this->lispacer = ''; $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], true); break; } case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': { $this->addHTMLVertSpace(1, $cell, ($parent['fontsize'] * 1.5) / $this->k, $firstorlast, $tag['value'], true); break; } // Form fields (since 4.8.000 - 2009-09-07) case 'form': { $this->form_action = ''; $this->form_enctype = 'application/x-www-form-urlencoded'; break; } default : { break; } } $this->tmprtl = false; } /** * Add vertical spaces if needed. * @param int $n number of spaces to add * @param boolean $cell if true add the default cMargin space to each new line (default false). * @param string $h The height of the break. By default, the value equals the height of the last printed cell. * @param boolean $firstorlast if true do not print additional empty lines. * @param string $tag HTML tag to which this space will be applied * @param boolean $closing true if this space will be applied to a closing tag, false otherwise * @access protected */ protected function addHTMLVertSpace($n, $cell=false, $h='', $firstorlast=false, $tag='', $closing=false) { if ($firstorlast) { $this->Ln(0, $cell); $this->htmlvspace = 0; return; } if (isset($this->tagvspaces[$tag][intval($closing)]['n'])) { $n = $this->tagvspaces[$tag][intval($closing)]['n']; } if (isset($this->tagvspaces[$tag][intval($closing)]['h'])) { $h = $this->tagvspaces[$tag][intval($closing)]['h']; } if (is_string($h)) { $vsize = $n * $this->lasth; } else { $vsize = $n * $h; } if ($vsize > $this->htmlvspace) { $this->Ln(($vsize - $this->htmlvspace), $cell); $this->htmlvspace = $vsize; } } /** * Set the default bullet to be used as LI bullet symbol * @param string $symbol character or string to be used (legal values are: '' = automatic, '!' = auto bullet, '#' = auto numbering, 'disc', 'disc', 'circle', 'square', '1', 'decimal', 'decimal-leading-zero', 'i', 'lower-roman', 'I', 'upper-roman', 'a', 'lower-alpha', 'lower-latin', 'A', 'upper-alpha', 'upper-latin', 'lower-greek') * @access public * @since 4.0.028 (2008-09-26) */ public function setLIsymbol($symbol='!') { $symbol = strtolower($symbol); switch ($symbol) { case '!' : case '#' : case 'disc' : case 'disc' : case 'circle' : case 'square' : case '1': case 'decimal': case 'decimal-leading-zero': case 'i': case 'lower-roman': case 'I': case 'upper-roman': case 'a': case 'lower-alpha': case 'lower-latin': case 'A': case 'upper-alpha': case 'upper-latin': case 'lower-greek': { $this->lisymbol = $symbol; break; } default : { $this->lisymbol = ''; } } } /** * Set the booklet mode for double-sided pages. * @param boolean $booklet true set the booklet mode on, fals eotherwise. * @param float $inner Inner page margin. * @param float $outer Outer page margin. * @access public * @since 4.2.000 (2008-10-29) */ public function SetBooklet($booklet=true, $inner=-1, $outer=-1) { $this->booklet = $booklet; if ($inner >= 0) { $this->lMargin = $inner; } if ($outer >= 0) { $this->rMargin = $outer; } } /** * Swap the left and right margins. * @param boolean $reverse if true swap left and right margins. * @access protected * @since 4.2.000 (2008-10-29) */ protected function swapMargins($reverse=true) { if ($reverse) { // swap left and right margins $mtemp = $this->original_lMargin; $this->original_lMargin = $this->original_rMargin; $this->original_rMargin = $mtemp; $deltam = $this->original_lMargin - $this->original_rMargin; $this->lMargin += $deltam; $this->rMargin -= $deltam; } } /** * Set the vertical spaces for HTML tags. * The array must have the following structure (example): * $tagvs = array('h1' => array(0 => array('h' => '', 'n' => 2), 1 => array('h' => 1.3, 'n' => 1))); * The first array level contains the tag names, * the second level contains 0 for opening tags or 1 for closing tags, * the third level contains the vertical space unit (h) and the number spaces to add (n). * If the h parameter is not specified, default values are used. * @param array $tagvs array of tags and relative vertical spaces. * @access public * @since 4.2.001 (2008-10-30) */ public function setHtmlVSpace($tagvs) { $this->tagvspaces = $tagvs; } /** * Set custom width for list indentation. * @param float $width width of the indentation. Use negative value to disable it. * @access public * @since 4.2.007 (2008-11-12) */ public function setListIndentWidth($width) { return $this->customlistindent = floatval($width); } /** * Set the top/bottom cell sides to be open or closed when the cell cross the page. * @param boolean $isopen if true keeps the top/bottom border open for the cell sides that cross the page. * @access public * @since 4.2.010 (2008-11-14) */ public function setOpenCell($isopen) { $this->opencell = $isopen; } /** * Set the color and font style for HTML links. * @param array $color RGB array of colors * @param string $fontstyle additional font styles to add * @access public * @since 4.4.003 (2008-12-09) */ public function setHtmlLinksStyle($color=array(0,0,255), $fontstyle='U') { $this->htmlLinkColorArray = $color; $this->htmlLinkFontStyle = $fontstyle; } /** * convert html string containing value and unit of measure to user's units or points. * @param string $htmlval string containing values and unit * @param string $refsize reference value in points * @param string $defaultunit default unit (can be one of the following: %, em, ex, px, in, mm, pc, pt). * @param boolean $point if true returns points, otherwise returns value in user's units * @return float value in user's unit or point if $points=true * @access public * @since 4.4.004 (2008-12-10) */ public function getHTMLUnitToUnits($htmlval, $refsize=1, $defaultunit='px', $points=false) { $supportedunits = array('%', 'em', 'ex', 'px', 'in', 'cm', 'mm', 'pc', 'pt'); $retval = 0; $value = 0; $unit = 'px'; $k = $this->k; if ($points) { $k = 1; } if (in_array($defaultunit, $supportedunits)) { $unit = $defaultunit; } if (is_numeric($htmlval)) { $value = floatval($htmlval); } elseif (preg_match('/([0-9\.]+)/', $htmlval, $mnum)) { $value = floatval($mnum[1]); if (preg_match('/([a-z%]+)/', $htmlval, $munit)) { if (in_array($munit[1], $supportedunits)) { $unit = $munit[1]; } } } switch ($unit) { // percentage case '%': { $retval = (($value * $refsize) / 100); break; } // relative-size case 'em': { $retval = ($value * $refsize); break; } case 'ex': { $retval = $value * ($refsize / 2); break; } // absolute-size case 'in': { $retval = ($value * $this->dpi) / $k; break; } case 'cm': { $retval = ($value / 2.54 * $this->dpi) / $k; break; } case 'mm': { $retval = ($value / 25.4 * $this->dpi) / $k; break; } case 'pc': { // one pica is 12 points $retval = ($value * 12) / $k; break; } case 'pt': { $retval = $value / $k; break; } case 'px': { $retval = $this->pixelsToUnits($value); break; } } return $retval; } /** * Returns the Roman representation of an integer number * @param int number to convert * @return string roman representation of the specified number * @access public * @since 4.4.004 (2008-12-10) */ public function intToRoman($number) { $roman = ''; while ($number >= 1000) { $roman .= 'M'; $number -= 1000; } while ($number >= 900) { $roman .= 'CM'; $number -= 900; } while ($number >= 500) { $roman .= 'D'; $number -= 500; } while ($number >= 400) { $roman .= 'CD'; $number -= 400; } while ($number >= 100) { $roman .= 'C'; $number -= 100; } while ($number >= 90) { $roman .= 'XC'; $number -= 90; } while ($number >= 50) { $roman .= 'L'; $number -= 50; } while ($number >= 40) { $roman .= 'XL'; $number -= 40; } while ($number >= 10) { $roman .= 'X'; $number -= 10; } while ($number >= 9) { $roman .= 'IX'; $number -= 9; } while ($number >= 5) { $roman .= 'V'; $number -= 5; } while ($number >= 4) { $roman .= 'IV'; $number -= 4; } while ($number >= 1) { $roman .= 'I'; --$number; } return $roman; } /** * Output an HTML list bullet or ordered item symbol * @param int $listdepth list nesting level * @param string $listtype type of list * @param float $size current font size * @access protected * @since 4.4.004 (2008-12-10) */ protected function putHtmlListBullet($listdepth, $listtype='', $size=10) { $size /= $this->k; $fill = ''; $color = $this->fgcolor; $width = 0; $textitem = ''; $tmpx = $this->x; $lspace = $this->GetStringWidth(' '); if ($listtype == '!') { // set default list type for unordered list $deftypes = array('disc', 'circle', 'square'); $listtype = $deftypes[($listdepth - 1) % 3]; } elseif ($listtype == '#') { // set default list type for ordered list $listtype = 'decimal'; } switch ($listtype) { // unordered types case 'none': { break; } case 'disc': { $fill = 'F'; } case 'circle': { $fill .= 'D'; $r = $size / 6; $lspace += (2 * $r); if ($this->rtl) { $this->x = $this->w - $this->x - $lspace; } else { $this->x -= $lspace; } $this->Circle(($this->x + $r), ($this->y + ($this->lasth / 2)), $r, 0, 360, $fill, array('color'=>$color), $color, 8); break; } case 'square': { $l = $size / 3; $lspace += $l; if ($this->rtl) { $this->x = $this->w - $this->x - $lspace; } else { $this->x -= $lspace; } $this->Rect($this->x, ($this->y + (($this->lasth - $l)/ 2)), $l, $l, 'F', array(), $color); break; } // ordered types // $this->listcount[$this->listnum]; // $textitem case '1': case 'decimal': { $textitem = $this->listcount[$this->listnum]; break; } case 'decimal-leading-zero': { $textitem = sprintf("%02d", $this->listcount[$this->listnum]); break; } case 'i': case 'lower-roman': { $textitem = strtolower($this->intToRoman($this->listcount[$this->listnum])); break; } case 'I': case 'upper-roman': { $textitem = $this->intToRoman($this->listcount[$this->listnum]); break; } case 'a': case 'lower-alpha': case 'lower-latin': { $textitem = chr(97 + $this->listcount[$this->listnum] - 1); break; } case 'A': case 'upper-alpha': case 'upper-latin': { $textitem = chr(65 + $this->listcount[$this->listnum] - 1); break; } case 'lower-greek': { $textitem = $this->unichr(945 + $this->listcount[$this->listnum] - 1); break; } /* // Types to be implemented (special handling) case 'hebrew': { break; } case 'armenian': { break; } case 'georgian': { break; } case 'cjk-ideographic': { break; } case 'hiragana': { break; } case 'katakana': { break; } case 'hiragana-iroha': { break; } case 'katakana-iroha': { break; } */ default: { $textitem = $this->listcount[$this->listnum]; } } if (!$this->empty_string($textitem)) { // print ordered item if ($this->rtl) { $textitem = '.'.$textitem; } else { $textitem = $textitem.'.'; } $lspace += $this->GetStringWidth($textitem); if ($this->rtl) { $this->x += $lspace; } else { $this->x -= $lspace; } $this->Write($this->lasth, $textitem, '', false, '', false, 0, false); } $this->x = $tmpx; $this->lispacer = ''; } /** * Returns current graphic variables as array. * @return array graphic variables * @access protected * @since 4.2.010 (2008-11-14) */ protected function getGraphicVars() { $grapvars = array( 'FontFamily' => $this->FontFamily, 'FontStyle' => $this->FontStyle, 'FontSizePt' => $this->FontSizePt, 'rMargin' => $this->rMargin, 'lMargin' => $this->lMargin, 'cMargin' => $this->cMargin, 'LineWidth' => $this->LineWidth, 'linestyleWidth' => $this->linestyleWidth, 'linestyleCap' => $this->linestyleCap, 'linestyleJoin' => $this->linestyleJoin, 'linestyleDash' => $this->linestyleDash, 'DrawColor' => $this->DrawColor, 'FillColor' => $this->FillColor, 'TextColor' => $this->TextColor, 'ColorFlag' => $this->ColorFlag, 'bgcolor' => $this->bgcolor, 'fgcolor' => $this->fgcolor, 'htmlvspace' => $this->htmlvspace, 'lasth' => $this->lasth ); return $grapvars; } /** * Set graphic variables. * @param $gvars array graphic variables * @access protected * @since 4.2.010 (2008-11-14) */ protected function setGraphicVars($gvars) { $this->FontFamily = $gvars['FontFamily']; $this->FontStyle = $gvars['FontStyle']; $this->FontSizePt = $gvars['FontSizePt']; $this->rMargin = $gvars['rMargin']; $this->lMargin = $gvars['lMargin']; $this->cMargin = $gvars['cMargin']; $this->LineWidth = $gvars['LineWidth']; $this->linestyleWidth = $gvars['linestyleWidth']; $this->linestyleCap = $gvars['linestyleCap']; $this->linestyleJoin = $gvars['linestyleJoin']; $this->linestyleDash = $gvars['linestyleDash']; $this->DrawColor = $gvars['DrawColor']; $this->FillColor = $gvars['FillColor']; $this->TextColor = $gvars['TextColor']; $this->ColorFlag = $gvars['ColorFlag']; $this->bgcolor = $gvars['bgcolor']; $this->fgcolor = $gvars['fgcolor']; $this->htmlvspace = $gvars['htmlvspace']; //$this->lasth = $gvars['lasth']; $this->_out(''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor.''); if (!$this->empty_string($this->FontFamily)) { $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt); } } /** * Returns a temporary filename for caching object on filesystem. * @param string $prefix prefix to add to filename * return string filename. * @access protected * @since 4.5.000 (2008-12-31) */ protected function getObjFilename($name) { return tempnam(K_PATH_CACHE, $name.'_'); } /** * Writes data to a temporary file on filesystem. * @param string $file file name * @param mixed $data data to write on file * @param boolean $append if true append data, false replace. * @access protected * @since 4.5.000 (2008-12-31) */ protected function writeDiskCache($filename, $data, $append=false) { if ($append) { $fmode = 'ab+'; } else { $fmode = 'wb+'; } $f = @fopen($filename, $fmode); if (!$f) { $this->Error('Unable to write cache file: '.$filename); } else { fwrite($f, $data); fclose($f); } // update file lenght (needed for transactions) if (!isset($this->cache_file_lenght['_'.$filename])) { $this->cache_file_lenght['_'.$filename] = strlen($data); } else { $this->cache_file_lenght['_'.$filename] += strlen($data); } } /** * Read data from a temporary file on filesystem. * @param string $file file name * @return mixed retrieved data * @access protected * @since 4.5.000 (2008-12-31) */ protected function readDiskCache($filename) { return file_get_contents($filename); } /** * Set buffer content (always append data). * @param string $data data * @access protected * @since 4.5.000 (2009-01-02) */ protected function setBuffer($data) { $this->bufferlen += strlen($data); if ($this->diskcache) { if (!isset($this->buffer) OR $this->empty_string($this->buffer)) { $this->buffer = $this->getObjFilename('buffer'); } $this->writeDiskCache($this->buffer, $data, true); } else { $this->buffer .= $data; } } /** * Get buffer content. * @return string buffer content * @access protected * @since 4.5.000 (2009-01-02) */ protected function getBuffer() { if ($this->diskcache) { return $this->readDiskCache($this->buffer); } else { return $this->buffer; } } /** * Set page buffer content. * @param int $page page number * @param string $data page data * @param boolean $append if true append data, false replace. * @access protected * @since 4.5.000 (2008-12-31) */ protected function setPageBuffer($page, $data, $append=false) { if ($this->diskcache) { if (!isset($this->pages[$page])) { $this->pages[$page] = $this->getObjFilename('page'.$page); } $this->writeDiskCache($this->pages[$page], $data, $append); } else { if ($append) { $this->pages[$page] .= $data; } else { $this->pages[$page] = $data; } } if ($append AND isset($this->pagelen[$page])) { $this->pagelen[$page] += strlen($data); } else { $this->pagelen[$page] = strlen($data); } } /** * Get page buffer content. * @param int $page page number * @return string page buffer content or false in case of error * @access protected * @since 4.5.000 (2008-12-31) */ protected function getPageBuffer($page) { if ($this->diskcache) { return $this->readDiskCache($this->pages[$page]); } elseif (isset($this->pages[$page])) { return $this->pages[$page]; } return false; } /** * Set image buffer content. * @param string $image image key * @param array $data image data * @access protected * @since 4.5.000 (2008-12-31) */ protected function setImageBuffer($image, $data) { if ($this->diskcache) { if (!isset($this->images[$image])) { $this->images[$image] = $this->getObjFilename('image'.$image); } $this->writeDiskCache($this->images[$image], serialize($data)); } else { $this->images[$image] = $data; } if (!in_array($image, $this->imagekeys)) { $this->imagekeys[] = $image; } ++$this->numimages; } /** * Set image buffer content. * @param string $image image key * @param string $key image sub-key * @param array $data image data * @access protected * @since 4.5.000 (2008-12-31) */ protected function setImageSubBuffer($image, $key, $data) { if (!isset($this->images[$image])) { $this->setImageBuffer($image, array()); } if ($this->diskcache) { $tmpimg = $this->getImageBuffer($image); $tmpimg[$key] = $data; $this->writeDiskCache($this->images[$image], serialize($tmpimg)); } else { $this->images[$image][$key] = $data; } } /** * Get image buffer content. * @param string $image image key * @return string image buffer content or false in case of error * @access protected * @since 4.5.000 (2008-12-31) */ protected function getImageBuffer($image) { if ($this->diskcache AND isset($this->images[$image])) { return unserialize($this->readDiskCache($this->images[$image])); } elseif (isset($this->images[$image])) { return $this->images[$image]; } return false; } /** * Set font buffer content. * @param string $font font key * @param array $data font data * @access protected * @since 4.5.000 (2009-01-02) */ protected function setFontBuffer($font, $data) { if ($this->diskcache) { if (!isset($this->fonts[$font])) { $this->fonts[$font] = $this->getObjFilename('font'); } $this->writeDiskCache($this->fonts[$font], serialize($data)); } else { $this->fonts[$font] = $data; } if (!in_array($font, $this->fontkeys)) { $this->fontkeys[] = $font; } } /** * Set font buffer content. * @param string $font font key * @param string $key font sub-key * @param array $data font data * @access protected * @since 4.5.000 (2009-01-02) */ protected function setFontSubBuffer($font, $key, $data) { if (!isset($this->fonts[$font])) { $this->setFontBuffer($font, array()); } if ($this->diskcache) { $tmpfont = $this->getFontBuffer($font); $tmpfont[$key] = $data; $this->writeDiskCache($this->fonts[$font], serialize($tmpfont)); } else { $this->fonts[$font][$key] = $data; } } /** * Get font buffer content. * @param string $font font key * @return string font buffer content or false in case of error * @access protected * @since 4.5.000 (2009-01-02) */ protected function getFontBuffer($font) { if ($this->diskcache AND isset($this->fonts[$font])) { return unserialize($this->readDiskCache($this->fonts[$font])); } elseif (isset($this->fonts[$font])) { return $this->fonts[$font]; } return false; } /** * Move a page to a previous position. * @param int $frompage number of the source page * @param int $topage number of the destination page (must be less than $frompage) * @return true in case of success, false in case of error. * @access public * @since 4.5.000 (2009-01-02) */ public function movePage($frompage, $topage) { if (($frompage > $this->numpages) OR ($frompage <= $topage)) { return false; } if ($frompage == $this->page) { // close the page before moving it $this->endPage(); } // move all page-related states $tmppage = $this->pages[$frompage]; $tmppagedim = $this->pagedim[$frompage]; $tmppagelen = $this->pagelen[$frompage]; $tmpintmrk = $this->intmrk[$frompage]; if (isset($this->footerpos[$frompage])) { $tmpfooterpos = $this->footerpos[$frompage]; } if (isset($this->footerlen[$frompage])) { $tmpfooterlen = $this->footerlen[$frompage]; } if (isset($this->transfmrk[$frompage])) { $tmptransfmrk = $this->transfmrk[$frompage]; } if (isset($this->PageAnnots[$frompage])) { $tmpannots = $this->PageAnnots[$frompage]; } if (isset($this->newpagegroup[$frompage])) { $tmpnewpagegroup = $this->newpagegroup[$frompage]; } for ($i = $frompage; $i > $topage; --$i) { $j = $i - 1; // shift pages down $this->pages[$i] = $this->pages[$j]; $this->pagedim[$i] = $this->pagedim[$j]; $this->pagelen[$i] = $this->pagelen[$j]; $this->intmrk[$i] = $this->intmrk[$j]; if (isset($this->footerpos[$j])) { $this->footerpos[$i] = $this->footerpos[$j]; } elseif (isset($this->footerpos[$i])) { unset($this->footerpos[$i]); } if (isset($this->footerlen[$j])) { $this->footerlen[$i] = $this->footerlen[$j]; } elseif (isset($this->footerlen[$i])) { unset($this->footerlen[$i]); } if (isset($this->transfmrk[$j])) { $this->transfmrk[$i] = $this->transfmrk[$j]; } elseif (isset($this->transfmrk[$i])) { unset($this->transfmrk[$i]); } if (isset($this->PageAnnots[$j])) { $this->PageAnnots[$i] = $this->PageAnnots[$j]; } elseif (isset($this->PageAnnots[$i])) { unset($this->PageAnnots[$i]); } if (isset($this->newpagegroup[$j])) { $this->newpagegroup[$i] = $this->newpagegroup[$j]; } elseif (isset($this->newpagegroup[$i])) { unset($this->newpagegroup[$i]); } } $this->pages[$topage] = $tmppage; $this->pagedim[$topage] = $tmppagedim; $this->pagelen[$topage] = $tmppagelen; $this->intmrk[$topage] = $tmpintmrk; if (isset($tmpfooterpos)) { $this->footerpos[$topage] = $tmpfooterpos; } elseif (isset($this->footerpos[$topage])) { unset($this->footerpos[$topage]); } if (isset($tmpfooterlen)) { $this->footerlen[$topage] = $tmpfooterlen; } elseif (isset($this->footerlen[$topage])) { unset($this->footerlen[$topage]); } if (isset($tmptransfmrk)) { $this->transfmrk[$topage] = $tmptransfmrk; } elseif (isset($this->transfmrk[$topage])) { unset($this->transfmrk[$topage]); } if (isset($tmpannots)) { $this->PageAnnots[$topage] = $tmpannots; } elseif (isset($this->PageAnnots[$topage])) { unset($this->PageAnnots[$topage]); } if (isset($tmpnewpagegroup)) { $this->newpagegroup[$topage] = $tmpnewpagegroup; } elseif (isset($this->newpagegroup[$topage])) { unset($this->newpagegroup[$topage]); } // adjust outlines $tmpoutlines = $this->outlines; foreach ($tmpoutlines as $key => $outline) { if (($outline['p'] >= $topage) AND ($outline['p'] < $frompage)) { $this->outlines[$key]['p'] = $outline['p'] + 1; } elseif ($outline['p'] == $frompage) { $this->outlines[$key]['p'] = $topage; } } // adjust links $tmplinks = $this->links; foreach ($tmplinks as $key => $link) { if (($link[0] >= $topage) AND ($link[0] < $frompage)) { $this->links[$key][0] = $link[0] + 1; } elseif ($link[0] == $frompage) { $this->links[$key][0] = $topage; } } // adjust javascript $tmpjavascript = $this->javascript; global $jfrompage, $jtopage; $jfrompage = $frompage; $jtopage = $topage; $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', create_function('$matches', 'global $jfrompage, $jtopage; $pagenum = intval($matches[3]) + 1; if (($pagenum >= $jtopage) AND ($pagenum < $jfrompage)) { $newpage = ($pagenum + 1); } elseif ($pagenum == $jfrompage) { $newpage = $jtopage; } else { $newpage = $pagenum; } --$newpage; return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); // return to last page $this->lastPage(true); return true; } /** * Remove the specified page. * @param int $page page to remove * @return true in case of success, false in case of error. * @access public * @since 4.6.004 (2009-04-23) */ public function deletePage($page) { if ($page > $this->numpages) { return false; } // delete current page unset($this->pages[$page]); unset($this->pagedim[$page]); unset($this->pagelen[$page]); unset($this->intmrk[$page]); if (isset($this->footerpos[$page])) { unset($this->footerpos[$page]); } if (isset($this->footerlen[$page])) { unset($this->footerlen[$page]); } if (isset($this->transfmrk[$page])) { unset($this->transfmrk[$page]); } if (isset($this->PageAnnots[$page])) { unset($this->PageAnnots[$page]); } if (isset($this->newpagegroup[$page])) { unset($this->newpagegroup[$page]); } if (isset($this->pageopen[$page])) { unset($this->pageopen[$page]); } // update remaining pages for ($i = $page; $i < $this->numpages; ++$i) { $j = $i + 1; // shift pages $this->pages[$i] = $this->pages[$j]; $this->pagedim[$i] = $this->pagedim[$j]; $this->pagelen[$i] = $this->pagelen[$j]; $this->intmrk[$i] = $this->intmrk[$j]; if (isset($this->footerpos[$j])) { $this->footerpos[$i] = $this->footerpos[$j]; } elseif (isset($this->footerpos[$i])) { unset($this->footerpos[$i]); } if (isset($this->footerlen[$j])) { $this->footerlen[$i] = $this->footerlen[$j]; } elseif (isset($this->footerlen[$i])) { unset($this->footerlen[$i]); } if (isset($this->transfmrk[$j])) { $this->transfmrk[$i] = $this->transfmrk[$j]; } elseif (isset($this->transfmrk[$i])) { unset($this->transfmrk[$i]); } if (isset($this->PageAnnots[$j])) { $this->PageAnnots[$i] = $this->PageAnnots[$j]; } elseif (isset($this->PageAnnots[$i])) { unset($this->PageAnnots[$i]); } if (isset($this->newpagegroup[$j])) { $this->newpagegroup[$i] = $this->newpagegroup[$j]; } elseif (isset($this->newpagegroup[$i])) { unset($this->newpagegroup[$i]); } if (isset($this->pageopen[$j])) { $this->pageopen[$i] = $this->pageopen[$j]; } elseif (isset($this->pageopen[$i])) { unset($this->pageopen[$i]); } } // remove last page unset($this->pages[$this->numpages]); unset($this->pagedim[$this->numpages]); unset($this->pagelen[$this->numpages]); unset($this->intmrk[$this->numpages]); if (isset($this->footerpos[$this->numpages])) { unset($this->footerpos[$this->numpages]); } if (isset($this->footerlen[$this->numpages])) { unset($this->footerlen[$this->numpages]); } if (isset($this->transfmrk[$this->numpages])) { unset($this->transfmrk[$this->numpages]); } if (isset($this->PageAnnots[$this->numpages])) { unset($this->PageAnnots[$this->numpages]); } if (isset($this->newpagegroup[$this->numpages])) { unset($this->newpagegroup[$this->numpages]); } if (isset($this->pageopen[$this->numpages])) { unset($this->pageopen[$this->numpages]); } --$this->numpages; $this->page = $this->numpages; // adjust outlines $tmpoutlines = $this->outlines; foreach ($tmpoutlines as $key => $outline) { if ($outline['p'] > $page) { $this->outlines[$key]['p'] = $outline['p'] - 1; } elseif ($outline['p'] == $page) { unset($this->outlines[$key]); } } // adjust links $tmplinks = $this->links; foreach ($tmplinks as $key => $link) { if ($link[0] > $page) { $this->links[$key][0] = $link[0] - 1; } elseif ($link[0] == $page) { unset($this->links[$key]); } } // adjust javascript $tmpjavascript = $this->javascript; global $jpage; $jpage = $page; $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', create_function('$matches', 'global $jpage; $pagenum = intval($matches[3]) + 1; if ($pagenum >= $jpage) { $newpage = ($pagenum - 1); } elseif ($pagenum == $jpage) { $newpage = 1; } else { $newpage = $pagenum; } --$newpage; return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); // return to last page $this->lastPage(true); return true; } /** * Output a Table of Content Index (TOC). * You can override this method to achieve different styles. * @param int $page page number where this TOC should be inserted (leave empty for current page). * @param string $numbersfont set the font for page numbers (please use monospaced font for better alignment). * @param string $filler string used to fill the space between text and page number. * @access public * @author Nicola Asuni * @since 4.5.000 (2009-01-02) */ public function addTOC($page='', $numbersfont='', $filler='.') { $fontsize = $this->FontSizePt; $fontfamily = $this->FontFamily; $fontstyle = $this->FontStyle; $w = $this->w - $this->lMargin - $this->rMargin; $spacer = $this->GetStringWidth(' ') * 4; $page_first = $this->getPage(); $lmargin = $this->lMargin; $rmargin = $this->rMargin; $x_start = $this->GetX(); if ($this->empty_string($numbersfont)) { $numbersfont = $this->default_monospaced_font; } if ($this->empty_string($filler)) { $filler = ' '; } if ($this->empty_string($page)) { $gap = ' '; } else { $gap = ''; } foreach ($this->outlines as $key => $outline) { if ($this->rtl) { $aligntext = 'R'; $alignnum = 'L'; } else { $aligntext = 'L'; $alignnum = 'R'; } if ($outline['l'] == 0) { $this->SetFont($fontfamily, $fontstyle.'B', $fontsize); } else { $this->SetFont($fontfamily, $fontstyle, $fontsize - $outline['l']); } $indent = ($spacer * $outline['l']); if ($this->rtl) { $this->rMargin += $indent; $this->x -= $indent; } else { $this->lMargin += $indent; $this->x += $indent; } $link = $this->AddLink(); $this->SetLink($link, 0, $outline['p']); // write the text $this->Write(0, $outline['t'], $link, 0, $aligntext, false, 0, false, false, 0); $this->SetFont($numbersfont, $fontstyle, $fontsize); if ($this->empty_string($page)) { $pagenum = $outline['p']; } else { // placemark to be replaced with the correct number $pagenum = '{#'.($outline['p']).'}'; if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { $pagenum = '{'.$pagenum.'}'; } } $numwidth = $this->GetStringWidth($pagenum); if ($this->rtl) { $tw = $this->x - $this->lMargin; } else { $tw = $this->w - $this->rMargin - $this->x; } $fw = $tw - $numwidth - $this->GetStringWidth(' '); $numfills = floor($fw / $this->GetStringWidth($filler)); if ($numfills > 0) { $rowfill = str_repeat($filler, $numfills); } else { $rowfill = ''; } if ($this->rtl) { $pagenum = $pagenum.$gap.$rowfill.' '; } else { $pagenum = ' '.$rowfill.$gap.$pagenum; } // write the number //$this->SetX($x_start); $this->Cell($tw, 0, $pagenum, 0, 1, $alignnum, 0, $link, 0); $this->SetX($x_start); $this->lMargin = $lmargin; $this->rMargin = $rmargin; } $page_last = $this->getPage(); $numpages = $page_last - $page_first + 1; if (!$this->empty_string($page)) { for ($p = $page_first; $p <= $page_last; ++$p) { // get page data $temppage = $this->getPageBuffer($p); for ($n = 1; $n <= $this->numpages; ++$n) { // update page numbers $k = '{#'.$n.'}'; $ku = '{'.$k.'}'; $alias_a = $this->_escape($k); $alias_au = $this->_escape('{'.$k.'}'); if ($this->isunicode) { $alias_b = $this->_escape($this->UTF8ToLatin1($k)); $alias_bu = $this->_escape($this->UTF8ToLatin1($ku)); $alias_c = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); $alias_cu = $this->_escape($this->utf8StrRev($ku, false, $this->tmprtl)); } if ($n >= $page) { $np = $n + $numpages; } else { $np = $n; } $ns = $this->formatTOCPageNumber($np); $nu = $ns; $sdiff = strlen($k) - strlen($ns) - 1; $sdiffu = strlen($ku) - strlen($ns) - 1; $sfill = str_repeat($filler, $sdiff); $sfillu = str_repeat($filler, $sdiffu); if ($this->rtl) { $ns = $ns.' '.$sfill; $nu = $nu.' '.$sfillu; } else { $ns = $sfill.' '.$ns; $nu = $sfillu.' '.$nu; } $nu = $this->UTF8ToUTF16BE($nu, false); $temppage = str_replace($alias_au, $nu, $temppage); if ($this->isunicode) { $temppage = str_replace($alias_bu, $nu, $temppage); $temppage = str_replace($alias_cu, $nu, $temppage); $temppage = str_replace($alias_b, $ns, $temppage); $temppage = str_replace($alias_c, $ns, $temppage); } $temppage = str_replace($alias_a, $ns, $temppage); } // save changes $this->setPageBuffer($p, $temppage); } // move pages for ($i = 0; $i < $numpages; ++$i) { $this->movePage($page_last, $page); } } $this->SetFont($fontfamily, $fontstyle, $fontsize); } /** * Stores a copy of the current TCPDF object used for undo operation. * @access public * @since 4.5.029 (2009-03-19) */ public function startTransaction() { if (isset($this->objcopy)) { // remove previous copy $this->commitTransaction(); } // record current page number $this->start_transaction_page = $this->page; // clone current object $this->objcopy = $this->objclone($this); } /** * Delete the copy of the current TCPDF object used for undo operation. * @access public * @since 4.5.029 (2009-03-19) */ public function commitTransaction() { if (isset($this->objcopy)) { $this->objcopy->_destroy(true, true); unset($this->objcopy); } } /** * This method allows to undo the latest transaction by returning the latest saved TCPDF object with startTransaction(). * @param boolean $self if true restores current class object to previous state without the need of reassignment via the returned value. * @return TCPDF object. * @access public * @since 4.5.029 (2009-03-19) */ public function rollbackTransaction($self=false) { if (isset($this->objcopy)) { if (isset($this->objcopy->diskcache) AND $this->objcopy->diskcache) { // truncate files to previous values foreach ($this->objcopy->cache_file_lenght as $file => $lenght) { $file = substr($file, 1); $handle = fopen($file, 'r+'); ftruncate($handle, $lenght); } } $this->_destroy(true, true); if ($self) { $objvars = get_object_vars($this->objcopy); foreach ($objvars as $key => $value) { $this->$key = $value; } } return $this->objcopy; } return $this; } /** * Creates a copy of a class object * @param object $object class object to be cloned * @return cloned object * @access public * @since 4.5.029 (2009-03-19) */ public function objclone($object) { return @clone($object); } /** * Determine whether a string is empty. * @param srting $str string to be checked * @return boolean true if string is empty * @access public * @since 4.5.044 (2009-04-16) */ public function empty_string($str) { return (is_null($str) OR (is_string($str) AND (strlen($str) == 0))); } } // END OF TCPDF CLASS } //============================================================+ // END OF FILE //============================================================+ ?> PHPExcel/Shared/PDF/CHANGELOG.TXT 0000666 00000132650 15017047356 0011706 0 ustar 00 4.8.009 (2009-09-30) - Compatibility with PHP 5.3 was improved. - All examples were updated. - Index file for examples was added. 4.8.008 (2009-09-29) - Example 49 was updated. - Underline and linethrough now works with cell stretching mode. 4.8.007 (2009-09-23) - Infinite loop problem caused by nobr attribute was fixed. 4.8.006 (2009-09-23) - Bug item #2864522 "No images if DOCUMENT_ROOT=='/'" was fixed. - Support for text-indent CSS attribute was added. - Method rollbackTransaction() was changed to support self-reassigment of previous object (check source code documentation). - Support for the HTML "nobr" attribute was added to avoid splitting a table or a table row on two pages (i.e.: ...). 4.8.005 (2009-09-17) - A bug relative to multiple transformations and annotations was fixed. 4.8.004 (2009-09-16) - A bug on _putannotsrefs() method was fixed. 4.8.003 (2009-09-15) - Bug item #2858754 "Division by zero" was fixed. - A bug relative to HTML list items was fixed. - A bug relative to form fields on multiple pages was fixed. - PolyLine() method was added (see example n. 12). - Signature of Polygon() method was changed. 4.8.002 (2009-09-12) - A problem related to CID-0 fonts offset was fixed: if the $cw[1] entry on the CID-0 font file is not defined, then a CID keys offset is introduced. 4.8.001 (2009-09-09) - The appearance streams (AP) for anotations form fields was fixed (see examples n. 14 and 54). - Radiobuttons were fixed. 4.8.000 (2009-09-07) - This version includes some support for Forms fields (see example n. 14) and XHTML forms (see example n. 54). - The following methods were changed to work without JavaScript: TextField(), RadioButton(), ListBox(), ComboBox(), CheckBox(), Button(). - Support for Widget annotations was improved. - Alignment of annotation objects was fixed (examples 36 and 41 were updated). - addJavascriptObject() method was added. - Signature of Image() method was changed. - htmlcolors.php file was updated. -------------------------------------------------------------------------------- 4.7.003 (2009-09-03) - Support for TCPDF methods on HTML was improved (see example n. 49). 4.7.002 (2009-09-02) - Bug item #2848892 "writeHTML + table: Gaps between rows" was fixed. - JavaScript support was fixed (see example n. 53). 4.7.001 (2009-08-30) - The Polygon() and Arrow() methods were fixed and improved (see example n. 12). 4.7.000 (2009-08-29) - This is a major release. - Some procedures were internally optimized. - The problem of mixed signature and annotations was fixed (example n. 52). 4.6.030 (2009-08-29) - IMPORTANT: percentages on table cell widths are now relative to the full table width (as in standard HTML). - Various minor bugs were fixed. - Example n. 52 (digital signature) was updated. 4.6.029 (2009-08-26) - PHP4 version was fixed. 4.6.028 (2009-08-25) - Signature algorithm was finally fixed (see example n. 52). 4.6.027 (2009-08-24) - TCPDF now supports unembedded TrueTypeUnicode Fonts (just comment the $file entry on the fonts' php file. 4.6.026 (2009-08-21) - Bug #2841693 "Problem with MultiCell and ishtml and justification" was fixed. - Signature functions were improved but not yet fixed (tcpdf.crt and example n. 52 were updated). 4.6.025 (2009-08-17) - Carriage returns (\r) were removed from source code. - Problem related to set_magic_quotes_runtime() depracated was fixed. 4.6.024 (2009-08-07) - Bug item #2833556 "justification using other units than mm" was fixed. - Documentation was fixed/updated. 4.6.023 (2009-08-02) - Bug item #2830537 "MirrorH can show mask for transparent PNGs" was fixed. 4.6.022 (2009-07-24) - A bug relative to single line printing when using WriteHTMLCell() was fixed. - Signature support were improved but is still experimental. - Fonts Free and Dejavu were updated to latest versions. 4.6.021 (2009-07-20) - Bug item #2824015 "XHTML Ampersand & in hyperlink bug" was fixed. - Bug item #2824036 "Image as hyperlink in table, text displaced at page break" was fixed. - Links alignment on justified text was fixed. - Unicode "\u" modifier was added to re_spaces variable by default. 4.6.020 (2009-07-16) - Bug item #2821921 "issue in example 18" was fixed. - Signature of SetRTL() method was changed. 4.6.019 (2009-07-13) - Bug item #2820703 "xref table broken" was fixed. 4.6.018 (2009-07-10) - Bug item #2819319 "Text over text" was fixed. - Method Arrow() was added to print graphic arrows (example 12 was updated). 4.6.017 (2009-07-05) - Bug item #2816079 "Example 48 not working" was fixed. - The signature of the checkPageBreak() was changed. The parameter $addpage was added to turn off the automatic page creation. 4.6.016 (2009-06-16) - Method setSpacesRE() was added to set the regular expression used for detecting withespaces or word separators. If you are using chinese, try: setSpacesRE('/[\s\p{Z}\p{Lo}]/');, otherwise you can use setSpacesRE('/[\s\p{Z}]/'); - The method _putinfo() now automatically fills the metadata with '?' in case of empty string. 4.6.015 (2009-06-11) - Bug #2804667 "word wrap bug" was fixed. 4.6.014 (2009-06-04) - Bug #2800931 "Table thead tag bug" was fixed. - A bug related to tag was fixed. 4.6.013 (2009-05-28) - List bullets position was fixed for RTL languages. 4.6.012 (2009-05-23) - setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key! 4.6.011 (2009-05-18) - Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation). 4.6.010 (2009-05-17) - Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null. - tag indent problem was fixed. - $y parameter was added to checkPageBreak() method. - Bug n. 2791773 "writeHTML" was fixed. 4.6.009 (2009-05-13) - xref table for embedded files was fixed. 4.6.008 (2009-05-07) - setSignature() method was improved (but is still experimental). - Example n. 52 was added. 4.6.007 (2009-05-05) - Bug #2786685 "writeHtmlCell and in custom footer" was fixed. - Table header repeating bug was fixed. - Some newlines and tabs are now automatically removed from HTML strings. 4.6.006 (2009-04-28) - Support for "..." was added. - By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces). 4.6.005 (2009-04-25) - Points (pt) conversion in getHTMLUnitToUnits() was fixed. - Default tcpdf.pem certificate file was added. - Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation). 4.6.004 (2009-04-23) - Method deletePage() was added to delete pages (see example n. 44). 4.6.003 (2009-04-21) - The caching mechanism of the UTF8StringToArray() method was fixed. 4.6.002 (2009-04-20) - Documentation of rollbackTransaction() method was fixed. - The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method. - HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()). - WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1. 4.6.001 (2009-04-17) - Spaces between HTML block tags are now automatically removed. - The bug related to cMargin changes between tables was fixed. 4.6.000 (2009-04-16) - WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods: zero coordinates for $x and $y are now valid coordinates; set $x and $y as empty strings to get the current value. - Some error caused by 'empty' funtion were fixed. - Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false. - HTML on footer bug was fixed. - The following examples were fixed: 5,7,10,17,19,20,21,33,42,43. 4.5.043 (2009-04-15) - Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27): C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9 C39+ : CODE 39 with checksum C39E : CODE 39 EXTENDED C39E+ : CODE 39 EXTENDED + CHECKSUM C93 : CODE 93 - USS-93 S25 : Standard 2 of 5 S25+ : Standard 2 of 5 + CHECKSUM I25 : Interleaved 2 of 5 I25+ : Interleaved 2 of 5 + CHECKSUM C128A : CODE 128 A C128B : CODE 128 B C128C : CODE 128 C EAN2 : 2-Digits UPC-Based Extention EAN5 : 5-Digits UPC-Based Extention EAN8 : EAN 8 EAN13 : EAN 13 UPCA : UPC-A UPCE : UPC-E MSI : MSI (Variation of Plessey code) MSI+ : MSI + CHECKSUM (modulo 11) POSTNET : POSTNET PLANET : PLANET RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) KIX : KIX (Klant index - Customer index) IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension) CODABAR : CODABAR CODE11 : CODE 11 PHARMA : PHARMACODE PHARMA2T : PHARMACODE TWO-TRACKS 4.5.042 (2009-04-15) - Method Write() was fixed for the strings containing only zero value. 4.5.041 (2009-04-14) - Barcode methods were fixed. 4.5.040 (2009-04-14) - Method Write() was fixed to handle empty strings. 4.5.039 (2009-04-11) - Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation). 4.5.038 (2009-04-10) - Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified. 4.5.037 (2009-04-09) - General performances were improved. - The signature of the method utf8Bidi() was changed. - The method UniArrSubString() was added. - Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class). 4.5.036 (2009-04-03) - TCPDF methods can be called inside the HTML code (see example n. 49). - All tag attributes, such as must be enclosed within double quotes. 4.5.035 (2009-03-28) - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed. - Bug #2719090 "writeHTML fix follow up" was fixed. - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader. 4.5.034 (2009-03-27) - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed. - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed. - The signature of the Cell() method was changed. 4.5.033 (2009-03-27) - The support for rowspan/colspan on HTML tables was improved (see example n. 48). 4.5.032 (2009-03-23) - setPrintFooter(false) bug was fixed. 4.5.031 (2009-03-20) - Table header support was extended to multiple pages. 4.5.030 (2009-03-20) - thead tag is now supported on HTML tables (header rows are repeated after page breaks). - The startTransaction() was improved to autocommit. - List bullets now uses the foreground color (putHtmlListBullet()). 4.5.029 (2009-03-19) - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction(). - All examples were updated. 4.5.028 (2009-03-18) - Bug #2690945 "List Bugs" was fixed. - HTML text alignment on lists was fixed. - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font. - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin(). - All examples were updated. 4.5.027 (2009-03-16) - Method getPageDimensions() was added to get page dimensions. - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin(). - _parsepng() method was fixed for PNG URL images (fread bug). 4.5.026 (2009-03-11) - Bug #2681793 affecting URL images with spaces was fixed. 4.5.025 (2009-03-10) - A small bug affecting hyphenation support was fixed. - The method SetDefaultMonospacedFont() was added to define the default monospaced font. 4.5.024 (2009-03-07) - The bug #2666493 was fixed "Footer corrupts document". 4.5.023 (2009-03-06) - The bug #2666688 was fixed "Rowspan in tables". 4.5.022 (2009-03-05) - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed". - addTOC() function bug was fixed. 4.5.020 (2009-03-03) - The following bug was fixed: "function removeSHY corrupts unicode". 4.5.019 (2009-02-28) - The problem of decimal separator using different locale was fixed. - The text hyphenation is now supported (see example n. 46). 4.5.018 (2009-02-26) - The _destroy() method was added to unset all class variables and frees memory. - Now it's possible to call Output() method multiple times. 4.5.017 (2009-02-24) - A minor bug that raises a PHP warning was fixed. 4.5.016 (2009-02-24) - Bug item #2631200 "getNumLines() counts wrong" was fixed. - Multiple attachments bug was fixed. - All class variables are now cleared on Output() for memory otpimization. 4.5.015 (2009-02-18) - Bug item #2612553 "function Write() must not break a line on character" was fixed. 4.5.014 (2009-02-13) - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php). - Pagebreak bug for barcode was fixed. 4.5.013 (2009-02-12) - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()). 4.5.012 (2009-02-12) - An error on image border feature was fixed. 4.5.011 (2009-02-12) - HTML links for images are now supported. - height attribute is now supported on HTML cells. - $border parameter was added to Image() and ImageEps() methods. - The method getNumLines() was added to estimate the number of lines required for the specified text. 4.5.010 (2009-01-29) - Bug n. 2546108 "BarCode Y position" was fixed. 4.5.009 (2009-01-26) - Bug n. 2538094 "Empty pdf file created" was fixed. 4.5.008 (2009-01-26) - setPage() method was fixed to correctly restore graphic states. - Source code was cleaned up for performances. 4.5.007 (2009-01-24) - checkPageBreak() and write1DBarcode() methods were fixed. - Source code was cleaned up for performances. - barcodes.php was updated. 4.5.006 (2009-01-23) - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs. 4.5.005 (2009-01-23) - Page closing bug was fixed. 4.5.004 (2009-01-21) - The access of convertHTMLColorToDec() method was changed to public - Fixed bug on UL tag. 4.5.003 (2009-01-19) - Fonts on different folders are now supported. 4.5.002 (2009-01-07) - addTOC() function was improved (see example n. 45). 4.5.001 (2009-01-04) - The signature of startPageGroup() function was changed. - Method Footer() was improved to automatically print page or page-group number (see example n. 23). - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content. - The signature of addTOC() was changed to include the font used for page numbers. 4.5.000 (2009-01-03) - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43). - The method movePageTo() was added to move pages to previous positions (see example n. 44). - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()). - The methods addTOC() was added to print a Table Of Content (see example n. 45). - Imagick class constant was removed for better compatibility with PHP4. - All existing examples were updated and new examples were added. 4.4.009 (2008-12-29) - Examples 1 and 35 were fixed. 4.4.008 (2008-12-28) - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed. 4.4.007 (2008-12-23) - Bug #2459935 "no unit conversion for header line" was fixed. - Example n. 42 for image alpha channel was added. - All examples were updated. 4.4.006 (2008-12-11) - Method setLIsymbol() was changed to reflect latest changes in HTML list handling. 4.4.005 (2008-12-10) - Bug item #2413870 "ordered list override value" was fixed. 4.4.004 (2008-12-10) - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %). - The method intToRoman() was added to convert integer number to Roman representation. - Support fot HTML lists was improved: the CSS property list-style-type is now supported. 4.4.003 (2008-12-09) - Bug item #2412147 "Warning on line 3367" was fixed. - Method setHtmlLinksStyle() was added to set default HTML link colors and font style. - Method addHtmlLink() was changed to use color and style defined on the inline CSS. 4.4.002 (2008-12-09) - Borders on Multicell() were fixed. - Problem of Multicell() on Header function (Bug item #2407579) was fixed. - Problem on graphics tranformations applied to Multicell() was fixed. - Support for ImageMagick was added. - Width calculation for nested tables was fixed. 4.4.001 (2008-12-08) - Some missing core fonts were added on fonts directory. - CID0 fonts rendering was fixed. - HTML support was improved ( and tags are now supported). - Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed. 4.4.000 (2008-12-07) - File attachments are now supported (see example n. 41). - Font functions were optimized to reduce document size. - makefont.php was updated. - Linux binaries were added on /fonts/utils - All fonts were updated. - $autopadding parameter was added to Multicell() to disable automatic padding features. - $maxh parameter was added to Multicell() and Write() to set a maximum height. 4.3.009 (2008-12-05) - Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed. 4.3.008 (2008-12-05) - Bug item #2390566 "rect bug" was fixed. - File path was fixed for font embedded files. - SetFont() method signature was changed to include the font filename. - Some font-related methods were improved. - Methods getFontFamily() and getFontStyle() were added. 4.3.007 (2008-12-03) - PNG alpha channel is now supported (GD library is required). - AddFont() function now support custom font file path on $file parameter. - The default width variable ($dw) is now always defined for any font. - The 'Style' attribute on CID-0 fonts was removed because of protection bug. 4.3.006 (2008-12-01) - A regular expression on getHtmlDomArray() to find HTML tags was fixed. 4.3.005 (2008-11-25) - makefont.php was fixed. - Bug item #2339877 was fixed (false loop condition detected on WriteHTML()). - Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled). - Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()). 4.3.004 (2008-11-19) - Function _textstring() was fixed (bug 2309051). - All examples were updated. 4.3.003 (2008-11-18) - CID-0 font bug was fixed. - Some functions were optimized. - Function getGroupPageNoFormatted() was added. - Example n. 23 was updated. 4.3.002 (2008-11-17) - Bug item #2305518 "CID-0 font don't work with encryption" was fixed. 4.3.001 (2008-11-17) - Bug item #2300007 "download mimetype pdf" was fixed. - Double quotes were replaced by single quotes to improve PHP performances. - A bug relative to HTML cell borders was fixed. 4.3.000 (2008-11-14) - The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page. - A bug relative to list items indentation was fixed. - A bug relative to borders on HTML tables and Multicell was fixed. - A bug relative to rowspanned cells was fixed. - A bug relative to html images across pages was fixed. 4.2.009 (2008-11-13) - Spaces between li tags are now automatically removed. 4.2.008 (2008-11-12) - A bug relative to fill color on next page was fixed. 4.2.007 (2008-11-12) - The function setListIndentWidth() was added to set custom indentation widht for HTML lists. 4.2.006 (2008-11-06) - A bug relative to HTML justification was fixed. 4.2.005 (2008-11-06) - A bug relative to HTML justification was fixed. - The methods formatPageNumber() and PageNoFormatted() were added to format page numbers. - Default Footer() method was changed to use PageNoFormatted() instead of PageNo(). - Example 6 was updated. 4.2.004 (2008-11-04) - Bug item n. 2217039 "filename handling improvement" was fixed. 4.2.003 (2008-10-31) - Font style bug was fixed. 4.2.002 (2008-10-31) - Bug item #2210922 (htm element br not work) was fixed. - Write() function was improved to support margin changes. 4.2.001 (2008-10-30) - setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags. - writeHTML() function now support margin changes during execution. - Signature of addHTMLVertSpace() function is changed. 4.2.000 (2008-10-29) - htmlcolors.php was changed to support class-loaders. - ImageEps() function was improved in performances. - Signature of Link() And Annotation() functions were changed. - (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added). - rowspan mode for HTML table cells was improved and fixed. - Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40. - lastPage() signature is changed. - Signature of Write() function is changed. - Some HTML justification problems were fixed. - Some functions were fixed to better support RTL mode. - Example n. 10 was changed to support RTL mode. - All examples were updated. 4.1.004 (2008-10-23) - unicode_data.php was changed to support class-loaders. - Bug item #2186040/2 (writeHTML margin problem) was fixed. 4.1.003 (2008-10-22) - Bug item #2185399 was fixed (rowspan and page break). - Bugs item #2186040 was fixed (writeHTML margin problem). - Newline after table was removed. 4.1.002 (2008-10-21) - Bug item #2184525 was fixed (rowspan on HTML cell). 4.1.001 (2008-10-21) - Support for "start" attribute was added to HTML ordered list. - unicode_data.php file was changed to include UTF-8 to ASCII table. - Some functions were modified to better support UTF-8 extensions to core fonts. - Support for images on HTML lists was improved. - Examples n. 1 and 6 were updated. 4.1.000 (2008-10-18) - Page-break bug using HTML content was fixed. - The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload. - addHtmlLink() function was improved to support internal links (i.e.: link to page 23). - Justification alignment is now supported on HTML (see example n. 39). - example_006.php was updated. 4.0.033 (2008-10-13) - Bug n. 2157099 was fixed. - SetX() and SetY() functions were improved. - SetY() includes a new parameter to avoid the X reset. 4.0.032 (2008-10-10) - Bug n. 2156926 was fixed (bold, italic, underlined, linethrough). - setStyle() method was removed. - Configuration file was changed to use helvetica (non-unicode) font by default. - The use of mixed font types was improved. - All examples were updated. 4.0.031 (2008-10-09) - _putannots() and _putbookmarks() links alignments were fixed. 4.0.030 (2008-10-07) - _putbookmarks() function was fixed. - _putannots() was fixed to include internal links. 4.0.029 (2008-09-27) - Infinite loop bug was fixed [Bug item #130309]. - Multicell() problem on Header() was fixed. 4.0.028 (2008-09-26) - setLIsymbol() was added to set the LI symbol used on UL lists. - Missing $padding and $encryption_key variables declarations were added [Bug item #2129058]. 4.0.027 (2008-09-19) - Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed. - arailunicid0.php font was updated. - The problem of javascript form fields duplication after saving was fixed. 4.0.026 (2008-09-17) - convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation. - The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large - Example n. 6 was updated. 4.0.025 (2008-09-15) - _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding. - arialunicid0 font was added (see the new example n. 38). - The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php. 4.0.024 (2008-09-12) - "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4. - support for Spot Colors were added. Check the new example n. 37 and the following new functions: AddSpotColor() SetDrawSpotColor() SetFillSpotColor() SetTextSpotColor() _putspotcolors() - Bookmark() function was improved to fix wrong levels. - $lasth changes after header/footer calls were fixed. 4.0.023 (2008-09-05) - Some HTML related problems were fixed. - Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php). 4.0.022 (2008-08-28) - Line height on HTML was fixed. - Image inside an HTML cell problem was fixed. - A new "zarbold" persian font was added. 4.0.021 (2008-08-24) - HTTP headers were fixed on Output function(). - getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents. - Function Write() was fixed. - The problem of additional vertical spaces on HTML was fixed. - The problem of frame around HTML links was fixed. 4.0.020 (2008-08-15) - "[2052259] WriteHTML & " bug was fixed. 4.0.019 (2008-08-13) - "Rowspan on first cell" bug was fixed. 4.0.018 (2008-08-08) - Default cellpadding for HTML tables was fixed. - Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7). - HTML links are now correclty shifted during line alignments. - function getAliasNbPages() was added and Footer() was updated. - RowSpan mode for HTML tables was fixed. - Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed. - ImageEPS() function was improved and RTL alignment was fixed (see example_032.php). 4.0.017 (2008-08-05) - Missing CNZ and CEO style modes were added to Rect() function. - Fonts utils were updated to include support for OpenType fonts. - getLastH() function was added. 4.0.016 (2008-07-30) - setPageMark() function was added. This function must be called after calling Image() function for a background image. 4.0.015 (2008-07-29) - Some functions were changed to support different page formats (see example_028.php). - The signature of setPage() function is changed. 4.0.014 (2008-07-29) - K_PATH_MAIN calculation on tcpdf_config.php was fixed. - HTML support for EPS/AI images was added (see example_006.php). - Bugs item #2030807 "Truncated text on multipage html fields" was fixed. - PDF header bug was fixed. - helvetica was added as default font family. - Stroke mode was fixed on Text function. - several minor bugs were fixed. 4.0.013 (2008-07-27) - Bugs item #2027799 " Big spaces between lines after page break" was fixed. - K_PATH_MAIN calculation on tcpdf_config.php was changed. - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message. 4.0.012 (2008-07-24) - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions. - The following functions were added: setHeader() setFooter() getImageRBX() getImageRBY() getCellHeightRatio() getHeaderFont() getFooterFont() getRTL() getBarcode() getHeaderData() getHeaderMargin() getFooterMargin() 4.0.011 (2008-07-23) - Font support was improved. - The folder /fonts/utils contains new utilities and instructions for embedd font files. - Documentation was updated. 4.0.010 (2008-07-22) - HTML tables were fixed to work across pages. - Header() and Footer() functions were updated to preserve previous settings. - example_035.php was added. 4.0.009 (2008-07-21) - UTF8StringToArray() function was fixed for non-unicode mode. 4.0.008 (2008-07-21) - Barcodes alignment was fixed (see example_027.php). - unicode_data.php was updated. - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed. 4.0.007 (2008-07-18) - str_split was replaced by preg_split for compatibility with PHP4 version. - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php). 4.0.006 (2008-07-16) - HTML rowspan bug was fixed. - Line style for MultiCell() was fixed. - WriteHTML() function was improved. - CODE128C barcode was fixed (barcodes.php). 4.0.005 (2008-07-11) - Bug [2015715] "PHP Error/Warning" was fixed. 4.0.004 (2008-07-09) - HTML cell internal padding was fixed. 4.0.003 (2008-07-08) - Removed URL encoding when F option is selected on Output() function. - fixed some minor bugs in html tables. 4.0.002 (2008-07-07) - Bug [2000861] was still unfixed and has been fixed. 4.0.001 (2008-07-05) - Bug [2000861] was fixed. 4.0.000 (2008-07-03) - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed). - HTML support was completely rewritten and improved (see example 6). - Alignments parameters were fixed. - Functions GetArrStringWidth() and GetStringWidth() now include font parameters. - Fonts support was improved. - All core fonts were replaced and moved to fonts/ directory. - The following functions were added: getMargins(), getFontSize(), getFontSizePt(). - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated. - Multicell and WriteHTMLCell fill function was fixed. - Several minor bugs were fixed. - barcodes.php was updated. - All examples were updated. ------------------------------------------------------------ 3.1.001 (2008-06-13) - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed. - Vera font was removed, DejaVu font and Free fonts were updated. - Image handling was improved. - All examples were updated. 3.1.000 (2008-06-11) - setPDFVersion() was added to change the default PDF version (currently 1.7). - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29). - SetDisplayMode() signature was changed (new options were added). - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30). - PieSector() function was added to render render pie charts (see example 31). - ImageEps() was added to display EPS and AI images with limited support (see example 32). - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added. - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions. - HTML lists were improved and could be nested (you may now represent trees). - AddFont() bug was fixed. - _putfonts() bug was fixed. - graphics functions were fixed. - unicode_data.php file was updated (fixed). - almohanad font was updated. - example 18 was updated (Farsi and Arabic languages). - source code cleanup. - All examples were updated and new examples were added. 3.0.015 (2008-06-06) - AddPage() function signature is changed to include page format. - example 28 was added to show page format changes. - setPageUnit() function was added to change the page units of measure. - setPageFormat() function was added to change the page format and orientation between pages. - setPageOrientation() function was added to change the page orientation. - Arabic font shaping was fixed for laa letter and square boxes (see the example 18). 3.0.014 (2008-06-04) - Arabic font shaping was fixed. - setDefaultTableColumns() function was added. - $cell_height_ratio variable was added. - setCellHeightRatio() function was added to define the default height of cell repect font height. 3.0.013 (2008-06-03) - Multicell height parameter was fixed. - Arabic font shaping was improved. - unicode_data.php was updated. 3.0.012 (2008-05-30) - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file. - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated). - Arabic font shaping was improved. - TranslateY() function was fixed (bug [1977962]). - setVisibility() function was fixed. - writeBarcode() function was fixed to scale using $xref parameter. - All examples were updated. 3.0.011 (2008-05-23) - CMYK color support was added to all graphic functions. - HTML table support was improved: -- now it's possible to include additional html tags inside a cell; -- colspan attribute was added. - example 006 was updated. 3.0.010 (2008-05-21) - fixed $laa_array inclusion on utf8Bidi() function. 3.0.009 (2008-05-20) - unicode_data.php was updated. - Arabic laa letter problem was fixed. 3.0.008 (2008-05-12) - Arabic support was fixed and improved (unicode_data.php was updated). - Polycurve() function was added to draw a poly-Bezier curve. - list items alignment was fixed. - example 6 was updated. 3.0.007 (2008-05-06) - Arabic support was fixed and improved. - AlMohanad (arabic) font was added. - C128 barcode bugs were fixed. 3.0.006 (2008-04-21) - Condition to check negative width values was added. 3.0.005 (2008-04-18) - back-Slash character escape was fixed on writeHTML() function. - Exampe 6 was updated. 3.0.004 (2008-04-11) - Bug [1939304] (Right to Left Issue) was fixed. 3.0.003 (2008-04-07) - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed. - "face" attribute of "font" tag is now fully supported. 3.0.002 (2008-04-01) - Write() functions now return the number of cells and not the number of lines. - TCPDF is released under LGPL 2.1, or any later version. 3.0.001 (2008-05-28) - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng(). - function writeBarcode() was fixed. - all examples were updated. - example 27 was added to show various barcodes. 3.0.000 (2008-03-27) - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug. - Image-related functions were rewritten. - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9). - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM. - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22). - Page Groups were added (see example 23). - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24). - All private variables and functions were changed to protected. - setAlpha() function was added to give transparency support for all objects (see example 25). - Clipping and stroke modes were added to Text() function (see example 26). - All examples were moved to "examples" directory. - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9). 2.9.000 (2008-03-26) - htmlcolors.php file was added to include html colors. - Support for HTML color names and three-digit hexadecimal color codes was added. - private function convertColorHexToDec() was renamed convertHTMLColorToDec(). - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported). - Write() function were fixed. - example_006.php was updated. - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14) 2.8.000 (2008-03-20) - Private variables were changed to protected. - Function Write() was fixed and improved. - Support for dl, dt, dd, del HTML tags was introduced. - Line-trought mode was added for HTML and text. - Text vertical alignment on cells were fixed. - Examples were updated to reflect changes. 2.7.002 (2008-03-13) - Bug "[1912142] Encrypted PDF created/modified date" was fixed. 2.7.001 (2008-03-10) - Cell justification was fixed for non-unicode mode. 2.7.000 (2008-03-09) - Cell() stretching mode 4 (forced character spacing) was fixed. - writeHTMLCell() now uses Multicell() to write. - Multicell() has a new parameter $ishtml to act as writeHTMLCell(). - Write() speed was improved for non-arabic strings. - Example n. 20 was changed. 2.6.000 (2008-03-07) - various alignments bugs were fixed. 2.5.000 (2008-03-07) - Several bugs were fixed. - example_019.php was added to test non-unicode mode using old fonts. 2.4.000 (2008-03-06) - RTL support was deeply improved. - GetStringWidth() was fixed to support RTL languages. - Text() RTL alignment was fixed. - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi(). - example_018.php was added and test_unicode.php was removed. 2.3.000 (2008-03-05) - MultiCell() signature is changed. Now support multiple columns across pages (see example_017). - Write() signature is changed. Now support the cell mode to be used with MultiCell. - Header() and Footer() were changed. - The following functions were added: UTF8ArrSubString() and unichr(). - Examples were updated to reflect last changes. 2.2.004 (2008-03-04) - Several examples were added. - AddPage() Header() and Footer() were fixed. - Documentation is now available on http://www.tcpdf.org 2.2.003 (2008-03-03) - [1894853] Performance of MultiCell() was improved. - RadioButton and ListBox functions were added. - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf. 2.2.002 (2008-02-28) - [1900495] html images path was fixed. - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library. 2.2.001 (2008-02-16) - The bug "[1894700] bug with replace relative path" was fixed - Justification was fixed 2.2.000 (2008-02-12) - fixed javascript bug introduced with latest release 2.1.002 (2008-02-12) - Justify function was fixed on PHP4 version. - Bookmank function was added ([1578250] Table of contents). - Javascript and Form fields support was added ([1796359] Form fields). 2.1.001 (2008-02-10) - The bug "[1885776] Race Condition in function justitfy" was fixed. - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed. 2.1.000 (2008-01-07) - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file - Bidirectional Algorithm to correctly reverse bidirectional languages was added. - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed. - SetCellPadding function was added. - writeHTML was updated with new parameters. - Text function was fixed. - MultiCell function was fixed, now works also across multiple pages. - Line width was fixed on Header and Footer functions and tag. - "GetImageSize" was renamed "getimagesize". - Document version was changed from 1.3 to 1.5. - _begindoc() function was fixed. - ChangeDate was fixed and ModDate was added. - The following functions were added: setPage() : Move pointer to the specified document page. getPage() : Get current document page number. lastpage() : Reset pointer to the last document page. getNumPages() : Get the total number of inserted pages. GetNumChars() : count the number of (UTF-8) characters in a string. - $stretch parameter was added to Cell() function to fit text on cell: 0 = disabled 1 = horizontal scaling only if necessary 2 = forced horizontal scaling 3 = character spacing only if necessary 4 = forced character spacing - Line function was fixed for RTL. - Graphic transformation functions were added [1811158]: StartTransform() StopTransform() ScaleX() ScaleY() ScaleXY() Scale() MirrorH() MirrorV() MirrorP() MirrorL() TranslateX() TranslateY() Translate() Rotate() SkewX() SkewY() Skew() - Graphic function were added/updated [1688549]: SetLineStyle() _outPoint() _outLine() _outRect() _outCurve() Line() Rect() Curve Ellipse Circle Polygon RegularPolygon 2.0.000 (2008-01-04) - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files. - setRTL($enable) method was added to manually enable/disable the RTL text direction. - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left. - RC4 40bit encryption was added. Check the SetProtection method. - [1815213] Improved image support for GIF, JPEG, PNG formats. - [1800094] Attribute "value" was added to ordered list items . - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be: T: top-right for LTR or top-left for RTL M: middle-right for LTR or middle-left for RTL B: bottom-right for LTR or bottom-left for RTL N: next line - Attribute "align" was added to html tag to set the above image "align" parameter. Possible values are: top: top-right for LTR or top-left for RTL middle: middle-right for LTR or middle-left for RTL bottom: bottom-right for LTR or bottom-left for RTL - [1798103] newline was added after , and tages. - [1816393] Documentation was updated. - 'ln' parameter was fixed on writeHTMLCell. Now it's possible to print two or more columns across several pages; - The method lastPage() was added to move the pointer on the last page; ------------------------------------------------------------ 1.53.0.TC034 (2007-07-30) - fixed htmlentities conversion. - MultiCell() function returns the number of cells. 1.53.0.TC033 (2007-07-30) - fixed bug 1762550: case sensitive for font files - NOTE: all fonts files names must be in lowercase! 1.53.0.TC032 (2007-07-27) - setLastH method was added to resolve bug 1689071. - all fonts names were converted in lowercase (bug 1713005). - bug 1740954 was fixed. - justification was added as Cell option. 1.53.0.TC031 (2007-03-20) - ToUnicode CMap were added on _puttruetypeunicode function. Now you may search and copy unicode text. 1.53.0.TC030 (2007-03-06) - fixed bug on PHP4 version. 1.53.0.TC029 (2007-03-06) - DejaVu Fonts were added. 1.53.0.TC028 (2007-03-03) - MultiCell function signature were changed: the $ln parameter were added. Check documentation for further information. - Greek language were added on example sentences. - setPrintHeader() and setPrintFooter() functions were added to enable or disable page header and footer. 1.53.0.TC027 (2006-12-14) - $attr['face'] bug were fixed. - K_TCPDF_EXTERNAL_CONFIG control where introduced on /config/tcpdf_config.php to use external configuration files. 1.53.0.TC026 (2006-10-28) - writeHTML function call were fixed on examples. 1.53.0.TC025 (2006-10-27) - Bugs item #1421290 were fixed (0D - 0A substitution in some characters) - Bugs item #1573174 were fixed (MultiCell documentation) 1.53.0.TC024 (2006-09-26) - getPageHeight() function were fixed (bug 1543476). - fixed missing breaks on closedHTMLTagHandler function (bug 1535263). - fixed extra spaces on Write function (bug 1535262). 1.53.0.TC023 (2006-08-04) - paths to barcode directory were fixed. - documentation were updated. 1.53.0.TC022 (2006-07-16) - fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists() 1.53.0.TC021 (2006-07-01) - HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support) 1.53.0.TC020 (2006-06-23) - code cleanup 1.53.0.TC019 (2006-05-21) - fixed and closing tags 1.53.0.TC018 (2006-05-18) - fixed font names bug 1.53.0.TC017 (2006-05-18) - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder. - new free unicode fonts were included on /fonts/freefont. - test_unicode.php example were exended. - parameter $fill were added on Write, writeHTML and writeHTMLCell functions. - documentation were updated. 1.53.0.TC016 (2006-03-09) - fixed closing tag on html parser. 1.53.0.TC016 (2005-08-28) - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class). - fixed problem when mb_internal_encoding is set. 1.53.0.TC014 (2005-05-29) - fixed WriteHTMLCell new page issue. 1.53.0.TC013 (2005-05-29) - fixed WriteHTMLCell across pages. 1.53.0.TC012 (2005-05-29) - font color attribute bug were fixed. 1.53.0.TC011 (2005-03-31) - SetFont function were fixed (thank Sjaak Lauwers for bug notice). 1.53.0.TC010 (2005-03-22) - the html functions were improved (thanks to Manfred Vervuert for bug reporting). 1.53.0.TC009 (2005-03-19) - a wrong reference to convertColorHexToDec were fixed. 1.53.0.TC008 (2005-02-07) - removed some extra bytes from PHP files. 1.53.0.TC007 (2005-01-08) - fill attribute were removed from writeHTMLCell method. 1.53.0.TC006 (2005-01-08) - the documentation were updated. 1.53.0.TC005 (2005-01-05) - Steven Wittens's unicode methods were removed. - All unicode methods were rewritten from scratch. - TCPDF is now licensed as LGPL. 1.53.0.TC004 (2005-01-04) - this changelog were added. - removed commercial fonts for licensing issue. - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html). - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist. EOF ---------------------------------------------------------------------------- PHPExcel/Shared/PDF/htmlcolors.php 0000666 00000013506 15017047356 0012713 0 ustar 00 . // // See LICENSE.TXT file for more information. // ---------------------------------------------------------------------------- // // Description : Array of WEB safe colors // // Author: Nicola Asuni // // (c) Copyright: // Nicola Asuni // Tecnick.com S.r.l. // Via della Pace, 11 // 09044 Quartucciu (CA) // ITALY // www.tecnick.com // info@tecnick.com //============================================================+ /** * Array of WEB safe colors. * @author Nicola Asuni * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com * @package com.tecnick.tcpdf * @link http://www.tcpdf.org * @license http://www.gnu.org/copyleft/lesser.html LGPL * @since 2.9.000 (2008-03-26) */ /** * Array of WEB safe colors */ global $webcolor; $webcolor = array ( 'aliceblue' => 'f0f8ff', 'antiquewhite' => 'faebd7', 'aqua' => '00ffff', 'aquamarine' => '7fffd4', 'azure' => 'f0ffff', 'beige' => 'f5f5dc', 'bisque' => 'ffe4c4', 'black' => '000000', 'blanchedalmond' => 'ffebcd', 'blue' => '0000ff', 'blueviolet' => '8a2be2', 'brown' => 'a52a2a', 'burlywood' => 'deb887', 'cadetblue' => '5f9ea0', 'chartreuse' => '7fff00', 'chocolate' => 'd2691e', 'coral' => 'ff7f50', 'cornflowerblue' => '6495ed', 'cornsilk' => 'fff8dc', 'crimson' => 'dc143c', 'cyan' => '00ffff', 'darkblue' => '00008b', 'darkcyan' => '008b8b', 'darkgoldenrod' => 'b8860b', 'dkgray' => 'a9a9a9', 'darkgray' => 'a9a9a9', 'darkgrey' => 'a9a9a9', 'darkgreen' => '006400', 'darkkhaki' => 'bdb76b', 'darkmagenta' => '8b008b', 'darkolivegreen' => '556b2f', 'darkorange' => 'ff8c00', 'darkorchid' => '9932cc', 'darkred' => '8b0000', 'darksalmon' => 'e9967a', 'darkseagreen' => '8fbc8f', 'darkslateblue' => '483d8b', 'darkslategray' => '2f4f4f', 'darkslategrey' => '2f4f4f', 'darkturquoise' => '00ced1', 'darkviolet' => '9400d3', 'deeppink' => 'ff1493', 'deepskyblue' => '00bfff', 'dimgray' => '696969', 'dimgrey' => '696969', 'dodgerblue' => '1e90ff', 'firebrick' => 'b22222', 'floralwhite' => 'fffaf0', 'forestgreen' => '228b22', 'fuchsia' => 'ff00ff', 'gainsboro' => 'dcdcdc', 'ghostwhite' => 'f8f8ff', 'gold' => 'ffd700', 'goldenrod' => 'daa520', 'gray' => '808080', 'grey' => '808080', 'green' => '008000', 'greenyellow' => 'adff2f', 'honeydew' => 'f0fff0', 'hotpink' => 'ff69b4', 'indianred ' => 'cd5c5c', 'indigo ' => '4b0082', 'ivory' => 'fffff0', 'khaki' => 'f0e68c', 'lavender' => 'e6e6fa', 'lavenderblush' => 'fff0f5', 'lawngreen' => '7cfc00', 'lemonchiffon' => 'fffacd', 'lightblue' => 'add8e6', 'lightcoral' => 'f08080', 'lightcyan' => 'e0ffff', 'lightgoldenrodyellow' => 'fafad2', 'ltgray' => 'd3d3d3', 'lightgray' => 'd3d3d3', 'lightgrey' => 'd3d3d3', 'lightgreen' => '90ee90', 'lightpink' => 'ffb6c1', 'lightsalmon' => 'ffa07a', 'lightseagreen' => '20b2aa', 'lightskyblue' => '87cefa', 'lightslategray' => '778899', 'lightslategrey' => '778899', 'lightsteelblue' => 'b0c4de', 'lightyellow' => 'ffffe0', 'lime' => '00ff00', 'limegreen' => '32cd32', 'linen' => 'faf0e6', 'magenta' => 'ff00ff', 'maroon' => '800000', 'mediumaquamarine' => '66cdaa', 'mediumblue' => '0000cd', 'mediumorchid' => 'ba55d3', 'mediumpurple' => '9370d8', 'mediumseagreen' => '3cb371', 'mediumslateblue' => '7b68ee', 'mediumspringgreen' => '00fa9a', 'mediumturquoise' => '48d1cc', 'mediumvioletred' => 'c71585', 'midnightblue' => '191970', 'mintcream' => 'f5fffa', 'mistyrose' => 'ffe4e1', 'moccasin' => 'ffe4b5', 'navajowhite' => 'ffdead', 'navy' => '000080', 'oldlace' => 'fdf5e6', 'olive' => '808000', 'olivedrab' => '6b8e23', 'orange' => 'ffa500', 'orangered' => 'ff4500', 'orchid' => 'da70d6', 'palegoldenrod' => 'eee8aa', 'palegreen' => '98fb98', 'paleturquoise' => 'afeeee', 'palevioletred' => 'd87093', 'papayawhip' => 'ffefd5', 'peachpuff' => 'ffdab9', 'peru' => 'cd853f', 'pink' => 'ffc0cb', 'plum' => 'dda0dd', 'powderblue' => 'b0e0e6', 'purple' => '800080', 'red' => 'ff0000', 'rosybrown' => 'bc8f8f', 'royalblue' => '4169e1', 'saddlebrown' => '8b4513', 'salmon' => 'fa8072', 'sandybrown' => 'f4a460', 'seagreen' => '2e8b57', 'seashell' => 'fff5ee', 'sienna' => 'a0522d', 'silver' => 'c0c0c0', 'skyblue' => '87ceeb', 'slateblue' => '6a5acd', 'slategray' => '708090', 'slategrey' => '708090', 'snow' => 'fffafa', 'springgreen' => '00ff7f', 'steelblue' => '4682b4', 'tan' => 'd2b48c', 'teal' => '008080', 'thistle' => 'd8bfd8', 'tomato' => 'ff6347', 'turquoise' => '40e0d0', 'violet' => 'ee82ee', 'wheat' => 'f5deb3', 'white' => 'ffffff', 'whitesmoke' => 'f5f5f5', 'yellow' => 'ffff00', 'yellowgreen' => '9acd32' ); //============================================================+ // END OF FILE //============================================================+ ?> PHPExcel/Shared/PDF/fonts/.noencode 0000666 00000000000 15017047356 0012721 0 ustar 00 PHPExcel/Shared/PDF/fonts/README.TXT 0000666 00000000262 15017047356 0012476 0 ustar 00 This folder contains fonts descriptions for TCPDF. All fonts names must be in lowercase. Please read the documentation on subfolders for copyright, license and other information. PHPExcel/Shared/PDF/fonts/uni2cid_ac15.php 0000666 00001160742 15017047356 0014032 0 ustar 00 1, 33=>2, 34=>3, 35=>4, 36=>5, 37=>6, 38=>7, 39=>8, 40=>9, 41=>10, 42=>11, 43=>12, 44=>13, 45=>14, 46=>15, 47=>16, 48=>17, 49=>18, 50=>19, 51=>20, 52=>21, 53=>22, 54=>23, 55=>24, 56=>25, 57=>26, 58=>27, 59=>28, 60=>29, 61=>30, 62=>31, 63=>32, 64=>33, 65=>34, 66=>35, 67=>36, 68=>37, 69=>38, 70=>39, 71=>40, 72=>41, 73=>42, 74=>43, 75=>44, 76=>45, 77=>46, 78=>47, 79=>48, 80=>49, 81=>50, 82=>51, 83=>52, 84=>53, 85=>54, 86=>55, 87=>56, 88=>57, 89=>58, 90=>59, 91=>60, 92=>61, 93=>62, 94=>63, 95=>64, 96=>65, 97=>66, 98=>67, 99=>68, 100=>69, 101=>70, 102=>71, 103=>72, 104=>73, 105=>74, 106=>75, 107=>76, 108=>77, 109=>78, 110=>79, 111=>80, 112=>81, 113=>82, 114=>83, 115=>84, 116=>85, 117=>86, 118=>87, 119=>88, 120=>89, 121=>90, 122=>91, 123=>92, 124=>93, 125=>94, 126=>95, 12288=>99, 65292=>100, 12289=>101, 12290=>102, 65294=>103, 8226=>104, 8231=>104, 65307=>105, 65306=>106, 65311=>107, 65281=>108, 65072=>109, 8230=>110, 8943=>110, 8229=>111, 65104=>112, 65380=>113, 65105=>113, 65106=>114, 183=>115, 65108=>116, 65109=>117, 65110=>118, 65111=>119, 65372=>120, 8211=>121, 65073=>122, 8212=>123, 65288=>128, 65289=>129, 65077=>130, 65078=>131, 65371=>132, 65373=>133, 65079=>134, 65080=>135, 12308=>136, 12309=>137, 65081=>138, 65082=>139, 12304=>140, 12305=>141, 65083=>142, 65084=>143, 12298=>144, 12299=>145, 65085=>146, 65086=>147, 12296=>148, 12297=>149, 65087=>150, 65088=>151, 12300=>152, 12301=>153, 65089=>154, 65090=>155, 12302=>156, 12303=>157, 65091=>158, 65092=>159, 65113=>160, 65114=>161, 65115=>162, 65116=>163, 65117=>164, 65118=>165, 8216=>166, 8217=>167, 8220=>168, 8221=>169, 12317=>170, 12318=>171, 8245=>172, 8242=>173, 65283=>174, 65286=>175, 65290=>176, 8251=>177, 167=>178, 12291=>179, 9675=>180, 9679=>181, 9651=>182, 9650=>183, 9678=>184, 9734=>185, 9733=>186, 9671=>187, 9670=>188, 9633=>189, 9632=>190, 9661=>191, 9660=>192, 12963=>193, 8453=>194, 175=>195, 772=>195, 8254=>195, 65507=>196, 65343=>197, 717=>198, 65097=>199, 65098=>200, 65101=>201, 65102=>202, 65099=>203, 65100=>204, 65119=>205, 65120=>206, 65121=>207, 65291=>208, 65293=>209, 215=>210, 247=>211, 177=>212, 8730=>213, 65308=>214, 65310=>215, 65309=>216, 8806=>217, 8807=>218, 8800=>219, 8734=>220, 8786=>221, 8801=>222, 65122=>223, 65123=>224, 65124=>225, 65125=>226, 65126=>227, 8764=>228, 65374=>228, 8745=>229, 8746=>230, 8869=>231, 8736=>232, 8735=>233, 8895=>234, 13266=>235, 13265=>236, 8747=>237, 8750=>238, 8757=>239, 8756=>240, 9792=>241, 9794=>242, 8853=>243, 9793=>243, 8857=>244, 9737=>244, 8593=>245, 8595=>246, 8594=>247, 8592=>248, 8598=>249, 8599=>250, 8601=>251, 8600=>252, 8741=>253, 8739=>254, 8725=>257, 65295=>257, 65128=>258, 65340=>258, 65284=>259, 165=>260, 65509=>260, 12306=>261, 162=>262, 65504=>262, 163=>263, 65505=>263, 65285=>264, 65312=>265, 8451=>266, 8457=>267, 65129=>268, 65130=>269, 65131=>270, 13269=>271, 13212=>272, 13213=>273, 13214=>274, 13262=>275, 13217=>276, 13198=>277, 13199=>278, 13252=>279, 176=>280, 20825=>281, 58834=>281, 20827=>282, 58835=>282, 20830=>283, 58837=>283, 20829=>284, 58836=>284, 20833=>285, 20835=>286, 21991=>287, 29929=>288, 58044=>288, 31950=>289, 58191=>289, 9601=>290, 9602=>291, 9603=>292, 9604=>293, 9605=>294, 9606=>295, 9607=>296, 9608=>297, 9615=>298, 9614=>299, 9613=>300, 9612=>301, 9611=>302, 9610=>303, 9609=>304, 9532=>305, 9524=>306, 9516=>307, 9508=>308, 9500=>309, 9620=>310, 9472=>311, 9474=>312, 9621=>313, 9484=>314, 9488=>315, 9492=>316, 9496=>317, 9581=>318, 9582=>319, 9584=>320, 9583=>321, 9552=>322, 9566=>323, 9578=>324, 9569=>325, 9698=>326, 9699=>327, 9701=>328, 9700=>329, 9585=>330, 9586=>331, 9587=>332, 65296=>333, 65297=>334, 65298=>335, 65299=>336, 65300=>337, 65301=>338, 65302=>339, 65303=>340, 65304=>341, 65305=>342, 8544=>343, 8545=>344, 8546=>345, 8547=>346, 8548=>347, 8549=>348, 8550=>349, 8551=>350, 8552=>351, 8553=>352, 12321=>353, 12322=>354, 12323=>355, 12324=>356, 12325=>357, 12326=>358, 12327=>359, 12328=>360, 12329=>361, 12344=>362, 21316=>363, 57443=>363, 12345=>363, 12346=>364, 65313=>365, 65314=>366, 65315=>367, 65316=>368, 65317=>369, 65318=>370, 65319=>371, 65320=>372, 65321=>373, 65322=>374, 65323=>375, 65324=>376, 65325=>377, 65326=>378, 65327=>379, 65328=>380, 65329=>381, 65330=>382, 65331=>383, 65332=>384, 65333=>385, 65334=>386, 65335=>387, 65336=>388, 65337=>389, 65338=>390, 65345=>391, 65346=>392, 65347=>393, 65348=>394, 65349=>395, 65350=>396, 65351=>397, 65352=>398, 65353=>399, 65354=>400, 65355=>401, 65356=>402, 65357=>403, 65358=>404, 65359=>405, 65360=>406, 65361=>407, 65362=>408, 65363=>409, 65364=>410, 65365=>411, 65366=>412, 65367=>413, 65368=>414, 65369=>415, 65370=>416, 913=>417, 914=>418, 915=>419, 916=>420, 917=>421, 918=>422, 919=>423, 920=>424, 921=>425, 922=>426, 923=>427, 924=>428, 925=>429, 926=>430, 927=>431, 928=>432, 929=>433, 931=>434, 932=>435, 933=>436, 934=>437, 935=>438, 936=>439, 937=>440, 945=>441, 946=>442, 947=>443, 948=>444, 949=>445, 950=>446, 951=>447, 952=>448, 953=>449, 954=>450, 955=>451, 956=>452, 957=>453, 958=>454, 959=>455, 960=>456, 961=>457, 963=>458, 964=>459, 965=>460, 966=>461, 967=>462, 968=>463, 969=>464, 12549=>465, 12550=>466, 12551=>467, 12552=>468, 12553=>469, 12554=>470, 12555=>471, 12556=>472, 12557=>473, 12558=>474, 12559=>475, 12560=>476, 12561=>477, 12562=>478, 12563=>479, 12564=>480, 12565=>481, 12566=>482, 12567=>483, 12568=>484, 12569=>485, 12570=>486, 12571=>487, 12572=>488, 12573=>489, 12574=>490, 12575=>491, 12576=>492, 12577=>493, 12578=>494, 12579=>495, 12580=>496, 12581=>497, 12582=>498, 12583=>499, 12584=>500, 12585=>501, 729=>502, 714=>503, 711=>504, 780=>504, 715=>505, 9312=>506, 63153=>506, 9313=>507, 63154=>507, 9314=>508, 63155=>508, 9315=>509, 63156=>509, 9316=>510, 63157=>510, 9317=>511, 63158=>511, 9318=>512, 63159=>512, 9319=>513, 63160=>513, 9320=>514, 63161=>514, 9321=>515, 63162=>515, 9332=>516, 63163=>516, 9333=>517, 63164=>517, 9334=>518, 63165=>518, 9335=>519, 63166=>519, 9336=>520, 63167=>520, 9337=>521, 63168=>521, 9338=>522, 63169=>522, 9339=>523, 63170=>523, 9340=>524, 63171=>524, 9341=>525, 63172=>525, 8560=>526, 63173=>526, 8561=>527, 63174=>527, 8562=>528, 63175=>528, 8563=>529, 63176=>529, 8564=>530, 63177=>530, 8565=>531, 63178=>531, 8566=>532, 63179=>532, 8567=>533, 63180=>533, 8568=>534, 63181=>534, 8569=>535, 63182=>535, 20008=>536, 12033=>536, 20022=>537, 12034=>537, 63183=>537, 20031=>538, 12035=>538, 63184=>538, 12037=>539, 20101=>539, 63185=>539, 12039=>540, 20128=>540, 63186=>540, 20866=>541, 12044=>541, 63187=>541, 20886=>542, 12045=>542, 63188=>542, 20907=>543, 12046=>543, 63189=>543, 12051=>544, 21241=>544, 63190=>544, 12054=>545, 21304=>545, 63191=>545, 12057=>546, 21353=>546, 63192=>546, 12059=>547, 21430=>547, 63193=>547, 12065=>548, 12066=>548, 22786=>548, 22794=>548, 63194=>548, 12071=>549, 23424=>549, 63195=>549, 12078=>550, 24027=>550, 63196=>550, 24186=>551, 12083=>551, 63197=>551, 24191=>552, 12084=>552, 63198=>552, 24308=>553, 12085=>553, 24400=>554, 12089=>554, 63200=>554, 24417=>555, 12090=>555, 63201=>555, 12097=>556, 25908=>556, 63202=>556, 12102=>557, 26080=>557, 30098=>558, 63204=>558, 12135=>558, 30326=>559, 12136=>559, 12193=>560, 36789=>560, 63206=>560, 12202=>561, 38582=>561, 9216=>562, 9217=>563, 9218=>564, 9219=>565, 9220=>566, 9221=>567, 9222=>568, 9223=>569, 9224=>570, 9225=>571, 9226=>572, 9227=>573, 9228=>574, 9229=>575, 9230=>576, 9231=>577, 9232=>578, 9233=>579, 9234=>580, 9235=>581, 9236=>582, 9237=>583, 9238=>584, 9239=>585, 9240=>586, 9241=>587, 9242=>588, 9243=>589, 9244=>590, 9245=>591, 9246=>592, 9247=>593, 9249=>594, 12032=>595, 19968=>595, 12036=>596, 20057=>596, 19969=>597, 19971=>598, 20035=>599, 20061=>600, 20102=>601, 12038=>602, 20108=>602, 20154=>603, 12040=>603, 20799=>604, 12041=>604, 20837=>605, 12042=>605, 20843=>606, 12043=>606, 12047=>607, 20960=>607, 12049=>608, 20992=>608, 20993=>609, 12050=>610, 21147=>610, 12052=>611, 21269=>611, 21313=>612, 12055=>612, 21340=>613, 12056=>613, 12060=>614, 21448=>614, 19977=>615, 19979=>616, 19976=>617, 19978=>618, 20011=>619, 20024=>620, 20961=>621, 20037=>622, 20040=>623, 20063=>624, 20062=>625, 20110=>626, 20129=>627, 20800=>628, 64012=>628, 20995=>629, 21242=>630, 21315=>631, 21449=>632, 12061=>633, 21475=>633, 22303=>634, 12063=>634, 22763=>635, 12064=>635, 22805=>636, 12067=>636, 22823=>637, 12068=>637, 22899=>638, 12069=>638, 12070=>639, 23376=>639, 23377=>640, 23379=>641, 23544=>642, 12072=>642, 23567=>643, 12073=>643, 23586=>644, 12074=>644, 23608=>645, 12075=>645, 12077=>646, 23665=>646, 24029=>647, 24037=>648, 12079=>648, 12080=>649, 24049=>649, 24050=>650, 24051=>651, 24062=>652, 12081=>652, 24178=>653, 12082=>653, 24318=>654, 12086=>654, 24331=>655, 12087=>655, 24339=>656, 12088=>656, 25165=>657, 19985=>658, 19984=>659, 19981=>660, 20013=>661, 20016=>662, 20025=>663, 20043=>664, 23609=>665, 20104=>666, 20113=>667, 20117=>668, 20114=>669, 20116=>670, 20130=>671, 20161=>672, 20160=>673, 20163=>674, 20166=>675, 20167=>676, 20173=>677, 20170=>678, 20171=>679, 20164=>680, 20803=>681, 20801=>682, 20839=>683, 20845=>684, 20846=>685, 20844=>686, 20887=>687, 20982=>688, 20998=>689, 20999=>690, 21000=>691, 21243=>692, 21246=>693, 21247=>694, 21270=>695, 21305=>696, 21320=>697, 21319=>698, 21317=>699, 21342=>700, 21380=>701, 21451=>702, 21450=>703, 21453=>704, 22764=>705, 22825=>706, 22827=>707, 22826=>708, 22829=>709, 23380=>710, 23569=>711, 23588=>712, 23610=>713, 23663=>714, 24052=>715, 24187=>716, 24319=>717, 24340=>718, 24341=>719, 24515=>720, 12092=>720, 25096=>721, 12093=>721, 25142=>722, 12094=>722, 25163=>723, 12095=>723, 25166=>724, 12096=>725, 25903=>725, 25991=>726, 12098=>726, 26007=>727, 12099=>727, 26020=>728, 12100=>728, 26041=>729, 12101=>729, 26085=>730, 12103=>730, 26352=>731, 12104=>731, 26376=>732, 12105=>732, 26408=>733, 12106=>733, 27424=>734, 12107=>734, 27490=>735, 12108=>735, 27513=>736, 12109=>736, 27595=>737, 12111=>737, 27604=>738, 12112=>738, 27611=>739, 12113=>739, 27663=>740, 12114=>740, 27700=>741, 12116=>741, 28779=>742, 12117=>742, 29226=>743, 12118=>743, 29238=>744, 12119=>744, 29243=>745, 12120=>745, 29255=>746, 12122=>746, 29273=>747, 12123=>747, 29275=>748, 12124=>748, 29356=>749, 12125=>749, 29579=>750, 19993=>751, 19990=>752, 19989=>753, 19988=>754, 19992=>755, 20027=>756, 20045=>757, 20047=>758, 20046=>759, 20197=>760, 20184=>761, 20180=>762, 20181=>763, 20182=>764, 20183=>765, 20195=>766, 20196=>767, 20185=>768, 20190=>769, 20805=>770, 20804=>771, 20873=>772, 20874=>773, 20908=>774, 20985=>775, 20986=>776, 20984=>777, 21002=>778, 21152=>779, 21151=>780, 57435=>781, 21253=>781, 21254=>782, 21271=>783, 21277=>784, 20191=>785, 21322=>786, 21321=>787, 21345=>788, 21344=>789, 21359=>790, 21358=>791, 21435=>792, 21487=>793, 21476=>794, 21491=>795, 21484=>796, 21486=>797, 21481=>798, 21480=>799, 21500=>800, 21496=>801, 21493=>802, 21483=>803, 21478=>804, 21482=>805, 21490=>806, 21489=>807, 21488=>808, 21477=>809, 21485=>810, 21499=>811, 22235=>812, 22234=>813, 22806=>814, 22830=>815, 22833=>816, 22900=>817, 22902=>818, 23381=>819, 23427=>820, 23612=>821, 24040=>822, 24039=>823, 24038=>824, 24066=>825, 24067=>826, 24179=>827, 24188=>828, 24321=>829, 24344=>830, 24343=>831, 24517=>832, 25098=>833, 25171=>834, 25172=>835, 25170=>836, 25169=>837, 26021=>838, 26086=>839, 26414=>840, 26412=>841, 26410=>842, 26411=>843, 26413=>844, 27491=>845, 27597=>846, 27665=>847, 27664=>848, 27704=>849, 27713=>850, 27712=>851, 27710=>852, 29359=>853, 29572=>854, 12126=>854, 29577=>855, 12127=>855, 29916=>856, 12128=>856, 29926=>857, 12129=>857, 29976=>858, 12130=>858, 29983=>859, 12131=>859, 12132=>860, 29992=>860, 29993=>861, 12133=>862, 30000=>862, 30001=>863, 30002=>864, 30003=>865, 12134=>866, 30091=>866, 30333=>867, 12137=>867, 30382=>868, 12138=>868, 30399=>869, 12139=>869, 30446=>870, 12140=>870, 30683=>871, 12141=>871, 30690=>872, 12142=>872, 30707=>873, 12143=>873, 31034=>874, 12144=>874, 31166=>875, 12146=>875, 31348=>876, 12147=>876, 31435=>877, 12148=>877, 19998=>878, 19999=>879, 20050=>880, 20051=>881, 20073=>882, 20121=>883, 20132=>884, 20134=>885, 20133=>886, 20223=>887, 20233=>888, 20249=>889, 20234=>890, 20245=>891, 20237=>892, 20240=>893, 20241=>894, 20239=>895, 20210=>896, 20214=>897, 20219=>898, 20208=>899, 20211=>900, 20221=>901, 20225=>902, 20235=>903, 20809=>904, 20807=>905, 20806=>906, 20808=>907, 20840=>908, 20849=>909, 20877=>910, 20912=>911, 21015=>912, 21009=>913, 21010=>914, 21006=>915, 21014=>916, 21155=>917, 21256=>918, 21281=>919, 21280=>920, 21360=>921, 21361=>922, 21513=>923, 21519=>924, 21516=>925, 21514=>926, 21520=>927, 21505=>928, 21515=>929, 21508=>930, 21521=>931, 21517=>932, 21512=>933, 21507=>934, 21518=>935, 21510=>936, 21522=>937, 22240=>938, 22238=>939, 22237=>940, 22323=>941, 22320=>942, 22312=>943, 22317=>944, 22316=>945, 22319=>946, 22313=>947, 22809=>948, 22810=>949, 22839=>950, 22840=>951, 22916=>952, 22904=>953, 22915=>954, 22909=>955, 22905=>956, 22914=>957, 22913=>958, 23383=>959, 23384=>960, 23431=>961, 23432=>962, 23429=>963, 23433=>964, 23546=>965, 23574=>966, 23673=>967, 24030=>968, 24070=>969, 24182=>970, 24180=>971, 24335=>972, 24347=>973, 24537=>974, 24534=>975, 25102=>976, 25100=>977, 25101=>978, 25104=>979, 25187=>980, 25179=>981, 25176=>982, 25910=>983, 26089=>984, 26088=>985, 26092=>986, 26093=>987, 26354=>988, 26355=>989, 26377=>990, 26429=>991, 26420=>992, 26417=>993, 26421=>994, 27425=>995, 27492=>996, 27515=>997, 27670=>998, 27741=>999, 27735=>1000, 27737=>1001, 27743=>1002, 27744=>1003, 27728=>1004, 27733=>1005, 27745=>1006, 27739=>1007, 27725=>1008, 27726=>1009, 28784=>1010, 29279=>1011, 29277=>1012, 30334=>1013, 31481=>1014, 12149=>1014, 31859=>1015, 12150=>1015, 31992=>1016, 12151=>1016, 32566=>1017, 12152=>1017, 32650=>1018, 12154=>1018, 32701=>1019, 12155=>1019, 32769=>1020, 12156=>1020, 32771=>1021, 32780=>1022, 12157=>1022, 32786=>1023, 12158=>1023, 32819=>1024, 12159=>1024, 32895=>1025, 12160=>1025, 32905=>1026, 12161=>1026, 32907=>1027, 32908=>1028, 33251=>1029, 12162=>1029, 33258=>1030, 12163=>1030, 33267=>1031, 12164=>1031, 33276=>1032, 12165=>1032, 33292=>1033, 12166=>1033, 33307=>1034, 12167=>1034, 33311=>1035, 12168=>1035, 33390=>1036, 12169=>1036, 33394=>1037, 12170=>1037, 33406=>1038, 34411=>1039, 12173=>1039, 34880=>1040, 12174=>1040, 34892=>1041, 12175=>1041, 34915=>1042, 12176=>1042, 35199=>1043, 38433=>1044, 20018=>1045, 20136=>1046, 20301=>1047, 20303=>1048, 20295=>1049, 20311=>1050, 20318=>1051, 20276=>1052, 20315=>1053, 20309=>1054, 20272=>1055, 20304=>1056, 20305=>1057, 20285=>1058, 20282=>1059, 20280=>1060, 20291=>1061, 20308=>1062, 20284=>1063, 20294=>1064, 20323=>1065, 20316=>1066, 20320=>1067, 20271=>1068, 20302=>1069, 20278=>1070, 20313=>1071, 20317=>1072, 20296=>1073, 20314=>1074, 20812=>1075, 20811=>1076, 20813=>1077, 20853=>1078, 20918=>1079, 20919=>1080, 21029=>1081, 21028=>1082, 21033=>1083, 21034=>1084, 21032=>1085, 21163=>1086, 21161=>1087, 21162=>1088, 21164=>1089, 21283=>1090, 21363=>1091, 21365=>1092, 21533=>1093, 21549=>1094, 21534=>1095, 21566=>1096, 21542=>1097, 21582=>1098, 21543=>1099, 21574=>1100, 21571=>1101, 21555=>1102, 21576=>1103, 21570=>1104, 21531=>1105, 21545=>1106, 21578=>1107, 21561=>1108, 21563=>1109, 21560=>1110, 21550=>1111, 21557=>1112, 21558=>1113, 21536=>1114, 21564=>1115, 21568=>1116, 21553=>1117, 21547=>1118, 21535=>1119, 21548=>1120, 22250=>1121, 22256=>1122, 22244=>1123, 22251=>1124, 22346=>1125, 22353=>1126, 22336=>1127, 22349=>1128, 22343=>1129, 22350=>1130, 22334=>1131, 22352=>1132, 22351=>1133, 22331=>1134, 22767=>1135, 22846=>1136, 22941=>1137, 22930=>1138, 22952=>1139, 22942=>1140, 22947=>1141, 22937=>1142, 22934=>1143, 22925=>1144, 22948=>1145, 22931=>1146, 22922=>1147, 22949=>1148, 23389=>1149, 23388=>1150, 23386=>1151, 23387=>1152, 23436=>1153, 23435=>1154, 23439=>1155, 23596=>1156, 23616=>1157, 23617=>1158, 23615=>1159, 23614=>1160, 23696=>1161, 23697=>1162, 23700=>1163, 23692=>1164, 24043=>1165, 24076=>1166, 24207=>1167, 24199=>1168, 24202=>1169, 24311=>1170, 24324=>1171, 24351=>1172, 24420=>1173, 24418=>1174, 24439=>1175, 24441=>1176, 24536=>1177, 24524=>1178, 24535=>1179, 24525=>1180, 24561=>1181, 24555=>1182, 24568=>1183, 24554=>1184, 25106=>1185, 25105=>1186, 25220=>1187, 25239=>1188, 25238=>1189, 25216=>1190, 25206=>1191, 25225=>1192, 25197=>1193, 25226=>1194, 25212=>1195, 25214=>1196, 25209=>1197, 25203=>1198, 25234=>1199, 25199=>1200, 25240=>1201, 25198=>1202, 25237=>1203, 25235=>1204, 25233=>1205, 25222=>1206, 25913=>1207, 25915=>1208, 25912=>1209, 26097=>1210, 26356=>1211, 26463=>1212, 26446=>1213, 26447=>1214, 26448=>1215, 26449=>1216, 26460=>1217, 26454=>1218, 26462=>1219, 57801=>1219, 26441=>1220, 26438=>1221, 26464=>1222, 26451=>1223, 26455=>1224, 27493=>1225, 27599=>1226, 27714=>1227, 27742=>1228, 27801=>1229, 27777=>1230, 27784=>1231, 27785=>1232, 27781=>1233, 27803=>1234, 27754=>1235, 27770=>1236, 27792=>1237, 27760=>1238, 27788=>1239, 27752=>1240, 27798=>1241, 27794=>1242, 27773=>1243, 27779=>1244, 27762=>1245, 27774=>1246, 27764=>1247, 27782=>1248, 27766=>1249, 27789=>1250, 27796=>1251, 27800=>1252, 27778=>1253, 28790=>1254, 28796=>1255, 28797=>1256, 28792=>1257, 29282=>1258, 29281=>1259, 29280=>1260, 29380=>1261, 29378=>1262, 29590=>1263, 29996=>1264, 29995=>1265, 30007=>1266, 30008=>1267, 30338=>1268, 30447=>1269, 30691=>1270, 31169=>1271, 31168=>1272, 31167=>1273, 31350=>1274, 31995=>1275, 32597=>1276, 32918=>1277, 32915=>1278, 32925=>1279, 32920=>1280, 32923=>1281, 32922=>1282, 32946=>1283, 33391=>1284, 33426=>1285, 33419=>1286, 33421=>1287, 35211=>1288, 12178=>1288, 35282=>1289, 12179=>1289, 35328=>1290, 12180=>1290, 35895=>1291, 12181=>1291, 35910=>1292, 12182=>1292, 35925=>1293, 12183=>1293, 35997=>1294, 12185=>1294, 36196=>1295, 12186=>1295, 36208=>1296, 12187=>1296, 36275=>1297, 12188=>1297, 36523=>1298, 12189=>1298, 36554=>1299, 12190=>1299, 36763=>1300, 12191=>1300, 36784=>1301, 12192=>1301, 36802=>1302, 36806=>1303, 36805=>1304, 36804=>1305, 24033=>1306, 12194=>1307, 37009=>1307, 37026=>1308, 37034=>1309, 37030=>1310, 37027=>1311, 37193=>1312, 12195=>1312, 37318=>1313, 12196=>1313, 37324=>1314, 12197=>1314, 38450=>1315, 38446=>1316, 38449=>1317, 38442=>1318, 38444=>1319, 20006=>1320, 20054=>1321, 20083=>1322, 20107=>1323, 20123=>1324, 20126=>1325, 20139=>1326, 20140=>1327, 20335=>1328, 20381=>1329, 20365=>1330, 20339=>1331, 20351=>1332, 20332=>1333, 20379=>1334, 20363=>1335, 20358=>1336, 20355=>1337, 20336=>1338, 20341=>1339, 20360=>1340, 20329=>1341, 20347=>1342, 20374=>1343, 20350=>1344, 20367=>1345, 20369=>1346, 20346=>1347, 20820=>1348, 20818=>1349, 20821=>1350, 20841=>1351, 20855=>1352, 20854=>1353, 20856=>1354, 20925=>1355, 20989=>1356, 21051=>1357, 21048=>1358, 21047=>1359, 21050=>1360, 21040=>1361, 21038=>1362, 21046=>1363, 21057=>1364, 21182=>1365, 21179=>1366, 21330=>1367, 21332=>1368, 21331=>1369, 21329=>1370, 21350=>1371, 21367=>1372, 21368=>1373, 21369=>1374, 21462=>1375, 21460=>1376, 21463=>1377, 21619=>1378, 21621=>1379, 21654=>1380, 21624=>1381, 21653=>1382, 21632=>1383, 21627=>1384, 21623=>1385, 21636=>1386, 21650=>1387, 21638=>1388, 21628=>1389, 21648=>1390, 21617=>1391, 21622=>1392, 21644=>1393, 21658=>1394, 21602=>1395, 21608=>1396, 21643=>1397, 21629=>1398, 21646=>1399, 22266=>1400, 22403=>1401, 22391=>1402, 22378=>1403, 22377=>1404, 22369=>1405, 22374=>1406, 22372=>1407, 22396=>1408, 22812=>1409, 22857=>1410, 22855=>1411, 22856=>1412, 22852=>1413, 22868=>1414, 22974=>1415, 22971=>1416, 22996=>1417, 22969=>1418, 22958=>1419, 22993=>1420, 22982=>1421, 22992=>1422, 22989=>1423, 22987=>1424, 22995=>1425, 22986=>1426, 22959=>1427, 22963=>1428, 22994=>1429, 22981=>1430, 23391=>1431, 23396=>1432, 23395=>1433, 23447=>1434, 23450=>1435, 23448=>1436, 23452=>1437, 23449=>1438, 23451=>1439, 23578=>1440, 23624=>1441, 23621=>1442, 23622=>1443, 23735=>1444, 23713=>1445, 23736=>1446, 23721=>1447, 23723=>1448, 23729=>1449, 23731=>1450, 24088=>1451, 24090=>1452, 24086=>1453, 24085=>1454, 24091=>1455, 24081=>1456, 24184=>1457, 24218=>1458, 24215=>1459, 24220=>1460, 24213=>1461, 24214=>1462, 24310=>1463, 24358=>1464, 24359=>1465, 24361=>1466, 24448=>1467, 24449=>1468, 24447=>1469, 24444=>1470, 24541=>1471, 24544=>1472, 24573=>1473, 24565=>1474, 24575=>1475, 24591=>1476, 24596=>1477, 24623=>1478, 24629=>1479, 24598=>1480, 24618=>1481, 24597=>1482, 24609=>1483, 24615=>1484, 24617=>1485, 24619=>1486, 24603=>1487, 25110=>1488, 25109=>1489, 25151=>1490, 25150=>1491, 25152=>1492, 25215=>1493, 25289=>1494, 25292=>1495, 25284=>1496, 25279=>1497, 25282=>1498, 25273=>1499, 25298=>1500, 25307=>1501, 25259=>1502, 25299=>1503, 25300=>1504, 25291=>1505, 25288=>1506, 25256=>1507, 25277=>1508, 25276=>1509, 25296=>1510, 60582=>1510, 25305=>1511, 25287=>1512, 25293=>1513, 25269=>1514, 25306=>1515, 25265=>1516, 25304=>1517, 25302=>1518, 25303=>1519, 25286=>1520, 25260=>1521, 25294=>1522, 61010=>1522, 25918=>1523, 26023=>1524, 26044=>1525, 26106=>1526, 26132=>1527, 26131=>1528, 26124=>1529, 26118=>1530, 26114=>1531, 26126=>1532, 26112=>1533, 26127=>1534, 26133=>1535, 26122=>1536, 26119=>1537, 26381=>1538, 26379=>1539, 26477=>1540, 26507=>1541, 26517=>1542, 26481=>1543, 26524=>1544, 26483=>1545, 26487=>1546, 26503=>1547, 26525=>1548, 26519=>1549, 26479=>1550, 26480=>1551, 26495=>1552, 26505=>1553, 26494=>1554, 26512=>1555, 26485=>1556, 26522=>1557, 26515=>1558, 26492=>1559, 26474=>1560, 26482=>1561, 27427=>1562, 27494=>1563, 27495=>1564, 27519=>1565, 27667=>1566, 27675=>1567, 27875=>1568, 27880=>1569, 27891=>1570, 27825=>1571, 27852=>1572, 27877=>1573, 27827=>1574, 27837=>1575, 27838=>1576, 27836=>1577, 27874=>1578, 27819=>1579, 27861=>1580, 27859=>1581, 27832=>1582, 27844=>1583, 27833=>1584, 27841=>1585, 27822=>1586, 27863=>1587, 27845=>1588, 27889=>1589, 27839=>1590, 27835=>1591, 27873=>1592, 27867=>1593, 27850=>1594, 27820=>1595, 27887=>1596, 27868=>1597, 27862=>1598, 27872=>1599, 28821=>1600, 28814=>1601, 28818=>1602, 28810=>1603, 28825=>1604, 29228=>1605, 29229=>1606, 29240=>1607, 29256=>1608, 29287=>1609, 29289=>1610, 29376=>1611, 29390=>1612, 29401=>1613, 29399=>1614, 29392=>1615, 29609=>1616, 29608=>1617, 29599=>1618, 29611=>1619, 29605=>1620, 30013=>1621, 30109=>1622, 30105=>1623, 30106=>1624, 30340=>1625, 30402=>1626, 30450=>1627, 30452=>1628, 30693=>1629, 30717=>1630, 31038=>1631, 31040=>1632, 31041=>1633, 31177=>1634, 31176=>1635, 31354=>1636, 31353=>1637, 31482=>1638, 31998=>1639, 32596=>1640, 32652=>1641, 32651=>1642, 32773=>1643, 58236=>1643, 32954=>1644, 32933=>1645, 32930=>1646, 32945=>1647, 32929=>1648, 32939=>1649, 32937=>1650, 32948=>1651, 32938=>1652, 32943=>1653, 33253=>1654, 33278=>1655, 33293=>1656, 33459=>1657, 33437=>1658, 33433=>1659, 33453=>1660, 33469=>1661, 33439=>1662, 33465=>1663, 33457=>1664, 33452=>1665, 33445=>1666, 33455=>1667, 33464=>1668, 33443=>1669, 33456=>1670, 33470=>1671, 33463=>1672, 34382=>1673, 34417=>1674, 21021=>1675, 34920=>1676, 36555=>1677, 36814=>1678, 36820=>1679, 36817=>1680, 37045=>1681, 37048=>1682, 37041=>1683, 37046=>1684, 37319=>1685, 37329=>1686, 12198=>1686, 38263=>1687, 12199=>1687, 38272=>1688, 12200=>1688, 38428=>1689, 12201=>1689, 38464=>1690, 38463=>1691, 38459=>1692, 38468=>1693, 38466=>1694, 38585=>1695, 12203=>1695, 38632=>1696, 12204=>1696, 38738=>1697, 12206=>1698, 38750=>1698, 20127=>1699, 20141=>1700, 20142=>1701, 20449=>1702, 20405=>1703, 20399=>1704, 20415=>1705, 20448=>1706, 20433=>1707, 20431=>1708, 20445=>1709, 20419=>1710, 20406=>1711, 20440=>1712, 20447=>1713, 20426=>1714, 20439=>1715, 20398=>1716, 20432=>1717, 20420=>1718, 20418=>1719, 20442=>1720, 20430=>1721, 20446=>1722, 20407=>1723, 20823=>1724, 20882=>1725, 20881=>1726, 20896=>1727, 21070=>1728, 21059=>1729, 21066=>1730, 21069=>1731, 21068=>1732, 21067=>1733, 21063=>1734, 21191=>1735, 21193=>1736, 21187=>1737, 21185=>1738, 21261=>1739, 21335=>1740, 21371=>1741, 21402=>1742, 21467=>1743, 21676=>1744, 21696=>1745, 21672=>1746, 21710=>1747, 21705=>1748, 21688=>1749, 21670=>1750, 21683=>1751, 21703=>1752, 21698=>1753, 21693=>1754, 21674=>1755, 21697=>1756, 21700=>1757, 21704=>1758, 21679=>1759, 21675=>1760, 21681=>1761, 21691=>1762, 21673=>1763, 21671=>1764, 21695=>1765, 22271=>1766, 22402=>1767, 22411=>1768, 22432=>1769, 22435=>1770, 22434=>1771, 22478=>1772, 22446=>1773, 22419=>1774, 22869=>1775, 22865=>1776, 22863=>1777, 22862=>1778, 22864=>1779, 23004=>1780, 23000=>1781, 23039=>1782, 23011=>1783, 23016=>1784, 23043=>1785, 23013=>1786, 23018=>1787, 23002=>1788, 23014=>1789, 23041=>1790, 23035=>1791, 23401=>1792, 23459=>1793, 23462=>1794, 23460=>1795, 23458=>1796, 23461=>1797, 23553=>1798, 23630=>1799, 23631=>1800, 23629=>1801, 23627=>1802, 23769=>1803, 23762=>1804, 24055=>1805, 24093=>1806, 24101=>1807, 24095=>1808, 24189=>1809, 24224=>1810, 24230=>1811, 24314=>1812, 24328=>1813, 24365=>1814, 24421=>1815, 24456=>1816, 24453=>1817, 24458=>1818, 24459=>1819, 24455=>1820, 24460=>1821, 24457=>1822, 24594=>1823, 24605=>1824, 24608=>1825, 24613=>1826, 24590=>1827, 24616=>1828, 24653=>1829, 24688=>1830, 24680=>1831, 24674=>1832, 60712=>1832, 24646=>1833, 24643=>1834, 24684=>1835, 24683=>1836, 24682=>1837, 24676=>1838, 25153=>1839, 25308=>1840, 25366=>1841, 25353=>1842, 25340=>1843, 25325=>1844, 25345=>1845, 25326=>1846, 25341=>1847, 25351=>1848, 25329=>1849, 25335=>1850, 25327=>1851, 25324=>1852, 25342=>1853, 25332=>1854, 25361=>1855, 25346=>1856, 25919=>1857, 25925=>1858, 26027=>1859, 26045=>1860, 26082=>1861, 26149=>1862, 26157=>1863, 26144=>1864, 26151=>1865, 26159=>1866, 26143=>1867, 26152=>1868, 26161=>1869, 26148=>1870, 26359=>1871, 26623=>1872, 26579=>1873, 26609=>1874, 26580=>1875, 26576=>1876, 26604=>1877, 26550=>1878, 26543=>1879, 26613=>1880, 26601=>1881, 26607=>1882, 26564=>1883, 26577=>1884, 26548=>1885, 26586=>1886, 26597=>1887, 26552=>1888, 26575=>1889, 26590=>1890, 26611=>1891, 26544=>1892, 26585=>1893, 26594=>1894, 26589=>1895, 26578=>1896, 27498=>1897, 27523=>1898, 27526=>1899, 27573=>1900, 27602=>1901, 27607=>1902, 27679=>1903, 27849=>1904, 27915=>1905, 27954=>1906, 27946=>1907, 27969=>1908, 27941=>1909, 27916=>1910, 27953=>1911, 27934=>1912, 27927=>1913, 27963=>1914, 27965=>1915, 27966=>1916, 27958=>1917, 27931=>1918, 27893=>1919, 27961=>1920, 27943=>1921, 27960=>1922, 27945=>1923, 27950=>1924, 27957=>1925, 27918=>1926, 27947=>1927, 28843=>1928, 28858=>1929, 28851=>1930, 28844=>1931, 28847=>1932, 28845=>1933, 28856=>1934, 28846=>1935, 28836=>1936, 29232=>1937, 29298=>1938, 29295=>1939, 29300=>1940, 29417=>1941, 29408=>1942, 29409=>1943, 29623=>1944, 29642=>1945, 29627=>1946, 29618=>1947, 29645=>1948, 29632=>1949, 29619=>1950, 29978=>1951, 29997=>1952, 30031=>1953, 30028=>1954, 30030=>1955, 30027=>1956, 30123=>1957, 30116=>1958, 30117=>1959, 30114=>1960, 30115=>1961, 30328=>1962, 30342=>1963, 30343=>1964, 30344=>1965, 30408=>1966, 30406=>1967, 30403=>1968, 30405=>1969, 30465=>1970, 30457=>1971, 30456=>1972, 30473=>1973, 30475=>1974, 30462=>1975, 30460=>1976, 30471=>1977, 30684=>1978, 30722=>1979, 30740=>1980, 30732=>1981, 30733=>1982, 31046=>1983, 31049=>1984, 31048=>1985, 31047=>1986, 31161=>1987, 31162=>1988, 31185=>1989, 31186=>1990, 31179=>1991, 31359=>1992, 31361=>1993, 31487=>1994, 31485=>1995, 31869=>1996, 32002=>1997, 32005=>1998, 32000=>1999, 32009=>2000, 32007=>2001, 32004=>2002, 32006=>2003, 32568=>2004, 32654=>2005, 32703=>2006, 32784=>2007, 32781=>2008, 32785=>2009, 32822=>2010, 32982=>2011, 32997=>2012, 32986=>2013, 32963=>2014, 32964=>2015, 32972=>2016, 32993=>2017, 32987=>2018, 32974=>2019, 32990=>2020, 32996=>2021, 32989=>2022, 33268=>2023, 33314=>2024, 33511=>2025, 33539=>2026, 33541=>2027, 33507=>2028, 33499=>2029, 33510=>2030, 33540=>2031, 33509=>2032, 33538=>2033, 33545=>2034, 33490=>2035, 33495=>2036, 33521=>2037, 33537=>2038, 33500=>2039, 33492=>2040, 33489=>2041, 33502=>2042, 33491=>2043, 33503=>2044, 33519=>2045, 33542=>2046, 34384=>2047, 34425=>2048, 34427=>2049, 34426=>2050, 34893=>2051, 34923=>2052, 35201=>2053, 35284=>2054, 35336=>2055, 35330=>2056, 35331=>2057, 35998=>2058, 36000=>2059, 36212=>2060, 36211=>2061, 36276=>2062, 36557=>2063, 36556=>2064, 36848=>2065, 36838=>2066, 36834=>2067, 36842=>2068, 36837=>2069, 36845=>2070, 36843=>2071, 36836=>2072, 36840=>2073, 37066=>2074, 37070=>2075, 37057=>2076, 37059=>2077, 37195=>2078, 37194=>2079, 37325=>2080, 38274=>2081, 38480=>2082, 38475=>2083, 38476=>2084, 38477=>2085, 38754=>2086, 12207=>2086, 38761=>2087, 12208=>2087, 38859=>2088, 12209=>2088, 38893=>2089, 12210=>2089, 38899=>2090, 12211=>2090, 38913=>2091, 12212=>2091, 39080=>2092, 12213=>2092, 39131=>2093, 12214=>2093, 39135=>2094, 12215=>2094, 39318=>2095, 12216=>2095, 39321=>2096, 12217=>2096, 20056=>2097, 20147=>2098, 20492=>2099, 20493=>2100, 20515=>2101, 20463=>2102, 20518=>2103, 20517=>2104, 20472=>2105, 20521=>2106, 57375=>2106, 20502=>2107, 20486=>2108, 20540=>2109, 20511=>2110, 20506=>2111, 20498=>2112, 20497=>2113, 20474=>2114, 20480=>2115, 20500=>2116, 20520=>2117, 20465=>2118, 20513=>2119, 20491=>2120, 20505=>2121, 20504=>2122, 20467=>2123, 20462=>2124, 20525=>2125, 20522=>2126, 20478=>2127, 20523=>2128, 20489=>2129, 20860=>2130, 20900=>2131, 20901=>2132, 20898=>2133, 20941=>2134, 20940=>2135, 20934=>2136, 20939=>2137, 21078=>2138, 21084=>2139, 21076=>2140, 21083=>2141, 21085=>2142, 21290=>2143, 21375=>2144, 57459=>2144, 21407=>2145, 21405=>2146, 21471=>2147, 21736=>2148, 21776=>2149, 21761=>2150, 21815=>2151, 21756=>2152, 21733=>2153, 21746=>2154, 21766=>2155, 21754=>2156, 21780=>2157, 21737=>2158, 21741=>2159, 21729=>2160, 21769=>2161, 21742=>2162, 21738=>2163, 21734=>2164, 21799=>2165, 21767=>2166, 21757=>2167, 21775=>2168, 22275=>2169, 22276=>2170, 22466=>2171, 22484=>2172, 22475=>2173, 22467=>2174, 22537=>2175, 22799=>2176, 22871=>2177, 22872=>2178, 22874=>2179, 23057=>2180, 23064=>2181, 23068=>2182, 23071=>2183, 23067=>2184, 23059=>2185, 23020=>2186, 23072=>2187, 23075=>2188, 23081=>2189, 23077=>2190, 23052=>2191, 23049=>2192, 23403=>2193, 23640=>2194, 23472=>2195, 23475=>2196, 23478=>2197, 23476=>2198, 23470=>2199, 23477=>2200, 23481=>2201, 23480=>2202, 23556=>2203, 23633=>2204, 23637=>2205, 23632=>2206, 23789=>2207, 23805=>2208, 23803=>2209, 23786=>2210, 23784=>2211, 23792=>2212, 23798=>2213, 23809=>2214, 23796=>2215, 24046=>2216, 24109=>2217, 24107=>2218, 24235=>2219, 24237=>2220, 24231=>2221, 24369=>2222, 24466=>2223, 24465=>2224, 24464=>2225, 24665=>2226, 24675=>2227, 24677=>2228, 24656=>2229, 24661=>2230, 24685=>2231, 24681=>2232, 24687=>2233, 24708=>2234, 24735=>2235, 24730=>2236, 24717=>2237, 24724=>2238, 24716=>2239, 24709=>2240, 24726=>2241, 25159=>2242, 25331=>2243, 25352=>2244, 25343=>2245, 25422=>2246, 25406=>2247, 25391=>2248, 25429=>2249, 25410=>2250, 25414=>2251, 25423=>2252, 25417=>2253, 25402=>2254, 25424=>2255, 25405=>2256, 25386=>2257, 25387=>2258, 25384=>2259, 25421=>2260, 25420=>2261, 25928=>2262, 25929=>2263, 26009=>2264, 26049=>2265, 26053=>2266, 26178=>2267, 26185=>2268, 26191=>2269, 26179=>2270, 26194=>2271, 26188=>2272, 26181=>2273, 26177=>2274, 26360=>2275, 26388=>2276, 26389=>2277, 26391=>2278, 26657=>2279, 26680=>2280, 26696=>2281, 26694=>2282, 26707=>2283, 26681=>2284, 26690=>2285, 26708=>2286, 26665=>2287, 26803=>2288, 26647=>2289, 26700=>2290, 26705=>2291, 26685=>2292, 26612=>2293, 26704=>2294, 26688=>2295, 26684=>2296, 26691=>2297, 26666=>2298, 26693=>2299, 26643=>2300, 26648=>2301, 26689=>2302, 27530=>2303, 27529=>2304, 27575=>2305, 27683=>2306, 27687=>2307, 27688=>2308, 27686=>2309, 27684=>2310, 27888=>2311, 28010=>2312, 28053=>2313, 28040=>2314, 28039=>2315, 28006=>2316, 28024=>2317, 28023=>2318, 27993=>2319, 28051=>2320, 28012=>2321, 28041=>2322, 28014=>2323, 27994=>2324, 28020=>2325, 28009=>2326, 28044=>2327, 28042=>2328, 28025=>2329, 28037=>2330, 28005=>2331, 28052=>2332, 28874=>2333, 28888=>2334, 28900=>2335, 28889=>2336, 28872=>2337, 28879=>2338, 29241=>2339, 29305=>2340, 29436=>2341, 29433=>2342, 29437=>2343, 29432=>2344, 29431=>2345, 29574=>2346, 29677=>2347, 29705=>2348, 29678=>2349, 29664=>2350, 29674=>2351, 29662=>2352, 30036=>2353, 30045=>2354, 30044=>2355, 30042=>2356, 30041=>2357, 30142=>2358, 30149=>2359, 30151=>2360, 30130=>2361, 30131=>2362, 30141=>2363, 30140=>2364, 30137=>2365, 30146=>2366, 30136=>2367, 30347=>2368, 30384=>2369, 30410=>2370, 30413=>2371, 30414=>2372, 30505=>2373, 30495=>2374, 30496=>2375, 30504=>2376, 30697=>2377, 30768=>2378, 30759=>2379, 30776=>2380, 30749=>2381, 30772=>2382, 30775=>2383, 30757=>2384, 30765=>2385, 30752=>2386, 30751=>2387, 30770=>2388, 31061=>2389, 31056=>2390, 31072=>2391, 31071=>2392, 31062=>2393, 31070=>2394, 31069=>2395, 31063=>2396, 31066=>2397, 31204=>2398, 31203=>2399, 60418=>2399, 31207=>2400, 31199=>2401, 31206=>2402, 31209=>2403, 31192=>2404, 31364=>2405, 31368=>2406, 31449=>2407, 31494=>2408, 31505=>2409, 31881=>2410, 32033=>2411, 32023=>2412, 32011=>2413, 32010=>2414, 32032=>2415, 32034=>2416, 32020=>2417, 32016=>2418, 32021=>2419, 32026=>2420, 32028=>2421, 32013=>2422, 32025=>2423, 32027=>2424, 32570=>2425, 32607=>2426, 32660=>2427, 32709=>2428, 32705=>2429, 32774=>2430, 32772=>2431, 32792=>2432, 32789=>2433, 32793=>2434, 32791=>2435, 32829=>2436, 32831=>2437, 33009=>2438, 33026=>2439, 33008=>2440, 33029=>2441, 33005=>2442, 33012=>2443, 33030=>2444, 33016=>2445, 33011=>2446, 33032=>2447, 33021=>2448, 33034=>2449, 33020=>2450, 33007=>2451, 33261=>2452, 33260=>2453, 33280=>2454, 33296=>2455, 33322=>2456, 33323=>2457, 33320=>2458, 33324=>2459, 33467=>2460, 33579=>2461, 33618=>2462, 33620=>2463, 33610=>2464, 33592=>2465, 33616=>2466, 33609=>2467, 33589=>2468, 33588=>2469, 33615=>2470, 33586=>2471, 33593=>2472, 33590=>2473, 33559=>2474, 33600=>2475, 33585=>2476, 33576=>2477, 33603=>2478, 34388=>2479, 34442=>2480, 34474=>2481, 34451=>2482, 34468=>2483, 34473=>2484, 34444=>2485, 34467=>2486, 34460=>2487, 34928=>2488, 34935=>2489, 34945=>2490, 34946=>2491, 34941=>2492, 34937=>2493, 35352=>2494, 35344=>2495, 35342=>2496, 35340=>2497, 35349=>2498, 35338=>2499, 35351=>2500, 35347=>2501, 35350=>2502, 35343=>2503, 35345=>2504, 35912=>2505, 35962=>2506, 35961=>2507, 36001=>2508, 36002=>2509, 36215=>2510, 58442=>2510, 36524=>2511, 36562=>2512, 36564=>2513, 36559=>2514, 36785=>2515, 36865=>2516, 36870=>2517, 36855=>2518, 36864=>2519, 36858=>2520, 36852=>2521, 36867=>2522, 36861=>2523, 36869=>2524, 36856=>2525, 37013=>2526, 37089=>2527, 37085=>2528, 37090=>2529, 37202=>2530, 37197=>2531, 37196=>2532, 37336=>2533, 37341=>2534, 37335=>2535, 37340=>2536, 37337=>2537, 38275=>2538, 38498=>2539, 38499=>2540, 38497=>2541, 38491=>2542, 38493=>2543, 38500=>2544, 38488=>2545, 38494=>2546, 38587=>2547, 39138=>2548, 39340=>2549, 12218=>2549, 39592=>2550, 12219=>2550, 39640=>2551, 12220=>2551, 12222=>2552, 39717=>2552, 39730=>2553, 12224=>2553, 39740=>2554, 12225=>2554, 20094=>2555, 20602=>2556, 20605=>2557, 57382=>2557, 20572=>2558, 20551=>2559, 20547=>2560, 20556=>2561, 20570=>2562, 20553=>2563, 20581=>2564, 20598=>2565, 20558=>2566, 20565=>2567, 20597=>2568, 20596=>2569, 20599=>2570, 20559=>2571, 20495=>2572, 20591=>2573, 20589=>2574, 20828=>2575, 20885=>2576, 20976=>2577, 21098=>2578, 21103=>2579, 21202=>2580, 21209=>2581, 21208=>2582, 21205=>2583, 21264=>2584, 21263=>2585, 21273=>2586, 21311=>2587, 21312=>2588, 21310=>2589, 21443=>2590, 26364=>2591, 21830=>2592, 21866=>2593, 21862=>2594, 21828=>2595, 21854=>2596, 21857=>2597, 21827=>2598, 21834=>2599, 21809=>2600, 21846=>2601, 21839=>2602, 21845=>2603, 21807=>2604, 21860=>2605, 21816=>2606, 21806=>2607, 21852=>2608, 21804=>2609, 21859=>2610, 21811=>2611, 21825=>2612, 21847=>2613, 22280=>2614, 22283=>2615, 22281=>2616, 22495=>2617, 22533=>2618, 22538=>2619, 22534=>2620, 22496=>2621, 22500=>2622, 22522=>2623, 22530=>2624, 22581=>2625, 22519=>2626, 22521=>2627, 22816=>2628, 22882=>2629, 23094=>2630, 23105=>2631, 23113=>2632, 23142=>2633, 23146=>2634, 23104=>2635, 23100=>2636, 23138=>2637, 23130=>2638, 23110=>2639, 23114=>2640, 23408=>2641, 23495=>2642, 23493=>2643, 23492=>2644, 23490=>2645, 23487=>2646, 23494=>2647, 23561=>2648, 23560=>2649, 23559=>2650, 23648=>2651, 23644=>2652, 23645=>2653, 23815=>2654, 23814=>2655, 23822=>2656, 23835=>2657, 23830=>2658, 23842=>2659, 23825=>2660, 23849=>2661, 23828=>2662, 23833=>2663, 23844=>2664, 23847=>2665, 23831=>2666, 24034=>2667, 24120=>2668, 24118=>2669, 24115=>2670, 24119=>2671, 24247=>2672, 24248=>2673, 24246=>2674, 24245=>2675, 24254=>2676, 24373=>2677, 24375=>2678, 24407=>2679, 24428=>2680, 24425=>2681, 24427=>2682, 24471=>2683, 24473=>2684, 24478=>2685, 24472=>2686, 24481=>2687, 24480=>2688, 24476=>2689, 24703=>2690, 24739=>2691, 24713=>2692, 24736=>2693, 24744=>2694, 24779=>2695, 24756=>2696, 24806=>2697, 24765=>2698, 24773=>2699, 24763=>2700, 24757=>2701, 24796=>2702, 24764=>2703, 24792=>2704, 24789=>2705, 24774=>2706, 24799=>2707, 24760=>2708, 24794=>2709, 24775=>2710, 25114=>2711, 25115=>2712, 25160=>2713, 25504=>2714, 25511=>2715, 25458=>2716, 25494=>2717, 25506=>2718, 25509=>2719, 25463=>2720, 25447=>2721, 25496=>2722, 25514=>2723, 25457=>2724, 25513=>2725, 25481=>2726, 25475=>2727, 25499=>2728, 25451=>2729, 25512=>2730, 25476=>2731, 25480=>2732, 25497=>2733, 25505=>2734, 25516=>2735, 25490=>2736, 25487=>2737, 25472=>2738, 25467=>2739, 25449=>2740, 25448=>2741, 25466=>2742, 25949=>2743, 25942=>2744, 25937=>2745, 25945=>2746, 25943=>2747, 21855=>2748, 25935=>2749, 25944=>2750, 25941=>2751, 25940=>2752, 26012=>2753, 26011=>2754, 26028=>2755, 26063=>2756, 26059=>2757, 26060=>2758, 26062=>2759, 26205=>2760, 26202=>2761, 26212=>2762, 26216=>2763, 26214=>2764, 26206=>2765, 26361=>2766, 21207=>2767, 26395=>2768, 26753=>2769, 26799=>2770, 26786=>2771, 26771=>2772, 26805=>2773, 26751=>2774, 26742=>2775, 26801=>2776, 26791=>2777, 26775=>2778, 26800=>2779, 26755=>2780, 26820=>2781, 26797=>2782, 26758=>2783, 26757=>2784, 26772=>2785, 26781=>2786, 26792=>2787, 26783=>2788, 26785=>2789, 26754=>2790, 27442=>2791, 27578=>2792, 27627=>2793, 27628=>2794, 27691=>2795, 28046=>2796, 28092=>2797, 28147=>2798, 28121=>2799, 28082=>2800, 28129=>2801, 28108=>2802, 28132=>2803, 28155=>2804, 28154=>2805, 28165=>2806, 28103=>2807, 28107=>2808, 28079=>2809, 28113=>2810, 28078=>2811, 28126=>2812, 28153=>2813, 28088=>2814, 28151=>2815, 28149=>2816, 28101=>2817, 28114=>2818, 28186=>2819, 28085=>2820, 28122=>2821, 28139=>2822, 28120=>2823, 28138=>2824, 28145=>2825, 28142=>2826, 28136=>2827, 28102=>2828, 28100=>2829, 28074=>2830, 28140=>2831, 28095=>2832, 28134=>2833, 28921=>2834, 28937=>2835, 28938=>2836, 28925=>2837, 28911=>2838, 29245=>2839, 29309=>2840, 29313=>2841, 29468=>2842, 29467=>2843, 29462=>2844, 29459=>2845, 29465=>2846, 29575=>2847, 29701=>2848, 29706=>2849, 29699=>2850, 29702=>2851, 29694=>2852, 29709=>2853, 29920=>2854, 29942=>2855, 29943=>2856, 29980=>2857, 29986=>2858, 30053=>2859, 30054=>2860, 30050=>2861, 30064=>2862, 30095=>2863, 30164=>2864, 30165=>2865, 30133=>2866, 30154=>2867, 30157=>2868, 30350=>2869, 30420=>2870, 30418=>2871, 30427=>2872, 30519=>2873, 30526=>2874, 30524=>2875, 30518=>2876, 30520=>2877, 30522=>2878, 30827=>2879, 30787=>2880, 30798=>2881, 31077=>2882, 31080=>2883, 31085=>2884, 31227=>2885, 31378=>2886, 31381=>2887, 31520=>2888, 31528=>2889, 31515=>2890, 31532=>2891, 31526=>2892, 31513=>2893, 31518=>2894, 31534=>2895, 31890=>2896, 31895=>2897, 31893=>2898, 32070=>2899, 32067=>2900, 32113=>2901, 32046=>2902, 32057=>2903, 32060=>2904, 32064=>2905, 32048=>2906, 32051=>2907, 32068=>2908, 32047=>2909, 32066=>2910, 32050=>2911, 32049=>2912, 32573=>2913, 32670=>2914, 32666=>2915, 32716=>2916, 32718=>2917, 32722=>2918, 32796=>2919, 32842=>2920, 32838=>2921, 33071=>2922, 33046=>2923, 33059=>2924, 33067=>2925, 33065=>2926, 33072=>2927, 33060=>2928, 33282=>2929, 33333=>2930, 33335=>2931, 33334=>2932, 33337=>2933, 33678=>2934, 33694=>2935, 33688=>2936, 33656=>2937, 33698=>2938, 33686=>2939, 33725=>2940, 33707=>2941, 33682=>2942, 33674=>2943, 33683=>2944, 33673=>2945, 33696=>2946, 33655=>2947, 33659=>2948, 33660=>2949, 33670=>2950, 33703=>2951, 34389=>2952, 24426=>2953, 34503=>2954, 34496=>2955, 34486=>2956, 34500=>2957, 34485=>2958, 34502=>2959, 34507=>2960, 34481=>2961, 34479=>2962, 34505=>2963, 34899=>2964, 34974=>2965, 34952=>2966, 34987=>2967, 34962=>2968, 34966=>2969, 34957=>2970, 34955=>2971, 35219=>2972, 35215=>2973, 35370=>2974, 35357=>2975, 35363=>2976, 35365=>2977, 35377=>2978, 35373=>2979, 35359=>2980, 35355=>2981, 35362=>2982, 35913=>2983, 35930=>2984, 36009=>2985, 36012=>2986, 36011=>2987, 36008=>2988, 36010=>2989, 36007=>2990, 36199=>2991, 36198=>2992, 36286=>2993, 36282=>2994, 36571=>2995, 36575=>2996, 36889=>2997, 36877=>2998, 36890=>2999, 36887=>3000, 36899=>3001, 36895=>3002, 36893=>3003, 36880=>3004, 36885=>3005, 36894=>3006, 36896=>3007, 36879=>3008, 36898=>3009, 36886=>3010, 36891=>3011, 36884=>3012, 37096=>3013, 37101=>3014, 37117=>3015, 58488=>3015, 37207=>3016, 37326=>3017, 37365=>3018, 37350=>3019, 37347=>3020, 37351=>3021, 37357=>3022, 37353=>3023, 38281=>3024, 38506=>3025, 38517=>3026, 38515=>3027, 38520=>3028, 38512=>3029, 38516=>3030, 38518=>3031, 38519=>3032, 38508=>3033, 38592=>3034, 38634=>3035, 38633=>3036, 31456=>3037, 31455=>3038, 38914=>3039, 38915=>3040, 39770=>3041, 12226=>3041, 40165=>3042, 12227=>3042, 40565=>3043, 12228=>3043, 40575=>3044, 12229=>3044, 40613=>3045, 12230=>3045, 40635=>3046, 12231=>3046, 20642=>3047, 20621=>3048, 20613=>3049, 20633=>3050, 20625=>3051, 20608=>3052, 20630=>3053, 20632=>3054, 20634=>3055, 26368=>3056, 20977=>3057, 21106=>3058, 21108=>3059, 21109=>3060, 21097=>3061, 21214=>3062, 21213=>3063, 21211=>3064, 21338=>3065, 21413=>3066, 21883=>3067, 21888=>3068, 21927=>3069, 21884=>3070, 21898=>3071, 21917=>3072, 21912=>3073, 21890=>3074, 21916=>3075, 21930=>3076, 21908=>3077, 21895=>3078, 21899=>3079, 21891=>3080, 21939=>3081, 21934=>3082, 21919=>3083, 21822=>3084, 21938=>3085, 21914=>3086, 21947=>3087, 21932=>3088, 21937=>3089, 21886=>3090, 21897=>3091, 21931=>3092, 21913=>3093, 22285=>3094, 22575=>3095, 22570=>3096, 22580=>3097, 22564=>3098, 22576=>3099, 22577=>3100, 22561=>3101, 22557=>3102, 22560=>3103, 22777=>3104, 22778=>3105, 22880=>3106, 23159=>3107, 57587=>3107, 23194=>3108, 23167=>3109, 23186=>3110, 23195=>3111, 23207=>3112, 23411=>3113, 23409=>3114, 23506=>3115, 23500=>3116, 23507=>3117, 23504=>3118, 23562=>3119, 23563=>3120, 23601=>3121, 23884=>3122, 23888=>3123, 23860=>3124, 23879=>3125, 24061=>3126, 24133=>3127, 24125=>3128, 24128=>3129, 24131=>3130, 24190=>3131, 24266=>3132, 24257=>3133, 24258=>3134, 24260=>3135, 24380=>3136, 24429=>3137, 24489=>3138, 24490=>3139, 24488=>3140, 24785=>3141, 24801=>3142, 24754=>3143, 24758=>3144, 24800=>3145, 24860=>3146, 24867=>3147, 24826=>3148, 24853=>3149, 24816=>3150, 24827=>3151, 24820=>3152, 24936=>3153, 24817=>3154, 24846=>3155, 24822=>3156, 24841=>3157, 24832=>3158, 24850=>3159, 25119=>3160, 25161=>3161, 25507=>3162, 25484=>3163, 25551=>3164, 25536=>3165, 25577=>3166, 25545=>3167, 25542=>3168, 25549=>3169, 25554=>3170, 25571=>3171, 25552=>3172, 25569=>3173, 25558=>3174, 25581=>3175, 25582=>3176, 25462=>3177, 25588=>3178, 25578=>3179, 25563=>3180, 25682=>3181, 25562=>3182, 25593=>3183, 25950=>3184, 25958=>3185, 25954=>3186, 25955=>3187, 26001=>3188, 26000=>3189, 26031=>3190, 26222=>3191, 26224=>3192, 26228=>3193, 57786=>3193, 26230=>3194, 26223=>3195, 26257=>3196, 26234=>3197, 26238=>3198, 26231=>3199, 26366=>3200, 26367=>3201, 26399=>3202, 26397=>3203, 26874=>3204, 26837=>3205, 26848=>3206, 26840=>3207, 26839=>3208, 26885=>3209, 26847=>3210, 26869=>3211, 26862=>3212, 26855=>3213, 26873=>3214, 26834=>3215, 26866=>3216, 26851=>3217, 26827=>3218, 26829=>3219, 26893=>3220, 26898=>3221, 26894=>3222, 26825=>3223, 26842=>3224, 26990=>3225, 26875=>3226, 27454=>3227, 27450=>3228, 27453=>3229, 27544=>3230, 27542=>3231, 27580=>3232, 27631=>3233, 27694=>3234, 27695=>3235, 27692=>3236, 28207=>3237, 57904=>3237, 28216=>3238, 28244=>3239, 28193=>3240, 28210=>3241, 28263=>3242, 28234=>3243, 28192=>3244, 28197=>3245, 28195=>3246, 28187=>3247, 28251=>3248, 28248=>3249, 28196=>3250, 28246=>3251, 28270=>3252, 28205=>3253, 28198=>3254, 28271=>3255, 28212=>3256, 28237=>3257, 28218=>3258, 28204=>3259, 28227=>3260, 28189=>3261, 57901=>3261, 28222=>3262, 28363=>3263, 28297=>3264, 28185=>3265, 28238=>3266, 28259=>3267, 28228=>3268, 28274=>3269, 28265=>3270, 28255=>3271, 28953=>3272, 28954=>3273, 28966=>3274, 28976=>3275, 28961=>3276, 28982=>3277, 29038=>3278, 57958=>3278, 28956=>3279, 29260=>3280, 29316=>3281, 29312=>3282, 29494=>3283, 29477=>3284, 29492=>3285, 29481=>3286, 29754=>3287, 29738=>3288, 29747=>3289, 29730=>3290, 29733=>3291, 29749=>3292, 29750=>3293, 29748=>3294, 29743=>3295, 29723=>3296, 29734=>3297, 29736=>3298, 29989=>3299, 29990=>3300, 30059=>3301, 30058=>3302, 30178=>3303, 30171=>3304, 30179=>3305, 30169=>3306, 30168=>3307, 30174=>3308, 30176=>3309, 30331=>3310, 30332=>3311, 30358=>3312, 30355=>3313, 30388=>3314, 30428=>3315, 30543=>3316, 30701=>3317, 30813=>3318, 30828=>3319, 30831=>3320, 31245=>3321, 31240=>3322, 31243=>3323, 31237=>3324, 31232=>3325, 31384=>3326, 31383=>3327, 31382=>3328, 31461=>3329, 31459=>3330, 31561=>3331, 31574=>3332, 31558=>3333, 31568=>3334, 31570=>3335, 31572=>3336, 31565=>3337, 31563=>3338, 31567=>3339, 31569=>3340, 60510=>3340, 31903=>3341, 31909=>3342, 32094=>3343, 32080=>3344, 32104=>3345, 32085=>3346, 32043=>3347, 32110=>3348, 32114=>3349, 32097=>3350, 32102=>3351, 32098=>3352, 32112=>3353, 32115=>3354, 21892=>3355, 32724=>3356, 32725=>3357, 32779=>3358, 32850=>3359, 32901=>3360, 33109=>3361, 33108=>3362, 33099=>3363, 33105=>3364, 33102=>3365, 33081=>3366, 33094=>3367, 33086=>3368, 33100=>3369, 33107=>3370, 33140=>3371, 33298=>3372, 33308=>3373, 33769=>3374, 33795=>3375, 33784=>3376, 33805=>3377, 33760=>3378, 33733=>3379, 33803=>3380, 33729=>3381, 58309=>3381, 33775=>3382, 33777=>3383, 33780=>3384, 33879=>3385, 33802=>3386, 33776=>3387, 33804=>3388, 33740=>3389, 33789=>3390, 33778=>3391, 33738=>3392, 33848=>3393, 33806=>3394, 33796=>3395, 33756=>3396, 33799=>3397, 33748=>3398, 33759=>3399, 34395=>3400, 34527=>3401, 34521=>3402, 34541=>3403, 34516=>3404, 34523=>3405, 34532=>3406, 34512=>3407, 34526=>3408, 34903=>3409, 35009=>3410, 35010=>3411, 34993=>3412, 35203=>3413, 35222=>3414, 35387=>3415, 35424=>3416, 35413=>3417, 35422=>3418, 35388=>3419, 35393=>3420, 35412=>3421, 35419=>3422, 35408=>3423, 35398=>3424, 35380=>3425, 35386=>3426, 35382=>3427, 35414=>3428, 35937=>3429, 35970=>3430, 36015=>3431, 36028=>3432, 36019=>3433, 36029=>3434, 36033=>3435, 36027=>3436, 36032=>3437, 36020=>3438, 36023=>3439, 36022=>3440, 36031=>3441, 36024=>3442, 36234=>3443, 36229=>3444, 36225=>3445, 36302=>3446, 36317=>3447, 36299=>3448, 36314=>3449, 36305=>3450, 36300=>3451, 36315=>3452, 36294=>3453, 36603=>3454, 36600=>3455, 36604=>3456, 36764=>3457, 36910=>3458, 36917=>3459, 36913=>3460, 36920=>3461, 36914=>3462, 36918=>3463, 37122=>3464, 37109=>3465, 37129=>3466, 37118=>3467, 37219=>3468, 37221=>3469, 37327=>3470, 37396=>3471, 37397=>3472, 37411=>3473, 37385=>3474, 37406=>3475, 37389=>3476, 37392=>3477, 37383=>3478, 37393=>3479, 38292=>3480, 38287=>3481, 38283=>3482, 38289=>3483, 38291=>3484, 38290=>3485, 38286=>3486, 38538=>3487, 38542=>3488, 38539=>3489, 38525=>3490, 38533=>3491, 38534=>3492, 38541=>3493, 38514=>3494, 38532=>3495, 38593=>3496, 38597=>3497, 38596=>3498, 38598=>3499, 38599=>3500, 38639=>3501, 38642=>3502, 38860=>3503, 38917=>3504, 38918=>3505, 38920=>3506, 39143=>3507, 39146=>3508, 39151=>3509, 39145=>3510, 39154=>3511, 39149=>3512, 39342=>3513, 39341=>3514, 40643=>3515, 12232=>3515, 40653=>3516, 12233=>3516, 40657=>3517, 12234=>3517, 20098=>3518, 20653=>3519, 20661=>3520, 20658=>3521, 20659=>3522, 20677=>3523, 20670=>3524, 20652=>3525, 20663=>3526, 20667=>3527, 20655=>3528, 20679=>3529, 21119=>3530, 21111=>3531, 21117=>3532, 21215=>3533, 21222=>3534, 21220=>3535, 21218=>3536, 21219=>3537, 21295=>3538, 21983=>3539, 21992=>3540, 21971=>3541, 21990=>3542, 21966=>3543, 21980=>3544, 21959=>3545, 21969=>3546, 21987=>3547, 21988=>3548, 21999=>3549, 21978=>3550, 21985=>3551, 21957=>3552, 21958=>3553, 21989=>3554, 21961=>3555, 22290=>3556, 22291=>3557, 22622=>3558, 22609=>3559, 22616=>3560, 22615=>3561, 22618=>3562, 22612=>3563, 22635=>3564, 22604=>3565, 22637=>3566, 22602=>3567, 22626=>3568, 22610=>3569, 22603=>3570, 22887=>3571, 23233=>3572, 23241=>3573, 23244=>3574, 23230=>3575, 23229=>3576, 23228=>3577, 23219=>3578, 23234=>3579, 23218=>3580, 23913=>3581, 23919=>3582, 24140=>3583, 24185=>3584, 24265=>3585, 24264=>3586, 24338=>3587, 24409=>3588, 24492=>3589, 24494=>3590, 24858=>3591, 24847=>3592, 24904=>3593, 24863=>3594, 24819=>3595, 24859=>3596, 24825=>3597, 24833=>3598, 24840=>3599, 24910=>3600, 24908=>3601, 24900=>3602, 24909=>3603, 24894=>3604, 24884=>3605, 24871=>3606, 24845=>3607, 24838=>3608, 24887=>3609, 25121=>3610, 25122=>3611, 25619=>3612, 25662=>3613, 25630=>3614, 25642=>3615, 25645=>3616, 25661=>3617, 25644=>3618, 25615=>3619, 25628=>3620, 25620=>3621, 25613=>3622, 25654=>3623, 25622=>3624, 25623=>3625, 25606=>3626, 25964=>3627, 26015=>3628, 26032=>3629, 26263=>3630, 26249=>3631, 26247=>3632, 26248=>3633, 26262=>3634, 26244=>3635, 26264=>3636, 26253=>3637, 26371=>3638, 27028=>3639, 26989=>3640, 26970=>3641, 26999=>3642, 26976=>3643, 26964=>3644, 26997=>3645, 26928=>3646, 27010=>3647, 26954=>3648, 26984=>3649, 26987=>3650, 26974=>3651, 26963=>3652, 27001=>3653, 27014=>3654, 26973=>3655, 26979=>3656, 26971=>3657, 27463=>3658, 27506=>3659, 27584=>3660, 27583=>3661, 27603=>3662, 27645=>3663, 28322=>3664, 28335=>3665, 28371=>3666, 28342=>3667, 28354=>3668, 28304=>3669, 28317=>3670, 28359=>3671, 28357=>3672, 28325=>3673, 28312=>3674, 28348=>3675, 28346=>3676, 28331=>3677, 28369=>3678, 28310=>3679, 28316=>3680, 28356=>3681, 28372=>3682, 28330=>3683, 28327=>3684, 28340=>3685, 29006=>3686, 29017=>3687, 29033=>3688, 29028=>3689, 29001=>3690, 29031=>3691, 29020=>3692, 29036=>3693, 29030=>3694, 29004=>3695, 29029=>3696, 29022=>3697, 28998=>3698, 29032=>3699, 29014=>3700, 29242=>3701, 29266=>3702, 29495=>3703, 29509=>3704, 29503=>3705, 29502=>3706, 29807=>3707, 29786=>3708, 29781=>3709, 29791=>3710, 29790=>3711, 29761=>3712, 29759=>3713, 29785=>3714, 29787=>3715, 58019=>3716, 29788=>3716, 30070=>3717, 30072=>3718, 30208=>3719, 30192=>3720, 30209=>3721, 30194=>3722, 30193=>3723, 30202=>3724, 30207=>3725, 30196=>3726, 30195=>3727, 30430=>3728, 30431=>3729, 30555=>3730, 30571=>3731, 30566=>3732, 30558=>3733, 30563=>3734, 30585=>3735, 30570=>3736, 30572=>3737, 30556=>3738, 30565=>3739, 30568=>3740, 30562=>3741, 30702=>3742, 30862=>3743, 30896=>3744, 30871=>3745, 30872=>3746, 30860=>3747, 30857=>3748, 30844=>3749, 30865=>3750, 30867=>3751, 30847=>3752, 31098=>3753, 31103=>3754, 31105=>3755, 33836=>3756, 31165=>3757, 31260=>3758, 31258=>3759, 31264=>3760, 31252=>3761, 31263=>3762, 31262=>3763, 31391=>3764, 31392=>3765, 31607=>3766, 31680=>3767, 31584=>3768, 31598=>3769, 31591=>3770, 31921=>3771, 31923=>3772, 31925=>3773, 32147=>3774, 32121=>3775, 32145=>3776, 32129=>3777, 32143=>3778, 32091=>3779, 32622=>3780, 32617=>3781, 32618=>3782, 32626=>3783, 32681=>3784, 32680=>3785, 32676=>3786, 32854=>3787, 32856=>3788, 32902=>3789, 32900=>3790, 33137=>3791, 33136=>3792, 33144=>3793, 33125=>3794, 33134=>3795, 33139=>3796, 33131=>3797, 33145=>3798, 33146=>3799, 33126=>3800, 33285=>3801, 33351=>3802, 33922=>3803, 33911=>3804, 33853=>3805, 33841=>3806, 33909=>3807, 33894=>3808, 33899=>3809, 33865=>3810, 33900=>3811, 33883=>3812, 33852=>3813, 33845=>3814, 33889=>3815, 33891=>3816, 33897=>3817, 33901=>3818, 33862=>3819, 34398=>3820, 34396=>3821, 34399=>3822, 34553=>3823, 34579=>3824, 34568=>3825, 34567=>3826, 34560=>3827, 34558=>3828, 34555=>3829, 34562=>3830, 34563=>3831, 34566=>3832, 34570=>3833, 34905=>3834, 35039=>3835, 35028=>3836, 35033=>3837, 35036=>3838, 35032=>3839, 35037=>3840, 35041=>3841, 35018=>3842, 35029=>3843, 35026=>3844, 35228=>3845, 35299=>3846, 35435=>3847, 35442=>3848, 35443=>3849, 35430=>3850, 35433=>3851, 35440=>3852, 35463=>3853, 35452=>3854, 35427=>3855, 35488=>3856, 35441=>3857, 35461=>3858, 35437=>3859, 35426=>3860, 35438=>3861, 35436=>3862, 35449=>3863, 35451=>3864, 35390=>3865, 35432=>3866, 35938=>3867, 35978=>3868, 35977=>3869, 36042=>3870, 36039=>3871, 36040=>3872, 36036=>3873, 36018=>3874, 36035=>3875, 36034=>3876, 36037=>3877, 36321=>3878, 36319=>3879, 36328=>3880, 36335=>3881, 36339=>3882, 36346=>3883, 36330=>3884, 36324=>3885, 36326=>3886, 36530=>3887, 36611=>3888, 36617=>3889, 36606=>3890, 36618=>3891, 36767=>3892, 36786=>3893, 36939=>3894, 36938=>3895, 36947=>3896, 36930=>3897, 36948=>3898, 36924=>3899, 36949=>3900, 36944=>3901, 36935=>3902, 36943=>3903, 36942=>3904, 36941=>3905, 36945=>3906, 36926=>3907, 36929=>3908, 37138=>3909, 37143=>3910, 37228=>3911, 37226=>3912, 37225=>3913, 37321=>3914, 37431=>3915, 37463=>3916, 37432=>3917, 37437=>3918, 37440=>3919, 37438=>3920, 37467=>3921, 37451=>3922, 37476=>3923, 37457=>3924, 37428=>3925, 37449=>3926, 37453=>3927, 37445=>3928, 37433=>3929, 37439=>3930, 37466=>3931, 38296=>3932, 38552=>3933, 38548=>3934, 38549=>3935, 38605=>3936, 38603=>3937, 38601=>3938, 38602=>3939, 38647=>3940, 38651=>3941, 38649=>3942, 38646=>3943, 38742=>3944, 38772=>3945, 38774=>3946, 38928=>3947, 38929=>3948, 38931=>3949, 38922=>3950, 38930=>3951, 38924=>3952, 39164=>3953, 39156=>3954, 39165=>3955, 39166=>3956, 39347=>3957, 39345=>3958, 39348=>3959, 39649=>3960, 40169=>3961, 40578=>3962, 40718=>3963, 12237=>3963, 40723=>3964, 12238=>3964, 40736=>3965, 12239=>3965, 20711=>3966, 20718=>3967, 20709=>3968, 20694=>3969, 20717=>3970, 60903=>3970, 20698=>3971, 20693=>3972, 20687=>3973, 20689=>3974, 20721=>3975, 20686=>3976, 20713=>3977, 20834=>3978, 20979=>3979, 21123=>3980, 21122=>3981, 21297=>3982, 21421=>3983, 22014=>3984, 22016=>3985, 22043=>3986, 22039=>3987, 22013=>3988, 22036=>3989, 22022=>3990, 22025=>3991, 22029=>3992, 22030=>3993, 22007=>3994, 22038=>3995, 22047=>3996, 22024=>3997, 22032=>3998, 22006=>3999, 22296=>4000, 22294=>4001, 22645=>4002, 22654=>4003, 22659=>4004, 22675=>4005, 22666=>4006, 22649=>4007, 22661=>4008, 22653=>4009, 22781=>4010, 22821=>4011, 22818=>4012, 22820=>4013, 22890=>4014, 22889=>4015, 23265=>4016, 23270=>4017, 23273=>4018, 23255=>4019, 23254=>4020, 23256=>4021, 23267=>4022, 23413=>4023, 23518=>4024, 23527=>4025, 23521=>4026, 23525=>4027, 23526=>4028, 23528=>4029, 23522=>4030, 23524=>4031, 23519=>4032, 23565=>4033, 23650=>4034, 23940=>4035, 23943=>4036, 24155=>4037, 24163=>4038, 24149=>4039, 24151=>4040, 24148=>4041, 24275=>4042, 24278=>4043, 24330=>4044, 24390=>4045, 24432=>4046, 24505=>4047, 24903=>4048, 24895=>4049, 24907=>4050, 24951=>4051, 24930=>4052, 24931=>4053, 24927=>4054, 24922=>4055, 24920=>4056, 24949=>4057, 25130=>4058, 25735=>4059, 25688=>4060, 25684=>4061, 25764=>4062, 25720=>4063, 25695=>4064, 25722=>4065, 25681=>4066, 25703=>4067, 25652=>4068, 25709=>4069, 25723=>4070, 25970=>4071, 26017=>4072, 26071=>4073, 26070=>4074, 26274=>4075, 26280=>4076, 26269=>4077, 27036=>4078, 27048=>4079, 27029=>4080, 27073=>4081, 27054=>4082, 27091=>4083, 27083=>4084, 27035=>4085, 27063=>4086, 27067=>4087, 27051=>4088, 27060=>4089, 27088=>4090, 27085=>4091, 27053=>4092, 27084=>4093, 27046=>4094, 27075=>4095, 27043=>4096, 27465=>4097, 27468=>4098, 27699=>4099, 28467=>4100, 28436=>4101, 28414=>4102, 28435=>4103, 28404=>4104, 28457=>4105, 28478=>4106, 28448=>4107, 28460=>4108, 28431=>4109, 28418=>4110, 28450=>4111, 28415=>4112, 28399=>4113, 28422=>4114, 28465=>4115, 28472=>4116, 28466=>4117, 28451=>4118, 28437=>4119, 28459=>4120, 28463=>4121, 28552=>4122, 28458=>4123, 28396=>4124, 28417=>4125, 28402=>4126, 28364=>4127, 28407=>4128, 29076=>4129, 29081=>4130, 29053=>4131, 29066=>4132, 29060=>4133, 29074=>4134, 29246=>4135, 29330=>4136, 29334=>4137, 29508=>4138, 29520=>4139, 29796=>4140, 29795=>4141, 29802=>4142, 29808=>4143, 29805=>4144, 29956=>4145, 30097=>4146, 30247=>4147, 30221=>4148, 30219=>4149, 30217=>4150, 30227=>4151, 30433=>4152, 30435=>4153, 30596=>4154, 30589=>4155, 30591=>4156, 30561=>4157, 30913=>4158, 30879=>4159, 30887=>4160, 30899=>4161, 30889=>4162, 30883=>4163, 31118=>4164, 31119=>4165, 31117=>4166, 31278=>4167, 31281=>4168, 31402=>4169, 31401=>4170, 31469=>4171, 31471=>4172, 31649=>4173, 31637=>4174, 31627=>4175, 31605=>4176, 31639=>4177, 31645=>4178, 31636=>4179, 31631=>4180, 31672=>4181, 58170=>4181, 31623=>4182, 31620=>4183, 31929=>4184, 31933=>4185, 31934=>4186, 32187=>4187, 32176=>4188, 32156=>4189, 32189=>4190, 32190=>4191, 32160=>4192, 32202=>4193, 32180=>4194, 32178=>4195, 32177=>4196, 32186=>4197, 32162=>4198, 32191=>4199, 32181=>4200, 32184=>4201, 32173=>4202, 32210=>4203, 58202=>4203, 32199=>4204, 32172=>4205, 32624=>4206, 32736=>4207, 32737=>4208, 32735=>4209, 32862=>4210, 32858=>4211, 32903=>4212, 33104=>4213, 33152=>4214, 33167=>4215, 33160=>4216, 33162=>4217, 33151=>4218, 33154=>4219, 33255=>4220, 33274=>4221, 33287=>4222, 33300=>4223, 33310=>4224, 33355=>4225, 33993=>4226, 33983=>4227, 33990=>4228, 33988=>4229, 33945=>4230, 33950=>4231, 33970=>4232, 33948=>4233, 33995=>4234, 33976=>4235, 33984=>4236, 34003=>4237, 33936=>4238, 33980=>4239, 34001=>4240, 33994=>4241, 34623=>4242, 34588=>4243, 34619=>4244, 34594=>4245, 34597=>4246, 34612=>4247, 34584=>4248, 34645=>4249, 34615=>4250, 34601=>4251, 35059=>4252, 35074=>4253, 35060=>4254, 35065=>4255, 35064=>4256, 35069=>4257, 35048=>4258, 35098=>4259, 35055=>4260, 35494=>4261, 35468=>4262, 35486=>4263, 35491=>4264, 35469=>4265, 35489=>4266, 35475=>4267, 35492=>4268, 35498=>4269, 35493=>4270, 35496=>4271, 35480=>4272, 35473=>4273, 35482=>4274, 35495=>4275, 35946=>4276, 35981=>4277, 35980=>4278, 36051=>4279, 36049=>4280, 36050=>4281, 36203=>4282, 36249=>4283, 36245=>4284, 36348=>4285, 36628=>4286, 36626=>4287, 36629=>4288, 36627=>4289, 36771=>4290, 36960=>4291, 36952=>4292, 36956=>4293, 36963=>4294, 36953=>4295, 36958=>4296, 36962=>4297, 36957=>4298, 36955=>4299, 37145=>4300, 37144=>4301, 37150=>4302, 37237=>4303, 37240=>4304, 37239=>4305, 37236=>4306, 37496=>4307, 37548=>4308, 37504=>4309, 37509=>4310, 37528=>4311, 37526=>4312, 37499=>4313, 37523=>4314, 37532=>4315, 37544=>4316, 37500=>4317, 37521=>4318, 38305=>4319, 38312=>4320, 38313=>4321, 38307=>4322, 38309=>4323, 38308=>4324, 38553=>4325, 38556=>4326, 38555=>4327, 38604=>4328, 38610=>4329, 38656=>4330, 38780=>4331, 38789=>4332, 38902=>4333, 38935=>4334, 38936=>4335, 39087=>4336, 39089=>4337, 39171=>4338, 39173=>4339, 39180=>4340, 39177=>4341, 39361=>4342, 39599=>4343, 39600=>4344, 39654=>4345, 39745=>4346, 39746=>4347, 40180=>4348, 40182=>4349, 40179=>4350, 40636=>4351, 40763=>4352, 12240=>4352, 40778=>4353, 12241=>4353, 20740=>4354, 20736=>4355, 20731=>4356, 20725=>4357, 20729=>4358, 20738=>4359, 20744=>4360, 20745=>4361, 20741=>4362, 20956=>4363, 21127=>4364, 21128=>4365, 21129=>4366, 21133=>4367, 21130=>4368, 21232=>4369, 21426=>4370, 22062=>4371, 22075=>4372, 22073=>4373, 22066=>4374, 22079=>4375, 22068=>4376, 22057=>4377, 22099=>4378, 22094=>4379, 22103=>4380, 22132=>4381, 22070=>4382, 22063=>4383, 22064=>4384, 22656=>4385, 22687=>4386, 22686=>4387, 22707=>4388, 22684=>4389, 22702=>4390, 22697=>4391, 22694=>4392, 22893=>4393, 23305=>4394, 23291=>4395, 23307=>4396, 23285=>4397, 23308=>4398, 23304=>4399, 23534=>4400, 23532=>4401, 23529=>4402, 23531=>4403, 23652=>4404, 23653=>4405, 23965=>4406, 23956=>4407, 24162=>4408, 24159=>4409, 24161=>4410, 24290=>4411, 24282=>4412, 24287=>4413, 24285=>4414, 24291=>4415, 24288=>4416, 24392=>4417, 24433=>4418, 24503=>4419, 24501=>4420, 24950=>4421, 24935=>4422, 24942=>4423, 24925=>4424, 24917=>4425, 24962=>4426, 24956=>4427, 24944=>4428, 24939=>4429, 24958=>4430, 24999=>4431, 24976=>4432, 25003=>4433, 24974=>4434, 25004=>4435, 24986=>4436, 24996=>4437, 24980=>4438, 25006=>4439, 25134=>4440, 25705=>4441, 25711=>4442, 25721=>4443, 25758=>4444, 25778=>4445, 25736=>4446, 25744=>4447, 57745=>4447, 25776=>4448, 25765=>4449, 25747=>4450, 25749=>4451, 25769=>4452, 25746=>4453, 25774=>4454, 25773=>4455, 25771=>4456, 25754=>4457, 25772=>4458, 25753=>4459, 25762=>4460, 25779=>4461, 25973=>4462, 25975=>4463, 25976=>4464, 26286=>4465, 26283=>4466, 26292=>4467, 26289=>4468, 27171=>4469, 27167=>4470, 27112=>4471, 27137=>4472, 27166=>4473, 27161=>4474, 27133=>4475, 27169=>4476, 27155=>4477, 27146=>4478, 27123=>4479, 27138=>4480, 27141=>4481, 27117=>4482, 27153=>4483, 27472=>4484, 27470=>4485, 27556=>4486, 27589=>4487, 27590=>4488, 28479=>4489, 28540=>4490, 28548=>4491, 28497=>4492, 28518=>4493, 28500=>4494, 28550=>4495, 28525=>4496, 28507=>4497, 28536=>4498, 28526=>4499, 28558=>4500, 28538=>4501, 28528=>4502, 28516=>4503, 28567=>4504, 28504=>4505, 28373=>4506, 28527=>4507, 28512=>4508, 28511=>4509, 29087=>4510, 29100=>4511, 29105=>4512, 29096=>4513, 29270=>4514, 29339=>4515, 29518=>4516, 29527=>4517, 29801=>4518, 29835=>4519, 29827=>4520, 29822=>4521, 29824=>4522, 30079=>4523, 30240=>4524, 30249=>4525, 30239=>4526, 30244=>4527, 30246=>4528, 30241=>4529, 30242=>4530, 30362=>4531, 30394=>4532, 30436=>4533, 30606=>4534, 30599=>4535, 30604=>4536, 30609=>4537, 30603=>4538, 30923=>4539, 30917=>4540, 30906=>4541, 30922=>4542, 30910=>4543, 30933=>4544, 30908=>4545, 30928=>4546, 31295=>4547, 31292=>4548, 31296=>4549, 31293=>4550, 31287=>4551, 31291=>4552, 31407=>4553, 31406=>4554, 31661=>4555, 31665=>4556, 31684=>4557, 31668=>4558, 31686=>4559, 31687=>4560, 31681=>4561, 31648=>4562, 31692=>4563, 31946=>4564, 32224=>4565, 32244=>4566, 32239=>4567, 32251=>4568, 32216=>4569, 32236=>4570, 32221=>4571, 32232=>4572, 32227=>4573, 32218=>4574, 32222=>4575, 32233=>4576, 32158=>4577, 32217=>4578, 32242=>4579, 32249=>4580, 32629=>4581, 32631=>4582, 32687=>4583, 32745=>4584, 32806=>4585, 33179=>4586, 33180=>4587, 33181=>4588, 33184=>4589, 33178=>4590, 33176=>4591, 34071=>4592, 34109=>4593, 34074=>4594, 34030=>4595, 34092=>4596, 34093=>4597, 34067=>4598, 34065=>4599, 34083=>4600, 34081=>4601, 34068=>4602, 34028=>4603, 34085=>4604, 34047=>4605, 34054=>4606, 34690=>4607, 34676=>4608, 34678=>4609, 34656=>4610, 34662=>4611, 34680=>4612, 34664=>4613, 34649=>4614, 34647=>4615, 34636=>4616, 34643=>4617, 34907=>4618, 34909=>4619, 35088=>4620, 35079=>4621, 35090=>4622, 35091=>4623, 35093=>4624, 35082=>4625, 35516=>4626, 35538=>4627, 35527=>4628, 35524=>4629, 35477=>4630, 35531=>4631, 35576=>4632, 35506=>4633, 35529=>4634, 35522=>4635, 35519=>4636, 35504=>4637, 35542=>4638, 35533=>4639, 35510=>4640, 35513=>4641, 35547=>4642, 35916=>4643, 35918=>4644, 35948=>4645, 36064=>4646, 36062=>4647, 36070=>4648, 36068=>4649, 36076=>4650, 36077=>4651, 36066=>4652, 36067=>4653, 36060=>4654, 36074=>4655, 36065=>4656, 36205=>4657, 36255=>4658, 36259=>4659, 36395=>4660, 36368=>4661, 36381=>4662, 36386=>4663, 36367=>4664, 36393=>4665, 36383=>4666, 36385=>4667, 36382=>4668, 36538=>4669, 36637=>4670, 36635=>4671, 36639=>4672, 36649=>4673, 36646=>4674, 36650=>4675, 36636=>4676, 36638=>4677, 36645=>4678, 36969=>4679, 36974=>4680, 36968=>4681, 36973=>4682, 36983=>4683, 37168=>4684, 37165=>4685, 37159=>4686, 37169=>4687, 37255=>4688, 37257=>4689, 37259=>4690, 37251=>4691, 37573=>4692, 37563=>4693, 37559=>4694, 37610=>4695, 37604=>4696, 37569=>4697, 37555=>4698, 37564=>4699, 37586=>4700, 37575=>4701, 37616=>4702, 37554=>4703, 38317=>4704, 38321=>4705, 38660=>4706, 38662=>4707, 38663=>4708, 38665=>4709, 38752=>4710, 38797=>4711, 38795=>4712, 38799=>4713, 38945=>4714, 38955=>4715, 38940=>4716, 39091=>4717, 39178=>4718, 39187=>4719, 39186=>4720, 39192=>4721, 39389=>4722, 39376=>4723, 39391=>4724, 39387=>4725, 39377=>4726, 39381=>4727, 39378=>4728, 39385=>4729, 39607=>4730, 39662=>4731, 39663=>4732, 39719=>4733, 39749=>4734, 39748=>4735, 39799=>4736, 39791=>4737, 40198=>4738, 40201=>4739, 40195=>4740, 40617=>4741, 40638=>4742, 40654=>4743, 22696=>4744, 12242=>4745, 40786=>4745, 20754=>4746, 20760=>4747, 20756=>4748, 20752=>4749, 20757=>4750, 20864=>4751, 20906=>4752, 20957=>4753, 21137=>4754, 21139=>4755, 21235=>4756, 22105=>4757, 22123=>4758, 22137=>4759, 22121=>4760, 22116=>4761, 22136=>4762, 22122=>4763, 22120=>4764, 22117=>4765, 22129=>4766, 22127=>4767, 22124=>4768, 22114=>4769, 22134=>4770, 22721=>4771, 22718=>4772, 22727=>4773, 22725=>4774, 22894=>4775, 23325=>4776, 23348=>4777, 23416=>4778, 23536=>4779, 23566=>4780, 24394=>4781, 25010=>4782, 24977=>4783, 25001=>4784, 24970=>4785, 25037=>4786, 25014=>4787, 25022=>4788, 25034=>4789, 25032=>4790, 25136=>4791, 25797=>4792, 25793=>4793, 25803=>4794, 25787=>4795, 25788=>4796, 25818=>4797, 25796=>4798, 25799=>4799, 25794=>4800, 25805=>4801, 25791=>4802, 25810=>4803, 25812=>4804, 25790=>4805, 25972=>4806, 26310=>4807, 26313=>4808, 26297=>4809, 26308=>4810, 26311=>4811, 26296=>4812, 27197=>4813, 27192=>4814, 27194=>4815, 27225=>4816, 27243=>4817, 27224=>4818, 27193=>4819, 27204=>4820, 27234=>4821, 27233=>4822, 27211=>4823, 27207=>4824, 27189=>4825, 27231=>4826, 27208=>4827, 27481=>4828, 27511=>4829, 27653=>4830, 28610=>4831, 28593=>4832, 28577=>4833, 28611=>4834, 28580=>4835, 28609=>4836, 28583=>4837, 28595=>4838, 28608=>4839, 28601=>4840, 28598=>4841, 60318=>4841, 28582=>4842, 28576=>4843, 28596=>4844, 29118=>4845, 29129=>4846, 29136=>4847, 29138=>4848, 29128=>4849, 29141=>4850, 29113=>4851, 29134=>4852, 29145=>4853, 29148=>4854, 29123=>4855, 29124=>4856, 29544=>4857, 29852=>4858, 29859=>4859, 29848=>4860, 29855=>4861, 29854=>4862, 29922=>4863, 29964=>4864, 29965=>4865, 30260=>4866, 30264=>4867, 30266=>4868, 30439=>4869, 30437=>4870, 30624=>4871, 30622=>4872, 30623=>4873, 30629=>4874, 30952=>4875, 30938=>4876, 30956=>4877, 30951=>4878, 31142=>4879, 31309=>4880, 31310=>4881, 31302=>4882, 31308=>4883, 31307=>4884, 31418=>4885, 31705=>4886, 31761=>4887, 31689=>4888, 31716=>4889, 31707=>4890, 31713=>4891, 31721=>4892, 31718=>4893, 31957=>4894, 31958=>4895, 32266=>4896, 32273=>4897, 32264=>4898, 32283=>4899, 32291=>4900, 32286=>4901, 32285=>4902, 58211=>4902, 32265=>4903, 32272=>4904, 32633=>4905, 32690=>4906, 32752=>4907, 32753=>4908, 32750=>4909, 32808=>4910, 58239=>4910, 33203=>4911, 33193=>4912, 33192=>4913, 33275=>4914, 33288=>4915, 33368=>4916, 33369=>4917, 34122=>4918, 34137=>4919, 34120=>4920, 34152=>4921, 34153=>4922, 34115=>4923, 34121=>4924, 34157=>4925, 34154=>4926, 34142=>4927, 34691=>4928, 34719=>4929, 34718=>4930, 34722=>4931, 34701=>4932, 34913=>4933, 35114=>4934, 35122=>4935, 35109=>4936, 35115=>4937, 35105=>4938, 35242=>4939, 35238=>4940, 58391=>4940, 35558=>4941, 35578=>4942, 35563=>4943, 35569=>4944, 35584=>4945, 35548=>4946, 35559=>4947, 35566=>4948, 35582=>4949, 35585=>4950, 35586=>4951, 35575=>4952, 35565=>4953, 35571=>4954, 35574=>4955, 35580=>4956, 35947=>4957, 35949=>4958, 35987=>4959, 36084=>4960, 36420=>4961, 36401=>4962, 36404=>4963, 36418=>4964, 36409=>4965, 36405=>4966, 36667=>4967, 36655=>4968, 36664=>4969, 36659=>4970, 36776=>4971, 36774=>4972, 36981=>4973, 36980=>4974, 36984=>4975, 36978=>4976, 36988=>4977, 36986=>4978, 37172=>4979, 37266=>4980, 37664=>4981, 37686=>4982, 37624=>4983, 37683=>4984, 37679=>4985, 37666=>4986, 37628=>4987, 37675=>4988, 37636=>4989, 37658=>4990, 37648=>4991, 37670=>4992, 37665=>4993, 37653=>4994, 37678=>4995, 37657=>4996, 38331=>4997, 38567=>4998, 38568=>4999, 38570=>5000, 38613=>5001, 38670=>5002, 38673=>5003, 38678=>5004, 38669=>5005, 38675=>5006, 38671=>5007, 38747=>5008, 58565=>5009, 38748=>5009, 38758=>5010, 38808=>5011, 38960=>5012, 38968=>5013, 38971=>5014, 38967=>5015, 38957=>5016, 38969=>5017, 38948=>5018, 39184=>5019, 39208=>5020, 39198=>5021, 39195=>5022, 39201=>5023, 39194=>5024, 39405=>5025, 39394=>5026, 39409=>5027, 39608=>5028, 39612=>5029, 39675=>5030, 39661=>5031, 39720=>5032, 39825=>5033, 40213=>5034, 40227=>5035, 40230=>5036, 40232=>5037, 40210=>5038, 40219=>5039, 40664=>5040, 40660=>5041, 40845=>5042, 12243=>5042, 40860=>5043, 12244=>5043, 20778=>5044, 20767=>5045, 20769=>5046, 20786=>5047, 21237=>5048, 22158=>5049, 22144=>5050, 22160=>5051, 22149=>5052, 22151=>5053, 22159=>5054, 22741=>5055, 22739=>5056, 22737=>5057, 22734=>5058, 23344=>5059, 23338=>5060, 23332=>5061, 23418=>5062, 23607=>5063, 23656=>5064, 23996=>5065, 23994=>5066, 23997=>5067, 23992=>5068, 24171=>5069, 24396=>5070, 24509=>5071, 25033=>5072, 25026=>5073, 25031=>5074, 25062=>5075, 25035=>5076, 25138=>5077, 25140=>5078, 25806=>5079, 25802=>5080, 25816=>5081, 25824=>5082, 25840=>5083, 25830=>5084, 25836=>5085, 25841=>5086, 25826=>5087, 25837=>5088, 25986=>5089, 25987=>5090, 26329=>5091, 26326=>5092, 27264=>5093, 27284=>5094, 27268=>5095, 27298=>5096, 27292=>5097, 27355=>5098, 27299=>5099, 27262=>5100, 27287=>5101, 27280=>5102, 27296=>5103, 27484=>5104, 27566=>5105, 27610=>5106, 27656=>5107, 28632=>5108, 28657=>5109, 28639=>5110, 28640=>5111, 28635=>5112, 28644=>5113, 28651=>5114, 28655=>5115, 28544=>5116, 28652=>5117, 28641=>5118, 28649=>5119, 28629=>5120, 28654=>5121, 28656=>5122, 29159=>5123, 29151=>5124, 60361=>5124, 29166=>5125, 29158=>5126, 29157=>5127, 29165=>5128, 29164=>5129, 29172=>5130, 29152=>5131, 29237=>5132, 29254=>5133, 29552=>5134, 29554=>5135, 29865=>5136, 29872=>5137, 29862=>5138, 29864=>5139, 30278=>5140, 30274=>5141, 30284=>5142, 30442=>5143, 30643=>5144, 30634=>5145, 30640=>5146, 30636=>5147, 30631=>5148, 30637=>5149, 30703=>5150, 30967=>5151, 30970=>5152, 30964=>5153, 30959=>5154, 30977=>5155, 31143=>5156, 31146=>5157, 31319=>5158, 31423=>5159, 31751=>5160, 31757=>5161, 31742=>5162, 31735=>5163, 31756=>5164, 31712=>5165, 31968=>5166, 31964=>5167, 31966=>5168, 31970=>5169, 31967=>5170, 31961=>5171, 31965=>5172, 32302=>5173, 32318=>5174, 32326=>5175, 32311=>5176, 32306=>5177, 32323=>5178, 32299=>5179, 32317=>5180, 32305=>5181, 32325=>5182, 32321=>5183, 32308=>5184, 32313=>5185, 32328=>5186, 32309=>5187, 32319=>5188, 32303=>5189, 32580=>5190, 32755=>5191, 32764=>5192, 32881=>5193, 32882=>5194, 32880=>5195, 32879=>5196, 32883=>5197, 33222=>5198, 33219=>5199, 33210=>5200, 33218=>5201, 33216=>5202, 33215=>5203, 33213=>5204, 33225=>5205, 33214=>5206, 33256=>5207, 33289=>5208, 33393=>5209, 34218=>5210, 34180=>5211, 34174=>5212, 34204=>5213, 34193=>5214, 34196=>5215, 34223=>5216, 34203=>5217, 34183=>5218, 34216=>5219, 34186=>5220, 34214=>5221, 34407=>5222, 34752=>5223, 34769=>5224, 34739=>5225, 34770=>5226, 34758=>5227, 34731=>5228, 34747=>5229, 34746=>5230, 34760=>5231, 34763=>5232, 35131=>5233, 35126=>5234, 35140=>5235, 35128=>5236, 35133=>5237, 35244=>5238, 35598=>5239, 35607=>5240, 35609=>5241, 35611=>5242, 35594=>5243, 35616=>5244, 35613=>5245, 35588=>5246, 35600=>5247, 35905=>5248, 35903=>5249, 35955=>5250, 36090=>5251, 36093=>5252, 36092=>5253, 36088=>5254, 36091=>5255, 36264=>5256, 36425=>5257, 36427=>5258, 36424=>5259, 36426=>5260, 36676=>5261, 36670=>5262, 36674=>5263, 36677=>5264, 36671=>5265, 36991=>5266, 36989=>5267, 36996=>5268, 36993=>5269, 36994=>5270, 36992=>5271, 37177=>5272, 37283=>5273, 37278=>5274, 37276=>5275, 37709=>5276, 37762=>5277, 37672=>5278, 37749=>5279, 37706=>5280, 37733=>5281, 37707=>5282, 37656=>5283, 37758=>5284, 37740=>5285, 37723=>5286, 37744=>5287, 37722=>5288, 37716=>5289, 38346=>5290, 38347=>5291, 38348=>5292, 38344=>5293, 38342=>5294, 38577=>5295, 38584=>5296, 38614=>5297, 38684=>5298, 38686=>5299, 38816=>5300, 38867=>5301, 38982=>5302, 39094=>5303, 39221=>5304, 39425=>5305, 39423=>5306, 39854=>5307, 39851=>5308, 39850=>5309, 39853=>5310, 40251=>5311, 40255=>5312, 40587=>5313, 40655=>5314, 40670=>5315, 40668=>5316, 40669=>5317, 40667=>5318, 40766=>5319, 40779=>5320, 21474=>5321, 22165=>5322, 22190=>5323, 22745=>5324, 22744=>5325, 23352=>5326, 24413=>5327, 25059=>5328, 25139=>5329, 25844=>5330, 25842=>5331, 25854=>5332, 25862=>5333, 25850=>5334, 25851=>5335, 25847=>5336, 26039=>5337, 26332=>5338, 26406=>5339, 27315=>5340, 27308=>5341, 27331=>5342, 27323=>5343, 27320=>5344, 27330=>5345, 27310=>5346, 27311=>5347, 27487=>5348, 27512=>5349, 27567=>5350, 28681=>5351, 28683=>5352, 28670=>5353, 28678=>5354, 28666=>5355, 28689=>5356, 28687=>5357, 29179=>5358, 29180=>5359, 29182=>5360, 29176=>5361, 29559=>5362, 29557=>5363, 29863=>5364, 29887=>5365, 29973=>5366, 30294=>5367, 30296=>5368, 30290=>5369, 30653=>5370, 30655=>5371, 30651=>5372, 30652=>5373, 30990=>5374, 31150=>5375, 31329=>5376, 31330=>5377, 31328=>5378, 31428=>5379, 31429=>5380, 31787=>5381, 31783=>5382, 31786=>5383, 31774=>5384, 31779=>5385, 31777=>5386, 31975=>5387, 32340=>5388, 32341=>5389, 32350=>5390, 32346=>5391, 32353=>5392, 32338=>5393, 32345=>5394, 32584=>5395, 32761=>5396, 32763=>5397, 32887=>5398, 32886=>5399, 33229=>5400, 33231=>5401, 33290=>5402, 34255=>5403, 34217=>5404, 34253=>5405, 34256=>5406, 34249=>5407, 34224=>5408, 34234=>5409, 34233=>5410, 34799=>5411, 34796=>5412, 34802=>5413, 34784=>5414, 35206=>5415, 35250=>5416, 35316=>5417, 35624=>5418, 35641=>5419, 35628=>5420, 35627=>5421, 35920=>5422, 36101=>5423, 36441=>5424, 36451=>5425, 36454=>5426, 36452=>5427, 36447=>5428, 36437=>5429, 36544=>5430, 36681=>5431, 36685=>5432, 36999=>5433, 36995=>5434, 37000=>5435, 37291=>5436, 37292=>5437, 37328=>5438, 37780=>5439, 37770=>5440, 37782=>5441, 37794=>5442, 37811=>5443, 37806=>5444, 37804=>5445, 37808=>5446, 37784=>5447, 37786=>5448, 37783=>5449, 38356=>5450, 38358=>5451, 38352=>5452, 38357=>5453, 38626=>5454, 38620=>5455, 38617=>5456, 38619=>5457, 38622=>5458, 38692=>5459, 38819=>5460, 38822=>5461, 38829=>5462, 38905=>5463, 38989=>5464, 38991=>5465, 38988=>5466, 38990=>5467, 38995=>5468, 39098=>5469, 39230=>5470, 39231=>5471, 39229=>5472, 39214=>5473, 39333=>5474, 39438=>5475, 39617=>5476, 39683=>5477, 39686=>5478, 39759=>5479, 39758=>5480, 39757=>5481, 39882=>5482, 39881=>5483, 39933=>5484, 39880=>5485, 39872=>5486, 40273=>5487, 40285=>5488, 40288=>5489, 40672=>5490, 40725=>5491, 40748=>5492, 20787=>5493, 22181=>5494, 22184=>5495, 22750=>5496, 22751=>5497, 22754=>5498, 23541=>5499, 40848=>5500, 24300=>5501, 25074=>5502, 25079=>5503, 25078=>5504, 25077=>5505, 25856=>5506, 25871=>5507, 26336=>5508, 26333=>5509, 27365=>5510, 27357=>5511, 27354=>5512, 27347=>5513, 28699=>5514, 28703=>5515, 28712=>5516, 28698=>5517, 28701=>5518, 28693=>5519, 28696=>5520, 29190=>5521, 29197=>5522, 29272=>5523, 29346=>5524, 29560=>5525, 29562=>5526, 29885=>5527, 29898=>5528, 29923=>5529, 30087=>5530, 30086=>5531, 30303=>5532, 30305=>5533, 30663=>5534, 31001=>5535, 31153=>5536, 31339=>5537, 31337=>5538, 31806=>5539, 31807=>5540, 31800=>5541, 31805=>5542, 31799=>5543, 31808=>5544, 32363=>5545, 32365=>5546, 32377=>5547, 32361=>5548, 32362=>5549, 32371=>5550, 32645=>5551, 32694=>5552, 32697=>5553, 32696=>5554, 33240=>5555, 34281=>5556, 34269=>5557, 34282=>5558, 34261=>5559, 34276=>5560, 34277=>5561, 34295=>5562, 34811=>5563, 34821=>5564, 34829=>5565, 34809=>5566, 34814=>5567, 35168=>5568, 35167=>5569, 35158=>5570, 35166=>5571, 35649=>5572, 35676=>5573, 35672=>5574, 35657=>5575, 35674=>5576, 35662=>5577, 35663=>5578, 35654=>5579, 35673=>5580, 36104=>5581, 36106=>5582, 36476=>5583, 36466=>5584, 36487=>5585, 36470=>5586, 36460=>5587, 36474=>5588, 36468=>5589, 36692=>5590, 36686=>5591, 36781=>5592, 37002=>5593, 37003=>5594, 37297=>5595, 37294=>5596, 37857=>5597, 37841=>5598, 37855=>5599, 37827=>5600, 37832=>5601, 37852=>5602, 37853=>5603, 37846=>5604, 37858=>5605, 37837=>5606, 37848=>5607, 37860=>5608, 37847=>5609, 37864=>5610, 38364=>5611, 38580=>5612, 38627=>5613, 38698=>5614, 38695=>5615, 38753=>5616, 38876=>5617, 38907=>5618, 39006=>5619, 39000=>5620, 39003=>5621, 39100=>5622, 39237=>5623, 39241=>5624, 39446=>5625, 39449=>5626, 39693=>5627, 39912=>5628, 39911=>5629, 39894=>5630, 39899=>5631, 40329=>5632, 40289=>5633, 40306=>5634, 40298=>5635, 40300=>5636, 40594=>5637, 40599=>5638, 40595=>5639, 40628=>5640, 21240=>5641, 22199=>5642, 22198=>5643, 22196=>5644, 22204=>5645, 22756=>5646, 23360=>5647, 23363=>5648, 23421=>5649, 23542=>5650, 24009=>5651, 25080=>5652, 25082=>5653, 25880=>5654, 25876=>5655, 25881=>5656, 26342=>5657, 26407=>5658, 27372=>5659, 28734=>5660, 28720=>5661, 28722=>5662, 29200=>5663, 29563=>5664, 29903=>5665, 30306=>5666, 30309=>5667, 31014=>5668, 31018=>5669, 31020=>5670, 31019=>5671, 31431=>5672, 31478=>5673, 31820=>5674, 31811=>5675, 31821=>5676, 31983=>5677, 31984=>5678, 36782=>5679, 32381=>5680, 32380=>5681, 32386=>5682, 32588=>5683, 32768=>5684, 33242=>5685, 33382=>5686, 34299=>5687, 34297=>5688, 34321=>5689, 34298=>5690, 34310=>5691, 34315=>5692, 34311=>5693, 34314=>5694, 34836=>5695, 34837=>5696, 35172=>5697, 35258=>5698, 35320=>5699, 35696=>5700, 35692=>5701, 35686=>5702, 35695=>5703, 35679=>5704, 35691=>5705, 36111=>5706, 36109=>5707, 36489=>5708, 36481=>5709, 36485=>5710, 36482=>5711, 37300=>5712, 37323=>5713, 37912=>5714, 37891=>5715, 37885=>5716, 38369=>5717, 38704=>5718, 39108=>5719, 39250=>5720, 39249=>5721, 39336=>5722, 39467=>5723, 39472=>5724, 39479=>5725, 39477=>5726, 39955=>5727, 39949=>5728, 40569=>5729, 40629=>5730, 40680=>5731, 40751=>5732, 40799=>5733, 40803=>5734, 40801=>5735, 20791=>5736, 20792=>5737, 22209=>5738, 22208=>5739, 22210=>5740, 22804=>5741, 23660=>5742, 24013=>5743, 25084=>5744, 25086=>5745, 25885=>5746, 25884=>5747, 26005=>5748, 26345=>5749, 27387=>5750, 27396=>5751, 27386=>5752, 27570=>5753, 28748=>5754, 29211=>5755, 29351=>5756, 29910=>5757, 29908=>5758, 30313=>5759, 30675=>5760, 31824=>5761, 32399=>5762, 32396=>5763, 32700=>5764, 34327=>5765, 34349=>5766, 34330=>5767, 34851=>5768, 34850=>5769, 34849=>5770, 34847=>5771, 35178=>5772, 35180=>5773, 35261=>5774, 35700=>5775, 35703=>5776, 35709=>5777, 36115=>5778, 36490=>5779, 36493=>5780, 36491=>5781, 36703=>5782, 36783=>5783, 37306=>5784, 37934=>5785, 37939=>5786, 37941=>5787, 37946=>5788, 37944=>5789, 37938=>5790, 37931=>5791, 38370=>5792, 38712=>5793, 38713=>5794, 38706=>5795, 38911=>5796, 58586=>5796, 39015=>5797, 39013=>5798, 39255=>5799, 39493=>5800, 39491=>5801, 39488=>5802, 39486=>5803, 39631=>5804, 39764=>5805, 39761=>5806, 39981=>5807, 39973=>5808, 40367=>5809, 40372=>5810, 40386=>5811, 40376=>5812, 40605=>5813, 40687=>5814, 40729=>5815, 40796=>5816, 40806=>5817, 40807=>5818, 20796=>5819, 20795=>5820, 22216=>5821, 22218=>5822, 22217=>5823, 23423=>5824, 24020=>5825, 24018=>5826, 24398=>5827, 25087=>5828, 25892=>5829, 27402=>5830, 27489=>5831, 28753=>5832, 28760=>5833, 29568=>5834, 29924=>5835, 30090=>5836, 30318=>5837, 30316=>5838, 31155=>5839, 31840=>5840, 31839=>5841, 32894=>5842, 32893=>5843, 33247=>5844, 35186=>5845, 35183=>5846, 35324=>5847, 35712=>5848, 36118=>5849, 36119=>5850, 36497=>5851, 36499=>5852, 36705=>5853, 37192=>5854, 37956=>5855, 37969=>5856, 37970=>5857, 38717=>5858, 38718=>5859, 38851=>5860, 38849=>5861, 39019=>5862, 39253=>5863, 39509=>5864, 39501=>5865, 39634=>5866, 39706=>5867, 40009=>5868, 39985=>5869, 39998=>5870, 39995=>5871, 40403=>5872, 40407=>5873, 40756=>5874, 40812=>5875, 40810=>5876, 40852=>5877, 22220=>5878, 24022=>5879, 25088=>5880, 25891=>5881, 25899=>5882, 25898=>5883, 26348=>5884, 27408=>5885, 29914=>5886, 31434=>5887, 31844=>5888, 31843=>5889, 31845=>5890, 32403=>5891, 32406=>5892, 32404=>5893, 33250=>5894, 34360=>5895, 34367=>5896, 34865=>5897, 35722=>5898, 37008=>5899, 37007=>5900, 37987=>5901, 37984=>5902, 37988=>5903, 38760=>5904, 39023=>5905, 39260=>5906, 39514=>5907, 39515=>5908, 39511=>5909, 39635=>5910, 39636=>5911, 39633=>5912, 40020=>5913, 40023=>5914, 40022=>5915, 40421=>5916, 40607=>5917, 40692=>5918, 22225=>5919, 22761=>5920, 25900=>5921, 28766=>5922, 30321=>5923, 30322=>5924, 30679=>5925, 60226=>5925, 32592=>5926, 32648=>5927, 34870=>5928, 34873=>5929, 34914=>5930, 35731=>5931, 35730=>5932, 35734=>5933, 33399=>5934, 36123=>5935, 37312=>5936, 37994=>5937, 38722=>5938, 38728=>5939, 38724=>5940, 38854=>5941, 39024=>5942, 39519=>5943, 39714=>5944, 39768=>5945, 40031=>5946, 40441=>5947, 40442=>5948, 40572=>5949, 40573=>5950, 40711=>5951, 40823=>5952, 40818=>5953, 24307=>5954, 27414=>5955, 28771=>5956, 31852=>5957, 31854=>5958, 34875=>5959, 35264=>5960, 36513=>5961, 37313=>5962, 38002=>5963, 38000=>5964, 39025=>5965, 39262=>5966, 39638=>5967, 39715=>5968, 40652=>5969, 28772=>5970, 30682=>5971, 35738=>5972, 38007=>5973, 38857=>5974, 39522=>5975, 39525=>5976, 32412=>5977, 35740=>5978, 36522=>5979, 37317=>5980, 38013=>5981, 38014=>5982, 38012=>5983, 40055=>5984, 40056=>5985, 40695=>5986, 35924=>5987, 38015=>5988, 40474=>5989, 29224=>5990, 39530=>5991, 39729=>5992, 40475=>5993, 40478=>5994, 31858=>5995, 20034=>5996, 20060=>5997, 12048=>5998, 20981=>5998, 12053=>5999, 21274=>5999, 12058=>6000, 21378=>6000, 19975=>6001, 19980=>6002, 20039=>6003, 20109=>6004, 12062=>6005, 22231=>6005, 12076=>6006, 23662=>6006, 12091=>6007, 24435=>6007, 19983=>6008, 20871=>6009, 19982=>6010, 20014=>6011, 20115=>6012, 20162=>6013, 20169=>6014, 20168=>6015, 20888=>6016, 21244=>6017, 21356=>6018, 21433=>6019, 22304=>6020, 22787=>6021, 22828=>6022, 23568=>6023, 60417=>6023, 24063=>6024, 26081=>6025, 12110=>6026, 27571=>6026, 27596=>6027, 12115=>6028, 27668=>6028, 12121=>6029, 29247=>6029, 20017=>6030, 20028=>6031, 20200=>6032, 20188=>6033, 20201=>6034, 20193=>6035, 20189=>6036, 20186=>6037, 21004=>6038, 21001=>6039, 21276=>6040, 21324=>6041, 22306=>6042, 22307=>6043, 22807=>6044, 22831=>6045, 23425=>6046, 23428=>6047, 23570=>6048, 23611=>6049, 23668=>6050, 23667=>6051, 24068=>6052, 24192=>6053, 24194=>6054, 24521=>6055, 25097=>6056, 25168=>6057, 27669=>6058, 27702=>6059, 27715=>6060, 27711=>6061, 27707=>6062, 29358=>6063, 29360=>6064, 29578=>6065, 12145=>6066, 31160=>6066, 32906=>6067, 38430=>6068, 20238=>6069, 20248=>6070, 20268=>6071, 20213=>6072, 20244=>6073, 20209=>6074, 20224=>6075, 20215=>6076, 20232=>6077, 20253=>6078, 20226=>6079, 20229=>6080, 20258=>6081, 20243=>6082, 20228=>6083, 20212=>6084, 20242=>6085, 20913=>6086, 21011=>6087, 21008=>6088, 21158=>6089, 21282=>6090, 21279=>6091, 21325=>6092, 21386=>6093, 21511=>6094, 22241=>6095, 22239=>6096, 22318=>6097, 22314=>6098, 22324=>6099, 22844=>6100, 22912=>6101, 22908=>6102, 22917=>6103, 22907=>6104, 22910=>6105, 22903=>6106, 22911=>6107, 23382=>6108, 23573=>6109, 23589=>6110, 23676=>6111, 23674=>6112, 23675=>6113, 23678=>6114, 24031=>6115, 24181=>6116, 57646=>6116, 24196=>6117, 24322=>6118, 24346=>6119, 24436=>6120, 24533=>6121, 24532=>6122, 24527=>6123, 25180=>6124, 25182=>6125, 25188=>6126, 25185=>6127, 25190=>6128, 25186=>6129, 25177=>6130, 25184=>6131, 25178=>6132, 25189=>6133, 25911=>6134, 26095=>6135, 26094=>6136, 26430=>6137, 26425=>6138, 26424=>6139, 26427=>6140, 26426=>6141, 26431=>6142, 26428=>6143, 26419=>6144, 27672=>6145, 27718=>6146, 27730=>6147, 27740=>6148, 27727=>6149, 27722=>6150, 60796=>6150, 27732=>6151, 27723=>6152, 27724=>6153, 28785=>6154, 29278=>6155, 29364=>6156, 29365=>6157, 29582=>6158, 29994=>6159, 30335=>6160, 31349=>6161, 12153=>6162, 32593=>6162, 12171=>6163, 33400=>6163, 33404=>6164, 33408=>6165, 33405=>6166, 33407=>6167, 12172=>6168, 34381=>6168, 12177=>6169, 35198=>6169, 37017=>6170, 59347=>6171, 37015=>6171, 37016=>6172, 37019=>6173, 37012=>6174, 38434=>6175, 38436=>6176, 38432=>6177, 38435=>6178, 20310=>6179, 20283=>6180, 20322=>6181, 20297=>6182, 20307=>6183, 20324=>6184, 20286=>6185, 20327=>6186, 20306=>6187, 20319=>6188, 20289=>6189, 20312=>6190, 20269=>6191, 20275=>6192, 20287=>6193, 20321=>6194, 20879=>6195, 20921=>6196, 21020=>6197, 21022=>6198, 21025=>6199, 21165=>6200, 21166=>6201, 21257=>6202, 21347=>6203, 21362=>6204, 21390=>6205, 21391=>6206, 21552=>6207, 21559=>6208, 21546=>6209, 21588=>6210, 21573=>6211, 21529=>6212, 21532=>6213, 21541=>6214, 21528=>6215, 21565=>6216, 21583=>6217, 21569=>6218, 21544=>6219, 21540=>6220, 21575=>6221, 22254=>6222, 22247=>6223, 22245=>6224, 22337=>6225, 22341=>6226, 22348=>6227, 22345=>6228, 22347=>6229, 22354=>6230, 22790=>6231, 22848=>6232, 22950=>6233, 22936=>6234, 22944=>6235, 22935=>6236, 22926=>6237, 22946=>6238, 22928=>6239, 22927=>6240, 22951=>6241, 22945=>6242, 23438=>6243, 23442=>6244, 23592=>6245, 23594=>6246, 23693=>6247, 23695=>6248, 23688=>6249, 23691=>6250, 23689=>6251, 23698=>6252, 23690=>6253, 23686=>6254, 23699=>6255, 23701=>6256, 24032=>6257, 24074=>6258, 24078=>6259, 24203=>6260, 24201=>6261, 24204=>6262, 24200=>6263, 24205=>6264, 24325=>6265, 24349=>6266, 24440=>6267, 24438=>6268, 24530=>6269, 24529=>6270, 24528=>6271, 24557=>6272, 24552=>6273, 24558=>6274, 24563=>6275, 24545=>6276, 24548=>6277, 24547=>6278, 24570=>6279, 24559=>6280, 24567=>6281, 24571=>6282, 24576=>6283, 24564=>6284, 25146=>6285, 25219=>6286, 25228=>6287, 25230=>6288, 25231=>6289, 25236=>6290, 25223=>6291, 25201=>6292, 25211=>6293, 25210=>6294, 25200=>6295, 25217=>6296, 25224=>6297, 25207=>6298, 25213=>6299, 25202=>6300, 25204=>6301, 26096=>6302, 26100=>6303, 26099=>6304, 26098=>6305, 26101=>6306, 26437=>6307, 26439=>6308, 26457=>6309, 26453=>6310, 26444=>6311, 26440=>6312, 26461=>6313, 26445=>6314, 26458=>6315, 26443=>6316, 27600=>6317, 27673=>6318, 27674=>6319, 27768=>6320, 27751=>6321, 27755=>6322, 27780=>6323, 27787=>6324, 27791=>6325, 27761=>6326, 27759=>6327, 27753=>6328, 27802=>6329, 27757=>6330, 27783=>6331, 27797=>6332, 27804=>6333, 57900=>6333, 27750=>6334, 27763=>6335, 27749=>6336, 27771=>6337, 27790=>6338, 28788=>6339, 28794=>6340, 29283=>6341, 29375=>6342, 29373=>6343, 29379=>6344, 29382=>6345, 29377=>6346, 29370=>6347, 29381=>6348, 29589=>6349, 29591=>6350, 29587=>6351, 29588=>6352, 29586=>6353, 30010=>6354, 30009=>6355, 30100=>6356, 30101=>6357, 30337=>6358, 31037=>6359, 32820=>6360, 32917=>6361, 32921=>6362, 32912=>6363, 32914=>6364, 32924=>6365, 33424=>6366, 33423=>6367, 33413=>6368, 33422=>6369, 33425=>6370, 33427=>6371, 33418=>6372, 33411=>6373, 33412=>6374, 12184=>6375, 35960=>6375, 36809=>6376, 36799=>6377, 37023=>6378, 37025=>6379, 37029=>6380, 37022=>6381, 37031=>6382, 37024=>6383, 38448=>6384, 38440=>6385, 38447=>6386, 38445=>6387, 20019=>6388, 20376=>6389, 20348=>6390, 20357=>6391, 20349=>6392, 20352=>6393, 20359=>6394, 20342=>6395, 20340=>6396, 20361=>6397, 20356=>6398, 20343=>6399, 20300=>6400, 20375=>6401, 20330=>6402, 20378=>6403, 20345=>6404, 20353=>6405, 20344=>6406, 20368=>6407, 20380=>6408, 20372=>6409, 20382=>6410, 20370=>6411, 20354=>6412, 20373=>6413, 20331=>6414, 20334=>6415, 20894=>6416, 20924=>6417, 20926=>6418, 21045=>6419, 21042=>6420, 21043=>6421, 21062=>6422, 21041=>6423, 21180=>6424, 21258=>6425, 21259=>6426, 21308=>6427, 21394=>6428, 21396=>6429, 21639=>6430, 21631=>6431, 21633=>6432, 21649=>6433, 21634=>6434, 21640=>6435, 21611=>6436, 21626=>6437, 21630=>6438, 21605=>6439, 21612=>6440, 21620=>6441, 21606=>6442, 21645=>6443, 21615=>6444, 21601=>6445, 21600=>6446, 21656=>6447, 21603=>6448, 21607=>6449, 21604=>6450, 22263=>6451, 22265=>6452, 22383=>6453, 22386=>6454, 22381=>6455, 22379=>6456, 22385=>6457, 22384=>6458, 22390=>6459, 22400=>6460, 22389=>6461, 22395=>6462, 22387=>6463, 22388=>6464, 22370=>6465, 22376=>6466, 22397=>6467, 22796=>6468, 22853=>6469, 22965=>6470, 22970=>6471, 22991=>6472, 22990=>6473, 22962=>6474, 22988=>6475, 22977=>6476, 22966=>6477, 22972=>6478, 22979=>6479, 22998=>6480, 22961=>6481, 22973=>6482, 22976=>6483, 22984=>6484, 22964=>6485, 22983=>6486, 23394=>6487, 23397=>6488, 23443=>6489, 23445=>6490, 23620=>6491, 23623=>6492, 23726=>6493, 23716=>6494, 23712=>6495, 23733=>6496, 23727=>6497, 23720=>6498, 23724=>6499, 23711=>6500, 23715=>6501, 23725=>6502, 23714=>6503, 23722=>6504, 23719=>6505, 23709=>6506, 23717=>6507, 23734=>6508, 23728=>6509, 23718=>6510, 24087=>6511, 24084=>6512, 24089=>6513, 24360=>6514, 24354=>6515, 24355=>6516, 24356=>6517, 24404=>6518, 24450=>6519, 24446=>6520, 24445=>6521, 24542=>6522, 24549=>6523, 24621=>6524, 24614=>6525, 24601=>6526, 24626=>6527, 24587=>6528, 24628=>6529, 24586=>6530, 24599=>6531, 24627=>6532, 24602=>6533, 24606=>6534, 24620=>6535, 24610=>6536, 24589=>6537, 24592=>6538, 24622=>6539, 24595=>6540, 24593=>6541, 24588=>6542, 24585=>6543, 24604=>6544, 25108=>6545, 25149=>6546, 25261=>6547, 25268=>6548, 25297=>6549, 25278=>6550, 25258=>6551, 25270=>6552, 25290=>6553, 25262=>6554, 25267=>6555, 25263=>6556, 25275=>6557, 25257=>6558, 25264=>6559, 25272=>6560, 25917=>6561, 26024=>6562, 26043=>6563, 26121=>6564, 26108=>6565, 26116=>6566, 26130=>6567, 26120=>6568, 26107=>6569, 26115=>6570, 26123=>6571, 26125=>6572, 26117=>6573, 26109=>6574, 26129=>6575, 26128=>6576, 26358=>6577, 26378=>6578, 26501=>6579, 26476=>6580, 26510=>6581, 26514=>6582, 26486=>6583, 26491=>6584, 26520=>6585, 26502=>6586, 26500=>6587, 26484=>6588, 26509=>6589, 26508=>6590, 26490=>6591, 26527=>6592, 26513=>6593, 26521=>6594, 26499=>6595, 26493=>6596, 26497=>6597, 26488=>6598, 26489=>6599, 26516=>6600, 27429=>6601, 27520=>6602, 27518=>6603, 27614=>6604, 27677=>6605, 27795=>6606, 27884=>6607, 27883=>6608, 27886=>6609, 27865=>6610, 27830=>6611, 27860=>6612, 27821=>6613, 27879=>6614, 27831=>6615, 27856=>6616, 27842=>6617, 27834=>6618, 27843=>6619, 27846=>6620, 27885=>6621, 27890=>6622, 27858=>6623, 27869=>6624, 27828=>6625, 27786=>6626, 27805=>6627, 27776=>6628, 27870=>6629, 27840=>6630, 27952=>6631, 27853=>6632, 27847=>6633, 27824=>6634, 27897=>6635, 27855=>6636, 27881=>6637, 27857=>6638, 28820=>6639, 28824=>6640, 28805=>6641, 28819=>6642, 28806=>6643, 28804=>6644, 28817=>6645, 28822=>6646, 28802=>6647, 28826=>6648, 28803=>6649, 29290=>6650, 29398=>6651, 29387=>6652, 29400=>6653, 29385=>6654, 29404=>6655, 29394=>6656, 29396=>6657, 29402=>6658, 29388=>6659, 29393=>6660, 29604=>6661, 29601=>6662, 29613=>6663, 29606=>6664, 29602=>6665, 29600=>6666, 29612=>6667, 29597=>6668, 29917=>6669, 29928=>6670, 30015=>6671, 30016=>6672, 30014=>6673, 30092=>6674, 30104=>6675, 30383=>6676, 30451=>6677, 30449=>6678, 30448=>6679, 30453=>6680, 30712=>6681, 30716=>6682, 30713=>6683, 30715=>6684, 30714=>6685, 30711=>6686, 31042=>6687, 31039=>6688, 31173=>6689, 31352=>6690, 31355=>6691, 31483=>6692, 31861=>6693, 31997=>6694, 32821=>6695, 32911=>6696, 32942=>6697, 32931=>6698, 32952=>6699, 32949=>6700, 32941=>6701, 33312=>6702, 33440=>6703, 33472=>6704, 33451=>6705, 33434=>6706, 33432=>6707, 33435=>6708, 33461=>6709, 33447=>6710, 33454=>6711, 33468=>6712, 33438=>6713, 33466=>6714, 33460=>6715, 33448=>6716, 33441=>6717, 33449=>6718, 33474=>6719, 33444=>6720, 33475=>6721, 33462=>6722, 33442=>6723, 34416=>6724, 34415=>6725, 34413=>6726, 34414=>6727, 35926=>6728, 36818=>6729, 36811=>6730, 36819=>6731, 36813=>6732, 36822=>6733, 36821=>6734, 36823=>6735, 37042=>6736, 37044=>6737, 37039=>6738, 37043=>6739, 37040=>6740, 38457=>6741, 38461=>6742, 38460=>6743, 38458=>6744, 38467=>6745, 20429=>6746, 20421=>6747, 20435=>6748, 20402=>6749, 20425=>6750, 20427=>6751, 20417=>6752, 20436=>6753, 20444=>6754, 20441=>6755, 20411=>6756, 60346=>6756, 20403=>6757, 20443=>6758, 20423=>6759, 20438=>6760, 20410=>6761, 20416=>6762, 20409=>6763, 20460=>6764, 21060=>6765, 21065=>6766, 21184=>6767, 21186=>6768, 21309=>6769, 21372=>6770, 21399=>6771, 21398=>6772, 21401=>6773, 21400=>6774, 21690=>6775, 21665=>6776, 21677=>6777, 21669=>6778, 21711=>6779, 21699=>6780, 33549=>6781, 21687=>6782, 21678=>6783, 21718=>6784, 21686=>6785, 21701=>6786, 21702=>6787, 21664=>6788, 21616=>6789, 21692=>6790, 21666=>6791, 21694=>6792, 21618=>6793, 21726=>6794, 21680=>6795, 22453=>6796, 22430=>6797, 22431=>6798, 22436=>6799, 22412=>6800, 22423=>6801, 22429=>6802, 22427=>6803, 22420=>6804, 22424=>6805, 22415=>6806, 22425=>6807, 22437=>6808, 22426=>6809, 22421=>6810, 22772=>6811, 22797=>6812, 22867=>6813, 23009=>6814, 23006=>6815, 23022=>6816, 23040=>6817, 23025=>6818, 23005=>6819, 23034=>6820, 23037=>6821, 23036=>6822, 23030=>6823, 23012=>6824, 23026=>6825, 23031=>6826, 23003=>6827, 23017=>6828, 23027=>6829, 23029=>6830, 23008=>6831, 23038=>6832, 23028=>6833, 23021=>6834, 23464=>6835, 23628=>6836, 23760=>6837, 23768=>6838, 23756=>6839, 23767=>6840, 23755=>6841, 23771=>6842, 23774=>6843, 23770=>6844, 23753=>6845, 23751=>6846, 23754=>6847, 23766=>6848, 23763=>6849, 23764=>6850, 23759=>6851, 23752=>6852, 23750=>6853, 23758=>6854, 23775=>6855, 23800=>6856, 24057=>6857, 24097=>6858, 24098=>6859, 24099=>6860, 24096=>6861, 24100=>6862, 24240=>6863, 24228=>6864, 24226=>6865, 24219=>6866, 24227=>6867, 24229=>6868, 24327=>6869, 24366=>6870, 24406=>6871, 24454=>6872, 24631=>6873, 24633=>6874, 24660=>6875, 24690=>6876, 24670=>6877, 24645=>6878, 24659=>6879, 24647=>6880, 24649=>6881, 24667=>6882, 24652=>6883, 24640=>6884, 24642=>6885, 24671=>6886, 24612=>6887, 24644=>6888, 24664=>6889, 24678=>6890, 24686=>6891, 25154=>6892, 25155=>6893, 25295=>6894, 25357=>6895, 25355=>6896, 25333=>6897, 25358=>6898, 25347=>6899, 25323=>6900, 25337=>6901, 25359=>6902, 25356=>6903, 25336=>6904, 25334=>6905, 25344=>6906, 25363=>6907, 25364=>6908, 25338=>6909, 25365=>6910, 25339=>6911, 25328=>6912, 25921=>6913, 25923=>6914, 26026=>6915, 26047=>6916, 26166=>6917, 26145=>6918, 26162=>6919, 26165=>6920, 26140=>6921, 26150=>6922, 26146=>6923, 26163=>6924, 26155=>6925, 26170=>6926, 26141=>6927, 26164=>6928, 26169=>6929, 26158=>6930, 26383=>6931, 26384=>6932, 26561=>6933, 26610=>6934, 26568=>6935, 26554=>6936, 26588=>6937, 26555=>6938, 26616=>6939, 26584=>6940, 26560=>6941, 26551=>6942, 26565=>6943, 26603=>6944, 26596=>6945, 26591=>6946, 26549=>6947, 26573=>6948, 26547=>6949, 26615=>6950, 26614=>6951, 26606=>6952, 26595=>6953, 26562=>6954, 26553=>6955, 26574=>6956, 26599=>6957, 26608=>6958, 26546=>6959, 26620=>6960, 26566=>6961, 26605=>6962, 26572=>6963, 26542=>6964, 26598=>6965, 26587=>6966, 26618=>6967, 26569=>6968, 26570=>6969, 26563=>6970, 26602=>6971, 26571=>6972, 27432=>6973, 27522=>6974, 27524=>6975, 27574=>6976, 27606=>6977, 27608=>6978, 27616=>6979, 27680=>6980, 27681=>6981, 27944=>6982, 27956=>6983, 27949=>6984, 27935=>6985, 27964=>6986, 27967=>6987, 27922=>6988, 27914=>6989, 27866=>6990, 27955=>6991, 27908=>6992, 27929=>6993, 27962=>6994, 27930=>6995, 27921=>6996, 27904=>6997, 27933=>6998, 27970=>6999, 27905=>7000, 27928=>7001, 27959=>7002, 27907=>7003, 27919=>7004, 27968=>7005, 27911=>7006, 27936=>7007, 27948=>7008, 27912=>7009, 27938=>7010, 27913=>7011, 27920=>7012, 28855=>7013, 28831=>7014, 28862=>7015, 28849=>7016, 28848=>7017, 28833=>7018, 28852=>7019, 28853=>7020, 28841=>7021, 29249=>7022, 29257=>7023, 29258=>7024, 29292=>7025, 29296=>7026, 29299=>7027, 29294=>7028, 29386=>7029, 29412=>7030, 29416=>7031, 29419=>7032, 29407=>7033, 29418=>7034, 29414=>7035, 29411=>7036, 29573=>7037, 29644=>7038, 29634=>7039, 29640=>7040, 29637=>7041, 29625=>7042, 29622=>7043, 29621=>7044, 29620=>7045, 29675=>7046, 29631=>7047, 29639=>7048, 29630=>7049, 29635=>7050, 29638=>7051, 29624=>7052, 29643=>7053, 29932=>7054, 29934=>7055, 29998=>7056, 30023=>7057, 30024=>7058, 30119=>7059, 30122=>7060, 30329=>7061, 30404=>7062, 30472=>7063, 30467=>7064, 30468=>7065, 30469=>7066, 30474=>7067, 30455=>7068, 30459=>7069, 30458=>7070, 30695=>7071, 30696=>7072, 30726=>7073, 30737=>7074, 30738=>7075, 30725=>7076, 30736=>7077, 30735=>7078, 30734=>7079, 30729=>7080, 58095=>7080, 30723=>7081, 30739=>7082, 31050=>7083, 31052=>7084, 31051=>7085, 31045=>7086, 31044=>7087, 31189=>7088, 31181=>7089, 31183=>7090, 31190=>7091, 31182=>7092, 31360=>7093, 31358=>7094, 31441=>7095, 31488=>7096, 31489=>7097, 31866=>7098, 31864=>7099, 31865=>7100, 31871=>7101, 31872=>7102, 31873=>7103, 32003=>7104, 32008=>7105, 32001=>7106, 32600=>7107, 32657=>7108, 32653=>7109, 32702=>7110, 32775=>7111, 32782=>7112, 32783=>7113, 32788=>7114, 32823=>7115, 32984=>7116, 32967=>7117, 32992=>7118, 32977=>7119, 32968=>7120, 32962=>7121, 32976=>7122, 32965=>7123, 32995=>7124, 32985=>7125, 32988=>7126, 32970=>7127, 32981=>7128, 32969=>7129, 32975=>7130, 32983=>7131, 32998=>7132, 32973=>7133, 33279=>7134, 33313=>7135, 33428=>7136, 33497=>7137, 33534=>7138, 33529=>7139, 33543=>7140, 33512=>7141, 33536=>7142, 33493=>7143, 33594=>7144, 33515=>7145, 33494=>7146, 33524=>7147, 33516=>7148, 33505=>7149, 33522=>7150, 33525=>7151, 33548=>7152, 33531=>7153, 33526=>7154, 33520=>7155, 33514=>7156, 33508=>7157, 33504=>7158, 33530=>7159, 33523=>7160, 33517=>7161, 34423=>7162, 34420=>7163, 34428=>7164, 34419=>7165, 34881=>7166, 34894=>7167, 34919=>7168, 34922=>7169, 34921=>7170, 35283=>7171, 35332=>7172, 35335=>7173, 36210=>7174, 36835=>7175, 36833=>7176, 36846=>7177, 36832=>7178, 37105=>7179, 37053=>7180, 37055=>7181, 37077=>7182, 37061=>7183, 37054=>7184, 37063=>7185, 37067=>7186, 37064=>7187, 37332=>7188, 60294=>7188, 37331=>7189, 38484=>7190, 38479=>7191, 38481=>7192, 38483=>7193, 38474=>7194, 38478=>7195, 20510=>7196, 20485=>7197, 20487=>7198, 20499=>7199, 20514=>7200, 20528=>7201, 20507=>7202, 20469=>7203, 20468=>7204, 20531=>7205, 20535=>7206, 20524=>7207, 20470=>7208, 20471=>7209, 20503=>7210, 20508=>7211, 20512=>7212, 20519=>7213, 20533=>7214, 20527=>7215, 20529=>7216, 20494=>7217, 20826=>7218, 20884=>7219, 20883=>7220, 20938=>7221, 20932=>7222, 20933=>7223, 20936=>7224, 20942=>7225, 21089=>7226, 21082=>7227, 21074=>7228, 21086=>7229, 21087=>7230, 21077=>7231, 21090=>7232, 21197=>7233, 21262=>7234, 21406=>7235, 21798=>7236, 21730=>7237, 21783=>7238, 21778=>7239, 21735=>7240, 21747=>7241, 21732=>7242, 21786=>7243, 21759=>7244, 21764=>7245, 21768=>7246, 21739=>7247, 21777=>7248, 21765=>7249, 21745=>7250, 21770=>7251, 21755=>7252, 21751=>7253, 21752=>7254, 21728=>7255, 21774=>7256, 21763=>7257, 21771=>7258, 22273=>7259, 22274=>7260, 22476=>7261, 22578=>7262, 22485=>7263, 22482=>7264, 22458=>7265, 22470=>7266, 22461=>7267, 22460=>7268, 22456=>7269, 22454=>7270, 22463=>7271, 22471=>7272, 22480=>7273, 22457=>7274, 22465=>7275, 22798=>7276, 22858=>7277, 23065=>7278, 23062=>7279, 23085=>7280, 23086=>7281, 23061=>7282, 23055=>7283, 23063=>7284, 23050=>7285, 23070=>7286, 23091=>7287, 23404=>7288, 23463=>7289, 23469=>7290, 23468=>7291, 23555=>7292, 23638=>7293, 23636=>7294, 23788=>7295, 23807=>7296, 23790=>7297, 23793=>7298, 23799=>7299, 23808=>7300, 23801=>7301, 24105=>7302, 24104=>7303, 24232=>7304, 24238=>7305, 24234=>7306, 24236=>7307, 24371=>7308, 24368=>7309, 24423=>7310, 24669=>7311, 24666=>7312, 24679=>7313, 24641=>7314, 24738=>7315, 24712=>7316, 24704=>7317, 24722=>7318, 24705=>7319, 24733=>7320, 24707=>7321, 24725=>7322, 24731=>7323, 24727=>7324, 24711=>7325, 24732=>7326, 24718=>7327, 25113=>7328, 25158=>7329, 25330=>7330, 25360=>7331, 25430=>7332, 25388=>7333, 25412=>7334, 25413=>7335, 25398=>7336, 25411=>7337, 25572=>7338, 25401=>7339, 25419=>7340, 25418=>7341, 25404=>7342, 25385=>7343, 25409=>7344, 25396=>7345, 25432=>7346, 25428=>7347, 25433=>7348, 25389=>7349, 25415=>7350, 25395=>7351, 25434=>7352, 25425=>7353, 25400=>7354, 25431=>7355, 25408=>7356, 25416=>7357, 25930=>7358, 25926=>7359, 26054=>7360, 26051=>7361, 26052=>7362, 26050=>7363, 26186=>7364, 26207=>7365, 26183=>7366, 26193=>7367, 26386=>7368, 26387=>7369, 26655=>7370, 26650=>7371, 26697=>7372, 26674=>7373, 26675=>7374, 26683=>7375, 26699=>7376, 26703=>7377, 26646=>7378, 26673=>7379, 26652=>7380, 26677=>7381, 26667=>7382, 26669=>7383, 26671=>7384, 26702=>7385, 26692=>7386, 26676=>7387, 26653=>7388, 26642=>7389, 26644=>7390, 26662=>7391, 26664=>7392, 26670=>7393, 26701=>7394, 26682=>7395, 26661=>7396, 26656=>7397, 27436=>7398, 27439=>7399, 27437=>7400, 27441=>7401, 27444=>7402, 27501=>7403, 32898=>7404, 27528=>7405, 27622=>7406, 27620=>7407, 27624=>7408, 27619=>7409, 27618=>7410, 27623=>7411, 27685=>7412, 28026=>7413, 28003=>7414, 28004=>7415, 28022=>7416, 27917=>7417, 28001=>7418, 28050=>7419, 27992=>7420, 28002=>7421, 28013=>7422, 28015=>7423, 28049=>7424, 28045=>7425, 28143=>7426, 28031=>7427, 28038=>7428, 27998=>7429, 28007=>7430, 59078=>7430, 28000=>7431, 28055=>7432, 28016=>7433, 28028=>7434, 27999=>7435, 28034=>7436, 28056=>7437, 27951=>7438, 28008=>7439, 28043=>7440, 28030=>7441, 28032=>7442, 28036=>7443, 27926=>7444, 28035=>7445, 28027=>7446, 28029=>7447, 28021=>7448, 28048=>7449, 28892=>7450, 28883=>7451, 28881=>7452, 28893=>7453, 28875=>7454, 32569=>7455, 28898=>7456, 28887=>7457, 28882=>7458, 28894=>7459, 28896=>7460, 28884=>7461, 28877=>7462, 28869=>7463, 28870=>7464, 28871=>7465, 28890=>7466, 28878=>7467, 28897=>7468, 29250=>7469, 29304=>7470, 29303=>7471, 29302=>7472, 29440=>7473, 29434=>7474, 29428=>7475, 29438=>7476, 29430=>7477, 29427=>7478, 29435=>7479, 29441=>7480, 29651=>7481, 29657=>7482, 29669=>7483, 29654=>7484, 29628=>7485, 29671=>7486, 29667=>7487, 29673=>7488, 29660=>7489, 29650=>7490, 29659=>7491, 29652=>7492, 29661=>7493, 29658=>7494, 29655=>7495, 29656=>7496, 29672=>7497, 29918=>7498, 29919=>7499, 29940=>7500, 29941=>7501, 29985=>7502, 30043=>7503, 30047=>7504, 30128=>7505, 30145=>7506, 30139=>7507, 30148=>7508, 30144=>7509, 30143=>7510, 30134=>7511, 30138=>7512, 30346=>7513, 30409=>7514, 30493=>7515, 30491=>7516, 30480=>7517, 30483=>7518, 30482=>7519, 30499=>7520, 30481=>7521, 30485=>7522, 30489=>7523, 30490=>7524, 30498=>7525, 30503=>7526, 30755=>7527, 30764=>7528, 30754=>7529, 30773=>7530, 30767=>7531, 30760=>7532, 30766=>7533, 30763=>7534, 30753=>7535, 30761=>7536, 30771=>7537, 30762=>7538, 30769=>7539, 31060=>7540, 31067=>7541, 31055=>7542, 31068=>7543, 31059=>7544, 31058=>7545, 31057=>7546, 31211=>7547, 31212=>7548, 31200=>7549, 31214=>7550, 31213=>7551, 31210=>7552, 31196=>7553, 31198=>7554, 31197=>7555, 31366=>7556, 31369=>7557, 31365=>7558, 31371=>7559, 31372=>7560, 31370=>7561, 31367=>7562, 31448=>7563, 31504=>7564, 31492=>7565, 31507=>7566, 31493=>7567, 31503=>7568, 31496=>7569, 31498=>7570, 31502=>7571, 31497=>7572, 31506=>7573, 31876=>7574, 31889=>7575, 31882=>7576, 31884=>7577, 31880=>7578, 31885=>7579, 31877=>7580, 32030=>7581, 32029=>7582, 32017=>7583, 32014=>7584, 32024=>7585, 32022=>7586, 32019=>7587, 32031=>7588, 32018=>7589, 32015=>7590, 32012=>7591, 32604=>7592, 32609=>7593, 32606=>7594, 32608=>7595, 32605=>7596, 32603=>7597, 32662=>7598, 32658=>7599, 32707=>7600, 32706=>7601, 32704=>7602, 32790=>7603, 32830=>7604, 32825=>7605, 33018=>7606, 33010=>7607, 33017=>7608, 33013=>7609, 33025=>7610, 33019=>7611, 33024=>7612, 33281=>7613, 33327=>7614, 33317=>7615, 33587=>7616, 33581=>7617, 33604=>7618, 33561=>7619, 33617=>7620, 33573=>7621, 33622=>7622, 33599=>7623, 33601=>7624, 33574=>7625, 33564=>7626, 33570=>7627, 33602=>7628, 33614=>7629, 33563=>7630, 33578=>7631, 33544=>7632, 33596=>7633, 33613=>7634, 33558=>7635, 33572=>7636, 33568=>7637, 33591=>7638, 33583=>7639, 33577=>7640, 33607=>7641, 33605=>7642, 33612=>7643, 33619=>7644, 33566=>7645, 33580=>7646, 33611=>7647, 33575=>7648, 33608=>7649, 34387=>7650, 34386=>7651, 34466=>7652, 34472=>7653, 34454=>7654, 34445=>7655, 34449=>7656, 34462=>7657, 34439=>7658, 34455=>7659, 34438=>7660, 34443=>7661, 34458=>7662, 34437=>7663, 34469=>7664, 34457=>7665, 34465=>7666, 34471=>7667, 34453=>7668, 34456=>7669, 34446=>7670, 34461=>7671, 34448=>7672, 34452=>7673, 34883=>7674, 34884=>7675, 34925=>7676, 34933=>7677, 34934=>7678, 34930=>7679, 34944=>7680, 34929=>7681, 34943=>7682, 34927=>7683, 34947=>7684, 34942=>7685, 34932=>7686, 34940=>7687, 35346=>7688, 35911=>7689, 35927=>7690, 35963=>7691, 36004=>7692, 36003=>7693, 36214=>7694, 36216=>7695, 36277=>7696, 36279=>7697, 36278=>7698, 36561=>7699, 36563=>7700, 36862=>7701, 36853=>7702, 36866=>7703, 36863=>7704, 36859=>7705, 36868=>7706, 36860=>7707, 36854=>7708, 37078=>7709, 37088=>7710, 37081=>7711, 37082=>7712, 37091=>7713, 37087=>7714, 37093=>7715, 37080=>7716, 37083=>7717, 37079=>7718, 37084=>7719, 37092=>7720, 37200=>7721, 37198=>7722, 37199=>7723, 37333=>7724, 37346=>7725, 37338=>7726, 38492=>7727, 38495=>7728, 38588=>7729, 39139=>7730, 12221=>7731, 39647=>7731, 12223=>7732, 39727=>7732, 20095=>7733, 20592=>7734, 20586=>7735, 20577=>7736, 20574=>7737, 20576=>7738, 20563=>7739, 20555=>7740, 20573=>7741, 20594=>7742, 20552=>7743, 20557=>7744, 20545=>7745, 20571=>7746, 20554=>7747, 20578=>7748, 20501=>7749, 20549=>7750, 20575=>7751, 20585=>7752, 20587=>7753, 20579=>7754, 20580=>7755, 20550=>7756, 20544=>7757, 20590=>7758, 20595=>7759, 20567=>7760, 20561=>7761, 20944=>7762, 21099=>7763, 21101=>7764, 21100=>7765, 21102=>7766, 21206=>7767, 21203=>7768, 21293=>7769, 21404=>7770, 21877=>7771, 21878=>7772, 21820=>7773, 21837=>7774, 21840=>7775, 21812=>7776, 21802=>7777, 21841=>7778, 21858=>7779, 21814=>7780, 21813=>7781, 21808=>7782, 21842=>7783, 21829=>7784, 21772=>7785, 21810=>7786, 21861=>7787, 21838=>7788, 21817=>7789, 21832=>7790, 21805=>7791, 21819=>7792, 21824=>7793, 21835=>7794, 22282=>7795, 22279=>7796, 22523=>7797, 22548=>7798, 22498=>7799, 22518=>7800, 22492=>7801, 22516=>7802, 22528=>7803, 22509=>7804, 22525=>7805, 22536=>7806, 22520=>7807, 22539=>7808, 22515=>7809, 22479=>7810, 22535=>7811, 22510=>7812, 22499=>7813, 22514=>7814, 22501=>7815, 22508=>7816, 22497=>7817, 22542=>7818, 22524=>7819, 22544=>7820, 22503=>7821, 22529=>7822, 22540=>7823, 22513=>7824, 22505=>7825, 22512=>7826, 22541=>7827, 22532=>7828, 22876=>7829, 23136=>7830, 23128=>7831, 23125=>7832, 23143=>7833, 60437=>7833, 23134=>7834, 23096=>7835, 23093=>7836, 23149=>7837, 23120=>7838, 23135=>7839, 23141=>7840, 23148=>7841, 23123=>7842, 23140=>7843, 23127=>7844, 23107=>7845, 23133=>7846, 23122=>7847, 23108=>7848, 23131=>7849, 23112=>7850, 23182=>7851, 23102=>7852, 23117=>7853, 23097=>7854, 23116=>7855, 23152=>7856, 23145=>7857, 23111=>7858, 23121=>7859, 23126=>7860, 23106=>7861, 23132=>7862, 23410=>7863, 23406=>7864, 23489=>7865, 23488=>7866, 23641=>7867, 23838=>7868, 23819=>7869, 23837=>7870, 23834=>7871, 23840=>7872, 23820=>7873, 23848=>7874, 23821=>7875, 23846=>7876, 23845=>7877, 23823=>7878, 23856=>7879, 23826=>7880, 23843=>7881, 23839=>7882, 23854=>7883, 24126=>7884, 24116=>7885, 24241=>7886, 24244=>7887, 24249=>7888, 24242=>7889, 24243=>7890, 24374=>7891, 24376=>7892, 24475=>7893, 24470=>7894, 24479=>7895, 24714=>7896, 24720=>7897, 24710=>7898, 24766=>7899, 24752=>7900, 24762=>7901, 24787=>7902, 24788=>7903, 24783=>7904, 24804=>7905, 24793=>7906, 24797=>7907, 24776=>7908, 24753=>7909, 24795=>7910, 24759=>7911, 24778=>7912, 24767=>7913, 24771=>7914, 24781=>7915, 24768=>7916, 25394=>7917, 25445=>7918, 25482=>7919, 25474=>7920, 25469=>7921, 25533=>7922, 25502=>7923, 25517=>7924, 25501=>7925, 25495=>7926, 25515=>7927, 25486=>7928, 25455=>7929, 25479=>7930, 25488=>7931, 25454=>7932, 25519=>7933, 25461=>7934, 25500=>7935, 25453=>7936, 25518=>7937, 25468=>7938, 25508=>7939, 25403=>7940, 25503=>7941, 25464=>7942, 25477=>7943, 25473=>7944, 25489=>7945, 25485=>7946, 25456=>7947, 25939=>7948, 26061=>7949, 26213=>7950, 26209=>7951, 26203=>7952, 26201=>7953, 26204=>7954, 26210=>7955, 26392=>7956, 26745=>7957, 26759=>7958, 26768=>7959, 26780=>7960, 26733=>7961, 26734=>7962, 26798=>7963, 26795=>7964, 26966=>7965, 26735=>7966, 26787=>7967, 26796=>7968, 26793=>7969, 26741=>7970, 26740=>7971, 26802=>7972, 26767=>7973, 26743=>7974, 26770=>7975, 26748=>7976, 26731=>7977, 26738=>7978, 26794=>7979, 26752=>7980, 26737=>7981, 26750=>7982, 26779=>7983, 26774=>7984, 26763=>7985, 26784=>7986, 26761=>7987, 26788=>7988, 26744=>7989, 26747=>7990, 26769=>7991, 26764=>7992, 26762=>7993, 26749=>7994, 27446=>7995, 27443=>7996, 27447=>7997, 27448=>7998, 27537=>7999, 27535=>8000, 27533=>8001, 27534=>8002, 27532=>8003, 27690=>8004, 28096=>8005, 28075=>8006, 28084=>8007, 28083=>8008, 28276=>8009, 28076=>8010, 28137=>8011, 28130=>8012, 28087=>8013, 28150=>8014, 28116=>8015, 28160=>8016, 28104=>8017, 28128=>8018, 28127=>8019, 28118=>8020, 28094=>8021, 28133=>8022, 28124=>8023, 28125=>8024, 28123=>8025, 28148=>8026, 28106=>8027, 28093=>8028, 28141=>8029, 28144=>8030, 28090=>8031, 28117=>8032, 28098=>8033, 28111=>8034, 28105=>8035, 28112=>8036, 28146=>8037, 28115=>8038, 28157=>8039, 28119=>8040, 28109=>8041, 28131=>8042, 28091=>8043, 28922=>8044, 28941=>8045, 28919=>8046, 28951=>8047, 28916=>8048, 28940=>8049, 28912=>8050, 28932=>8051, 28915=>8052, 28944=>8053, 28924=>8054, 28927=>8055, 28934=>8056, 28947=>8057, 28928=>8058, 28920=>8059, 28918=>8060, 28939=>8061, 28930=>8062, 28942=>8063, 29310=>8064, 29307=>8065, 29308=>8066, 29311=>8067, 29469=>8068, 29463=>8069, 29447=>8070, 29457=>8071, 29464=>8072, 29450=>8073, 29448=>8074, 29439=>8075, 29455=>8076, 29470=>8077, 29576=>8078, 29686=>8079, 29688=>8080, 29685=>8081, 29700=>8082, 29697=>8083, 29693=>8084, 29703=>8085, 29696=>8086, 29690=>8087, 29692=>8088, 29695=>8089, 29708=>8090, 29707=>8091, 29684=>8092, 29704=>8093, 30052=>8094, 30051=>8095, 30158=>8096, 30162=>8097, 30159=>8098, 30155=>8099, 30156=>8100, 30161=>8101, 30160=>8102, 30351=>8103, 30345=>8104, 30419=>8105, 30521=>8106, 30511=>8107, 30509=>8108, 30513=>8109, 30514=>8110, 30516=>8111, 30515=>8112, 30525=>8113, 30501=>8114, 30523=>8115, 30517=>8116, 30792=>8117, 30802=>8118, 30793=>8119, 30797=>8120, 30794=>8121, 30796=>8122, 30758=>8123, 30789=>8124, 30800=>8125, 31076=>8126, 31079=>8127, 31081=>8128, 31082=>8129, 31075=>8130, 31083=>8131, 31073=>8132, 31163=>8133, 31226=>8134, 31224=>8135, 31222=>8136, 31223=>8137, 31375=>8138, 31380=>8139, 31376=>8140, 31541=>8141, 31547=>8142, 31540=>8143, 31525=>8144, 31536=>8145, 31522=>8146, 31524=>8147, 31539=>8148, 31512=>8149, 31530=>8150, 31517=>8151, 31537=>8152, 31531=>8153, 31533=>8154, 31535=>8155, 31538=>8156, 31544=>8157, 31514=>8158, 31523=>8159, 31892=>8160, 31896=>8161, 31894=>8162, 31907=>8163, 32053=>8164, 32061=>8165, 32056=>8166, 32054=>8167, 32058=>8168, 32069=>8169, 32044=>8170, 32041=>8171, 32065=>8172, 32071=>8173, 32062=>8174, 32063=>8175, 32074=>8176, 32059=>8177, 32040=>8178, 32611=>8179, 32661=>8180, 32668=>8181, 32669=>8182, 32667=>8183, 32714=>8184, 32715=>8185, 32717=>8186, 32720=>8187, 32721=>8188, 32711=>8189, 32719=>8190, 32713=>8191, 32799=>8192, 32798=>8193, 32795=>8194, 32839=>8195, 32835=>8196, 32840=>8197, 33048=>8198, 33061=>8199, 33049=>8200, 33051=>8201, 33069=>8202, 33055=>8203, 33068=>8204, 33054=>8205, 33057=>8206, 33045=>8207, 33063=>8208, 33053=>8209, 33058=>8210, 33297=>8211, 33336=>8212, 33331=>8213, 33338=>8214, 33332=>8215, 33330=>8216, 33396=>8217, 33680=>8218, 33699=>8219, 33704=>8220, 33677=>8221, 33658=>8222, 33651=>8223, 33700=>8224, 33652=>8225, 33679=>8226, 33665=>8227, 33685=>8228, 33689=>8229, 33653=>8230, 33684=>8231, 33705=>8232, 33661=>8233, 33667=>8234, 33676=>8235, 33693=>8236, 33691=>8237, 33706=>8238, 33675=>8239, 33662=>8240, 33701=>8241, 33711=>8242, 33672=>8243, 33687=>8244, 33712=>8245, 33663=>8246, 33702=>8247, 33671=>8248, 33710=>8249, 33654=>8250, 34393=>8251, 34390=>8252, 34495=>8253, 34487=>8254, 34498=>8255, 34497=>8256, 34501=>8257, 34490=>8258, 34480=>8259, 34504=>8260, 34489=>8261, 34483=>8262, 34488=>8263, 34508=>8264, 34484=>8265, 34491=>8266, 34492=>8267, 34499=>8268, 34493=>8269, 34494=>8270, 34898=>8271, 34953=>8272, 34965=>8273, 34984=>8274, 34978=>8275, 34986=>8276, 34970=>8277, 34961=>8278, 34977=>8279, 34975=>8280, 34968=>8281, 34983=>8282, 34969=>8283, 34971=>8284, 34967=>8285, 34980=>8286, 34988=>8287, 34956=>8288, 34963=>8289, 34958=>8290, 35202=>8291, 35286=>8292, 35289=>8293, 35285=>8294, 35376=>8295, 35367=>8296, 35372=>8297, 35358=>8298, 35897=>8299, 35899=>8300, 35932=>8301, 35933=>8302, 35965=>8303, 36005=>8304, 36221=>8305, 36219=>8306, 36217=>8307, 36284=>8308, 36290=>8309, 36281=>8310, 36287=>8311, 36289=>8312, 36568=>8313, 36574=>8314, 36573=>8315, 36572=>8316, 36567=>8317, 36576=>8318, 36577=>8319, 36900=>8320, 36875=>8321, 36881=>8322, 36892=>8323, 36876=>8324, 36897=>8325, 37103=>8326, 37098=>8327, 37104=>8328, 37108=>8329, 37106=>8330, 37107=>8331, 37076=>8332, 37099=>8333, 37100=>8334, 37097=>8335, 37206=>8336, 37208=>8337, 37210=>8338, 37203=>8339, 37205=>8340, 37356=>8341, 37364=>8342, 37361=>8343, 37363=>8344, 37368=>8345, 37348=>8346, 37369=>8347, 37354=>8348, 37355=>8349, 37367=>8350, 37352=>8351, 37358=>8352, 38266=>8353, 38278=>8354, 38280=>8355, 38524=>8356, 38509=>8357, 38507=>8358, 38513=>8359, 38511=>8360, 38591=>8361, 38762=>8362, 38916=>8363, 39141=>8364, 39319=>8365, 20635=>8366, 20629=>8367, 20628=>8368, 20638=>8369, 20619=>8370, 20643=>8371, 20611=>8372, 20620=>8373, 20622=>8374, 20637=>8375, 20584=>8376, 20636=>8377, 20626=>8378, 20610=>8379, 20615=>8380, 20831=>8381, 20948=>8382, 21266=>8383, 21265=>8384, 21412=>8385, 21415=>8386, 21905=>8387, 21928=>8388, 21925=>8389, 21933=>8390, 21879=>8391, 22085=>8392, 21922=>8393, 21907=>8394, 21896=>8395, 21903=>8396, 21941=>8397, 21889=>8398, 21923=>8399, 21906=>8400, 21924=>8401, 21885=>8402, 21900=>8403, 21926=>8404, 21887=>8405, 21909=>8406, 21921=>8407, 21902=>8408, 22284=>8409, 22569=>8410, 22583=>8411, 22553=>8412, 22558=>8413, 22567=>8414, 22563=>8415, 22568=>8416, 22517=>8417, 22600=>8418, 22565=>8419, 22556=>8420, 22555=>8421, 22579=>8422, 22591=>8423, 22582=>8424, 22574=>8425, 22585=>8426, 22584=>8427, 22573=>8428, 22572=>8429, 22587=>8430, 22881=>8431, 23215=>8432, 23188=>8433, 23199=>8434, 23162=>8435, 23202=>8436, 23198=>8437, 23160=>8438, 23206=>8439, 23164=>8440, 23205=>8441, 23212=>8442, 23189=>8443, 23214=>8444, 23095=>8445, 23172=>8446, 23178=>8447, 23191=>8448, 23171=>8449, 23179=>8450, 23209=>8451, 23163=>8452, 23165=>8453, 23180=>8454, 23196=>8455, 23183=>8456, 23187=>8457, 23197=>8458, 23530=>8459, 23501=>8460, 23499=>8461, 23508=>8462, 23505=>8463, 23498=>8464, 23502=>8465, 23564=>8466, 23600=>8467, 23863=>8468, 23875=>8469, 23915=>8470, 23873=>8471, 23883=>8472, 23871=>8473, 23861=>8474, 23889=>8475, 23886=>8476, 23893=>8477, 23859=>8478, 23866=>8479, 23890=>8480, 23869=>8481, 23857=>8482, 23897=>8483, 23874=>8484, 23865=>8485, 23881=>8486, 23864=>8487, 23868=>8488, 23858=>8489, 23862=>8490, 23872=>8491, 23877=>8492, 24132=>8493, 24129=>8494, 24408=>8495, 57673=>8495, 24486=>8496, 24485=>8497, 24491=>8498, 24777=>8499, 24761=>8500, 24780=>8501, 24802=>8502, 24782=>8503, 24772=>8504, 24852=>8505, 24818=>8506, 24842=>8507, 24854=>8508, 24837=>8509, 24821=>8510, 24851=>8511, 24824=>8512, 24828=>8513, 24830=>8514, 24769=>8515, 24835=>8516, 24856=>8517, 24861=>8518, 24848=>8519, 24831=>8520, 24836=>8521, 24843=>8522, 25162=>8523, 25492=>8524, 25521=>8525, 25520=>8526, 25550=>8527, 25573=>8528, 25576=>8529, 25583=>8530, 25539=>8531, 25757=>8532, 25587=>8533, 25546=>8534, 25568=>8535, 25590=>8536, 25557=>8537, 25586=>8538, 25589=>8539, 25697=>8540, 25567=>8541, 25534=>8542, 25565=>8543, 25564=>8544, 25540=>8545, 25560=>8546, 25555=>8547, 25538=>8548, 25543=>8549, 25548=>8550, 25547=>8551, 25544=>8552, 25584=>8553, 25559=>8554, 25561=>8555, 25906=>8556, 25959=>8557, 25962=>8558, 25956=>8559, 25948=>8560, 25960=>8561, 25957=>8562, 25996=>8563, 26013=>8564, 26014=>8565, 26030=>8566, 26064=>8567, 26066=>8568, 26236=>8569, 26220=>8570, 26235=>8571, 26240=>8572, 26225=>8573, 26233=>8574, 26218=>8575, 26226=>8576, 26369=>8577, 26892=>8578, 26835=>8579, 26884=>8580, 26844=>8581, 26922=>8582, 26860=>8583, 26858=>8584, 26865=>8585, 26895=>8586, 26838=>8587, 26871=>8588, 26859=>8589, 26852=>8590, 26870=>8591, 26899=>8592, 26896=>8593, 26867=>8594, 26849=>8595, 26887=>8596, 26828=>8597, 26888=>8598, 26992=>8599, 26804=>8600, 26897=>8601, 26863=>8602, 26822=>8603, 26900=>8604, 26872=>8605, 26832=>8606, 26877=>8607, 26876=>8608, 26856=>8609, 26891=>8610, 26890=>8611, 26903=>8612, 26830=>8613, 26824=>8614, 26845=>8615, 26846=>8616, 26854=>8617, 26868=>8618, 26833=>8619, 26886=>8620, 26836=>8621, 26857=>8622, 26901=>8623, 26917=>8624, 26823=>8625, 27449=>8626, 27451=>8627, 27455=>8628, 27452=>8629, 27540=>8630, 27543=>8631, 27545=>8632, 27541=>8633, 27581=>8634, 27632=>8635, 27634=>8636, 27635=>8637, 27696=>8638, 28156=>8639, 28230=>8640, 28231=>8641, 28191=>8642, 28233=>8643, 28296=>8644, 28220=>8645, 28221=>8646, 28229=>8647, 28258=>8648, 28203=>8649, 28223=>8650, 28225=>8651, 28253=>8652, 28275=>8653, 28188=>8654, 28211=>8655, 28235=>8656, 28224=>8657, 28241=>8658, 28219=>8659, 28163=>8660, 28206=>8661, 28254=>8662, 28264=>8663, 28252=>8664, 28257=>8665, 28209=>8666, 28200=>8667, 28256=>8668, 28273=>8669, 28267=>8670, 28217=>8671, 28194=>8672, 28208=>8673, 28243=>8674, 28261=>8675, 28199=>8676, 28280=>8677, 28260=>8678, 28279=>8679, 28245=>8680, 28281=>8681, 28242=>8682, 28262=>8683, 28213=>8684, 28214=>8685, 28250=>8686, 28960=>8687, 28958=>8688, 28975=>8689, 28923=>8690, 28974=>8691, 28977=>8692, 28963=>8693, 28965=>8694, 28962=>8695, 28978=>8696, 28959=>8697, 28968=>8698, 28986=>8699, 28955=>8700, 29259=>8701, 29274=>8702, 29320=>8703, 29321=>8704, 29318=>8705, 29317=>8706, 29323=>8707, 29458=>8708, 29451=>8709, 29488=>8710, 29474=>8711, 29489=>8712, 29491=>8713, 29479=>8714, 29490=>8715, 29485=>8716, 29478=>8717, 29475=>8718, 29493=>8719, 29452=>8720, 29742=>8721, 29740=>8722, 29744=>8723, 29739=>8724, 29718=>8725, 29722=>8726, 29729=>8727, 29741=>8728, 29745=>8729, 29732=>8730, 29731=>8731, 29725=>8732, 29737=>8733, 29728=>8734, 29746=>8735, 29947=>8736, 29999=>8737, 30063=>8738, 30060=>8739, 30183=>8740, 30170=>8741, 30177=>8742, 30182=>8743, 30173=>8744, 30175=>8745, 30180=>8746, 30167=>8747, 30357=>8748, 30354=>8749, 30426=>8750, 30534=>8751, 30535=>8752, 30532=>8753, 30541=>8754, 30533=>8755, 30538=>8756, 30542=>8757, 30539=>8758, 30540=>8759, 30686=>8760, 30700=>8761, 30816=>8762, 30820=>8763, 30821=>8764, 30812=>8765, 30829=>8766, 30833=>8767, 30826=>8768, 30830=>8769, 30832=>8770, 30825=>8771, 30824=>8772, 30814=>8773, 30818=>8774, 31092=>8775, 31091=>8776, 31090=>8777, 31088=>8778, 31234=>8779, 31242=>8780, 31235=>8781, 31244=>8782, 31236=>8783, 31385=>8784, 31462=>8785, 31460=>8786, 31562=>8787, 31559=>8788, 31556=>8789, 31560=>8790, 31564=>8791, 31566=>8792, 31552=>8793, 31576=>8794, 31557=>8795, 31906=>8796, 31902=>8797, 31912=>8798, 31905=>8799, 32088=>8800, 32111=>8801, 32099=>8802, 32083=>8803, 32086=>8804, 32103=>8805, 32106=>8806, 32079=>8807, 32109=>8808, 32092=>8809, 32107=>8810, 32082=>8811, 32084=>8812, 32105=>8813, 32081=>8814, 32095=>8815, 32078=>8816, 32574=>8817, 32575=>8818, 32613=>8819, 32614=>8820, 32674=>8821, 32672=>8822, 32673=>8823, 32727=>8824, 32849=>8825, 32847=>8826, 32848=>8827, 33022=>8828, 32980=>8829, 33091=>8830, 33098=>8831, 33106=>8832, 33103=>8833, 33095=>8834, 33085=>8835, 33101=>8836, 33082=>8837, 33254=>8838, 33262=>8839, 33271=>8840, 33272=>8841, 33273=>8842, 33284=>8843, 33340=>8844, 33341=>8845, 33343=>8846, 33397=>8847, 33595=>8848, 33743=>8849, 60382=>8849, 33785=>8850, 33827=>8851, 33728=>8852, 33768=>8853, 33810=>8854, 33767=>8855, 33764=>8856, 33788=>8857, 33782=>8858, 33808=>8859, 33734=>8860, 33736=>8861, 33771=>8862, 33763=>8863, 33727=>8864, 33793=>8865, 33757=>8866, 33765=>8867, 33752=>8868, 33791=>8869, 33761=>8870, 33739=>8871, 33742=>8872, 33750=>8873, 33781=>8874, 33737=>8875, 33801=>8876, 33807=>8877, 58332=>8877, 33758=>8878, 33809=>8879, 33798=>8880, 33730=>8881, 33779=>8882, 33749=>8883, 33786=>8884, 33735=>8885, 33745=>8886, 33770=>8887, 33811=>8888, 33690=>8889, 33731=>8890, 33772=>8891, 33774=>8892, 33732=>8893, 33787=>8894, 33751=>8895, 33762=>8896, 33819=>8897, 33755=>8898, 33790=>8899, 34520=>8900, 34530=>8901, 34534=>8902, 34515=>8903, 34531=>8904, 34522=>8905, 34538=>8906, 34525=>8907, 34539=>8908, 34524=>8909, 34540=>8910, 34537=>8911, 34519=>8912, 34536=>8913, 34513=>8914, 34888=>8915, 34902=>8916, 34901=>8917, 35002=>8918, 35031=>8919, 35001=>8920, 35000=>8921, 35008=>8922, 35006=>8923, 34998=>8924, 35004=>8925, 34999=>8926, 35005=>8927, 34994=>8928, 35073=>8929, 35017=>8930, 35221=>8931, 35224=>8932, 35223=>8933, 35293=>8934, 35290=>8935, 35291=>8936, 35406=>8937, 35405=>8938, 35385=>8939, 35417=>8940, 35392=>8941, 35415=>8942, 35416=>8943, 35396=>8944, 35397=>8945, 35410=>8946, 35400=>8947, 35409=>8948, 35402=>8949, 35404=>8950, 35407=>8951, 35935=>8952, 35969=>8953, 35968=>8954, 36026=>8955, 36030=>8956, 36016=>8957, 36025=>8958, 36021=>8959, 36228=>8960, 36224=>8961, 36233=>8962, 36312=>8963, 36307=>8964, 36301=>8965, 36295=>8966, 36310=>8967, 36316=>8968, 36303=>8969, 36309=>8970, 36313=>8971, 36296=>8972, 36311=>8973, 36293=>8974, 36591=>8975, 36599=>8976, 36602=>8977, 36601=>8978, 36582=>8979, 36590=>8980, 36581=>8981, 36597=>8982, 36583=>8983, 36584=>8984, 36598=>8985, 36587=>8986, 36593=>8987, 36588=>8988, 36596=>8989, 36585=>8990, 36909=>8991, 36916=>8992, 36911=>8993, 37126=>8994, 37164=>8995, 37124=>8996, 60367=>8996, 37119=>8997, 37116=>8998, 37128=>8999, 37113=>9000, 37115=>9001, 37121=>9002, 37120=>9003, 37127=>9004, 37125=>9005, 37123=>9006, 37217=>9007, 37220=>9008, 37215=>9009, 37218=>9010, 37216=>9011, 37377=>9012, 37386=>9013, 37413=>9014, 37379=>9015, 37402=>9016, 37414=>9017, 37391=>9018, 37388=>9019, 37376=>9020, 37394=>9021, 37375=>9022, 37373=>9023, 37382=>9024, 37380=>9025, 37415=>9026, 37378=>9027, 37404=>9028, 37412=>9029, 37401=>9030, 37399=>9031, 37381=>9032, 37398=>9033, 38267=>9034, 38285=>9035, 38284=>9036, 38288=>9037, 38535=>9038, 38526=>9039, 38536=>9040, 38537=>9041, 38531=>9042, 38528=>9043, 38594=>9044, 38600=>9045, 38595=>9046, 38641=>9047, 38640=>9048, 38764=>9049, 38768=>9050, 38766=>9051, 38919=>9052, 39081=>9053, 39147=>9054, 40166=>9055, 12235=>9056, 40697=>9056, 20099=>9057, 20100=>9058, 20150=>9059, 20669=>9060, 20671=>9061, 20678=>9062, 20654=>9063, 20676=>9064, 20682=>9065, 20660=>9066, 20680=>9067, 20674=>9068, 20656=>9069, 20673=>9070, 20666=>9071, 20657=>9072, 20683=>9073, 20681=>9074, 20662=>9075, 20664=>9076, 20951=>9077, 21114=>9078, 21112=>9079, 21115=>9080, 21116=>9081, 21955=>9082, 21979=>9083, 21964=>9084, 21968=>9085, 21963=>9086, 21962=>9087, 21981=>9088, 21952=>9089, 64013=>9089, 21972=>9090, 21956=>9091, 21993=>9092, 21951=>9093, 21970=>9094, 21901=>9095, 21967=>9096, 21973=>9097, 21986=>9098, 21974=>9099, 21960=>9100, 22002=>9101, 21965=>9102, 21977=>9103, 21954=>9104, 22292=>9105, 22611=>9106, 22632=>9107, 22628=>9108, 22607=>9109, 22605=>9110, 22601=>9111, 22639=>9112, 22613=>9113, 22606=>9114, 22621=>9115, 22617=>9116, 22629=>9117, 22619=>9118, 22589=>9119, 22627=>9120, 22641=>9121, 22780=>9122, 23239=>9123, 23236=>9124, 23243=>9125, 23226=>9126, 23224=>9127, 23217=>9128, 23221=>9129, 23216=>9130, 23231=>9131, 23240=>9132, 23227=>9133, 23238=>9134, 23223=>9135, 23232=>9136, 23242=>9137, 23220=>9138, 23222=>9139, 23245=>9140, 23225=>9141, 23184=>9142, 23510=>9143, 23512=>9144, 23513=>9145, 23583=>9146, 23603=>9147, 23921=>9148, 23907=>9149, 23882=>9150, 23909=>9151, 23922=>9152, 23916=>9153, 23902=>9154, 23912=>9155, 23911=>9156, 23906=>9157, 24048=>9158, 24143=>9159, 24142=>9160, 24138=>9161, 24141=>9162, 24139=>9163, 24261=>9164, 24268=>9165, 24262=>9166, 24267=>9167, 24263=>9168, 24384=>9169, 24495=>9170, 24493=>9171, 24823=>9172, 24905=>9173, 24906=>9174, 24875=>9175, 24901=>9176, 24886=>9177, 24882=>9178, 24878=>9179, 24902=>9180, 24879=>9181, 24911=>9182, 24873=>9183, 24896=>9184, 25120=>9185, 37224=>9186, 25123=>9187, 25125=>9188, 25124=>9189, 25541=>9190, 25585=>9191, 25579=>9192, 25616=>9193, 25618=>9194, 25609=>9195, 25632=>9196, 25636=>9197, 25651=>9198, 25667=>9199, 25631=>9200, 25621=>9201, 25624=>9202, 25657=>9203, 25655=>9204, 25634=>9205, 25635=>9206, 25612=>9207, 25638=>9208, 25648=>9209, 25640=>9210, 25665=>9211, 25653=>9212, 25647=>9213, 25610=>9214, 25626=>9215, 25664=>9216, 25637=>9217, 25639=>9218, 25611=>9219, 25575=>9220, 25627=>9221, 25646=>9222, 25633=>9223, 25614=>9224, 25967=>9225, 26002=>9226, 26067=>9227, 26246=>9228, 26252=>9229, 26261=>9230, 26256=>9231, 26251=>9232, 26250=>9233, 26265=>9234, 26260=>9235, 26232=>9236, 26400=>9237, 26982=>9238, 26975=>9239, 26936=>9240, 26958=>9241, 26978=>9242, 26993=>9243, 26943=>9244, 26949=>9245, 26986=>9246, 26937=>9247, 26946=>9248, 26967=>9249, 26969=>9250, 27002=>9251, 26952=>9252, 26953=>9253, 26933=>9254, 26988=>9255, 26931=>9256, 26941=>9257, 26981=>9258, 26864=>9259, 27000=>9260, 26932=>9261, 26985=>9262, 26944=>9263, 26991=>9264, 26948=>9265, 26998=>9266, 26968=>9267, 26945=>9268, 26996=>9269, 26956=>9270, 26939=>9271, 26955=>9272, 26935=>9273, 26972=>9274, 26959=>9275, 26961=>9276, 26930=>9277, 26962=>9278, 26927=>9279, 27003=>9280, 26940=>9281, 27462=>9282, 27461=>9283, 27459=>9284, 27458=>9285, 27464=>9286, 27457=>9287, 27547=>9288, 27643=>9289, 27644=>9290, 27641=>9291, 27639=>9292, 27640=>9293, 28315=>9294, 28374=>9295, 28360=>9296, 28303=>9297, 28352=>9298, 28319=>9299, 28307=>9300, 28308=>9301, 28320=>9302, 28337=>9303, 28345=>9304, 28358=>9305, 28370=>9306, 28349=>9307, 28353=>9308, 28318=>9309, 28361=>9310, 28343=>9311, 28336=>9312, 28365=>9313, 28326=>9314, 28367=>9315, 28338=>9316, 28350=>9317, 28355=>9318, 28380=>9319, 28376=>9320, 28313=>9321, 28306=>9322, 28302=>9323, 28301=>9324, 28324=>9325, 28321=>9326, 28351=>9327, 28339=>9328, 28368=>9329, 28362=>9330, 28311=>9331, 28334=>9332, 28323=>9333, 28999=>9334, 29012=>9335, 29010=>9336, 29027=>9337, 29024=>9338, 28993=>9339, 29021=>9340, 29026=>9341, 61080=>9341, 29042=>9342, 29048=>9343, 29034=>9344, 29025=>9345, 28994=>9346, 29016=>9347, 28995=>9348, 29003=>9349, 29040=>9350, 29023=>9351, 29008=>9352, 29011=>9353, 28996=>9354, 29005=>9355, 29018=>9356, 29263=>9357, 29325=>9358, 29324=>9359, 29329=>9360, 29328=>9361, 29326=>9362, 29500=>9363, 29506=>9364, 29499=>9365, 29498=>9366, 29504=>9367, 29514=>9368, 29513=>9369, 29764=>9370, 29770=>9371, 29771=>9372, 29778=>9373, 29777=>9374, 29783=>9375, 29760=>9376, 29775=>9377, 29776=>9378, 29774=>9379, 29762=>9380, 29766=>9381, 29773=>9382, 29780=>9383, 29921=>9384, 29951=>9385, 29950=>9386, 29949=>9387, 29981=>9388, 30073=>9389, 30071=>9390, 27011=>9391, 30191=>9392, 30223=>9393, 30211=>9394, 30199=>9395, 30206=>9396, 30204=>9397, 30201=>9398, 60782=>9398, 30200=>9399, 30224=>9400, 30203=>9401, 30198=>9402, 30189=>9403, 30197=>9404, 30205=>9405, 30361=>9406, 30389=>9407, 30429=>9408, 30549=>9409, 30559=>9410, 30560=>9411, 30546=>9412, 30550=>9413, 30554=>9414, 30569=>9415, 30567=>9416, 30548=>9417, 30553=>9418, 30573=>9419, 30688=>9420, 30855=>9421, 30874=>9422, 30868=>9423, 30863=>9424, 30852=>9425, 30869=>9426, 30853=>9427, 30854=>9428, 30881=>9429, 30851=>9430, 30841=>9431, 30873=>9432, 30848=>9433, 30870=>9434, 30843=>9435, 31100=>9436, 31106=>9437, 31101=>9438, 31097=>9439, 31249=>9440, 31256=>9441, 31257=>9442, 31250=>9443, 31255=>9444, 31253=>9445, 31266=>9446, 31251=>9447, 31259=>9448, 31248=>9449, 31395=>9450, 31394=>9451, 31390=>9452, 31467=>9453, 31590=>9454, 31588=>9455, 31597=>9456, 31604=>9457, 31593=>9458, 31602=>9459, 31589=>9460, 31603=>9461, 31601=>9462, 31600=>9463, 31585=>9464, 31608=>9465, 31606=>9466, 31587=>9467, 31922=>9468, 31924=>9469, 31919=>9470, 32136=>9471, 32134=>9472, 32128=>9473, 32141=>9474, 32127=>9475, 32133=>9476, 32122=>9477, 32142=>9478, 32123=>9479, 32131=>9480, 32124=>9481, 32140=>9482, 32148=>9483, 32132=>9484, 32125=>9485, 32146=>9486, 32621=>9487, 32619=>9488, 32615=>9489, 32616=>9490, 32620=>9491, 32678=>9492, 32677=>9493, 32679=>9494, 32731=>9495, 32732=>9496, 32801=>9497, 33124=>9498, 33120=>9499, 33143=>9500, 33116=>9501, 33129=>9502, 33115=>9503, 33122=>9504, 33138=>9505, 26401=>9506, 33118=>9507, 33142=>9508, 33127=>9509, 33135=>9510, 33092=>9511, 33121=>9512, 33309=>9513, 33353=>9514, 33348=>9515, 33344=>9516, 33346=>9517, 33349=>9518, 34033=>9519, 33855=>9520, 33878=>9521, 33910=>9522, 33913=>9523, 33935=>9524, 33933=>9525, 33893=>9526, 33873=>9527, 33856=>9528, 33926=>9529, 33895=>9530, 33840=>9531, 33869=>9532, 33917=>9533, 33882=>9534, 33881=>9535, 33908=>9536, 33907=>9537, 33885=>9538, 34055=>9539, 33886=>9540, 33847=>9541, 33850=>9542, 33844=>9543, 33914=>9544, 33859=>9545, 33912=>9546, 33842=>9547, 33861=>9548, 33833=>9549, 33753=>9550, 33867=>9551, 33839=>9552, 33858=>9553, 33837=>9554, 33887=>9555, 33904=>9556, 33849=>9557, 33870=>9558, 33868=>9559, 33874=>9560, 33903=>9561, 33989=>9562, 33934=>9563, 33851=>9564, 33863=>9565, 33846=>9566, 33843=>9567, 33896=>9568, 33918=>9569, 33860=>9570, 33835=>9571, 33888=>9572, 33876=>9573, 33902=>9574, 33872=>9575, 34571=>9576, 34564=>9577, 34551=>9578, 34572=>9579, 34554=>9580, 34518=>9581, 34549=>9582, 34637=>9583, 34552=>9584, 34574=>9585, 34569=>9586, 34561=>9587, 34550=>9588, 34573=>9589, 34565=>9590, 35030=>9591, 35019=>9592, 35021=>9593, 35022=>9594, 35038=>9595, 35035=>9596, 35034=>9597, 35020=>9598, 35024=>9599, 35205=>9600, 35227=>9601, 35295=>9602, 35301=>9603, 35300=>9604, 35297=>9605, 35296=>9606, 35298=>9607, 35292=>9608, 35302=>9609, 35446=>9610, 35462=>9611, 35455=>9612, 35425=>9613, 35391=>9614, 35447=>9615, 35458=>9616, 35460=>9617, 35445=>9618, 35459=>9619, 35457=>9620, 35444=>9621, 35450=>9622, 35900=>9623, 35915=>9624, 35914=>9625, 35941=>9626, 35940=>9627, 35942=>9628, 35974=>9629, 35972=>9630, 35973=>9631, 36044=>9632, 36200=>9633, 36201=>9634, 36241=>9635, 36236=>9636, 36238=>9637, 36239=>9638, 36237=>9639, 36243=>9640, 36244=>9641, 36240=>9642, 36242=>9643, 36336=>9644, 36320=>9645, 36332=>9646, 36337=>9647, 36334=>9648, 36304=>9649, 36329=>9650, 36323=>9651, 36322=>9652, 36327=>9653, 36338=>9654, 36331=>9655, 36340=>9656, 36614=>9657, 36607=>9658, 36609=>9659, 36608=>9660, 36613=>9661, 36615=>9662, 36616=>9663, 36610=>9664, 36619=>9665, 60507=>9665, 36946=>9666, 36927=>9667, 36932=>9668, 36937=>9669, 36925=>9670, 37136=>9671, 37133=>9672, 37135=>9673, 37137=>9674, 37142=>9675, 37140=>9676, 37131=>9677, 37134=>9678, 37230=>9679, 37231=>9680, 37448=>9681, 37458=>9682, 37424=>9683, 37434=>9684, 37478=>9685, 37427=>9686, 37477=>9687, 37470=>9688, 37507=>9689, 37422=>9690, 37450=>9691, 37446=>9692, 37485=>9693, 37484=>9694, 37455=>9695, 37472=>9696, 37479=>9697, 37487=>9698, 37430=>9699, 37473=>9700, 37488=>9701, 37425=>9702, 37460=>9703, 37475=>9704, 37456=>9705, 37490=>9706, 37454=>9707, 37459=>9708, 37452=>9709, 37462=>9710, 37426=>9711, 38303=>9712, 38300=>9713, 38302=>9714, 38299=>9715, 38546=>9716, 38547=>9717, 38545=>9718, 38551=>9719, 38606=>9720, 38650=>9721, 38653=>9722, 38648=>9723, 38645=>9724, 38771=>9725, 38775=>9726, 38776=>9727, 38770=>9728, 38927=>9729, 38925=>9730, 38926=>9731, 39084=>9732, 39158=>9733, 39161=>9734, 39343=>9735, 39346=>9736, 39344=>9737, 39349=>9738, 39597=>9739, 39595=>9740, 39771=>9741, 40170=>9742, 40173=>9743, 40167=>9744, 40576=>9745, 12236=>9746, 40701=>9746, 20710=>9747, 20692=>9748, 20695=>9749, 20712=>9750, 20723=>9751, 20699=>9752, 20714=>9753, 20701=>9754, 20708=>9755, 20691=>9756, 20716=>9757, 20720=>9758, 20719=>9759, 20707=>9760, 20704=>9761, 20952=>9762, 21120=>9763, 21121=>9764, 21225=>9765, 21227=>9766, 21296=>9767, 21420=>9768, 22055=>9769, 22037=>9770, 22028=>9771, 22034=>9772, 22012=>9773, 22031=>9774, 22044=>9775, 22017=>9776, 22035=>9777, 22018=>9778, 22010=>9779, 22045=>9780, 22020=>9781, 22015=>9782, 22009=>9783, 22665=>9784, 22652=>9785, 22672=>9786, 22680=>9787, 22662=>9788, 22657=>9789, 22655=>9790, 22644=>9791, 22667=>9792, 22650=>9793, 22663=>9794, 22673=>9795, 22670=>9796, 22646=>9797, 22658=>9798, 22664=>9799, 22651=>9800, 22676=>9801, 22671=>9802, 22782=>9803, 22891=>9804, 23260=>9805, 23278=>9806, 23269=>9807, 23253=>9808, 23274=>9809, 23258=>9810, 23277=>9811, 23275=>9812, 23283=>9813, 23266=>9814, 23264=>9815, 23259=>9816, 23276=>9817, 23262=>9818, 23261=>9819, 23257=>9820, 23272=>9821, 23263=>9822, 23415=>9823, 23520=>9824, 23523=>9825, 23651=>9826, 23938=>9827, 23936=>9828, 23933=>9829, 23942=>9830, 23930=>9831, 23937=>9832, 23927=>9833, 23946=>9834, 23945=>9835, 23944=>9836, 23934=>9837, 23932=>9838, 23949=>9839, 23929=>9840, 23935=>9841, 24152=>9842, 24153=>9843, 24147=>9844, 24280=>9845, 24273=>9846, 24279=>9847, 24270=>9848, 24284=>9849, 24277=>9850, 24281=>9851, 24274=>9852, 24276=>9853, 24388=>9854, 24387=>9855, 24431=>9856, 24502=>9857, 24876=>9858, 24872=>9859, 24897=>9860, 24926=>9861, 24945=>9862, 24947=>9863, 24914=>9864, 24915=>9865, 24946=>9866, 24940=>9867, 24960=>9868, 24948=>9869, 24916=>9870, 24954=>9871, 24923=>9872, 24933=>9873, 24891=>9874, 24938=>9875, 24929=>9876, 24918=>9877, 25129=>9878, 25127=>9879, 25131=>9880, 25643=>9881, 25677=>9882, 25691=>9883, 25693=>9884, 25716=>9885, 25718=>9886, 25714=>9887, 25715=>9888, 25725=>9889, 25717=>9890, 25702=>9891, 25766=>9892, 25678=>9893, 25730=>9894, 25694=>9895, 25692=>9896, 25675=>9897, 25683=>9898, 25696=>9899, 25680=>9900, 25727=>9901, 25663=>9902, 25708=>9903, 25707=>9904, 25689=>9905, 25701=>9906, 25719=>9907, 25971=>9908, 26016=>9909, 26273=>9910, 26272=>9911, 26271=>9912, 26373=>9913, 26372=>9914, 26402=>9915, 27057=>9916, 27062=>9917, 27081=>9918, 27040=>9919, 27086=>9920, 27030=>9921, 27056=>9922, 27052=>9923, 27068=>9924, 27025=>9925, 27033=>9926, 27022=>9927, 27047=>9928, 27021=>9929, 27049=>9930, 27070=>9931, 27055=>9932, 27071=>9933, 27076=>9934, 27069=>9935, 27044=>9936, 27092=>9937, 27065=>9938, 27082=>9939, 27034=>9940, 27087=>9941, 27059=>9942, 27027=>9943, 27050=>9944, 27041=>9945, 27038=>9946, 27097=>9947, 27031=>9948, 27024=>9949, 27074=>9950, 27061=>9951, 27045=>9952, 27078=>9953, 27466=>9954, 27469=>9955, 27467=>9956, 27550=>9957, 27551=>9958, 27552=>9959, 27587=>9960, 27588=>9961, 27646=>9962, 28366=>9963, 28405=>9964, 28401=>9965, 28419=>9966, 28453=>9967, 28408=>9968, 28471=>9969, 28411=>9970, 28462=>9971, 28425=>9972, 28494=>9973, 28441=>9974, 28442=>9975, 28455=>9976, 28440=>9977, 28475=>9978, 28434=>9979, 28397=>9980, 28426=>9981, 28470=>9982, 28531=>9983, 28409=>9984, 28398=>9985, 28461=>9986, 28480=>9987, 28464=>9988, 28476=>9989, 28469=>9990, 28395=>9991, 28423=>9992, 28430=>9993, 28483=>9994, 28421=>9995, 28413=>9996, 28406=>9997, 28473=>9998, 28444=>9999, 28412=>10000, 28474=>10001, 28447=>10002, 28429=>10003, 28446=>10004, 28424=>10005, 28449=>10006, 29063=>10007, 29072=>10008, 29065=>10009, 29056=>10010, 29061=>10011, 29058=>10012, 29071=>10013, 29051=>10014, 29062=>10015, 29057=>10016, 29079=>10017, 29252=>10018, 29267=>10019, 29335=>10020, 29333=>10021, 29331=>10022, 29507=>10023, 29517=>10024, 29521=>10025, 29516=>10026, 29794=>10027, 29811=>10028, 29809=>10029, 29813=>10030, 29810=>10031, 29799=>10032, 29806=>10033, 29952=>10034, 29954=>10035, 29955=>10036, 30077=>10037, 30096=>10038, 30230=>10039, 30216=>10040, 30220=>10041, 30229=>10042, 30225=>10043, 30218=>10044, 30228=>10045, 30392=>10046, 30593=>10047, 30588=>10048, 30597=>10049, 30594=>10050, 30574=>10051, 30592=>10052, 30575=>10053, 30590=>10054, 30595=>10055, 30898=>10056, 30890=>10057, 30900=>10058, 30893=>10059, 30888=>10060, 30846=>10061, 30891=>10062, 30878=>10063, 30885=>10064, 30880=>10065, 30892=>10066, 30882=>10067, 30884=>10068, 31128=>10069, 31114=>10070, 31115=>10071, 31126=>10072, 31125=>10073, 31124=>10074, 31123=>10075, 31127=>10076, 31112=>10077, 31122=>10078, 31120=>10079, 31275=>10080, 31306=>10081, 31280=>10082, 31279=>10083, 31272=>10084, 31270=>10085, 31400=>10086, 31403=>10087, 31404=>10088, 31470=>10089, 31624=>10090, 31644=>10091, 31626=>10092, 31633=>10093, 31632=>10094, 31638=>10095, 31629=>10096, 31628=>10097, 31643=>10098, 31630=>10099, 31621=>10100, 31640=>10101, 21124=>10102, 31641=>10103, 31652=>10104, 31618=>10105, 31931=>10106, 31935=>10107, 31932=>10108, 31930=>10109, 32167=>10110, 32183=>10111, 32194=>10112, 32163=>10113, 32170=>10114, 32193=>10115, 32192=>10116, 32197=>10117, 32157=>10118, 32206=>10119, 32196=>10120, 32198=>10121, 32203=>10122, 32204=>10123, 32175=>10124, 32185=>10125, 32150=>10126, 32188=>10127, 32159=>10128, 32166=>10129, 32174=>10130, 32169=>10131, 32161=>10132, 32201=>10133, 32627=>10134, 32738=>10135, 32739=>10136, 32741=>10137, 32734=>10138, 32804=>10139, 32861=>10140, 32860=>10141, 33161=>10142, 33158=>10143, 33155=>10144, 33159=>10145, 33165=>10146, 33164=>10147, 33163=>10148, 33301=>10149, 33943=>10150, 33956=>10151, 33953=>10152, 33951=>10153, 33978=>10154, 33998=>10155, 33986=>10156, 33964=>10157, 33966=>10158, 33963=>10159, 33977=>10160, 33972=>10161, 33985=>10162, 33997=>10163, 33962=>10164, 33946=>10165, 33969=>10166, 34000=>10167, 33949=>10168, 33959=>10169, 33979=>10170, 33954=>10171, 33940=>10172, 33991=>10173, 33996=>10174, 33947=>10175, 33961=>10176, 33967=>10177, 33960=>10178, 58327=>10178, 34006=>10179, 33944=>10180, 33974=>10181, 33999=>10182, 33952=>10183, 34007=>10184, 34004=>10185, 34002=>10186, 34011=>10187, 33968=>10188, 33937=>10189, 34401=>10190, 34611=>10191, 34595=>10192, 34600=>10193, 34667=>10194, 34624=>10195, 34606=>10196, 34590=>10197, 34593=>10198, 34585=>10199, 34587=>10200, 34627=>10201, 34604=>10202, 34625=>10203, 34622=>10204, 34630=>10205, 34592=>10206, 34610=>10207, 34602=>10208, 34605=>10209, 34620=>10210, 34578=>10211, 34618=>10212, 34609=>10213, 34613=>10214, 34626=>10215, 34598=>10216, 34599=>10217, 34616=>10218, 34596=>10219, 34586=>10220, 34608=>10221, 34577=>10222, 35063=>10223, 35047=>10224, 35057=>10225, 35058=>10226, 35066=>10227, 35070=>10228, 35054=>10229, 35068=>10230, 35062=>10231, 35067=>10232, 35056=>10233, 35052=>10234, 35051=>10235, 35229=>10236, 35233=>10237, 35231=>10238, 35230=>10239, 35305=>10240, 35307=>10241, 35304=>10242, 35499=>10243, 35481=>10244, 35467=>10245, 35474=>10246, 35471=>10247, 35478=>10248, 35901=>10249, 35944=>10250, 35945=>10251, 36053=>10252, 36047=>10253, 36055=>10254, 36246=>10255, 36361=>10256, 36354=>10257, 36351=>10258, 36365=>10259, 36349=>10260, 36362=>10261, 36355=>10262, 36359=>10263, 36358=>10264, 36357=>10265, 36350=>10266, 36352=>10267, 36356=>10268, 36624=>10269, 36625=>10270, 36622=>10271, 36621=>10272, 37155=>10273, 37148=>10274, 37152=>10275, 37154=>10276, 37151=>10277, 37149=>10278, 37146=>10279, 37156=>10280, 37153=>10281, 37147=>10282, 37242=>10283, 37234=>10284, 37241=>10285, 37235=>10286, 37541=>10287, 37540=>10288, 37494=>10289, 37531=>10290, 37498=>10291, 37536=>10292, 37524=>10293, 37546=>10294, 37517=>10295, 37542=>10296, 37530=>10297, 37547=>10298, 37497=>10299, 37527=>10300, 37503=>10301, 37539=>10302, 37614=>10303, 37518=>10304, 37506=>10305, 37525=>10306, 37538=>10307, 37501=>10308, 37512=>10309, 37537=>10310, 37514=>10311, 37510=>10312, 37516=>10313, 37529=>10314, 37543=>10315, 37502=>10316, 37511=>10317, 37545=>10318, 37533=>10319, 37515=>10320, 37421=>10321, 38558=>10322, 38561=>10323, 38655=>10324, 38744=>10325, 38781=>10326, 38778=>10327, 38782=>10328, 38787=>10329, 38784=>10330, 38786=>10331, 38779=>10332, 38788=>10333, 38785=>10334, 38783=>10335, 38862=>10336, 38861=>10337, 38934=>10338, 39085=>10339, 39086=>10340, 39170=>10341, 39168=>10342, 39175=>10343, 39325=>10344, 39324=>10345, 39363=>10346, 39353=>10347, 39355=>10348, 39354=>10349, 39362=>10350, 39357=>10351, 39367=>10352, 39601=>10353, 39651=>10354, 39655=>10355, 39742=>10356, 39743=>10357, 39776=>10358, 39777=>10359, 39775=>10360, 40177=>10361, 40178=>10362, 40181=>10363, 40615=>10364, 20735=>10365, 20739=>10366, 20784=>10367, 20728=>10368, 20742=>10369, 20743=>10370, 20726=>10371, 20734=>10372, 20747=>10373, 20748=>10374, 20733=>10375, 20746=>10376, 21131=>10377, 21132=>10378, 21233=>10379, 21231=>10380, 22088=>10381, 22082=>10382, 22092=>10383, 22069=>10384, 22081=>10385, 22090=>10386, 22089=>10387, 22086=>10388, 22104=>10389, 22106=>10390, 22080=>10391, 22067=>10392, 22077=>10393, 22060=>10394, 22078=>10395, 22072=>10396, 22058=>10397, 22074=>10398, 22298=>10399, 22699=>10400, 22685=>10401, 22705=>10402, 22688=>10403, 22691=>10404, 22703=>10405, 22700=>10406, 22693=>10407, 22689=>10408, 22783=>10409, 23295=>10410, 23284=>10411, 23293=>10412, 23287=>10413, 23286=>10414, 23299=>10415, 23288=>10416, 23298=>10417, 23289=>10418, 23297=>10419, 23303=>10420, 23301=>10421, 23311=>10422, 23655=>10423, 23961=>10424, 23959=>10425, 23967=>10426, 23954=>10427, 23970=>10428, 23955=>10429, 23957=>10430, 23968=>10431, 23964=>10432, 23969=>10433, 23962=>10434, 23966=>10435, 24169=>10436, 24157=>10437, 24160=>10438, 24156=>10439, 32243=>10440, 24283=>10441, 24286=>10442, 24289=>10443, 24393=>10444, 24498=>10445, 24971=>10446, 24963=>10447, 24953=>10448, 25009=>10449, 25008=>10450, 24994=>10451, 24969=>10452, 24987=>10453, 24979=>10454, 25007=>10455, 25005=>10456, 24991=>10457, 24978=>10458, 25002=>10459, 24993=>10460, 24973=>10461, 24934=>10462, 25011=>10463, 25133=>10464, 25710=>10465, 25712=>10466, 25750=>10467, 25760=>10468, 25733=>10469, 25751=>10470, 25756=>10471, 25743=>10472, 25739=>10473, 25738=>10474, 25740=>10475, 25763=>10476, 25759=>10477, 25704=>10478, 25777=>10479, 25752=>10480, 25974=>10481, 25978=>10482, 25977=>10483, 25979=>10484, 26034=>10485, 26035=>10486, 26293=>10487, 26288=>10488, 26281=>10489, 26290=>10490, 26295=>10491, 26282=>10492, 26287=>10493, 27136=>10494, 27142=>10495, 27159=>10496, 27109=>10497, 27128=>10498, 27157=>10499, 27121=>10500, 27108=>10501, 27168=>10502, 27135=>10503, 27116=>10504, 27106=>10505, 27163=>10506, 27165=>10507, 27134=>10508, 27175=>10509, 27122=>10510, 27118=>10511, 27156=>10512, 27127=>10513, 27111=>10514, 27200=>10515, 27144=>10516, 27110=>10517, 27131=>10518, 27149=>10519, 27132=>10520, 27115=>10521, 27145=>10522, 27140=>10523, 27160=>10524, 27173=>10525, 27151=>10526, 27126=>10527, 27174=>10528, 27143=>10529, 27124=>10530, 27158=>10531, 27473=>10532, 27557=>10533, 27555=>10534, 27554=>10535, 27558=>10536, 27649=>10537, 27648=>10538, 27647=>10539, 27650=>10540, 28481=>10541, 28454=>10542, 28542=>10543, 28551=>10544, 28614=>10545, 28562=>10546, 28557=>10547, 28553=>10548, 28556=>10549, 28514=>10550, 28495=>10551, 28549=>10552, 28506=>10553, 28566=>10554, 28534=>10555, 28524=>10556, 28546=>10557, 28501=>10558, 28530=>10559, 28498=>10560, 28496=>10561, 28503=>10562, 28564=>10563, 28563=>10564, 28509=>10565, 28416=>10566, 28513=>10567, 28523=>10568, 28541=>10569, 28519=>10570, 28560=>10571, 28499=>10572, 28555=>10573, 28521=>10574, 28543=>10575, 28565=>10576, 28515=>10577, 28535=>10578, 28522=>10579, 28539=>10580, 29106=>10581, 29103=>10582, 29083=>10583, 29104=>10584, 29088=>10585, 29082=>10586, 29097=>10587, 29109=>10588, 29085=>10589, 29093=>10590, 29086=>10591, 29092=>10592, 29089=>10593, 29098=>10594, 29084=>10595, 29095=>10596, 29107=>10597, 29336=>10598, 29338=>10599, 29528=>10600, 29522=>10601, 29534=>10602, 29535=>10603, 29536=>10604, 29533=>10605, 29531=>10606, 29537=>10607, 29530=>10608, 29529=>10609, 29538=>10610, 29831=>10611, 29833=>10612, 29834=>10613, 29830=>10614, 29825=>10615, 29821=>10616, 29829=>10617, 29832=>10618, 29820=>10619, 29817=>10620, 58868=>10620, 29960=>10621, 29959=>10622, 30078=>10623, 30245=>10624, 30238=>10625, 30233=>10626, 30237=>10627, 30236=>10628, 30243=>10629, 30234=>10630, 30248=>10631, 30235=>10632, 30364=>10633, 30365=>10634, 30366=>10635, 30363=>10636, 30605=>10637, 30607=>10638, 30601=>10639, 30600=>10640, 30925=>10641, 30907=>10642, 30927=>10643, 30924=>10644, 30929=>10645, 30926=>10646, 30932=>10647, 30920=>10648, 30915=>10649, 30916=>10650, 30921=>10651, 31130=>10652, 31137=>10653, 31136=>10654, 31132=>10655, 31138=>10656, 31131=>10657, 59175=>10657, 27510=>10658, 31289=>10659, 31410=>10660, 31412=>10661, 31411=>10662, 31671=>10663, 31691=>10664, 31678=>10665, 31660=>10666, 31694=>10667, 31663=>10668, 31673=>10669, 31690=>10670, 31669=>10671, 31941=>10672, 31944=>10673, 31948=>10674, 31947=>10675, 32247=>10676, 32219=>10677, 32234=>10678, 32231=>10679, 32215=>10680, 32225=>10681, 32259=>10682, 32250=>10683, 32230=>10684, 32246=>10685, 32241=>10686, 32240=>10687, 32238=>10688, 32223=>10689, 32630=>10690, 32684=>10691, 32688=>10692, 32685=>10693, 32749=>10694, 32747=>10695, 32746=>10696, 32748=>10697, 32742=>10698, 32744=>10699, 32868=>10700, 32871=>10701, 33187=>10702, 33183=>10703, 33182=>10704, 33173=>10705, 33186=>10706, 33177=>10707, 33175=>10708, 33302=>10709, 33359=>10710, 33363=>10711, 33362=>10712, 33360=>10713, 33358=>10714, 33361=>10715, 34084=>10716, 34107=>10717, 34063=>10718, 34048=>10719, 34089=>10720, 34062=>10721, 34057=>10722, 34061=>10723, 34079=>10724, 34058=>10725, 34087=>10726, 34076=>10727, 34043=>10728, 34091=>10729, 34042=>10730, 34056=>10731, 34060=>10732, 34036=>10733, 34090=>10734, 34034=>10735, 34069=>10736, 34039=>10737, 34027=>10738, 34035=>10739, 34044=>10740, 34066=>10741, 34026=>10742, 34025=>10743, 34070=>10744, 34046=>10745, 34088=>10746, 34077=>10747, 34094=>10748, 34050=>10749, 34045=>10750, 34078=>10751, 34038=>10752, 34097=>10753, 34086=>10754, 34023=>10755, 34024=>10756, 34032=>10757, 34031=>10758, 34041=>10759, 34072=>10760, 34080=>10761, 34096=>10762, 34059=>10763, 34073=>10764, 34095=>10765, 34402=>10766, 34646=>10767, 34659=>10768, 34660=>10769, 34679=>10770, 34785=>10771, 34675=>10772, 34648=>10773, 34644=>10774, 34651=>10775, 34642=>10776, 34657=>10777, 34650=>10778, 34641=>10779, 34654=>10780, 34669=>10781, 34666=>10782, 34640=>10783, 34638=>10784, 34655=>10785, 34653=>10786, 34671=>10787, 34668=>10788, 34682=>10789, 34670=>10790, 34652=>10791, 34661=>10792, 34639=>10793, 34683=>10794, 34677=>10795, 34658=>10796, 34663=>10797, 34665=>10798, 34906=>10799, 35077=>10800, 35084=>10801, 35092=>10802, 35083=>10803, 35095=>10804, 35096=>10805, 35097=>10806, 35078=>10807, 35094=>10808, 35089=>10809, 35086=>10810, 35081=>10811, 35234=>10812, 35236=>10813, 35235=>10814, 35309=>10815, 35312=>10816, 35308=>10817, 35535=>10818, 35526=>10819, 35512=>10820, 35539=>10821, 35537=>10822, 35540=>10823, 35541=>10824, 35515=>10825, 35543=>10826, 35518=>10827, 35520=>10828, 35525=>10829, 35544=>10830, 35523=>10831, 35514=>10832, 35517=>10833, 35545=>10834, 35902=>10835, 35917=>10836, 35983=>10837, 36069=>10838, 36063=>10839, 36057=>10840, 36072=>10841, 36058=>10842, 36061=>10843, 36071=>10844, 36256=>10845, 36252=>10846, 36257=>10847, 36251=>10848, 36384=>10849, 36387=>10850, 36389=>10851, 36388=>10852, 36398=>10853, 36373=>10854, 36379=>10855, 36374=>10856, 36369=>10857, 36377=>10858, 36390=>10859, 36391=>10860, 36372=>10861, 36370=>10862, 36376=>10863, 36371=>10864, 36380=>10865, 36375=>10866, 36378=>10867, 36652=>10868, 36644=>10869, 36632=>10870, 36634=>10871, 36640=>10872, 36643=>10873, 36630=>10874, 36631=>10875, 36979=>10876, 36976=>10877, 36975=>10878, 36967=>10879, 36971=>10880, 37167=>10881, 37163=>10882, 37161=>10883, 37162=>10884, 37170=>10885, 37158=>10886, 37166=>10887, 37253=>10888, 37254=>10889, 37258=>10890, 37249=>10891, 37250=>10892, 37252=>10893, 37248=>10894, 37584=>10895, 37571=>10896, 37572=>10897, 37568=>10898, 37593=>10899, 37558=>10900, 37583=>10901, 37617=>10902, 37599=>10903, 37592=>10904, 37609=>10905, 37591=>10906, 37597=>10907, 37580=>10908, 37615=>10909, 37570=>10910, 37608=>10911, 37578=>10912, 37576=>10913, 37582=>10914, 37606=>10915, 37581=>10916, 37589=>10917, 37577=>10918, 37600=>10919, 37598=>10920, 37607=>10921, 37585=>10922, 37587=>10923, 37557=>10924, 37601=>10925, 37669=>10926, 37574=>10927, 37556=>10928, 38268=>10929, 38316=>10930, 38315=>10931, 38318=>10932, 38320=>10933, 38564=>10934, 38562=>10935, 38611=>10936, 38661=>10937, 38664=>10938, 38658=>10939, 38746=>10940, 38794=>10941, 38798=>10942, 38792=>10943, 38864=>10944, 38863=>10945, 38942=>10946, 38941=>10947, 38950=>10948, 38953=>10949, 38952=>10950, 38944=>10951, 38939=>10952, 38951=>10953, 39090=>10954, 39176=>10955, 39162=>10956, 39185=>10957, 39188=>10958, 39190=>10959, 39191=>10960, 39189=>10961, 39388=>10962, 39373=>10963, 39375=>10964, 39379=>10965, 39380=>10966, 39374=>10967, 39369=>10968, 39382=>10969, 60270=>10969, 39384=>10970, 39371=>10971, 39383=>10972, 39372=>10973, 39603=>10974, 39660=>10975, 39659=>10976, 39667=>10977, 39666=>10978, 39665=>10979, 39750=>10980, 39747=>10981, 39783=>10982, 39796=>10983, 39793=>10984, 39782=>10985, 39798=>10986, 39797=>10987, 39792=>10988, 39784=>10989, 39780=>10990, 39788=>10991, 40188=>10992, 40186=>10993, 40189=>10994, 40191=>10995, 40183=>10996, 40199=>10997, 40192=>10998, 40185=>10999, 40187=>11000, 40200=>11001, 40197=>11002, 40196=>11003, 40579=>11004, 40659=>11005, 40719=>11006, 40720=>11007, 20764=>11008, 20755=>11009, 20759=>11010, 20762=>11011, 20753=>11012, 20958=>11013, 21300=>11014, 21473=>11015, 22128=>11016, 22112=>11017, 22126=>11018, 22131=>11019, 22118=>11020, 22115=>11021, 22125=>11022, 22130=>11023, 22110=>11024, 22135=>11025, 22300=>11026, 22299=>11027, 22728=>11028, 22717=>11029, 22729=>11030, 22719=>11031, 22714=>11032, 22722=>11033, 22716=>11034, 22726=>11035, 23319=>11036, 23321=>11037, 23323=>11038, 23329=>11039, 23316=>11040, 23315=>11041, 23312=>11042, 23318=>11043, 23336=>11044, 59539=>11044, 23322=>11045, 23328=>11046, 23326=>11047, 23535=>11048, 23980=>11049, 23985=>11050, 23977=>11051, 23975=>11052, 23989=>11053, 23984=>11054, 23982=>11055, 23978=>11056, 23976=>11057, 23986=>11058, 23981=>11059, 23983=>11060, 23988=>11061, 24167=>11062, 24168=>11063, 24166=>11064, 24175=>11065, 24297=>11066, 24295=>11067, 24294=>11068, 24296=>11069, 24293=>11070, 24395=>11071, 24508=>11072, 24507=>11073, 24989=>11074, 25000=>11075, 24982=>11076, 25029=>11077, 25012=>11078, 25030=>11079, 25025=>11080, 25036=>11081, 25018=>11082, 25023=>11083, 25016=>11084, 24972=>11085, 25815=>11086, 25814=>11087, 25808=>11088, 25807=>11089, 25801=>11090, 25789=>11091, 25737=>11092, 25795=>11093, 25819=>11094, 25843=>11095, 25817=>11096, 25907=>11097, 25983=>11098, 25980=>11099, 26018=>11100, 26312=>11101, 26302=>11102, 26304=>11103, 26314=>11104, 26315=>11105, 26319=>11106, 26301=>11107, 26299=>11108, 26298=>11109, 26316=>11110, 26403=>11111, 27188=>11112, 27238=>11113, 27209=>11114, 27239=>11115, 27186=>11116, 27240=>11117, 27198=>11118, 27229=>11119, 27245=>11120, 27254=>11121, 27227=>11122, 27217=>11123, 27176=>11124, 27226=>11125, 27195=>11126, 27199=>11127, 27201=>11128, 27242=>11129, 27236=>11130, 27216=>11131, 27215=>11132, 27220=>11133, 27247=>11134, 27241=>11135, 27232=>11136, 27196=>11137, 27230=>11138, 27222=>11139, 27221=>11140, 27213=>11141, 27214=>11142, 27206=>11143, 27477=>11144, 27476=>11145, 27478=>11146, 27559=>11147, 27562=>11148, 27563=>11149, 27592=>11150, 27591=>11151, 27652=>11152, 27651=>11153, 27654=>11154, 28589=>11155, 28619=>11156, 28579=>11157, 28615=>11158, 28604=>11159, 28622=>11160, 28616=>11161, 28510=>11162, 28612=>11163, 28605=>11164, 28574=>11165, 28618=>11166, 28584=>11167, 28676=>11168, 28581=>11169, 28590=>11170, 28602=>11171, 28588=>11172, 28586=>11173, 28623=>11174, 28607=>11175, 28600=>11176, 28578=>11177, 28617=>11178, 28587=>11179, 28621=>11180, 28591=>11181, 28594=>11182, 28592=>11183, 29125=>11184, 29122=>11185, 29119=>11186, 29112=>11187, 29142=>11188, 29120=>11189, 29121=>11190, 29131=>11191, 29140=>11192, 29130=>11193, 29127=>11194, 29135=>11195, 29117=>11196, 29144=>11197, 29116=>11198, 29126=>11199, 29146=>11200, 29147=>11201, 29341=>11202, 29342=>11203, 29545=>11204, 29542=>11205, 29543=>11206, 29548=>11207, 29541=>11208, 29547=>11209, 29546=>11210, 29823=>11211, 29850=>11212, 29856=>11213, 29844=>11214, 29842=>11215, 29845=>11216, 29857=>11217, 29963=>11218, 30080=>11219, 30255=>11220, 30253=>11221, 30257=>11222, 30269=>11223, 30259=>11224, 30268=>11225, 30261=>11226, 30258=>11227, 30256=>11228, 30395=>11229, 30438=>11230, 30618=>11231, 30621=>11232, 30625=>11233, 30620=>11234, 30619=>11235, 30626=>11236, 30627=>11237, 30613=>11238, 30617=>11239, 30615=>11240, 30941=>11241, 30953=>11242, 30949=>11243, 30954=>11244, 30942=>11245, 30947=>11246, 30939=>11247, 30945=>11248, 30946=>11249, 30957=>11250, 30943=>11251, 30944=>11252, 31140=>11253, 31300=>11254, 31304=>11255, 31303=>11256, 31414=>11257, 31416=>11258, 31413=>11259, 31409=>11260, 31415=>11261, 31710=>11262, 31715=>11263, 31719=>11264, 31709=>11265, 31701=>11266, 31717=>11267, 31706=>11268, 31720=>11269, 31737=>11270, 31700=>11271, 31722=>11272, 31714=>11273, 31708=>11274, 31723=>11275, 31704=>11276, 31711=>11277, 31954=>11278, 31956=>11279, 31959=>11280, 31952=>11281, 31953=>11282, 32274=>11283, 32289=>11284, 32279=>11285, 32268=>11286, 32287=>11287, 32288=>11288, 32275=>11289, 32270=>11290, 32284=>11291, 32277=>11292, 32282=>11293, 32290=>11294, 32267=>11295, 32271=>11296, 32278=>11297, 32269=>11298, 32276=>11299, 32293=>11300, 32292=>11301, 32579=>11302, 32635=>11303, 32636=>11304, 32634=>11305, 32689=>11306, 32751=>11307, 32810=>11308, 32809=>11309, 32876=>11310, 33201=>11311, 33190=>11312, 33198=>11313, 33209=>11314, 33205=>11315, 33195=>11316, 33200=>11317, 33196=>11318, 33204=>11319, 33202=>11320, 33207=>11321, 33191=>11322, 33266=>11323, 33365=>11324, 33366=>11325, 33367=>11326, 34134=>11327, 34117=>11328, 34155=>11329, 34125=>11330, 34131=>11331, 34145=>11332, 34136=>11333, 34112=>11334, 34118=>11335, 34148=>11336, 34113=>11337, 34146=>11338, 34116=>11339, 34129=>11340, 34119=>11341, 34147=>11342, 34110=>11343, 34139=>11344, 34161=>11345, 34126=>11346, 34158=>11347, 34165=>11348, 34133=>11349, 34151=>11350, 34144=>11351, 34188=>11352, 34150=>11353, 34141=>11354, 34132=>11355, 34149=>11356, 34156=>11357, 34403=>11358, 34405=>11359, 34404=>11360, 34724=>11361, 34715=>11362, 34703=>11363, 34711=>11364, 34707=>11365, 34706=>11366, 34696=>11367, 34689=>11368, 34710=>11369, 34712=>11370, 34681=>11371, 34695=>11372, 34723=>11373, 34693=>11374, 34704=>11375, 34705=>11376, 34717=>11377, 34692=>11378, 34708=>11379, 34716=>11380, 34714=>11381, 34697=>11382, 35102=>11383, 35110=>11384, 35120=>11385, 35117=>11386, 35118=>11387, 35111=>11388, 35121=>11389, 35106=>11390, 35113=>11391, 35107=>11392, 35119=>11393, 35116=>11394, 35103=>11395, 35313=>11396, 35552=>11397, 35554=>11398, 35570=>11399, 35572=>11400, 35573=>11401, 35549=>11402, 35604=>11403, 35556=>11404, 35551=>11405, 35568=>11406, 35528=>11407, 35550=>11408, 35553=>11409, 35560=>11410, 35583=>11411, 35567=>11412, 35579=>11413, 35985=>11414, 35986=>11415, 35984=>11416, 36085=>11417, 36078=>11418, 36081=>11419, 36080=>11420, 36083=>11421, 36204=>11422, 36206=>11423, 36261=>11424, 36263=>11425, 36403=>11426, 36414=>11427, 36408=>11428, 36416=>11429, 36421=>11430, 36406=>11431, 36412=>11432, 36413=>11433, 36417=>11434, 36400=>11435, 36415=>11436, 36541=>11437, 36662=>11438, 60329=>11438, 36654=>11439, 36661=>11440, 36658=>11441, 36665=>11442, 36663=>11443, 36660=>11444, 36982=>11445, 36985=>11446, 36987=>11447, 36998=>11448, 37114=>11449, 37171=>11450, 37173=>11451, 37174=>11452, 37267=>11453, 37264=>11454, 37265=>11455, 37261=>11456, 37263=>11457, 37671=>11458, 37662=>11459, 37640=>11460, 37663=>11461, 37638=>11462, 37647=>11463, 37754=>11464, 37688=>11465, 37692=>11466, 37659=>11467, 37667=>11468, 37650=>11469, 37633=>11470, 37702=>11471, 37677=>11472, 37646=>11473, 37645=>11474, 37579=>11475, 37661=>11476, 37626=>11477, 37651=>11478, 37625=>11479, 37623=>11480, 37684=>11481, 37634=>11482, 37668=>11483, 37631=>11484, 37673=>11485, 37689=>11486, 37685=>11487, 37674=>11488, 37652=>11489, 37644=>11490, 37643=>11491, 37630=>11492, 37641=>11493, 37632=>11494, 37627=>11495, 37654=>11496, 38332=>11497, 38349=>11498, 38334=>11499, 38329=>11500, 38330=>11501, 38326=>11502, 38335=>11503, 38325=>11504, 38333=>11505, 38569=>11506, 38612=>11507, 38667=>11508, 38674=>11509, 38672=>11510, 38809=>11511, 38807=>11512, 38804=>11513, 38896=>11514, 38904=>11515, 38965=>11516, 38959=>11517, 38962=>11518, 39204=>11519, 39199=>11520, 39207=>11521, 39209=>11522, 39326=>11523, 39406=>11524, 39404=>11525, 39397=>11526, 39396=>11527, 39408=>11528, 39395=>11529, 39402=>11530, 39401=>11531, 39399=>11532, 39609=>11533, 39615=>11534, 39604=>11535, 39611=>11536, 39670=>11537, 39674=>11538, 39673=>11539, 39671=>11540, 39731=>11541, 39808=>11542, 39813=>11543, 39815=>11544, 39804=>11545, 39806=>11546, 39803=>11547, 39810=>11548, 39827=>11549, 39826=>11550, 39824=>11551, 39802=>11552, 39829=>11553, 39805=>11554, 39816=>11555, 40229=>11556, 40215=>11557, 40224=>11558, 40222=>11559, 40212=>11560, 40233=>11561, 40221=>11562, 40216=>11563, 40226=>11564, 40208=>11565, 40217=>11566, 40223=>11567, 40584=>11568, 40582=>11569, 40583=>11570, 40622=>11571, 40621=>11572, 40661=>11573, 40662=>11574, 40698=>11575, 40722=>11576, 40765=>11577, 20774=>11578, 20773=>11579, 20770=>11580, 20772=>11581, 20768=>11582, 20777=>11583, 21236=>11584, 22163=>11585, 22156=>11586, 22157=>11587, 22150=>11588, 22148=>11589, 22147=>11590, 22142=>11591, 22146=>11592, 22143=>11593, 22145=>11594, 22742=>11595, 22740=>11596, 22735=>11597, 22738=>11598, 23341=>11599, 23333=>11600, 23346=>11601, 23331=>11602, 23340=>11603, 23335=>11604, 23334=>11605, 23343=>11606, 23342=>11607, 23419=>11608, 23537=>11609, 23538=>11610, 23991=>11611, 24172=>11612, 24170=>11613, 24510=>11614, 25027=>11615, 25013=>11616, 25020=>11617, 25063=>11618, 25056=>11619, 25061=>11620, 25060=>11621, 25064=>11622, 25054=>11623, 25839=>11624, 25833=>11625, 25827=>11626, 25835=>11627, 25828=>11628, 25832=>11629, 25985=>11630, 25984=>11631, 26038=>11632, 26074=>11633, 26322=>11634, 27277=>11635, 27286=>11636, 27265=>11637, 27301=>11638, 27273=>11639, 27295=>11640, 27291=>11641, 27297=>11642, 27294=>11643, 27271=>11644, 27283=>11645, 27278=>11646, 27285=>11647, 27267=>11648, 27304=>11649, 27300=>11650, 27281=>11651, 27263=>11652, 27302=>11653, 27290=>11654, 27269=>11655, 27276=>11656, 27282=>11657, 27483=>11658, 27565=>11659, 27657=>11660, 28620=>11661, 28585=>11662, 28660=>11663, 28628=>11664, 28643=>11665, 28636=>11666, 28653=>11667, 28647=>11668, 28646=>11669, 28638=>11670, 28658=>11671, 28637=>11672, 28642=>11673, 28648=>11674, 29153=>11675, 29169=>11676, 29160=>11677, 29170=>11678, 29156=>11679, 29168=>11680, 29154=>11681, 29555=>11682, 29550=>11683, 29551=>11684, 29847=>11685, 29874=>11686, 29867=>11687, 29840=>11688, 29866=>11689, 29869=>11690, 29873=>11691, 29861=>11692, 29871=>11693, 29968=>11694, 29969=>11695, 29970=>11696, 29967=>11697, 30084=>11698, 30275=>11699, 30280=>11700, 30281=>11701, 30279=>11702, 30372=>11703, 30441=>11704, 30645=>11705, 30635=>11706, 30642=>11707, 30647=>11708, 30646=>11709, 30644=>11710, 30641=>11711, 30632=>11712, 30704=>11713, 30963=>11714, 30973=>11715, 30978=>11716, 30971=>11717, 30972=>11718, 30975=>11719, 30962=>11720, 30981=>11721, 30969=>11722, 30974=>11723, 30980=>11724, 31147=>11725, 31144=>11726, 31324=>11727, 31323=>11728, 31318=>11729, 31320=>11730, 31316=>11731, 31322=>11732, 31422=>11733, 31424=>11734, 31425=>11735, 31749=>11736, 31759=>11737, 31730=>11738, 31744=>11739, 31743=>11740, 31739=>11741, 31758=>11742, 31732=>11743, 31755=>11744, 31731=>11745, 31746=>11746, 31753=>11747, 31747=>11748, 31745=>11749, 31736=>11750, 31741=>11751, 31750=>11752, 58176=>11752, 31728=>11753, 31729=>11754, 31760=>11755, 31754=>11756, 31976=>11757, 32301=>11758, 32316=>11759, 32322=>11760, 32307=>11761, 38984=>11762, 32312=>11763, 32298=>11764, 32329=>11765, 32320=>11766, 32327=>11767, 32297=>11768, 32332=>11769, 32304=>11770, 32315=>11771, 32310=>11772, 32324=>11773, 32314=>11774, 32581=>11775, 32639=>11776, 32638=>11777, 32637=>11778, 32756=>11779, 32754=>11780, 32812=>11781, 33211=>11782, 33220=>11783, 33228=>11784, 33226=>11785, 33221=>11786, 33223=>11787, 33212=>11788, 33257=>11789, 33371=>11790, 33370=>11791, 33372=>11792, 34179=>11793, 34176=>11794, 34191=>11795, 34215=>11796, 34197=>11797, 34208=>11798, 34187=>11799, 34211=>11800, 34171=>11801, 34212=>11802, 34202=>11803, 34206=>11804, 34167=>11805, 34172=>11806, 34185=>11807, 34209=>11808, 34170=>11809, 34168=>11810, 34135=>11811, 34190=>11812, 34198=>11813, 34182=>11814, 34189=>11815, 34201=>11816, 34205=>11817, 34177=>11818, 34210=>11819, 34178=>11820, 34184=>11821, 34181=>11822, 34169=>11823, 34166=>11824, 34200=>11825, 34192=>11826, 34207=>11827, 34408=>11828, 34750=>11829, 34730=>11830, 34733=>11831, 34757=>11832, 34736=>11833, 34732=>11834, 34745=>11835, 34741=>11836, 34748=>11837, 34734=>11838, 34761=>11839, 34755=>11840, 34754=>11841, 34764=>11842, 34743=>11843, 34735=>11844, 34756=>11845, 34762=>11846, 34740=>11847, 34742=>11848, 34751=>11849, 34744=>11850, 34749=>11851, 34782=>11852, 34738=>11853, 35125=>11854, 35123=>11855, 35132=>11856, 35134=>11857, 35137=>11858, 35154=>11859, 35127=>11860, 35138=>11861, 35245=>11862, 35247=>11863, 35246=>11864, 35314=>11865, 35315=>11866, 35614=>11867, 35608=>11868, 35606=>11869, 35601=>11870, 35589=>11871, 35595=>11872, 35618=>11873, 35599=>11874, 35602=>11875, 35605=>11876, 35591=>11877, 35597=>11878, 35592=>11879, 35590=>11880, 35612=>11881, 35603=>11882, 35610=>11883, 35919=>11884, 35952=>11885, 35954=>11886, 35953=>11887, 35951=>11888, 35989=>11889, 35988=>11890, 36089=>11891, 36207=>11892, 36430=>11893, 36429=>11894, 36435=>11895, 36432=>11896, 36428=>11897, 36423=>11898, 36675=>11899, 36672=>11900, 36997=>11901, 36990=>11902, 37176=>11903, 37274=>11904, 37282=>11905, 37275=>11906, 37273=>11907, 37279=>11908, 37281=>11909, 37277=>11910, 37280=>11911, 37793=>11912, 37763=>11913, 37807=>11914, 37732=>11915, 37718=>11916, 37703=>11917, 37756=>11918, 37720=>11919, 37724=>11920, 37750=>11921, 37705=>11922, 37712=>11923, 37713=>11924, 37728=>11925, 37741=>11926, 37775=>11927, 37708=>11928, 37738=>11929, 37753=>11930, 37719=>11931, 37717=>11932, 37714=>11933, 37711=>11934, 37745=>11935, 37751=>11936, 37755=>11937, 37729=>11938, 37726=>11939, 37731=>11940, 37735=>11941, 37710=>11942, 37721=>11943, 38343=>11944, 38336=>11945, 38345=>11946, 38339=>11947, 38341=>11948, 38327=>11949, 38574=>11950, 38576=>11951, 38572=>11952, 38688=>11953, 38687=>11954, 38680=>11955, 38685=>11956, 38681=>11957, 38810=>11958, 38817=>11959, 38812=>11960, 38814=>11961, 38813=>11962, 38869=>11963, 38868=>11964, 38897=>11965, 38977=>11966, 38980=>11967, 38986=>11968, 38985=>11969, 38981=>11970, 38979=>11971, 39205=>11972, 39211=>11973, 39212=>11974, 39210=>11975, 39219=>11976, 39218=>11977, 39215=>11978, 39213=>11979, 39217=>11980, 39216=>11981, 39320=>11982, 39331=>11983, 39329=>11984, 39426=>11985, 39418=>11986, 39412=>11987, 39415=>11988, 39417=>11989, 39416=>11990, 39414=>11991, 39419=>11992, 39421=>11993, 39422=>11994, 39420=>11995, 39427=>11996, 39614=>11997, 39678=>11998, 39677=>11999, 39681=>12000, 39676=>12001, 39752=>12002, 39834=>12003, 39848=>12004, 39838=>12005, 39835=>12006, 39846=>12007, 39841=>12008, 39845=>12009, 39844=>12010, 39814=>12011, 39842=>12012, 39840=>12013, 39855=>12014, 40243=>12015, 40257=>12016, 40295=>12017, 40246=>12018, 40238=>12019, 40239=>12020, 40241=>12021, 40248=>12022, 40240=>12023, 40261=>12024, 40258=>12025, 40259=>12026, 40254=>12027, 40247=>12028, 40256=>12029, 40253=>12030, 32757=>12031, 40237=>12032, 40586=>12033, 40585=>12034, 40589=>12035, 40624=>12036, 40648=>12037, 40666=>12038, 40699=>12039, 40703=>12040, 40740=>12041, 40739=>12042, 40738=>12043, 40788=>12044, 12245=>12045, 40864=>12045, 20785=>12046, 20781=>12047, 20782=>12048, 22168=>12049, 22172=>12050, 22167=>12051, 22170=>12052, 22173=>12053, 22169=>12054, 22896=>12055, 23356=>12056, 23657=>12057, 23658=>12058, 24000=>12059, 24173=>12060, 24174=>12061, 25048=>12062, 25055=>12063, 25069=>12064, 25070=>12065, 25073=>12066, 25066=>12067, 25072=>12068, 25067=>12069, 25046=>12070, 25065=>12071, 25855=>12072, 25860=>12073, 25853=>12074, 25848=>12075, 25857=>12076, 25859=>12077, 25852=>12078, 26004=>12079, 26075=>12080, 26330=>12081, 26331=>12082, 26328=>12083, 27333=>12084, 27321=>12085, 27325=>12086, 27361=>12087, 27334=>12088, 27322=>12089, 27318=>12090, 27319=>12091, 27335=>12092, 27316=>12093, 27309=>12094, 27486=>12095, 27593=>12096, 27659=>12097, 28679=>12098, 28684=>12099, 28685=>12100, 28673=>12101, 28677=>12102, 28692=>12103, 28686=>12104, 28671=>12105, 28672=>12106, 28667=>12107, 28710=>12108, 28668=>12109, 28663=>12110, 28682=>12111, 29185=>12112, 60224=>12112, 29183=>12113, 29177=>12114, 29187=>12115, 29181=>12116, 29558=>12117, 29880=>12118, 29888=>12119, 29877=>12120, 29889=>12121, 29886=>12122, 29878=>12123, 29883=>12124, 29890=>12125, 29972=>12126, 29971=>12127, 30300=>12128, 30308=>12129, 30297=>12130, 30288=>12131, 30291=>12132, 30295=>12133, 30298=>12134, 30374=>12135, 30397=>12136, 30444=>12137, 30658=>12138, 30650=>12139, 30988=>12140, 30995=>12141, 30996=>12142, 30985=>12143, 30992=>12144, 30994=>12145, 30993=>12146, 31149=>12147, 31148=>12148, 31327=>12149, 31772=>12150, 31785=>12151, 31769=>12152, 31776=>12153, 31775=>12154, 31789=>12155, 31773=>12156, 31782=>12157, 31784=>12158, 31778=>12159, 31781=>12160, 31792=>12161, 32348=>12162, 32336=>12163, 32342=>12164, 32355=>12165, 32344=>12166, 32354=>12167, 32351=>12168, 32337=>12169, 32352=>12170, 32343=>12171, 32339=>12172, 32693=>12173, 32691=>12174, 32759=>12175, 32760=>12176, 32885=>12177, 33233=>12178, 33234=>12179, 33232=>12180, 33375=>12181, 33374=>12182, 34228=>12183, 34246=>12184, 34240=>12185, 34243=>12186, 34242=>12187, 34227=>12188, 34229=>12189, 34237=>12190, 34247=>12191, 34244=>12192, 34239=>12193, 34251=>12194, 34254=>12195, 34248=>12196, 34245=>12197, 34225=>12198, 34230=>12199, 34258=>12200, 34340=>12201, 34232=>12202, 34231=>12203, 34238=>12204, 34409=>12205, 34791=>12206, 34790=>12207, 34786=>12208, 34779=>12209, 34795=>12210, 34794=>12211, 34789=>12212, 34783=>12213, 34803=>12214, 34788=>12215, 34772=>12216, 34780=>12217, 34771=>12218, 34797=>12219, 34776=>12220, 34787=>12221, 34775=>12222, 34777=>12223, 34817=>12224, 34804=>12225, 34792=>12226, 34781=>12227, 35155=>12228, 35147=>12229, 35151=>12230, 35148=>12231, 35142=>12232, 35152=>12233, 35153=>12234, 35145=>12235, 35626=>12236, 35623=>12237, 35619=>12238, 35635=>12239, 35632=>12240, 35637=>12241, 35655=>12242, 35631=>12243, 35644=>12244, 35646=>12245, 35633=>12246, 35621=>12247, 35639=>12248, 35622=>12249, 35638=>12250, 35630=>12251, 35620=>12252, 35643=>12253, 35645=>12254, 35642=>12255, 35906=>12256, 35957=>12257, 35993=>12258, 35992=>12259, 35991=>12260, 36094=>12261, 36100=>12262, 36098=>12263, 36096=>12264, 36444=>12265, 36450=>12266, 36448=>12267, 36439=>12268, 36438=>12269, 36446=>12270, 36453=>12271, 36455=>12272, 36443=>12273, 36442=>12274, 36449=>12275, 36445=>12276, 36457=>12277, 36436=>12278, 36678=>12279, 36679=>12280, 36680=>12281, 36683=>12282, 37160=>12283, 37178=>12284, 37179=>12285, 37182=>12286, 37288=>12287, 37285=>12288, 37287=>12289, 37295=>12290, 37290=>12291, 37813=>12292, 37772=>12293, 37778=>12294, 37815=>12295, 37787=>12296, 37789=>12297, 37769=>12298, 37799=>12299, 37774=>12300, 37802=>12301, 37790=>12302, 37798=>12303, 37781=>12304, 37768=>12305, 37785=>12306, 37791=>12307, 37760=>12308, 37773=>12309, 37809=>12310, 37777=>12311, 37810=>12312, 37796=>12313, 37800=>12314, 37812=>12315, 37795=>12316, 38354=>12317, 38355=>12318, 38353=>12319, 38579=>12320, 38615=>12321, 38618=>12322, 24002=>12323, 38623=>12324, 38616=>12325, 38621=>12326, 38691=>12327, 38690=>12328, 38693=>12329, 38828=>12330, 38830=>12331, 38824=>12332, 38827=>12333, 38820=>12334, 38826=>12335, 38818=>12336, 38821=>12337, 38871=>12338, 38873=>12339, 38870=>12340, 38872=>12341, 38906=>12342, 38992=>12343, 38993=>12344, 38994=>12345, 39096=>12346, 39233=>12347, 39228=>12348, 39226=>12349, 39439=>12350, 39435=>12351, 39433=>12352, 39437=>12353, 39428=>12354, 39441=>12355, 39434=>12356, 39429=>12357, 39431=>12358, 39430=>12359, 39616=>12360, 39644=>12361, 39688=>12362, 39684=>12363, 39685=>12364, 39721=>12365, 39733=>12366, 39754=>12367, 39756=>12368, 39755=>12369, 39879=>12370, 39878=>12371, 39875=>12372, 39871=>12373, 39873=>12374, 39861=>12375, 39864=>12376, 39891=>12377, 39862=>12378, 39876=>12379, 39865=>12380, 39869=>12381, 40284=>12382, 40275=>12383, 40271=>12384, 40266=>12385, 40283=>12386, 40267=>12387, 40281=>12388, 40278=>12389, 40268=>12390, 40279=>12391, 40274=>12392, 40276=>12393, 40287=>12394, 40280=>12395, 40282=>12396, 40590=>12397, 40588=>12398, 40671=>12399, 40705=>12400, 40704=>12401, 40726=>12402, 58693=>12402, 40741=>12403, 40747=>12404, 40746=>12405, 40745=>12406, 40744=>12407, 40780=>12408, 40789=>12409, 20788=>12410, 20789=>12411, 21142=>12412, 21239=>12413, 21428=>12414, 22187=>12415, 22189=>12416, 22182=>12417, 22183=>12418, 22186=>12419, 22188=>12420, 22746=>12421, 22749=>12422, 22747=>12423, 22802=>12424, 23357=>12425, 23358=>12426, 23359=>12427, 24003=>12428, 24176=>12429, 24511=>12430, 25083=>12431, 25863=>12432, 25872=>12433, 25869=>12434, 25865=>12435, 25868=>12436, 25870=>12437, 25988=>12438, 26078=>12439, 26077=>12440, 26334=>12441, 27367=>12442, 27360=>12443, 27340=>12444, 27345=>12445, 27353=>12446, 27339=>12447, 27359=>12448, 27356=>12449, 27344=>12450, 27371=>12451, 27343=>12452, 27341=>12453, 27358=>12454, 27488=>12455, 27568=>12456, 27660=>12457, 28697=>12458, 28711=>12459, 28704=>12460, 28694=>12461, 28715=>12462, 28705=>12463, 28706=>12464, 28707=>12465, 28713=>12466, 28695=>12467, 28708=>12468, 28700=>12469, 29196=>12470, 29194=>12471, 29191=>12472, 29186=>12473, 29189=>12474, 29349=>12475, 29350=>12476, 29348=>12477, 29347=>12478, 29345=>12479, 29899=>12480, 29893=>12481, 29879=>12482, 29891=>12483, 29974=>12484, 30304=>12485, 30665=>12486, 30666=>12487, 30660=>12488, 30705=>12489, 31005=>12490, 31003=>12491, 31009=>12492, 31004=>12493, 30999=>12494, 31006=>12495, 31152=>12496, 31335=>12497, 31336=>12498, 31795=>12499, 31804=>12500, 31801=>12501, 31788=>12502, 31803=>12503, 31980=>12504, 31978=>12505, 32374=>12506, 32373=>12507, 32376=>12508, 32368=>12509, 32375=>12510, 32367=>12511, 32378=>12512, 32370=>12513, 32372=>12514, 32360=>12515, 32587=>12516, 32586=>12517, 32643=>12518, 32646=>12519, 32695=>12520, 32765=>12521, 32766=>12522, 32888=>12523, 33239=>12524, 33237=>12525, 33291=>12526, 33380=>12527, 33377=>12528, 33379=>12529, 34283=>12530, 34289=>12531, 34285=>12532, 34265=>12533, 34273=>12534, 34280=>12535, 34266=>12536, 34263=>12537, 34284=>12538, 34290=>12539, 34296=>12540, 34264=>12541, 34271=>12542, 34275=>12543, 34268=>12544, 34257=>12545, 34288=>12546, 34278=>12547, 34287=>12548, 34270=>12549, 34274=>12550, 34816=>12551, 34810=>12552, 34819=>12553, 34806=>12554, 34807=>12555, 34825=>12556, 34828=>12557, 34827=>12558, 34822=>12559, 34812=>12560, 34824=>12561, 34815=>12562, 34826=>12563, 34818=>12564, 35170=>12565, 35162=>12566, 35163=>12567, 35159=>12568, 35169=>12569, 35164=>12570, 35160=>12571, 35165=>12572, 35161=>12573, 35208=>12574, 35255=>12575, 35254=>12576, 35318=>12577, 35664=>12578, 35656=>12579, 35658=>12580, 35648=>12581, 35667=>12582, 35670=>12583, 35668=>12584, 35659=>12585, 35669=>12586, 35665=>12587, 35650=>12588, 35666=>12589, 35671=>12590, 35907=>12591, 35959=>12592, 35958=>12593, 35994=>12594, 36102=>12595, 36103=>12596, 36105=>12597, 36268=>12598, 36266=>12599, 36269=>12600, 36267=>12601, 36461=>12602, 36472=>12603, 36467=>12604, 36458=>12605, 36463=>12606, 36475=>12607, 36546=>12608, 36690=>12609, 36689=>12610, 36687=>12611, 36688=>12612, 36691=>12613, 36788=>12614, 37184=>12615, 37183=>12616, 37296=>12617, 37293=>12618, 37854=>12619, 37831=>12620, 37839=>12621, 37826=>12622, 37850=>12623, 37840=>12624, 37881=>12625, 37868=>12626, 37836=>12627, 37849=>12628, 37801=>12629, 37862=>12630, 37834=>12631, 37844=>12632, 37870=>12633, 37859=>12634, 37845=>12635, 37828=>12636, 37838=>12637, 37824=>12638, 37842=>12639, 37797=>12640, 37863=>12641, 38269=>12642, 38362=>12643, 38363=>12644, 38625=>12645, 38697=>12646, 38699=>12647, 38700=>12648, 38696=>12649, 38694=>12650, 38835=>12651, 38839=>12652, 38838=>12653, 38877=>12654, 38878=>12655, 38879=>12656, 39004=>12657, 39001=>12658, 39005=>12659, 38999=>12660, 39103=>12661, 39101=>12662, 39099=>12663, 39102=>12664, 39240=>12665, 39239=>12666, 39235=>12667, 39334=>12668, 39335=>12669, 39450=>12670, 39445=>12671, 39461=>12672, 39453=>12673, 39460=>12674, 39451=>12675, 39458=>12676, 39456=>12677, 39463=>12678, 39459=>12679, 39454=>12680, 39452=>12681, 39444=>12682, 39618=>12683, 39691=>12684, 39690=>12685, 39694=>12686, 39692=>12687, 39735=>12688, 39914=>12689, 39915=>12690, 39904=>12691, 39902=>12692, 39908=>12693, 39910=>12694, 39906=>12695, 39920=>12696, 39892=>12697, 39895=>12698, 39916=>12699, 39900=>12700, 39897=>12701, 39909=>12702, 39893=>12703, 39905=>12704, 39898=>12705, 40311=>12706, 40321=>12707, 40330=>12708, 40324=>12709, 40328=>12710, 40305=>12711, 40320=>12712, 40312=>12713, 40326=>12714, 40331=>12715, 40332=>12716, 40317=>12717, 40299=>12718, 40308=>12719, 40309=>12720, 40304=>12721, 40297=>12722, 40325=>12723, 40307=>12724, 40315=>12725, 40322=>12726, 40303=>12727, 40313=>12728, 40319=>12729, 40327=>12730, 40296=>12731, 40596=>12732, 40593=>12733, 40640=>12734, 40700=>12735, 40749=>12736, 40768=>12737, 40769=>12738, 40781=>12739, 40790=>12740, 40791=>12741, 40792=>12742, 21303=>12743, 22194=>12744, 22197=>12745, 22195=>12746, 22755=>12747, 23365=>12748, 24006=>12749, 24007=>12750, 24302=>12751, 24303=>12752, 24512=>12753, 24513=>12754, 25081=>12755, 25879=>12756, 25878=>12757, 25877=>12758, 25875=>12759, 26079=>12760, 26344=>12761, 26339=>12762, 26340=>12763, 27379=>12764, 27376=>12765, 27370=>12766, 27368=>12767, 27385=>12768, 27377=>12769, 27374=>12770, 27375=>12771, 28732=>12772, 28725=>12773, 28719=>12774, 28727=>12775, 28724=>12776, 28721=>12777, 28738=>12778, 28728=>12779, 28735=>12780, 28730=>12781, 28729=>12782, 28714=>12783, 28736=>12784, 28731=>12785, 28723=>12786, 28737=>12787, 29203=>12788, 29204=>12789, 29352=>12790, 29565=>12791, 29564=>12792, 29882=>12793, 30379=>12794, 30378=>12795, 30398=>12796, 30445=>12797, 30668=>12798, 30670=>12799, 30671=>12800, 30669=>12801, 30706=>12802, 31013=>12803, 31011=>12804, 31015=>12805, 31016=>12806, 31012=>12807, 31017=>12808, 31154=>12809, 31342=>12810, 31340=>12811, 31341=>12812, 31479=>12813, 31817=>12814, 31816=>12815, 31818=>12816, 31815=>12817, 31813=>12818, 31982=>12819, 32379=>12820, 32382=>12821, 32385=>12822, 32384=>12823, 32698=>12824, 32767=>12825, 32889=>12826, 33243=>12827, 33241=>12828, 33384=>12829, 33385=>12830, 34338=>12831, 34303=>12832, 34305=>12833, 34302=>12834, 34331=>12835, 34304=>12836, 34294=>12837, 34308=>12838, 34313=>12839, 34309=>12840, 34316=>12841, 34301=>12842, 34841=>12843, 34832=>12844, 34833=>12845, 34839=>12846, 34835=>12847, 34838=>12848, 35171=>12849, 35174=>12850, 35257=>12851, 35319=>12852, 35680=>12853, 35690=>12854, 35677=>12855, 35688=>12856, 35683=>12857, 35685=>12858, 35687=>12859, 35693=>12860, 36270=>12861, 36486=>12862, 36488=>12863, 36484=>12864, 36697=>12865, 36694=>12866, 36695=>12867, 36693=>12868, 36696=>12869, 36698=>12870, 37005=>12871, 37187=>12872, 37185=>12873, 37303=>12874, 37301=>12875, 37298=>12876, 37299=>12877, 37899=>12878, 37907=>12879, 37883=>12880, 37920=>12881, 37903=>12882, 37908=>12883, 37886=>12884, 37909=>12885, 37904=>12886, 37928=>12887, 37913=>12888, 37901=>12889, 37877=>12890, 37888=>12891, 37879=>12892, 37895=>12893, 37902=>12894, 37910=>12895, 37906=>12896, 37882=>12897, 37897=>12898, 37880=>12899, 37948=>12900, 37898=>12901, 37887=>12902, 37884=>12903, 37900=>12904, 37878=>12905, 37905=>12906, 37894=>12907, 38366=>12908, 38368=>12909, 38367=>12910, 38702=>12911, 38703=>12912, 38841=>12913, 38843=>12914, 38909=>12915, 38910=>12916, 39008=>12917, 39010=>12918, 39011=>12919, 39007=>12920, 39105=>12921, 39106=>12922, 39248=>12923, 39246=>12924, 39257=>12925, 39244=>12926, 39243=>12927, 39251=>12928, 39474=>12929, 39476=>12930, 39473=>12931, 39468=>12932, 39466=>12933, 39478=>12934, 39465=>12935, 39470=>12936, 39480=>12937, 39469=>12938, 39623=>12939, 39626=>12940, 39622=>12941, 39696=>12942, 39698=>12943, 39697=>12944, 39947=>12945, 39944=>12946, 39927=>12947, 39941=>12948, 39954=>12949, 39928=>12950, 40000=>12951, 39943=>12952, 39950=>12953, 39942=>12954, 39959=>12955, 39956=>12956, 39945=>12957, 40351=>12958, 40345=>12959, 40356=>12960, 40349=>12961, 40338=>12962, 40344=>12963, 40336=>12964, 40347=>12965, 40352=>12966, 40340=>12967, 40348=>12968, 40362=>12969, 40343=>12970, 40353=>12971, 40346=>12972, 40354=>12973, 40360=>12974, 40350=>12975, 40355=>12976, 40383=>12977, 40361=>12978, 40342=>12979, 40358=>12980, 40359=>12981, 40601=>12982, 40603=>12983, 40602=>12984, 40677=>12985, 40676=>12986, 40679=>12987, 40678=>12988, 40752=>12989, 40750=>12990, 40795=>12991, 40800=>12992, 40798=>12993, 40797=>12994, 40793=>12995, 40849=>12996, 20794=>12997, 20793=>12998, 21144=>12999, 21143=>13000, 22211=>13001, 22205=>13002, 22206=>13003, 23368=>13004, 23367=>13005, 24011=>13006, 24015=>13007, 24305=>13008, 25085=>13009, 25883=>13010, 27394=>13011, 27388=>13012, 27395=>13013, 27384=>13014, 27392=>13015, 28739=>13016, 28740=>13017, 28746=>13018, 28744=>13019, 28745=>13020, 28741=>13021, 28742=>13022, 29213=>13023, 29210=>13024, 29209=>13025, 29566=>13026, 29975=>13027, 30314=>13028, 30672=>13029, 31021=>13030, 31025=>13031, 31023=>13032, 31828=>13033, 31827=>13034, 31986=>13035, 32394=>13036, 60229=>13037, 32391=>13037, 32392=>13038, 32395=>13039, 32390=>13040, 32397=>13041, 32589=>13042, 32699=>13043, 32816=>13044, 33245=>13045, 34328=>13046, 34346=>13047, 34342=>13048, 34335=>13049, 34339=>13050, 34332=>13051, 34329=>13052, 34343=>13053, 34350=>13054, 34337=>13055, 34336=>13056, 34345=>13057, 34334=>13058, 34341=>13059, 34857=>13060, 34845=>13061, 34843=>13062, 34848=>13063, 34852=>13064, 34844=>13065, 34859=>13066, 34890=>13067, 35181=>13068, 35177=>13069, 35182=>13070, 35179=>13071, 35322=>13072, 35705=>13073, 35704=>13074, 35653=>13075, 35706=>13076, 35707=>13077, 36112=>13078, 36116=>13079, 36271=>13080, 36494=>13081, 36492=>13082, 36702=>13083, 36699=>13084, 36701=>13085, 37190=>13086, 37188=>13087, 37189=>13088, 37305=>13089, 37951=>13090, 37947=>13091, 37942=>13092, 37929=>13093, 37949=>13094, 37936=>13095, 37945=>13096, 37930=>13097, 37943=>13098, 37932=>13099, 37952=>13100, 37937=>13101, 38373=>13102, 38372=>13103, 38371=>13104, 38709=>13105, 38714=>13106, 38847=>13107, 38881=>13108, 39012=>13109, 39113=>13110, 39110=>13111, 39104=>13112, 39256=>13113, 39254=>13114, 39481=>13115, 39485=>13116, 39494=>13117, 39492=>13118, 39490=>13119, 39489=>13120, 39482=>13121, 39487=>13122, 39629=>13123, 39701=>13124, 39703=>13125, 39704=>13126, 39702=>13127, 39738=>13128, 39762=>13129, 39979=>13130, 39965=>13131, 39964=>13132, 39980=>13133, 39971=>13134, 39976=>13135, 39977=>13136, 39972=>13137, 39969=>13138, 40375=>13139, 40374=>13140, 40380=>13141, 40385=>13142, 40391=>13143, 40394=>13144, 40399=>13145, 40382=>13146, 40389=>13147, 40387=>13148, 40379=>13149, 40373=>13150, 40398=>13151, 40377=>13152, 40378=>13153, 40364=>13154, 40392=>13155, 40369=>13156, 40365=>13157, 40396=>13158, 40371=>13159, 40397=>13160, 40370=>13161, 40570=>13162, 40604=>13163, 40683=>13164, 40686=>13165, 40685=>13166, 40731=>13167, 40728=>13168, 40730=>13169, 40753=>13170, 40782=>13171, 40805=>13172, 40804=>13173, 40850=>13174, 20153=>13175, 22214=>13176, 22213=>13177, 22219=>13178, 22897=>13179, 23371=>13180, 23372=>13181, 24021=>13182, 24017=>13183, 24306=>13184, 25889=>13185, 25888=>13186, 25894=>13187, 25890=>13188, 27403=>13189, 27400=>13190, 27401=>13191, 27661=>13192, 28757=>13193, 28758=>13194, 28759=>13195, 28754=>13196, 29214=>13197, 29215=>13198, 29353=>13199, 29567=>13200, 29912=>13201, 29909=>13202, 29913=>13203, 29911=>13204, 30317=>13205, 30381=>13206, 31029=>13207, 31156=>13208, 31344=>13209, 31345=>13210, 31831=>13211, 31836=>13212, 31833=>13213, 31835=>13214, 31834=>13215, 31988=>13216, 31985=>13217, 32401=>13218, 32591=>13219, 32647=>13220, 33246=>13221, 33387=>13222, 34356=>13223, 34357=>13224, 34355=>13225, 34348=>13226, 34354=>13227, 34358=>13228, 34860=>13229, 34856=>13230, 34854=>13231, 34858=>13232, 34853=>13233, 35185=>13234, 35263=>13235, 35262=>13236, 35323=>13237, 35710=>13238, 35716=>13239, 35714=>13240, 35718=>13241, 35717=>13242, 35711=>13243, 36117=>13244, 36501=>13245, 36500=>13246, 36506=>13247, 36498=>13248, 36496=>13249, 36502=>13250, 36503=>13251, 36704=>13252, 36706=>13253, 37191=>13254, 37964=>13255, 37968=>13256, 37962=>13257, 37963=>13258, 37967=>13259, 37959=>13260, 37957=>13261, 37960=>13262, 37961=>13263, 37958=>13264, 38719=>13265, 38883=>13266, 39018=>13267, 39017=>13268, 39115=>13269, 39252=>13270, 39259=>13271, 39502=>13272, 39507=>13273, 39508=>13274, 39500=>13275, 39503=>13276, 39496=>13277, 39498=>13278, 39497=>13279, 39506=>13280, 39504=>13281, 39632=>13282, 39705=>13283, 39723=>13284, 39739=>13285, 39766=>13286, 39765=>13287, 40006=>13288, 40008=>13289, 39999=>13290, 40004=>13291, 39993=>13292, 39987=>13293, 40001=>13294, 39996=>13295, 39991=>13296, 39988=>13297, 39986=>13298, 39997=>13299, 39990=>13300, 40411=>13301, 40402=>13302, 40414=>13303, 40410=>13304, 40395=>13305, 40400=>13306, 40412=>13307, 40401=>13308, 40415=>13309, 40425=>13310, 40409=>13311, 40408=>13312, 40406=>13313, 40437=>13314, 40405=>13315, 40413=>13316, 40630=>13317, 40688=>13318, 40757=>13319, 40755=>13320, 40754=>13321, 40770=>13322, 40811=>13323, 40853=>13324, 40866=>13325, 20797=>13326, 21145=>13327, 22760=>13328, 22759=>13329, 22898=>13330, 23373=>13331, 24024=>13332, 34863=>13333, 24399=>13334, 25089=>13335, 25091=>13336, 25092=>13337, 25897=>13338, 25893=>13339, 26006=>13340, 26347=>13341, 27409=>13342, 27410=>13343, 27407=>13344, 27594=>13345, 28763=>13346, 28762=>13347, 29218=>13348, 29570=>13349, 29569=>13350, 29571=>13351, 30320=>13352, 30676=>13353, 31847=>13354, 31846=>13355, 32405=>13356, 33388=>13357, 34362=>13358, 34368=>13359, 34361=>13360, 34364=>13361, 34353=>13362, 34363=>13363, 34366=>13364, 34864=>13365, 34866=>13366, 34862=>13367, 34867=>13368, 35190=>13369, 35188=>13370, 35187=>13371, 35326=>13372, 35724=>13373, 35726=>13374, 35723=>13375, 35720=>13376, 35909=>13377, 36121=>13378, 36504=>13379, 36708=>13380, 36707=>13381, 37308=>13382, 37986=>13383, 37973=>13384, 37981=>13385, 37975=>13386, 37982=>13387, 38852=>13388, 38853=>13389, 38912=>13390, 39510=>13391, 39513=>13392, 39710=>13393, 39711=>13394, 39712=>13395, 40018=>13396, 40024=>13397, 40016=>13398, 40010=>13399, 40013=>13400, 40011=>13401, 40021=>13402, 40025=>13403, 40012=>13404, 40014=>13405, 40443=>13406, 40439=>13407, 40431=>13408, 40419=>13409, 40427=>13410, 40440=>13411, 40420=>13412, 40438=>13413, 40417=>13414, 40430=>13415, 40422=>13416, 40434=>13417, 40432=>13418, 60370=>13418, 40418=>13419, 40428=>13420, 40436=>13421, 40435=>13422, 40424=>13423, 40429=>13424, 40642=>13425, 40656=>13426, 40690=>13427, 40691=>13428, 40710=>13429, 40732=>13430, 40760=>13431, 40759=>13432, 40758=>13433, 40771=>13434, 40783=>13435, 40817=>13436, 40816=>13437, 40814=>13438, 40815=>13439, 22227=>13440, 22221=>13441, 23374=>13442, 23661=>13443, 25901=>13444, 26349=>13445, 26350=>13446, 27411=>13447, 28767=>13448, 28769=>13449, 28765=>13450, 28768=>13451, 29219=>13452, 29915=>13453, 29925=>13454, 30677=>13455, 31032=>13456, 31159=>13457, 31158=>13458, 31850=>13459, 32407=>13460, 32649=>13461, 33389=>13462, 34371=>13463, 34872=>13464, 34871=>13465, 34869=>13466, 34891=>13467, 35732=>13468, 35733=>13469, 36510=>13470, 36511=>13471, 36512=>13472, 36509=>13473, 37310=>13474, 37309=>13475, 37314=>13476, 37995=>13477, 37992=>13478, 37993=>13479, 38629=>13480, 38726=>13481, 38723=>13482, 38727=>13483, 38855=>13484, 38885=>13485, 39518=>13486, 39637=>13487, 39769=>13488, 40035=>13489, 40039=>13490, 40038=>13491, 40034=>13492, 40030=>13493, 40032=>13494, 40450=>13495, 40446=>13496, 40455=>13497, 40451=>13498, 40454=>13499, 40453=>13500, 40448=>13501, 40449=>13502, 40457=>13503, 40447=>13504, 40445=>13505, 40452=>13506, 40608=>13507, 40734=>13508, 40774=>13509, 40820=>13510, 40821=>13511, 40822=>13512, 22228=>13513, 25902=>13514, 26040=>13515, 27416=>13516, 27417=>13517, 27415=>13518, 27418=>13519, 28770=>13520, 29222=>13521, 29354=>13522, 30680=>13523, 30681=>13524, 31033=>13525, 31849=>13526, 31851=>13527, 31990=>13528, 32410=>13529, 32408=>13530, 32411=>13531, 32409=>13532, 33248=>13533, 33249=>13534, 34374=>13535, 34375=>13536, 34376=>13537, 35193=>13538, 35194=>13539, 35196=>13540, 35195=>13541, 35327=>13542, 35736=>13543, 35737=>13544, 36517=>13545, 36516=>13546, 36515=>13547, 37998=>13548, 37997=>13549, 37999=>13550, 38001=>13551, 38003=>13552, 38729=>13553, 39026=>13554, 39263=>13555, 40040=>13556, 40046=>13557, 40045=>13558, 40459=>13559, 40461=>13560, 40464=>13561, 40463=>13562, 40466=>13563, 40465=>13564, 40609=>13565, 40693=>13566, 40713=>13567, 40775=>13568, 40824=>13569, 40827=>13570, 40826=>13571, 40825=>13572, 22302=>13573, 28774=>13574, 31855=>13575, 34876=>13576, 36274=>13577, 36518=>13578, 37315=>13579, 38004=>13580, 38008=>13581, 38006=>13582, 38005=>13583, 39520=>13584, 39726=>13585, 60830=>13585, 40052=>13586, 40051=>13587, 40049=>13588, 40053=>13589, 40468=>13590, 40467=>13591, 40694=>13592, 40714=>13593, 40868=>13594, 28776=>13595, 28773=>13596, 31991=>13597, 34410=>13598, 34878=>13599, 34877=>13600, 34879=>13601, 35742=>13602, 35996=>13603, 36521=>13604, 36553=>13605, 38731=>13606, 39027=>13607, 39028=>13608, 39116=>13609, 39265=>13610, 39339=>13611, 39524=>13612, 39526=>13613, 39527=>13614, 39716=>13615, 40469=>13616, 40471=>13617, 40776=>13618, 25095=>13619, 27422=>13620, 29223=>13621, 34380=>13622, 36520=>13623, 38018=>13624, 38016=>13625, 38017=>13626, 39529=>13627, 39528=>13628, 40473=>13629, 34379=>13630, 35743=>13631, 38019=>13632, 40057=>13633, 40631=>13634, 30325=>13635, 39531=>13636, 40058=>13637, 40477=>13638, 28777=>13639, 28778=>13640, 29225=>13641, 40612=>13642, 40830=>13643, 40777=>13644, 40856=>13645, 65049=>13646, 65075=>13743, 9588=>13744, 65076=>13745, 65103=>13746, 168=>13747, 776=>13747, 63208=>13747, 710=>13748, 65342=>13748, 63209=>13748, 12541=>13749, 63210=>13749, 12542=>13750, 63211=>13750, 12445=>13751, 63212=>13751, 12446=>13752, 63213=>13752, 12293=>13754, 63216=>13754, 12294=>13755, 63217=>13755, 12295=>13756, 63218=>13756, 12540=>13757, 63219=>13757, 65339=>13758, 63220=>13758, 65341=>13759, 63221=>13759, 10045=>13760, 63222=>13760, 12353=>13761, 63223=>13761, 12354=>13762, 63224=>13762, 12355=>13763, 63225=>13763, 12356=>13764, 63226=>13764, 12357=>13765, 63227=>13765, 12358=>13766, 63228=>13766, 12359=>13767, 63229=>13767, 12360=>13768, 63230=>13768, 12361=>13769, 63231=>13769, 12362=>13770, 63232=>13770, 12363=>13771, 63233=>13771, 12364=>13772, 63234=>13772, 12365=>13773, 63235=>13773, 12366=>13774, 63236=>13774, 12367=>13775, 63237=>13775, 12368=>13776, 63238=>13776, 12369=>13777, 63239=>13777, 12370=>13778, 63240=>13778, 12371=>13779, 63241=>13779, 12372=>13780, 63242=>13780, 12373=>13781, 63243=>13781, 12374=>13782, 63244=>13782, 12375=>13783, 63245=>13783, 12376=>13784, 63246=>13784, 12377=>13785, 63247=>13785, 12378=>13786, 63248=>13786, 12379=>13787, 63249=>13787, 12380=>13788, 63250=>13788, 12381=>13789, 63251=>13789, 12382=>13790, 63252=>13790, 12383=>13791, 63253=>13791, 12384=>13792, 63254=>13792, 12385=>13793, 63255=>13793, 12386=>13794, 63256=>13794, 12387=>13795, 63257=>13795, 12388=>13796, 63258=>13796, 12389=>13797, 63259=>13797, 12390=>13798, 63260=>13798, 12391=>13799, 63261=>13799, 12392=>13800, 63262=>13800, 12393=>13801, 63263=>13801, 12394=>13802, 63264=>13802, 12395=>13803, 63265=>13803, 12396=>13804, 63266=>13804, 12397=>13805, 63267=>13805, 12398=>13806, 63268=>13806, 12399=>13807, 63269=>13807, 12400=>13808, 63270=>13808, 12401=>13809, 63271=>13809, 12402=>13810, 63272=>13810, 12403=>13811, 63273=>13811, 12404=>13812, 63274=>13812, 12405=>13813, 63275=>13813, 12406=>13814, 63276=>13814, 12407=>13815, 63277=>13815, 12408=>13816, 63278=>13816, 12409=>13817, 63279=>13817, 12410=>13818, 63280=>13818, 12411=>13819, 63281=>13819, 12412=>13820, 63282=>13820, 12413=>13821, 63283=>13821, 12414=>13822, 63284=>13822, 12415=>13823, 63285=>13823, 12416=>13824, 63286=>13824, 12417=>13825, 63287=>13825, 12418=>13826, 63288=>13826, 12419=>13827, 63289=>13827, 12420=>13828, 63290=>13828, 12421=>13829, 63291=>13829, 12422=>13830, 63292=>13830, 12423=>13831, 63293=>13831, 12424=>13832, 63294=>13832, 12425=>13833, 63295=>13833, 12426=>13834, 63296=>13834, 12427=>13835, 63297=>13835, 12428=>13836, 63298=>13836, 12429=>13837, 63299=>13837, 12430=>13838, 63300=>13838, 12431=>13839, 63301=>13839, 12432=>13840, 63302=>13840, 12433=>13841, 63303=>13841, 12434=>13842, 63304=>13842, 12435=>13843, 63305=>13843, 12449=>13844, 63306=>13844, 12450=>13845, 63307=>13845, 12451=>13846, 63308=>13846, 12452=>13847, 63309=>13847, 12453=>13848, 63310=>13848, 12454=>13849, 63311=>13849, 12455=>13850, 63312=>13850, 12456=>13851, 63313=>13851, 12457=>13852, 63314=>13852, 12458=>13853, 63315=>13853, 12459=>13854, 63316=>13854, 12460=>13855, 63317=>13855, 12461=>13856, 63318=>13856, 12462=>13857, 63319=>13857, 12463=>13858, 63320=>13858, 12464=>13859, 63321=>13859, 12465=>13860, 63322=>13860, 12466=>13861, 63323=>13861, 12467=>13862, 63324=>13862, 12468=>13863, 63325=>13863, 12469=>13864, 63326=>13864, 12470=>13865, 63327=>13865, 12471=>13866, 63328=>13866, 12472=>13867, 63329=>13867, 12473=>13868, 63330=>13868, 12474=>13869, 63331=>13869, 12475=>13870, 63332=>13870, 12476=>13871, 63333=>13871, 12477=>13872, 63334=>13872, 12478=>13873, 63335=>13873, 12479=>13874, 63336=>13874, 12480=>13875, 63337=>13875, 12481=>13876, 63338=>13876, 12482=>13877, 63339=>13877, 12483=>13878, 63340=>13878, 12484=>13879, 63341=>13879, 12485=>13880, 63342=>13880, 12486=>13881, 63343=>13881, 12487=>13882, 63344=>13882, 12488=>13883, 63345=>13883, 12489=>13884, 63346=>13884, 12490=>13885, 63347=>13885, 12491=>13886, 63348=>13886, 12492=>13887, 63349=>13887, 12493=>13888, 63350=>13888, 12494=>13889, 63351=>13889, 12495=>13890, 63352=>13890, 12496=>13891, 63353=>13891, 12497=>13892, 63354=>13892, 12498=>13893, 63355=>13893, 12499=>13894, 63356=>13894, 12500=>13895, 63357=>13895, 12501=>13896, 63358=>13896, 12502=>13897, 63359=>13897, 12503=>13898, 63360=>13898, 12504=>13899, 63361=>13899, 12505=>13900, 63362=>13900, 12506=>13901, 63363=>13901, 12507=>13902, 63364=>13902, 12508=>13903, 63365=>13903, 12509=>13904, 63366=>13904, 12510=>13905, 63367=>13905, 12511=>13906, 63368=>13906, 12512=>13907, 63369=>13907, 12513=>13908, 63370=>13908, 12514=>13909, 63371=>13909, 12515=>13910, 63372=>13910, 12516=>13911, 63373=>13911, 12517=>13912, 63374=>13912, 12518=>13913, 63375=>13913, 12519=>13914, 63376=>13914, 12520=>13915, 63377=>13915, 12521=>13916, 63378=>13916, 12522=>13917, 63379=>13917, 12523=>13918, 63380=>13918, 12524=>13919, 63381=>13919, 12525=>13920, 63382=>13920, 12526=>13921, 63383=>13921, 12527=>13922, 63384=>13922, 12528=>13923, 63385=>13923, 12529=>13924, 63386=>13924, 12530=>13925, 63387=>13925, 12531=>13926, 63388=>13926, 12532=>13927, 63389=>13927, 12533=>13928, 63390=>13928, 12534=>13929, 63391=>13929, 1040=>13930, 63392=>13930, 1041=>13931, 63393=>13931, 1042=>13932, 63394=>13932, 1043=>13933, 63395=>13933, 1044=>13934, 63396=>13934, 1045=>13935, 63397=>13935, 1025=>13936, 63398=>13936, 1046=>13937, 63399=>13937, 1047=>13938, 63400=>13938, 1048=>13939, 63401=>13939, 1049=>13940, 63402=>13940, 1050=>13941, 63403=>13941, 1051=>13942, 63404=>13942, 1052=>13943, 63405=>13943, 1053=>13944, 63406=>13944, 1054=>13945, 63407=>13945, 1055=>13946, 63408=>13946, 1056=>13947, 63409=>13947, 1057=>13948, 63410=>13948, 1058=>13949, 63411=>13949, 1059=>13950, 63412=>13950, 1060=>13951, 63413=>13951, 1061=>13952, 63414=>13952, 1062=>13953, 63415=>13953, 1063=>13954, 63416=>13954, 1064=>13955, 63417=>13955, 1065=>13956, 63418=>13956, 1066=>13957, 63419=>13957, 1067=>13958, 63420=>13958, 1068=>13959, 63421=>13959, 1069=>13960, 63422=>13960, 1070=>13961, 63423=>13961, 1071=>13962, 63424=>13962, 1072=>13963, 63425=>13963, 1073=>13964, 63426=>13964, 1074=>13965, 63427=>13965, 1075=>13966, 63428=>13966, 1076=>13967, 63429=>13967, 1077=>13968, 63430=>13968, 1105=>13969, 63431=>13969, 1078=>13970, 63432=>13970, 1079=>13971, 63433=>13971, 1080=>13972, 63434=>13972, 1081=>13973, 63435=>13973, 1082=>13974, 63436=>13974, 1083=>13975, 63437=>13975, 1084=>13976, 63438=>13976, 1085=>13977, 63439=>13977, 1086=>13978, 63440=>13978, 1087=>13979, 63441=>13979, 1088=>13980, 63442=>13980, 1089=>13981, 63443=>13981, 1090=>13982, 63444=>13982, 1091=>13983, 63445=>13983, 1092=>13984, 63446=>13984, 1093=>13985, 63447=>13985, 1094=>13986, 63448=>13986, 1095=>13987, 63449=>13987, 1096=>13988, 63450=>13988, 1097=>13989, 63451=>13989, 1098=>13990, 63452=>13990, 1099=>13991, 63453=>13991, 1100=>13992, 63454=>13992, 1101=>13993, 63455=>13993, 1102=>13994, 63456=>13994, 1103=>13995, 63457=>13995, 8679=>13996, 63458=>13996, 8632=>13997, 63459=>13997, 8633=>13998, 63460=>13998, 12751=>13999, 20033=>13999, 63461=>13999, 131276=>14000, 63462=>14000, 20058=>14001, 63463=>14001, 131210=>14002, 63464=>14002, 20994=>14003, 63465=>14003, 17553=>14004, 63466=>14004, 40880=>14005, 63467=>14005, 20872=>14006, 63468=>14006, 13853=>14007, 40881=>14007, 63469=>14007, 161287=>14008, 63470=>14008, 172=>14049, 65506=>14049, 63511=>14049, 65508=>14050, 63512=>14050, 65287=>14051, 63513=>14051, 65282=>14052, 63514=>14052, 12849=>14053, 63515=>14053, 8470=>14054, 63516=>14054, 8481=>14055, 63517=>14055, 30849=>14056, 37561=>14057, 58501=>14057, 35023=>14058, 22715=>14059, 24658=>14060, 31911=>14061, 23290=>14062, 9556=>14063, 9574=>14064, 9559=>14065, 9568=>14066, 9580=>14067, 9571=>14068, 9562=>14069, 9577=>14070, 9565=>14071, 9554=>14072, 9572=>14073, 9557=>14074, 9560=>14078, 9575=>14079, 9563=>14080, 9555=>14081, 9573=>14082, 9558=>14083, 9567=>14084, 9579=>14085, 9570=>14086, 9561=>14087, 9576=>14088, 9564=>14089, 9553=>14090, 9619=>14096, 65517=>14096, 65040=>14099, 65041=>14100, 65042=>14101, 65044=>14103, 65043=>14104, 65046=>14105, 65045=>14106, 147159=>14123, 58129=>14123, 22462=>14124, 58130=>14124, 159443=>14125, 58131=>14125, 28990=>14126, 58132=>14126, 153568=>14127, 58133=>14127, 27042=>14128, 58135=>14128, 166889=>14129, 58136=>14129, 23412=>14130, 58137=>14130, 31305=>14131, 58138=>14131, 153825=>14132, 58139=>14132, 169177=>14133, 58140=>14133, 31333=>14134, 58141=>14134, 31357=>14135, 58142=>14135, 154028=>14136, 58143=>14136, 31419=>14137, 58144=>14137, 31408=>14138, 58145=>14138, 31426=>14139, 58146=>14139, 31427=>14140, 58147=>14140, 29137=>14141, 58148=>14141, 156813=>14142, 58149=>14142, 16842=>14143, 58150=>14143, 31450=>14144, 58151=>14144, 31453=>14145, 58152=>14145, 31466=>14146, 58153=>14146, 16879=>14147, 58154=>14147, 21682=>14148, 58155=>14148, 154625=>14149, 58156=>14149, 31499=>14150, 58157=>14150, 31573=>14151, 58158=>14151, 31529=>14152, 58159=>14152, 152334=>14153, 58160=>14153, 154878=>14154, 58161=>14154, 31650=>14155, 58162=>14155, 31599=>14156, 58163=>14156, 33692=>14157, 58164=>14157, 154548=>14158, 58165=>14158, 158847=>14159, 58166=>14159, 31696=>14160, 58167=>14160, 33825=>14161, 58168=>14161, 31634=>14162, 58169=>14162, 58171=>14164, 154912=>14164, 33938=>14166, 58174=>14166, 31738=>14167, 58175=>14167, 31797=>14169, 58177=>14169, 154817=>14170, 58178=>14170, 31812=>14171, 58179=>14171, 31875=>14172, 58180=>14172, 149634=>14173, 58181=>14173, 31910=>14174, 58182=>14174, 148856=>14175, 58184=>14175, 31945=>14176, 58185=>14176, 31943=>14177, 58186=>14177, 31974=>14178, 58187=>14178, 31987=>14180, 58189=>14180, 31989=>14181, 58190=>14181, 32359=>14182, 58192=>14182, 17693=>14183, 58193=>14183, 159300=>14184, 58194=>14184, 32093=>14185, 58195=>14185, 159446=>14186, 58196=>14186, 32137=>14187, 58198=>14187, 32171=>14188, 58199=>14188, 28981=>14189, 58200=>14189, 32179=>14190, 58201=>14190, 32214=>14191, 147543=>14192, 58203=>14192, 155689=>14193, 58204=>14193, 32228=>14194, 58205=>14194, 15635=>14195, 58206=>14195, 32245=>14196, 58207=>14196, 137209=>14197, 58208=>14197, 32229=>14198, 58209=>14198, 164717=>14199, 58210=>14199, 155937=>14201, 58212=>14201, 155994=>14202, 58213=>14202, 32366=>14203, 58214=>14203, 17195=>14205, 58216=>14205, 37996=>14206, 58217=>14206, 32295=>14207, 58218=>14207, 32576=>14208, 58219=>14208, 32577=>14209, 58220=>14209, 32583=>14210, 58221=>14210, 31030=>14211, 58222=>14211, 156368=>14212, 58223=>14212, 39393=>14213, 58224=>14213, 32663=>14214, 58225=>14214, 156497=>14215, 58226=>14215, 32675=>14216, 58227=>14216, 136801=>14217, 58228=>14217, 131176=>14218, 58229=>14218, 17756=>14219, 58230=>14219, 145254=>14220, 58231=>14220, 164666=>14221, 58233=>14221, 32762=>14222, 58234=>14222, 156809=>14223, 58235=>14223, 64091=>14224, 32776=>14225, 58237=>14225, 32797=>14226, 58238=>14226, 32815=>14228, 58240=>14228, 172167=>14229, 58241=>14229, 158915=>14230, 58242=>14230, 32827=>14231, 58243=>14231, 32828=>14232, 58244=>14232, 32865=>14233, 58245=>14233, 141076=>14234, 58246=>14234, 18825=>14235, 58247=>14235, 157222=>14236, 58248=>14236, 146915=>14237, 58249=>14237, 157416=>14238, 58250=>14238, 26405=>14239, 58251=>14239, 32935=>14240, 58252=>14240, 166472=>14241, 58253=>14241, 33031=>14242, 58254=>14242, 33050=>14243, 58255=>14243, 22704=>14244, 58256=>14244, 141046=>14245, 58257=>14245, 27775=>14246, 58258=>14246, 156824=>14247, 58259=>14247, 25831=>14248, 58261=>14248, 136330=>14249, 58262=>14249, 33304=>14250, 58263=>14250, 137310=>14251, 58264=>14251, 27219=>14252, 58265=>14252, 150117=>14253, 58266=>14253, 150165=>14254, 58267=>14254, 17530=>14255, 58268=>14255, 33321=>14256, 58269=>14256, 158290=>14257, 58271=>14257, 146814=>14258, 58272=>14258, 20473=>14259, 58273=>14259, 136445=>14260, 58274=>14260, 34018=>14261, 58275=>14261, 33634=>14262, 58276=>14262, 194959=>14263, 149927=>14264, 58278=>14264, 144688=>14265, 58279=>14265, 137075=>14266, 58280=>14266, 146936=>14267, 58281=>14267, 33450=>14268, 58282=>14268, 26907=>14269, 58283=>14269, 194964=>14270, 58284=>14270, 16859=>14271, 58285=>14271, 34123=>14272, 58286=>14272, 33488=>14273, 58287=>14273, 33562=>14274, 58288=>14274, 134678=>14275, 58289=>14275, 137140=>14276, 58290=>14276, 14017=>14277, 58291=>14277, 143741=>14278, 58292=>14278, 144730=>14279, 58293=>14279, 33403=>14280, 58294=>14280, 33506=>14281, 58295=>14281, 33560=>14282, 58296=>14282, 147083=>14283, 58297=>14283, 159139=>14284, 58298=>14284, 158469=>14285, 58299=>14285, 158615=>14286, 58300=>14286, 144846=>14287, 58301=>14287, 15807=>14288, 58302=>14288, 33565=>14289, 58303=>14289, 21996=>14290, 58304=>14290, 33669=>14291, 58305=>14291, 17675=>14292, 58306=>14292, 159141=>14293, 58307=>14293, 33708=>14294, 58308=>14294, 33747=>14296, 58310=>14296, 159444=>14297, 58312=>14297, 27223=>14298, 58313=>14298, 34138=>14299, 58314=>14299, 13462=>14300, 58315=>14300, 159298=>14301, 58316=>14301, 33880=>14302, 58318=>14302, 154596=>14303, 58319=>14303, 33905=>14304, 58320=>14304, 15827=>14305, 58321=>14305, 17636=>14306, 58322=>14306, 27303=>14307, 58323=>14307, 33866=>14308, 58324=>14308, 31064=>14309, 58326=>14309, 158614=>14311, 58328=>14311, 159351=>14312, 58329=>14312, 159299=>14313, 58330=>14313, 34014=>14314, 58331=>14314, 33681=>14316, 58333=>14316, 17568=>14317, 58334=>14317, 33939=>14318, 58335=>14318, 34020=>14319, 58336=>14319, 154769=>14320, 58337=>14320, 16960=>14321, 58338=>14321, 154816=>14322, 58339=>14322, 17731=>14323, 58340=>14323, 34100=>14324, 58341=>14324, 23282=>14325, 58342=>14325, 17699=>14326, 17703=>14327, 58344=>14327, 34163=>14328, 58345=>14328, 17686=>14329, 58346=>14329, 26559=>14330, 58347=>14330, 34326=>14331, 58348=>14331, 165413=>14332, 58349=>14332, 165435=>14333, 58350=>14333, 34241=>14334, 58351=>14334, 159880=>14335, 58352=>14335, 34306=>14336, 58353=>14336, 136578=>14337, 58354=>14337, 159949=>14338, 58355=>14338, 194994=>14339, 58356=>14339, 17770=>14340, 58357=>14340, 34344=>14341, 58358=>14341, 13896=>14342, 58359=>14342, 137378=>14343, 58360=>14343, 21495=>14344, 58361=>14344, 160666=>14345, 58362=>14345, 34430=>14346, 58363=>14346, 172280=>14348, 58365=>14348, 34798=>14349, 58366=>14349, 142375=>14350, 58367=>14350, 34737=>14351, 58368=>14351, 34778=>14352, 58369=>14352, 34831=>14353, 60990=>14353, 58370=>14353, 22113=>14354, 58371=>14354, 34412=>14355, 58372=>14355, 26710=>14356, 58373=>14356, 17935=>14357, 58374=>14357, 34885=>14358, 58375=>14358, 34886=>14359, 58376=>14359, 161248=>14360, 58377=>14360, 146873=>14361, 58378=>14361, 161252=>14362, 58379=>14362, 34910=>14363, 58380=>14363, 34972=>14364, 58381=>14364, 18011=>14365, 58382=>14365, 34996=>14366, 58383=>14366, 34997=>14367, 58384=>14367, 35013=>14368, 58386=>14368, 161551=>14369, 58388=>14369, 35207=>14370, 58389=>14370, 35239=>14374, 58393=>14374, 35260=>14375, 58394=>14375, 166437=>14376, 58395=>14376, 35303=>14377, 58396=>14377, 162084=>14378, 58397=>14378, 162493=>14379, 58398=>14379, 35484=>14380, 58399=>14380, 30611=>14381, 58400=>14381, 37374=>14382, 58401=>14382, 35472=>14383, 58402=>14383, 162393=>14384, 58403=>14384, 31465=>14385, 58404=>14385, 162618=>14386, 58405=>14386, 18195=>14387, 58407=>14387, 162616=>14388, 58408=>14388, 29052=>14389, 58409=>14389, 35596=>14390, 58410=>14390, 35615=>14391, 58411=>14391, 152624=>14392, 58412=>14392, 152933=>14393, 58413=>14393, 35647=>14394, 58414=>14394, 35661=>14396, 58416=>14396, 35497=>14397, 58417=>14397, 150138=>14398, 58418=>14398, 35728=>14399, 58419=>14399, 35739=>14400, 58420=>14400, 35503=>14401, 58421=>14401, 136927=>14402, 58422=>14402, 17941=>14403, 58423=>14403, 34895=>14404, 58424=>14404, 35995=>14405, 58425=>14405, 163156=>14406, 58426=>14406, 163215=>14407, 58427=>14407, 195028=>14408, 58428=>14408, 14117=>14409, 58429=>14409, 163155=>14410, 58430=>14410, 36054=>14411, 58431=>14411, 163224=>14412, 58432=>14412, 163261=>14413, 58433=>14413, 36114=>14414, 58434=>14414, 36099=>14415, 58435=>14415, 137488=>14416, 58436=>14416, 36059=>14417, 58437=>14417, 28764=>14418, 58438=>14418, 36113=>14419, 58439=>14419, 16080=>14420, 58441=>14420, 195031=>14421, 36265=>14422, 58443=>14422, 163842=>14423, 58444=>14423, 135188=>14424, 58445=>14424, 149898=>14425, 58446=>14425, 15228=>14426, 58447=>14426, 164284=>14427, 58448=>14427, 160012=>14428, 58449=>14428, 31463=>14429, 58450=>14429, 36525=>14430, 58451=>14430, 36534=>14431, 58452=>14431, 36547=>14432, 58453=>14432, 37588=>14433, 58454=>14433, 36633=>14434, 58455=>14434, 36653=>14435, 58456=>14435, 164709=>14436, 58457=>14436, 164882=>14437, 58458=>14437, 36773=>14438, 58459=>14438, 37635=>14439, 58460=>14439, 172703=>14440, 58461=>14440, 133712=>14441, 58462=>14441, 36787=>14442, 58463=>14442, 166366=>14444, 58465=>14444, 165181=>14445, 58466=>14445, 146875=>14446, 58467=>14446, 24312=>14447, 58468=>14447, 143970=>14448, 58469=>14448, 36857=>14449, 58470=>14449, 140069=>14451, 58474=>14451, 14720=>14452, 58475=>14452, 159447=>14453, 58476=>14453, 36919=>14454, 58477=>14454, 165180=>14455, 58478=>14455, 162494=>14456, 58479=>14456, 36961=>14457, 58480=>14457, 165228=>14458, 58481=>14458, 165387=>14459, 58482=>14459, 37032=>14460, 58483=>14460, 165651=>14461, 58484=>14461, 37060=>14462, 58485=>14462, 165606=>14463, 58486=>14463, 37038=>14464, 58487=>14464, 64038=>14465, 37223=>14466, 58489=>14466, 37289=>14467, 58491=>14467, 37316=>14468, 58492=>14468, 31916=>14469, 58493=>14469, 166195=>14470, 58494=>14470, 138889=>14471, 58495=>14471, 37390=>14472, 58496=>14472, 27807=>14473, 58497=>14473, 37441=>14474, 58498=>14474, 37474=>14475, 58499=>14475, 153017=>14476, 58500=>14476, 166598=>14477, 58502=>14477, 146587=>14478, 58503=>14478, 166668=>14479, 58504=>14479, 153051=>14480, 58505=>14480, 134449=>14481, 58506=>14481, 37676=>14482, 58507=>14482, 37739=>14483, 58508=>14483, 166625=>14484, 58509=>14484, 166891=>14485, 58510=>14485, 23235=>14486, 58512=>14486, 166626=>14487, 58513=>14487, 166629=>14488, 58514=>14488, 18789=>14489, 58515=>14489, 37444=>14490, 58516=>14490, 166892=>14491, 58517=>14491, 166969=>14492, 58518=>14492, 166911=>14493, 58519=>14493, 37747=>14494, 58520=>14494, 37979=>14495, 58521=>14495, 36540=>14496, 58522=>14496, 38277=>14497, 58523=>14497, 38310=>14498, 58524=>14498, 37926=>14499, 58525=>14499, 38304=>14500, 58526=>14500, 28662=>14501, 58527=>14501, 17081=>14502, 58528=>14502, 165592=>14503, 58530=>14503, 135804=>14504, 58531=>14504, 146990=>14505, 58532=>14505, 18911=>14506, 58533=>14506, 27676=>14507, 58534=>14507, 38523=>14508, 58535=>14508, 38550=>14509, 58536=>14509, 16748=>14510, 58537=>14510, 38563=>14511, 58538=>14511, 159445=>14512, 58539=>14512, 25050=>14513, 58540=>14513, 58541=>14514, 30965=>14515, 58542=>14515, 166624=>14516, 58543=>14516, 38589=>14517, 58544=>14517, 21452=>14518, 58545=>14518, 18849=>14519, 58546=>14519, 158904=>14520, 58547=>14520, 131700=>14521, 58548=>14521, 156688=>14522, 58549=>14522, 168111=>14523, 58550=>14523, 168165=>14524, 58551=>14524, 150225=>14525, 58552=>14525, 137493=>14526, 58553=>14526, 144138=>14527, 58554=>14527, 38705=>14528, 58555=>14528, 34370=>14529, 58556=>14529, 38710=>14530, 58557=>14530, 18959=>14531, 58558=>14531, 17725=>14532, 58559=>14532, 17797=>14533, 58560=>14533, 150249=>14534, 58561=>14534, 28789=>14535, 58562=>14535, 23361=>14536, 58563=>14536, 38683=>14537, 58564=>14537, 168405=>14539, 58566=>14539, 38743=>14540, 58567=>14540, 23370=>14541, 58568=>14541, 168427=>14542, 58569=>14542, 38751=>14543, 58570=>14543, 37925=>14544, 58571=>14544, 20688=>14545, 58572=>14545, 143543=>14546, 58573=>14546, 143548=>14547, 58574=>14547, 38793=>14548, 58575=>14548, 38815=>14549, 58576=>14549, 38833=>14550, 58577=>14550, 38846=>14551, 58578=>14551, 38848=>14552, 58579=>14552, 38866=>14553, 58580=>14553, 38880=>14554, 58581=>14554, 152684=>14555, 58582=>14555, 38894=>14556, 58583=>14556, 29724=>14557, 58584=>14557, 169011=>14558, 58585=>14558, 38901=>14560, 58587=>14560, 168989=>14561, 58588=>14561, 162170=>14562, 58589=>14562, 19153=>14563, 58590=>14563, 38964=>14564, 58591=>14564, 38963=>14565, 58592=>14565, 38987=>14566, 58593=>14566, 39014=>14567, 58594=>14567, 15118=>14568, 58595=>14568, 160117=>14569, 58596=>14569, 15697=>14570, 58597=>14570, 132656=>14571, 58598=>14571, 147804=>14572, 58599=>14572, 153350=>14573, 58600=>14573, 39114=>14574, 58601=>14574, 39095=>14575, 58602=>14575, 39112=>14576, 58603=>14576, 39111=>14577, 58604=>14577, 19199=>14578, 58605=>14578, 159015=>14579, 58606=>14579, 136915=>14580, 58607=>14580, 21936=>14581, 58608=>14581, 39137=>14582, 58609=>14582, 39142=>14583, 58610=>14583, 39148=>14584, 58611=>14584, 37752=>14585, 58612=>14585, 39225=>14586, 58613=>14586, 150057=>14587, 58614=>14587, 19314=>14588, 58615=>14588, 170071=>14589, 58616=>14589, 170245=>14590, 58617=>14590, 39413=>14591, 58618=>14591, 39436=>14592, 58619=>14592, 39483=>14593, 58620=>14593, 39440=>14594, 58621=>14594, 39512=>14595, 58622=>14595, 153381=>14596, 58623=>14596, 14020=>14597, 58624=>14597, 168113=>14598, 58625=>14598, 170965=>14599, 58626=>14599, 39648=>14600, 58627=>14600, 39650=>14601, 58628=>14601, 170757=>14602, 58629=>14602, 39668=>14603, 58630=>14603, 19470=>14604, 58631=>14604, 39700=>14605, 58632=>14605, 39725=>14606, 58633=>14606, 165376=>14607, 58634=>14607, 20532=>14608, 58635=>14608, 39732=>14609, 58636=>14609, 14531=>14610, 58638=>14610, 143485=>14611, 58639=>14611, 39760=>14612, 58640=>14612, 39744=>14613, 58641=>14613, 171326=>14614, 58642=>14614, 23109=>14615, 58643=>14615, 137315=>14616, 58644=>14616, 39822=>14617, 58645=>14617, 39938=>14618, 58647=>14618, 39935=>14619, 58648=>14619, 39948=>14620, 58649=>14620, 171624=>14621, 58650=>14621, 40404=>14622, 58651=>14622, 171959=>14623, 58652=>14623, 172434=>14624, 58653=>14624, 172459=>14625, 58654=>14625, 172257=>14626, 58655=>14626, 172323=>14627, 58656=>14627, 172511=>14628, 58657=>14628, 40318=>14629, 58658=>14629, 40323=>14630, 58659=>14630, 172340=>14631, 58660=>14631, 40462=>14632, 58661=>14632, 40388=>14633, 58663=>14633, 172435=>14634, 58665=>14634, 172576=>14635, 58666=>14635, 137531=>14636, 58667=>14636, 172595=>14637, 58668=>14637, 40249=>14638, 58669=>14638, 172217=>14639, 58670=>14639, 172724=>14640, 58671=>14640, 40592=>14641, 58672=>14641, 40597=>14642, 58673=>14642, 40606=>14643, 58674=>14643, 40610=>14644, 58675=>14644, 19764=>14645, 58676=>14645, 40618=>14646, 58677=>14646, 40623=>14647, 58678=>14647, 148324=>14648, 58679=>14648, 40641=>14649, 58680=>14649, 15200=>14650, 58681=>14650, 14821=>14651, 58682=>14651, 15645=>14652, 58683=>14652, 20274=>14653, 58684=>14653, 14270=>14654, 58685=>14654, 166955=>14655, 58686=>14655, 40706=>14656, 58687=>14656, 40712=>14657, 58688=>14657, 19350=>14658, 58689=>14658, 37924=>14659, 58690=>14659, 159138=>14660, 58691=>14660, 40727=>14661, 60836=>14661, 58692=>14661, 195099=>14662, 40761=>14663, 58694=>14663, 22175=>14664, 58695=>14664, 22154=>14665, 58696=>14665, 40773=>14666, 58697=>14666, 39352=>14667, 58698=>14667, 168075=>14668, 58699=>14668, 38898=>14669, 58700=>14669, 33919=>14670, 58701=>14670, 40809=>14672, 58703=>14672, 31452=>14673, 58704=>14673, 40846=>14674, 58705=>14674, 29206=>14675, 58706=>14675, 19390=>14676, 58707=>14676, 149877=>14677, 58708=>14677, 149947=>14678, 58709=>14678, 29047=>14679, 58710=>14679, 150008=>14680, 58711=>14680, 148296=>14681, 58712=>14681, 150097=>14682, 58713=>14682, 29598=>14683, 58714=>14683, 166874=>14684, 58715=>14684, 137466=>14685, 58716=>14685, 31135=>14686, 58717=>14686, 166270=>14687, 58718=>14687, 167478=>14688, 58719=>14688, 37737=>14689, 58720=>14689, 37875=>14690, 58721=>14690, 166468=>14691, 58722=>14691, 37612=>14692, 58723=>14692, 37761=>14693, 58724=>14693, 37835=>14694, 58725=>14694, 166252=>14695, 58726=>14695, 148665=>14696, 58727=>14696, 29207=>14697, 58728=>14697, 16107=>14698, 58729=>14698, 30578=>14699, 58730=>14699, 31299=>14700, 58731=>14700, 28880=>14701, 58732=>14701, 148595=>14702, 58733=>14702, 148472=>14703, 58734=>14703, 29054=>14704, 58735=>14704, 137199=>14705, 58736=>14705, 28835=>14706, 58737=>14706, 137406=>14707, 58738=>14707, 144793=>14708, 58739=>14708, 16071=>14709, 58740=>14709, 137349=>14710, 58741=>14710, 152623=>14711, 58742=>14711, 137208=>14712, 58743=>14712, 14114=>14713, 58744=>14713, 136955=>14714, 58745=>14714, 137273=>14715, 58746=>14715, 14049=>14716, 58747=>14716, 137076=>14717, 58748=>14717, 137425=>14718, 58749=>14718, 155467=>14719, 58750=>14719, 14115=>14720, 58751=>14720, 136896=>14721, 58752=>14721, 22363=>14722, 58753=>14722, 150053=>14723, 58754=>14723, 136190=>14724, 58755=>14724, 135848=>14725, 58756=>14725, 136134=>14726, 58757=>14726, 136374=>14727, 58758=>14727, 34051=>14728, 58761=>14728, 58759=>14728, 145062=>14729, 58760=>14729, 33877=>14731, 58762=>14731, 149908=>14732, 58763=>14732, 160101=>14733, 58764=>14733, 146993=>14734, 58765=>14734, 152924=>14735, 58766=>14735, 147195=>14736, 58767=>14736, 159826=>14737, 58768=>14737, 17652=>14738, 58769=>14738, 145134=>14739, 58770=>14739, 170397=>14740, 58771=>14740, 159526=>14741, 58772=>14741, 26617=>14742, 58773=>14742, 14131=>14743, 58774=>14743, 15381=>14744, 58775=>14744, 15847=>14745, 58776=>14745, 22636=>14746, 58777=>14746, 137506=>14747, 58778=>14747, 26640=>14748, 58779=>14748, 16471=>14749, 58780=>14749, 145215=>14750, 58781=>14750, 147681=>14751, 58782=>14751, 147595=>14752, 58783=>14752, 147727=>14753, 58784=>14753, 158753=>14754, 58785=>14754, 21707=>14755, 58786=>14755, 22174=>14756, 58787=>14756, 157361=>14757, 58788=>14757, 22162=>14758, 58789=>14758, 135135=>14759, 58790=>14759, 134056=>14760, 58791=>14760, 134669=>14761, 58792=>14761, 166675=>14763, 58794=>14763, 37788=>14764, 58795=>14764, 20216=>14765, 58796=>14765, 20779=>14766, 58797=>14766, 14361=>14767, 58798=>14767, 148534=>14768, 58799=>14768, 20156=>14769, 58800=>14769, 132197=>14770, 58801=>14770, 20299=>14772, 58803=>14772, 20362=>14773, 58804=>14773, 153169=>14774, 58805=>14774, 23144=>14775, 58806=>14775, 131499=>14776, 58807=>14776, 132043=>14777, 58808=>14777, 14745=>14778, 58809=>14778, 131850=>14779, 58810=>14779, 132116=>14780, 58811=>14780, 13365=>14781, 58812=>14781, 20265=>14782, 58813=>14782, 131776=>14783, 58814=>14783, 167603=>14784, 58815=>14784, 131701=>14785, 58816=>14785, 35546=>14786, 58817=>14786, 131596=>14787, 58818=>14787, 20120=>14788, 58819=>14788, 20685=>14789, 58820=>14789, 20749=>14790, 58821=>14790, 20386=>14791, 58822=>14791, 20227=>14792, 58823=>14792, 150030=>14793, 58824=>14793, 147082=>14794, 58825=>14794, 20290=>14795, 58826=>14795, 20526=>14796, 58827=>14796, 20588=>14797, 58828=>14797, 20609=>14798, 58829=>14798, 20428=>14799, 58830=>14799, 20453=>14800, 58831=>14800, 20568=>14801, 58832=>14801, 20732=>14802, 58833=>14802, 28278=>14803, 58838=>14803, 144789=>14804, 58839=>14804, 147001=>14805, 58840=>14805, 147135=>14806, 58841=>14806, 28018=>14807, 58842=>14807, 137348=>14808, 58843=>14808, 147081=>14809, 58844=>14809, 20904=>14810, 58845=>14810, 20931=>14811, 58846=>14811, 132576=>14812, 58847=>14812, 17629=>14813, 58848=>14813, 132259=>14814, 58849=>14814, 132242=>14815, 58850=>14815, 132241=>14816, 58851=>14816, 36218=>14817, 58852=>14817, 166556=>14818, 58853=>14818, 132878=>14819, 58854=>14819, 21081=>14820, 58855=>14820, 21156=>14821, 58856=>14821, 133235=>14822, 58857=>14822, 21217=>14823, 58858=>14823, 18042=>14825, 58860=>14825, 29068=>14826, 58861=>14826, 148364=>14827, 58862=>14827, 134176=>14828, 58863=>14828, 149932=>14829, 58864=>14829, 135396=>14830, 58865=>14830, 27089=>14831, 58866=>14831, 134685=>14832, 58867=>14832, 16094=>14834, 58869=>14834, 29849=>14835, 58870=>14835, 29716=>14836, 58871=>14836, 29782=>14837, 58872=>14837, 29592=>14838, 58873=>14838, 19342=>14839, 58874=>14839, 150204=>14840, 58875=>14840, 147597=>14841, 58876=>14841, 21456=>14842, 58877=>14842, 13700=>14843, 58878=>14843, 29199=>14844, 58879=>14844, 147657=>14845, 58880=>14845, 21940=>14846, 58881=>14846, 131909=>14847, 58882=>14847, 21709=>14848, 58883=>14848, 134086=>14849, 58884=>14849, 22301=>14850, 58885=>14850, 37469=>14851, 58886=>14851, 38644=>14852, 58887=>14852, 22493=>14853, 58889=>14853, 22413=>14854, 58890=>14854, 22399=>14855, 58891=>14855, 13886=>14856, 58892=>14856, 22731=>14857, 58893=>14857, 23193=>14858, 58894=>14858, 166470=>14859, 58895=>14859, 136954=>14860, 58896=>14860, 137071=>14861, 58897=>14861, 136976=>14862, 58898=>14862, 23084=>14863, 58899=>14863, 22968=>14864, 58900=>14864, 23166=>14865, 58902=>14865, 23247=>14866, 58903=>14866, 23058=>14867, 58904=>14867, 153926=>14868, 58905=>14868, 137715=>14869, 58906=>14869, 137313=>14870, 58907=>14870, 148117=>14871, 58908=>14871, 14069=>14872, 58909=>14872, 27909=>14873, 58910=>14873, 29763=>14874, 58911=>14874, 23073=>14875, 58912=>14875, 155267=>14876, 58913=>14876, 23169=>14877, 58914=>14877, 166871=>14878, 58915=>14878, 132115=>14879, 58916=>14879, 37856=>14880, 58917=>14880, 29836=>14881, 58918=>14881, 135939=>14882, 58919=>14882, 28933=>14883, 58920=>14883, 18802=>14884, 58921=>14884, 37896=>14885, 58922=>14885, 166395=>14886, 58923=>14886, 37821=>14887, 58924=>14887, 14240=>14888, 58925=>14888, 23582=>14889, 58926=>14889, 23710=>14890, 58927=>14890, 24158=>14891, 58928=>14891, 24136=>14892, 58929=>14892, 137622=>14893, 58930=>14893, 137596=>14894, 58931=>14894, 146158=>14895, 58932=>14895, 24269=>14896, 58933=>14896, 23375=>14897, 58934=>14897, 58935=>14898, 137475=>14898, 58936=>14899, 137476=>14899, 14081=>14900, 58937=>14900, 137376=>14901, 58938=>14901, 14045=>14902, 58939=>14902, 136958=>14903, 58940=>14903, 14035=>14904, 58941=>14904, 33066=>14905, 58942=>14905, 166471=>14906, 58943=>14906, 138682=>14907, 58944=>14907, 144498=>14908, 58945=>14908, 166312=>14909, 58946=>14909, 24332=>14910, 60916=>14910, 58947=>14910, 24334=>14911, 58948=>14911, 137511=>14912, 58949=>14912, 137131=>14913, 58950=>14913, 23147=>14914, 58951=>14914, 137019=>14915, 58952=>14915, 23364=>14916, 58953=>14916, 161277=>14917, 58955=>14917, 34912=>14918, 58956=>14918, 24702=>14919, 58957=>14919, 141408=>14920, 58958=>14920, 140843=>14921, 58959=>14921, 24539=>14922, 58960=>14922, 16056=>14923, 58961=>14923, 140719=>14924, 58962=>14924, 140734=>14925, 58963=>14925, 168072=>14926, 58964=>14926, 159603=>14927, 58965=>14927, 25024=>14928, 58966=>14928, 131134=>14929, 58967=>14929, 131142=>14930, 58968=>14930, 140827=>14931, 58969=>14931, 24985=>14932, 58970=>14932, 24984=>14933, 58971=>14933, 24693=>14934, 58972=>14934, 142491=>14935, 58973=>14935, 142599=>14936, 58974=>14936, 149204=>14937, 58975=>14937, 168269=>14938, 58976=>14938, 25713=>14939, 58977=>14939, 149093=>14940, 58978=>14940, 142186=>14941, 58979=>14941, 14889=>14942, 58980=>14942, 142114=>14943, 58981=>14943, 144464=>14944, 58982=>14944, 170218=>14945, 58983=>14945, 142968=>14946, 58984=>14946, 25399=>14947, 58985=>14947, 25782=>14948, 58987=>14948, 25393=>14949, 58988=>14949, 25553=>14950, 58989=>14950, 149987=>14951, 58990=>14951, 142695=>14952, 58991=>14952, 25252=>14953, 58992=>14953, 142497=>14954, 58993=>14954, 25659=>14955, 58994=>14955, 25963=>14956, 58995=>14956, 26994=>14957, 58996=>14957, 15348=>14958, 58997=>14958, 143502=>14959, 58998=>14959, 144045=>14960, 58999=>14960, 149897=>14961, 59000=>14961, 144043=>14962, 59001=>14962, 21773=>14963, 59002=>14963, 144096=>14964, 59003=>14964, 137433=>14965, 59004=>14965, 169023=>14966, 59005=>14966, 26318=>14967, 59006=>14967, 144009=>14968, 59007=>14968, 143795=>14969, 59008=>14969, 15072=>14970, 59009=>14970, 152964=>14971, 59011=>14971, 166690=>14972, 59012=>14972, 152975=>14973, 59013=>14973, 136956=>14974, 59014=>14974, 152923=>14975, 59015=>14975, 152613=>14976, 59016=>14976, 30958=>14977, 59017=>14977, 143619=>14978, 59018=>14978, 137258=>14979, 59019=>14979, 143924=>14980, 59020=>14980, 13412=>14981, 59021=>14981, 143887=>14982, 59022=>14982, 143746=>14983, 59023=>14983, 148169=>14984, 59024=>14984, 26254=>14985, 59025=>14985, 159012=>14986, 59026=>14986, 26219=>14987, 59027=>14987, 19347=>14988, 59028=>14988, 26160=>14989, 59029=>14989, 161904=>14990, 59030=>14990, 138731=>14991, 59031=>14991, 26211=>14992, 59032=>14992, 144082=>14993, 59033=>14993, 144097=>14994, 59034=>14994, 26142=>14995, 59035=>14995, 153714=>14996, 59036=>14996, 14545=>14997, 59037=>14997, 145466=>14998, 59038=>14998, 145340=>14999, 59039=>14999, 15257=>15000, 59040=>15000, 145314=>15001, 59041=>15001, 144382=>15002, 59042=>15002, 29904=>15003, 59043=>15003, 15254=>15004, 59044=>15004, 149034=>15005, 59046=>15005, 26806=>15006, 59047=>15006, 15300=>15008, 59049=>15008, 27326=>15009, 59050=>15009, 145365=>15010, 59052=>15010, 148615=>15011, 59053=>15011, 27187=>15012, 59054=>15012, 27218=>15013, 59055=>15013, 27337=>15014, 59056=>15014, 27397=>15015, 59057=>15015, 137490=>15016, 59058=>15016, 25873=>15017, 59059=>15017, 26776=>15018, 59060=>15018, 27212=>15019, 59061=>15019, 15319=>15020, 59062=>15020, 27258=>15021, 59063=>15021, 27479=>15022, 59064=>15022, 147392=>15023, 59065=>15023, 146586=>15024, 59066=>15024, 37792=>15025, 59067=>15025, 37618=>15026, 59068=>15026, 166890=>15027, 59069=>15027, 166603=>15028, 59070=>15028, 37513=>15029, 59071=>15029, 163870=>15030, 59072=>15030, 166364=>15031, 59073=>15031, 37991=>15032, 59074=>15032, 28069=>15033, 59075=>15033, 28427=>15034, 59076=>15034, 147327=>15036, 59079=>15036, 15759=>15037, 59080=>15037, 28164=>15038, 59081=>15038, 147516=>15039, 59082=>15039, 23101=>15040, 59083=>15040, 28170=>15041, 59084=>15041, 22599=>15042, 59085=>15042, 27940=>15043, 59086=>15043, 30786=>15044, 59087=>15044, 28987=>15045, 59088=>15045, 148250=>15046, 59089=>15046, 148086=>15047, 59090=>15047, 28913=>15048, 59091=>15048, 29264=>15049, 61085=>15049, 59092=>15049, 29319=>15050, 59093=>15050, 29332=>15051, 59094=>15051, 149391=>15052, 59095=>15052, 149285=>15053, 59096=>15053, 20857=>15054, 59097=>15054, 150180=>15055, 59098=>15055, 132587=>15056, 59099=>15056, 29818=>15057, 59100=>15057, 147192=>15058, 59101=>15058, 144991=>15059, 59102=>15059, 150090=>15060, 59103=>15060, 149783=>15061, 59104=>15061, 155617=>15062, 59105=>15062, 16134=>15063, 59106=>15063, 16049=>15064, 59107=>15064, 150239=>15065, 59108=>15065, 166947=>15066, 59109=>15066, 147253=>15067, 59110=>15067, 24743=>15068, 59111=>15068, 16115=>15069, 59112=>15069, 29900=>15070, 59113=>15070, 29756=>15071, 59114=>15071, 37767=>15072, 59115=>15072, 29751=>15073, 59116=>15073, 17567=>15074, 59117=>15074, 159210=>15075, 59118=>15075, 17745=>15076, 59119=>15076, 30083=>15077, 59120=>15077, 16227=>15078, 59121=>15078, 150745=>15079, 59122=>15079, 150790=>15080, 59123=>15080, 16216=>15081, 59124=>15081, 30037=>15082, 59125=>15082, 30323=>15083, 59126=>15083, 173510=>15084, 59127=>15084, 29800=>15086, 61070=>15086, 59129=>15086, 166604=>15087, 59130=>15087, 149931=>15088, 59131=>15088, 149902=>15089, 59132=>15089, 15099=>15090, 59133=>15090, 15821=>15091, 59134=>15091, 150094=>15092, 59135=>15092, 16127=>15093, 59136=>15093, 149957=>15094, 59137=>15094, 149747=>15095, 59138=>15095, 37370=>15096, 59139=>15096, 22322=>15097, 59140=>15097, 37698=>15098, 59141=>15098, 166627=>15099, 59142=>15099, 137316=>15100, 59143=>15100, 20703=>15101, 59144=>15101, 152097=>15102, 59145=>15102, 152039=>15103, 59146=>15103, 30584=>15104, 59147=>15104, 143922=>15105, 59148=>15105, 30478=>15106, 59149=>15106, 30479=>15107, 59150=>15107, 30587=>15108, 59151=>15108, 149143=>15109, 59152=>15109, 145281=>15110, 59153=>15110, 14942=>15111, 59154=>15111, 149744=>15112, 59155=>15112, 29752=>15113, 59156=>15113, 29851=>15114, 59157=>15114, 16063=>15115, 59158=>15115, 150202=>15116, 59159=>15116, 150215=>15117, 59160=>15117, 16584=>15118, 59161=>15118, 150166=>15119, 59162=>15119, 156078=>15120, 59163=>15120, 37639=>15121, 59164=>15121, 152961=>15122, 59165=>15122, 30750=>15123, 59166=>15123, 30861=>15124, 59167=>15124, 30856=>15125, 59168=>15125, 30930=>15126, 59169=>15126, 29648=>15127, 59170=>15127, 31065=>15128, 59171=>15128, 161601=>15129, 59172=>15129, 153315=>15130, 59173=>15130, 16654=>15131, 59174=>15131, 31141=>15134, 59177=>15134, 27181=>15135, 59178=>15135, 147194=>15136, 59179=>15136, 31290=>15137, 59180=>15137, 31220=>15138, 59181=>15138, 16750=>15139, 59182=>15139, 136934=>15140, 59183=>15140, 16690=>15141, 59184=>15141, 37429=>15142, 59185=>15142, 31217=>15143, 59186=>15143, 134476=>15144, 59187=>15144, 149900=>15145, 59188=>15145, 131737=>15146, 59189=>15146, 146874=>15147, 59190=>15147, 137070=>15148, 59191=>15148, 13719=>15149, 59192=>15149, 21867=>15150, 59193=>15150, 13680=>15151, 59194=>15151, 13994=>15152, 59195=>15152, 131540=>15153, 59196=>15153, 134157=>15154, 59197=>15154, 31458=>15155, 59198=>15155, 23129=>15156, 59199=>15156, 141045=>15157, 59200=>15157, 154287=>15158, 59201=>15158, 154268=>15159, 59202=>15159, 23053=>15160, 59203=>15160, 131675=>15161, 59204=>15161, 30960=>15162, 59205=>15162, 23082=>15163, 59206=>15163, 154566=>15164, 59207=>15164, 31486=>15165, 59208=>15165, 16889=>15166, 59209=>15166, 31837=>15167, 59210=>15167, 31853=>15168, 59211=>15168, 16913=>15169, 59212=>15169, 154547=>15170, 59213=>15170, 155324=>15171, 59214=>15171, 155302=>15172, 59215=>15172, 31949=>15173, 59216=>15173, 150009=>15174, 59217=>15174, 137136=>15175, 59218=>15175, 31886=>15176, 59219=>15176, 31868=>15177, 59220=>15177, 31918=>15178, 59221=>15178, 27314=>15179, 59222=>15179, 32220=>15180, 59223=>15180, 32263=>15181, 59224=>15181, 32211=>15182, 59225=>15182, 32590=>15183, 59226=>15183, 156257=>15184, 59227=>15184, 155996=>15185, 59228=>15185, 162632=>15186, 59229=>15186, 32151=>15187, 59230=>15187, 155266=>15188, 59231=>15188, 17002=>15189, 59232=>15189, 158581=>15190, 59233=>15190, 133398=>15191, 59234=>15191, 26582=>15192, 59235=>15192, 131150=>15193, 59236=>15193, 144847=>15194, 59237=>15194, 22468=>15195, 59238=>15195, 156690=>15196, 59239=>15196, 156664=>15197, 59240=>15197, 32733=>15198, 59242=>15198, 31527=>15199, 59243=>15199, 133164=>15200, 59244=>15200, 154345=>15201, 59245=>15201, 154947=>15202, 59246=>15202, 31500=>15203, 59247=>15203, 155150=>15204, 59248=>15204, 39398=>15205, 59249=>15205, 34373=>15206, 59250=>15206, 39523=>15207, 59251=>15207, 27164=>15208, 59252=>15208, 144447=>15209, 59253=>15209, 150007=>15210, 59255=>15210, 157101=>15211, 59256=>15211, 39455=>15212, 59257=>15212, 157088=>15213, 59258=>15213, 33941=>15214, 160039=>15215, 59260=>15215, 158929=>15216, 59261=>15216, 17642=>15217, 59262=>15217, 33079=>15218, 59263=>15218, 17410=>15219, 59264=>15219, 32966=>15220, 59265=>15220, 33033=>15221, 59266=>15221, 33090=>15222, 59267=>15222, 157620=>15223, 59268=>15223, 39107=>15224, 59269=>15224, 158274=>15225, 59270=>15225, 33378=>15226, 59271=>15226, 33381=>15227, 59272=>15227, 158289=>15228, 59273=>15228, 33875=>15229, 59274=>15229, 159143=>15230, 59275=>15230, 34320=>15231, 59276=>15231, 160283=>15232, 59277=>15232, 23174=>15233, 59278=>15233, 16767=>15234, 59279=>15234, 137280=>15235, 59280=>15235, 23339=>15236, 59281=>15236, 137377=>15237, 59282=>15237, 23268=>15238, 59283=>15238, 137432=>15239, 59284=>15239, 34464=>15240, 59285=>15240, 195004=>15241, 59286=>15241, 146831=>15242, 59287=>15242, 34861=>15243, 59288=>15243, 160802=>15244, 59289=>15244, 23042=>15245, 59290=>15245, 34926=>15246, 59291=>15246, 20293=>15247, 59292=>15247, 34951=>15248, 59293=>15248, 35007=>15249, 59294=>15249, 35046=>15250, 59295=>15250, 35173=>15251, 59296=>15251, 35149=>15252, 59297=>15252, 153219=>15253, 59298=>15253, 35156=>15254, 59299=>15254, 161669=>15255, 59300=>15255, 161668=>15256, 59301=>15256, 166901=>15257, 59302=>15257, 166873=>15258, 59303=>15258, 166812=>15259, 59304=>15259, 166393=>15260, 59305=>15260, 16045=>15261, 59306=>15261, 33955=>15262, 59307=>15262, 18165=>15263, 59308=>15263, 18127=>15264, 59309=>15264, 14322=>15265, 59310=>15265, 35389=>15266, 59311=>15266, 35356=>15267, 59312=>15267, 169032=>15268, 59313=>15268, 24397=>15269, 59314=>15269, 37419=>15270, 59315=>15270, 148100=>15271, 59316=>15271, 26068=>15272, 59317=>15272, 28969=>15273, 59318=>15273, 28868=>15274, 59319=>15274, 137285=>15275, 59320=>15275, 40301=>15276, 59321=>15276, 35999=>15277, 59322=>15277, 36073=>15278, 59323=>15278, 163292=>15279, 59324=>15279, 22938=>15280, 59325=>15280, 30659=>15281, 59326=>15281, 23024=>15282, 59327=>15282, 14036=>15283, 59329=>15283, 36394=>15284, 59330=>15284, 36519=>15285, 59331=>15285, 150537=>15286, 59332=>15286, 36656=>15287, 59333=>15287, 36682=>15288, 59334=>15288, 17140=>15289, 59335=>15289, 27736=>15290, 59336=>15290, 28603=>15291, 59337=>15291, 140065=>15292, 59338=>15292, 18587=>15293, 59339=>15293, 28537=>15294, 59340=>15294, 28299=>15295, 59341=>15295, 137178=>15296, 59342=>15296, 39913=>15297, 59343=>15297, 14005=>15298, 59344=>15298, 149807=>15299, 59345=>15299, 37051=>15300, 59346=>15300, 18612=>15301, 21873=>15302, 59348=>15302, 18694=>15303, 59349=>15303, 37307=>15304, 59350=>15304, 37892=>15305, 59351=>15305, 166475=>15306, 59352=>15306, 16482=>15307, 59353=>15307, 166652=>15308, 59354=>15308, 37927=>15309, 59355=>15309, 166941=>15310, 59356=>15310, 166971=>15311, 59357=>15311, 34021=>15312, 59358=>15312, 35371=>15313, 59359=>15313, 38297=>15314, 59360=>15314, 38311=>15315, 59361=>15315, 38295=>15316, 59362=>15316, 38294=>15317, 59363=>15317, 167220=>15318, 59364=>15318, 29765=>15319, 59365=>15319, 16066=>15320, 59366=>15320, 149759=>15321, 59367=>15321, 150082=>15322, 59368=>15322, 148458=>15323, 59369=>15323, 16103=>15324, 59370=>15324, 143909=>15325, 59371=>15325, 38543=>15326, 59372=>15326, 167655=>15327, 59373=>15327, 167526=>15328, 59374=>15328, 167525=>15329, 59375=>15329, 16076=>15330, 59376=>15330, 149997=>15331, 59377=>15331, 150136=>15332, 59378=>15332, 147438=>15333, 59379=>15333, 29714=>15334, 59380=>15334, 29803=>15335, 59381=>15335, 16124=>15336, 59382=>15336, 38721=>15337, 59383=>15337, 168112=>15338, 59384=>15338, 26695=>15339, 59385=>15339, 18973=>15340, 59386=>15340, 168083=>15341, 59387=>15341, 153567=>15342, 59388=>15342, 37736=>15344, 59390=>15344, 166281=>15345, 59391=>15345, 166950=>15346, 59392=>15346, 166703=>15347, 59393=>15347, 156606=>15348, 59394=>15348, 37562=>15349, 59395=>15349, 23313=>15350, 59396=>15350, 35689=>15351, 59397=>15351, 18748=>15352, 59398=>15352, 29689=>15353, 59399=>15353, 147995=>15354, 59400=>15354, 38811=>15355, 59401=>15355, 39224=>15357, 59403=>15357, 134950=>15358, 59404=>15358, 24001=>15359, 59405=>15359, 166853=>15360, 59406=>15360, 150194=>15361, 59407=>15361, 38943=>15362, 59408=>15362, 169178=>15363, 59409=>15363, 37622=>15364, 59410=>15364, 169431=>15365, 59411=>15365, 37349=>15366, 59412=>15366, 17600=>15367, 59413=>15367, 166736=>15368, 59414=>15368, 150119=>15369, 59415=>15369, 166756=>15370, 59416=>15370, 39132=>15371, 59417=>15371, 166469=>15372, 59418=>15372, 16128=>15373, 59419=>15373, 37418=>15374, 59420=>15374, 18725=>15375, 59421=>15375, 33812=>15376, 59422=>15376, 39227=>15377, 59423=>15377, 39245=>15378, 59424=>15378, 162566=>15379, 59425=>15379, 15869=>15380, 59426=>15380, 19311=>15382, 59428=>15382, 39338=>15383, 59429=>15383, 39516=>15384, 59430=>15384, 166757=>15385, 59431=>15385, 153800=>15386, 59432=>15386, 27279=>15387, 59433=>15387, 39457=>15388, 59434=>15388, 23294=>15389, 59435=>15389, 39471=>15390, 59436=>15390, 170225=>15391, 59437=>15391, 19344=>15392, 59438=>15392, 170312=>15393, 59439=>15393, 39356=>15394, 59440=>15394, 19389=>15395, 59441=>15395, 19351=>15396, 59442=>15396, 37757=>15397, 59443=>15397, 22642=>15398, 59444=>15398, 135938=>15399, 59445=>15399, 22562=>15400, 59446=>15400, 149944=>15401, 59447=>15401, 136424=>15402, 59448=>15402, 30788=>15403, 59449=>15403, 141087=>15404, 59450=>15404, 146872=>15405, 59451=>15405, 26821=>15406, 59452=>15406, 15741=>15407, 59453=>15407, 37976=>15408, 59454=>15408, 14631=>15409, 59455=>15409, 24912=>15410, 59456=>15410, 141185=>15411, 59457=>15411, 141675=>15412, 59458=>15412, 24839=>15413, 59459=>15413, 40015=>15414, 59460=>15414, 40019=>15415, 59461=>15415, 40059=>15416, 59462=>15416, 39989=>15417, 59463=>15417, 39952=>15418, 59464=>15418, 39807=>15419, 59465=>15419, 39887=>15420, 59466=>15420, 171565=>15421, 59467=>15421, 39839=>15422, 59468=>15422, 172533=>15423, 59469=>15423, 172286=>15424, 59470=>15424, 40225=>15425, 59471=>15425, 19630=>15426, 59472=>15426, 147716=>15427, 59473=>15427, 40472=>15428, 59474=>15428, 19632=>15429, 59475=>15429, 40204=>15430, 59476=>15430, 172468=>15431, 59477=>15431, 172269=>15432, 59478=>15432, 172275=>15433, 59479=>15433, 170287=>15434, 59480=>15434, 40357=>15435, 59481=>15435, 33981=>15436, 59482=>15436, 159250=>15437, 59483=>15437, 159711=>15438, 59484=>15438, 158594=>15439, 59485=>15439, 34300=>15440, 59486=>15440, 17715=>15441, 59487=>15441, 159140=>15442, 59488=>15442, 159364=>15443, 59489=>15443, 159216=>15444, 59490=>15444, 33824=>15445, 59491=>15445, 34286=>15446, 59492=>15446, 159232=>15447, 59493=>15447, 145367=>15448, 59494=>15448, 155748=>15449, 59495=>15449, 31202=>15450, 59496=>15450, 144796=>15451, 59497=>15451, 144960=>15452, 59498=>15452, 149982=>15453, 59500=>15453, 15714=>15454, 59501=>15454, 37851=>15455, 59502=>15455, 37566=>15456, 59503=>15456, 37704=>15457, 59504=>15457, 131775=>15458, 59505=>15458, 30905=>15459, 59506=>15459, 37495=>15460, 59507=>15460, 37965=>15461, 59508=>15461, 20452=>15462, 59509=>15462, 13376=>15463, 59510=>15463, 36964=>15464, 59511=>15464, 152925=>15465, 59512=>15465, 30781=>15466, 59513=>15466, 30804=>15467, 59514=>15467, 30902=>15468, 59515=>15468, 30795=>15469, 59516=>15469, 137047=>15470, 59517=>15470, 143817=>15471, 59518=>15471, 149825=>15472, 59519=>15472, 13978=>15473, 59520=>15473, 20338=>15474, 59521=>15474, 28634=>15475, 59522=>15475, 28633=>15476, 59523=>15476, 28702=>15478, 59524=>15478, 59525=>15478, 21524=>15479, 59526=>15479, 147893=>15480, 59527=>15480, 22459=>15481, 59528=>15481, 22771=>15482, 59529=>15482, 22410=>15483, 59530=>15483, 40214=>15484, 59531=>15484, 22487=>15485, 59532=>15485, 28980=>15486, 59533=>15486, 13487=>15487, 59534=>15487, 147884=>15488, 59535=>15488, 29163=>15489, 59536=>15489, 158784=>15490, 59537=>15490, 151447=>15491, 59538=>15491, 137141=>15493, 59540=>15493, 166473=>15494, 59541=>15494, 24844=>15495, 59542=>15495, 23246=>15496, 59543=>15496, 23051=>15497, 59544=>15497, 17084=>15498, 59545=>15498, 148616=>15499, 59546=>15499, 14124=>15500, 59547=>15500, 19323=>15501, 59548=>15501, 166396=>15502, 59549=>15502, 37819=>15503, 59550=>15503, 37816=>15504, 59551=>15504, 137430=>15505, 59552=>15505, 134941=>15506, 59553=>15506, 33906=>15507, 59554=>15507, 158912=>15508, 59555=>15508, 136211=>15509, 59556=>15509, 148218=>15510, 59557=>15510, 142374=>15511, 59558=>15511, 148417=>15512, 59559=>15512, 22932=>15513, 59560=>15513, 146871=>15514, 59561=>15514, 157505=>15515, 59562=>15515, 32168=>15516, 59563=>15516, 155995=>15517, 59564=>15517, 155812=>15518, 59565=>15518, 149945=>15519, 59566=>15519, 149899=>15520, 59567=>15520, 166394=>15521, 59568=>15521, 37605=>15522, 59569=>15522, 29666=>15523, 59570=>15523, 16105=>15524, 59571=>15524, 29876=>15525, 59572=>15525, 166755=>15526, 59573=>15526, 137375=>15527, 59574=>15527, 16097=>15528, 59575=>15528, 150195=>15529, 59576=>15529, 27352=>15530, 59577=>15530, 29683=>15531, 59578=>15531, 29691=>15532, 59579=>15532, 16086=>15533, 59580=>15533, 150078=>15534, 59581=>15534, 150164=>15535, 59582=>15535, 137177=>15536, 59583=>15536, 150118=>15537, 59584=>15537, 132007=>15538, 59585=>15538, 136228=>15539, 59586=>15539, 149989=>15540, 59587=>15540, 29768=>15541, 59588=>15541, 149782=>15542, 59589=>15542, 28837=>15543, 59590=>15543, 149878=>15544, 59591=>15544, 37508=>15545, 59592=>15545, 29670=>15546, 59593=>15546, 37727=>15547, 59594=>15547, 132350=>15548, 59595=>15548, 37681=>15549, 59596=>15549, 166606=>15550, 59597=>15550, 166422=>15551, 59598=>15551, 37766=>15552, 59599=>15552, 166887=>15553, 59600=>15553, 153045=>15554, 59601=>15554, 18741=>15555, 59602=>15555, 166530=>15556, 59603=>15556, 29035=>15557, 59604=>15557, 149827=>15558, 59605=>15558, 134399=>15559, 59606=>15559, 22180=>15560, 59607=>15560, 132634=>15561, 59608=>15561, 134123=>15562, 59609=>15562, 134328=>15563, 59610=>15563, 21762=>15564, 59611=>15564, 31172=>15565, 59612=>15565, 137210=>15566, 59613=>15566, 32254=>15567, 59614=>15567, 136898=>15568, 59615=>15568, 150096=>15569, 59616=>15569, 137298=>15570, 59617=>15570, 17710=>15571, 59618=>15571, 37889=>15572, 59619=>15572, 14090=>15573, 59620=>15573, 166592=>15574, 59621=>15574, 149933=>15575, 59622=>15575, 22960=>15576, 59623=>15576, 137407=>15577, 59624=>15577, 137347=>15578, 59625=>15578, 160900=>15579, 59626=>15579, 23201=>15580, 59627=>15580, 14050=>15581, 59628=>15581, 146779=>15582, 59629=>15582, 14000=>15583, 59630=>15583, 37471=>15584, 59631=>15584, 23161=>15585, 59632=>15585, 166529=>15586, 59633=>15586, 137314=>15587, 59634=>15587, 37748=>15588, 59635=>15588, 15565=>15589, 59636=>15589, 133812=>15590, 59637=>15590, 19094=>15591, 59638=>15591, 14730=>15592, 59639=>15592, 20724=>15593, 59640=>15593, 15721=>15594, 59641=>15594, 15692=>15595, 59642=>15595, 136092=>15596, 59643=>15596, 29045=>15597, 59644=>15597, 17147=>15598, 59645=>15598, 164376=>15599, 59646=>15599, 28175=>15600, 59647=>15600, 168164=>15601, 59648=>15601, 17643=>15602, 59649=>15602, 27991=>15603, 59650=>15603, 163407=>15604, 59651=>15604, 28775=>15605, 59652=>15605, 27823=>15606, 59653=>15606, 15574=>15607, 59654=>15607, 147437=>15608, 59655=>15608, 146989=>15609, 59656=>15609, 28162=>15610, 59657=>15610, 28428=>15611, 59658=>15611, 15727=>15612, 59659=>15612, 132085=>15613, 59660=>15613, 30033=>15614, 59661=>15614, 14012=>15615, 59662=>15615, 13512=>15616, 59663=>15616, 18048=>15617, 59664=>15617, 16090=>15618, 59665=>15618, 18545=>15619, 59666=>15619, 22980=>15620, 59667=>15620, 37486=>15621, 59668=>15621, 18750=>15622, 59669=>15622, 36673=>15623, 59670=>15623, 166940=>15624, 59671=>15624, 158656=>15625, 59672=>15625, 22546=>15626, 59673=>15626, 22472=>15627, 59674=>15627, 14038=>15628, 59675=>15628, 136274=>15629, 59676=>15629, 28926=>15630, 59677=>15630, 148322=>15631, 59678=>15631, 150129=>15632, 59679=>15632, 143331=>15633, 59680=>15633, 135856=>15634, 59681=>15634, 140221=>15635, 59682=>15635, 26809=>15636, 59683=>15636, 26983=>15637, 59684=>15637, 136088=>15638, 59685=>15638, 144613=>15639, 59686=>15639, 162804=>15640, 59687=>15640, 145119=>15641, 59688=>15641, 166531=>15642, 59689=>15642, 145366=>15643, 59690=>15643, 144378=>15644, 59691=>15644, 150687=>15645, 59692=>15645, 27162=>15646, 59693=>15646, 145069=>15647, 59694=>15647, 158903=>15648, 59695=>15648, 33854=>15649, 59696=>15649, 17631=>15650, 59697=>15650, 17614=>15651, 59698=>15651, 159014=>15652, 59699=>15652, 159057=>15653, 59700=>15653, 158850=>15654, 59701=>15654, 159710=>15655, 59702=>15655, 33597=>15658, 59705=>15658, 137018=>15659, 59706=>15659, 33773=>15660, 59707=>15660, 158848=>15661, 59708=>15661, 159827=>15662, 59709=>15662, 137179=>15663, 59710=>15663, 22921=>15664, 59711=>15664, 23170=>15665, 59712=>15665, 137139=>15666, 59713=>15666, 23137=>15667, 59714=>15667, 23153=>15668, 59715=>15668, 137477=>15669, 59716=>15669, 147964=>15670, 59717=>15670, 14125=>15671, 59718=>15671, 23023=>15672, 59719=>15672, 137020=>15673, 59720=>15673, 14023=>15674, 59721=>15674, 29070=>15675, 59722=>15675, 37776=>15676, 59723=>15676, 26266=>15677, 59724=>15677, 148133=>15678, 59725=>15678, 23150=>15679, 59726=>15679, 23083=>15680, 59727=>15680, 148115=>15681, 59728=>15681, 27179=>15682, 59729=>15682, 147193=>15683, 59730=>15683, 161590=>15684, 59731=>15684, 148571=>15685, 59732=>15685, 148170=>15686, 59733=>15686, 28957=>15687, 59734=>15687, 148057=>15688, 59735=>15688, 166369=>15689, 59736=>15689, 20400=>15690, 59737=>15690, 159016=>15691, 59738=>15691, 23746=>15692, 59739=>15692, 148686=>15693, 59740=>15693, 163405=>15694, 59741=>15694, 148413=>15695, 59742=>15695, 27148=>15696, 59743=>15696, 148054=>15697, 59744=>15697, 135940=>15698, 59745=>15698, 28979=>15700, 59747=>15700, 148457=>15701, 59748=>15701, 15781=>15702, 59749=>15702, 27871=>15703, 59750=>15703, 194597=>15704, 59751=>15704, 23019=>15705, 59754=>15705, 24412=>15706, 59757=>15706, 59764=>15707, 144128=>15707, 31955=>15708, 59776=>15708, 59783=>15709, 162548=>15709, 59786=>15710, 153334=>15710, 162584=>15711, 59790=>15711, 36972=>15712, 59791=>15712, 33270=>15713, 59795=>15713, 30476=>15714, 59797=>15714, 27810=>15715, 59799=>15715, 22269=>15716, 59800=>15716, 22633=>15717, 59828=>15717, 26465=>15718, 59832=>15718, 23646=>15719, 59838=>15719, 22770=>15720, 59841=>15720, 28857=>15721, 59843=>15721, 26627=>15722, 59853=>15722, 59859=>15723, 36795=>15723, 59861=>15724, 36796=>15724, 20001=>15725, 59871=>15725, 31545=>15726, 59898=>15726, 15820=>15727, 59902=>15727, 29482=>15728, 57990=>15728, 59909=>15728, 30048=>15729, 59912=>15729, 22586=>15730, 59920=>15730, 33446=>15731, 59932=>15731, 27018=>15732, 59940=>15732, 24803=>15733, 59944=>15733, 20206=>15734, 59984=>15734, 39364=>15735, 60002=>15735, 40639=>15736, 60023=>15736, 21249=>15737, 60025=>15737, 26528=>15738, 60038=>15738, 24808=>15739, 60046=>15739, 20916=>15740, 60053=>15740, 31363=>15741, 60064=>15741, 39994=>15742, 60075=>15742, 31432=>15743, 60093=>15743, 26906=>15744, 60098=>15744, 22956=>15745, 60100=>15745, 22592=>15746, 60102=>15746, 21610=>15747, 60114=>15747, 24807=>15748, 60123=>15748, 22138=>15749, 60125=>15749, 26965=>15750, 60132=>15750, 39983=>15751, 60133=>15751, 34725=>15752, 60134=>15752, 23584=>15753, 60141=>15753, 24075=>15754, 60143=>15754, 26398=>15755, 60147=>15755, 33965=>15756, 60157=>15756, 35713=>15757, 60161=>15757, 20088=>15758, 60166=>15758, 25283=>15759, 60176=>15759, 26709=>15760, 60180=>15760, 33533=>15762, 60190=>15762, 35237=>15763, 60194=>15763, 36768=>15764, 60196=>15764, 38840=>15765, 60198=>15765, 38983=>15766, 60200=>15766, 39613=>15767, 60201=>15767, 24497=>15768, 60218=>15768, 26184=>15769, 60219=>15769, 26303=>15770, 60220=>15770, 162425=>15771, 60221=>15771, 60225=>15773, 149946=>15773, 60230=>15776, 131910=>15776, 26382=>15777, 60232=>15777, 26904=>15778, 60233=>15778, 161367=>15779, 60235=>15779, 155618=>15780, 60236=>15780, 161278=>15781, 60239=>15781, 139418=>15782, 60240=>15782, 18640=>15783, 60241=>15783, 19128=>15784, 60242=>15784, 60244=>15785, 166554=>15785, 60247=>15786, 147515=>15786, 150085=>15787, 60250=>15787, 132554=>15788, 60251=>15788, 20946=>15789, 60252=>15789, 132625=>15790, 60253=>15790, 22943=>15791, 60254=>15791, 138920=>15792, 60255=>15792, 15294=>15793, 60256=>15793, 146687=>15794, 60257=>15794, 14747=>15795, 60262=>15795, 165352=>15796, 60264=>15796, 170441=>15797, 60265=>15797, 14178=>15798, 60266=>15798, 139715=>15799, 60267=>15799, 35678=>15800, 60268=>15800, 166734=>15801, 60269=>15801, 29193=>15803, 60274=>15803, 60276=>15804, 134264=>15804, 132985=>15805, 60280=>15805, 36570=>15806, 60281=>15806, 21135=>15807, 60283=>15807, 29041=>15808, 60285=>15808, 147274=>15809, 60288=>15809, 150183=>15810, 60289=>15810, 21948=>15811, 60290=>15811, 60293=>15812, 158546=>15812, 13427=>15813, 60295=>15813, 60297=>15814, 161330=>15814, 18200=>15815, 60299=>15815, 60303=>15816, 149823=>15816, 20582=>15817, 60305=>15817, 13563=>15818, 60306=>15818, 144332=>15819, 60307=>15819, 18300=>15821, 60310=>15821, 166216=>15822, 60311=>15822, 60315=>15823, 138640=>15823, 162834=>15825, 60320=>15825, 36950=>15826, 60321=>15826, 151450=>15827, 60323=>15827, 35682=>15828, 60324=>15828, 23899=>15829, 60327=>15829, 158711=>15830, 60328=>15830, 137500=>15832, 60331=>15832, 35562=>15833, 60332=>15833, 150006=>15834, 60333=>15834, 60335=>15835, 147439=>15835, 19392=>15836, 60337=>15836, 141083=>15837, 60340=>15837, 37989=>15838, 60341=>15838, 153569=>15839, 60342=>15839, 24981=>15840, 60343=>15840, 23079=>15841, 60344=>15841, 194765=>15842, 60345=>15842, 194566=>15843, 60348=>15844, 148769=>15844, 20074=>15845, 60350=>15845, 149812=>15846, 60351=>15846, 38486=>15847, 60352=>15847, 28047=>15848, 60353=>15848, 158909=>15849, 60354=>15849, 35191=>15850, 60356=>15850, 60359=>15851, 156689=>15851, 31554=>15853, 60363=>15853, 168128=>15854, 60364=>15854, 133649=>15855, 60365=>15855, 31301=>15857, 60369=>15857, 39462=>15858, 60372=>15858, 13919=>15859, 60374=>15859, 156777=>15860, 60375=>15860, 131105=>15861, 60376=>15861, 31107=>15862, 60377=>15862, 23852=>15863, 60380=>15863, 144665=>15864, 60381=>15864, 18128=>15866, 60384=>15866, 30011=>15867, 60386=>15867, 34917=>15868, 60387=>15868, 22710=>15869, 60389=>15869, 14108=>15870, 60390=>15870, 140685=>15871, 60391=>15871, 15444=>15872, 60394=>15872, 37505=>15873, 60397=>15873, 139642=>15874, 60398=>15874, 37680=>15875, 60400=>15875, 149968=>15876, 60402=>15876, 27705=>15877, 60403=>15877, 134904=>15878, 60406=>15878, 34855=>15879, 60407=>15879, 35061=>15880, 60408=>15880, 141606=>15881, 60409=>15881, 164979=>15882, 60410=>15882, 137137=>15883, 60411=>15883, 28344=>15884, 60412=>15884, 150058=>15885, 60413=>15885, 137248=>15886, 60414=>15886, 14756=>15887, 60415=>15887, 17727=>15890, 60419=>15890, 26294=>15891, 60420=>15891, 171181=>15892, 60421=>15892, 170148=>15893, 60422=>15893, 35139=>15894, 60423=>15894, 16607=>15895, 60427=>15895, 136714=>15896, 60428=>15896, 14753=>15897, 60429=>15897, 145199=>15898, 60430=>15898, 164072=>15899, 60431=>15899, 136133=>15900, 60432=>15900, 29101=>15901, 60433=>15901, 33638=>15902, 60434=>15902, 60436=>15903, 168360=>15903, 19639=>15905, 60438=>15905, 159919=>15906, 60439=>15906, 166315=>15907, 60440=>15907, 147834=>15908, 60445=>15908, 31555=>15909, 60446=>15909, 31102=>15910, 60447=>15910, 28597=>15911, 60449=>15911, 172767=>15912, 60450=>15912, 27139=>15913, 60451=>15913, 164632=>15914, 60452=>15914, 21410=>15915, 60453=>15915, 159239=>15916, 60454=>15916, 37823=>15917, 60455=>15917, 26678=>15918, 60456=>15918, 38749=>15919, 59389=>15919, 60457=>15919, 164207=>15920, 60458=>15920, 158133=>15921, 60460=>15921, 136173=>15922, 60461=>15922, 143919=>15923, 60462=>15923, 23941=>15924, 60464=>15924, 166960=>15925, 60465=>15925, 22293=>15926, 60467=>15926, 38947=>15927, 60468=>15927, 166217=>15928, 60469=>15928, 23979=>15929, 60470=>15929, 149896=>15930, 60471=>15930, 26046=>15931, 60472=>15931, 27093=>15932, 60473=>15932, 21458=>15933, 60474=>15933, 150181=>15934, 60475=>15934, 147329=>15935, 60476=>15935, 15377=>15936, 60477=>15936, 26422=>15937, 60478=>15937, 60482=>15938, 139169=>15938, 13770=>15939, 60490=>15939, 18682=>15940, 60493=>15940, 30728=>15942, 60496=>15942, 37461=>15943, 60497=>15943, 17394=>15944, 60499=>15944, 17375=>15945, 60501=>15945, 23032=>15946, 60505=>15946, 22155=>15948, 60518=>15948, 60520=>15949, 169449=>15949, 36882=>15950, 60541=>15950, 21953=>15951, 60546=>15951, 17673=>15952, 60551=>15952, 32383=>15953, 60552=>15953, 28502=>15954, 60553=>15954, 27313=>15955, 60554=>15955, 13540=>15956, 60556=>15956, 161949=>15957, 60558=>15957, 14138=>15958, 60559=>15958, 60562=>15960, 163876=>15960, 60565=>15961, 162366=>15961, 15851=>15962, 60567=>15962, 60569=>15963, 146615=>15963, 156248=>15964, 60574=>15964, 22207=>15965, 60575=>15965, 36366=>15966, 60577=>15966, 23405=>15967, 60578=>15967, 25566=>15968, 60581=>15968, 25904=>15970, 60585=>15970, 22061=>15971, 60586=>15971, 21530=>15972, 60588=>15972, 171416=>15973, 60591=>15973, 19581=>15974, 60592=>15974, 22050=>15975, 60593=>15975, 22046=>15976, 60594=>15976, 32585=>15977, 60595=>15977, 22901=>15978, 60597=>15978, 146752=>15979, 60598=>15979, 34672=>15980, 60599=>15980, 33047=>15981, 60604=>15981, 40286=>15982, 60605=>15982, 36120=>15983, 60606=>15983, 30267=>15984, 60607=>15984, 40005=>15985, 60608=>15985, 30286=>15986, 60609=>15986, 30649=>15987, 60610=>15987, 37701=>15988, 60611=>15988, 21554=>15989, 60612=>15989, 33096=>15990, 60613=>15990, 33527=>15991, 60614=>15991, 22053=>15992, 60615=>15992, 33074=>15993, 60616=>15993, 33816=>15994, 60617=>15994, 32957=>15995, 60618=>15995, 21994=>15996, 60619=>15996, 31074=>15997, 60620=>15997, 22083=>15998, 60621=>15998, 21526=>15999, 60622=>15999, 134813=>16000, 60623=>16000, 13774=>16001, 60624=>16001, 22021=>16002, 57509=>16002, 60625=>16002, 22001=>16003, 60626=>16003, 26353=>16004, 60627=>16004, 164578=>16005, 60628=>16005, 13869=>16006, 60629=>16006, 30004=>16007, 60630=>16007, 22000=>16008, 60631=>16008, 21946=>16009, 60632=>16009, 21655=>16010, 60633=>16010, 21874=>16011, 60634=>16011, 134209=>16012, 60635=>16012, 134294=>16013, 60636=>16013, 24272=>16014, 57652=>16014, 60637=>16014, 134774=>16015, 60639=>16015, 142434=>16016, 60640=>16016, 134818=>16017, 60641=>16017, 40619=>16018, 60642=>16018, 32090=>16019, 60643=>16019, 135285=>16021, 60645=>16021, 25245=>16022, 60646=>16022, 38765=>16023, 60647=>16023, 21652=>16024, 60648=>16024, 36045=>16025, 60649=>16025, 29174=>16026, 60650=>16026, 37238=>16027, 60651=>16027, 25596=>16028, 60652=>16028, 25529=>16029, 60653=>16029, 25598=>16030, 60654=>16030, 21865=>16031, 60655=>16031, 142147=>16032, 60656=>16032, 40050=>16033, 60657=>16033, 143027=>16034, 60658=>16034, 20890=>16035, 60659=>16035, 13535=>16036, 60660=>16036, 134567=>16037, 60661=>16037, 20903=>16038, 60662=>16038, 21581=>16039, 60663=>16039, 21790=>16040, 60664=>16040, 21779=>16041, 60665=>16041, 30310=>16042, 60666=>16042, 36397=>16043, 60667=>16043, 157834=>16044, 60668=>16044, 30129=>16045, 60669=>16045, 32950=>16046, 60670=>16046, 34820=>16047, 60671=>16047, 35015=>16049, 60673=>16049, 33206=>16050, 60674=>16050, 33820=>16051, 60675=>16051, 17644=>16052, 60677=>16052, 29444=>16053, 60678=>16053, 33547=>16054, 60681=>16054, 22139=>16055, 60683=>16055, 37232=>16056, 60690=>16056, 37384=>16057, 60692=>16057, 134905=>16058, 60696=>16058, 29286=>16059, 60697=>16059, 18254=>16060, 60699=>16060, 60701=>16061, 163833=>16061, 16634=>16062, 60703=>16062, 40029=>16063, 60704=>16063, 25887=>16064, 60705=>16064, 18675=>16065, 60707=>16065, 149472=>16066, 60708=>16066, 171388=>16067, 60709=>16067, 60713=>16069, 161187=>16069, 60715=>16070, 155720=>16071, 60716=>16071, 29091=>16072, 60718=>16072, 32398=>16073, 60719=>16073, 40272=>16074, 60720=>16074, 13687=>16075, 60723=>16075, 27826=>16076, 60725=>16076, 21351=>16077, 60726=>16077, 14812=>16078, 60728=>16078, 60731=>16079, 149016=>16079, 33325=>16080, 60734=>16080, 21579=>16081, 60735=>16081, 60739=>16082, 14930=>16083, 60740=>16083, 29556=>16084, 60742=>16084, 171692=>16085, 60743=>16085, 19721=>16086, 60744=>16086, 39917=>16087, 60745=>16087, 19547=>16089, 60748=>16089, 171998=>16090, 60751=>16090, 33884=>16091, 60752=>16091, 60754=>16092, 160434=>16092, 25390=>16093, 60757=>16093, 32037=>16094, 60758=>16094, 14890=>16095, 60761=>16095, 36872=>16096, 60762=>16096, 21196=>16097, 60763=>16097, 15988=>16098, 60764=>16098, 13946=>16099, 60765=>16099, 17897=>16100, 60766=>16100, 132238=>16101, 60767=>16101, 30272=>16102, 60768=>16102, 23280=>16103, 60769=>16103, 134838=>16104, 60770=>16104, 30842=>16105, 60771=>16105, 18358=>16106, 163630=>16106, 60772=>16106, 22695=>16107, 60773=>16107, 16575=>16108, 60774=>16108, 22140=>16109, 60775=>16109, 39819=>16110, 60776=>16110, 23924=>16111, 60777=>16111, 30292=>16112, 60778=>16112, 173108=>16113, 60779=>16113, 40581=>16114, 60780=>16114, 19681=>16115, 60781=>16115, 14331=>16117, 60783=>16117, 24857=>16118, 60784=>16118, 148466=>16119, 60786=>16119, 60787=>16120, 22109=>16121, 60788=>16121, 171526=>16122, 60792=>16122, 21044=>16123, 60793=>16123, 13741=>16124, 60795=>16124, 40316=>16126, 60797=>16126, 31830=>16127, 60798=>16127, 39737=>16128, 60799=>16128, 22494=>16129, 60800=>16129, 23635=>16130, 60802=>16130, 25811=>16131, 60803=>16131, 169168=>16132, 60804=>16132, 156469=>16133, 60805=>16133, 34477=>16134, 60807=>16134, 134440=>16135, 60808=>16135, 134513=>16136, 60811=>16136, 60812=>16137, 20990=>16138, 60813=>16138, 139023=>16139, 60814=>16139, 23950=>16140, 60815=>16140, 38659=>16141, 60816=>16141, 138705=>16142, 60817=>16142, 40577=>16143, 60818=>16143, 36940=>16144, 60819=>16144, 31519=>16145, 60820=>16145, 39682=>16146, 60821=>16146, 23761=>16147, 60822=>16147, 31651=>16148, 60823=>16148, 25192=>16149, 60824=>16149, 25397=>16150, 60825=>16150, 39679=>16151, 60826=>16151, 31695=>16152, 60827=>16152, 39722=>16153, 60828=>16153, 31870=>16154, 60829=>16154, 31810=>16156, 60831=>16156, 31878=>16157, 60832=>16157, 39957=>16158, 60833=>16158, 31740=>16159, 60834=>16159, 39689=>16160, 60835=>16160, 39982=>16162, 40794=>16163, 60839=>16163, 21875=>16164, 60840=>16164, 23491=>16165, 60841=>16165, 20477=>16166, 60842=>16166, 40600=>16167, 60843=>16167, 20466=>16168, 60844=>16168, 21088=>16169, 60845=>16169, 21201=>16170, 60847=>16170, 22375=>16171, 60848=>16171, 20566=>16172, 60849=>16172, 22967=>16173, 60850=>16173, 24082=>16174, 60851=>16174, 38856=>16175, 60852=>16175, 40363=>16176, 60853=>16176, 36700=>16177, 60854=>16177, 21609=>16178, 60855=>16178, 38836=>16179, 60856=>16179, 39232=>16180, 60857=>16180, 38842=>16181, 60858=>16181, 21292=>16182, 60859=>16182, 24880=>16183, 60860=>16183, 26924=>16184, 60861=>16184, 21466=>16185, 60862=>16185, 39946=>16186, 60863=>16186, 40194=>16187, 60864=>16187, 19515=>16188, 60865=>16188, 38465=>16189, 60866=>16189, 27008=>16190, 60867=>16190, 20646=>16191, 60868=>16191, 30022=>16192, 60869=>16192, 137069=>16193, 60870=>16193, 39386=>16194, 60871=>16194, 21107=>16195, 60872=>16195, 60873=>16196, 37209=>16197, 60874=>16197, 38529=>16198, 60875=>16198, 37212=>16199, 60876=>16199, 60877=>16200, 37201=>16201, 60878=>16201, 167575=>16202, 60879=>16202, 25471=>16203, 60880=>16203, 27338=>16204, 60882=>16204, 22033=>16205, 60883=>16205, 37262=>16206, 60884=>16206, 30074=>16207, 60885=>16207, 25221=>16208, 60886=>16208, 29519=>16209, 60888=>16209, 31856=>16210, 60889=>16210, 154657=>16211, 60890=>16211, 60892=>16212, 30422=>16213, 60894=>16213, 39837=>16214, 60895=>16214, 20010=>16215, 60896=>16215, 134356=>16216, 60897=>16216, 33726=>16217, 60898=>16217, 34882=>16218, 60899=>16218, 60900=>16219, 23626=>16220, 60901=>16220, 27072=>16221, 60902=>16221, 21023=>16224, 60905=>16224, 24053=>16225, 60906=>16225, 20174=>16226, 60907=>16226, 27697=>16227, 60908=>16227, 131570=>16228, 60909=>16228, 20281=>16229, 60910=>16229, 21660=>16230, 60911=>16230, 21146=>16232, 60913=>16232, 36226=>16233, 60914=>16233, 13822=>16234, 60915=>16234, 13811=>16236, 60917=>16236, 60918=>16237, 27474=>16238, 60919=>16238, 37244=>16239, 60920=>16239, 40869=>16240, 60921=>16240, 39831=>16241, 60922=>16241, 38958=>16242, 60923=>16242, 39092=>16243, 60924=>16243, 39610=>16244, 60925=>16244, 40616=>16245, 60926=>16245, 40580=>16246, 60927=>16246, 31508=>16247, 60929=>16247, 60930=>16248, 27642=>16249, 60931=>16249, 34840=>16250, 60932=>16250, 32632=>16251, 60933=>16251, 60934=>16252, 22048=>16253, 60935=>16253, 173642=>16254, 60936=>16254, 36471=>16255, 60937=>16255, 40787=>16256, 60938=>16256, 60939=>16257, 36308=>16258, 60940=>16258, 36431=>16259, 60941=>16259, 40476=>16260, 60942=>16260, 36353=>16261, 60943=>16261, 25218=>16262, 60944=>16262, 164733=>16263, 60945=>16263, 36392=>16264, 60946=>16264, 36469=>16265, 60947=>16265, 31443=>16266, 60948=>16266, 31294=>16267, 60950=>16267, 30936=>16268, 60951=>16268, 27882=>16269, 60952=>16269, 35431=>16270, 60953=>16270, 30215=>16271, 60954=>16271, 40742=>16272, 60956=>16272, 27854=>16273, 60957=>16273, 34774=>16274, 60958=>16274, 30147=>16275, 60959=>16275, 172722=>16276, 60960=>16276, 30803=>16277, 60961=>16277, 36108=>16278, 60963=>16278, 29410=>16279, 60964=>16279, 29553=>16280, 60965=>16280, 35629=>16281, 60966=>16281, 29442=>16282, 60967=>16282, 29937=>16283, 60968=>16283, 36075=>16284, 60969=>16284, 150203=>16285, 60970=>16285, 34351=>16286, 60971=>16286, 24506=>16287, 60972=>16287, 34976=>16288, 60973=>16288, 17591=>16289, 60974=>16289, 60975=>16290, 159237=>16291, 60977=>16291, 60978=>16292, 35454=>16293, 60979=>16293, 140571=>16294, 60980=>16294, 60981=>16295, 24829=>16296, 60982=>16296, 30311=>16297, 60983=>16297, 39639=>16298, 60984=>16298, 40260=>16299, 60985=>16299, 37742=>16300, 58859=>16300, 60986=>16300, 39823=>16301, 60987=>16301, 34805=>16302, 60988=>16302, 60989=>16303, 36087=>16305, 60991=>16305, 29484=>16306, 60992=>16306, 38689=>16307, 60993=>16307, 39856=>16308, 60994=>16308, 13782=>16309, 60995=>16309, 29362=>16310, 60996=>16310, 19463=>16311, 60997=>16311, 31825=>16312, 60998=>16312, 39242=>16313, 60999=>16313, 24921=>16314, 61001=>16314, 19460=>16315, 61002=>16315, 40598=>16316, 61003=>16316, 24957=>16317, 61004=>16317, 61005=>16318, 22367=>16319, 61006=>16319, 24943=>16320, 61007=>16320, 25254=>16321, 61008=>16321, 25145=>16322, 61009=>16322, 14940=>16324, 61011=>16324, 25058=>16325, 61012=>16325, 21418=>16326, 61013=>16326, 25444=>16327, 61015=>16327, 26626=>16328, 61016=>16328, 13778=>16329, 61017=>16329, 23895=>16330, 61018=>16330, 36826=>16331, 61020=>16331, 167481=>16332, 61021=>16332, 61022=>16333, 20697=>16334, 61023=>16334, 30982=>16335, 61025=>16335, 21298=>16336, 61026=>16336, 38456=>16337, 61027=>16337, 134971=>16338, 61028=>16338, 16485=>16339, 61029=>16339, 61030=>16340, 30718=>16341, 61031=>16341, 61032=>16342, 31938=>16343, 61033=>16343, 155418=>16344, 61034=>16344, 31962=>16345, 61035=>16345, 31277=>16346, 61036=>16346, 32870=>16347, 61037=>16347, 32867=>16348, 61038=>16348, 32077=>16349, 61039=>16349, 29957=>16350, 61040=>16350, 29938=>16351, 61041=>16351, 35220=>16352, 61042=>16352, 33306=>16353, 61043=>16353, 26380=>16354, 61044=>16354, 32866=>16355, 61045=>16355, 160902=>16356, 61046=>16356, 32859=>16357, 61047=>16357, 29936=>16358, 61048=>16358, 33027=>16359, 61049=>16359, 30500=>16360, 61050=>16360, 35209=>16361, 61051=>16361, 157644=>16362, 61052=>16362, 30035=>16363, 61053=>16363, 34729=>16364, 61055=>16364, 34766=>16365, 61056=>16365, 33224=>16366, 61057=>16366, 34700=>16367, 61058=>16367, 35401=>16368, 61059=>16368, 36013=>16369, 61060=>16369, 35651=>16370, 61061=>16370, 30507=>16371, 61062=>16371, 29944=>16372, 61063=>16372, 34010=>16373, 61064=>16373, 27058=>16374, 61066=>16374, 36262=>16375, 61067=>16375, 61068=>16376, 35241=>16377, 58392=>16377, 61069=>16377, 28089=>16379, 61071=>16379, 34753=>16380, 61072=>16380, 147473=>16381, 61073=>16381, 29927=>16382, 61074=>16382, 15835=>16383, 61075=>16383, 29046=>16384, 61076=>16384, 24740=>16385, 57702=>16385, 61077=>16385, 24988=>16386, 61078=>16386, 15569=>16387, 61079=>16387, 24695=>16389, 61081=>16389, 61082=>16390, 32625=>16391, 61083=>16391, 194850=>16392, 24809=>16393, 61086=>16393, 19326=>16394, 61087=>16394, 132423=>16395, 57344=>16395, 37595=>16396, 57345=>16396, 132575=>16397, 57346=>16397, 147397=>16398, 57347=>16398, 34124=>16399, 57348=>16399, 17077=>16400, 57349=>16400, 29679=>16401, 57350=>16401, 20917=>16402, 57351=>16402, 13897=>16403, 57352=>16403, 149826=>16404, 57353=>16404, 166372=>16405, 57354=>16405, 37700=>16406, 57355=>16406, 137691=>16407, 57356=>16407, 33518=>16408, 57357=>16408, 146632=>16409, 57358=>16409, 30780=>16410, 57359=>16410, 26436=>16411, 57360=>16411, 25311=>16412, 57361=>16412, 149811=>16413, 57362=>16413, 166314=>16414, 57363=>16414, 131744=>16415, 57364=>16415, 158643=>16416, 57365=>16416, 135941=>16417, 57366=>16417, 20395=>16418, 57367=>16418, 140525=>16419, 57368=>16419, 20488=>16420, 57369=>16420, 159017=>16421, 57370=>16421, 162436=>16422, 57371=>16422, 144896=>16423, 57372=>16423, 150193=>16424, 57373=>16424, 140563=>16425, 57374=>16425, 131966=>16427, 57376=>16427, 24484=>16428, 57377=>16428, 131968=>16429, 57378=>16429, 131911=>16430, 57379=>16430, 28379=>16431, 57380=>16431, 132127=>16432, 57381=>16432, 20702=>16433, 20737=>16434, 57383=>16434, 13434=>16435, 57384=>16435, 20750=>16436, 57385=>16436, 39020=>16437, 57386=>16437, 14147=>16438, 57387=>16438, 33814=>16439, 57388=>16439, 149924=>16440, 57389=>16440, 132231=>16441, 57390=>16441, 20832=>16442, 57391=>16442, 144308=>16443, 57392=>16443, 20842=>16444, 57393=>16444, 134143=>16445, 57394=>16445, 139516=>16446, 57395=>16446, 131813=>16447, 57396=>16447, 140592=>16448, 57397=>16448, 132494=>16449, 57398=>16449, 143923=>16450, 57399=>16450, 137603=>16451, 57400=>16451, 23426=>16452, 57401=>16452, 34685=>16453, 57402=>16453, 132531=>16454, 57403=>16454, 146585=>16455, 57404=>16455, 20914=>16456, 57405=>16456, 20920=>16457, 57406=>16457, 40244=>16458, 57407=>16458, 20937=>16459, 57408=>16459, 20943=>16460, 57409=>16460, 20945=>16461, 57410=>16461, 15580=>16462, 57411=>16462, 20947=>16463, 57412=>16463, 150182=>16464, 57413=>16464, 20915=>16465, 57414=>16465, 20973=>16468, 57417=>16468, 33741=>16469, 57418=>16469, 26942=>16470, 57419=>16470, 145197=>16471, 57420=>16471, 24443=>16472, 57421=>16472, 21003=>16473, 57422=>16473, 21030=>16474, 57423=>16474, 21052=>16475, 57424=>16475, 21173=>16476, 57425=>16476, 21079=>16477, 57426=>16477, 21140=>16478, 57427=>16478, 21177=>16479, 57428=>16479, 21189=>16480, 57429=>16480, 31765=>16481, 57430=>16481, 34114=>16482, 57431=>16482, 21216=>16483, 57432=>16483, 34317=>16484, 57433=>16484, 158483=>16485, 57434=>16485, 194601=>16486, 166622=>16487, 57436=>16487, 21833=>16488, 57437=>16488, 28377=>16489, 57438=>16489, 147328=>16490, 57439=>16490, 133460=>16491, 57440=>16491, 147436=>16492, 57441=>16492, 21299=>16493, 57442=>16493, 134114=>16495, 57444=>16495, 27851=>16496, 57445=>16496, 136998=>16497, 57446=>16497, 26651=>16498, 57447=>16498, 29653=>16499, 57448=>16499, 24650=>16500, 57449=>16500, 16042=>16501, 57450=>16501, 14540=>16502, 57451=>16502, 136936=>16503, 57452=>16503, 29149=>16504, 57453=>16504, 17570=>16505, 57454=>16505, 21357=>16506, 57455=>16506, 21364=>16507, 57456=>16507, 165547=>16508, 57457=>16508, 21374=>16509, 57458=>16509, 194610=>16510, 136598=>16511, 57460=>16511, 136723=>16512, 57461=>16512, 30694=>16513, 57462=>16513, 21395=>16514, 57463=>16514, 166555=>16515, 57464=>16515, 21408=>16516, 57465=>16516, 21419=>16517, 57466=>16517, 21422=>16518, 57467=>16518, 29607=>16519, 57468=>16519, 153458=>16520, 57469=>16520, 16217=>16521, 57470=>16521, 29596=>16522, 57471=>16522, 21441=>16523, 57472=>16523, 21445=>16524, 57473=>16524, 27721=>16525, 57474=>16525, 20041=>16526, 57475=>16526, 22526=>16527, 57476=>16527, 21465=>16528, 57477=>16528, 15019=>16529, 57478=>16529, 134031=>16530, 57479=>16530, 21472=>16531, 57480=>16531, 147435=>16532, 57481=>16532, 142755=>16533, 57482=>16533, 21494=>16534, 57483=>16534, 134263=>16535, 57484=>16535, 21523=>16536, 57485=>16536, 28793=>16537, 57486=>16537, 21803=>16538, 57487=>16538, 26199=>16539, 57488=>16539, 27995=>16540, 57489=>16540, 21613=>16541, 57490=>16541, 158547=>16542, 57491=>16542, 134516=>16543, 57492=>16543, 21853=>16544, 57493=>16544, 21647=>16545, 57494=>16545, 21668=>16546, 57495=>16546, 18342=>16547, 57496=>16547, 136973=>16548, 57497=>16548, 134877=>16549, 57498=>16549, 15796=>16550, 57499=>16550, 134477=>16551, 57500=>16551, 166332=>16552, 57501=>16552, 140952=>16553, 57502=>16553, 21831=>16554, 57503=>16554, 19693=>16555, 57504=>16555, 21551=>16556, 57505=>16556, 29719=>16557, 57506=>16557, 21894=>16558, 57507=>16558, 21929=>16559, 57508=>16559, 137431=>16561, 57510=>16561, 147514=>16562, 57511=>16562, 17746=>16563, 57512=>16563, 148533=>16564, 57513=>16564, 26291=>16565, 57514=>16565, 135348=>16566, 57515=>16566, 22071=>16567, 57516=>16567, 26317=>16568, 57517=>16568, 144010=>16569, 57518=>16569, 26276=>16570, 57519=>16570, 22093=>16572, 57521=>16572, 22095=>16573, 57522=>16573, 30961=>16574, 57523=>16574, 22257=>16575, 57524=>16575, 38791=>16576, 57525=>16576, 21502=>16577, 57526=>16577, 22272=>16578, 57527=>16578, 22255=>16579, 57528=>16579, 22253=>16580, 57529=>16580, 166758=>16581, 57530=>16581, 13859=>16582, 57531=>16582, 135759=>16583, 57532=>16583, 22342=>16584, 57533=>16584, 147877=>16585, 57534=>16585, 27758=>16586, 57535=>16586, 28811=>16587, 57536=>16587, 22338=>16588, 57537=>16588, 14001=>16589, 57538=>16589, 158846=>16590, 57539=>16590, 22502=>16591, 57540=>16591, 136214=>16592, 57541=>16592, 22531=>16593, 57542=>16593, 136276=>16594, 57543=>16594, 148323=>16595, 57544=>16595, 22566=>16596, 57545=>16596, 150517=>16597, 57546=>16597, 22559=>16598, 22698=>16599, 57548=>16599, 13665=>16600, 57549=>16600, 22752=>16601, 57550=>16601, 22748=>16602, 57551=>16602, 135740=>16603, 57552=>16603, 22779=>16604, 57553=>16604, 23551=>16605, 57554=>16605, 22339=>16606, 57555=>16606, 172368=>16607, 57556=>16607, 148088=>16608, 57557=>16608, 37843=>16609, 57558=>16609, 13729=>16610, 57559=>16610, 22815=>16611, 57560=>16611, 26790=>16612, 57561=>16612, 14019=>16613, 57562=>16613, 28249=>16614, 57563=>16614, 136766=>16615, 57564=>16615, 23076=>16616, 57565=>16616, 136850=>16618, 57567=>16618, 34053=>16619, 57568=>16619, 22985=>16620, 57569=>16620, 134478=>16621, 57570=>16621, 158849=>16622, 57571=>16622, 159018=>16623, 57572=>16623, 137180=>16624, 57573=>16624, 23001=>16625, 57574=>16625, 137211=>16626, 57575=>16626, 137138=>16627, 57576=>16627, 159142=>16628, 57577=>16628, 28017=>16629, 57578=>16629, 137256=>16630, 57579=>16630, 136917=>16631, 57580=>16631, 23033=>16632, 57581=>16632, 159301=>16633, 57582=>16633, 23211=>16634, 57583=>16634, 23139=>16635, 57584=>16635, 14054=>16636, 57585=>16636, 149929=>16637, 57586=>16637, 14088=>16639, 57588=>16639, 23190=>16640, 57589=>16640, 29797=>16641, 57590=>16641, 23251=>16642, 57591=>16642, 159649=>16643, 57592=>16643, 140628=>16644, 57593=>16644, 137489=>16645, 57595=>16645, 14130=>16646, 57596=>16646, 136888=>16647, 57597=>16647, 24195=>16648, 57598=>16648, 21200=>16649, 57599=>16649, 23414=>16650, 57600=>16650, 25992=>16651, 57601=>16651, 23420=>16652, 57602=>16652, 162318=>16653, 57603=>16653, 16388=>16654, 57604=>16654, 18525=>16655, 57605=>16655, 131588=>16656, 57606=>16656, 23509=>16657, 57607=>16657, 137780=>16658, 57609=>16658, 154060=>16659, 57610=>16659, 132517=>16660, 57611=>16660, 23539=>16661, 57612=>16661, 23453=>16662, 57613=>16662, 19728=>16663, 57614=>16663, 23557=>16664, 57615=>16664, 138052=>16665, 57616=>16665, 23571=>16666, 57617=>16666, 29646=>16667, 57618=>16667, 23572=>16668, 57619=>16668, 138405=>16669, 57620=>16669, 158504=>16670, 57621=>16670, 23625=>16671, 57622=>16671, 18653=>16672, 57623=>16672, 23685=>16673, 57624=>16673, 23785=>16674, 57625=>16674, 23791=>16675, 57626=>16675, 23947=>16676, 57627=>16676, 138745=>16677, 57628=>16677, 138807=>16678, 57629=>16678, 23824=>16679, 57630=>16679, 23832=>16680, 57631=>16680, 23878=>16681, 57632=>16681, 138916=>16682, 57633=>16682, 23738=>16683, 57634=>16683, 24023=>16684, 57635=>16684, 33532=>16685, 57636=>16685, 14381=>16686, 57637=>16686, 149761=>16687, 57638=>16687, 139337=>16688, 57639=>16688, 139635=>16689, 57640=>16689, 33415=>16690, 57641=>16690, 14390=>16691, 57642=>16691, 15298=>16692, 57643=>16692, 24110=>16693, 57644=>16693, 27274=>16694, 57645=>16694, 57647=>16696, 148668=>16697, 57648=>16697, 134355=>16698, 57649=>16698, 21414=>16699, 57650=>16699, 20151=>16700, 57651=>16700, 21416=>16702, 57653=>16702, 137073=>16703, 57654=>16703, 24073=>16704, 57655=>16704, 57656=>16705, 164994=>16706, 57657=>16706, 24313=>16707, 57658=>16707, 24315=>16708, 57659=>16708, 14496=>16709, 57660=>16709, 24316=>16710, 57661=>16710, 26686=>16711, 57662=>16711, 37915=>16712, 57663=>16712, 24333=>16713, 57664=>16713, 131521=>16714, 57665=>16714, 194708=>16715, 57666=>16715, 15070=>16716, 57667=>16716, 135994=>16717, 57669=>16717, 24378=>16718, 57670=>16718, 157832=>16719, 57671=>16719, 140240=>16720, 57672=>16720, 140401=>16721, 57674=>16721, 24419=>16722, 57675=>16722, 159342=>16723, 57677=>16723, 24434=>16724, 57678=>16724, 37696=>16725, 57679=>16725, 166454=>16726, 57680=>16726, 24487=>16727, 57681=>16727, 23990=>16728, 57682=>16728, 15711=>16729, 57683=>16729, 152144=>16730, 57684=>16730, 139114=>16731, 57685=>16731, 159992=>16732, 57686=>16732, 140904=>16733, 57687=>16733, 37334=>16734, 57688=>16734, 131742=>16735, 57689=>16735, 166441=>16736, 57690=>16736, 24625=>16737, 57691=>16737, 26245=>16738, 57692=>16738, 14691=>16739, 57694=>16739, 15815=>16740, 57695=>16740, 13881=>16741, 57696=>16741, 22416=>16742, 57697=>16742, 141236=>16743, 57698=>16743, 31089=>16744, 57699=>16744, 15936=>16745, 57700=>16745, 24734=>16746, 57701=>16746, 24810=>16748, 149890=>16749, 57704=>16749, 149903=>16750, 57705=>16750, 162387=>16751, 57706=>16751, 29860=>16752, 57707=>16752, 20705=>16753, 57708=>16753, 23200=>16754, 57709=>16754, 24932=>16755, 57710=>16755, 24898=>16756, 57712=>16756, 194726=>16757, 57713=>16757, 159442=>16758, 57714=>16758, 24961=>16759, 57715=>16759, 20980=>16760, 57716=>16760, 132694=>16761, 57717=>16761, 24967=>16762, 57718=>16762, 23466=>16763, 57719=>16763, 147383=>16764, 57720=>16764, 141407=>16765, 57721=>16765, 25043=>16766, 57722=>16766, 166813=>16767, 57723=>16767, 170333=>16768, 57724=>16768, 25040=>16769, 57725=>16769, 14642=>16770, 57726=>16770, 141696=>16771, 57727=>16771, 141505=>16772, 57728=>16772, 24611=>16773, 57729=>16773, 24924=>16774, 57730=>16774, 25886=>16775, 57731=>16775, 25483=>16776, 57732=>16776, 131352=>16777, 57733=>16777, 25285=>16778, 57734=>16778, 137072=>16779, 57735=>16779, 25301=>16780, 57736=>16780, 142861=>16781, 57737=>16781, 25452=>16782, 57738=>16782, 149983=>16783, 57739=>16783, 14871=>16784, 57740=>16784, 25656=>16785, 57741=>16785, 25592=>16786, 57742=>16786, 136078=>16787, 57743=>16787, 137212=>16788, 57744=>16788, 28554=>16789, 57746=>16789, 142902=>16790, 57747=>16790, 153373=>16792, 57750=>16792, 25825=>16793, 57751=>16793, 25829=>16794, 57752=>16794, 38011=>16795, 57753=>16795, 14950=>16796, 57754=>16796, 25658=>16797, 57755=>16797, 14935=>16798, 57756=>16798, 25933=>16799, 57757=>16799, 28438=>16800, 57758=>16800, 150056=>16801, 57759=>16801, 150051=>16802, 57760=>16802, 25989=>16803, 57761=>16803, 25965=>16804, 57762=>16804, 25951=>16805, 57763=>16805, 26037=>16807, 57765=>16807, 149824=>16808, 57766=>16808, 19255=>16809, 57767=>16809, 26065=>16810, 57768=>16810, 16600=>16811, 57769=>16811, 137257=>16812, 57770=>16812, 57771=>16813, 26083=>16814, 57772=>16814, 24543=>16815, 57773=>16815, 144384=>16816, 57774=>16816, 26136=>16817, 57775=>16817, 57776=>16818, 143863=>16818, 57777=>16819, 143864=>16819, 26180=>16820, 57778=>16820, 57779=>16821, 143780=>16821, 57780=>16822, 143781=>16822, 26187=>16823, 57781=>16823, 134773=>16824, 57782=>16824, 26215=>16825, 57783=>16825, 152038=>16826, 57784=>16826, 26227=>16827, 57785=>16827, 64018=>16828, 143921=>16829, 57788=>16829, 165364=>16830, 57789=>16830, 143816=>16831, 57790=>16831, 152339=>16832, 57791=>16832, 30661=>16833, 57792=>16833, 141559=>16834, 57793=>16834, 39332=>16835, 57794=>16835, 26370=>16836, 57795=>16836, 148380=>16837, 57796=>16837, 150049=>16838, 57797=>16838, 27130=>16839, 57799=>16839, 145346=>16840, 57800=>16840, 194779=>16841, 26471=>16842, 57802=>16842, 26466=>16843, 57803=>16843, 147917=>16844, 57804=>16844, 168173=>16845, 57805=>16845, 26583=>16846, 57806=>16846, 17641=>16847, 57807=>16847, 26658=>16848, 57808=>16848, 28240=>16849, 57809=>16849, 37436=>16850, 57810=>16850, 26625=>16851, 57811=>16851, 144358=>16852, 57812=>16852, 159136=>16853, 57813=>16853, 26717=>16854, 57814=>16854, 144495=>16855, 57815=>16855, 27105=>16856, 57816=>16856, 27147=>16857, 57817=>16857, 166623=>16858, 57818=>16858, 26995=>16859, 57819=>16859, 26819=>16860, 57820=>16860, 144845=>16861, 57821=>16861, 26881=>16862, 57822=>16862, 26880=>16863, 57823=>16863, 14849=>16864, 57825=>16864, 144956=>16865, 57826=>16865, 15232=>16866, 57827=>16866, 26540=>16867, 57828=>16867, 26977=>16868, 57829=>16868, 166474=>16869, 57830=>16869, 17148=>16870, 57831=>16870, 26934=>16871, 57832=>16871, 27032=>16872, 57833=>16872, 15265=>16873, 57834=>16873, 132041=>16874, 57835=>16874, 33635=>16875, 57836=>16875, 20624=>16876, 57837=>16876, 27129=>16877, 57838=>16877, 144985=>16878, 57839=>16878, 139562=>16879, 57840=>16879, 27205=>16880, 57841=>16880, 145155=>16881, 57842=>16881, 27293=>16882, 57843=>16882, 15347=>16883, 57844=>16883, 26545=>16884, 57845=>16884, 27336=>16885, 57846=>16885, 168348=>16886, 57847=>16886, 15373=>16887, 57848=>16887, 27421=>16888, 57849=>16888, 133411=>16889, 57850=>16889, 24798=>16890, 60308=>16890, 57851=>16890, 27445=>16891, 57852=>16891, 27508=>16892, 57853=>16892, 141261=>16893, 57854=>16893, 28341=>16894, 57855=>16894, 57856=>16895, 146139=>16895, 137560=>16897, 57858=>16897, 14144=>16898, 57859=>16898, 21537=>16899, 57860=>16899, 146266=>16900, 57861=>16900, 27617=>16901, 57862=>16901, 147196=>16902, 57863=>16902, 27612=>16903, 57864=>16903, 27703=>16904, 57865=>16904, 140427=>16905, 57866=>16905, 149745=>16906, 57867=>16906, 158545=>16907, 57868=>16907, 27738=>16908, 57869=>16908, 33318=>16909, 57870=>16909, 27769=>16910, 57871=>16910, 146876=>16911, 57872=>16911, 17605=>16912, 57873=>16912, 146877=>16913, 57874=>16913, 147876=>16914, 57875=>16914, 149772=>16915, 57876=>16915, 149760=>16916, 57877=>16916, 146633=>16917, 57878=>16917, 14053=>16918, 57879=>16918, 15595=>16919, 57880=>16919, 134450=>16920, 57881=>16920, 39811=>16921, 57882=>16921, 143865=>16922, 57883=>16922, 140433=>16923, 57884=>16923, 32655=>16924, 57885=>16924, 26679=>16925, 57886=>16925, 159013=>16926, 57887=>16926, 159137=>16927, 57888=>16927, 159211=>16928, 57889=>16928, 28054=>16929, 57890=>16929, 27996=>16930, 57891=>16930, 28284=>16931, 57892=>16931, 28420=>16932, 57893=>16932, 149887=>16933, 57894=>16933, 147589=>16934, 57895=>16934, 159346=>16935, 57896=>16935, 34099=>16936, 57897=>16936, 159604=>16937, 57898=>16937, 20935=>16938, 57899=>16938, 33838=>16941, 57902=>16941, 166689=>16942, 57903=>16942, 194824=>16943, 146991=>16944, 57905=>16944, 29779=>16945, 57906=>16945, 147330=>16946, 57907=>16946, 31180=>16947, 57908=>16947, 28239=>16948, 57909=>16948, 23185=>16949, 57910=>16949, 143435=>16950, 57911=>16950, 28664=>16951, 57912=>16951, 14093=>16952, 57913=>16952, 28573=>16953, 57914=>16953, 146992=>16954, 57915=>16954, 28410=>16955, 57916=>16955, 136343=>16956, 57917=>16956, 147517=>16957, 57918=>16957, 17749=>16958, 57919=>16958, 37872=>16959, 57920=>16959, 28484=>16960, 57921=>16960, 28508=>16961, 57922=>16961, 15694=>16962, 57923=>16962, 28532=>16963, 57924=>16963, 168304=>16964, 57925=>16964, 15675=>16965, 57926=>16965, 28575=>16966, 57927=>16966, 147780=>16967, 57928=>16967, 28627=>16968, 57929=>16968, 147601=>16969, 57930=>16969, 147797=>16970, 57931=>16970, 147513=>16971, 57932=>16971, 147440=>16972, 57933=>16972, 147380=>16973, 57934=>16973, 147775=>16974, 57935=>16974, 20959=>16975, 57936=>16975, 57937=>16976, 147798=>16976, 57938=>16977, 147799=>16977, 147776=>16978, 57939=>16978, 156125=>16979, 57940=>16979, 28747=>16980, 57941=>16980, 28798=>16981, 57942=>16981, 28839=>16982, 57943=>16982, 28876=>16984, 57945=>16984, 28885=>16985, 57946=>16985, 28886=>16986, 57947=>16986, 28895=>16987, 57948=>16987, 16644=>16988, 57949=>16988, 15848=>16989, 57950=>16989, 29108=>16990, 57951=>16990, 29078=>16991, 57952=>16991, 148087=>16992, 57953=>16992, 28971=>16993, 57954=>16993, 28997=>16994, 57955=>16994, 23176=>16995, 57956=>16995, 29002=>16996, 57957=>16996, 64072=>16997, 148325=>16998, 57960=>16998, 29007=>16999, 57961=>16999, 37730=>17000, 57962=>17000, 148161=>17001, 57963=>17001, 28972=>17002, 57964=>17002, 148570=>17003, 57965=>17003, 150055=>17004, 57966=>17004, 150050=>17005, 57967=>17005, 29114=>17006, 57968=>17006, 166888=>17007, 57969=>17007, 28861=>17008, 57970=>17008, 29198=>17009, 57971=>17009, 37954=>17010, 57972=>17010, 29205=>17011, 57973=>17011, 22801=>17012, 57974=>17012, 37955=>17013, 57975=>17013, 29220=>17014, 57976=>17014, 37697=>17015, 57977=>17015, 153093=>17016, 57978=>17016, 29230=>17017, 57979=>17017, 29248=>17018, 57980=>17018, 149876=>17019, 57981=>17019, 26813=>17020, 57982=>17020, 29269=>17021, 57983=>17021, 29271=>17022, 57984=>17022, 15957=>17023, 57985=>17023, 143428=>17024, 57986=>17024, 26637=>17025, 57987=>17025, 28477=>17026, 57988=>17026, 29314=>17027, 57989=>17027, 29483=>17029, 57991=>17029, 149539=>17030, 57992=>17030, 165931=>17031, 57993=>17031, 18669=>17032, 57994=>17032, 165892=>17033, 57995=>17033, 29480=>17034, 57996=>17034, 29486=>17035, 57997=>17035, 29647=>17036, 57998=>17036, 29610=>17037, 57999=>17037, 134202=>17038, 58000=>17038, 158254=>17039, 58001=>17039, 29641=>17040, 58002=>17040, 29769=>17041, 58003=>17041, 147938=>17042, 58004=>17042, 136935=>17043, 58005=>17043, 150052=>17044, 58006=>17044, 26147=>17045, 58007=>17045, 14021=>17046, 58008=>17046, 149943=>17047, 58009=>17047, 149901=>17048, 58010=>17048, 150011=>17049, 58011=>17049, 29687=>17050, 58012=>17050, 29717=>17051, 58013=>17051, 26883=>17052, 58014=>17052, 150054=>17053, 58015=>17053, 29753=>17054, 58016=>17054, 16087=>17055, 58018=>17055, 194863=>17056, 141485=>17057, 58020=>17057, 29792=>17058, 58021=>17058, 167602=>17059, 58022=>17059, 29767=>17060, 58023=>17060, 29668=>17061, 58024=>17061, 29814=>17062, 58025=>17062, 33721=>17063, 58026=>17063, 29804=>17064, 58027=>17064, 29812=>17065, 58029=>17065, 37873=>17066, 58030=>17066, 27180=>17067, 58031=>17067, 29826=>17068, 58032=>17068, 18771=>17069, 58033=>17069, 150156=>17070, 58034=>17070, 147807=>17071, 58035=>17071, 150137=>17072, 58036=>17072, 166799=>17073, 58037=>17073, 23366=>17074, 58038=>17074, 166915=>17075, 58039=>17075, 137374=>17076, 58040=>17076, 29896=>17077, 58041=>17077, 137608=>17078, 58042=>17078, 29966=>17079, 58043=>17079, 29982=>17080, 58045=>17080, 167641=>17081, 58046=>17081, 137803=>17082, 58047=>17082, 23511=>17083, 58048=>17083, 167596=>17084, 58049=>17084, 37765=>17085, 58050=>17085, 30029=>17086, 58051=>17086, 30026=>17087, 58052=>17087, 30055=>17088, 58053=>17088, 30062=>17089, 58054=>17089, 151426=>17090, 58055=>17090, 16132=>17091, 58056=>17091, 150803=>17092, 58057=>17092, 30094=>17093, 58058=>17093, 29789=>17094, 58059=>17094, 30110=>17095, 58060=>17095, 30132=>17096, 58061=>17096, 30210=>17097, 58062=>17097, 30252=>17098, 58063=>17098, 30289=>17099, 58064=>17099, 30287=>17100, 58065=>17100, 30319=>17101, 58066=>17101, 58067=>17102, 156661=>17103, 58068=>17103, 30352=>17104, 58069=>17104, 33263=>17105, 58070=>17105, 14328=>17106, 58071=>17106, 157969=>17107, 58072=>17107, 157966=>17108, 58073=>17108, 30369=>17109, 58074=>17109, 30373=>17110, 58075=>17110, 30391=>17111, 58076=>17111, 30412=>17112, 58077=>17112, 159647=>17113, 58078=>17113, 33890=>17114, 58079=>17114, 151709=>17115, 58080=>17115, 151933=>17116, 58081=>17116, 138780=>17117, 58082=>17117, 30494=>17118, 58083=>17118, 30502=>17119, 58084=>17119, 30528=>17120, 58085=>17120, 25775=>17121, 58086=>17121, 152096=>17122, 58087=>17122, 30552=>17123, 58088=>17123, 144044=>17124, 58089=>17124, 30639=>17125, 58090=>17125, 166244=>17126, 58091=>17126, 166248=>17127, 58092=>17127, 136897=>17128, 58093=>17128, 30708=>17129, 58094=>17129, 26826=>17131, 58098=>17131, 30895=>17132, 58099=>17132, 30919=>17133, 58100=>17133, 30931=>17134, 58101=>17134, 38565=>17135, 58102=>17135, 31022=>17136, 58103=>17136, 153056=>17137, 58104=>17137, 30935=>17138, 58105=>17138, 31028=>17139, 58106=>17139, 30897=>17140, 58107=>17140, 161292=>17141, 58108=>17141, 36792=>17142, 58109=>17142, 34948=>17143, 58110=>17143, 140828=>17144, 58113=>17144, 31110=>17145, 58114=>17145, 35072=>17146, 58115=>17146, 26882=>17147, 58116=>17147, 31104=>17148, 58117=>17148, 153687=>17149, 58118=>17149, 31133=>17150, 58119=>17150, 162617=>17151, 58120=>17151, 31036=>17152, 58121=>17152, 31145=>17153, 58122=>17153, 28202=>17154, 58123=>17154, 160038=>17155, 58124=>17155, 16040=>17156, 58125=>17156, 31174=>17157, 58126=>17157, 168205=>17158, 58127=>17158, 31188=>17159, 58128=>17159, 21797=>17161, 62526=>17161, 134210=>17163, 62528=>17163, 134421=>17164, 62529=>17164, 151851=>17165, 62530=>17165, 21904=>17166, 62531=>17166, 142534=>17167, 62532=>17167, 14828=>17168, 62533=>17168, 131905=>17169, 62534=>17169, 36422=>17170, 62535=>17170, 150968=>17171, 62536=>17171, 169189=>17172, 62537=>17172, 164030=>17174, 62539=>17174, 30586=>17175, 62540=>17175, 142392=>17176, 62541=>17176, 14900=>17177, 62542=>17177, 18389=>17178, 62543=>17178, 164189=>17179, 62544=>17179, 158194=>17180, 62545=>17180, 151018=>17181, 62546=>17181, 25821=>17182, 62547=>17182, 134524=>17183, 62548=>17183, 135092=>17184, 62549=>17184, 134357=>17185, 62550=>17185, 25741=>17187, 62552=>17187, 36478=>17188, 62553=>17188, 134806=>17189, 62554=>17189, 135012=>17191, 62556=>17191, 142505=>17192, 62557=>17192, 164438=>17193, 62558=>17193, 148691=>17194, 62559=>17194, 134470=>17196, 62561=>17196, 170573=>17197, 62562=>17197, 164073=>17198, 62563=>17198, 18420=>17199, 62564=>17199, 151207=>17200, 62565=>17200, 142530=>17201, 62566=>17201, 39602=>17202, 62567=>17202, 14951=>17203, 62568=>17203, 169460=>17204, 62569=>17204, 16365=>17205, 62570=>17205, 13574=>17206, 62571=>17206, 152263=>17207, 62572=>17207, 169940=>17208, 62573=>17208, 142660=>17210, 62575=>17210, 40302=>17211, 62576=>17211, 38933=>17212, 62577=>17212, 17369=>17214, 62579=>17214, 25780=>17216, 62581=>17216, 21731=>17217, 62582=>17217, 62584=>17219, 142282=>17219, 14843=>17221, 62586=>17221, 157402=>17223, 62588=>17223, 157462=>17224, 62589=>17224, 162208=>17225, 62590=>17225, 25834=>17226, 62591=>17226, 151634=>17227, 62592=>17227, 134211=>17228, 62593=>17228, 36456=>17229, 62594=>17229, 166732=>17231, 62596=>17231, 132913=>17232, 62597=>17232, 18443=>17234, 62599=>17234, 131497=>17235, 62600=>17235, 16378=>17236, 62601=>17236, 22643=>17237, 62602=>17237, 142733=>17238, 62603=>17238, 148936=>17240, 62605=>17240, 132348=>17241, 62606=>17241, 155799=>17242, 62607=>17242, 134988=>17243, 62608=>17243, 21881=>17245, 62610=>17245, 17338=>17247, 62612=>17247, 19124=>17249, 62614=>17249, 141926=>17250, 62615=>17250, 135325=>17251, 62616=>17251, 33194=>17252, 62617=>17252, 39157=>17253, 62618=>17253, 134556=>17254, 62619=>17254, 25465=>17255, 62620=>17255, 14846=>17256, 62621=>17256, 141173=>17257, 62622=>17257, 36288=>17258, 62623=>17258, 22177=>17259, 62624=>17259, 25724=>17260, 62625=>17260, 15939=>17261, 62626=>17261, 173569=>17263, 62628=>17263, 134665=>17264, 62629=>17264, 142031=>17265, 62630=>17265, 135368=>17268, 62633=>17268, 145858=>17269, 62634=>17269, 14738=>17270, 62635=>17270, 14854=>17271, 62636=>17271, 164507=>17272, 62637=>17272, 13688=>17273, 62638=>17273, 155209=>17274, 62639=>17274, 139463=>17275, 62640=>17275, 142514=>17278, 62643=>17278, 169760=>17279, 62644=>17279, 13500=>17280, 62645=>17280, 27709=>17281, 62646=>17281, 151099=>17282, 62647=>17282, 161140=>17285, 62650=>17285, 142987=>17286, 62651=>17286, 139784=>17287, 62652=>17287, 173659=>17288, 62653=>17288, 167117=>17289, 62654=>17289, 134778=>17290, 62655=>17290, 134196=>17291, 62656=>17291, 161337=>17292, 62683=>17292, 142286=>17293, 62684=>17293, 62687=>17294, 142417=>17294, 14872=>17295, 62689=>17295, 62691=>17296, 135367=>17296, 62693=>17297, 173618=>17297, 167122=>17298, 62695=>17298, 167321=>17299, 62696=>17299, 167114=>17300, 62697=>17300, 38314=>17301, 62698=>17301, 62706=>17303, 161630=>17303, 28992=>17304, 62708=>17304, 20822=>17306, 62385=>17306, 20222=>17307, 20616=>17308, 62487=>17308, 13459=>17310, 62489=>17310, 20870=>17311, 62491=>17311, 24130=>17312, 63037=>17312, 20997=>17313, 62495=>17313, 21031=>17314, 62436=>17314, 21113=>17315, 62497=>17315, 194600=>17316, 13651=>17317, 62504=>17317, 21442=>17318, 62505=>17318, 21343=>17319, 62715=>17319, 21823=>17321, 62520=>17321, 21976=>17323, 59986=>17323, 13789=>17324, 62722=>17324, 22049=>17325, 63067=>17325, 22100=>17327, 60044=>17327, 60148=>17328, 135291=>17328, 60153=>17330, 135379=>17330, 61095=>17332, 135934=>17332, 14265=>17335, 60104=>17335, 23745=>17336, 61099=>17336, 23829=>17337, 63066=>17337, 23894=>17338, 63030=>17338, 14392=>17339, 63036=>17339, 20097=>17340, 62477=>17340, 24253=>17341, 63038=>17341, 14612=>17342, 63042=>17342, 25017=>17343, 63050=>17343, 25232=>17344, 63054=>17344, 25368=>17345, 63056=>17345, 25690=>17346, 63063=>17346, 25745=>17347, 62381=>17347, 33133=>17348, 62709=>17348, 33156=>17349, 59922=>17349, 33171=>17350, 59924=>17350, 26624=>17351, 63080=>17351, 15292=>17352, 63093=>17352, 29327=>17353, 60517=>17353, 29389=>17354, 59781=>17354, 149487=>17355, 29497=>17356, 59785=>17356, 30018=>17357, 59811=>17357, 30172=>17358, 59817=>17358, 16320=>17359, 59818=>17359, 60278=>17360, 151205=>17360, 16343=>17361, 59820=>17361, 30336=>17363, 30348=>17364, 59824=>17364, 151388=>17364, 16552=>17365, 59845=>17365, 30777=>17366, 59846=>17366, 16643=>17367, 59855=>17367, 31377=>17368, 59863=>17368, 31771=>17369, 59876=>17369, 31981=>17370, 59884=>17370, 32659=>17371, 62658=>17371, 32686=>17372, 59892=>17372, 33535=>17374, 59936=>17374, 22623=>17375, 59981=>17375, 34482=>17376, 59960=>17376, 17836=>17377, 34699=>17378, 59963=>17378, 35143=>17379, 59969=>17379, 35369=>17381, 59972=>17381, 36465=>17383, 59988=>17383, 60484=>17384, 164233=>17384, 36528=>17385, 59990=>17385, 37214=>17387, 62443=>17387, 37260=>17388, 62441=>17388, 39182=>17389, 60051=>17389, 39196=>17390, 60054=>17390, 39809=>17393, 60066=>17393, 40384=>17394, 60080=>17394, 40339=>17395, 60078=>17395, 40620=>17396, 60085=>17396, 19857=>17397, 60540=>17397, 37818=>17399, 40571=>17400, 60084=>17400, 28809=>17401, 63148=>17401, 29512=>17402, 59788=>17402, 31129=>17404, 59858=>17404, 36791=>17405, 59997=>17405, 39234=>17407, 60056=>17407, 8364=>17601, 12443=>17606, 63518=>17606, 12444=>17607, 63519=>17607, 11904=>17608, 63520=>17608, 12736=>17609, 62211=>17609, 12737=>17610, 62212=>17610, 12738=>17611, 62213=>17611, 12739=>17612, 62214=>17612, 12740=>17613, 62215=>17613, 131340=>17614, 62216=>17614, 12741=>17615, 62217=>17615, 131281=>17616, 62218=>17616, 131277=>17617, 62219=>17617, 12742=>17618, 62220=>17618, 12743=>17619, 62221=>17619, 131275=>17620, 62222=>17620, 139240=>17621, 62223=>17621, 12744=>17622, 62224=>17622, 131274=>17623, 62225=>17623, 12745=>17624, 62226=>17624, 12746=>17625, 62227=>17625, 12747=>17626, 62228=>17626, 12748=>17627, 62229=>17627, 131342=>17628, 62230=>17628, 12749=>17629, 62231=>17629, 12750=>17630, 62232=>17630, 62776=>17631, 62777=>17632, 138177=>17633, 62778=>17633, 194680=>17634, 62779=>17634, 12205=>17635, 38737=>17635, 62780=>17635, 131206=>17636, 62781=>17636, 20059=>17637, 62782=>17637, 20155=>17638, 62783=>17638, 13630=>17639, 62784=>17639, 23587=>17640, 62785=>17640, 24401=>17641, 62786=>17641, 24516=>17642, 62787=>17642, 14586=>17643, 62788=>17643, 25164=>17644, 62789=>17644, 25909=>17645, 62790=>17645, 27514=>17646, 62791=>17646, 27701=>17647, 62792=>17647, 27706=>17648, 62793=>17648, 28780=>17649, 62794=>17649, 29227=>17650, 62795=>17650, 20012=>17651, 62796=>17651, 29357=>17652, 62797=>17652, 149737=>17653, 62798=>17653, 32594=>17654, 62799=>17654, 31035=>17655, 62800=>17655, 31993=>17656, 62801=>17656, 32595=>17657, 62802=>17657, 156266=>17658, 62803=>17658, 13505=>17659, 62804=>17659, 156491=>17660, 62806=>17660, 32770=>17661, 62807=>17661, 32896=>17662, 62808=>17662, 157202=>17663, 62809=>17663, 158033=>17664, 62810=>17664, 21341=>17665, 62811=>17665, 34916=>17666, 62812=>17666, 35265=>17667, 62813=>17667, 161970=>17668, 62814=>17668, 35744=>17669, 62815=>17669, 36125=>17670, 62816=>17670, 38021=>17671, 62817=>17671, 38264=>17672, 62818=>17672, 38271=>17673, 62819=>17673, 38376=>17674, 62820=>17674, 167439=>17675, 62821=>17675, 38886=>17676, 62822=>17676, 39029=>17677, 62823=>17677, 39118=>17678, 62824=>17678, 39134=>17679, 62825=>17679, 39267=>17680, 62826=>17680, 170000=>17681, 62827=>17681, 40060=>17682, 62828=>17682, 40479=>17683, 62829=>17683, 40644=>17684, 62830=>17684, 27503=>17685, 62831=>17685, 63751=>17686, 62832=>17686, 20023=>17687, 62833=>17687, 131207=>17688, 62834=>17688, 38429=>17689, 62835=>17689, 25143=>17690, 62836=>17690, 38050=>17691, 62837=>17691, 11908=>17692, 63521=>17692, 11910=>17693, 63522=>17693, 11911=>17694, 63523=>17694, 11912=>17695, 63524=>17695, 11914=>17696, 63525=>17696, 11916=>17697, 63526=>17697, 11917=>17698, 63527=>17698, 11925=>17699, 63528=>17699, 11932=>17700, 63529=>17700, 11941=>17701, 63531=>17701, 11943=>17702, 63532=>17702, 11946=>17703, 63533=>17703, 11948=>17704, 63534=>17704, 11950=>17705, 63535=>17705, 11958=>17706, 63536=>17706, 11964=>17707, 63537=>17707, 11966=>17708, 63538=>17708, 11978=>17709, 63540=>17709, 11980=>17710, 63541=>17710, 11981=>17711, 63542=>17711, 11983=>17712, 63543=>17712, 11990=>17713, 63544=>17713, 11991=>17714, 63545=>17714, 11998=>17715, 63546=>17715, 172969=>17716, 62368=>17716, 135493=>17717, 62369=>17717, 25866=>17718, 62371=>17718, 20029=>17719, 62374=>17719, 28381=>17720, 62375=>17720, 40270=>17721, 62376=>17721, 37343=>17722, 62377=>17722, 62380=>17723, 161589=>17723, 20250=>17724, 62382=>17724, 20264=>17725, 62383=>17725, 20392=>17726, 62384=>17726, 20852=>17727, 62386=>17727, 20892=>17728, 62387=>17728, 20964=>17729, 62388=>17729, 21153=>17730, 62389=>17730, 21160=>17731, 62390=>17731, 21307=>17732, 62391=>17732, 21326=>17733, 62392=>17733, 21457=>17734, 62393=>17734, 21464=>17735, 62394=>17735, 22242=>17736, 62395=>17736, 22768=>17737, 62396=>17737, 22788=>17738, 62397=>17738, 22791=>17739, 62398=>17739, 22834=>17740, 62399=>17740, 22836=>17741, 62400=>17741, 23398=>17742, 62401=>17742, 23454=>17743, 62402=>17743, 23455=>17744, 62403=>17744, 23706=>17745, 62404=>17745, 24198=>17746, 62405=>17746, 24635=>17747, 62406=>17747, 25993=>17748, 62407=>17748, 26622=>17749, 62408=>17749, 26628=>17750, 62409=>17750, 26725=>17751, 62410=>17751, 27982=>17752, 62411=>17752, 28860=>17753, 62412=>17753, 30005=>17754, 62413=>17754, 32420=>17755, 62414=>17755, 32428=>17756, 62415=>17756, 32442=>17757, 62416=>17757, 32455=>17758, 62417=>17758, 32463=>17759, 62418=>17759, 32479=>17760, 62419=>17760, 32518=>17761, 62420=>17761, 32567=>17762, 62421=>17762, 33402=>17763, 62422=>17763, 33487=>17764, 62423=>17764, 33647=>17765, 62424=>17765, 35270=>17766, 62425=>17766, 35774=>17767, 62426=>17767, 35810=>17768, 62427=>17768, 36710=>17769, 62428=>17769, 36711=>17770, 62429=>17770, 36718=>17771, 62430=>17771, 29713=>17772, 62431=>17772, 31996=>17773, 62432=>17773, 32205=>17774, 62433=>17774, 26950=>17775, 62434=>17775, 31433=>17776, 62435=>17776, 30904=>17777, 62442=>17777, 32956=>17778, 62444=>17778, 36107=>17779, 62446=>17779, 33014=>17780, 62447=>17780, 133607=>17781, 62448=>17781, 32927=>17782, 62451=>17782, 40647=>17783, 62452=>17783, 19661=>17784, 62453=>17784, 40393=>17785, 62454=>17785, 40460=>17786, 62455=>17786, 19518=>17787, 62456=>17787, 171510=>17788, 62457=>17788, 159758=>17789, 62458=>17789, 40458=>17790, 62459=>17790, 172339=>17791, 62460=>17791, 13761=>17792, 62461=>17792, 28314=>17793, 62463=>17793, 33342=>17794, 62464=>17794, 29977=>17795, 62465=>17795, 18705=>17796, 62467=>17796, 39532=>17797, 62468=>17797, 39567=>17798, 62469=>17798, 40857=>17799, 62470=>17799, 31111=>17800, 62471=>17800, 164972=>17801, 62472=>17801, 138698=>17802, 62473=>17802, 132560=>17803, 62474=>17803, 142054=>17804, 62475=>17804, 20004=>17805, 62476=>17805, 20096=>17806, 62478=>17806, 20103=>17807, 62479=>17807, 20159=>17808, 62480=>17808, 20203=>17809, 62481=>17809, 20279=>17810, 62482=>17810, 13388=>17811, 62483=>17811, 20413=>17812, 62484=>17812, 15944=>17813, 62485=>17813, 20483=>17814, 62486=>17814, 13437=>17815, 62488=>17815, 13477=>17816, 62490=>17816, 22789=>17817, 62492=>17817, 20955=>17818, 62493=>17818, 20988=>17819, 62494=>17819, 20105=>17820, 62496=>17820, 21136=>17821, 62498=>17821, 21287=>17822, 62499=>17822, 13767=>17823, 62500=>17823, 21417=>17824, 62501=>17824, 13649=>17825, 62502=>17825, 21424=>17826, 62503=>17826, 21539=>17827, 62506=>17827, 13677=>17828, 62507=>17828, 13682=>17829, 62508=>17829, 13953=>17830, 62509=>17830, 21651=>17831, 62510=>17831, 21667=>17832, 62511=>17832, 21684=>17833, 62512=>17833, 21689=>17834, 62513=>17834, 21712=>17835, 62514=>17835, 21743=>17836, 62515=>17836, 21784=>17837, 62516=>17837, 21795=>17838, 62517=>17838, 21800=>17839, 62518=>17839, 13720=>17840, 62519=>17840, 13733=>17841, 62521=>17841, 13759=>17842, 62522=>17842, 21975=>17843, 62523=>17843, 13765=>17844, 62524=>17844, 163204=>17845, 62525=>17845, 16467=>17846, 62538=>17846, 62551=>17847, 135412=>17847, 62555=>17848, 134155=>17848, 62574=>17849, 161992=>17849, 62580=>17850, 155813=>17850, 62583=>17851, 142668=>17851, 62585=>17852, 135287=>17852, 62587=>17853, 135279=>17853, 62595=>17854, 139681=>17854, 62609=>17855, 134550=>17855, 16571=>17856, 62611=>17856, 62631=>17857, 142537=>17857, 22098=>17858, 62641=>17858, 134961=>17859, 62642=>17859, 62657=>17860, 157724=>17860, 135375=>17861, 62659=>17861, 141315=>17862, 62660=>17862, 141625=>17863, 62661=>17863, 13819=>17864, 62662=>17864, 152035=>17865, 62663=>17865, 134796=>17866, 62664=>17866, 135053=>17867, 62665=>17867, 134826=>17868, 62666=>17868, 16275=>17869, 62667=>17869, 134960=>17870, 62668=>17870, 134471=>17871, 62669=>17871, 135503=>17872, 62670=>17872, 134732=>17873, 62671=>17873, 134827=>17874, 62673=>17874, 134057=>17875, 62674=>17875, 134472=>17876, 62675=>17876, 135360=>17877, 62676=>17877, 135485=>17878, 62677=>17878, 16377=>17879, 62678=>17879, 140950=>17880, 62679=>17880, 25650=>17881, 62680=>17881, 135085=>17882, 62681=>17882, 144372=>17883, 62682=>17883, 62685=>17884, 134526=>17884, 62686=>17885, 134527=>17885, 62688=>17886, 142421=>17886, 62690=>17887, 134808=>17887, 62692=>17888, 134958=>17888, 62694=>17889, 158544=>17889, 21708=>17890, 62699=>17890, 33476=>17891, 62700=>17891, 21945=>17892, 62701=>17892, 171715=>17893, 62703=>17893, 39974=>17894, 62704=>17894, 39606=>17895, 62705=>17895, 62707=>17896, 142830=>17896, 33004=>17897, 62710=>17897, 23580=>17898, 62711=>17898, 157042=>17899, 62712=>17899, 33076=>17900, 62713=>17900, 14231=>17901, 62714=>17901, 164029=>17902, 62716=>17902, 37302=>17903, 62717=>17903, 134906=>17904, 62718=>17904, 134671=>17905, 62719=>17905, 134775=>17906, 62720=>17906, 134907=>17907, 62721=>17907, 151019=>17908, 62723=>17908, 13833=>17909, 62724=>17909, 134358=>17910, 62725=>17910, 22191=>17911, 62726=>17911, 141237=>17912, 62727=>17912, 135369=>17913, 62728=>17913, 134672=>17914, 62729=>17914, 134776=>17915, 62730=>17915, 135288=>17916, 62731=>17916, 135496=>17917, 62732=>17917, 164359=>17918, 62733=>17918, 136277=>17919, 62734=>17919, 134777=>17920, 62735=>17920, 151120=>17921, 62736=>17921, 142756=>17922, 62737=>17922, 23124=>17923, 62738=>17923, 62739=>17924, 135197=>17924, 62740=>17925, 135198=>17925, 62741=>17926, 135413=>17926, 62742=>17927, 135414=>17927, 22428=>17928, 62743=>17928, 134673=>17929, 62744=>17929, 161428=>17930, 62745=>17930, 164557=>17931, 62746=>17931, 135093=>17932, 62747=>17932, 134779=>17933, 62748=>17933, 151934=>17934, 62749=>17934, 14083=>17935, 62750=>17935, 135094=>17936, 62751=>17936, 135552=>17937, 62752=>17937, 152280=>17938, 62753=>17938, 172733=>17939, 62754=>17939, 149978=>17940, 62755=>17940, 137274=>17941, 62756=>17941, 147831=>17942, 62757=>17942, 164476=>17943, 62758=>17943, 22681=>17944, 62759=>17944, 21096=>17945, 62760=>17945, 13850=>17946, 62761=>17946, 153405=>17947, 62762=>17947, 31666=>17948, 62763=>17948, 23400=>17949, 62764=>17949, 18432=>17950, 62765=>17950, 19244=>17951, 62766=>17951, 40743=>17952, 62767=>17952, 18919=>17953, 62768=>17953, 39967=>17954, 62769=>17954, 39821=>17955, 62770=>17955, 154484=>17956, 62771=>17956, 143677=>17957, 62772=>17957, 22011=>17958, 62773=>17958, 13810=>17959, 62774=>17959, 22153=>17960, 62775=>17960, 23870=>17961, 63028=>17961, 23880=>17962, 63029=>17962, 15868=>17963, 63031=>17963, 14351=>17964, 63032=>17964, 23972=>17965, 63033=>17965, 23993=>17966, 63034=>17966, 14368=>17967, 63035=>17967, 24357=>17968, 63039=>17968, 24451=>17969, 63040=>17969, 14600=>17970, 63041=>17970, 14655=>17971, 63043=>17971, 14669=>17972, 63044=>17972, 24791=>17973, 63045=>17973, 24893=>17974, 63046=>17974, 23781=>17975, 63047=>17975, 14729=>17976, 63048=>17976, 25015=>17977, 63049=>17977, 25039=>17978, 63051=>17978, 14776=>17979, 63052=>17979, 25132=>17980, 63053=>17980, 25317=>17981, 63055=>17981, 14840=>17982, 63057=>17982, 22193=>17983, 63058=>17983, 14851=>17984, 63059=>17984, 25570=>17985, 63060=>17985, 25595=>17986, 63061=>17986, 25607=>17987, 63062=>17987, 14923=>17988, 63064=>17988, 25792=>17989, 63065=>17989, 40863=>17990, 63068=>17990, 14999=>17991, 63069=>17991, 25990=>17992, 63070=>17992, 15037=>17993, 63071=>17993, 26111=>17994, 63072=>17994, 26195=>17995, 63073=>17995, 15090=>17996, 63074=>17996, 26258=>17997, 63075=>17997, 15138=>17998, 63076=>17998, 26390=>17999, 63077=>17999, 15170=>18000, 63078=>18000, 26532=>18001, 63079=>18001, 15192=>18002, 63081=>18002, 26698=>18003, 63082=>18003, 26756=>18004, 63083=>18004, 15218=>18005, 63084=>18005, 15217=>18006, 63085=>18006, 15227=>18007, 63086=>18007, 26889=>18008, 63087=>18008, 26947=>18009, 63088=>18009, 29276=>18010, 63089=>18010, 26980=>18011, 63090=>18011, 27039=>18012, 63091=>18012, 27013=>18013, 63092=>18013, 27094=>18014, 63094=>18014, 15325=>18015, 63095=>18015, 27237=>18016, 63096=>18016, 27252=>18017, 63097=>18017, 27249=>18018, 63098=>18018, 27266=>18019, 63099=>18019, 15340=>18020, 63100=>18020, 27289=>18021, 63101=>18021, 15346=>18022, 63102=>18022, 27307=>18023, 63103=>18023, 27317=>18024, 63104=>18024, 27348=>18025, 63105=>18025, 27382=>18026, 63106=>18026, 27521=>18027, 63107=>18027, 27585=>18028, 63108=>18028, 27626=>18029, 63109=>18029, 27765=>18030, 63110=>18030, 27818=>18031, 63111=>18031, 15563=>18032, 63112=>18032, 27906=>18033, 63113=>18033, 27910=>18034, 63114=>18034, 27942=>18035, 63115=>18035, 28033=>18036, 63116=>18036, 15599=>18037, 63117=>18037, 28068=>18038, 63118=>18038, 28081=>18039, 63119=>18039, 28181=>18040, 63120=>18040, 28184=>18041, 63121=>18041, 28201=>18042, 63122=>18042, 28294=>18043, 63123=>18043, 166336=>18044, 63124=>18044, 28347=>18045, 63125=>18045, 28386=>18046, 63126=>18046, 28378=>18047, 63127=>18047, 40831=>18048, 63128=>18048, 28392=>18049, 63129=>18049, 28393=>18050, 63130=>18050, 28452=>18051, 63131=>18051, 28468=>18052, 63132=>18052, 15686=>18053, 63133=>18053, 147265=>18054, 63134=>18054, 28545=>18055, 63135=>18055, 28606=>18056, 63136=>18056, 15722=>18057, 63137=>18057, 15733=>18058, 63138=>18058, 29111=>18059, 63139=>18059, 23705=>18060, 63140=>18060, 15754=>18061, 63141=>18061, 28716=>18062, 63142=>18062, 15761=>18063, 63143=>18063, 28752=>18064, 63144=>18064, 28756=>18065, 63145=>18065, 28783=>18066, 63146=>18066, 28799=>18067, 63147=>18067, 131877=>18068, 63149=>18068, 17345=>18069, 63150=>18069, 13809=>18070, 63151=>18070, 134872=>18071, 63152=>18071, 13902=>18072, 58134=>18072, 15789=>18073, 58172=>18073, 154725=>18074, 58173=>18074, 26237=>18075, 58183=>18075, 31860=>18076, 58188=>18076, 29837=>18077, 58197=>18077, 32402=>18078, 58215=>18078, 17667=>18079, 58232=>18079, 58260=>18080, 151480=>18080, 58270=>18081, 133901=>18081, 58277=>18082, 158474=>18082, 13438=>18083, 58311=>18083, 58317=>18084, 143087=>18084, 58325=>18085, 146613=>18085, 58343=>18086, 159385=>18086, 34673=>18087, 58364=>18087, 25537=>18088, 58385=>18088, 30583=>18089, 58387=>18089, 35210=>18090, 58390=>18090, 58406=>18091, 147343=>18091, 35660=>18092, 58415=>18092, 58440=>18093, 150729=>18093, 18730=>18094, 58464=>18094, 172052=>18095, 58471=>18095, 165564=>18096, 58472=>18096, 165121=>18097, 58473=>18097, 15088=>18098, 58490=>18098, 28815=>18099, 58511=>18099, 58529=>18100, 140922=>18100, 58637=>18101, 158120=>18101, 58646=>18102, 148043=>18102, 26760=>18103, 58662=>18103, 58664=>18104, 139611=>18104, 40802=>18105, 58702=>18105, 37830=>18106, 58793=>18106, 58802=>18107, 131967=>18107, 37734=>18108, 58888=>18108, 37519=>18109, 58901=>18109, 34324=>18110, 58954=>18110, 58986=>18111, 173147=>18111, 16784=>18112, 59010=>18112, 26511=>18113, 59045=>18113, 26654=>18114, 59048=>18114, 14435=>18115, 59051=>18115, 59077=>18116, 149996=>18116, 15129=>18117, 59128=>18117, 33942=>18118, 59176=>18118, 59241=>18119, 149858=>18119, 14818=>18120, 59254=>18120, 33920=>18121, 59259=>18121, 17262=>18122, 59328=>18122, 38769=>18123, 59402=>18123, 39323=>18124, 59427=>18124, 18733=>18125, 59499=>18125, 28439=>18126, 59703=>18126, 160009=>18127, 59704=>18127, 28838=>18128, 59746=>18128, 150095=>18129, 59752=>18129, 32357=>18130, 59753=>18130, 23855=>18131, 59755=>18131, 15859=>18132, 59756=>18132, 150109=>18133, 59758=>18133, 137183=>18134, 59759=>18134, 32164=>18135, 59760=>18135, 33830=>18136, 59761=>18136, 21637=>18137, 59762=>18137, 146170=>18138, 59763=>18138, 131604=>18139, 59765=>18139, 22398=>18140, 59766=>18140, 133333=>18141, 59767=>18141, 132633=>18142, 59768=>18142, 16357=>18143, 59769=>18143, 139166=>18144, 59770=>18144, 172726=>18145, 59771=>18145, 28675=>18146, 59772=>18146, 168283=>18147, 59773=>18147, 23920=>18148, 59774=>18148, 29583=>18149, 59775=>18149, 166489=>18150, 59777=>18150, 168992=>18151, 59778=>18151, 20424=>18152, 59779=>18152, 32743=>18153, 59780=>18153, 29456=>18154, 59782=>18154, 29496=>18155, 59784=>18155, 29505=>18156, 59787=>18156, 16041=>18157, 59789=>18157, 29173=>18158, 59792=>18158, 149746=>18159, 59793=>18159, 29665=>18160, 59794=>18160, 16074=>18161, 59796=>18161, 16081=>18162, 59798=>18162, 29721=>18163, 59801=>18163, 29726=>18164, 59802=>18164, 29727=>18165, 59803=>18165, 16098=>18166, 59804=>18166, 16112=>18167, 59805=>18167, 16116=>18168, 59806=>18168, 16122=>18169, 59807=>18169, 29907=>18170, 59808=>18170, 16142=>18171, 59809=>18171, 16211=>18172, 59810=>18172, 30061=>18173, 59812=>18173, 30066=>18174, 59813=>18174, 30093=>18175, 59814=>18175, 16252=>18176, 59815=>18176, 30152=>18177, 59816=>18177, 30285=>18178, 59819=>18178, 30324=>18179, 59821=>18179, 16348=>18180, 59822=>18180, 30330=>18181, 59823=>18181, 29064=>18182, 59825=>18182, 22051=>18183, 59826=>18183, 35200=>18184, 59827=>18184, 16413=>18185, 59829=>18185, 30531=>18186, 59830=>18186, 16441=>18187, 59831=>18187, 16453=>18188, 59833=>18188, 13787=>18189, 59834=>18189, 30616=>18190, 59835=>18190, 16490=>18191, 59836=>18191, 16495=>18192, 59837=>18192, 30654=>18193, 59839=>18193, 30667=>18194, 59840=>18194, 30744=>18195, 59842=>18195, 30748=>18196, 59844=>18196, 30791=>18197, 59847=>18197, 30801=>18198, 59848=>18198, 30822=>18199, 59849=>18199, 33864=>18200, 59850=>18200, 152885=>18201, 59851=>18201, 31027=>18202, 59852=>18202, 31026=>18203, 59854=>18203, 16649=>18204, 59856=>18204, 31121=>18205, 59857=>18205, 31238=>18206, 59860=>18206, 16743=>18207, 59862=>18207, 16818=>18208, 59864=>18208, 31420=>18209, 59865=>18209, 33401=>18210, 59866=>18210, 16836=>18211, 59867=>18211, 31439=>18212, 59868=>18212, 31451=>18213, 59869=>18213, 16847=>18214, 59870=>18214, 31586=>18215, 59872=>18215, 31596=>18216, 59873=>18216, 31611=>18217, 59874=>18217, 31762=>18218, 59875=>18218, 16992=>18219, 59877=>18219, 17018=>18220, 59878=>18220, 31867=>18221, 59879=>18221, 31900=>18222, 59880=>18222, 17036=>18223, 59881=>18223, 31928=>18224, 59882=>18224, 17044=>18225, 59883=>18225, 36755=>18226, 59885=>18226, 28864=>18227, 59886=>18227, 134351=>18228, 59887=>18228, 32207=>18229, 59888=>18229, 32212=>18230, 59889=>18230, 32208=>18231, 59890=>18231, 32253=>18232, 59891=>18232, 32692=>18233, 59893=>18233, 29343=>18234, 59894=>18234, 17303=>18235, 59895=>18235, 32800=>18236, 59896=>18236, 32805=>18237, 59897=>18237, 32814=>18238, 59899=>18238, 32817=>18239, 59900=>18239, 32852=>18240, 59901=>18240, 22452=>18241, 59903=>18241, 28832=>18242, 59904=>18242, 32951=>18243, 59905=>18243, 33001=>18244, 59906=>18244, 17389=>18245, 59907=>18245, 33036=>18246, 59908=>18246, 33038=>18247, 59910=>18247, 33042=>18248, 59911=>18248, 33044=>18249, 59913=>18249, 17409=>18250, 59914=>18250, 15161=>18251, 59915=>18251, 33110=>18252, 59916=>18252, 33113=>18253, 59917=>18253, 33114=>18254, 59918=>18254, 17427=>18255, 59919=>18255, 33148=>18256, 59921=>18256, 17445=>18257, 59923=>18257, 17453=>18258, 59925=>18258, 33189=>18259, 59926=>18259, 22511=>18260, 59927=>18260, 33217=>18261, 59928=>18261, 33252=>18262, 59929=>18262, 33364=>18263, 59930=>18263, 17551=>18264, 59931=>18264, 33398=>18265, 59933=>18265, 33482=>18266, 59934=>18266, 33496=>18267, 59935=>18267, 17584=>18268, 59937=>18268, 33623=>18269, 59938=>18269, 38505=>18270, 59939=>18270, 33797=>18271, 59941=>18271, 28917=>18272, 59942=>18272, 33892=>18273, 59943=>18273, 33928=>18274, 59945=>18274, 17668=>18275, 59946=>18275, 33982=>18276, 59947=>18276, 34017=>18277, 59948=>18277, 34040=>18278, 59949=>18278, 34064=>18279, 59950=>18279, 34104=>18280, 59951=>18280, 34130=>18281, 59952=>18281, 17723=>18282, 59953=>18282, 34159=>18283, 59954=>18283, 34160=>18284, 59955=>18284, 34272=>18285, 59956=>18285, 17783=>18286, 59957=>18286, 34418=>18287, 59958=>18287, 34450=>18288, 59959=>18288, 34543=>18289, 59961=>18289, 38469=>18290, 59962=>18290, 17926=>18291, 59964=>18291, 17943=>18292, 59965=>18292, 34990=>18293, 59966=>18293, 35071=>18294, 59967=>18294, 35108=>18295, 59968=>18295, 35217=>18296, 59970=>18296, 162151=>18297, 59971=>18297, 35384=>18298, 59973=>18298, 35476=>18299, 59974=>18299, 35508=>18300, 59975=>18300, 35921=>18301, 59976=>18301, 36052=>18302, 59977=>18302, 36082=>18303, 59978=>18303, 36124=>18304, 59979=>18304, 18328=>18305, 59980=>18305, 36291=>18306, 59982=>18306, 18413=>18307, 59983=>18307, 36410=>18308, 59985=>18308, 22356=>18309, 59987=>18309, 22005=>18310, 59989=>18310, 18487=>18311, 59991=>18311, 36558=>18312, 59992=>18312, 36578=>18313, 59993=>18313, 36580=>18314, 59994=>18314, 36589=>18315, 59995=>18315, 36594=>18316, 59996=>18316, 36801=>18317, 59998=>18317, 36810=>18318, 59999=>18318, 36812=>18319, 60000=>18319, 36915=>18320, 60001=>18320, 18605=>18321, 60003=>18321, 39136=>18322, 60004=>18322, 37395=>18323, 60005=>18323, 18718=>18324, 60006=>18324, 37416=>18325, 60007=>18325, 37464=>18326, 60008=>18326, 37483=>18327, 60009=>18327, 37553=>18328, 60010=>18328, 37550=>18329, 60011=>18329, 37567=>18330, 60012=>18330, 37603=>18331, 60013=>18331, 37611=>18332, 60014=>18332, 37619=>18333, 60015=>18333, 37620=>18334, 60016=>18334, 37629=>18335, 60017=>18335, 37699=>18336, 60018=>18336, 37764=>18337, 60019=>18337, 37805=>18338, 60020=>18338, 18757=>18339, 60021=>18339, 18769=>18340, 60022=>18340, 37911=>18341, 60024=>18341, 37917=>18342, 60026=>18342, 37933=>18343, 60027=>18343, 37950=>18344, 60028=>18344, 18794=>18345, 60029=>18345, 37972=>18346, 60030=>18346, 38009=>18347, 60031=>18347, 38189=>18348, 60032=>18348, 38306=>18349, 60033=>18349, 18855=>18350, 60034=>18350, 38388=>18351, 60035=>18351, 38451=>18352, 60036=>18352, 18917=>18353, 60037=>18353, 18980=>18354, 60039=>18354, 38720=>18355, 60040=>18355, 18997=>18356, 60041=>18356, 38834=>18357, 60042=>18357, 38850=>18358, 60043=>18358, 19172=>18359, 60045=>18359, 39097=>18360, 60047=>18360, 19225=>18361, 60048=>18361, 39153=>18362, 60049=>18362, 22596=>18363, 60050=>18363, 39193=>18364, 60052=>18364, 39223=>18365, 60055=>18365, 39261=>18366, 60057=>18366, 39266=>18367, 60058=>18367, 19312=>18368, 60059=>18368, 39365=>18369, 60060=>18369, 19357=>18370, 60061=>18370, 39484=>18371, 60062=>18371, 39695=>18372, 60063=>18372, 39785=>18373, 60065=>18373, 39901=>18374, 60067=>18374, 39921=>18375, 60068=>18375, 39924=>18376, 60069=>18376, 19565=>18377, 60070=>18377, 39968=>18378, 60071=>18378, 14191=>18379, 60072=>18379, 138178=>18380, 60073=>18380, 40265=>18381, 60074=>18381, 40702=>18382, 60076=>18382, 22096=>18383, 60077=>18383, 40381=>18384, 60079=>18384, 40444=>18385, 60081=>18385, 38134=>18386, 60082=>18386, 36790=>18387, 60083=>18387, 40625=>18388, 60086=>18388, 40637=>18389, 60087=>18389, 40646=>18390, 60088=>18390, 38108=>18391, 60089=>18391, 40674=>18392, 60090=>18392, 40689=>18393, 60091=>18393, 40696=>18394, 60092=>18394, 40772=>18395, 60094=>18395, 131220=>18396, 60095=>18396, 131767=>18397, 60096=>18397, 132000=>18398, 60097=>18398, 38083=>18399, 60099=>18399, 60101=>18400, 132311=>18400, 38081=>18401, 60103=>18401, 132565=>18402, 60105=>18402, 132629=>18403, 60106=>18403, 132726=>18404, 60107=>18404, 136890=>18405, 60108=>18405, 22359=>18406, 60109=>18406, 29043=>18407, 60110=>18407, 133826=>18408, 60111=>18408, 133837=>18409, 60112=>18409, 134079=>18410, 60113=>18410, 194619=>18411, 60115=>18411, 134091=>18412, 60116=>18412, 21662=>18413, 60117=>18413, 134139=>18414, 60118=>18414, 134203=>18415, 60119=>18415, 134227=>18416, 60120=>18416, 134245=>18417, 60121=>18417, 134268=>18418, 60122=>18418, 60124=>18419, 134285=>18419, 134325=>18420, 60126=>18420, 134365=>18421, 60127=>18421, 134381=>18422, 60128=>18422, 134511=>18423, 60129=>18423, 134578=>18424, 60130=>18424, 134600=>18425, 60131=>18425, 134660=>18426, 60135=>18426, 134670=>18427, 60136=>18427, 134871=>18428, 60137=>18428, 135056=>18429, 60138=>18429, 134957=>18430, 60139=>18430, 134771=>18431, 60140=>18431, 60142=>18432, 135100=>18432, 135260=>18433, 60144=>18433, 135247=>18434, 60145=>18434, 135286=>18435, 60146=>18435, 135304=>18436, 60149=>18436, 135318=>18437, 60150=>18437, 13895=>18438, 60151=>18438, 135359=>18439, 60152=>18439, 135471=>18440, 60154=>18440, 135483=>18441, 60155=>18441, 21348=>18442, 60156=>18442, 135907=>18443, 60158=>18443, 136053=>18444, 60159=>18444, 60160=>18445, 135990=>18445, 136567=>18446, 60162=>18446, 136729=>18447, 60163=>18447, 137155=>18448, 60164=>18448, 137159=>18449, 60165=>18449, 28859=>18450, 60167=>18450, 137261=>18451, 60168=>18451, 137578=>18452, 60169=>18452, 137773=>18453, 60170=>18453, 137797=>18454, 60171=>18454, 138282=>18455, 60172=>18455, 138352=>18456, 60173=>18456, 138412=>18457, 60174=>18457, 138952=>18458, 60175=>18458, 138965=>18459, 60177=>18459, 139029=>18460, 60178=>18460, 29080=>18461, 60179=>18461, 139333=>18462, 60181=>18462, 27113=>18463, 60182=>18463, 14024=>18464, 60183=>18464, 139900=>18465, 60184=>18465, 140247=>18466, 60185=>18466, 140282=>18467, 60186=>18467, 141098=>18468, 60187=>18468, 141425=>18469, 60188=>18469, 141647=>18470, 60189=>18470, 141671=>18471, 60191=>18471, 141715=>18472, 60192=>18472, 142037=>18473, 60193=>18473, 60195=>18474, 142056=>18474, 60197=>18475, 142094=>18475, 60199=>18476, 142143=>18476, 60202=>18477, 142412=>18477, 142472=>18478, 60204=>18478, 142519=>18479, 60205=>18479, 154600=>18480, 60206=>18480, 142600=>18481, 60207=>18481, 142610=>18482, 60208=>18482, 142775=>18483, 60209=>18483, 142741=>18484, 60210=>18484, 142914=>18485, 60211=>18485, 143220=>18486, 60212=>18486, 143308=>18487, 60213=>18487, 143411=>18488, 60214=>18488, 143462=>18489, 60215=>18489, 144159=>18490, 60216=>18490, 144350=>18491, 60217=>18491, 144743=>18492, 60222=>18492, 144883=>18493, 60223=>18493, 144922=>18494, 60227=>18494, 145174=>18495, 60228=>18495, 22709=>18496, 60231=>18496, 60234=>18497, 146087=>18497, 146961=>18498, 60237=>18498, 147129=>18499, 60238=>18499, 60243=>18500, 147737=>18500, 148206=>18501, 60245=>18501, 148237=>18502, 60246=>18502, 148276=>18503, 60248=>18503, 148374=>18504, 60249=>18504, 148484=>18505, 60258=>18505, 148694=>18506, 60259=>18506, 22408=>18507, 60260=>18507, 149108=>18508, 60261=>18508, 60263=>18509, 149295=>18509, 149522=>18510, 60271=>18510, 149755=>18511, 60272=>18511, 150037=>18512, 60273=>18512, 60275=>18513, 150208=>18513, 22885=>18514, 60277=>18514, 60279=>18515, 151430=>18515, 60282=>18516, 151596=>18516, 22335=>18517, 60284=>18517, 152217=>18518, 60286=>18518, 152601=>18519, 60287=>18519, 152646=>18520, 60291=>18520, 152686=>18521, 60292=>18521, 60296=>18522, 152895=>18522, 60298=>18523, 152926=>18523, 152930=>18524, 60300=>18524, 152934=>18525, 60301=>18525, 153543=>18526, 60302=>18526, 60304=>18527, 153693=>18527, 60309=>18528, 153859=>18528, 154286=>18529, 60312=>18529, 154505=>18530, 60313=>18530, 154630=>18531, 60314=>18531, 22433=>18532, 60316=>18532, 29009=>18533, 60317=>18533, 60319=>18534, 155906=>18534, 60322=>18535, 156082=>18535, 156674=>18536, 60325=>18536, 156746=>18537, 60326=>18537, 60330=>18538, 156804=>18538, 60334=>18539, 156808=>18539, 60336=>18540, 156946=>18540, 157119=>18541, 60338=>18541, 157365=>18542, 60339=>18542, 22201=>18543, 60347=>18543, 60349=>18544, 157436=>18544, 13848=>18545, 60355=>18545, 157593=>18546, 60357=>18546, 157806=>18547, 60358=>18547, 60360=>18548, 157790=>18548, 60362=>18549, 157895=>18549, 60366=>18550, 157990=>18550, 60368=>18551, 158009=>18551, 60371=>18552, 158202=>18552, 60373=>18553, 158253=>18553, 158260=>18554, 60378=>18554, 158555=>18555, 60379=>18555, 60383=>18556, 158621=>18556, 60385=>18557, 158884=>18557, 60388=>18558, 159150=>18558, 159819=>18559, 60392=>18559, 160205=>18560, 60393=>18560, 160384=>18561, 60395=>18561, 160389=>18562, 60396=>18562, 60399=>18563, 160395=>18563, 60401=>18564, 160486=>18564, 38047=>18565, 60404=>18565, 160848=>18566, 60405=>18566, 14009=>18567, 60416=>18567, 161740=>18568, 60424=>18568, 161880=>18569, 60425=>18569, 22230=>18570, 60426=>18570, 60435=>18571, 162269=>18571, 162301=>18572, 60441=>18572, 162314=>18573, 60442=>18573, 162571=>18574, 60443=>18574, 163174=>18575, 60444=>18575, 60448=>18576, 163849=>18576, 60459=>18577, 163875=>18577, 60463=>18578, 163912=>18578, 60466=>18579, 163971=>18579, 163984=>18580, 60479=>18580, 164084=>18581, 60480=>18581, 164142=>18582, 60481=>18582, 60483=>18583, 164175=>18583, 164271=>18584, 60485=>18584, 164378=>18585, 60486=>18585, 164614=>18586, 60487=>18586, 164655=>18587, 60488=>18587, 164746=>18588, 60489=>18588, 164968=>18589, 60491=>18589, 165546=>18590, 60492=>18590, 25574=>18591, 60494=>18591, 166230=>18592, 60495=>18592, 60498=>18593, 166328=>18593, 60500=>18594, 166375=>18594, 60502=>18595, 166376=>18595, 166726=>18596, 60503=>18596, 166868=>18597, 60504=>18597, 60506=>18598, 166921=>18598, 167877=>18599, 60508=>18599, 168172=>18600, 60509=>18600, 168208=>18601, 60511=>18601, 168252=>18602, 60512=>18602, 15863=>18603, 60513=>18603, 168286=>18604, 60514=>18604, 150218=>18605, 60515=>18605, 36816=>18606, 60516=>18606, 60519=>18607, 169191=>18607, 169392=>18608, 60521=>18608, 169400=>18609, 60522=>18609, 169778=>18610, 60523=>18610, 170193=>18611, 60524=>18611, 170313=>18612, 60525=>18612, 170346=>18613, 60526=>18613, 170435=>18614, 60527=>18614, 170536=>18615, 60528=>18615, 170766=>18616, 60529=>18616, 171354=>18617, 60530=>18617, 171419=>18618, 60531=>18618, 32415=>18619, 60532=>18619, 171768=>18620, 60533=>18620, 171811=>18621, 60534=>18621, 19620=>18622, 60535=>18622, 38215=>18623, 60536=>18623, 172691=>18624, 60537=>18624, 29090=>18625, 60538=>18625, 172799=>18626, 60539=>18626, 173515=>18627, 60542=>18627, 19868=>18628, 60543=>18628, 134300=>18629, 60544=>18629, 36798=>18630, 60545=>18630, 36794=>18631, 60547=>18631, 140464=>18632, 60548=>18632, 36793=>18633, 60549=>18633, 150163=>18634, 60550=>18634, 20202=>18635, 60555=>18635, 60557=>18636, 166700=>18636, 36480=>18637, 60560=>18637, 137205=>18638, 60561=>18638, 166764=>18639, 60563=>18639, 166809=>18640, 60564=>18640, 60566=>18641, 157359=>18641, 60568=>18642, 161365=>18642, 153141=>18643, 60570=>18643, 153942=>18644, 60571=>18644, 20122=>18645, 60572=>18645, 155265=>18646, 60573=>18646, 60576=>18647, 134765=>18647, 147080=>18648, 60579=>18648, 150686=>18649, 60580=>18649, 137206=>18650, 60583=>18650, 137339=>18651, 60584=>18651, 60587=>18652, 154698=>18652, 152337=>18653, 60589=>18653, 15814=>18654, 60590=>18654, 60596=>18655, 155352=>18655, 19996=>18656, 60600=>18656, 135146=>18657, 60601=>18657, 134473=>18658, 60602=>18658, 145082=>18659, 60603=>18659, 60638=>18660, 151880=>18660, 21982=>18661, 60644=>18661, 34694=>18662, 60672=>18662, 60676=>18663, 135361=>18663, 149254=>18664, 60679=>18664, 23440=>18665, 60680=>18665, 60682=>18666, 157843=>18666, 141044=>18667, 60684=>18667, 163119=>18668, 60685=>18668, 147875=>18669, 60686=>18669, 163187=>18670, 60687=>18670, 159440=>18671, 60688=>18671, 160438=>18672, 60689=>18672, 60691=>18673, 135641=>18673, 146684=>18674, 60693=>18674, 173737=>18675, 60694=>18675, 134828=>18676, 60695=>18676, 60698=>18677, 138402=>18677, 60700=>18678, 151490=>18678, 60702=>18679, 135147=>18679, 60706=>18680, 142752=>18680, 135148=>18681, 60710=>18681, 134666=>18682, 60711=>18682, 60714=>18683, 135149=>18683, 60717=>18684, 135559=>18684, 19994=>18685, 60721=>18685, 19972=>18686, 60722=>18686, 23309=>18687, 60724=>18687, 13996=>18688, 60727=>18688, 21373=>18689, 60729=>18689, 13989=>18690, 60730=>18690, 22682=>18691, 60732=>18691, 150382=>18692, 60733=>18692, 22442=>18693, 60736=>18693, 154261=>18694, 60737=>18694, 133497=>18695, 60738=>18695, 60741=>18696, 140389=>18696, 146686=>18697, 60746=>18697, 171824=>18698, 60747=>18698, 151465=>18699, 60749=>18699, 169374=>18700, 60750=>18700, 60753=>18701, 146870=>18701, 157619=>18702, 60755=>18702, 145184=>18703, 60756=>18703, 147191=>18704, 60759=>18704, 146988=>18705, 60760=>18705, 60785=>18706, 143578=>18706, 135849=>18707, 60789=>18707, 22439=>18708, 60790=>18708, 149859=>18709, 60791=>18709, 60794=>18710, 159918=>18710, 60801=>18711, 137068=>18711, 60806=>18712, 160100=>18712, 159010=>18713, 60809=>18713, 150242=>18714, 60810=>18714, 39963=>18715, 60837=>18715, 149822=>18716, 60838=>18716, 15878=>18717, 60846=>18717, 60881=>18718, 159011=>18718, 60887=>18719, 132092=>18719, 60891=>18720, 146685=>18720, 60893=>18721, 149785=>18721, 22394=>18722, 60904=>18722, 21722=>18723, 60912=>18723, 29050=>18724, 60928=>18724, 60949=>18725, 150135=>18725, 60955=>18726, 166490=>18726, 60962=>18727, 194624=>18727, 60976=>18728, 137275=>18728, 61000=>18729, 155993=>18729, 61014=>18730, 144373=>18730, 61019=>18731, 166850=>18731, 61024=>18732, 138566=>18732, 61054=>18733, 159441=>18733, 13877=>18734, 61065=>18734, 61084=>18735, 166701=>18735, 21024=>18736, 61088=>18736, 15384=>18737, 61089=>18737, 146631=>18738, 61090=>18738, 155351=>18739, 61091=>18739, 161366=>18740, 61092=>18740, 152881=>18741, 61093=>18741, 137540=>18742, 61094=>18742, 170243=>18743, 61096=>18743, 159196=>18744, 61097=>18744, 159917=>18745, 61098=>18745, 156077=>18746, 61100=>18746, 166415=>18747, 61101=>18747, 145015=>18748, 61102=>18748, 131310=>18749, 61103=>18749, 157766=>18750, 61104=>18750, 151310=>18751, 61105=>18751, 17762=>18752, 61106=>18752, 23327=>18753, 61107=>18753, 156492=>18754, 61108=>18754, 40784=>18755, 61109=>18755, 40614=>18756, 61110=>18756, 156267=>18757, 61111=>18757, 20962=>18758, 57415=>18758, 21314=>18759, 57416=>18759, 26285=>18760, 57520=>18760, 22620=>18761, 57547=>18761, 21843=>18762, 57566=>18762, 15749=>18763, 57594=>18763, 24928=>18764, 57608=>18764, 18606=>18765, 57668=>18765, 38845=>18766, 57676=>18766, 57693=>18767, 137335=>18767, 24755=>18768, 57703=>18768, 33828=>18769, 57711=>18769, 38932=>18770, 57748=>18770, 147596=>18771, 57749=>18771, 57764=>18772, 143486=>18772, 57787=>18773, 138813=>18773, 15147=>18774, 57798=>18774, 15666=>18775, 57824=>18775, 57857=>18776, 132021=>18776, 28801=>18777, 57944=>18777, 23708=>18778, 57959=>18778, 58017=>18779, 132547=>18779, 14128=>18780, 58028=>18780, 136054=>18781, 58096=>18781, 150034=>18782, 58097=>18782, 58111=>18783, 166699=>18783, 58112=>18784, 155779=>18784, 256=>18785, 62233=>18785, 193=>18786, 62234=>18786, 461=>18787, 62235=>18787, 192=>18788, 62236=>18788, 274=>18789, 62237=>18789, 201=>18790, 62238=>18790, 282=>18791, 62239=>18791, 200=>18792, 62240=>18792, 332=>18793, 62241=>18793, 211=>18794, 62242=>18794, 465=>18795, 62243=>18795, 210=>18796, 62244=>18796, 62245=>18797, 7870=>18798, 62246=>18798, 62247=>18799, 7872=>18800, 62248=>18800, 202=>18801, 62249=>18801, 257=>18802, 62250=>18802, 225=>18803, 62251=>18803, 462=>18804, 62252=>18804, 224=>18805, 62253=>18805, 593=>18806, 62254=>18806, 275=>18807, 62255=>18807, 233=>18808, 62256=>18808, 283=>18809, 62257=>18809, 232=>18810, 62258=>18810, 299=>18811, 62259=>18811, 237=>18812, 62260=>18812, 464=>18813, 62261=>18813, 236=>18814, 62262=>18814, 333=>18815, 62263=>18815, 243=>18816, 62264=>18816, 466=>18817, 62265=>18817, 242=>18818, 62266=>18818, 363=>18819, 62267=>18819, 250=>18820, 62268=>18820, 468=>18821, 62269=>18821, 249=>18822, 62270=>18822, 470=>18823, 62271=>18823, 472=>18824, 62272=>18824, 474=>18825, 62273=>18825, 476=>18826, 62274=>18826, 252=>18827, 62275=>18827, 62276=>18828, 7871=>18829, 62277=>18829, 62278=>18830, 7873=>18831, 62279=>18831, 234=>18832, 62280=>18832, 609=>18833, 62281=>18833, 643=>18834, 63551=>18834, 592=>18835, 63552=>18835, 603=>18836, 63553=>18836, 596=>18837, 63554=>18837, 629=>18838, 63555=>18838, 339=>18839, 63556=>18839, 248=>18840, 63557=>18840, 331=>18841, 63558=>18841, 650=>18842, 63559=>18842, 618=>18843, 63560=>18843, 9178=>18844, 62282=>18844, 9179=>18845, 62283=>18845, 11933=>18846, 63530=>18846, 11974=>18847, 63539=>18847, 12003=>18848, 63547=>18848, 20539=>18849, 28158=>18850, 171123=>18851, 62841=>18851, 40870=>18852, 62842=>18852, 15817=>18853, 62843=>18853, 34959=>18854, 62845=>18855, 147790=>18855, 28791=>18856, 23797=>18857, 19232=>18858, 62848=>18858, 152013=>18859, 62849=>18859, 13657=>18860, 62850=>18860, 154928=>18861, 62851=>18861, 24866=>18862, 62853=>18863, 166450=>18863, 36775=>18864, 37366=>18865, 29073=>18866, 26393=>18867, 29626=>18868, 144001=>18869, 62859=>18869, 172295=>18870, 62860=>18870, 15499=>18871, 62861=>18871, 137600=>18872, 62862=>18872, 19216=>18873, 62863=>18873, 30948=>18874, 29698=>18875, 20910=>18876, 165647=>18877, 62867=>18877, 16393=>18878, 62868=>18878, 27235=>18879, 172730=>18880, 62870=>18880, 16931=>18881, 62871=>18881, 34319=>18882, 31274=>18883, 170311=>18884, 62875=>18884, 166634=>18885, 62876=>18885, 38741=>18886, 28749=>18887, 21284=>18888, 62880=>18889, 139390=>18889, 37876=>18890, 30425=>18891, 166371=>18892, 62883=>18892, 40871=>18893, 62884=>18893, 30685=>18894, 20131=>18895, 20464=>18896, 20668=>18897, 20015=>18898, 20247=>18899, 40872=>18900, 62891=>18900, 21556=>18901, 32139=>18902, 22674=>18903, 22736=>18904, 62896=>18905, 138678=>18905, 24210=>18906, 24217=>18907, 24514=>18908, 62900=>18909, 141074=>18909, 25995=>18910, 62902=>18911, 144377=>18911, 26905=>18912, 27203=>18913, 62905=>18914, 146531=>18914, 27903=>18915, 29184=>18916, 62909=>18917, 148741=>18917, 29580=>18918, 16091=>18919, 62911=>18919, 150035=>18920, 62912=>18920, 23317=>18921, 29881=>18922, 35715=>18923, 154788=>18924, 62916=>18924, 153237=>18925, 62917=>18925, 31379=>18926, 31724=>18927, 31939=>18928, 32364=>18929, 33528=>18930, 34199=>18931, 40873=>18932, 62924=>18932, 34960=>18933, 40874=>18934, 62926=>18934, 36537=>18935, 40875=>18936, 62928=>18936, 36815=>18937, 34143=>18938, 39392=>18939, 37409=>18940, 40876=>18941, 62933=>18941, 167353=>18942, 62934=>18942, 136255=>18943, 62935=>18943, 16497=>18944, 62936=>18944, 17058=>18945, 62937=>18945, 23066=>18946, 39016=>18947, 26475=>18948, 17014=>18949, 62944=>18949, 22333=>18950, 34262=>18951, 62948=>18952, 149883=>18952, 33471=>18953, 160013=>18954, 62950=>18954, 19585=>18955, 62951=>18955, 159092=>18956, 62952=>18956, 23931=>18957, 158485=>18958, 62954=>18958, 159678=>18959, 62955=>18959, 40877=>18960, 62956=>18960, 40878=>18961, 62957=>18961, 23446=>18962, 40879=>18963, 62959=>18963, 32347=>18964, 17392=>18965, 19506=>18966, 17923=>18967, 17830=>18968, 17784=>18969, 160359=>18970, 19831=>18971, 17843=>18972, 162993=>18973, 19682=>18974, 163013=>18975, 15253=>18976, 18230=>18977, 18244=>18978, 19527=>18979, 19520=>18980, 148159=>18981, 144919=>18982, 160594=>18983, 159371=>18984, 159954=>18985, 19543=>18986, 172881=>18987, 18255=>18988, 17882=>18989, 19589=>18990, 162924=>18991, 19719=>18992, 19108=>18993, 18081=>18994, 158499=>18995, 29221=>18996, 154196=>18997, 137827=>18998, 146950=>18999, 147297=>19000, 26189=>19001, 22267=>19002, 32149=>19003, 22813=>19004, 166841=>19005, 15860=>19006, 38708=>19007, 162799=>19008, 23515=>19009, 138590=>19010, 23204=>19011, 13861=>19012, 171696=>19013, 23249=>19014, 23479=>19015, 23804=>19016, 26478=>19017, 34195=>19018, 170309=>19019, 29793=>19020, 29853=>19021, 133743=>19022, 26343=>19023, 28247=>19024, 31178=>19025, 15752=>19026, 17603=>19027, 143958=>19028, 141206=>19029, 17306=>19030, 17718=>19031, 23765=>19032, 146202=>19033, 35577=>19034, 23672=>19035, 15634=>19036, 144721=>19037, 23928=>19038, 40882=>19039, 29015=>19040, 17752=>19041, 147692=>19042, 138787=>19043, 19575=>19044, 14712=>19045, 13386=>19046, 131492=>19047, 158785=>19048, 35532=>19049, 20404=>19050, 131641=>19051, 22975=>19052, 33132=>19053, 38998=>19054, 170234=>19055, 24379=>19056, 134047=>19057, 139713=>19058, 166253=>19059, 16642=>19060, 18107=>19061, 168057=>19062, 16135=>19063, 40883=>19064, 172469=>19065, 16632=>19066, 14294=>19067, 18167=>19068, 158790=>19069, 16764=>19070, 165554=>19071, 160767=>19072, 17773=>19073, 14548=>19074, 152730=>19075, 17761=>19076, 17691=>19077, 19849=>19078, 19579=>19079, 19830=>19080, 17898=>19081, 16328=>19082, 150287=>19083, 13921=>19084, 17630=>19085, 17597=>19086, 16877=>19087, ); ?> PHPExcel/Shared/PDF/fonts/courier.php 0000666 00000004421 15017047356 0013322 0 ustar 00 600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600, 10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600, 20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600, 30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600, 40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600, 50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600, 60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600, 70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600, 80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600, 90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600, 100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600, 109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600, 118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600, 127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600, 136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600, 145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600, 154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600, 163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600, 172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600, 181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600, 190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600, 199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, 208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600, 217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600, 226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600, 235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600, 244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600, 253=>600,254=>600,255=>600); ?> PHPExcel/Shared/PDF/fonts/freefont-20090104/INSTALL 0000666 00000005042 15017047356 0014677 0 ustar 00 Installing GNU FreeFont ======================= GNU FreeFont can be used in any modern operating system. This document explains how to install FreeFont on some common systems. UNIX/GNU/Linux/BSD Systems -------------------------- FreeFont works with any system using the free font rasterizer FreeType . * Debian GNU/Linux Users of Debian GNU/Linux system will probably want to use the Debian package, available from the Debian site, , or any of its mirrors. Install them by issuing the command apt-get install ttf-freefont * KDE local installation Users of KDE can install .ttf files on a per-user basis using the KDE Control Center module "kcmfontinst", which may appear in the menu as Settings -> System Administration -> Font Installer This is especially helpful for developers and testers. * Generic X-windows 1) Fetch the freefont-ttf.tar.gz package with Free UCS outline fonts in the TrueType format. 2) Unpack TrueType fonts into a suitable directory, e.g. /usr/local/share/fonts/default/TrueType/ 3) If you have chosen any other directory, make sure the directory you used to install the fonts is listed in the path searched by the X Font Server by editing the config file in /etc/X11/. In some systems, you list the directory in the item "catalogue=" in the file /etc/X11/fs/config. 4) Run ttmkfdir in the directory where you unpacked the fonts. Windows 95/98/NT/2000/XP; Vista ------------------------------- Note that in at least Vista, XP and 2000, the OpenType versions perform much better than, and are recommended over, the TrueType ones. * Vista: 1) From the Start menu, open Control Panels 2) Drag-n-drop font files onto Fonts control panel You may get a dialog saying "Windows needs your permission to continue" a) Click Continue * 95/98/NT: The font installation is similar to Vista. In order to use OpenType, users of Windows 95, 98 and NT 4.0 can install Adobe's 'Type Manager Light'. It is available for download without cost from Adobe's web site. Otherwise, use the TrueType versions. Mac OS X -------- Installing on Mac OS X consists of moving the .ttf files to either /Library/Fonts/ or ~/Library/Fonts/ depending on whether they should be available to all users on your system or just to yourself. -------------------------------------------------------------------------- $Id: INSTALL,v 1.7 2008/12/26 12:33:31 Stevan_White Exp $ PHPExcel/Shared/PDF/fonts/freefont-20090104/ChangeLog 0000666 00000432721 15017047356 0015430 0 ustar 00 $Id: ChangeLog,v 1.254 2009/01/04 16:12:59 Stevan_White Exp $ 2009-01-04 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added 2009 to copyright dates * AUTHORS, CREDITS: Removed Glagolitic range author * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added some TrueType names 2009-01-01 Stevan_White * FreeSerif.sfd: Removde Glagolitic range, since have not (yet) received OK from author. Added some TrueType Names 2008-12-31 Stevan_White * COPYING: Updated license to GPL v3 2008-12-30 Stevan_White * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Oblique versions of Daniel Johnson's Cherokee. * FreeSerifBold.sfd: Cherokee Bold range from Daniel Johnson. 2008-12-27 Stevan_White * isMonoMono.py: 900 EM -> 800 * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: Made glyphs to lie between -200 and 800 EM * isMonoMono.py: check that glyphs lie in vertical bounding boxes * FreeMono.sfd, FreeSerif.sfd: Extensible bracket characters didn't exactly line up. Fixed. Mono: a couple of glyphs had gotten out of their bounding boxes again. 2008-12-26 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Final pre-release cleanup * FreeSerif.sfd: Buginese vowel u was misnamed * FreeMono.sfd: Yatcyrillic somehow was a mark character ... fixed * FreeSans.sfd, FreeSansOblique.sfd: Had to un-link references in Sans: uni02B2, uni02B5 SansOblique: uni0363 because validation of the TTF file said the glyph "is drawn in wrong direction" I would have preferred to have understand this... * Makefile: Added quick test for FontForge version. * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: Removed kerning tables (?? what were they doing here anyway??) * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Kerning tables for Thai. Handles one common case: short letter followed by a tall one with an overhang to the left. 2008-12-25 Stevan_White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: More putzing with kerning tables * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Copied kerning classes Serif -> SerifBold SerifItalic -> SerifBoldItalic Sans -> SansOblique SansBold SansBoldOblique Some associated naming of characters, etc * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Additions and correction in Spacing Modifier letters and IPA Extensions 2008-12-23 Stevan_White * FreeSerif.sfd: Applied patch to Cherokee range 2008-12-20 Stevan_White * FreeSerif.sfd, FreeSerifItalic.sfd: Fixed kern classes that end in space (crashes FontForge) * FreeSerifItalic.sfd, FreeSerif.sfd: kerning 2008-12-19 Stevan_White * FreeSerifItalic.sfd: kerning * FreeSerif.sfd: kerning Some adjustments to Glagolitc spacing, mark positioning 2008-12-18 Stevan_White * FreeSerif.sfd, FreeSerifItalic.sfd: kerning 2008-12-17 Stevan_White * FreeSerif.sfd, FreeSerifItalic.sfd: kerning 2008-12-11 Stevan_White * FreeSans.sfd, FreeSerif.sfd: kerning 2008-12-10 Stevan_White * FreeSans.sfd, FreeSansBold.sfd: kerning * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: kerning 2008-12-09 Stevan_White * FreeSerif.sfd, FreeSerifItalic.sfd: kerning 2008-12-08 Stevan_White * FreeSansOblique.sfd: Slanted small final sigma. Remedies bug #24993: U+03C2 "Greek small letter final sigma" not slanted in Free Sans Oblique https://savannah.gnu.org/bugs/index.php?24993 2008-12-07 Stevan_White * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: kerning, etc 2008-12-06 Stevan_White * FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: kerning Tweek in Sans having to do with addition of Latin Extended 2008-12-05 Stevan_White * FreeSansBold.sfd, FreeSansBoldOblique.sfd: Tweeks to Latin Extended Additional * FreeSansBoldOblique.sfd: Added Latin Extended Additional range * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Extra space at end of kern class names has bad effect on FornForge script that try to run through kern classes. Some FontForge call corrupts memory. Got rid of extra space. 2008-12-02 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Replaced U+0387 GREEK ANO TELEIA with top dot of colon. See bug #24987: U+0387 GREEK ANO TELEIA too low https://savannah.gnu.org/bugs/index.php?24987 * FreeSerif.sfd: more kerning in Cyrillic (broke into two tables of classes) 2008-12-01 Stevan_White * FreeSerif.sfd: tweeks to kernin * FreeSerifBoldItalic.sfd: kerning 2008-11-30 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Kerning for Latin and Cyrillic fairly complete in Serif faces. Complete in sense that it looks pretty good under Pango for English French German Spanish Polish Czech Latvian But have not done Vietnamese (will require many more entries). I adjust roman and italic, then copy tables by hand to bold and bolditalic. Misgiving: bolditalic is much too crammed Overall, I may have over-kerned. (A difficult temptation to master.) * FreeSerif.sfd, FreeSerifItalic.sfd: kerning * FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: kerning In Serif, modified widths of some extended latin glyphs 2008-11-29 Stevan_White * FreeSerif.sfd: Broke Latin kerning subtable into four, hoping it will be easier to understand and maintain. * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd, FreeSerifBold.sfd, FreeSansOblique.sfd, FreeSans.sfd: kerninig 2008-11-28 Stevan_White * FreeSans.sfd, FreeSerif.sfd: more kerning; made guillemot narrower * FreeSansOblique.sfd, FreeSerif.sfd: previous commit was incomplete * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Adjusted width of single quotes (and apostrophe) to be "punctuation width" More fiddling with kerning. 2008-11-27 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: much fiddling with kerning 2008-11-26 Stevan_White * FreeSerifBold.sfd: Basic kerning, named main Cyrillic letters * FreeSerifItalic.sfd: Basic Cyrillic kerning * FreeSerif.sfd: Tweeks to Cyrillic kerning * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd, Makefile: Much fiddling with kerning, tables, and generating fonts whose kerning tables work with OpenOffice. 2008-11-24 Stevan_White * FreeSerif.sfd: regularized padding in Miscellaneous symbols. At least within related ranges tried to make similar. Made to validate 2008-11-23 Stevan_White * FreeSerif.sfd: Filled out Miscellaneous Symbols. Used George Douros' Unicode font. Completed Miscellaneous Symbols, with some drawings from George Douros' Unicode Symbols, and some of mine. * FreeMono.sfd, FreeMonoOblique.sfd: Replaced Greek Exteded psili and dasia with scaled versions of the "bent quote" mark. I think it's distinctive enough, but not so silly. Remedies bug #22997: Mono: Greek Extended psili is ugly https://savannah.gnu.org/bugs/?22997 * FreeSerif.sfd: Made some recycling symbols * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Finished with Hebrew Pointed letters in all faces. 2008-11-22 Stevan_White * FreeSans.sfd: Fiddled with Hebrew Pointed letters * FreeSerifItalic.sfd: Marks for Vietnamese * FreeSerif.sfd, FreeSerifItalic.sfd: Letter pe had strange thick middle ear that looked awful. lamed had ben bumped at some point. Fixed. Adjusted some of the points. 2008-11-21 Stevan_White * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: repairs to Pointed Hebrew * FreeSerif.sfd: Numeral line positioning marks for Gothic * FreeSerifItalic.sfd: Added Combining Marks for Symbols (some question about obliqueness of some symbols) Cleaned up some empty glyphs in Pointed Hebrew. 2008-11-20 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Provided Hebrew pointed letters, with lookups, for all Serif faces. 2008-11-19 Stevan_White * FreeSerifBoldItalic.sfd: renamed Hebrew lookups * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Completed Hebrew in Bold faces. * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: More tweeks to Hebrew points * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: Adjustments corrections and additions to Hebrew points 2008-11-18 Stevan_White * FreeSansBold.sfd: Cleaned out a lot of ridiculous kernings 2008-11-17 Stevan_White * FreeSansBoldOblique.sfd: fiddled with Armenian ligatures * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Added Armenian (with ligatures) to BoldOblique Fiddled with character spacing 2008-11-16 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added U+01f9 and paragraph end marker to Georgian Fiddled with Armenian ligatures 2008-11-15 Stevan_White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Another pass at letter spacing in Cyrillic. Also went through ancient letters. Added Georgian paragraph separator 10FB Added Georgian turned gan 10F9 (because it was easy) Re-worked letter spacing through modern Cyrillic range. * FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd: Letter spacing 2008-11-14 Stevan_White * FreeSerif.sfd: Added several characters to Cyrillic Extended-B * FreeSansBold.sfd, FreeSansBoldOblique.sfd: Made Cyrillic hooked e U+04BC-F to look less goofy. * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Based on assertion on Pechatnyj Dvor's web site, Cyrillic Fita U+0472-3 and "Barred O" U+04E8-9 are different styles the same letter, and the fact that the tilde in the O never looked good in Sans, I made them all barred O's. * FreeSerif.sfd: Added Cyrillic Yn, yn (U+a65e-f) * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Synced up Cyrillic and Combining Diacritics ranges, Couple of tweeks in Gujarati to make TT validate * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Changes to older Cyrillic letters, in response to further information. Made omegas, omegas with titlo, and OT to all be of the same size and shape in Serif. Un-linked Cyrillic Psi and psi from Greek, made squarer versions. Some more Cyrillic diacritical marks in Sans. Re-worked U+04bc-f . Experimenting with mark positioning for Cyrillic 2008-11-12 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Strove to make Euro look more like the EC logo design, while making glyph fit better with the design of its face. Bug #3576: Euro design https://savannah.gnu.org/bugs/?23576 * FreeSans.sfd, FreeSerif.sfd: Adjustments mostly to GPOS tables having to do with Vietnamese marks. The WAZU Vietnamese test page looks pretty good in Sans now. Still not thrilled with below-dot when it appears with a mark over e.g. U+0102. Pango positions one or the other but not both. * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Extensive modification of GPOS lookup tables for mark positioning. I think they're now all functional (except styled Mono faces have none). Also added lots of marks to faces that didn't have them, and also fiddled with Combining Diacritical Marks. 2008-11-10 Stevan_White * FreeSerif.sfd: Made one combining mark really combining * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Made a few combining characters to be zero-width in Mono, Added them to other styles. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Figured out why below marks in Thai weren't working in the lowest letters. I think Pango and other font renderers ignore 'blwm'. However, 'mark' works. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Tweeks to Thai marks 2008-11-09 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Several bugfixes in Thai, mostly having to do with mark placement and ligatures. Implemented ru-saraaa and lu-saraaa with ligatures. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: added and named dottedcircle (used by Pango to render combining mark base) * FreeSerif.sfd: Tweeks to Coptic, after viewing more papyrus samples and web pages. * FreeSerif.sfd: Weight of Coptic small letters made to match that of Latin and Greek ones. 2008-11-08 Stevan_White * FreeSerif.sfd: Made Coptic to comply better with http://www.wazu.jp/gallery/Test_Coptic.html Made a flourish at foot of letters with long diagonal. More tweeks to Coptic; put in a mark lookup table. Note: for small letters I made scaled references to captials. Results in those letters looking quite light next to the capitals and next to small Latin letters. Also, there are a few variant forms for capitals (Unicode samples don't show this). It would be good to re-work Added Coptic alphabet in u+2C80-2CB1 and u+03E2-u+03EF, drawn/built by me, based on Unicode samples, TeX font copte, and scans at WikiPedia. 2008-11-07 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Further tweeks to dieresis in Greek and Cyrillic * FreeSerif.sfd: replaced Greek I dieresis with references, tweeked height of dieresis. 2008-11-04 Stevan_White * FreeSerif.sfd: Added a few Cyrillic Extended-B letters seen in web pages while looking for Glagolitic text. * FreeMono.sfd, FreeMonoOblique.sfd: Added a few old Cyrillic characters. * FreeSerif.sfd: Several corrections and tweeks to Glagolitic. Still missing six slots from Unicode, but don't see them in the TeX fonts. On the other hand, several on-line Glagolitic pages (bibles etc) don't seem to use these. Maybe it's OK as-is. 2008-11-03 Stevan_White * FreeSerif.sfd: Added lowercase range to Glagolitic, as a facile scaling of the uppercase. Added letter to Glagolitic, scaled range. 2008-11-02 Stevan_White * FreeSerif.sfd: Replaced fraktur bold from Mathematical Alphanumeric Symbols with that from TX Fonts by Young Ryu. One concern: letter k is damaged (in both medium and bold). I just hacked something up. Added Glagolitic "round type" font (Croation capitols only) from the collection of Croatian fonts for LaTeX by Darko Zubrinić ftp://ftp.dante.de/tex-archive/languages/croatian/ http://www.tug.org/TUGboat/Articles/tb17-1/tb50zubr.pdf Several letters are missing besides the small letters. * FreeSerifBoldItalic.sfd: A couple of Thai references got obliqued twice. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: By popular demand, removed 'ears' from Greek Upsilon and Psi. Copied resulting glyphs to Serif Mathematical Alphanumeric Symbols. * FreeSerif.sfd: Some pointwise cleanup of main Tamil range Tried some things with lookups. Didn't make much headway. 2008-11-01 Stevan_White * FreeMono.sfd: somehow made a letter with wrong width * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added similar lookups and ligatures to Thai ranges. * FreeSerif.sfd: Lookups now work no worse than those for other Thai fonts, at least in Pango. Still perplexed by behaviour of "Required" lookups. For Thai, made ligatures and lookups for yoying and thothan combined with a lower vowel. These work well. Attempted looksups for saraaa with ru and lu, and for saraam. Not working. Cleaned up a few of the Bengali ligatures * FreeSerifBold.sfd: Tweek Thai 2008-10-31 Stevan_White * FreeSerif.sfd: Fixed ligatures and mark positioning for Hanunóo. Problem with ligatures: Gnome pango doesn't do 'rlig', only 'liga' * FreeSerifItalic.sfd: Changed lookup table scripts for Devanagari and Bengali. Find Problems -> ATT found several problems showing lookups acting on glyphs that weren't listed in the script ranges, including dev2, bng2 (why not deva and beng, I don't know). danda and doubledanda of Devanagari I understand are to be shared among Indic scripts. So included bng2 and dev2 in the 'aalt' table for those. The 'init' and 'half' tables for Bengali made active for bng2. The 'locl' table for Bengali didn't do anything I could see: It mapped the Devanagari danda to itself, and the doubledanda to itself. Deleted. Cleaned up some kern tables. adjustments of under 5 EM are invisible. Some others I just didn't like. Some were putting a letter beneath another, with is wrong. * FreeSerifBoldItalic.sfd: Added Thai * FreeSerifBold.sfd, FreeSerifItalic.sfd: Changes to mark positioning lookups, esp. in Italic. Widened numerals in Bold 2008-10-27 Stevan_White * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Tweeks regarding Armenian and lookups * FreeSansBold.sfd: Added Armenian ligatures FB13-FB17 with lookups Also made a historical ligature ('hlig') table for u+0587. Toward bug #15183: missing characters from Armenian range https://savannah.gnu.org/bugs/index.php?15183 * FreeSansOblique.sfd: Added Armenian ligatures, lookups. Cleaned up contours. * FreeSans.sfd: Added 5 Armenian ligatures to U+FB13 – FB17, and made corresponding 'liga' lookup. Found there one ligature u+0587 that according to http://en.wikipedia.org/wiki/Armenian_alphabet "in new orthography the և character is not a typographical ligature anymore, and must never be treated as such. It is a distinct letter and has its place in the new alphabetic sequence." So moved this out of the 'liga' lookup and into a new 'hlig' lookup. 2008-10-26 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: Lots of improvements to Thai. Completely revised letter spacing in Italic, and fiddled with combining marks in all. Still aren't working quite right, especially in Italic. Still need to work over digits (in Bold they aren't even bold yet) * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: Bold Thai : added (painstakingly) constructed glyphs, lookups roman Thai: tweeks Italic Thai: tweeks (Note this still has multiple problems) 2008-10-25 Stevan_White * FreeSerif.sfd: WAZU says http://www.wazu.jp/gallery/Fonts_Hanunoo.html MPH 2B Damase doesn't support the consonant-vowel ligatures necessary to render Buhid writing. OK, so I made 'mark' lookups for combining marks and a bunch of ligatures in an 'rlig' lookup. The latter still not working: don't know why. Made page to match the example of the combining forms at http://www.omniglot.com/writing/hanunoo.htm 2008-10-24 Stevan_White * FreeSerif.sfd: Removed some marks from Mathematical Alphanumeric Symbols * FreeSerif.sfd: Tweeked combining marks for Vietnamese. Made to satisfy WAZU JAPAN Comprehensive Unicode Test Page for Vietnamese http://www.wazu.jp/gallery/Test_Vietnamese.html Could still use some tweeking... * FreeSerif.sfd: Added marks for composition of Vietnamese * FreeMono.sfd, FreeSerif.sfd: Put "below" combining mark on lots of vowels and derivatives, for Vietnamese. Named a bunch of composit Latin, expecting to make substitutions. 2008-10-23 Stevan_White * FreeSerif.sfd: Thai spacing alterations based on advice of a native speaker. 2008-10-22 Stevan_White * FreeSerif.sfd: re-named Thai lookups according to order 2008-10-21 Stevan_White * FreeSans.sfd: Cleanup of glyphs in Gujarati, Devanagari. Note: Serious problem with Sans GPOS abvm in Devanagari "'abvm' Above Base Mark in Devanagari subtable" "gujr-0" But all the characters that list gujr-0 are in Gujarati. Not sure how this got broken or how to fix it. * FreeSerif.sfd: Fiddled with Thai mark positioning: passes my tests now OK. Made a few more references in Math Symbols; more regularization of stroke. * FreeSerif.sfd: Added mark class for Vietnamese "horn" Several references made in General Punctuation, Arrows * FreeMono.sfd: added some Combining Diacritical Marks 2008-10-20 Stevan_White * FreeSerif.sfd: Made some references from serifed Latin capitals to Greek counterparts. * FreeSerif.sfd: Made a few repeated glyphs into references in Musical Symbols 2008-10-19 Stevan_White * FreeSerif.sfd: Moved several glypns from Mathematical Alphanumeric Symbols to Letterlike Symbols. Couple tweeks in Mathematical Symbols. * FreeMono.sfd, FreeSerif.sfd: Fiddling with Mathematical Symbols. In Serif, trying to make stroke width more consistent. * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd: Added some Greek symbols in Mono and Sans to make a little more regular and correspond better with TeX. Tweek of serif. * FreeSansBold.sfd: a few more improvements. One problem with the Mathematical Alphanumeric area is, one must remember to change it any time another face is altered... * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerifBold.sfd: Several improvements and additions to Sans faces (mostly in Greek) from experience of pasting into FreeSerif Mathematical Alphanumeric Symbols. * FreeSerif.sfd: Replaced most of Mathematical Alphanumeric Symbols roman italic bold (latin and greek) gothic italic bold (latin and greek) typewriter and numerals with glyphs from FreeFont. These were scaled to uniform height. Remains: Blackboard Bold, Fraktur, Calligraphic, Script * FreeSerif.sfd: Tidied lookup table names for Malayalam * FreeSerif.sfd: Applied Malayalam patch from Hiran Venugopalan * FreeMono.sfd: Added/corrected many Mathematical Symbols * FreeSansOblique.sfd: more IPA 2008-10-18 Stevan_White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Made lots more IPA and Phonetic Extensions Note: fontforge is reporting an error in a few glyphs made by scaling another, that the glyphs are drawn in the wrong direction--only in TrueType though. Suspect a FontForge bug. Added several Combining Diacritical Marks 2008-10-17 Stevan_White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Made several Spacing Modifier Letters, Combining Diacritical Marks, and IPA and Phonetic Extensions 2008-10-16 Stevan_White * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added some Superscripts and Subscripts * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Finished off Superscripts and subscripts Completed General Punctuation for Mono faces Added some General Punctuation 2008-10-15 Stevan_White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: more Letterlike Symbols, Currency Symbols * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Made some Combining Diacritical Marks for Symbols, Letterlike Symbols * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Added some General Punctuation 2008-10-14 Stevan_White * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Added double slanted hyphen, made General Punctuaton Supplement like Serif's * FreeSansBoldOblique.sfd: Filled out Greek Extended * FreeMono.sfd, FreeSerifItalic.sfd: fixes to last 2 commits * FreeSerifItalic.sfd: Last character to General Punctuation * FreeMono.sfd: Built some Enclosed Alphanumerics (1-10) * FreeSerif.sfd: Copied in Daniel Johnson's changes to Cherokee. 2008-10-12 Stevan_White * FreeSerif.sfd: Included Daniel Johnson's Cherokee glyphs. 2008-10-05 Stevan_White * FreeMono.sfd: Further corrections to diaresis in Cyrillic -- legibility in small sizes * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: Regularized placement of diaresis in Cyrillic * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added same set of glyphs to Cyrillic Supplement * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Added some of the easier letters from Cyrillic Supplement 2008-10-04 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSerifItalic.sfd: Finished high Cyrillic range for MonoBold and MonoBoldOblique. (Remaining: historic ranges, Cyrillic extensions) Tweeked others. * FreeMonoBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Serif*Italic: Added last Abkhazian letters to Cyrillic MonoBold: tweek 2008-10-03 Stevan_White * FreeMono.sfd, FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifBoldItalic.sfd: Mono: Some additions to historic letters * FreeSerif.sfd: Added some punctuation and combining numeric marks from Cyrillic Extended B * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Various technical tweeks, mostly concerning recent additions. Also did a bit more "Points too close" and "irrelevant control points". Cyrillic millions redesign meant could not maintain use of refrences for it. * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More high Cyrillic Included old Cyrillic millions combining mark in Sans, changed design in Serif 2008-10-02 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: More high Cyrillic * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd: More high Cyrillic glyphs * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More glyphs in high Cyrillic. Remains only some whose form I'm unsure of in italic. * FreeSerifBoldItalic.sfd: More glyphs in higher Cyrillic range * FreeSerifItalic.sfd: Same process of tightening el, em, ge (but a P.S. to previous commit: also did ya, ze for SerifBold.) * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: BoldItalic: Tightened up spacing on left of el, em, ge (could go farther, but it is partly a problem with glyph design... * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More additions to Cyrillic. Finished SerifBold except for Nivkh additions. Used references on number combining forms. 2008-09-30 Stevan_White * FreeSerif.sfd: Added four (obsolete) Chuvash letters to Cyrillic Supplement - completing it. 2008-09-29 Stevan_White * FreeSerif.sfd: Greek adjustments Adjusted spacing of kappa slightly Got rid of ears on Psi, following similar request for Upsilon. 2008-09-28 Stevan_White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Adding and fiddling with Spacing Modifiers and Combining Diacriticals * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Revisions of several Combining Diacritical marks * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: A few Combining Diacriticals and Spacing Modifiers MonoBoldOblique: Primarily filling out Spacing Modifier Letters others: little fixes found along the way 2008-09-27 Stevan_White * FreeSerif.sfd: Replaced Malayalam range with that from Rachana_04 found on Swathanthra Malayalam Computing project page http://savannah.nongnu.org/projects/smc/ Besides scaling and converting to cubic, performed much clean-up of glyphs, added an r2 character, and re-named a bunch of characters. 2008-09-22 Stevan_White * FreeSerif.sfd: Filled in as much of Phonetic Extensions as I could without artistic abilities. Note 1D48-9 are not references due to apparent FontForge bug, that says scaled references go in wrong direction. * FreeSerif.sfd: Cleaup of some Bengali glyphs. Note many of the ligatures remain very very messy. * Makefile: added more validations made to work with GenerateOpenType * FreeSerif.sfd: Built two more easy Phonetic Extensions * FreeSerif.sfd: Built some Phonetic Extensions letters, those with middle tilde 2008-09-21 Stevan_White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Added lots of Spacing Modifier Letters and Combining Diacritical Marks. * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSerif.sfd: Wrote script to check if glyph encodings were in stated ranges, fixed most discrepancies. There were a bunch of incompletely deleted characters in several faces. Sans: found several other problems in the process # Tamil Four slots labelled 0BDA-D have glyphs, not in Unicode. also 0BE1 I think they are misplaced; added 0010 to each of them # Devanagari Slot labelled U+093B is not in Unicode--can't find glyph: deleted likewise 094F (may have been meant to be 0954) 0955, 0973-0976 0954 should be a combining mark, but it appears on the wrong side of 0. 0971 was just wrong--made into simple dot. 0972 is also wrong--made my own Candra A. # Gujarati Slots labelled 0AE4-5 are not in Unicode; seem not to belong at all. Deleted. 2800 is a dup of 2790. Deleted Serif: phillipine_double u1736 was misplaced A bunch of the Math Alphanumeric symbols are empty in the standard, because they're represented elsewhere. These should be deleted First need to make style consistent with existing symbols. * FreeSerif.sfd: Applied patch from Daniel J Remedies bug FreeSerif: Missing glyphs with palatal hook https://savannah.gnu.org/bugs/index.php?24298 Adding several letters to Phoenetic Extensions range U+1D80-BF * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Made four characters U+200C-F to be zero-width Remedy to bug #23593: Mono 0-width chars: zero-width or space? https://savannah.gnu.org/bugs/index.php?23593 * FreeSerif.sfd: Made Mahjong tiles to take up less space using references Cleaned up several validation problems 2008-09-19 Stevan_White * FreeSerif.sfd: Added several Hebrew Alphabetic Presentation Forms (some easy ones), to make its coverage the same as Serif Bold. * FreeSerifBold.sfd: Re-encoded. Deleted several glyphs in Hebrew Alphabetic Presentation Forms that didn't correspond valid Unicode * FreeMonoBold.sfd, FreeSans.sfd, FreeSerifItalic.sfd: Ran script to find mis-numbered glyphs. Several were simply typos, some offset by one. * FreeSansOblique.sfd: Numerous cases of glyphs in Private Use area incorrectly assigned Unicode numbers and names. Gave all -1 for Unicode and named like "slot.XXXX". * FreeSerif.sfd: Adapted Mahjong Tiles from George Douros' Unicode Symbols font. * FreeSerif.sfd: Added Domino Tiles. Domino outline is copied from George Douros' Unicode Symbols, but the rest I preferred to do with references. 2008-09-18 Stevan_White * FreeSerif.sfd: Adapted Mathematical Alphanumeric Symbols from George Douros' Unicode Symbols font. * FreeMonoBoldOblique.sfd: This one got away from me--I don't know what I did. Looks like some small contour edits. * FreeSansBoldOblique.sfd: Fixed one mis-numberd character in Latin Extended-B * FreeSerifBold.sfd, FreeSerifItalic.sfd: Fixed several mis-numbered characters. * FreeSansBold.sfd: SansBold: one Georgian letter with no name, one Zapf Dingbat was unnumbered ATT test shows a bunch of problems with Gurmukhi and 'blwf' table indeed shows those letters at 0x10000+ Sans names them like uni0A30_uni0A4D.blwf: they are in range ECC6 to ED06 I meant to move this range into Private Use in last release, and missed it. So now it is moved, into same range as Sans. Both Sans and SansBold in nukt table for Gurmukhi have duplicate entries for uni0A15 uni0A3C. Deleted dups. * FreeMonoOblique.sfd: fixed a number of Unassigned Code Points in Greek Extended * FreeSansOblique.sfd: mis-numbered Combining Diacritics * FreeSansOblique.sfd: Several chars in Latin Extended hadn't been named. One spurious letter in Letterlike Symbols 2008-09-16 Stevan_White * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: Lots of additions: unless otherwise noted, they are from George Duros' fonts Analecta, Music, and Unicode (haven't got final confirmation of the eligibility of these glyphs, so this is just for testing.) Added some combining marks, fiddled a bit. In both Serif & Mono, tried to get a key symbol characters to fit inside the key combining mark Serif Got rid of ears on Upsilon Added: # Gothic # Western & Byzantine Musical Symbols # Misc Symbols, Misc Technical Symbols (drew many myself) # Supplemental Symbols and Arrows Mono Added: # lotsa Misc Technical Symbols # OCR Symbols # drew many Supplemental Symbols and Arrows, Misc Technical Sans Added # Phoenecian Made a few Letterlike Symbols; Made Re and Im to be sans-serif. 2008-09-11 Stevan_White * FreeSerif.sfd: Removed pointless entries from Latin kern table Tidied points in Sinhala 2008-09-07 Stevan_White * FreeSerif.sfd: Tidied up Tamil ligatures EEA8-EEAB to fix TT build warning "MonotonicFindAlong: Never found our spline." * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, Makefile: Added APL characters to FreeMono (why?...) Fixed several last-minute problems, including Serif: Tweeked GPOS mark table for Cyrillic Sans: Added a GPOS table for Cyrillic (but several diacritics missing) Serif, Mono: tweeked some bugs in extensible brackets & integrals Serif: Vietnamese o circumflex: accent was a bit high. fixed. MonoBoldOblique OTF build uni213b intersects self Generation of TT fonts complains about several things to stderr, including: SerifBold: "There exists a 'fpgm' code that seems incompatible with FontForge's. Instructions generated will be of lower quality. If legacy hinting is to be scrapped, it is suggested to clear the `fpgm` and repeat autoinstructing. It will be then possible to append user's code to FontForge's 'fpgm', but due to possible future updates, it is extremely advised to use high numbers for user's functions." Probably has been there since I first copied the TT instructions in. Just repeated the copying process carefully, and the warning went away. Serif: "FindMatchingHVEdge fell into an impossible position" fixed a bunch of point too close REMAINING PROBLEM in Serif TT build "MonotonicFindAlong: Never found our spline." fixed several bad TT matrices-- there are several more fixed many "control points too close" no luck 2008-09-03 Stevan_White * FreeSans.sfd, FreeSansOblique.sfd: Added/corrected some Misc. Symbols by copying from Serif. Note this is only a stopgap solution. Want real sans-serif symbols. * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added minimal Miscellaneous Symbols: card suites and some musical notes. Note not happy with shapes...some I just drew. Sans isn't really sans. Fixed one APL symbol in Mono so it verified in OTF version 2008-08-31 Stevan_White * FreeMono.sfd: Built set of APL symbols. 2008-08-30 Stevan_White * FreeSans.sfd: Un-linked references in uni02B2 and uni02B5, because when validating the TrueType version, FontForge gave an error "is drawn in wrong direction". I suspect a bug in FontForge. Other similar glyphs make no errors. Fixed missing extrema in TrueType. These were the last cases being reported by validate in all the faces. * FreeSerifItalic.sfd: fixed last missing extrema in TrueType * Makefile: restructured validation to look in a directory * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: Fixed missing extrema in TrueType versions 2008-08-15 Stevan_White * FreeSans.sfd: Same problem with uni0A83 as with bn_llikaar. Just made zero-width. 2008-08-14 Stevan_White * FreeSans.sfd, FreeSansOblique.sfd: Glyph bn_llikaar, U+09E3 BENGALI VOWEL SIGN VOCALIC LL, has right bound positioned far into the negative. Causes a warning in FontForge when opening OTF version. Comparing with other fonts supporting Bengali, found no others that do this. Serif makes glyph width 0 (which sounds right according to Unicode) and puts glyph wholly to left of 0. But, I haven't found this letter in text anywhere. I wonder if it is really used in writing. * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: Further TrueType validation fixes. Sans still has two glyps in wrong direction. * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Fixed more TrueType problems...all missing extrema in TTF validation 2008-08-13 Stevan_White * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: fixed all the TrueType validation problems of type "intersects itself" and all but two of the "wrong directions", as well as a lot of "missing extrema". But there remain hundreds of missing extrema in the TrueType version. Also, bn_llikaar in Sans and Oblique still has a problem in OTF version. * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd: Made .ttf files to validate. Other faces have many more problems still. 2008-08-12 Stevan_White * FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: Continuing to make OTF versions validate. * FreeMonoOblique.sfd: lots of missing points at extrema * FreeSerif.sfd: 12 wrong directions, 1 missing extrema * FreeSerifItalic.sfd: many missing points at extrema, 1 self-intersecting What was wrong: in several oblique cases, an already-italic glyph was made more italic, thereby fouling up extrema (although why it passed validation in the SFD I don't know). Some glyphs were overly-complicated with many near points. Cleaned up, rounded to int. Remaining problem: OTF FreeSansOblique FreeSans. one Bengali glyph in each whose advance width and htmx don't match. Moral of story: validate the OTF and TTF versions too before a release. * FreeSansOblique.sfd: Reverse a mistake from last commit: somehow this file was converted to quadratic, or something. 2008-08-11 Stevan_White * FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Found that SFD files that validated produced OpenType files that don't. These represent the easy fixes. Some were result of conversion to quadratic; some shouldn't have validated in the SFD... * MonoBoldOblique: uni0250 missing pts at extrema [reference glyph rotated...] * Sans: uni0AC4 wrong direction [simplified, rounded to int] * SansOblique: uni01EA wrong direction [rounded to int] * SerifBold: uni023f wrong direction [round to int] * SerifBoldItalic: uni0245 missing pts at extrema [ungrouped ref, added extrema] 2008-08-06 Stevan_White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: Re-set font metrics, which were somehow making uneven vertical spacing. 2008-06-22 Steve White * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Made to validate * ranges.py: Brought more into line with OpenType Added some ranges Fixed bug with ranges outside of font * CREDITS: 3 new ranges * FreeSerif.sfd, FreeSerifItalic.sfd: Cyrillic: tweeked accents for consistency, and for readability in small sizes. * FreeSerif.sfd: Thanna range: tweeking Thaana range: Scaled up by about 15%, raised by 100EM, tightened some of the diacritics to get inside 900 to -300 EM limits. * FreeSans.sfd: Added Old Persian and Ugaritic from MPH2BDamase font. 2008-06-21 Steve White * FreeSerif.sfd: Added Tai Le range adapted from MPH2BDamase font. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Added some ancient Greek numerals from Tempora to high Unicode area, (partly just to show it can now be done.) * FreeSerifItalic.sfd: Couple of tweeks putting glyphs above -300EM. * FreeSerif.sfd, FreeSerifItalic.sfd: Surgery to Thai letter 'tho than', u+0e10, to push it above -300 EM. This makes Thai range completely between 900 and -300 EM. * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: Many auxilary characters (esp. for Malayalam, Bengla, and Tamil) representing ligatures and alternative forms without their own Unicode, were moved from ranges above 0xFFFF (which ought to have been slots for other defined Unicode ranges) into the Private Use area. In Serif, I segregated the scripts, in Sans it was hard to see where one began and another ended, so I moved them en masse. Note several problems with wrongly-named characters: I already re-named glyph570 and glyph582. But there are others with names starting with A... * FreeSansBold.sfd, FreeSansOblique.sfd: Fixed (I hope the last) problem with scripts in lookups Find Problems -> ATT (all selected) finds multiple issues, * FreeSansBold.sfd: In addition to script 'guru', added 'gur2' to the scripts for these lookups 'nukt' Nukta forms in Gurmukhi 'blwf' Below Base Forms in Gurmukhi 'pstf' Post Base Forms in Gurmukhi 'blws' Below Base Substitutions in Gurmukhi 'abvs' Above Base Substitutions in Gurmukhi 'psts' Post Base Substitutions in Gurmukhi * FreeSansOblique.sfd: In addition to script 'beng', added 'bng2' to the scripts for the lookup 'half' Half Forms in Bengali Moreover, the lookup 'aalt' Access All Alternates in Latin contains only Bengali letters. Re-named as Bengali, made to work on beng, bng2 scripts 2008-06-20 Steve White * FreeSerif.sfd: Scaled Sinhala range. Remedies bug #23656: Sinhala letters over-sized * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Mostly messing with Greek Extended accents again. re-positioned ypogegrammani on advice of Alexey Kryukov Put prosgegrammani beneath main letters in Mono, to make narrower glyphs Implemented more distinction between tonos and acute. 2008-06-19 Steve White * FreeMonoBoldOblique.sfd: Completed fit of Mono to 800 to -200 EM. * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: Set Metrics to recommended values * FreeMonoOblique.sfd: Now Mono Oblique, as well as roman and Bold, are within 800 to -200 EM. Just BoldOblique to go. * FreeMono.sfd, FreeMonoBold.sfd: More toward fitting to 800 to -200 EM. Basically, reduced Georgian by 92%. Also made an over-all offset, so Georgian is somehow centered (Bold...I guess I already did this in roman). Want to also do an emboldening to make stroke like rest of font, but current FontForge has a nasty crash that loses data on this function. * FreeMono.sfd: In effort to make fit in 800 to -200 EM, Scaled Georgian by 92%, centered on 600 wide box. Next: Embolden a bit. 2008-06-18 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Toward making all glyphs lie between -200 and 800 EM. Numerous small changes, especially raising descenders of some Hebrew letters. Georgian remains a problem 2008-06-13 Steve White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Moved prosgegrammeni up to baseline, (and then moved all references down to baseline) * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added Control Picture "blank" to all faces. Switched U+0222-3 from TemporaLGCUni 2008-06-11 Steve White * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More fiddling with Greek Extended accents * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Tweeks to accents etc in Greek Extended and Cyrillic 2008-06-10 Steve White * FreeSerifBold.sfd, FreeSerifItalic.sfd: Fixed a few big horizontal spacing problems * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Implemented TemporaLCGUni glyphs in Cyrillic ranges. Added a breve_cyrillic for the moustache breve mark. 2008-06-08 Steve White * FreeSerif.sfd: Replaced most of Cyrillic range with TemporaLGCUni. Remodelled many of the derived Cyrillic characters after these. Fiddled globally with spacing of small letters. Unclear on diacritics 485-6, unhappy with breve. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Started implementing TemporaLCGUni in Greek ranges. Replaced 3DC-3E1 from Tempora, because I thought they looked nicer and more like the other existing FreeFont glyphs. Replaced 3DA-B from Tempora, because they look more like Unicode samples, and nicer. Added 03f3-4, 03F7-F. Prefer my own lunate epsilon. Replaced Phi and Omega from Tempora. These plainly fit the other FreeFont glyphs better than the origninals. (How did this happen?) In bold, replaced U+03D7 Copied lbbar u+2114 Small italic greek--replaced most except phi, psi, omega Based on new information, broke the identification of oxia with Latin acute. 2008-06-07 Steve White * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Efforts to control heights of characters 2008-06-06 Steve White * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Made to validate 2008-06-05 Steve White * FreeSans.sfd: Fixed undefined character in kerning classes 2008-06-04 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: tweeks and additions to General Punctuation 2008-06-03 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansOblique.sfd: Completed/tweeked Number Forms * FreeMono.sfd, FreeSerif.sfd: Added some Miscellaneous Technical symbols 2008-06-02 Steve White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Tweeks...mostly Letterlike 2008-06-01 Steve White * FreeMono.sfd, FreeSerif.sfd: Added Box Drawing characters to Serif. Tweeked a glyph in Mono * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Added several glyphs to Letterlike Characters 2008-05-31 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Validation pass SansOblique and SansBoldOblique had validation problem with BlueValues Private Dictionary Elements in BlueValues/OtherBlues array are disordered Elements in BlueValues/OtherBlues array are too close (Change BlueFuzz) StemSnapV does not contain StdVW value. So I ordered the array, and based on other slanted fonts, removed StemSnapV. Note however, I still think the two top Blues lines are too close But I don't even know what the second-to-top line is meant to do. * FreeSerif.sfd: Added to Block Elements, Geometric Shapes Made to validate 2008-05-29 Steve White * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Looking at special symbols. Drew several Miscellaneous Symbols in Mono and Serif > Completed/corrected planetary symbols, added Dice, some other easy ones > Completed Dingbats in Serif (using URW Dingbats) Added some Block Elements to Serif 2008-05-26 Steve White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More changes stemming from J. Poon's report. 2008-05-25 Steve White * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Height surgery on SerifBoldItalic. More fiddling with accents in others. * FreeSerifItalic.sfd: More height surgery. Only a few left in Benglai and Thai * FreeSerifBold.sfd: Re-applied surgery to make glyphs between 900 and -300EM *** Regression Inadvertently un-linked all references in SerifBold in r1.83. This reverses that error (but also un-does the surgery mentioned there) * FreeSerifBold.sfd, FreeSerifItalic.sfd: Applied surgery to make Latin letters go under 900EM. One exception yet... 2008-05-24 Steve White * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Serif: much fiddling with accents in Latin ranges. Re-thought some glyphs (there are still a few messy ones, especially in bold) Checked horizontal spacing...fixed a number of problems. 2008-05-23 Steve White * FreeSansBold.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Made Latin Extended-B coverage consistent across Serif; cleaned up some glyphs * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Filled more of General Punctuation in Sans and Serif Made all agree on coverage of Latin Extended Additional 2008-05-22 Steve White * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Added Latin Extended Additional to SansOblique. Made Latin Extended Additional coverage consistent across Sans, B, I Made Latin Extended-B coverage same in SerifBold. * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSansBold.sfd: Mono* made Latin-B coverage consistent across faces * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Made set of Latin Extended-B consistent across Sans faces * FreeSans.sfd, FreeSansBold.sfd: More filling in General Punctuation * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Another bunch of J. Poon's reports also, filling in some Combining Diacriticals, Spacing Modifiers, and General Punctuation in bold faces 2008-05-21 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Mucking about with mark tables in Thai (Serif) Other faces: Making changes from J. Poon's report 2008-05-20 Steve White * CREDITS: Mark Williamson Jacob Poon * Makefile: added tests target 2008-05-18 Steve White * ranges.py: Put table explanation back in Improved behaviour for high Unicode * FreeSans.sfd: Revision of kerning * FreeSerif.sfd: Made Latin kerning a little more reasonable: reduced many excessive kerns (some had letters apparently overlapping, which shouldn't happen) made kerns increment by 5EM for ease of reading got rid of kerns too small to be seen * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd: Made to verify 2008-05-13 Steve White * FreeSerif.sfd: Made to validate * FreeSerif.sfd: Gurmukhi: filled range in Serif, taking glyphs from the original Punjabi font by Hardip Singh Pannu http://members.aol.com/hspannu/punjabi.html (file pb_win95.exe) 2008-05-12 Steve White * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Hebrew, basic. Some faces missing punctuation marks, added. * FreeMono.sfd, FreeSans.sfd: Armenian: Sans tried to make verticals and horizontals of more uniform width both, finddled with punctuation * FreeMonoOblique.sfd: made to validate * FreeMonoBold.sfd: made to validate * FreeSans.sfd, FreeSansBold.sfd: Armenian in Sans: regularized letter spacing * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd: Armenian: fill out ranges and clean up SansBold especially had a lot of incorrect references. Now all the ranges with Armenian at least share the same set of characters. * FreeMono.sfd: Fixed glyph with wrong width. 2008-05-11 Steve White * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifItalic.sfd: 1) made to validate 2) Mono: copied in Spacing Modifier Letters (glyphs not yet named) 3) SerifItalic: Filled in General Punctuation * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Made to validate, and pass all other FontForge tests. Expedient: rounded everything to int * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Made to have the same Greek Symbols, Made to validate * FreeSans.sfd, FreeSansBold.sfd: Made Greek Symbols as full as rest of Sans. Changed a name in Sans. * FreeMonoOblique.sfd: Made Greek as full as other faces Made to validate * FreeSansBold.sfd: Deleted seven orphaned Arabic characters; looks like somebody started, didn't get very far, putting Arabic in bold. Deleted orphaned Arabic glyph from Arabic Presentation forms-B * FreeSerifBold.sfd: Deleted the single Arabic character: it was clearly there by mistake. * FreeSansOblique.sfd: Made Greek Symbols as full as rest of Sans Tweeks to Armenian Comment from previous commit of FreeSans was meant for FreeSansOblique. In FreeSans, only tweeked a few letters during putting more characters in this face. Filled in Spacing Modifier Letters, increased General Punctuation. * FreeSans.sfd: Filled in Spacing Modifier Letters, increased General Punctuation * FreeMono.sfd: Made Armenian as full as other roman faces. Completed Spacing Modifier Letters Added a couple of Greek Punctuation added more Spacing Modifier Letters 2008-05-10 Steve White * FreeSerif.sfd, FreeSerifItalic.sfd: Did same process of scaling and sizing for Thai in Sans as in Serif. Added mark tables to Sans. Improvement, but there are questions... * FreeSans.sfd: Tidied some Gurmukhi glyphs, validated. Deleted ranges for Oriya, Kannada, on account of 1) they only contained a subset of the consonant glyphs of the scripts, few if any vowels, and had no ligature lookups as required 2) Kannada was based on the Akurti fonts, which have copyright issues. See bug #23225: Oriya range only partial bug #23224: Kannada range only partial * FreeMonoBoldOblique.sfd: Made metrics like rest of Mono 2008-05-09 Steve White * ranges.py: More info on range intervals * FreeSerif.sfd: Deleted Telugu range. It didn't represent a complete writing system for the language. See notes at https://savannah.gnu.org/bugs/index.php?23202 Serif: Telugu range missing many characters; many wrong Got a copy of the original Tikkana font, Copied in remaining consonants and vowels that I could find there. I think one vowel 0C55 is missing according to unicode). Strangely, the Telugu digits are alo missing. In Tikkana, the default "checkmark" structural mark is missing from many consonants, according to Unicode, but is a separate glyph. I put the checkmark on. This, and scaled up by 150% and cleaned up intersecting glyphs and many unnecessary points. 2008-05-08 Steve White * FreeSerif.sfd: Filled out Telugu consonants. Vowels still need to be done 2008-05-07 Steve White * FreeSerif.sfd: Operated on Latin glyphs with stacked accents to make them fit under 900EM. Scaled Telugu bu 150%. 2008-05-06 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeSansBold.sfd, FreeSerif.sfd: Corrected further fontforge "find problems" Added some math characters to FreeSerif 2008-05-05 Steve White * FreeSansBold.sfd: Made to validate, and fixed bad TT transformations 2008-05-04 Steve White * FreeMono.sfd, FreeSerif.sfd: Mainly TeX additions trying to satisfy Markus Kuhn's TeX-as-Unicode page * FreeMono.sfd: Adjusted heights of extensible brackets Fixed problems with extensible brackets, thanks to Markus Kuhn's page http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt * ranges.py: fiddled with ranges, doc made some ranges more correct? fixed some bugs in ranges better error reporting Got rid of Unicode 1.1 references made to use OpenType table * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: made to validate 2008-05-03 Steve White * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Removed digits from Private Use Area. See bug 23050. * FreeMono.sfd, FreeSans.sfd: Completed General Punctuation * FreeSans.sfd: Completed IPA Extensions * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: More work on Superscripts and Subscripts, Spacing Modifiers. Sans is now complete in both. Added Pfennig to Sans and Mono. * ranges.py: Restructure text output Rearrangement and cosmetic ...except I had broken it. now fixed Seems to be in a useful form at this point. More docs, date * FreeSerif.sfd: Added a hand-drawn old German Pfennig to Currency Symbols * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: Further additions to General Punctuation, Super and Sub Scripts, Spacing Modifiers, etc. 2008-05-02 Steve White * FreeSans.sfd: additions to Spacing Modifiers, IPA * FreeSerifItalic.sfd: Shortening stacked accents to maintain readability when clipped 2008-05-01 Steve White * FreeSans.sfd: Additions to Spacing Modifiers and changes to Combining Diacritics * FreeSerif.sfd: Made sure all the half rings in Combining Diacriticals and Spacing Modifiers were really half rings (J. Poon had complained about this) Filled out General Punctuation Some work on Spacing Modifiers Filled out Mathematical Operators still needs lots of work Made to validate Filled out Latin Extended B Added some letters with curls to Latin Extended B More fiddling with Latin Extended B accents 2008-04-30 Steve White * FreeSerif.sfd: Added Hanunóo script, with characters based on those in font MPH2BDamase, on request from the maintainer of that font, http://packages.debian.org/sid/ttf-mph-2b-damase Glyphs are simple vector strokes. Could be a little more uniform. Added Buginese script "Lontara", with characters based on those in font MPH2BDamase, on request from the maintainer of that font, http://packages.debian.org/sid/ttf-mph-2b-damase Note the glyphs are pretty rough, clearly a digitization of handwriting. I just cleaned them up, and corrected discrepancies with Unicode, and compared with some pictorial samples of the script I could find. 2008-04-29 Steve White * ranges.py: Improved look a lot--still unhappy with some ranges OS/2 seems sometimes bang-on, sometimes unrelated to anything (including fontforge's OS/2 listing) * FreeSerif.sfd: Much fiddling with Tamil range. First scaled to 78% (avoiding the references) This gets it in the ballpark height-wise. [A bit taller than the Latin letters, but the stroke is narrower, but then the glyphs are busier.] Then had to re-align combined references, the trickiest being the halants. Checked with other fonts with Tamil text. 2008-04-28 Steve White * FreeSans.sfd, FreeSerif.sfd: Cleanup of control points in Arabic and Thaana * FreeSerif.sfd: Cleanup of missing extrema in Arabic and Thaana Many changes to Thai, trying to make the script fit between some lines, so accents won't get clipped, etc. Also, stroke weight was heavier than that of Latin. Scaled whole thing by 93%. Shrank the tallest letters 0E42-4 to get them under 900EM. Shaved off top of maiek. Fiddled with positioning of all accents. Made positioning tables for accents. Note: unclear these are working correctly Fixed a bug having to do with character replacements for characters named 'ng' and 'nj'; these names had been taken on by other characters. Made to validate Unicode positions of two Cyrillic Extended characters were switched. Fiddled with a couple of Cyrillic combining diacritics 2008-04-27 Steve White * FreeSans.sfd: bugfix: a left harpoon mysteriously appeared to the left of letter p! 2008-04-26 Steve White * FreeMono.sfd: Made to validate * FreeSans.sfd: Made to validate Toward J. Poons report Made 032B more like proper double-arches (and distinct fro 033C seagull) Made 032b more like a seagull * FreeSans.sfd, FreeSansBold.sfd: Sans: fiddling with widths and terminators of math symbols, toward J. Poon's report R & B: removed u+2741 because it didn't match the Unicode description * FreeMono.sfd: Extensible parenthesis symbols weight/terminators Toward bug # 23064: https://savannah.gnu.org/bugs/index.php?23064 Rounded a bunch of terminators 2008-04-22 Steve White * FreeSerif.sfd: Small alignment problem in Greek Extended One more tweek to spacing in Cyrillic Extended Corrected spacing in Cyrillic Supplement Added Cyrillic Supplement letters for Enets, Khanty, Chukchi, Itelmen, Mordvin, Kurdish, Aleut Added Cyrillic letters for Nivkh (completing Cyrillic range) More tightening of accents in Latin Extended. * FreeSans.sfd: Fiddled with math--consequences of changing the "similar" operator More tightening of accents * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Adjustments to h and k with caron and cedilla in Latin A and B * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: FreeSerifBold: deleted 3 dotted Hebrew letters in Private/Corporate use (E801-3). They weren't ligatures or in any other lookup, and they weren't present in FreeSerif. * FreeSansBold: Unlinked and deleted F6C3, which called itself commaaccent. Made some new spacing and non-spacing accents to make up for it. * FreeSansBoldOblique: Made references of many Latin Extended. Also corrected several wrong ones. * Freeserif: Re-named commaaccent 2008-04-21 Steve White * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd: Deleted Hiragana and Katakana ranges, as discussed on bugs list. Cleaned up some encoding issues, unnamed glyphs * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Roman: added 'sine' -- not beautiful, but I liked drawing it All: Made special lookup for Dutch ligatures 'IJ' and 'ij' * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Roman: ffi etc Latin ligatures from 'liga' to 'dlig' (these weren't really ligatures anyway, and only looked very bad when used. Retain for condensed type. Others: deleted Latin 'liga' table altogether BoldOblique : added j to ij ligature Toward J. Poon's Report: Except for issues of terminators not always vertical or horizontal, and a few things that were too hard or I was unsure of. 2008-04-20 Steve White * FreeSerif.sfd: Futzing with accents in Latin Extended Additional and Latin Extended-B * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Added primemod character, referenced by Greek number sign * FreeMono.sfd, FreeMonoOblique.sfd: Following J. Poon's report, disconnected NJ (01CA) 2008-04-19 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: First pass throught J. Poon's bug list. See bug reports for details. * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Made underscore slanted in Oblique faces, made all to be width of space character. Towards J. Poon's report. Disturbed that xterm and some other apps put small space between characters when none was called for. * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansOblique.sfd: Corrections on Currency Symbols * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More corrections, additions to Currency Symbols * FreeSans.sfd, FreeSerif.sfd: Filled out and corrected Currency Symbols 2008-04-18 Steve White * FreeSans.sfd, FreeSerif.sfd: Adjustments to Combining Marks for Symbols Additions to range in Sans, and re-structured its marks table so that "middle" can apply to any range * FreeSerif.sfd, FreeSerifItalic.sfd: Made reference between combining koronis and lenis of Greek Extended. In Serif, re-worked combining marks lookup tables, added anchors in Latin, moved so without marks they work in kedit (but now I'm doubting kedit does a reasonable thing...what is a better application for testing this?) 2008-04-16 Steve White * FreeSerifItalic.sfd: Adjusting of spacing and accents in Greek * FreeMono.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: Much futzing with Greek letter spacing and accents. Added lenis to FreeMono. * FreeMono.sfd, FreeSerif.sfd: Adjusted spacing of dots of Greek dieresistonons in Serif Whipped up something for Greek kappascript in Mono (could use revision) * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Raised dots on double-dotted Cyrillic i, to match that of i and j. 2008-04-14 Steve White * FreeMono.sfd: Corrected 27e6-7 "white bracket" Note it is probably a FontForge bug these symbols aren't showing up. FontForge thinks they are in Supplemental Arrows, but they should be in Supplemental Math-A Named some Greek characters * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: Spacing of some Cyrillic characters 2008-04-13 Steve White * FreeSerif.sfd: Some fiddling with accents 'yogh' was too wide * FreeSansBold.sfd, FreeSansOblique.sfd: Character spacing was chaos--tried to improve. BoldOblique also needs it. * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: Completed the fix of bug #12798, Greek glyphs with accents to side Much mucking with accents here, and fixed a few things that were just wrong. 2008-04-12 Steve White * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Made Mono curly quotes "bent" * FreeMono.sfd: More fiddling with Greek accents Made quotes "bent" * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Adjustments on Greek diaresistonos etc. Adjustments in Serif on combining marks for symbols * FreeSerif.sfd: More additions to Combining marks for Symbols Additions to Combining marks for Symbols -- now mostly full. Lots of adjustments to middle anchor point in Latin to make big circle (nearly) encircle preceding latter 2008-04-11 Steve White * FreeMono.sfd: Bugfix: Had indroduce a glyph of width other than 600, making kterminal not recognize it as a monospace font. 2008-04-10 Steve White * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More messing with accents. Further to bug #12798, Greek glyphs with accents to side Much messing with glyphs in Greek Extended range 2008-04-09 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: Revisited Latin-1 and Latin-A accents. Glyph B7 was called "periodcentered", but Unicode callse it Mid Dot, and the description doesn't refer to the period. I made it like the dot accent. throughout, and referred L-dot to it. Also double-checked "commaaccent" characters (some in Unicode called cedilla, but the Unicode example shows a comma...mystery) Also the funny IPA upside-down f often had two bars, incorrectly. To do: go through rest of Serif, and Sans * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Completed re-structuring of stacked Latin accents in Mono. Also: lots of associated adjustments of Greek Extended accents. (Trying to at least center extremely wide characters on their box) Repaired some victems of "find overlaps" sweeps Worked on glyphs with apostrope/comma parts Corrected a few wrong glyphs. Trying out a "bent quotes" solution to making primes distinct from quotes. 2008-04-08 Steve White * FreeMonoOblique.sfd: Toward reducing overall height Did similar process as for Mono, fixing a few errors along the way. Also the Greek Extended range was very messed up vertical and horizontally. Horizonal spacing of the heavily accented Greek is a real problem in Mono... To do: revisit "commaaccent" characters in all faces: do some have edillas? some Hebrew glyphs are a little low Georgian generally is way out of bounds 2008-04-07 Steve White * INSTALL: Various updates and corrections, tweeked formatting * FreeMonoBold.sfd: Tweeking of accents 2008-04-06 Steve White * FreeMono.sfd, FreeMonoBold.sfd: Re-worked accents in FreeMonoBold.sfd to make Latin ranges lie between 800 and -200 EM, as with FreeMono. * FreeMono.sfd: Latin Extended ranges: Implemented new policy of shortening the letters of the characters with the highest-stacked accents. At this point all the Latin glyphs lie betweeen 800 and -200 EM. Also checked for readability of all the Latin extended letters in xterm. (Issue: it chops letters outside their bounding boxes; many accents had been a bit outside. Made sure that if they were chopped, they were at least still recognizable.) 2008-04-05 Steve White * FreeMono.sfd: Following exchange about Mono on freefont-bugs with Joe Wells, who > doesn't like the curly quote marks > wants combining diacritics to work > wants tight line spacing Trying to reduce font height: > exclamdown was below -200 > Throughout Extended Greek, ypogegrammeni were too low. Shortened glyph, and raised all references. > Lots of messing with Latin Extended ranges to make glyphs mostly fit into 800 height. Mostly succeeded. A couple will get chopped. > Messed with "commaaccent" glyphs, which were very low > Cyrillic 04B1 had a tail that was incorrectly low > Much mucking with Georgian range. Moved up by 95 (read that Georgian is written as though centered between two horizontal lines, rather than as sitting on a baseline) There are still a few very high glyphs. FontForge U+0122 called Gcommaaccent, glyph looks like that, but Unicode says it's Gcedilla. Made the ones called cedilla by Unicode to be cedillas Note bug in Unicode: standard for 0122, 0123, 0136, 0137, 013B, 013C, 0145, 0146, 0156, 0157 all talk about cedilla, say to make it with cedilla, but example shows comma. By the way: > Got rid of commaaccent and dotlessj in Corporate Use > Replaced shadedark, with little squares now not overlapping. > Corrected IPA symbol 'ts' 02A6, added 02a8, 02a9, 02aa, 02ab, 02ac, 02ad, 02ae, 02af (so many changes...the CVS server was down...) * FreeSerif.sfd: Re-named arabic and hebrew characters Big adjustment to comma-accents. Mostly effects Greek Extended. Made such accents to be like comma, rather than like Russian apostrophe (and de-referenced that symbol) 2008-04-04 Steve White * FreeMono.sfd, FreeSerif.sfd: Raised dot on superscript i (2071) -- more distinct at small sizes * FreeMono.sfd: added two IPA symbols 2008-04-02 Steve White * FreeSerif.sfd: fixed a few more control points too close Fixed names of languages in ligature table for latn "w/i". This fixes a crash when FontForge opened the ttf table Motivated by bug crashing FontForge when opening ttf file, started cleanup of useless control points. Not finished. Got partway through Sinhala 2008-03-31 Steve White * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Fixed various "Find Problems", including glyphs with mixed-up names, and bad TT matrices. (lots more bad TT matrices remain) * FreeSerif.sfd: Re-named a bunch of Cyrillic letters * FreeSerif.sfd: Put above mark on Cyrillic i and double-dot i for Slavonic number forms 2008-03-30 Steve White * FreeSans.sfd: Tightened spacing on glyphs of last commit * FreeSans.sfd, FreeSerif.sfd: Concerning bug #16120, Include upper case Wynn and upper case Yogh Adapted Herman Miller's Thyromanes letters 01F7 021C 021D for Serif Drew my own versions for Sans. * FreeSerif.sfd: Added 04F6,7 * FreeSerif.sfd, FreeSerifItalic.sfd: Made more Cyrillic diacritics really combine. Made a mark lookup just for Cyrillic diacritics, Marked most of the unadorned Cyrillic alphabet. Still not clear on correct shapes for some of the marks. * FreeMono.sfd, FreeMonoOblique.sfd: Tweeks to accents 2008-03-29 Steve White * FreeSans.sfd, FreeSerifItalic.sfd: Small adjustments in Cyrillic * FreeSerif.sfd: Corrected small palochka Made Cyrillic combining hundred-thousands and millions really combine Named some combining diacriticals * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: Mostly adjusted horizontal spacing of mono oblique faces * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: More cleanup of Cyrillic ranges Completely re-did horizontal spacing of SerifItalic and SerifBoldItalic. See bug #17912, poor kerning in Cyrillic oblique... https://savannah.gnu.org/bugs/index.php?17912 It looked like chaos to me. Only so much can be done: the font is flawed. But I think the changes make text readable in these faces. There were dozens of incorrect glyphs in higher-numbered characters. I deleted all those I found. No glyph is better than a wrong glyph. Futzt with accents, shooting for consistency and readability. A maintenance thing: making correct references (acyrillic vs a, although they may be the same glyph) I made a lot of headway, but it isn't finished. Likewise, a large fraction of these are compound characters, which can be made with references, resulting in easier maintenance, reduced likelihood of errors, and smaller files. I replaced many. * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Cyrillic italic Added italic, bolditalic 0493, 04a7, 04AD because their form clearly varies in italic. But was just guessing... * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Cyrillic italic Added italic, bolditalic 0493, 04AD because their form clearly varies in italic. But was just guessing as to exact form. * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Overhaul of Cyrillic Italic, BoldItalic added small yat for bug #22588 (note Times New Roman doesn't use alternate form in Italic) All forms of Serif have big problems in Cyrillic. The ugliest is in roman. The letters, even of the Russian alphabet, are of inconsistent height (awfully, small 0438 (ii) 0446 (tse)) and they vary from the height of Latin and they vary from the height of italic and bold. They are a mish-mash of letters from several fonts, of similar (but not quite identical) weight, and similar, (but not quite identical) size. I think the best solution would be to identify the face that best matches Latin, and fill the range with that. I think this is possible because the rarer letters seem to be better: the common letters are the ones that are wrong. For now, I just increased the sized of 0438 and 0446, and 048a, 048b, also 0459 (lje) 045A (nje) 0464 (dje) Other issues 2008-03-27 Steve White * FreeSerifBoldItalic.sfd: Moving all Greek capitals with accent so they don't cover previous letter. Remedies bug #12798 * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: Various tweeks to accented Latin letters. Connected O-ogonek correctly * FreeSerifItalic.sfd: Accents of numerous accented Latin letters got shifted in a previous commit. This fixes it. * FreeSerif.sfd: Adjusted combining tack left and right (0318-0319) to be above -300 EM. * FreeSans.sfd, FreeSerif.sfd: Added some "middle" marks for positioning of diacritics * FreeSans.sfd: Copied 4 enclosing combining diacriticals from Serif 20DD - 20E0 * FreeSerif.sfd: Adjusted and added some enclosing diacritics 20DD - 20E0 In response to Debian bug #472566 ttf-freefont: U+20DD COMBINING ENCOLSING CIRCLE doesn't combine http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=472566 2008-03-26 Steve White * FreeSerif.sfd: Lowered a few over-high Latin accents * FreeSansBold: Devangari--only digits 1 and 2, and nothing else. Deleted * FreeMonoBold, FreeMonoOblique, FreeSerifBold, FreeSeriftalic, FreeSerifBoldItalic, FreeSansOblique, FreeSansBold, FreeSansBoldOblique: Got rid of dotlessj, comma in Corporate Use Single Substitution lookup, ccmp table Made proper dotlessj, re-linked j-circumflex Note: FreeSansBold has a commaaccent in Corporate Use, used by several other characers. Haven't done anything about this. 2008-03-25 Steve White * FreeSerif.sfd: Added/corrected glyphs for yeh hamza in Arabic, Added init and medi lookups for yeh hamza. 2008-03-24 Steve White * FreeSerif.sfd: Added isolated and final forms for 0629 teh marbuta 0624 waw hamza 0626 yeh hamza 0649 alef maksura A previous commit had added lookups that referred to these, More fiddling with super/subscripts * Makefile, Makefile, GenerateTrueType: Scripts and Make targets to generate OpenType fonts and zip file * maintenance.txt: Added gnupload and info about tagging 2008-03-23 Steve White * FreeSerif.sfd: Last of Find Problems -> ATT 'mark' Latin lookup: afii10026 is in 'cyrl', also afii10074 Upper and lower Cyrillic i. Just removed mark from both letters. 'half' Bengali lookup Khanda_Ta is in 'bng2'. Added bng2 to lookup Added TtTable etc Clean-up of Points too Close through to end of font. This episode completes the paths/points clean-up of Serif. But note: many ranges, esp. Ethiopic, Japanese, and Indic, have way too many points, resulting in lumpiness. At this point, FontForge can convert splines to quadratic, auto-hint, and auto-instrument without segfault. * Makefile, sfd/Makefile, tools/GenerateTrueType: Alterations to build process: added a Makefile, and made to work on my system. Now auto-hints before generating TrueType. 2008-03-22 Steve White * sfd/FreeSans.sfd: Lots of additions of math characters. Should complete for LaTeX 2e, except for extensible brackets. 2008-03-21 Steve White * *.sfd: Regularized stacking of accents in Latin Extended Additional Changed name of 00B5 from 'mu' to 'micro', 2206 from 'Delta' to 'Delta.math', 0308 from 'diaerisis' to 'diaerisiscomb' * FreeMono.sfd: additions to IPA * FreeMonoBoldOblique.sfd: Moved dotlessj from Corporate Use, Deleted commaaccent there Fixed mis-named glyphs tcommaaccent, Tcommaaccent Changed name of 030A from 'dieresis' to 'ringcomb' * FreeSans.sfd: Added some arrows, and a couple of blackboard bold characters Several characters in U+F600 Corporate Use range dotlessj, onefitted, commaaccent dotlessj referred to by: jcircumflex, uni01F0: renamed it to uFFFF, re-linked others by hand commaaccent http://diacritics.typo.cz/index.php?id=9 should be u+0326 but wasn't linked to anything * FreeSansBold.sfd: U+0617 etc: read glyphs "4GWglm". It should be Arabic. Deleted * FreeSansBold.sfd, FreeSansOblique.sfd, FreeSansBoldOblique.sfd: Removed bogus glyphs for 200C 200D, ZWJ and ZWNJ * FreeSerif.sfd: Split lookup for ligatures in latin into two classes; ff, ffl, fl which are appropriate for all languages, and fi, ffi, which are not appropriate in Turkish (due to distinction between short and long i) Needs to be done for other faces. Filled set of extensible brackets in Miscellaneous Technical Think IPA is now complete. 2008-03-18 Steve White * FreeSans.sfd: clean-up of all path issues and points too close 2008-03-18 Steve White * FreeSans.sfd: Something was causing crashing effects in Windows. Cleanup of problems eventually made it go away. Now works well. Cleaned up many "points too close" Cleaned up all ATT problems, of which there were many and various. # Incorrectly labelled zero-width joiner used in a ligature # Incorrect substitution of dotlessi and dotlessj with i and j was somehow connected with FontForge crash. Attemts to remove the substitution would damage a 'ccmp' table; subsequent changes would result in FontForge crashing on save, and truncating the sfd file. Surgically removed with vi. # A couple of Indic lookups had incorrect script DFLT; one had 'latn'. # Don't understand why there are scripts named dev2 bng2 grj2 gur2 when there are already deva beng gurj guru But anyway, lots of 'vatu' 'pres' 'haln' and 'liga' lookups contained characters in the '2' scripts but were lablled only for the 'non-2' ones. Added the '2' scripts to all these lookups. Suspect a mistake. Note: several of these problems are repeated in other Sans faces. 2008-03-16 Steve White * FreeMono.sfd: Cleanup of many path problems "points too close" Strove to make accents Latin Extended range legible at small sizes Named some unnamed characters; removed a duplicate At this point, all fonts are passing FontForge Validate. 2008-03-15 Steve White * FreeSerif.sfd: CJK punctuation: made some of the very high glyphs smaller (under 900EM) The brackets in Sans were very ugly, and not even Sans-serif. Serif: added extensible square brackets, diddled with integral corrected direction of some added glyphs Several bugs having to do with missing glyphs in Tamil range. Also a buggy ligature in Devangari. Shortened names of many lookup tables Futzt with some combining diacriticals Added extensible square brackets. * FreeSans.sfd: Changed names of a bunch of glyphs with invalid TrueType names, in range 0x1025f+ (not real Unicode). Took pains to retain information contained in the names. Wonder if these glyphs have ever been of any use. CJK Punctuation: brackets were hand-drawn and very ugly. Improved. * *.sfd: Set OS/2 Metrics back to absolute 900/300. Offsets are not interpreted uniformly. Cleanup of many path problems up to extrema and self-intersecting Ordered PS Blue values. 2008-03-14 Steve White * FreeSerif.sfd: Got rid of mixed references and contours Cleanup of many path problems "points too close" Started clean-up to satisfy FontForge Validate Changed names of three glyphs in the Tamil ligatures range...all clearly bugs. * FreeSans.sfd: Added slanted-hyphen * *.sfd: Unified OS/2 Metrics Added Grid Fit 2008-03-13 Steve White * FreeSans.sfd: Rearranged PS BluesValues so they were in increasing order, Made all 20 in width. 2008-03-12 Steve White * FreeSans.sfd, FreeMono.sfd: Added TrueType hinting tables. Fixed glyphs that didn't convert well to quadratics Got rid of mixed contours and refs * FreeSerifBold.sfd: Cleanup of path problems 2008-03-11 Steve White * FreeMonoOblique.sfd: Cleanup of path problems 2008-03-09 Steve White * FreeSerif.sfd: Corrected L-dot Further cleanup of path/ref problems Found several ligatures that referred to a missing glyph "ZWJ". Took this to mean the "zero width joiner" u+200D * *.sfd: Changed OS/2 metrics to be absolute 900/300 * FreeSerifItalic.sfd: Added Greek lunate epsilon * FreeMono.sfd: Many additions in math range Reduced size of binary union, intersection, vee, wedge Corrected empty set Corrected logical 'assert' relations, etc. 22a2-22af Efforts to make Math glyphs legible at small point sizes * FreeSans.sfd: Added Greek lunate epsilon and rho symbol Unstacked more stacked diacriticals Further cleanup of path/reference problems 2008-03-08 Steve White * FreeSans.sfd, FreeSerif.sfd: Added some "n-ary" Math operators * FreeSerif.sfd: Further clean-up of path problems...up to Ethiopic > Started adding and correcting Math operators for LaTeX 2e > Corrected n-ary union, intersection, and spikes to be larger than the binary operators > Made (many of) the operators based on + - = to use those symbols directly (by reference or copying). > Added lunate epsilon > Corrected empty set > Tightened up spacing of some other technical characters > Worked on some more math operators involving = > triangle > Several arrows > Supplemental Arrows-A * FreeSans.sfd: Clean-up of font paths Open self-intersecting outermost-clockwise missing-extrema also flipped references (unlinked) Added Greek lunate epsilon and rho symbol 2008-03-06 Steve White * sfd/FreeSerif.sfd: Shortened and thickened the combining hook mark, U+0309, to make more like Unicode samples. Also see (bug #22499) un-stacked incorrectly stacked accents 2008-03-05 Steve White * sfd/FreeSerif.sfd: vertical lines: combining diacritical marks corrected 0300 030D 0329 0348 (were rendered as straight apostrophes) Spacing Modifier letters added 02C8 02CC 02B9 02Ba prime and double-prime Fixed positioning U+1EC8, 9, I with hook above 2008-03-03 Steve White * sfd/FreeSerif.sfd: TT strings updates. updated Copyright to 2008 Added Vendor URL as the Savannah freefont site * sfd/FreeMono.sfd: A standard pangram as the Sample Text for Russian It reads: In the thickets of the South once there was a citrus ...--yes, but a fake specimen! * sfd/*.sfd: Set the OS/2 Sup/Sub settings, which by default looked like random trash. 2008-03-02 Steve White * sfd/FreeSerif.sfd: began cleanup of problems given by FontForge "Find Problems" feature. (bug #22454) 2008-03-01 Steve White * sfd/FreeSerif.sfd: made Arabic work for text display (bug #22329) Added required contextual replacement tables, Made a few missing characters, * sfd/*.sfd: Removde all back layers from glyphs that had them. 2008-02-27 Steve White * sfd/FreeSans.sfd: filled in Combining Diacriticals * sfd/FreeSerif.sfd: shifted whole Arabic range down by 200EM. 2008-02-26 Steve White * sfd/FreeSerif.sfd: enabled DPOS table. 2008-02-24 Steve White * sfd/*.sfd: Much fiddling with the "combining diacriticals" range 0300-036F. Made to align with medium-size lowercase preceding character if not using DPOS table. 2008-02-23 Steve White * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #21784) Filled in set of HTML 4 Character Entities. * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #18413) undertie too low -- went on to tidy other similar characters in Combining Diacriticals range. 2008-02-21 Steve White * sfd/*.sfd: Moved capital Greek letters with tonos so tonos doesn't cover preceding letter (bug #12798) * sfd/FreeSerif.sfd, FreeSans.sfd: (bug #13370) made extended integrals to line up. 2008-02-20 Steve White * sfd/*.sfd: started removing glyphs with back layers (printing bug) * sfd/*.sfd: adjusted vulgar fractions (bug #17756) * sfd/*.sfd: adjusted numerical superscripts (bug #20278) 2008-02-18 Steve White * sfd/FreeSerif.sfd: Offset Hiragana and Katakana ranges (bug #22326) * sfd/FreeSerif.sfd: U+30FB, KATAKANA MIDDLE DOT to be full width (bug #18326) * sfd/FreeSerif.sfd: Re-promoted ff ffi ffl fi fl as standard ligatures in Latin. 2008-02-17 Steve White * sfd/*.sfd: committed to FontForge Spline Font Database (SFD) 2 format. 2008-02-10 Steve White * sfd/*.sfd: brought into line with Debian ttf-freefont Deleted a couple of patches, and applied those applied to Debian. 2006-09-20 Primoz Peterlin * INSTALL: added installation procedure for MacOS X, courtesy Philipp Kempgen. 2006-05-04 Primoz Peterlin * sfd/FreeMono.sfd: deleted Russian sample text, which did not conform to UTF-7. 2006-04-15 Primoz Peterlin * sfd/FreeSerif.sfd: corrected U+10D3. * sfd/FreeSans.sfd: ligature U+FB06 (LATIN SMALL LIGATURE S T) changed from mandatory ("liga") to discretionary ("dlig") (bug #16253). * sfd/FreeMono.sfd: deleted incomplete glyph U+FB06 (LATIN SMALL LIGATURE S T); deleted U+FB00, U+FB01, U+FB02, U+FB05 as ligatures (bug #16253). * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd: added U+FB00; deleted U+FB01, U+FB02 as ligatures (bug #16253). * sfd/FreeMonoBold.sfd: deleted U+FB00, U+FB01, U+FB02 as ligatures (bug #16253). * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd: added Georgian letters, donated by Gia Shervashidze 2006-02-22 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd: ligature U+FB4F changed from mandatory ("liga") to discretionary ("dlig"). This is respons to Bug#349657: [bug #15792] Freefont Alef and Lamed combine 2006-02-21 Primoz Peterlin * sfd/FreeSerifBold.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSansBold.sfd: ligature U+FB4F changed from mandatory ("liga") to discretionary ("dlig"). This is respons to Bug#349657: [bug #15792] Freefont Alef and Lamed combine * sfd/FreeSerif.sfd: corrected bug#275759: [bug #15790] FreeSerif glyphs for U+2198/U+2199 were reversed. 2006-02-15 Denis Jacquerye * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: removed ij and IJ ligatures. 2006-02-10 Primoz Peterlin * sfd/FreeSerif.sfd: added small Georgian letters (mkhedruli), donated by Gia Shervashidze * AUTHORS: Added Gia Shervashidze * CREDITS: Added Gia Shervashidze 2006-01-26 Primoz Peterlin * notes/maintenance.txt: Added information on the Makefile now used; username for FTP login is anonymous. * sfd/FreeSansBold.sfd: added U+0569, U+0571, U+0579, U+057B, U+0586. Armenian small letters completed. * sfd/FreeSerif.sfd: added U+0297, U+02AD-02AF. IPA Extensions section is now complete. Copied a dozen of glyphs from Omega IPA to Phonetic Extension section. 2006-01-25 Primoz Peterlin * sfd/FreeSans.sfd: added U+01A, U+01A3, U+01A6, U+01B2, U+01BA, U+01BB, U+01BE, U+01BF. * sfd/FreeSans.sfd: aligned small Armenian letters to x-height in response to bug #15480. Armenian in Free Sans needs a major cleanup. 2006-01-24 Primoz Peterlin * sfd/FreeSerif.sfd: changed U+0452, U+045B. Cleanup: U+0460, U+0461, U+04Bc, U+04BD, U+0508. * sfd/FreeSansOblique.sfd: replaced accented chars in Latin-1 and Latin Extended-B sections with references, where possible. * sfd/FreeSerif.sfd: changed U+0285. 2006-01-23 Primoz Peterlin * sfd/FreeSans.sfd: added U+0195, U+01AA, U+0297, U+03D7, U+03F0. Several flipped references replaced by outlines. * sfd/FreeSansOblique.sfd: Latin Extended-B section more or less brought in sync with FreeSans. * sfd/FreeMonoBoldOblique.sfd: added glyphs from FreeMonoBold in the Latin Extended-B and IPA Extensions sections. * sfd/FreeSerifBold.sfd: Added U+0224, U+0225. Changed U+01B7, U+01B8, U+04E0, U+0452, U+045B. Replaced accented characters in the Cyrillic region with references. 2006-01-21 Primoz Peterlin * sfd/FreeSans.sfd: added U+0255, U+0264, U+0277, U+0286, U+029D. Changed U+0261. Deleted spurious glyphs in the control code area. 2006-01-19 Primoz Peterlin * sfd/FreeSans.sfd: replaced Hardip Pannu Singh's Gurmukhi with AnmolUni by Kulbir Singh Thind. 2006-01-17 Primoz Peterlin * sfd/FreeSansBold.sfd: Added U+018D, U+0194, U+01B5, U+01B6, U+01BE, U+0262, U+02A2. * sfd/FreeSansBold.sfd: Changed U+0261 in order to distinguish it from U+0067. Changed U+0251, U+0252. * sfd/FreeSerifBold.sfd: Small changes in the Cyrillic section. Added U+0183, U+018C. * sfd/FreeSans.sfd: Added U+2045, U+2046. * sfd/FreeSansBold.sfd: Filled in the Gurkmukhi part with the AnmolUni-Bold by Kulbir Singh Thind. Also some minor corrections in the Cyrillic part. * CREDITS: Added Kulbir Singh Thind. * AUTHORS: Added Kulbir Singh Thind. 2006-01-14 Primoz Peterlin * sfd/FreeSerif.sfd: Thomas Ridgeway's Tamil characters replaced by the ones released by the Samyak font project. * CREDITS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao and Sandeep Shedmake * AUTHORS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao and Sandeep Shedmake 2006-01-08 Primoz Peterlin * sfd/FreeSansBold.sfd, sfd/FreeMonoBoldOblique.sfd: minor changes. 2006-01-05 Denis Jacquerye * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd: added cedi sign U+20B5, Ghanaian currency 2005-12-29 Primoz Peterlin * sfd/FreeSans.sfd: minor cleanup in the Gujarati part. 2005-12-22 Primoz Peterlin * sfd/FreeSans.sfd: Devanagari and Gujarati parts cleared; once again merged with Gargi 1.9 and Padmaa 0.6, this time correctly so that the anchor points survived the merger. 2005-12-16 Primoz Peterlin * sfd/FreeSans.sfd: added U+0577. 2005-12-15 Primoz Peterlin * sfd/FreeSans.sfd: added U+0559, U+055F, U+2024. * sfd/FreeSansBold.sfd: added U+056E, U+0573. 2005-12-14 Primoz Peterlin * sfd/FreeSans.sfd: Merged with Gargi 1.9 and Padmaa 0.6, courtesy Monika Shah and Sonali Sonania from C-DAC, Mumbai. * CREDITS: Added Monika Shah and Sonali Sonania. * AUTHORS: Added Monika Shah and Sonali Sonania. 2005-12-13 Primoz Peterlin * sfd/FreeSans.sfd - Removed Sinhala glyphs. * sfd/FreeSerif.sfd - Added Sinhala glyphs, formerly in FreeSans. 2005-12-09 Primoz Peterlin * sfd/FreeSerif.sfd: added U+20AF, U+211E. Changed U+20AC (EURO SIGN). * tools/freefont-ttf.spec: Added specification file for building RPM package, courtesy Rok Papez. * sfd/FreeSerifBold.sfd: added more glyphs from Txfonts to the Arrows and Mathematical Symbols ranges. * sfd/FreeSerifBoldItalic.sfd: added U+03F5 from Txfonts. 2005-12-08 Primoz Peterlin * sfd/FreeSans.sfd: added U+0567, U+056A, U+056C, U+0582. * sfd/FreeSerifBold.sfd: copied Box Drawing range from FreeSans. * sfd/FreeSerifBold.sfd: added glyphs from Txfonts to the Arrows and Mathematical Symbols ranges. * sfd/FreeSerif.sfd: added U+2259-225A, U+22BA, U+2308-230B, U+2322-2323. Cyrillic composite characters replaced with references. 2005-12-07 Primoz Peterlin * sfd/FreeSerifBold.sfd: added U+025A, U+025D, U+026B, U+029B, U+02AE, U+02AF, U+02DE. * sfd/FreeSerifBold.sfd: updated Hebrew part with Drugulin font from the Culmus project. * sfd/FreeSerif.sfd: added U+207A-207C, U+208A-208C, U+2215-2216. * sfd/FreeSans.sfd: added U+2320 TOP HALF INTEGRAL, U+23AE INTEGRAL EXTENSION, U+2321 BOTTOM HALF INTEGRAL (bug #13370). 2005-12-07 Primoz Peterlin * sfd/FreeSerifBold.sfd: added U+0294-0296, U+02A1-02A2. Started adding "below" anchors. Performed hinting on characters that were not hinted "en masse". 2005-12-06 Primoz Peterlin * sfd/FreeSans.sfd: fixed some more metrics problems in the Extended Greek area; performed hinting on characters that were not hinted "en masse". * Makefile: clean also signature files. * sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: cosmetic changes; cleaning background of referenced composed characters. 2005-12-05 Panayotis Katsaloulis * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd: Some changes to the greek glyphs, mostly having to do with "tonos" (accent) 2005-12-05 Primoz Peterlin * sfd/FreeSans.sfd: minor cosmetic changes. * sfd/FreeSans.sfd: adjusted widths of characters in the Extended Greek range; accents are not any more considerably overhanging on the left side. Added U+1EDA-1EE3, U+1EE8-1EF1. * sfd/FreeSans.sfd: continued working on Extended Greek range; metrics still not finished. 2005-12-03 Primoz Peterlin * sfd/FreeSans.sfd: fixed combined Greek accents (bug #12800). Width of characters still need to be adjusted as in FreeSerif. * sfd/FreeSerif.sfd: fixed positions of Greek accents (bug #12798). * CREDITS: Added Panayotis Katsaloulis. * AUTHORS: Added Panayotis Katsaloulis. * Makefile: minor changes; now creating also a tarfile with sfds. 2005-12-01 Primoz Peterlin * sfd/FreeSerifItalic.sfd: added U+0183, U+018C, U+01C0, U+01C1, U+01C3, U+01E0, U+01E1, U+01F8, U+01F9. * Makefile: created a Makefile to assist building. * README: an update. * COPYING: added GNU General Public License, version 2. * tools/GenerateTrueType: wrote a FontForge script for conversion to TrueType. * sfd/FreeSerif.sfd: merged with SolaimanLipi Bangla OpenType font from www.ekushey.org, courtesy Solaiman Karim. * sfd/FreeSerifItalic.sfd: merged with SolaimanLipi Bangla OpenType font from www.ekushey.org, slanted by 15.5 degrees. * sfd/FreeSans.sfd: merged with Rupali Bangla OpenType font from www.ekushey.org * sfd/FreeSansOblique.sfd: merged with Rupali Bangla OpenType font from www.ekushey.org, slanted by 12 degrees. * CREDITS: added Solaiman Karim * AUTHORS: added Solaiman Karim 2005-11-30 Primoz Peterlin * sfd/FreeSerif.sfd: merged with the Rachana Normal. * AUTHORS: added K.H. Hussain and R. Chitrajan * CREDITS: added K.H. Hussain and R. Chitrajan 2005-11-23 Primoz Peterlin * sfd/FreeSans.sfd - cleaned some background images. * sfd/FreeSans.sfd - added U+01A0-01A1, U+01AF-01B0, U+026E, U+028F, U+0291, U+02A3-02A5, U+031B. Modified U+0198. 2005-11-22 Primoz Peterlin * sfd/FreeSans.sfd - added U+2504-250B. * sfd/FreeSans.sfd - added U+2591-25A1, U+25A3-25A5, U+25AA, U+25AC. * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - added U+0263. 2005-11-21 Primoz Peterlin * sfd/FreeMono.sfd - corrected positions of some Greek diacritics on page 0x1F. * sfd/FreeMonoOblique.sfd - working on bringing it in sync with FreeMono.sfd. * sfd/FreeSerifBoldItalic.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. Added a couple of glyphs in the IPA Extensions region. * sfd/FreeSansBold.sfd - added U+0574, U+0576. Removed overlaps. 2005-11-20 Primoz Peterlin * sfd/FreeSerif.sfd - added U+02AA-02AC, U+02B0-02B2. 2005-11-19 Primoz Peterlin * sfd/FreeSans.sfd - added U+01B7-01B9, U+0196, U+019A, U+01C3, U+0224-0225, U+025E, U+029A, U+2422. Changed U+0184-0185, U+0192, U+01B4, U+0282, U+0284. 2005-11-18 Primoz Peterlin * sfd/FreeSerif.sfd - added U+02EE, U+207F. * sfd/FreeSans.sfd - started Box Drawing area. 2005-11-17 Primoz Peterlin * sfd/FreeSerifBold.sfd - added glyphs from the Omega project to Latin Extended-B, IPA Extensions and Greek ranges. * sfd/FreeSerifBoldItalic.sfd - added glyphs from the Omega project to Latin Extended-B, IPA Extensions and Greek ranges. * sfd/FreeSerifItalic.sfd - added glyphs from the Omega project to Latin Extended-B, IPA Extensions and Greek ranges. * sfd/FreeSerifItalic.sfd - added U+018B, U+025C, U+0265, U+026F, U+0279, U+0287, U+028C-028E, U+029E. * sfd/FreeSerifBoldItalic.sfd - added U+1EDA-1EE3, U+1EE8-1EF1, U+2190-219B, U+219E-21A8, U+21B9-21BA, U+21C4-21CA, U+21E4-21E5, U+2669-266F. MES-1 compliant. * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - added U+FFFD. * sfd/FreeSerif.sfd - removed overlaps in Latin Extended-B and IPA Extensions ranges. 2005-11-16 Primoz Peterlin * sfd/FreeSerifItalic.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. * sfd/papers/eurotex2003/freefont.tex, sfd/papers/eurotex2003/freefont.bib - Revised version, sent back by Karl Berry on 20050110, that should match the one published in TUGboat. * sfd/FreeSerifItalic.sfd - started added accent anchors. Added a handful of Greek letters from Omega font collection. * sfd/FreeSerif.sfd - added a handful of letters in the Latin Extended-B and IPA Extension ranges from the Omega font collection. 2005-11-16 Denis Jacquerye * sfd/FreeSerif.sfd - moved U+0263 to U+0264; added U+0263 * sfd/FreeSerifItalic.sfd - fixe U+01EE; added U+01B7-U+01B9 2005-11-16 Primoz Peterlin * sfd/FreeSans.sfd - Made small Greek letters the same height as Latin and Cyrillic ones and replaced them with references, where applicable. * sfd/FreeSerif.sfd - replaced Greek letters with references, where applicable. Added U+03D7, U+03F0-03F2. * sfd/FreeSerif.sfd - added U+0255, U+025A, U+025D, U+025F, U+0262-0263, U+026B-026C, U+0274, U+0276-0277, U+028F, U+0291, U+029D. * sfd/FreeMonoOblique.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. Added U+F6BE. * sfd/FreeSansOblique.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. * sfd/FreeSans.sfd - changed U+01A5. 2005-11-16 Primoz Peterlin * sfd/FreeSans.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. Replaced accented glyphs in the Latin-1 and Latin Extended-A areas with references. Made capital Greek letters the same height as Latin and Cyrillic ones and replaced them with references, where applicable. 2005-11-15 Denis Jacquerye * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSansOblique.sfd - fixed U+026A, it was a dotlessi and therefore like U+0069 when accented. 2005-11-15 Primoz Peterlin * sfd/FreeMonoBold.sfd - corrected Greek tonos (slanted instead of a vertical line). * sfd/FreeMonoBoldOblique.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. Replaced accented glyphs in the Latin-1 and Latin Extended-A areas with references. 2005-11-14 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Added 2005 in copyright info. * sfd/FreeSansBoldOblique.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. Replaced accented glyphs in the Latin-1 area with references. * sfd/FreeSansBoldOblique.sfd - added U+0180, U+0184, U+0185, U+0195, U+01A0-01A2, U+01AF-01B0, U+025E, U+026E, U+0292, U+0294-0296, U+029A, U+02A1, U+2126-2127, U+2190-219B, U+219E-21A8, U+21C4-21CA, U+2669-266F. MES-1 compliant. * sfd/FreeMono.sfd - Replaced accented glyphs in the Greek and Cyrillic areas with references. * sfd/FreeMonoBold.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. Replaced accented glyphs in the Latin-1 and Latin Extended-A areas with references. 2005-11-14 Primoz Peterlin * sfd/FreeSerif.sfd - applied the sequence suggested by Werner Lemberg for reducing redundant points. * sfd/FreeSansBold.sfd - added U+219A, U+219B, U+2669-266F. * sfd/FreeSerifBold.sfd - added U+2669-266F. 2005-11-12 Primoz Peterlin * sfd/FreeSansBold.sfd - added U+0180, U+0181, U+0183, U+0187, U+0188, U+018A, U+018C, U+018D, U+0193, U+019C, U+01A0, U+01A1, U+01AC, U+01AF, U+01B0, U+025C, U+0260, U+026E, U+0277, U+0281, U+0284. 2005-11-11 Primoz Peterlin * sfd/FreeSansBold.sfd - added U+195, U+1A6, U+025E, U+026E, U+029A, U+0313, U+0314, U+0342, U+0344, U+0345. Started adding accent anchors. * sfd/FreeMono.sfd - applied the sequence for reducing redundant points, suggested by Werner Lemberg. * sfd/FreeMono.sfd - corrected Greek letters (using tonos instead of a vertical line). Added U+026E, U+F6BE. Accented characters in Latin 1, Latin Extended A and partly Latin Extended B replaced by references. * sfd/FreeSerifBold.sfd - applied the sequence for reducing redundant points, suggested by Werner Lemberg. Added U+01A5, U+02A0, U+2190-219B, U+219E-21A8, U+21B8, U+21B9, U+21C4-21CA, U+21E4, U+21E5. 2005-11-10 Primoz Peterlin * sfd/FreeSansOblique - changed U+0192, U+01A5; added U+01C0-01C3. * sfd/FreeSansBold.sfd - replaced glyphs with references in the Cyrillic area. Removed U+04A8, U+04A9. Added U+04C5, U+04C6, U+04C9, U+04CA, U+04CD, U+04CE, U+0535, U+053F, U+0546, U+0565, U+0584, U+0587, U+0589. 2005-11-10 Denis Jacquerye * sfd/FreeSans.sfd - added U+028A-U+028B * sfd/FreeSansOblique - added U+028A-U+028B, U+0276, U+0292, U+0294-U+0296, U+0298-U+0299 and U+029B; fixed some other glyphs 2005-11-10 Primoz Peterlin * sfd/FreeSerif.sfd - added U+01A6. Simplified outlines in the ASCII range. * sfd/FreeSansBold.sfd - added U+00A0, U+00AD, U+0531, U+2126, U+2190-2199, U+219E-21A8, U+21C4-21CA. * sfd/FreeSansBold.sfd - applied the sequence for reducing redundant points, suggested by Werner Lemberg. Added automatically constructed accented characters in page 0x1E. 2005-11-09 Primoz Peterlin * sfd/FreeSerif.sfd - added U+0183, U+018C. * sfd/FreeSans.sfd - added U+1EA2, U+1EA3, U+1EA8, U+1EA9, U+1EB2, U+1EB3, U+1EBA, U+1EBB, U+1EC2, U+1EC3, U+1EC8, U+1EC9, U+1ECE, U+1ECF, U+1ED4, U+1ED5, U+1EE6, U+1EE7, U+1EF6, U+1EF7, U+220A, U+220B, U+220D, U+2272, U+2273, U+2282, U+2283. * sfd/FreeSerifItalic.sfd - changed U+03D5. * sfd/FreeSerifBoldItalic.sfd - changed U+03C6; added U+2070, U+2075-2079, U+207F, U+2080, U+2085-2089, U+2155-217F. * sfd/FreeSerif.sfd - added U+0184, U+0185, U+018D, U+0195, U+0197, U+019A, U+019B, U+01A0, U+01A1, U+01AC, U+01B5, U+01B6, U+01C0, U+01C1, U+01C3, U+01F6, U+0294-0296, U+1E9A, U+1EDA-1EE3, U+1EE8-1EF1. 2005-11-07 Primoz Peterlin * sfd/FreeSansBold.sfd - added U+0562, U+056D. U+0575. * sfd/FreeMono.sfd - added U+0589. 2005-11-06 Primoz Peterlin * sfd/FreeSans.sfd - added U+0278, U+03D5, U+2248. Corrected U+2071, U+222E, U+2242, U+2243 in response to bug reports http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276118 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276120 * sfd/FreeMono.sfd - added U+2227, U+2228, U+2262. Corrected U+2299-229D in response to bug report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276121 * sfd/FreeMonoBold.sfd - added U+2010, U+2012 in response to bug report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=289032 Swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi symbol) in order to conform to Unicode standard. Simplified glyph shapes in ASCII range. Started adding "above" and "below" anchors. 2005-11-05 Primoz Peterlin * sfd/FreeSerif.sfd - accented letters in Latin Extended-A replaced by references wherever possible. * sfd/FreeSerif.sfd - added U+0180, U+0181, U+0187, U+0188, U+018A, U+0193, U+019C, U+01A4, U+01A5, U+01A7, U+01A8, U+01AF, U+01B0, U+026E, U+0270, U+0278, U+0280, U+0281, U+028B, U+0299, U+029C, U+029F. 2005-11-03 Primoz Peterlin * sfd/FreeSansBold.sfd - added U+0180, U+0184, U+0185, U+0192, U+019B, U+01A0-01A2, U+01AF, U+01B0, U+01EE, U+01EF, U+0292, U+0294-0296, U+02A1, U+0532, U+054C, U+057C, U+222B. Changed U+014B, U+01A5, U+01B4, U+03BB. * sfd/FreeSans.sfd - added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE. * sfd/FreeSansBold.sfd - cleaner Arabic outlines. Added U+01E4, U+01E5. 2005-11-02 Primoz Peterlin * sfd/FreeSansBold.sfd - started Armenian; added U+0538, U+0542, U+0544, U+0548, U+054D, U+054F, U+0550, U+0553, U+0555, U+0561, U+0563, U+0564, U+0566, U+0568 U+056B, U+056F, U+0570, U+0572, U+0578, U+057A, U+057D-057F, U+0580, U+0581, U+0583, U+0585. * sfd/FreeMono.sfd - swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi symbol) in order to conform to Unicode standard. Added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE. 2005-11-01 Primoz Peterlin * sfd/FreeSansBold.sfd - modified U+019C. * sfd/FreeSansBoldOblique.sfd - added U+00A0, U+00AD, U+019C, U+01B7, U+01B8, U+0275, U+0278, U+0298, U+2012, U+2015, U+2070-207F, U+2080-208E, U+2153-217F, U+2213, U+2215. 2005-10-31 Primoz Peterlin * sfd/FreeSerif.sfd - added U+0199, U+01AB, U+0265, U+0282, U+0288, U+028C-028E, U+0290, U+029E, U+02A0. 2005-10-28 Primoz Peterlin * sfd/FreeSerifBold.sfd - added U+019E, U+01AB, U+01AD, U+01B1, U+0256, U+025F, U+0265, U+0269, U+026F, U+0270, U+0279-027F, U+0282, U+0287, U+0288, U+028C-028E, U+0290. * sfd/FreeSerifBold.sfd - added U+2070, U+2075-2079, U+2080, U+2085-2089, U+2153-215E, U+2113-2115, U+2119. * sfd/FreeSerifBold.sfd - added U+0199, U+019B, U+01B8, U+01B9, U+01BE, U+01C0, U+0262, U+0274, U+0278, U+0280, U+028F, U+0298, U+0299, U+029C, U+029E, U+029F, U+2012, U+2015, U+2016, U+2129, U+2217. 2005-10-27 Primoz Peterlin * sfd/FreeSans.sfd - added U+018D, U+0194, U+019B, U+019C, U+01B5, U+01B6, U+0295, U+0296, U+029B, U+02A2, U+0472, U+0473, U+2114, U+2119. * sfd/FreeSerifItalic.sfd - minor cleanup in the superscript range (U+2070-2079). * sfd/FreeSansBold.sfd - added subscripts and superscripts (U+2070-208F), completed fractions (U+2152-215F) and Roman numerals (U+2160-217F). * sfd/FreeSerifBold.sfd - added U+018B, U+018E, U+018F, U+0191, U+019D, U+01A7, U+01A8, U+01AE, U+0253, U+0266, U+0267, U+026A, U+0271-0273, U+0283, U+0285. 2005-10-26 Primoz Peterlin * sfd/FreeSans.sfd - added "above" anchors to selected Cyrillic characters. Added U+0294, U+02A1. * sfd/FreeMono.sfd - added U+2011, U+2012, U+203B, U+204A, U+2071, U+2129, U+2232, U+2233. Changed and/or corrected U+2106, U+211E, U+2126, U+2127, U+2153-215F, U+2202. * sfd/FreeMono.sfd - a try to imitate Denis' work on adding anchors by adding "above" anchor to a couple of basic Latin characters. * sfd/FreeSansBold.sfd - added U+0278, U+0298. Cleaned up outlines of most Greek letters. * sfd/FreeSansBold.sfd - Added U+2010-2012, U+2015, U+2032, U+203C, U+2047-2049. * sfd/FreeSans.sfd - Added U+01C0-01C2, U+0276, U+0292, U+0298. Changed U+0251, U+0294, U+02A1. 2005-10-25 Primoz Peterlin * sfd/FreeSerifItalic.sfd - added U+00A0, U+00AD, U+2010-2012, U+2015, U+2126, U+2127, U+2153-215E, U+2160-217F, U+2190-2193, U+2669-266F. FreeSerifItalic is now MES-1 compliant. * sfd/FreeSerif.sfd - added U+0191, U+019D, U+01AE, U+027E, U+027F, U+0283, U+0285. * sfd/FreeSerif.sfd - added U+019E, U+01AD, U+01B8, U+01B9, U+0253, U+0256, U+0257, U+025C, U+0260, U+0266, U+0267, U+0269, U+026D, U+0271-0273, U+0279-027D. * sfd/FreeSerifBoldItalic.sfd - added U+00A0, U+00AD, U+2010-2012, U+2015, U+2032-2034, U+203C, U+2047-204A, U+2074, U+2081-2084, U+2126, U+2153, U+2154, U+215F, U+2215. Corrected positions of diacritics on U+0200-0217. * sfd/FreeSansOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd sfd/FreeSerifBoldItalic.sfd - brought in sync with Valek Filipov's urw-fonts-1.0.7pre41. * sfd/FreeSansOblique.sfd - added U+00A0, U+2011-2012, U+2015, U+2070, U+2071, U+2074-2079, U+2080-2089, U+2126, U+2153-215F, U+2190-2195, U+2215, U+266A. FreeSansOblique is now MES-1 compliant. 2005-10-24 Denis Jacquerye * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - added ccmp for i and j to be substituted with dotless i or j when followed by above diacritic 2005-10-24 Primoz Peterlin * sfd/FreeSans.sfd - added U+2011, U+2012, U+2015. FreeSans is now MES-1 conformant. 2005-10-23 Denis Jacquerye * sfd/FreeSans.sfd - added above, below, abovemk and belowmk anchors for diacritics placement to many Basic Latin characters, some Latin Extented A and B, and some IPA characters; fixed a couple of precomposed characters to have diacritics at the same height as similar characters. 2005-10-21 Primoz Peterlin * sfd/FreeSerif.sfd - added U+02B9, U+02BA, U+02CD, U+2017, U+2036, U+2037, U+203C, U+203E, U+2047-204A. 2005-10-20 Primoz Peterlin * sfd/FreeSerifBold.sfd - added U+0182, U+0189, U+0192, U+019F, U+01A9, U+01B7, U+01C4-01CC, U+01E0-1E2, U+01F0-01F3, U+F6BE. Corrected position of diacritics on U+0200-0217. * sfd/FreeSerif.sfd - added U+00A0, U+00AD, U+0182, U+0189, U+018B, U+018E, U+018F, U+0192, U+019F, U+01A9, U+01B1, U+01B7, U+01DD, U+2010-2013, U+2015. FreeSerif is now MES-1 conformant. 2005-10-19 Denis Jacquerye * sfd/FreeSerif.sfd - added U+0268, U+026A, U+0289, U+0292; and anchor "above" to more base glyphs. * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBoldItalic.sfd - added U+0250-0252, U+0258-0259, U+0261, U+0268, U+026A, U+0279, U+0289 * sfd/FreeSerifBold.sfd - added anchor "above" to marks U+0300-0314, and to base glyphs (vowels). 2005-10-18 Denis Jacquerye * sfd/FreeSerif.sfd - added anchor "above" to marks U+0300-0314, and bases vowel of the U+0041-007A range, U+00E6, U+0186, U+0190, U+0254 and U+025B; fixed Latin-1 Supplement block accented glyphs to use references. 2005-10-17 Primoz Peterlin * sfd/FreeSansBold.sfd - added U+01B7, U+01B8, U+0275. 2005-10-16 Denis Jacquerye * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added some Latin Extended-B African letters: U+0181, U+018A, U+0197-0198, U+01A4, U+01AC, U+01B1, U+01B3-01B4; * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added Latin Extended-B U+0187, 018E-018F, U+0191, U+0193, U+0197-0199, U+019D-019F, U+01AB-01AE; correcting width of non-space Combining Diacrtical Marks; added more glyphs to IPA Extensions to match non Bold * sfd/FreeSansBoldOblique.sfd - added many accented glyphs to Latin Extended-B 2005-10-15 Denis Jacquerye * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added IPA Extensions U+0262,U+0274,U+0280-0281, U+0299, U+029F, and Spacing Modifier Letters U+02C9-02CB; fixed U+0287,029E height to baseline; added stroke to U+0268 * sfd/FreeSansOblique.sfd - fixed skew on U+027F * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added to Latin Extended-B U+01A7-01A8, IPA Extensions U+0251-0253, U+0256-0257, U+0261, U+0265-026A, U+026F-0273, U+0289, U+028C-028E * sfd/FreeSansBoldOblique.sfd - added to Latin extended-B U+0189, U+01A8, U+01B1, U+0283, U+02C9 and Spacing Modifiers U+02C9-02CB 2005-10-14 Primoz Peterlin * sfd/FreeSansBold.sfd - Added a couple of composite glyphs, mostly in the IPA and Latin Extended B ranges. 2005-10-13 Denis Jacquerye * FreeSans.sfd - removed overlap and simplified U+0187, 0191, 0193, 01A5, 01AE, 0260, 0271, 0272, 0273, 027B; fixed diacritics placement on U+0200-0217; fixed glyph for U+0283 to correct esh without stroke; added U+025F and fixed U+025F from it; fixed height of glyph at U+0285; arranged U+027E,027F to make more distinguishable from U+0072. * FreeSansOblique.sfd - added the corrected or new glyphs from FreeSans; diacritics on U+200-0217 will need height readjustements. * FreeSansBold.sfd, FreeSansBoldOblique.sfd - added U+0186, 0190, 0250, 0254, 0258, 0259, 025B, 025C 2005-10-13 Primoz Peterlin * sfd/FreeSerif.sfd - Minor changes: U+22A2, U+22A3, U+22A6, U+23AE. Added U+0250, U+0251, U+0258, U+0259, U+0275. * sfd/FreeSerifItalic.sfd - Added glyphs U+222B-U+222F, U+2320, U+2321. Fixed diacritics on U+0200-U+0217. 2005-10-12 Denis Jacquerye * sfd/FreeSerif.sfd - Corrected diacritics position on U+01D5-01D9,01DB,01EA-01ED,0200-0217 and U+022A. * sfd/FreeSerif.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBoldItalic.sfd - added U+0186,0190,0254 and U+025B. 2005-10-11 Primoz Peterlin * sfd/FreeSerif.sfd - Fixed bug #13399 (glyphs for U+0360 and U+0361 were swapped). * sfd/FreeSerif.sfd - Attempt to correct bug #13370: INTEGRAL EXTENSION does not align with TOP/BOTTOM HALF INTEGRAL; added glyph U+23AE. 2005-05-16 Primoz Peterlin * sfd/FreeMono.sfd - Corrected shapes for Cross of Lorraine and Cross of Jerusalem. 2005-04-07 Primoz Peterlin * sfd/FreeSansBold.sfd - Added some combining accents, just to test the a version of FontForge. 2003-12-05 Primoz Peterlin * sfd/FreeMono.sfd - Some composite Latin characters rebuilt, as they had accents 600 points to the left due to changes on October 2. Some other minor changes in the mathematics area. 2003-10-08 Primoz Peterlin * sfd/FreeMonoOblique.sfd, sfd/FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd - applied Josef Segur's corrections from Oct. 5. 2003-10-02 Primoz Peterlin * sfd/FreeSerif.sfd - Abbas Izad's contributed Arabic/Farsi characters added. * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Combining characters (U+0300 - U+036F) moved left, so that they have negative horizontal values and zero advance width. 2003-09-15 Primoz Peterlin * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd - Started working on super- and subscripts. 2003-09-12 Primoz Peterlin * sfd/FreeSans.sfd, sfd/FreeSerif.sfd - Added some missing Hiragana and Katakana characters. * sfd/FreeSansBold.sfd - Cleared background characters in Latin Extended-A. Added some automatically constructed characters in Latin Extended-B. Started with superscripts and subscripts. * sfd/FreeSans.sfd - Subscript numerals (U+2080-U+2089) completed. 2003-05-19 Primoz Peterlin * sfd/FreeSerif.sfd - Thai characters po pla and bo baimai swapped; Thai character fongman corrected; all courtesy Theppitak Karoonboonyanan. 2003-05-17 Panayotis Katsaloulis * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Full support of all ancient greek glyphs 2003-05-15 Primoz Peterlin * tools/KerningNumerals.pl - A Perl script for moving kerning information from ASCII numerals (U+0030...) to characters in the Adobe corporate use area (U+F6xx). * sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Created kerned numerals in the Adobe corporate use area (U+F6xx) and moved kerning information from ASCII numerals to the kerned numerals. 2003-05-14 Primoz Peterlin * sfd/FreeSans.sfd - First approximation of super- and subscript numerals and vulgar fractions. * sfd/FreeSerif.sfd - Super- and subscript numerals complete, vulgar fractions completed and redone as references rather than outlines. 2003-05-12 Primoz Peterlin * sfd/FreeSerif.sfd - Clean-up of the Cyrillic letters added on March 27; super- and subscripts, vulgar fractions. 2003-05-09 Primoz Peterlin * sfd/FreeMonoBold.sfd - Added a couple of characters to the Latin Extended-B area and the IPA extensions area. 2003-05-08 Primoz Peterlin * sfd/FreeSerifBoldItalic.sfd - Added a couple of characters to the Latin Extended-B area. * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - ASCII numerals now monospaced; kerned numerals moved to Adobe corporate use area (U+F6xx). 2003-05-07 Primoz Peterlin * sfd/FreeSerif.sfd - Roman numerals now more complete. * sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Accented characters added in the Latin Extended-B area. * sfd/FreeSans.sfd - Greek accents added in the Greek Extended area, characters added in the Latin Extended-B area, Roman numerals added. * sfd/FreeMonoOblique.sfd - Kerning pairs removed (what were they doing in a monospaced font, anyway?). * sfd/FreeMonoBoldOblique.sfd - Additions in Latin Extended-B and Basic Greek. * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Major cleanup (fixed widths, open paths, path directions (clockwise/counter-clockwise), points rounded to integer values; outlines simplified etc.) 2003-05-06 Primoz Peterlin * tools/OS2UnicodeRange - A simple script to display OS/2 Unicode range table in TrueType fonts. * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - ASCII numerals now monospaced; kerned numerals moved to Adobe corporate use area (U+F6xx). FreeSans is done, FreeSansBold half-way. * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Added 2003 in copyright info. 2003-03-27 Primoz Peterlin * sfd/FreeSerif.sfd - Cyrillic and Cyrillic Supplement blocks brought to conformance with Unicode 3.2, courtesy Daniel Shurovich Chirkov. 2003-03-19 Primoz Peterlin * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - somewhat wider germandbls (U+00DF), due to complaints by Walter Schmidt. 2003-03-18 Primoz Peterlin * sfd/FreeSans.sfd - Added Sinhala glyphs from the Tipitaka project , recoded to Unicode by Noah Levitt. 2003-02-19 Primoz Peterlin * sfd/FreeSans.sfd - Minor changes on mathematical operators. 2003-02-18 Primoz Peterlin * sfd/FreeMono.sfd - minor cleanup of glyph backgrounds; changed integral signs (U+222B - U+2230) 2003-02-05 Primoz Peterlin * sfd/FreeSans.sfd - added a couple of glyphs in the IPA and African Latin ranges. 2003-01-30 Primoz Peterlin * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd - Corrected Maltese Hbar (U+0126) and/or hbar (U+0127). 2003-01-28 Primoz Peterlin * sfd/FreeSerifItalic.sfd - Corrected Maltese hbar (U+0127). 2002-12-18 Primoz Peterlin * tools/ConvertFont - PfaEdit script for converting SFD files to TrueType fonts. * sfd/FreeSans.sfd - Added Tamil and Kannada glyphs from the Akruti Indic fonts. 2002-12-17 Primoz Peterlin * sfd/FreeSans.sfd - Added Devanagari and Gujarati glyphs from the Akruti Indic fonts. * www/index.html - Added information on Rogier van Dalen's tools. * AUTHORS - Added M.S. Sridhar. * CREDITS - Correct spelling of Culmus project. Added M.S. Sridhar. 2002-12-06 Primoz Peterlin * sfd/FreeMono.sfd - Added Braille glyphs, courtesy Vyacheslav Dikonov. * sfd/FreeSans.sfd - Added Unicode Syriac glyphs, courtesy Vyacheslav Dikonov. 2002-10-11 Primoz Peterlin * www/index.html - Added information on the availability of the Debian GNU/Linux package. * sfd/FreeSerif.sfd, sfd/FreeSans.sfd - added some kern pairs beyond Latin-1 area. * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - re-introduced all the emtpy glyph slots (changes from Sep 23 made PfaEdit crash). 2002-09-23 Primoz Peterlin * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - imported kerning information from the URW++ AFM files 2002-09-11 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - updated Hebrew parts to comply with Culmus v0.6. * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Danilo Segan's Serbian Cyrillic glyphs; updated Hebrew parts to comply with Culmus v0.6. 2002-09-09 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Updated Cyrillic part to match Filippov's 1.0.7pre14 * sfd/FreeSansOblique.sfd - added Sam Stepanyan's Armenian glyphs from FreeSans (skewed for 12 degrees). 2002-09-06 Primoz Peterlin * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Maxim Iorsh's Hebrew characters. 2002-08-29 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - Added Maxim Iorsh's Hebrew characters. * AUTHORS, CREDITS - Added Maxim Iorsh as author. 2002-08-28 Primoz Peterlin * www/index.html - Added information of Microsoft's withdrawal of freely available Unicode TrueType fonts * www/resources.html - Added link to Maxim Iorsh's Culmus project. 2002-07-26 Primoz Peterlin * sfd/FreeMono.sfd - Added a couple of characters (Arrows area). 2002-06-11 Primoz Peterlin * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning perispomeni in Greek politoniko. 2002-05-23 Primoz Peterlin * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning psili in Greek politoniko. Also added two working variants of chars in the IPA range. 2002-05-15 Primoz Peterlin * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifBold.sfd - Deleted explicit ".notdef" character with no contours. 2002-05-14 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - The new version of PfaEdit saves correctly formed Panose and LineGap lines. * sfd/FreeSansBoldOblique.sfd - Filled-in the missing TTFWidth and TTFWeight values. 2002-05-09 Primoz Peterlin * sfd/FreeSans.sfd - Added diacritics to the Spacing Modifier Letters and Combining Diacritical Marks areas. Added composed glyphs to the Latin Extended-B area. 2002-05-07 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Updated Panose information with data provided by Josef W. Segur. Updated TTF headers with English and Slovenian text. 2002-04-30 Primoz Peterlin * sfd/FreeMonoBold.sfd - Working on Greek small letters. Several minor changes (lower carons etc.) 2002-04-29 Primoz Peterlin * FreeMonoBoldOblique.sfd - Started adding Greek. * sfd/FreeMonoBold.sfd - Added glyphs in the Geometrical Shapes and Miscellaneous Symbols area. Harmonizing Greek with Latin. Done with capitals. * sfd/FreeMono.sfd - Deleted the explicit .notdef character. Added one glyph to the Geometrical Shapes area, which is now completed; added three glyphs to the Miscellaneous Symbols area. Harmonizing Greek with Latin. Done with the capitals. 2002-04-26 Primoz Peterlin * sfd/FreeSans.sfd - Adjusted accent positions on several glyphs in the Latin Extended-A area. 2002-04-25 Primoz Peterlin * sfd/FreeMonoBold.sfd - Box Drawing area completed. Added a couple of glyphs in the Geometrical Shapes area. * sfd/FreeMono.sfd - Small corrections in the Box Drawing area. 2002-04-24 Primoz Peterlin * sfd/FreeMono.sfd - Box Drawing area completed. 2002-04-23 Primoz Peterlin * tools/WGL4.lst - corrected. * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Box Drawing area. 2002-04-22 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Latin Extended-B and Greek. 2002-04-19 Primoz Peterlin * sfd/FreeSerif.sfd - Somewhat cleaner chess figures. * tools/MES-2.txt, tools/MES-2.lst - Corrected list (it is not 203C-203E, it is 203C and 203E). * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Changed "Family Name" from Free to FreeSerif, FreeSans and FreeMono, as appropriate. Changed Font Modifiers from MonoBold etc. to Bold, Italic, Oblique, BoldOblique and BoldItalic. 2002-04-18 Primoz Peterlin * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoBoldOblique.sfd - Corrected metrics; now all character widths are set to 600. 2002-04-17 Primoz Peterlin * sfd/FreeSerif.sfd - Corrected glyphs in the Box Drawing area and Block Elements area, which should extend through the ascender *and descender* height. * sfd/FreeMonoBold.sfd - Continued working on harmonizing Greek letters with Latin and Cyrillic. * sfd/FreeMonoBold.sfd - Added some box drawing characters. 2002-04-16 Primoz Peterlin * www/design-notes.html - Updated notes on stroke width for symbols in Free Mono Bold. * sfd/FreeMono.sfd - Added a handful of characters in the Miscellaneous Symbols area. * sfd/FreeMonoBoldOblique.sfd - Added subscripts, superscripts and vulgar fractions. * sfd/FreeMonoBold.sfd - Started harmonizing Greek letters with Latin and Cyrillic. * sfd/FreeMonoBold.sfd - Added subscripts, superscripts and vulgar fractions. 2002-04-15 Primoz Peterlin * www/design-notes.html - Updated notes on super-/subscripts in Free Mono Bold. Separate subsections for Free Mono regular and Free Mono Bold. 2002-04-12 Primoz Peterlin * sfd/FreeSerif.sfd - Added Ethiopian glyphs, converted from the Metafont sources from TGI, Universität Hamburg (authors Berhanu Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer, and Jochen Metzinger) using Szabo's TeXtrace and retouched using PfaEdit. Ethiopian metafonts are released under GNU GPL, . * sfd/FreeMonoBold.sfd - Added 40 characters, mostly in the Latin Extended-B and IPA Extensions areas. 2002-04-11 Primoz Peterlin * sfd/FreeMono.sfd - Added a handful of characters in the Latin Extended-B, IPA Extensions, Currency Symbols and Miscellaneous Symbols areas. 2002-04-09 Primoz Peterlin * sfd/FreeMono.sfd - Correcting accent positioning in the Extended Greek area; adding a couple of characters here and there. Still 20 characters short of MES-2 conformance. 2002-04-08 Primoz Peterlin * sfd/FreeMono.sfd - Added some characters in the Arrows area; more or less completed Extended Greek area (accents still need to be fine-tuned). 2002-04-05 Primoz Peterlin * sfd/FreeMono.sfd - Modern non-Russian Cyrilic mostly completed. * sfd/FreeMonoOblique.sfd - Synchronized with FreeMono. * sfd/FreeSerif.sfd - Added Thomas Ridgeway's Tamil characters (converted from Metafont and edited somehwat). 2002-04-04 Primoz Peterlin * sfd/FreeMonoOblique.sfd - Armenian letters added. * sfd/FreeMonoBold.sfd - Serbian Cyrillic letters dje, tshe, lje and nje corrected. * sfd/FreeMono.sfd - Serbian Cyrillic letters dje and tshe corrected. Some other non-Russian Cyrillic letters modified and "welded together". 2002-04-03 Primoz Peterlin * sfd/FreeMono.sfd - Added more or less complete Armenian area. The glyphs are a tidied-up version based on the Armenian Courier on the . Now we have 1673 characters. 2002-03-28 Primoz Peterlin * sfd/FreeMono.sfd - Added some mathematical symbols. 2002-03-26 Primoz Peterlin * sfd/FreeSans.sfd - took H.S. Pannu's Gurmukhi from FreeSerif. It actually fits to FreeSans much better. It seems I'll have to look for another Gurmukhi font with modulated stroke for FreeSerif. * sfd/FreeSerifItalic.sfd - replaced existing Hebrew glyphs by those from FreeSerif (slanted for 15.5 degrees). * sfd/FreeSerif.sfd - Added dotted Hebrew letters. Changed barred H. * sfd/FreeMono.sfd - Completed vulgar fractions; minor changes in Greek; added some mathematical operators. * sfd/FreeMonoBold.sfd - added 12 characters to Latin Extended-B and IPA Extensions areas (total 984). 2002-03-25 Primoz Peterlin * sfd/FreeMonoBold.sfd - started adding Latin Extended-B and IPA Extensions. * sfd/FreeMono.sfd - Minor cosmetic changes; cleaning up Greek (removing redundant control points), added some non-European Cyrillic glyphs as a test. 2002-03-22 Primoz Peterlin * sfd/FreeMono.sfd - Some minor modifications; letters in Latin Extended-B area "welded" together. 2002-03-20 Primoz Peterlin * www/index.html - finally linked the resources and design notes pages. * www/design-notes.html - added scaling information for super- and subscript numerals in FreeMono. 2002-03-19 Primoz Peterlin * sfd/FreeMono.sfd - the Latin Extended-B and IPA Extension area characters moved from FreeMono and skewed for 12 degrees. 2002-03-18 Primoz Peterlin * sfd/FreeMono.sfd - added a dozen or two of new characters, in particular in the Latin Extended-B and IPA Extension area. 2002-03-15 Primoz Peterlin * sfd/FreeMono.sfd - added a dozen of two of new characters, in particular in the IPA Extension area. * www/design-notes.html - Corrected data for x-height in FreeMono; information on constructing small caps. 2002-03-14 Primoz Peterlin * sfd/FreeMono.sfd - added three smiley characters to the Miscallaneous Symbols area. 2002-03-10 Primoz Peterlin * sfd/FreeSerif.sfd - Anshuman Pandey has only converted Gurmukhi from TrueType to Metafont; the original author of Gurkmukhi font is Hardip Singh Pannu . Got the permission from him to include the Gurmukhi glyph set. 2002-03-08 Primoz Peterlin * sfd/FreeSerif.sfd - Added some more glyphs in the Mathematical Symbols area to a total number of 3374. 2002-03-06 Primoz Peterlin * sfd/FreeSerif.sfd - Added a basic Gurmukhi set. * www/design-notes.html - started a page on design notes * sfd/FreeMono.sfd - realized that glyphs in the Box Drawing area and Block Elements area should extend through the ascender *and descender* height, and corrected it. * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd - added some musical glyphs, linking "no-break space" to space, "soft hyphen" to hyphen-minus etc. 2002-03-05 Primoz Peterlin * tools/WGL4.lst - Added Windows Glyph List 4.0 * tools/LigatureList.pl - Wrote a Perl script, which lists the GSUB list (ligature list) of a OpenType font. * sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd, sfd/FreeSerifItalic.sfd - auxilliary Hebrew glyphs added. They are too light compared with Latin and will be substituted with better ones. 2002-03-04 Primoz Peterlin * sfd/FreeSerif.sfd - Added some more glyphs to the Mathematical Operators area (page 0x22). * sfd/FreeSerif.sfd - Incomplete and fragmentary support for Devanagari, originating from Harsh Kumar's Shusha fonts was replaced by Frans Velthuis' Devanagari metafont, now maintained by Anshuman Pandey and available under GPL. Until I figure out how to provide glyph substitution table in OpenType, only the Unicode part is there. 2002-02-28 Primoz Peterlin * ChangeLog file created * sfd/FreeSerif.sfd - Added some Telugu glyphs to page 0x0C, courtesy Prasad A. Chodavarapu * sfd/FreeSerif.sfd - Added some glyphs to the Miscellaneous Symbols page (0x26). 2002-02-26 Primoz Peterlin * mailing lists freefont-announce and freefont-bugs created 2002-02-25 Primoz Peterlin * sfd/FreeSerif.sfd - Added a couple of glyphs in Mathematics Operators area. * sfd/FreeMono.sfd - Added some more glyphs, in particular in the Mathematical Operators section. - Changed FamilyName to Free, FontName to FreeMono, and Full name to "Free Monospaced". 2002-02-20 Primoz Peterlin * sfd/ directory added containing FreeSerif, FreeSans and FreeMono families. * tools/ directory added containing lists with characters required for MES (Multilinguag European Subset) compliance. * tools/mes-list-expand.pl created - a Perl script for expanding MES ranges into simple one-char-per-line format * tools/CheckConformance.pl created - a Perl script for checking conformance of a font file with a given coded character set * homepage created 2002-02-19 Primoz Peterlin * freefont (Free UCS Scalable Fonts) project approved on savannah.gnu.org: PHPExcel/Shared/PDF/fonts/freefont-20090104/AUTHORS 0000666 00000012727 15017047356 0014726 0 ustar 00 -*- mode:text; coding:utf-8; -*- GNU FreeFont Authors ==================== The FreeFont collection is being maintained by Steve White The folowing list cites the other contributors that contributed to particular ISO 10646 blocks. * URW++ Design & Development GmbH Basic Latin (U+0041-U+007A) Latin-1 Supplement (U+00C0-U+00FF) (most) Latin Extended-A (U+0100-U+017F) Spacing Modifier Letters (U+02B0-U+02FF) Mathematical Operators (U+2200-U+22FF) (parts) Block Elements (U+2580-U+259F) Dingbats (U+2700-U+27BF) * Yannis Haralambous and John Plaice Latin Extended-B (U+0180-U+024F) IPA Extensions (U+0250-U+02AF) Greek (U+0370-U+03FF) Armenian (U+0530-U+058F) Hebrew (U+0590-U+05FF) Arabic (U+0600-U+06FF) Currency Symbols (U+20A0-U+20CF) Arabic Presentation Forms-A (U+FB50-U+FDFF) Arabic Presentation Forms-B (U+FE70-U+FEFF) * Young U. Ryu Arrows (U+2190-U+21FF) Mathematical Symbols (U+2200-U+22FF) Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) * Valek Filippov Cyrillic (U+0400-U+04FF) * Wadalab Kanji Comittee Hiragana (U+3040-U+309F) Katakana (U+30A0-U+30FF) * Angelo Haritsis Greek (U+0370-U+03FF) * Yannis Haralambous and Virach Sornlertlamvanich Thai (U+0E00-U+0E7F) * Shaheed R. Haque Bengali (U+0980-U+09FF) * Sam Stepanyan Armenian (U+0530-U+058F) * Mohamed Ishan Thaana (U+0780-U+07BF) * Sushant Kumar Dash Oriya (U+0B00-U+0B7F) * Harsh Kumar Devanagari (U+0900-U+097F) Bengali (U+0980-U+09FF) Gurmukhi (U+0A00-U+0A7F) Gujarati (U+0A80-U+0AFF) * Prasad A. Chodavarapu Telugu (U+0C00-U+0C7F) * Frans Velthuis and Anshuman Pandey Devanagari (U+0900-U+097F) * Hardip Singh Pannu Gurmukhi (U+0A00-U+0A7F) * Jeroen Hellingman Oriya (U+0B00-U+0B7F) Malayalam (U+0D00-U+0D7F) * Thomas Ridgeway Tamil (U+0B80-U+0BFF) * Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, Prof. Dr. Manfred Kudlek , Olaf Kummer , and Jochen Metzinger > Ethiopic (U+1200-U+137F) * Maxim Iorsh Hebrew (U+0590-U+05FF) * Vyacheslav Dikonov Syriac (U+0700-U+074A) Braille (U+2800-U+28FF) * Panayotis Katsaloulis Greek Extended (U+1F00-U+1FFF) * M.S. Sridhar Devanagari (U+0900-U+097F) Bengali (U+0980-U+09FF) Gurmukhi (U+0A00-U+0A7F) Gujarati (U+0A80-U+0AFF) Oriya (U+0B00-U+0B7F) Tamil (U+0B80-U+0BFF) Telugu (U+0C00-U+0C7F) Kannada (U+0C80-U+0CFF) Malayalam (U+0D00-U+0D7F) * DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt Sinhala (U+0D80-U+0DFF) * Dan Shurovich Chirkov Cyrillic (U+0400-U+04FF) * Abbas Izad Arabic (U+0600-U+06FF) Arabic Presentation Forms-A (U+FB50-U+FDFF) Arabic Presentation Forms-B (U+FE70-U+FEFF) * Denis Jacquerye Latin Extended-B (U+0180-U+024F) IPA Extensions (U+0250-U+02AF) * K.H. Hussain and R. Chitrajan Malayalam (U+0D00-U+0D7F) * Solaiman Karim and Omi Azad Bengali (U+0980-U+09FF) * Sonali Sonania and Monika Shah Devanagari (U+0900-U+097F) Gujarati (U+0A80-U+0AFF) * Pravin Satpute , Bageshri Salvi , Rahul Bhalerao and Sandeep Shedmake Devanagari (U+0900-U+097F) Gujarati (U+0A80-U+0AFF) Oriya (U+0B00-U+0B7F) Malayalam (U+0D00-U+0D7F) Tamil (U+0B80-U+0BFF) * Kulbir Singh Thind Gurmukhi (U+0A00-U+0A7F) * Gia Shervashidze Georgian (U+10A0-U+10FF) * Daniel Johnson Cherokee (U+13A0-U+13FF) * George Douros Gothic (U+10330-U+1034F) Phoenecian (U+10900-U+1091F) Byzantine Musical Symbols (U+1D000-U+1D0FF) Western Musical Symbols (U+1D100-U+1D1DF) Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) Mah Jong Tiles (U+1F000-U+1F02B) Dominoes (U+1F030-U+1F093) * Steve White Coptic (U+2C80-U+2CFF) * Primož Peterlin maintained FreeFont for several years, and is thanked for all his work. Please see the CREDITS file for details on who contributed particular subsets of the glyphs in font files. -------------------------------------------------------------------------- $Id: AUTHORS,v 1.18 2009/01/04 15:57:54 Stevan_White Exp $ PHPExcel/Shared/PDF/fonts/freefont-20090104/COPYING 0000666 00000104513 15017047356 0014704 0 ustar 00 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc.
'); //replace some blank characters $html = preg_replace('/]*)>[\n\r\t]+/', '<\\1\\2>', $html); $html = preg_replace('@(\r\n|\r)@', "\n", $html); $repTable = array("\t" => ' ', "\0" => ' ', "\x0B" => ' ', "\\" => "\\\\"); $html = strtr($html, $repTable); $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '', $offset)) !== false) { $html_a = substr($html, 0, $offset); $html_b = substr($html, $offset, ($pos - $offset + 6)); while (preg_match("']*)>(.*?)\n(.*?)'si", $html_b)) { // preserve newlines on tag $html_b = preg_replace("']*)>(.*?)\n(.*?)'si", "\\2\\3", $html_b); } $html = $html_a.$html_b.substr($html, $pos + 6); $offset = strlen($html_a.$html_b); } $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '</textarea>', $offset)) !== false) { $html_a = substr($html, 0, $offset); $html_b = substr($html, $offset, ($pos - $offset + 11)); while (preg_match("']*)>(.*?)\n(.*?)</textarea>'si", $html_b)) { // preserve newlines on tag $html_b = preg_replace("']*)>(.*?)\n(.*?)</textarea>'si", "\\2\\3</textarea>", $html_b); $html_b = preg_replace("']*)>(.*?)[\"](.*?)</textarea>'si", "\\2''\\3</textarea>", $html_b); } $html = $html_a.$html_b.substr($html, $pos + 11); $offset = strlen($html_a.$html_b); } $html = preg_replace("'([\s]*)([\s]*)'si", "", $html); $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '', $offset)) !== false) { $html_a = substr($html, 0, $offset); $html_b = substr($html, $offset, ($pos - $offset + 9)); while (preg_match("']*)>(.*?)'si", $html_b)) { $html_b = preg_replace("']*)>(.*?)'si", "\\2\t\\4\r", $html_b); $html_b = preg_replace("']*)>(.*?)'si", "\\2\r", $html_b); } $html = $html_a.$html_b.substr($html, $pos + 9); $offset = strlen($html_a.$html_b); } $html = preg_replace("']*)>'si", "'si", "\" />", $html); $html = str_replace("\n", ' ', $html); // restore textarea newlines $html = str_replace('', "\n", $html); // remove extra spaces from code $html = preg_replace('/[\s]+<\/(table|tr|td|th|ul|ol|li)>/', '\\1>', $html); $html = preg_replace('/[\s]+<(tr|td|th|ul|ol|li|br)/', '<\\1', $html); $html = preg_replace('/<\/(table|tr|td|th|blockquote|dd|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|ul|p)>[\s]+', '\\1><', $html); $html = preg_replace('/<\/(td|th)>/', '\\1>', $html); $html = preg_replace('/<\/table>([\s]*)/', '', $html); $html = preg_replace('/]*)>/xi', '', $html); $html = preg_replace('/]*)>/xi', '', $html); // trim string $html = preg_replace('/^[\s]+/', '', $html); $html = preg_replace('/[\s]+$/', '', $html); // pattern for generic tag $tagpattern = '/(<[^>]+>)/'; // explodes the string $a = preg_split($tagpattern, $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); // count elements $maxel = count($a); $elkey = 0; $key = 0; // create an array of elements $dom = array(); $dom[$key] = array(); // set first void element $dom[$key]['tag'] = false; $dom[$key]['value'] = ''; $dom[$key]['parent'] = 0; $dom[$key]['fontname'] = $this->FontFamily; $dom[$key]['fontstyle'] = $this->FontStyle; $dom[$key]['fontsize'] = $this->FontSizePt; $dom[$key]['bgcolor'] = false; $dom[$key]['fgcolor'] = $this->fgcolor; $dom[$key]['align'] = ''; $dom[$key]['listtype'] = ''; $dom[$key]['text-indent'] = 0; $thead = false; // true when we are inside the THEAD tag ++$key; $level = array(); array_push($level, 0); // root while ($elkey < $maxel) { $dom[$key] = array(); $element = $a[$elkey]; $dom[$key]['elkey'] = $elkey; if (preg_match($tagpattern, $element)) { // html tag $element = substr($element, 1, -1); // get tag name preg_match('/[\/]?([a-zA-Z0-9]*)/', $element, $tag); $tagname = strtolower($tag[1]); // check if we are inside a table header if ($tagname == 'thead') { if ($element{0} == '/') { $thead = false; } else { $thead = true; } ++$elkey; continue; } $dom[$key]['tag'] = true; $dom[$key]['value'] = $tagname; if ($element{0} == '/') { // closing html tag $dom[$key]['opening'] = false; $dom[$key]['parent'] = end($level); array_pop($level); $dom[$key]['fontname'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontname']; $dom[$key]['fontstyle'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontstyle']; $dom[$key]['fontsize'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontsize']; $dom[$key]['bgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['bgcolor']; $dom[$key]['fgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fgcolor']; $dom[$key]['align'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['align']; if (isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'])) { $dom[$key]['listtype'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype']; } // set the number of columns in table tag if (($dom[$key]['value'] == 'tr') AND (!isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']))) { $dom[($dom[($dom[$key]['parent'])]['parent'])]['cols'] = $dom[($dom[$key]['parent'])]['cols']; } if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { $dom[($dom[$key]['parent'])]['content'] = ''; for ($i = ($dom[$key]['parent'] + 1); $i < $key; ++$i) { $dom[($dom[$key]['parent'])]['content'] .= $a[$dom[$i]['elkey']]; } $key = $i; } // store header rows on a new table if (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['thead'] === true)) { if ($this->empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])) { $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] = $a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']]; } for ($i = $dom[$key]['parent']; $i <= $key; ++$i) { $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] .= $a[$dom[$i]['elkey']]; } } if (($dom[$key]['value'] == 'table') AND (!$this->empty_string($dom[($dom[$key]['parent'])]['thead']))) { $dom[($dom[$key]['parent'])]['thead'] .= ''; } } else { // opening html tag $dom[$key]['opening'] = true; $dom[$key]['parent'] = end($level); if (substr($element, -1, 1) != '/') { // not self-closing tag array_push($level, $key); $dom[$key]['self'] = false; } else { $dom[$key]['self'] = true; } // copy some values from parent $parentkey = 0; if ($key > 0) { $parentkey = $dom[$key]['parent']; $dom[$key]['fontname'] = $dom[$parentkey]['fontname']; $dom[$key]['fontstyle'] = $dom[$parentkey]['fontstyle']; $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize']; $dom[$key]['bgcolor'] = $dom[$parentkey]['bgcolor']; $dom[$key]['fgcolor'] = $dom[$parentkey]['fgcolor']; $dom[$key]['align'] = $dom[$parentkey]['align']; $dom[$key]['listtype'] = $dom[$parentkey]['listtype']; $dom[$key]['text-indent'] = $dom[$parentkey]['text-indent']; } // get attributes preg_match_all('/([^=\s]*)=["]?([^"]*)["]?/', $element, $attr_array, PREG_PATTERN_ORDER); $dom[$key]['attribute'] = array(); // reset attribute array while (list($id, $name) = each($attr_array[1])) { $dom[$key]['attribute'][strtolower($name)] = $attr_array[2][$id]; } // split style attributes if (isset($dom[$key]['attribute']['style'])) { // get style attributes preg_match_all('/([^;:\s]*):([^;]*)/', $dom[$key]['attribute']['style'], $style_array, PREG_PATTERN_ORDER); $dom[$key]['style'] = array(); // reset style attribute array while (list($id, $name) = each($style_array[1])) { $dom[$key]['style'][strtolower($name)] = trim($style_array[2][$id]); } // --- get some style attributes --- if (isset($dom[$key]['style']['font-family'])) { // font family if (isset($dom[$key]['style']['font-family'])) { $fontslist = preg_split('/[,]/', strtolower($dom[$key]['style']['font-family'])); foreach ($fontslist as $font) { $font = trim(strtolower($font)); if (in_array($font, $this->fontlist) OR in_array($font, $this->fontkeys)) { $dom[$key]['fontname'] = $font; break; } } } } // list-style-type if (isset($dom[$key]['style']['list-style-type'])) { $dom[$key]['listtype'] = trim(strtolower($dom[$key]['style']['list-style-type'])); if ($dom[$key]['listtype'] == 'inherit') { $dom[$key]['listtype'] = $dom[$parentkey]['listtype']; } } // text-indent if (isset($dom[$key]['style']['text-indent'])) { $dom[$key]['text-indent'] = $this->getHTMLUnitToUnits($dom[$key]['style']['text-indent']); if ($dom[$key]['text-indent'] == 'inherit') { $dom[$key]['text-indent'] = $dom[$parentkey]['text-indent']; } } // font size if (isset($dom[$key]['style']['font-size'])) { $fsize = trim($dom[$key]['style']['font-size']); switch ($fsize) { // absolute-size case 'xx-small': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 4; break; } case 'x-small': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 3; break; } case 'small': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 2; break; } case 'medium': { $dom[$key]['fontsize'] = $dom[0]['fontsize']; break; } case 'large': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 2; break; } case 'x-large': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 4; break; } case 'xx-large': { $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 6; break; } // relative-size case 'smaller': { $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] - 3; break; } case 'larger': { $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] + 3; break; } default: { $dom[$key]['fontsize'] = $this->getHTMLUnitToUnits($fsize, $dom[$parentkey]['fontsize'], 'pt', true); } } } // font style if (isset($dom[$key]['style']['font-weight']) AND (strtolower($dom[$key]['style']['font-weight']{0}) == 'b')) { $dom[$key]['fontstyle'] .= 'B'; } if (isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style']{0}) == 'i')) { $dom[$key]['fontstyle'] .= '"I'; } // font color if (isset($dom[$key]['style']['color']) AND (!$this->empty_string($dom[$key]['style']['color']))) { $dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['color']); } // background color if (isset($dom[$key]['style']['background-color']) AND (!$this->empty_string($dom[$key]['style']['background-color']))) { $dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['background-color']); } // text-decoration if (isset($dom[$key]['style']['text-decoration'])) { $decors = explode(' ', strtolower($dom[$key]['style']['text-decoration'])); foreach ($decors as $dec) { $dec = trim($dec); if (!$this->empty_string($dec)) { if ($dec{0} == 'u') { $dom[$key]['fontstyle'] .= 'U'; } elseif ($dec{0} == 'l') { $dom[$key]['fontstyle'] .= 'D'; } } } } // check for width attribute if (isset($dom[$key]['style']['width'])) { $dom[$key]['width'] = $dom[$key]['style']['width']; } // check for height attribute if (isset($dom[$key]['style']['height'])) { $dom[$key]['height'] = $dom[$key]['style']['height']; } // check for text alignment if (isset($dom[$key]['style']['text-align'])) { $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align']{0}); } // check for border attribute if (isset($dom[$key]['style']['border'])) { $dom[$key]['attribute']['border'] = $dom[$key]['style']['border']; } } // check for font tag if ($dom[$key]['value'] == 'font') { // font family if (isset($dom[$key]['attribute']['face'])) { $fontslist = preg_split('/[,]/', strtolower($dom[$key]['attribute']['face'])); foreach ($fontslist as $font) { $font = trim(strtolower($font)); if (in_array($font, $this->fontlist) OR in_array($font, $this->fontkeys)) { $dom[$key]['fontname'] = $font; break; } } } // font size if (isset($dom[$key]['attribute']['size'])) { if ($key > 0) { if ($dom[$key]['attribute']['size']{0} == '+') { $dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] + intval(substr($dom[$key]['attribute']['size'], 1)); } elseif ($dom[$key]['attribute']['size']{0} == '-') { $dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] - intval(substr($dom[$key]['attribute']['size'], 1)); } else { $dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']); } } else { $dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']); } } } // force natural alignment for lists if ((($dom[$key]['value'] == 'ul') OR ($dom[$key]['value'] == 'ol') OR ($dom[$key]['value'] == 'dl')) AND (!isset($dom[$key]['align']) OR $this->empty_string($dom[$key]['align']) OR ($dom[$key]['align'] != 'J'))) { if ($this->rtl) { $dom[$key]['align'] = 'R'; } else { $dom[$key]['align'] = 'L'; } } if (($dom[$key]['value'] == 'small') OR ($dom[$key]['value'] == 'sup') OR ($dom[$key]['value'] == 'sub')) { $dom[$key]['fontsize'] = $dom[$key]['fontsize'] * K_SMALL_RATIO; } if (($dom[$key]['value'] == 'strong') OR ($dom[$key]['value'] == 'b')) { $dom[$key]['fontstyle'] .= 'B'; } if (($dom[$key]['value'] == 'em') OR ($dom[$key]['value'] == 'i')) { $dom[$key]['fontstyle'] .= 'I'; } if ($dom[$key]['value'] == 'u') { $dom[$key]['fontstyle'] .= 'U'; } if ($dom[$key]['value'] == 'del') { $dom[$key]['fontstyle'] .= 'D'; } if (($dom[$key]['value'] == 'pre') OR ($dom[$key]['value'] == 'tt')) { $dom[$key]['fontname'] = $this->default_monospaced_font; } if (($dom[$key]['value']{0} == 'h') AND (intval($dom[$key]['value']{1}) > 0) AND (intval($dom[$key]['value']{1}) < 7)) { $headsize = (4 - intval($dom[$key]['value']{1})) * 2; $dom[$key]['fontsize'] = $dom[0]['fontsize'] + $headsize; $dom[$key]['fontstyle'] .= 'B'; } if (($dom[$key]['value'] == 'table')) { $dom[$key]['rows'] = 0; // number of rows $dom[$key]['trids'] = array(); // IDs of TR elements $dom[$key]['thead'] = ''; // table header rows } if (($dom[$key]['value'] == 'tr')) { $dom[$key]['cols'] = 0; // store the number of rows on table element ++$dom[($dom[$key]['parent'])]['rows']; // store the TR elements IDs on table element array_push($dom[($dom[$key]['parent'])]['trids'], $key); if ($thead) { $dom[$key]['thead'] = true; } else { $dom[$key]['thead'] = false; } } if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) { if (isset($dom[$key]['attribute']['colspan'])) { $colspan = intval($dom[$key]['attribute']['colspan']); } else { $colspan = 1; } $dom[$key]['attribute']['colspan'] = $colspan; $dom[($dom[$key]['parent'])]['cols'] += $colspan; } // set foreground color attribute if (isset($dom[$key]['attribute']['color']) AND (!$this->empty_string($dom[$key]['attribute']['color']))) { $dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['color']); } // set background color attribute if (isset($dom[$key]['attribute']['bgcolor']) AND (!$this->empty_string($dom[$key]['attribute']['bgcolor']))) { $dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['bgcolor']); } // check for width attribute if (isset($dom[$key]['attribute']['width'])) { $dom[$key]['width'] = $dom[$key]['attribute']['width']; } // check for height attribute if (isset($dom[$key]['attribute']['height'])) { $dom[$key]['height'] = $dom[$key]['attribute']['height']; } // check for text alignment if (isset($dom[$key]['attribute']['align']) AND (!$this->empty_string($dom[$key]['attribute']['align'])) AND ($dom[$key]['value'] !== 'img')) { $dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align']{0}); } } // end opening tag } else { // text $dom[$key]['tag'] = false; $dom[$key]['value'] = stripslashes($this->unhtmlentities($element)); $dom[$key]['parent'] = end($level); } ++$elkey; ++$key; } return $dom; } /** * Allows to preserve some HTML formatting (limited support). * IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting. * Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul * @param string $html text to display * @param boolean $ln if true add a new line after text (default = true) * @param int $fill Indicates if the background must be painted (true) or transparent (false). * @param boolean $reseth if true reset the last cell height (default false). * @param boolean $cell if true add the default cMargin space to each Write (default false). * @param string $align Allows to center or align the text. Possible values are:L : left alignC : centerR : right align'' : empty string : left for LTR or right for RTL * @access public */ public function writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='') { $gvars = $this->getGraphicVars(); // store current values $prevPage = $this->page; $prevlMargin = $this->lMargin; $prevrMargin = $this->rMargin; $curfontname = $this->FontFamily; $curfontstyle = $this->FontStyle; $curfontsize = $this->FontSizePt; $this->newline = true; $startlinepage = $this->page; $minstartliney = $this->y; $startlinex = $this->x; $startliney = $this->y; $yshift = 0; $newline = true; $loop = 0; $curpos = 0; $this_method_vars = array(); $undo = false; $blocktags = array('blockquote','br','dd','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','ul','tcpdf'); $this->premode = false; if (isset($this->PageAnnots[$this->page])) { $pask = count($this->PageAnnots[$this->page]); } else { $pask = 0; } if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $startlinepos = $this->footerpos[$this->page]; $lalign = $align; $plalign = $align; if ($this->rtl) { $w = $this->x - $this->lMargin; } else { $w = $this->w - $this->rMargin - $this->x; } $w -= (2 * $this->cMargin); if ($cell) { if ($this->rtl) { $this->x -= $this->cMargin; } else { $this->x += $this->cMargin; } } if ($this->customlistindent >= 0) { $this->listindent = $this->customlistindent; } else { $this->listindent = $this->GetStringWidth('0000'); } // save previous states $prev_listnum = $this->listnum; $prev_listordered = $this->listordered; $prev_listcount = $this->listcount; $prev_lispacer = $this->lispacer; $this->listnum = 0; $this->listordered = array(); $this->listcount = array(); $this->lispacer = ''; if (($this->empty_string($this->lasth)) OR ($reseth)) { //set row height $this->lasth = $this->FontSize * $this->cell_height_ratio; } $dom = $this->getHtmlDomArray($html); $maxel = count($dom); $key = 0; while ($key < $maxel) { if ($dom[$key]['tag'] AND $dom[$key]['opening'] AND isset($dom[$key]['attribute']['nobr']) AND ($dom[$key]['attribute']['nobr'] == 'true')) { if (isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { $dom[$key]['attribute']['nobr'] = false; } else { // store current object $this->startTransaction(); // save this method vars $this_method_vars['html'] = $html; $this_method_vars['ln'] = $ln; $this_method_vars['fill'] = $fill; $this_method_vars['reseth'] = $reseth; $this_method_vars['cell'] = $cell; $this_method_vars['align'] = $align; $this_method_vars['gvars'] = $gvars; $this_method_vars['prevPage'] = $prevPage; $this_method_vars['prevlMargin'] = $prevlMargin; $this_method_vars['prevrMargin'] = $prevrMargin; $this_method_vars['curfontname'] = $curfontname; $this_method_vars['curfontstyle'] = $curfontstyle; $this_method_vars['curfontsize'] = $curfontsize; $this_method_vars['minstartliney'] = $minstartliney; $this_method_vars['yshift'] = $yshift; $this_method_vars['startlinepage'] = $startlinepage; $this_method_vars['startlinepos'] = $startlinepos; $this_method_vars['startlinex'] = $startlinex; $this_method_vars['startliney'] = $startliney; $this_method_vars['newline'] = $newline; $this_method_vars['loop'] = $loop; $this_method_vars['curpos'] = $curpos; $this_method_vars['pask'] = $pask; $this_method_vars['lalign'] = $lalign; $this_method_vars['plalign'] = $plalign; $this_method_vars['w'] = $w; $this_method_vars['prev_listnum'] = $prev_listnum; $this_method_vars['prev_listordered'] = $prev_listordered; $this_method_vars['prev_listcount'] = $prev_listcount; $this_method_vars['prev_lispacer'] = $prev_lispacer; $this_method_vars['key'] = $key; $this_method_vars['dom'] = $dom; } } if ($dom[$key]['tag'] OR ($key == 0)) { if ((($dom[$key]['value'] == 'table') OR ($dom[$key]['value'] == 'tr')) AND (isset($dom[$key]['align']))) { $dom[$key]['align'] = ($this->rtl) ? 'R' : 'L'; } // vertically align image in line if ((!$this->newline) AND ($dom[$key]['value'] == 'img') AND (isset($dom[$key]['attribute']['height'])) AND ($dom[$key]['attribute']['height'] > 0)) { // get image height $imgh = $this->getHTMLUnitToUnits($dom[$key]['attribute']['height'], $this->lasth, 'px'); if (!$this->InFooter) { // check for page break $this->checkPageBreak($imgh); } if ($this->page > $startlinepage) { // fix line splitted over two pages if (isset($this->footerlen[$startlinepage])) { $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; } // line to be moved one page forward $pagebuff = $this->getPageBuffer($startlinepage); $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); $tstart = substr($pagebuff, 0, $startlinepos); $tend = substr($this->getPageBuffer($startlinepage), $curpos); // remove line from previous page $this->setPageBuffer($startlinepage, $tstart.''.$tend); $pagebuff = $this->getPageBuffer($this->page); $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); $tend = substr($pagebuff, $this->cntmrk[$this->page]); // add line start to current page $yshift = $minstartliney - $this->y; $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { $next_pask = count($this->PageAnnots[$this->page]); } else { $next_pask = 0; } if (isset($this->PageAnnots[$startlinepage])) { foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][] = $pac; unset($this->PageAnnots[$startlinepage][$pak]); $npak = count($this->PageAnnots[$this->page]) - 1; $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; } } } $pask = $next_pask; $startlinepos = $this->cntmrk[$this->page]; $startlinepage = $this->page; $startliney = $this->y; } $this->y += (($curfontsize / $this->k) - $imgh); $minstartliney = min($this->y, $minstartliney); } elseif (isset($dom[$key]['fontname']) OR isset($dom[$key]['fontstyle']) OR isset($dom[$key]['fontsize'])) { // account for different font size $pfontname = $curfontname; $pfontstyle = $curfontstyle; $pfontsize = $curfontsize; $fontname = isset($dom[$key]['fontname']) ? $dom[$key]['fontname'] : $curfontname; $fontstyle = isset($dom[$key]['fontstyle']) ? $dom[$key]['fontstyle'] : $curfontstyle; $fontsize = isset($dom[$key]['fontsize']) ? $dom[$key]['fontsize'] : $curfontsize; if (($fontname != $curfontname) OR ($fontstyle != $curfontstyle) OR ($fontsize != $curfontsize)) { $this->SetFont($fontname, $fontstyle, $fontsize); $this->lasth = $this->FontSize * $this->cell_height_ratio; if (is_numeric($fontsize) AND ($fontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($fontsize != $curfontsize) AND (!$this->newline) AND ($key < ($maxel - 1)) ) { if ((!$this->newline) AND ($this->page > $startlinepage)) { // fix lines splitted over two pages if (isset($this->footerlen[$startlinepage])) { $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; } // line to be moved one page forward $pagebuff = $this->getPageBuffer($startlinepage); $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); $tstart = substr($pagebuff, 0, $startlinepos); $tend = substr($this->getPageBuffer($startlinepage), $curpos); // remove line start from previous page $this->setPageBuffer($startlinepage, $tstart.''.$tend); $pagebuff = $this->getPageBuffer($this->page); $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); $tend = substr($pagebuff, $this->cntmrk[$this->page]); // add line start to current page $yshift = $minstartliney - $this->y; $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { $next_pask = count($this->PageAnnots[$this->page]); } else { $next_pask = 0; } if (isset($this->PageAnnots[$startlinepage])) { foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][] = $pac; unset($this->PageAnnots[$startlinepage][$pak]); $npak = count($this->PageAnnots[$this->page]) - 1; $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; } } } $pask = $next_pask; } if (($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) { $this->y += (($curfontsize - $fontsize) / $this->k); } $minstartliney = min($this->y, $minstartliney); } $curfontname = $fontname; $curfontstyle = $fontstyle; $curfontsize = $fontsize; } } if (($plalign == 'J') AND (in_array($dom[$key]['value'], $blocktags))) { $plalign = ''; } // get current position on page buffer $curpos = $this->pagelen[$startlinepage]; if (isset($dom[$key]['bgcolor']) AND ($dom[$key]['bgcolor'] !== false)) { $this->SetFillColorArray($dom[$key]['bgcolor']); $wfill = true; } else { $wfill = $fill | false; } if (isset($dom[$key]['fgcolor']) AND ($dom[$key]['fgcolor'] !== false)) { $this->SetTextColorArray($dom[$key]['fgcolor']); } if (isset($dom[$key]['align'])) { $lalign = $dom[$key]['align']; } if ($this->empty_string($lalign)) { $lalign = $align; } } // align lines if ($this->newline AND (strlen($dom[$key]['value']) > 0) AND ($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) { $newline = true; // we are at the beginning of a new line if (isset($startlinex)) { $yshift = $minstartliney - $startliney; if (($yshift > 0) OR ($this->page > $startlinepage)) { $yshift = 0; } if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl))))) OR ($yshift < 0)) { // the last line must be shifted to be aligned as requested $linew = abs($this->endlinex - $startlinex); $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = min($opentagpos, $this->footerpos[$startlinepage]); } elseif (isset($opentagpos)) { $midpos = $opentagpos; } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = $this->footerpos[$startlinepage]; } else { $midpos = 0; } if ($midpos > 0) { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); $pend = substr($this->getPageBuffer($startlinepage), $midpos); } else { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); $pend = ''; } // calculate shifting amount $tw = $w; if ($this->lMargin != $prevlMargin) { $tw += ($prevlMargin - $this->lMargin); } if ($this->rMargin != $prevrMargin) { $tw += ($prevrMargin - $this->rMargin); } $mdiff = abs($tw - $linew); $t_x = 0; if ($plalign == 'C') { if ($this->rtl) { $t_x = -($mdiff / 2); } else { $t_x = ($mdiff / 2); } } elseif (($plalign == 'R') AND (!$this->rtl)) { // right alignment on LTR document $t_x = $mdiff; } elseif (($plalign == 'L') AND ($this->rtl)) { // left alignment on RTL document $t_x = -$mdiff; } elseif (($plalign == 'J') AND ($plalign == $lalign)) { // Justification if ($this->rtl OR $this->tmprtl) { $t_x = $this->lMargin - $this->endlinex; } $no = 0; $ns = 0; $pmidtemp = $pmid; // escape special characters $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); // search spaces if (preg_match_all('/\[\(([^\)]*)\)\]/x', $pmidtemp, $lnstring, PREG_PATTERN_ORDER)) { $maxkk = count($lnstring[1]) - 1; for ($kk=0; $kk <= $maxkk; ++$kk) { // restore special characters $lnstring[1][$kk] = str_replace('#!#OP#!#', '(', $lnstring[1][$kk]); $lnstring[1][$kk] = str_replace('#!#CP#!#', ')', $lnstring[1][$kk]); if ($kk == $maxkk) { if ($this->rtl OR $this->tmprtl) { $tvalue = ltrim($lnstring[1][$kk]); } else { $tvalue = rtrim($lnstring[1][$kk]); } } else { $tvalue = $lnstring[1][$kk]; } // count spaces on line $no += substr_count($lnstring[1][$kk], chr(32)); $ns += substr_count($tvalue, chr(32)); } if ($this->rtl OR $this->tmprtl) { $t_x = $this->lMargin - $this->endlinex - (($no - $ns - 1) * $this->GetStringWidth(chr(32))); } // calculate additional space to add to each space $spacelen = $this->GetStringWidth(chr(32)); $spacewidth = (($tw - $linew + (($no - $ns) * $spacelen)) / ($ns?$ns:1)) * $this->k; $spacewidthu = -1000 * ($tw - $linew + ($no * $spacelen)) / ($ns?$ns:1) / $this->FontSize; $nsmax = $ns; $ns = 0; reset($lnstring); $offset = 0; $strcount = 0; $prev_epsposbeg = 0; global $spacew; while (preg_match('/([0-9\.\+\-]*)[\s](Td|cm|m|l|c|re)[\s]/x', $pmid, $strpiece, PREG_OFFSET_CAPTURE, $offset) == 1) { // check if we are inside a string section '[( ... )]' $stroffset = strpos($pmid, '[(', $offset); if (($stroffset !== false) AND ($stroffset <= $strpiece[2][1])) { // set offset to the end of string section $offset = strpos($pmid, ')]', $stroffset); while (($offset !== false) AND ($pmid{($offset - 1)} == '\\')) { $offset = strpos($pmid, ')]', ($offset + 1)); } if ($offset === false) { $this->Error('HTML Justification: malformed PDF code.'); } continue; } if ($this->rtl OR $this->tmprtl) { $spacew = ($spacewidth * ($nsmax - $ns)); } else { $spacew = ($spacewidth * $ns); } $offset = $strpiece[2][1] + strlen($strpiece[2][0]); $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, $offset); $epsposend = strpos($pmid, $this->epsmarker.'Q', $offset) + strlen($this->epsmarker.'Q'); if ((($epsposbeg > 0) AND ($epsposend > 0) AND ($offset > $epsposbeg) AND ($offset < $epsposend)) OR (($epsposbeg === false) AND ($epsposend > 0) AND ($offset < $epsposend))) { // shift EPS images $trx = sprintf('1 0 0 1 %.3F 0 cm', $spacew); $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, ($prev_epsposbeg - 6)); $pmid_b = substr($pmid, 0, $epsposbeg); $pmid_m = substr($pmid, $epsposbeg, ($epsposend - $epsposbeg)); $pmid_e = substr($pmid, $epsposend); $pmid = $pmid_b."\nq\n".$trx."\n".$pmid_m."\nQ\n".$pmid_e; $offset = $epsposend; continue; } $prev_epsposbeg = $epsposbeg; $currentxpos = 0; // shift blocks of code switch ($strpiece[2][0]) { case 'Td': case 'cm': case 'm': case 'l': { // get current X position preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); $currentxpos = $xmatches[1]; if (($strcount <= $maxkk) AND ($strpiece[2][0] == 'Td')) { if ($strcount == $maxkk) { if ($this->rtl OR $this->tmprtl) { $tvalue = $lnstring[1][$strcount]; } else { $tvalue = rtrim($lnstring[1][$strcount]); } } else { $tvalue = $lnstring[1][$strcount]; } $ns += substr_count($tvalue, chr(32)); ++$strcount; } if ($this->rtl OR $this->tmprtl) { $spacew = ($spacewidth * ($nsmax - $ns)); } // justify block $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', create_function('$matches', 'global $spacew; $newx = sprintf("%.2F",(floatval($matches[1]) + $spacew)); return "".$newx." ".$matches[2]." x*#!#*x".$matches[3].$matches[4];'), $pmid, 1); break; } case 're': { // get current X position preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); $currentxpos = $xmatches[1]; // justify block $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', create_function('$matches', 'global $spacew; $newx = sprintf("%.2F",(floatval($matches[1]) + $spacew)); return "".$newx." ".$matches[2]." ".$matches[3]." ".$matches[4]." x*#!#*x".$matches[5].$matches[6];'), $pmid, 1); break; } case 'c': { // get current X position preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); $currentxpos = $xmatches[1]; // justify block $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', create_function('$matches', 'global $spacew; $newx1 = sprintf("%.3F",(floatval($matches[1]) + $spacew)); $newx2 = sprintf("%.3F",(floatval($matches[3]) + $spacew)); $newx3 = sprintf("%.3F",(floatval($matches[5]) + $spacew)); return "".$newx1." ".$matches[2]." ".$newx2." ".$matches[4]." ".$newx3." ".$matches[6]." x*#!#*x".$matches[7].$matches[8];'), $pmid, 1); break; } } // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { foreach ($this->PageAnnots[$this->page] as $pak => $pac) { if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) { $this->PageAnnots[$this->page][$pak]['x'] += ($spacew / $this->k); $this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); break; } } } } // end of while // remove markers $pmid = str_replace('x*#!#*x', '', $pmid); if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { // multibyte characters $spacew = $spacewidthu; $pmidtemp = $pmid; // escape special characters $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); $pmid = preg_replace_callback("/\[\(([^\)]*)\)\]/x", create_function('$matches', 'global $spacew; $matches[1] = str_replace("#!#OP#!#", "(", $matches[1]); $matches[1] = str_replace("#!#CP#!#", ")", $matches[1]); return "[(".str_replace(chr(0).chr(32), ") ".($spacew)." (", $matches[1]).")]";'), $pmidtemp); $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\n".$pend); $endlinepos = strlen($pstart."\n".$pmid."\n"); } else { // non-unicode (single-byte characters) $rs = sprintf("%.3F Tw", $spacewidth); $pmid = preg_replace("/\[\(/x", $rs.' [(', $pmid); $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend); $endlinepos = strlen($pstart."\n".$pmid."\nBT 0 Tw ET\n"); } } } // end of J if (($t_x != 0) OR ($yshift < 0)) { // shift the line $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); $this->setPageBuffer($startlinepage, $pstart."\nq\n".$trx."\n".$pmid."\nQ\n".$pend); $endlinepos = strlen($pstart."\nq\n".$trx."\n".$pmid."\nQ\n"); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { foreach ($this->PageAnnots[$this->page] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][$pak]['x'] += $t_x; $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; } } } $this->y -= $yshift; } } } $this->newline = false; $pbrk = $this->checkPageBreak($this->lasth); $this->SetFont($fontname, $fontstyle, $fontsize); if ($wfill) { $this->SetFillColorArray($this->bgcolor); } $startlinex = $this->x; $startliney = $this->y; $minstartliney = $this->y; $startlinepage = $this->page; if (isset($endlinepos) AND (!$pbrk)) { $startlinepos = $endlinepos; unset($endlinepos); } else { if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $startlinepos = $this->footerpos[$this->page]; } $plalign = $lalign; if (isset($this->PageAnnots[$this->page])) { $pask = count($this->PageAnnots[$this->page]); } else { $pask = 0; } } if (isset($opentagpos)) { unset($opentagpos); } if ($dom[$key]['tag']) { if ($dom[$key]['opening']) { // get text indentation (if any) if (isset($dom[$key]['text-indent']) AND in_array($dom[$key]['value'], array('blockquote','dd','div','dt','h1','h2','h3','h4','h5','h6','li','ol','p','ul','table','tr','td'))) { $this->textindent = $dom[$key]['text-indent']; } if ($dom[$key]['value'] == 'table') { if ($this->rtl) { $wtmp = $this->x - $this->lMargin; } else { $wtmp = $this->w - $this->rMargin - $this->x; } $wtmp -= (2 * $this->cMargin); // calculate cell width if (isset($dom[$key]['width'])) { $table_width = $this->getHTMLUnitToUnits($dom[$key]['width'], $wtmp, 'px'); } else { $table_width = $wtmp; } } // table content is handled in a special way if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { $trid = $dom[$key]['parent']; $table_el = $dom[$trid]['parent']; if (!isset($dom[$table_el]['cols'])) { $dom[$table_el]['cols'] = $trid['cols']; } $oldmargin = $this->cMargin; if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'])) { $currentcmargin = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'], 1, 'px'); } else { $currentcmargin = 0; } $this->cMargin = $currentcmargin; if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellspacing'])) { $cellspacing = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellspacing'], 1, 'px'); } else { $cellspacing = 0; } if ($this->rtl) { $cellspacingx = -$cellspacing; } else { $cellspacingx = $cellspacing; } $colspan = $dom[$key]['attribute']['colspan']; $wtmp = ($colspan * ($table_width / $dom[$table_el]['cols'])); if (isset($dom[$key]['width'])) { $cellw = $this->getHTMLUnitToUnits($dom[$key]['width'], $table_width, 'px'); } else { $cellw = $wtmp; } if (isset($dom[$key]['height'])) { // minimum cell height $cellh = $this->getHTMLUnitToUnits($dom[$key]['height'], 0, 'px'); } else { $cellh = 0; } $cellw -= $cellspacing; if (isset($dom[$key]['content'])) { $cell_content = $dom[$key]['content']; } else { $cell_content = ' '; } $tagtype = $dom[$key]['value']; $parentid = $key; while (($key < $maxel) AND (!(($dom[$key]['tag']) AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == $tagtype) AND ($dom[$key]['parent'] == $parentid)))) { // move $key index forward ++$key; } if (!isset($dom[$trid]['startpage'])) { $dom[$trid]['startpage'] = $this->page; } else { $this->setPage($dom[$trid]['startpage']); } if (!isset($dom[$trid]['starty'])) { $dom[$trid]['starty'] = $this->y; } else { $this->y = $dom[$trid]['starty']; } if (!isset($dom[$trid]['startx'])) { $dom[$trid]['startx'] = $this->x; } $this->x += ($cellspacingx / 2); if (isset($dom[$parentid]['attribute']['rowspan'])) { $rowspan = intval($dom[$parentid]['attribute']['rowspan']); } else { $rowspan = 1; } // skip row-spanned cells started on the previous rows if (isset($dom[$table_el]['rowspans'])) { $rsk = 0; $rskmax = count($dom[$table_el]['rowspans']); while ($rsk < $rskmax) { $trwsp = $dom[$table_el]['rowspans'][$rsk]; $rsstartx = $trwsp['startx']; $rsendx = $trwsp['endx']; // account for margin changes if ($trwsp['startpage'] < $this->page) { if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$trwsp['startpage']]['orm'])) { $dl = ($this->pagedim[$this->page]['orm'] - $this->pagedim[$trwsp['startpage']]['orm']); $rsstartx -= $dl; $rsendx -= $dl; } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$trwsp['startpage']]['olm'])) { $dl = ($this->pagedim[$this->page]['olm'] - $this->pagedim[$trwsp['startpage']]['olm']); $rsstartx += $dl; $rsendx += $dl; } } if (($trwsp['rowspan'] > 0) AND ($rsstartx > ($this->x - $cellspacing - $currentcmargin - $this->feps)) AND ($rsstartx < ($this->x + $cellspacing + $currentcmargin + $this->feps)) AND (($trwsp['starty'] < ($this->y - $this->feps)) OR ($trwsp['startpage'] < $this->page))) { // set the starting X position of the current cell $this->x = $rsendx + $cellspacingx; if (($trwsp['rowspan'] == 1) AND (isset($dom[$trid]['endy'])) AND (isset($dom[$trid]['endpage'])) AND ($trwsp['endpage'] == $dom[$trid]['endpage'])) { // set ending Y position for row $dom[$table_el]['rowspans'][$rsk]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); $dom[$trid]['endy'] = $dom[$table_el]['rowspans'][$rsk]['endy']; } $rsk = 0; } else { ++$rsk; } } } // add rowspan information to table element if ($rowspan > 1) { if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $trintmrkpos = $this->footerpos[$this->page]; $trsid = array_push($dom[$table_el]['rowspans'], array('trid' => $trid, 'rowspan' => $rowspan, 'mrowspan' => $rowspan, 'colspan' => $colspan, 'startpage' => $this->page, 'startx' => $this->x, 'starty' => $this->y, 'intmrkpos' => $trintmrkpos)); } $cellid = array_push($dom[$trid]['cellpos'], array('startx' => $this->x)); if ($rowspan > 1) { $dom[$trid]['cellpos'][($cellid - 1)]['rowspanid'] = ($trsid - 1); } // push background colors if (isset($dom[$parentid]['bgcolor']) AND ($dom[$parentid]['bgcolor'] !== false)) { $dom[$trid]['cellpos'][($cellid - 1)]['bgcolor'] = $dom[$parentid]['bgcolor']; } $prevLastH = $this->lasth; // ****** write the cell content ****** $this->MultiCell($cellw, $cellh, $cell_content, false, $lalign, false, 2, '', '', true, 0, true); $this->lasth = $prevLastH; $this->cMargin = $oldmargin; $dom[$trid]['cellpos'][($cellid - 1)]['endx'] = $this->x; // update the end of row position if ($rowspan <= 1) { if (isset($dom[$trid]['endy'])) { if ($this->page == $dom[$trid]['endpage']) { $dom[$trid]['endy'] = max($this->y, $dom[$trid]['endy']); } elseif ($this->page > $dom[$trid]['endpage']) { $dom[$trid]['endy'] = $this->y; } } else { $dom[$trid]['endy'] = $this->y; } if (isset($dom[$trid]['endpage'])) { $dom[$trid]['endpage'] = max($this->page, $dom[$trid]['endpage']); } else { $dom[$trid]['endpage'] = $this->page; } } else { // account for row-spanned cells $dom[$table_el]['rowspans'][($trsid - 1)]['endx'] = $this->x; $dom[$table_el]['rowspans'][($trsid - 1)]['endy'] = $this->y; $dom[$table_el]['rowspans'][($trsid - 1)]['endpage'] = $this->page; } if (isset($dom[$table_el]['rowspans'])) { // update endy and endpage on rowspanned cells foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { if ($trwsp['rowspan'] > 0) { if (isset($dom[$trid]['endpage'])) { if ($trwsp['endpage'] == $dom[$trid]['endpage']) { $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); } elseif ($trwsp['endpage'] < $dom[$trid]['endpage']) { $dom[$table_el]['rowspans'][$k]['endy'] = $dom[$trid]['endy']; $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[$trid]['endpage']; } else { $dom[$trid]['endy'] = $this->pagedim[$dom[$trid]['endpage']]['hk'] - $this->pagedim[$dom[$trid]['endpage']]['bm']; } } } } } $this->x += ($cellspacingx / 2); } else { // opening tag (or self-closing tag) if (!isset($opentagpos)) { if (!$this->InFooter) { if (isset($this->footerlen[$this->page])) { $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; } else { $this->footerpos[$this->page] = $this->pagelen[$this->page]; } $opentagpos = $this->footerpos[$this->page]; } } $this->openHTMLTagHandler($dom, $key, $cell); } } else { // closing tag $this->closeHTMLTagHandler($dom, $key, $cell); } } elseif (strlen($dom[$key]['value']) > 0) { // print list-item if (!$this->empty_string($this->lispacer)) { $this->SetFont($pfontname, $pfontstyle, $pfontsize); $this->lasth = $this->FontSize * $this->cell_height_ratio; $minstartliney = $this->y; $this->putHtmlListBullet($this->listnum, $this->lispacer, $pfontsize); $this->SetFont($curfontname, $curfontstyle, $curfontsize); $this->lasth = $this->FontSize * $this->cell_height_ratio; if (is_numeric($pfontsize) AND ($pfontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($pfontsize != $curfontsize)) { $this->y += (($pfontsize - $curfontsize) / $this->k); $minstartliney = min($this->y, $minstartliney); } } // text $this->htmlvspace = 0; if ((!$this->premode) AND ($this->rtl OR $this->tmprtl)) { // reverse spaces order $len1 = strlen($dom[$key]['value']); $lsp = $len1 - strlen(ltrim($dom[$key]['value'])); $rsp = $len1 - strlen(rtrim($dom[$key]['value'])); $tmpstr = ''; if ($rsp > 0) { $tmpstr .= substr($dom[$key]['value'], -$rsp); } $tmpstr .= trim($dom[$key]['value']); if ($lsp > 0) { $tmpstr .= substr($dom[$key]['value'], 0, $lsp); } $dom[$key]['value'] = $tmpstr; } if ($newline) { if (!$this->premode) { if (($this->rtl OR $this->tmprtl)) { $dom[$key]['value'] = rtrim($dom[$key]['value']); } else { $dom[$key]['value'] = ltrim($dom[$key]['value']); } } $newline = false; $firstblock = true; } else { $firstblock = false; } $strrest = ''; if (!empty($this->HREF) AND (isset($this->HREF['url']))) { // HTML Link $strrest = $this->addHtmlLink($this->HREF['url'], $dom[$key]['value'], $wfill, true, $this->HREF['color'], $this->HREF['style']); } else { $ctmpmargin = $this->cMargin; $this->cMargin = 0; if ($this->rtl) { $this->x -= $this->textindent; } else { $this->x += $this->textindent; } // ****** write only until the end of the line and get the rest ****** $strrest = $this->Write($this->lasth, $dom[$key]['value'], '', $wfill, '', false, 0, true, $firstblock); $this->textindent = 0; $this->cMargin = $ctmpmargin; } if (strlen($strrest) > 0) { // store the remaining string on the previous $key position $this->newline = true; if ($cell) { if ($this->rtl) { $this->x -= $this->cMargin; } else { $this->x += $this->cMargin; } } if ($strrest == $dom[$key]['value']) { // used to avoid infinite loop ++$loop; } else { $loop = 0; } $dom[$key]['value'] = ltrim($strrest); if ($loop < 3) { --$key; } } else { $loop = 0; } } ++$key; if (isset($dom[$key]['tag']) AND $dom[$key]['tag'] AND (!isset($dom[$key]['opening']) OR !$dom[$key]['opening']) AND isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { if ((!$undo) AND ($this->start_transaction_page == ($this->numpages - 1))) { // restore previous object $this->rollbackTransaction(true); // restore previous values foreach ($this_method_vars as $vkey => $vval) { $$vkey = $vval; } // add a page $this->AddPage(); $undo = true; // avoid infinite loop } else { $undo = false; } } } // end for each $key // align the last line if (isset($startlinex)) { $yshift = $minstartliney - $startliney; if (($yshift > 0) OR ($this->page > $startlinepage)) { $yshift = 0; } if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl))))) OR ($yshift < 0)) { // the last line must be shifted to be aligned as requested $linew = abs($this->endlinex - $startlinex); $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = min($opentagpos, $this->footerpos[$startlinepage]); } elseif (isset($opentagpos)) { $midpos = $opentagpos; } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; $midpos = $this->footerpos[$startlinepage]; } else { $midpos = 0; } if ($midpos > 0) { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); $pend = substr($this->getPageBuffer($startlinepage), $midpos); } else { $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); $pend = ''; } // calculate shifting amount $tw = $w; if ($this->lMargin != $prevlMargin) { $tw += ($prevlMargin - $this->lMargin); } if ($this->rMargin != $prevrMargin) { $tw += ($prevrMargin - $this->rMargin); } $mdiff = abs($tw - $linew); if ($plalign == 'C') { if ($this->rtl) { $t_x = -($mdiff / 2); } else { $t_x = ($mdiff / 2); } } elseif (($plalign == 'R') AND (!$this->rtl)) { // right alignment on LTR document $t_x = $mdiff; } elseif (($plalign == 'L') AND ($this->rtl)) { // left alignment on RTL document $t_x = -$mdiff; } else { $t_x = 0; } if (($t_x != 0) OR ($yshift < 0)) { // shift the line $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); $this->setPageBuffer($startlinepage, $pstart."\nq\n".$trx."\n".$pmid."\nQ\n".$pend); $endlinepos = strlen($pstart."\nq\n".$trx."\n".$pmid."\nQ\n"); // shift the annotations and links if (isset($this->PageAnnots[$this->page])) { foreach ($this->PageAnnots[$this->page] as $pak => $pac) { if ($pak >= $pask) { $this->PageAnnots[$this->page][$pak]['x'] += $t_x; $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; } } } $this->y -= $yshift; } } } if ($ln AND (!($cell AND ($dom[$key-1]['value'] == 'table')))) { $this->Ln($this->lasth); } // restore previous values $this->setGraphicVars($gvars); if ($this->page > $prevPage) { $this->lMargin = $this->pagedim[$this->page]['olm']; $this->rMargin = $this->pagedim[$this->page]['orm']; } // restore previous list state $this->listnum = $prev_listnum; $this->listordered = $prev_listordered; $this->listcount = $prev_listcount; $this->lispacer = $prev_lispacer; unset($dom); } /** * Process opening tags. * @param array $dom html dom array * @param int $key current element id * @param boolean $cell if true add the default cMargin space to each new line (default false). * @access protected */ protected function openHTMLTagHandler(&$dom, $key, $cell=false) { $tag = $dom[$key]; $parent = $dom[($dom[$key]['parent'])]; $firstorlast = ($key == 1); // check for text direction attribute if (isset($tag['attribute']['dir'])) { $this->tmprtl = $tag['attribute']['dir'] == 'rtl' ? 'R' : 'L'; } else { $this->tmprtl = false; } //Opening tag switch($tag['value']) { case 'table': { $cp = 0; $cs = 0; $dom[$key]['rowspans'] = array(); if (!$this->empty_string($dom[$key]['thead'])) { // set table header $this->thead = $dom[$key]['thead']; if (!isset($this->theadMargins) OR (empty($this->theadMargins))) { $this->theadMargins = array(); $this->theadMargins['cmargin'] = $this->cMargin; } } if (isset($tag['attribute']['cellpadding'])) { $cp = $this->getHTMLUnitToUnits($tag['attribute']['cellpadding'], 1, 'px'); $this->oldcMargin = $this->cMargin; $this->cMargin = $cp; } if (isset($tag['attribute']['cellspacing'])) { $cs = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px'); } $this->checkPageBreak((2 * $cp) + (2 * $cs) + $this->lasth); break; } case 'tr': { // array of columns positions $dom[$key]['cellpos'] = array(); break; } case 'hr': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); $this->htmlvspace = 0; $wtmp = $this->w - $this->lMargin - $this->rMargin; if ((isset($tag['attribute']['width'])) AND ($tag['attribute']['width'] != '')) { $hrWidth = $this->getHTMLUnitToUnits($tag['attribute']['width'], $wtmp, 'px'); } else { $hrWidth = $wtmp; } $x = $this->GetX(); $y = $this->GetY(); $prevlinewidth = $this->GetLineWidth(); $this->Line($x, $y, $x + $hrWidth, $y); $this->SetLineWidth($prevlinewidth); $this->addHTMLVertSpace(1, $cell, '', !isset($dom[($key + 1)]), $tag['value'], false); break; } case 'a': { if (array_key_exists('href', $tag['attribute'])) { $this->HREF['url'] = $tag['attribute']['href']; } $this->HREF['color'] = $this->htmlLinkColorArray; $this->HREF['style'] = $this->htmlLinkFontStyle; if (array_key_exists('style', $tag['attribute'])) { // get style attributes preg_match_all('/([^;:\s]*):([^;]*)/', $tag['attribute']['style'], $style_array, PREG_PATTERN_ORDER); $astyle = array(); while (list($id, $name) = each($style_array[1])) { $name = strtolower($name); $astyle[$name] = trim($style_array[2][$id]); } if (isset($astyle['color'])) { $this->HREF['color'] = $this->convertHTMLColorToDec($astyle['color']); } if (isset($astyle['text-decoration'])) { $this->HREF['style'] = ''; $decors = explode(' ', strtolower($astyle['text-decoration'])); foreach ($decors as $dec) { $dec = trim($dec); if (!$this->empty_string($dec)) { if ($dec{0} == 'u') { $this->HREF['style'] .= 'U'; } elseif ($dec{0} == 'l') { $this->HREF['style'] .= 'D'; } } } } } break; } case 'img': { if (isset($tag['attribute']['src'])) { // replace relative path with real server path if (($tag['attribute']['src'][0] == '/') AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { $tag['attribute']['src'] = $_SERVER['DOCUMENT_ROOT'].$tag['attribute']['src']; } $tag['attribute']['src'] = urldecode($tag['attribute']['src']); $tag['attribute']['src'] = str_replace(K_PATH_URL, K_PATH_MAIN, $tag['attribute']['src']); if (!isset($tag['attribute']['width'])) { $tag['attribute']['width'] = 0; } if (!isset($tag['attribute']['height'])) { $tag['attribute']['height'] = 0; } //if (!isset($tag['attribute']['align'])) { // the only alignment supported is "bottom" // further development is required for other modes. $tag['attribute']['align'] = 'bottom'; //} switch($tag['attribute']['align']) { case 'top': { $align = 'T'; break; } case 'middle': { $align = 'M'; break; } case 'bottom': { $align = 'B'; break; } default: { $align = 'B'; break; } } $fileinfo = pathinfo($tag['attribute']['src']); if (isset($fileinfo['extension']) AND (!$this->empty_string($fileinfo['extension']))) { $type = strtolower($fileinfo['extension']); } $prevy = $this->y; $xpos = $this->GetX(); if (isset($dom[($key - 1)]) AND ($dom[($key - 1)]['value'] == ' ')) { if ($this->rtl) { $xpos += $this->GetStringWidth(' '); } else { $xpos -= $this->GetStringWidth(' '); } } $imglink = ''; if (isset($this->HREF['url']) AND !$this->empty_string($this->HREF['url'])) { $imglink = $this->HREF['url']; if ($imglink{0} == '#') { // convert url to internal link $page = intval(substr($imglink, 1)); $imglink = $this->AddLink(); $this->SetLink($imglink, 0, $page); } } $border = 0; if (isset($tag['attribute']['border']) AND !empty($tag['attribute']['border'])) { // currently only support 1 (frame) or a combination of 'LTRB' $border = $tag['attribute']['border']; } $iw = ''; if (isset($tag['attribute']['width'])) { $iw = $this->getHTMLUnitToUnits($tag['attribute']['width'], 1, 'px', false); } $ih = ''; if (isset($tag['attribute']['height'])) { $ih = $this->getHTMLUnitToUnits($tag['attribute']['height'], 1, 'px', false); } if (($type == 'eps') OR ($type == 'ai')) { $this->ImageEps($tag['attribute']['src'], $xpos, $this->GetY(), $iw, $ih, $imglink, true, $align, '', $border); } else { $this->Image($tag['attribute']['src'], $xpos, $this->GetY(), $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border); } switch($align) { case 'T': { $this->y = $prevy; break; } case 'M': { $this->y = (($this->img_rb_y + $prevy - ($tag['fontsize'] / $this->k)) / 2) ; break; } case 'B': { $this->y = $this->img_rb_y - ($tag['fontsize'] / $this->k); break; } } } break; } case 'dl': { ++$this->listnum; $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], false); break; } case 'dt': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); break; } case 'dd': { if ($this->rtl) { $this->rMargin += $this->listindent; } else { $this->lMargin += $this->listindent; } $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); break; } case 'ul': case 'ol': { $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], false); $this->htmlvspace = 0; ++$this->listnum; if ($tag['value'] == 'ol') { $this->listordered[$this->listnum] = true; } else { $this->listordered[$this->listnum] = false; } if (isset($tag['attribute']['start'])) { $this->listcount[$this->listnum] = intval($tag['attribute']['start']) - 1; } else { $this->listcount[$this->listnum] = 0; } if ($this->rtl) { $this->rMargin += $this->listindent; } else { $this->lMargin += $this->listindent; } $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], false); $this->htmlvspace = 0; break; } case 'li': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); if ($this->listordered[$this->listnum]) { // ordered item if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { $this->lispacer = $parent['attribute']['type']; } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { $this->lispacer = $parent['listtype']; } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { $this->lispacer = $this->lisymbol; } else { $this->lispacer = '#'; } ++$this->listcount[$this->listnum]; if (isset($tag['attribute']['value'])) { $this->listcount[$this->listnum] = intval($tag['attribute']['value']); } } else { // unordered item if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { $this->lispacer = $parent['attribute']['type']; } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { $this->lispacer = $parent['listtype']; } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { $this->lispacer = $this->lisymbol; } else { $this->lispacer = '!'; } } break; } case 'blockquote': { if ($this->rtl) { $this->rMargin += $this->listindent; } else { $this->lMargin += $this->listindent; } $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], false); break; } case 'br': { $this->Ln('', $cell); break; } case 'div': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); break; } case 'p': { $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], false); break; } case 'pre': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], false); $this->premode = true; break; } case 'sup': { $this->SetXY($this->GetX(), $this->GetY() - ((0.7 * $this->FontSizePt) / $this->k)); break; } case 'sub': { $this->SetXY($this->GetX(), $this->GetY() + ((0.3 * $this->FontSizePt) / $this->k)); break; } case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': { $this->addHTMLVertSpace(1, $cell, ($tag['fontsize'] * 1.5) / $this->k, $firstorlast, $tag['value'], false); break; } // Form fields (since 4.8.000 - 2009-09-07) case 'form': { if (isset($tag['attribute']['action'])) { $this->form_action = $tag['attribute']['action']; } else { $this->form_action = K_PATH_URL.$_SERVER['SCRIPT_NAME']; } if (isset($tag['attribute']['enctype'])) { $this->form_enctype = $tag['attribute']['enctype']; } else { $this->form_enctype = 'application/x-www-form-urlencoded'; } if (isset($tag['attribute']['method'])) { $this->form_mode = $tag['attribute']['method']; } else { $this->form_mode = 'post'; } break; } case 'input': { if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { $name = $tag['attribute']['name']; } else { break; } $prop = array(); $opt = array(); if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { $value = $tag['attribute']['value']; } if (isset($tag['attribute']['maxlength']) AND !$this->empty_string($tag['attribute']['maxlength'])) { $opt['maxlen'] = intval($tag['attribute']['value']); } $h = $this->FontSize * $this->cell_height_ratio; if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { $w = intval($tag['attribute']['size']) * $this->GetStringWidth(chr(32)) * 2; } else { $w = $h; } if (isset($tag['attribute']['checked']) AND (($tag['attribute']['checked'] == 'checked') OR ($tag['attribute']['checked'] == 'true'))) { $checked = true; } else { $checked = false; } switch ($tag['attribute']['type']) { case 'text': { if (isset($value)) { $opt['v'] = $value; } $this->TextField($name, $w, $h, $prop, $opt, '', '', false); break; } case 'password': { if (isset($value)) { $opt['v'] = $value; } $prop['password'] = 'true'; $this->TextField($name, $w, $h, $prop, $opt, '', '', false); break; } case 'checkbox': { $this->CheckBox($name, $w, $checked, $prop, $opt, $value, '', '', false); break; } case 'radio': { $this->RadioButton($name, $w, $prop, $opt, $value, $checked, '', '', false); break; } case 'submit': { $w = $this->GetStringWidth($value) * 1.5; $h *= 1.6; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); $action = array(); $action['S'] = 'SubmitForm'; $action['F'] = $this->form_action; if ($this->form_enctype != 'FDF') { $action['Flags'] = array('ExportFormat'); } if ($this->form_mode == 'get') { $action['Flags'] = array('GetMethod'); } $this->Button($name, $w, $h, $value, $action, $prop, $opt, '', '', false); break; } case 'reset': { $w = $this->GetStringWidth($value) * 1.5; $h *= 1.6; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); $this->Button($name, $w, $h, $value, array('S'=>'ResetForm'), $prop, $opt, '', '', false); break; } case 'file': { $prop['fileSelect'] = 'true'; $this->TextField($name, $w, $h, $prop, $opt, '', '', false); if (!isset($value)) { $value = '*'; } $w = $this->GetStringWidth($value) * 2; $h *= 1.2; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); $jsaction = 'var f=this.getField(\''.$name.'\'); f.browseForFileToSubmit();'; $this->Button('FB_'.$name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); break; } case 'hidden': { if (isset($value)) { $opt['v'] = $value; } $opt['f'] = array('invisible', 'hidden'); $this->TextField($name, 0, 0, $prop, $opt, '', '', false); break; } case 'image': { // THIS TYPE MUST BE FIXED if (isset($tag['attribute']['src']) AND !$this->empty_string($tag['attribute']['src'])) { $img = $tag['attribute']['src']; } else { break; } $value = 'img'; //$opt['mk'] = array('i'=>$img, 'tp'=>1, 'if'=>array('sw'=>'A', 's'=>'A', 'fb'=>false)); if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { $jsaction = $tag['attribute']['onclick']; } else { $jsaction = ''; } $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); break; } case 'button': { $w = $this->GetStringWidth($value) * 1.5; $h *= 1.6; $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { $jsaction = $tag['attribute']['onclick']; } else { $jsaction = ''; } $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); break; } } break; } case 'textarea': { $prop = array(); $opt = array(); if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { $name = $tag['attribute']['name']; } else { break; } if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { $opt['v'] = $tag['attribute']['value']; } if (isset($tag['attribute']['cols']) AND !$this->empty_string($tag['attribute']['cols'])) { $w = intval($tag['attribute']['cols']) * $this->GetStringWidth(chr(32)) * 2; } else { $w = 40; } if (isset($tag['attribute']['rows']) AND !$this->empty_string($tag['attribute']['rows'])) { $h = intval($tag['attribute']['rows']) * $this->FontSize * $this->cell_height_ratio; } else { $h = 10; } $prop['multiline'] = 'true'; $this->TextField($name, $w, $h, $prop, $opt, '', '', false); break; } case 'select': { $h = $this->FontSize * $this->cell_height_ratio; if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { $h *= ($tag['attribute']['size'] + 1); } $prop = array(); $opt = array(); if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { $name = $tag['attribute']['name']; } else { break; } $w = 0; if (isset($tag['attribute']['opt']) AND !$this->empty_string($tag['attribute']['opt'])) { $options = explode ("\r", $tag['attribute']['opt']); $values = array(); foreach ($options as $val) { if (strpos($val, "\t") !== false) { $opts = explode("\t", $val); $values[] = $opts; $w = max($w, $this->GetStringWidth($opts[1])); } else { $values[] = $val; $w = max($w, $this->GetStringWidth($val)); } } } else { break; } $w *= 2; if (isset($tag['attribute']['multiple']) AND ($tag['attribute']['multiple']='multiple')) { $prop['multipleSelection'] = 'true'; $this->ListBox($name, $w, $h, $values, $prop, $opt, '', '', false); } else { $this->ComboBox($name, $w, $h, $values, $prop, $opt, '', '', false); } break; } case 'tcpdf': { // NOT HTML: used to call TCPDF methods if (isset($tag['attribute']['method'])) { $tcpdf_method = $tag['attribute']['method']; if (method_exists($this, $tcpdf_method)) { if (isset($tag['attribute']['params']) AND (!empty($tag['attribute']['params']))) { eval('$params = array('.$this->unhtmlentities($tag['attribute']['params']).');'); call_user_func_array(array($this, $tcpdf_method), $params); } else { $this->$tcpdf_method(); } $this->newline = true; } } } default: { break; } } } /** * Process closing tags. * @param array $dom html dom array * @param int $key current element id * @param boolean $cell if true add the default cMargin space to each new line (default false). * @access protected */ protected function closeHTMLTagHandler(&$dom, $key, $cell=false) { $tag = $dom[$key]; $parent = $dom[($dom[$key]['parent'])]; $firstorlast = ((!isset($dom[($key + 1)])) OR ((!isset($dom[($key + 2)])) AND ($dom[($key + 1)]['value'] == 'marker'))); $in_table_head = false; //Closing tag switch($tag['value']) { case 'tr': { $table_el = $dom[($dom[$key]['parent'])]['parent']; if(!isset($parent['endy'])) { $dom[($dom[$key]['parent'])]['endy'] = $this->y; $parent['endy'] = $this->y; } if(!isset($parent['endpage'])) { $dom[($dom[$key]['parent'])]['endpage'] = $this->page; $parent['endpage'] = $this->page; } // update row-spanned cells if (isset($dom[$table_el]['rowspans'])) { foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { $dom[$table_el]['rowspans'][$k]['rowspan'] -= 1; if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { if ($dom[$table_el]['rowspans'][$k]['endpage'] == $parent['endpage']) { $dom[($dom[$key]['parent'])]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $parent['endy']); } elseif ($dom[$table_el]['rowspans'][$k]['endpage'] > $parent['endpage']) { $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; } } } // report new endy and endpage to the rowspanned cells foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { $dom[$table_el]['rowspans'][$k]['endpage'] = max($dom[$table_el]['rowspans'][$k]['endpage'], $dom[($dom[$key]['parent'])]['endpage']); $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $dom[($dom[$key]['parent'])]['endy']); $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; } } // update remaining rowspanned cells foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[($dom[$key]['parent'])]['endpage']; $dom[$table_el]['rowspans'][$k]['endy'] = $dom[($dom[$key]['parent'])]['endy']; } } } $this->setPage($dom[($dom[$key]['parent'])]['endpage']); $this->y = $dom[($dom[$key]['parent'])]['endy']; if (isset($dom[$table_el]['attribute']['cellspacing'])) { $cellspacing = $this->getHTMLUnitToUnits($dom[$table_el]['attribute']['cellspacing'], 1, 'px'); $this->y += $cellspacing; } $this->Ln(0, $cell); $this->x = $parent['startx']; // account for booklet mode if ($this->page > $parent['startpage']) { if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$parent['startpage']]['orm'])) { $this->x += ($this->pagedim[$this->page]['orm'] - $this->pagedim[$parent['startpage']]['orm']); } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$parent['startpage']]['olm'])) { $this->x += ($this->pagedim[$this->page]['olm'] - $this->pagedim[$parent['startpage']]['olm']); } } break; } case 'tablehead': // closing tag used for the thead part $in_table_head = true; case 'table': { // draw borders $table_el = $parent; if ((isset($table_el['attribute']['border']) AND ($table_el['attribute']['border'] > 0)) OR (isset($table_el['style']['border']) AND ($table_el['style']['border'] > 0))) { $border = 1; } else { $border = 0; } // fix bottom line alignment of last line before page break foreach ($dom[($dom[$key]['parent'])]['trids'] as $j => $trkey) { // update row-spanned cells if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { if ($trwsp['trid'] == $trkey) { $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] -= 1; } if (isset($prevtrkey) AND ($trwsp['trid'] == $prevtrkey) AND ($trwsp['mrowspan'] >= 0)) { $dom[($dom[$key]['parent'])]['rowspans'][$k]['trid'] = $trkey; } } } if (isset($prevtrkey) AND ($dom[$trkey]['startpage'] > $dom[$prevtrkey]['endpage'])) { $pgendy = $this->pagedim[$dom[$prevtrkey]['endpage']]['hk'] - $this->pagedim[$dom[$prevtrkey]['endpage']]['bm']; $dom[$prevtrkey]['endy'] = $pgendy; // update row-spanned cells if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { if (($trwsp['trid'] == $trkey) AND ($trwsp['mrowspan'] == 1) AND ($trwsp['endpage'] == $dom[$prevtrkey]['endpage'])) { $dom[($dom[$key]['parent'])]['rowspans'][$k]['endy'] = $pgendy; $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] = -1; } } } } $prevtrkey = $trkey; $table_el = $dom[($dom[$key]['parent'])]; } // for each row foreach ($table_el['trids'] as $j => $trkey) { $parent = $dom[$trkey]; // for each cell on the row foreach ($parent['cellpos'] as $k => $cellpos) { if (isset($cellpos['rowspanid']) AND ($cellpos['rowspanid'] >= 0)) { $cellpos['startx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['startx']; $cellpos['endx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['endx']; $endy = $table_el['rowspans'][($cellpos['rowspanid'])]['endy']; $startpage = $table_el['rowspans'][($cellpos['rowspanid'])]['startpage']; $endpage = $table_el['rowspans'][($cellpos['rowspanid'])]['endpage']; } else { $endy = $parent['endy']; $startpage = $parent['startpage']; $endpage = $parent['endpage']; } if ($endpage > $startpage) { // design borders around HTML cells. for ($page=$startpage; $page <= $endpage; ++$page) { $this->setPage($page); if ($page == $startpage) { $this->y = $parent['starty']; // put cursor at the beginning of row on the first page $ch = $this->getPageHeight() - $parent['starty'] - $this->getBreakMargin(); $cborder = $this->getBorderMode($border, $position='start'); } elseif ($page == $endpage) { $this->y = $this->tMargin; // put cursor at the beginning of last page $ch = $endy - $this->tMargin; $cborder = $this->getBorderMode($border, $position='end'); } else { $this->y = $this->tMargin; // put cursor at the beginning of the current page $ch = $this->getPageHeight() - $this->tMargin - $this->getBreakMargin(); $cborder = $this->getBorderMode($border, $position='middle'); } if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { $this->SetFillColorArray($cellpos['bgcolor']); $fill = true; } else { $fill = false; } $cw = abs($cellpos['endx'] - $cellpos['startx']); $this->x = $cellpos['startx']; // account for margin changes if ($page > $startpage) { if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { $this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); } elseif ((!$this->rtl) AND ($this->pagedim[$page]['lm'] != $this->pagedim[$startpage]['olm'])) { $this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); } } // design a cell around the text $ccode = $this->FillColor."\n".$this->getCellCode($cw, $ch, '', $cborder, 1, '', $fill, '', 0, true); if ($cborder OR $fill) { $pagebuff = $this->getPageBuffer($this->page); $pstart = substr($pagebuff, 0, $this->intmrk[$this->page]); $pend = substr($pagebuff, $this->intmrk[$this->page]); $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); $this->intmrk[$this->page] += strlen($ccode."\n"); } } } else { $this->setPage($startpage); if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { $this->SetFillColorArray($cellpos['bgcolor']); $fill = true; } else { $fill = false; } $this->x = $cellpos['startx']; $this->y = $parent['starty']; $cw = abs($cellpos['endx'] - $cellpos['startx']); $ch = $endy - $parent['starty']; // design a cell around the text $ccode = $this->FillColor."\n".$this->getCellCode($cw, $ch, '', $border, 1, '', $fill, '', 0, true); if ($border OR $fill) { if (end($this->transfmrk[$this->page]) !== false) { $pagemarkkey = key($this->transfmrk[$this->page]); $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; } elseif ($this->InFooter) { $pagemark = &$this->footerpos[$this->page]; } else { $pagemark = &$this->intmrk[$this->page]; } $pagebuff = $this->getPageBuffer($this->page); $pstart = substr($pagebuff, 0, $pagemark); $pend = substr($pagebuff, $pagemark); $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); $pagemark += strlen($ccode."\n"); } } } if (isset($table_el['attribute']['cellspacing'])) { $cellspacing = $this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'], 1, 'px'); $this->y += $cellspacing; } $this->Ln(0, $cell); $this->x = $parent['startx']; if ($endpage > $startpage) { if (($this->rtl) AND ($this->pagedim[$endpage]['orm'] != $this->pagedim[$startpage]['orm'])) { $this->x += ($this->pagedim[$endpage]['orm'] - $this->pagedim[$startpage]['orm']); } elseif ((!$this->rtl) AND ($this->pagedim[$endpage]['olm'] != $this->pagedim[$startpage]['olm'])) { $this->x += ($this->pagedim[$endpage]['olm'] - $this->pagedim[$startpage]['olm']); } } } if (!$in_table_head) { // we are not inside a thead section if (isset($parent['cellpadding'])) { $this->cMargin = $this->oldcMargin; } $this->lasth = $this->FontSize * $this->cell_height_ratio; if (isset($this->theadMargins['top'])) { // restore top margin $this->tMargin = $this->theadMargins['top']; $this->pagedim[$this->page]['tm'] = $this->tMargin; } // reset table header $this->thead = ''; $this->theadMargins = array(); } break; } case 'a': { $this->HREF = ''; break; } case 'sup': { $this->SetXY($this->GetX(), $this->GetY() + ((0.7 * $parent['fontsize']) / $this->k)); break; } case 'sub': { $this->SetXY($this->GetX(), $this->GetY() - ((0.3 * $parent['fontsize'])/$this->k)); break; } case 'div': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], true); break; } case 'blockquote': { if ($this->rtl) { $this->rMargin -= $this->listindent; } else { $this->lMargin -= $this->listindent; } $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); break; } case 'p': { $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); break; } case 'pre': { $this->addHTMLVertSpace(1, $cell, '', $firstorlast, $tag['value'], true); $this->premode = false; break; } case 'dl': { --$this->listnum; if ($this->listnum <= 0) { $this->listnum = 0; $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); } break; } case 'dt': { $this->lispacer = ''; $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], true); break; } case 'dd': { $this->lispacer = ''; if ($this->rtl) { $this->rMargin -= $this->listindent; } else { $this->lMargin -= $this->listindent; } $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], true); break; } case 'ul': case 'ol': { --$this->listnum; $this->lispacer = ''; if ($this->rtl) { $this->rMargin -= $this->listindent; } else { $this->lMargin -= $this->listindent; } if ($this->listnum <= 0) { $this->listnum = 0; $this->addHTMLVertSpace(2, $cell, '', $firstorlast, $tag['value'], true); } $this->lasth = $this->FontSize * $this->cell_height_ratio; break; } case 'li': { $this->lispacer = ''; $this->addHTMLVertSpace(0, $cell, '', $firstorlast, $tag['value'], true); break; } case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': { $this->addHTMLVertSpace(1, $cell, ($parent['fontsize'] * 1.5) / $this->k, $firstorlast, $tag['value'], true); break; } // Form fields (since 4.8.000 - 2009-09-07) case 'form': { $this->form_action = ''; $this->form_enctype = 'application/x-www-form-urlencoded'; break; } default : { break; } } $this->tmprtl = false; } /** * Add vertical spaces if needed. * @param int $n number of spaces to add * @param boolean $cell if true add the default cMargin space to each new line (default false). * @param string $h The height of the break. By default, the value equals the height of the last printed cell. * @param boolean $firstorlast if true do not print additional empty lines. * @param string $tag HTML tag to which this space will be applied * @param boolean $closing true if this space will be applied to a closing tag, false otherwise * @access protected */ protected function addHTMLVertSpace($n, $cell=false, $h='', $firstorlast=false, $tag='', $closing=false) { if ($firstorlast) { $this->Ln(0, $cell); $this->htmlvspace = 0; return; } if (isset($this->tagvspaces[$tag][intval($closing)]['n'])) { $n = $this->tagvspaces[$tag][intval($closing)]['n']; } if (isset($this->tagvspaces[$tag][intval($closing)]['h'])) { $h = $this->tagvspaces[$tag][intval($closing)]['h']; } if (is_string($h)) { $vsize = $n * $this->lasth; } else { $vsize = $n * $h; } if ($vsize > $this->htmlvspace) { $this->Ln(($vsize - $this->htmlvspace), $cell); $this->htmlvspace = $vsize; } } /** * Set the default bullet to be used as LI bullet symbol * @param string $symbol character or string to be used (legal values are: '' = automatic, '!' = auto bullet, '#' = auto numbering, 'disc', 'disc', 'circle', 'square', '1', 'decimal', 'decimal-leading-zero', 'i', 'lower-roman', 'I', 'upper-roman', 'a', 'lower-alpha', 'lower-latin', 'A', 'upper-alpha', 'upper-latin', 'lower-greek') * @access public * @since 4.0.028 (2008-09-26) */ public function setLIsymbol($symbol='!') { $symbol = strtolower($symbol); switch ($symbol) { case '!' : case '#' : case 'disc' : case 'disc' : case 'circle' : case 'square' : case '1': case 'decimal': case 'decimal-leading-zero': case 'i': case 'lower-roman': case 'I': case 'upper-roman': case 'a': case 'lower-alpha': case 'lower-latin': case 'A': case 'upper-alpha': case 'upper-latin': case 'lower-greek': { $this->lisymbol = $symbol; break; } default : { $this->lisymbol = ''; } } } /** * Set the booklet mode for double-sided pages. * @param boolean $booklet true set the booklet mode on, fals eotherwise. * @param float $inner Inner page margin. * @param float $outer Outer page margin. * @access public * @since 4.2.000 (2008-10-29) */ public function SetBooklet($booklet=true, $inner=-1, $outer=-1) { $this->booklet = $booklet; if ($inner >= 0) { $this->lMargin = $inner; } if ($outer >= 0) { $this->rMargin = $outer; } } /** * Swap the left and right margins. * @param boolean $reverse if true swap left and right margins. * @access protected * @since 4.2.000 (2008-10-29) */ protected function swapMargins($reverse=true) { if ($reverse) { // swap left and right margins $mtemp = $this->original_lMargin; $this->original_lMargin = $this->original_rMargin; $this->original_rMargin = $mtemp; $deltam = $this->original_lMargin - $this->original_rMargin; $this->lMargin += $deltam; $this->rMargin -= $deltam; } } /** * Set the vertical spaces for HTML tags. * The array must have the following structure (example): * $tagvs = array('h1' => array(0 => array('h' => '', 'n' => 2), 1 => array('h' => 1.3, 'n' => 1))); * The first array level contains the tag names, * the second level contains 0 for opening tags or 1 for closing tags, * the third level contains the vertical space unit (h) and the number spaces to add (n). * If the h parameter is not specified, default values are used. * @param array $tagvs array of tags and relative vertical spaces. * @access public * @since 4.2.001 (2008-10-30) */ public function setHtmlVSpace($tagvs) { $this->tagvspaces = $tagvs; } /** * Set custom width for list indentation. * @param float $width width of the indentation. Use negative value to disable it. * @access public * @since 4.2.007 (2008-11-12) */ public function setListIndentWidth($width) { return $this->customlistindent = floatval($width); } /** * Set the top/bottom cell sides to be open or closed when the cell cross the page. * @param boolean $isopen if true keeps the top/bottom border open for the cell sides that cross the page. * @access public * @since 4.2.010 (2008-11-14) */ public function setOpenCell($isopen) { $this->opencell = $isopen; } /** * Set the color and font style for HTML links. * @param array $color RGB array of colors * @param string $fontstyle additional font styles to add * @access public * @since 4.4.003 (2008-12-09) */ public function setHtmlLinksStyle($color=array(0,0,255), $fontstyle='U') { $this->htmlLinkColorArray = $color; $this->htmlLinkFontStyle = $fontstyle; } /** * convert html string containing value and unit of measure to user's units or points. * @param string $htmlval string containing values and unit * @param string $refsize reference value in points * @param string $defaultunit default unit (can be one of the following: %, em, ex, px, in, mm, pc, pt). * @param boolean $point if true returns points, otherwise returns value in user's units * @return float value in user's unit or point if $points=true * @access public * @since 4.4.004 (2008-12-10) */ public function getHTMLUnitToUnits($htmlval, $refsize=1, $defaultunit='px', $points=false) { $supportedunits = array('%', 'em', 'ex', 'px', 'in', 'cm', 'mm', 'pc', 'pt'); $retval = 0; $value = 0; $unit = 'px'; $k = $this->k; if ($points) { $k = 1; } if (in_array($defaultunit, $supportedunits)) { $unit = $defaultunit; } if (is_numeric($htmlval)) { $value = floatval($htmlval); } elseif (preg_match('/([0-9\.]+)/', $htmlval, $mnum)) { $value = floatval($mnum[1]); if (preg_match('/([a-z%]+)/', $htmlval, $munit)) { if (in_array($munit[1], $supportedunits)) { $unit = $munit[1]; } } } switch ($unit) { // percentage case '%': { $retval = (($value * $refsize) / 100); break; } // relative-size case 'em': { $retval = ($value * $refsize); break; } case 'ex': { $retval = $value * ($refsize / 2); break; } // absolute-size case 'in': { $retval = ($value * $this->dpi) / $k; break; } case 'cm': { $retval = ($value / 2.54 * $this->dpi) / $k; break; } case 'mm': { $retval = ($value / 25.4 * $this->dpi) / $k; break; } case 'pc': { // one pica is 12 points $retval = ($value * 12) / $k; break; } case 'pt': { $retval = $value / $k; break; } case 'px': { $retval = $this->pixelsToUnits($value); break; } } return $retval; } /** * Returns the Roman representation of an integer number * @param int number to convert * @return string roman representation of the specified number * @access public * @since 4.4.004 (2008-12-10) */ public function intToRoman($number) { $roman = ''; while ($number >= 1000) { $roman .= 'M'; $number -= 1000; } while ($number >= 900) { $roman .= 'CM'; $number -= 900; } while ($number >= 500) { $roman .= 'D'; $number -= 500; } while ($number >= 400) { $roman .= 'CD'; $number -= 400; } while ($number >= 100) { $roman .= 'C'; $number -= 100; } while ($number >= 90) { $roman .= 'XC'; $number -= 90; } while ($number >= 50) { $roman .= 'L'; $number -= 50; } while ($number >= 40) { $roman .= 'XL'; $number -= 40; } while ($number >= 10) { $roman .= 'X'; $number -= 10; } while ($number >= 9) { $roman .= 'IX'; $number -= 9; } while ($number >= 5) { $roman .= 'V'; $number -= 5; } while ($number >= 4) { $roman .= 'IV'; $number -= 4; } while ($number >= 1) { $roman .= 'I'; --$number; } return $roman; } /** * Output an HTML list bullet or ordered item symbol * @param int $listdepth list nesting level * @param string $listtype type of list * @param float $size current font size * @access protected * @since 4.4.004 (2008-12-10) */ protected function putHtmlListBullet($listdepth, $listtype='', $size=10) { $size /= $this->k; $fill = ''; $color = $this->fgcolor; $width = 0; $textitem = ''; $tmpx = $this->x; $lspace = $this->GetStringWidth(' '); if ($listtype == '!') { // set default list type for unordered list $deftypes = array('disc', 'circle', 'square'); $listtype = $deftypes[($listdepth - 1) % 3]; } elseif ($listtype == '#') { // set default list type for ordered list $listtype = 'decimal'; } switch ($listtype) { // unordered types case 'none': { break; } case 'disc': { $fill = 'F'; } case 'circle': { $fill .= 'D'; $r = $size / 6; $lspace += (2 * $r); if ($this->rtl) { $this->x = $this->w - $this->x - $lspace; } else { $this->x -= $lspace; } $this->Circle(($this->x + $r), ($this->y + ($this->lasth / 2)), $r, 0, 360, $fill, array('color'=>$color), $color, 8); break; } case 'square': { $l = $size / 3; $lspace += $l; if ($this->rtl) { $this->x = $this->w - $this->x - $lspace; } else { $this->x -= $lspace; } $this->Rect($this->x, ($this->y + (($this->lasth - $l)/ 2)), $l, $l, 'F', array(), $color); break; } // ordered types // $this->listcount[$this->listnum]; // $textitem case '1': case 'decimal': { $textitem = $this->listcount[$this->listnum]; break; } case 'decimal-leading-zero': { $textitem = sprintf("%02d", $this->listcount[$this->listnum]); break; } case 'i': case 'lower-roman': { $textitem = strtolower($this->intToRoman($this->listcount[$this->listnum])); break; } case 'I': case 'upper-roman': { $textitem = $this->intToRoman($this->listcount[$this->listnum]); break; } case 'a': case 'lower-alpha': case 'lower-latin': { $textitem = chr(97 + $this->listcount[$this->listnum] - 1); break; } case 'A': case 'upper-alpha': case 'upper-latin': { $textitem = chr(65 + $this->listcount[$this->listnum] - 1); break; } case 'lower-greek': { $textitem = $this->unichr(945 + $this->listcount[$this->listnum] - 1); break; } /* // Types to be implemented (special handling) case 'hebrew': { break; } case 'armenian': { break; } case 'georgian': { break; } case 'cjk-ideographic': { break; } case 'hiragana': { break; } case 'katakana': { break; } case 'hiragana-iroha': { break; } case 'katakana-iroha': { break; } */ default: { $textitem = $this->listcount[$this->listnum]; } } if (!$this->empty_string($textitem)) { // print ordered item if ($this->rtl) { $textitem = '.'.$textitem; } else { $textitem = $textitem.'.'; } $lspace += $this->GetStringWidth($textitem); if ($this->rtl) { $this->x += $lspace; } else { $this->x -= $lspace; } $this->Write($this->lasth, $textitem, '', false, '', false, 0, false); } $this->x = $tmpx; $this->lispacer = ''; } /** * Returns current graphic variables as array. * @return array graphic variables * @access protected * @since 4.2.010 (2008-11-14) */ protected function getGraphicVars() { $grapvars = array( 'FontFamily' => $this->FontFamily, 'FontStyle' => $this->FontStyle, 'FontSizePt' => $this->FontSizePt, 'rMargin' => $this->rMargin, 'lMargin' => $this->lMargin, 'cMargin' => $this->cMargin, 'LineWidth' => $this->LineWidth, 'linestyleWidth' => $this->linestyleWidth, 'linestyleCap' => $this->linestyleCap, 'linestyleJoin' => $this->linestyleJoin, 'linestyleDash' => $this->linestyleDash, 'DrawColor' => $this->DrawColor, 'FillColor' => $this->FillColor, 'TextColor' => $this->TextColor, 'ColorFlag' => $this->ColorFlag, 'bgcolor' => $this->bgcolor, 'fgcolor' => $this->fgcolor, 'htmlvspace' => $this->htmlvspace, 'lasth' => $this->lasth ); return $grapvars; } /** * Set graphic variables. * @param $gvars array graphic variables * @access protected * @since 4.2.010 (2008-11-14) */ protected function setGraphicVars($gvars) { $this->FontFamily = $gvars['FontFamily']; $this->FontStyle = $gvars['FontStyle']; $this->FontSizePt = $gvars['FontSizePt']; $this->rMargin = $gvars['rMargin']; $this->lMargin = $gvars['lMargin']; $this->cMargin = $gvars['cMargin']; $this->LineWidth = $gvars['LineWidth']; $this->linestyleWidth = $gvars['linestyleWidth']; $this->linestyleCap = $gvars['linestyleCap']; $this->linestyleJoin = $gvars['linestyleJoin']; $this->linestyleDash = $gvars['linestyleDash']; $this->DrawColor = $gvars['DrawColor']; $this->FillColor = $gvars['FillColor']; $this->TextColor = $gvars['TextColor']; $this->ColorFlag = $gvars['ColorFlag']; $this->bgcolor = $gvars['bgcolor']; $this->fgcolor = $gvars['fgcolor']; $this->htmlvspace = $gvars['htmlvspace']; //$this->lasth = $gvars['lasth']; $this->_out(''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor.''); if (!$this->empty_string($this->FontFamily)) { $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt); } } /** * Returns a temporary filename for caching object on filesystem. * @param string $prefix prefix to add to filename * return string filename. * @access protected * @since 4.5.000 (2008-12-31) */ protected function getObjFilename($name) { return tempnam(K_PATH_CACHE, $name.'_'); } /** * Writes data to a temporary file on filesystem. * @param string $file file name * @param mixed $data data to write on file * @param boolean $append if true append data, false replace. * @access protected * @since 4.5.000 (2008-12-31) */ protected function writeDiskCache($filename, $data, $append=false) { if ($append) { $fmode = 'ab+'; } else { $fmode = 'wb+'; } $f = @fopen($filename, $fmode); if (!$f) { $this->Error('Unable to write cache file: '.$filename); } else { fwrite($f, $data); fclose($f); } // update file lenght (needed for transactions) if (!isset($this->cache_file_lenght['_'.$filename])) { $this->cache_file_lenght['_'.$filename] = strlen($data); } else { $this->cache_file_lenght['_'.$filename] += strlen($data); } } /** * Read data from a temporary file on filesystem. * @param string $file file name * @return mixed retrieved data * @access protected * @since 4.5.000 (2008-12-31) */ protected function readDiskCache($filename) { return file_get_contents($filename); } /** * Set buffer content (always append data). * @param string $data data * @access protected * @since 4.5.000 (2009-01-02) */ protected function setBuffer($data) { $this->bufferlen += strlen($data); if ($this->diskcache) { if (!isset($this->buffer) OR $this->empty_string($this->buffer)) { $this->buffer = $this->getObjFilename('buffer'); } $this->writeDiskCache($this->buffer, $data, true); } else { $this->buffer .= $data; } } /** * Get buffer content. * @return string buffer content * @access protected * @since 4.5.000 (2009-01-02) */ protected function getBuffer() { if ($this->diskcache) { return $this->readDiskCache($this->buffer); } else { return $this->buffer; } } /** * Set page buffer content. * @param int $page page number * @param string $data page data * @param boolean $append if true append data, false replace. * @access protected * @since 4.5.000 (2008-12-31) */ protected function setPageBuffer($page, $data, $append=false) { if ($this->diskcache) { if (!isset($this->pages[$page])) { $this->pages[$page] = $this->getObjFilename('page'.$page); } $this->writeDiskCache($this->pages[$page], $data, $append); } else { if ($append) { $this->pages[$page] .= $data; } else { $this->pages[$page] = $data; } } if ($append AND isset($this->pagelen[$page])) { $this->pagelen[$page] += strlen($data); } else { $this->pagelen[$page] = strlen($data); } } /** * Get page buffer content. * @param int $page page number * @return string page buffer content or false in case of error * @access protected * @since 4.5.000 (2008-12-31) */ protected function getPageBuffer($page) { if ($this->diskcache) { return $this->readDiskCache($this->pages[$page]); } elseif (isset($this->pages[$page])) { return $this->pages[$page]; } return false; } /** * Set image buffer content. * @param string $image image key * @param array $data image data * @access protected * @since 4.5.000 (2008-12-31) */ protected function setImageBuffer($image, $data) { if ($this->diskcache) { if (!isset($this->images[$image])) { $this->images[$image] = $this->getObjFilename('image'.$image); } $this->writeDiskCache($this->images[$image], serialize($data)); } else { $this->images[$image] = $data; } if (!in_array($image, $this->imagekeys)) { $this->imagekeys[] = $image; } ++$this->numimages; } /** * Set image buffer content. * @param string $image image key * @param string $key image sub-key * @param array $data image data * @access protected * @since 4.5.000 (2008-12-31) */ protected function setImageSubBuffer($image, $key, $data) { if (!isset($this->images[$image])) { $this->setImageBuffer($image, array()); } if ($this->diskcache) { $tmpimg = $this->getImageBuffer($image); $tmpimg[$key] = $data; $this->writeDiskCache($this->images[$image], serialize($tmpimg)); } else { $this->images[$image][$key] = $data; } } /** * Get image buffer content. * @param string $image image key * @return string image buffer content or false in case of error * @access protected * @since 4.5.000 (2008-12-31) */ protected function getImageBuffer($image) { if ($this->diskcache AND isset($this->images[$image])) { return unserialize($this->readDiskCache($this->images[$image])); } elseif (isset($this->images[$image])) { return $this->images[$image]; } return false; } /** * Set font buffer content. * @param string $font font key * @param array $data font data * @access protected * @since 4.5.000 (2009-01-02) */ protected function setFontBuffer($font, $data) { if ($this->diskcache) { if (!isset($this->fonts[$font])) { $this->fonts[$font] = $this->getObjFilename('font'); } $this->writeDiskCache($this->fonts[$font], serialize($data)); } else { $this->fonts[$font] = $data; } if (!in_array($font, $this->fontkeys)) { $this->fontkeys[] = $font; } } /** * Set font buffer content. * @param string $font font key * @param string $key font sub-key * @param array $data font data * @access protected * @since 4.5.000 (2009-01-02) */ protected function setFontSubBuffer($font, $key, $data) { if (!isset($this->fonts[$font])) { $this->setFontBuffer($font, array()); } if ($this->diskcache) { $tmpfont = $this->getFontBuffer($font); $tmpfont[$key] = $data; $this->writeDiskCache($this->fonts[$font], serialize($tmpfont)); } else { $this->fonts[$font][$key] = $data; } } /** * Get font buffer content. * @param string $font font key * @return string font buffer content or false in case of error * @access protected * @since 4.5.000 (2009-01-02) */ protected function getFontBuffer($font) { if ($this->diskcache AND isset($this->fonts[$font])) { return unserialize($this->readDiskCache($this->fonts[$font])); } elseif (isset($this->fonts[$font])) { return $this->fonts[$font]; } return false; } /** * Move a page to a previous position. * @param int $frompage number of the source page * @param int $topage number of the destination page (must be less than $frompage) * @return true in case of success, false in case of error. * @access public * @since 4.5.000 (2009-01-02) */ public function movePage($frompage, $topage) { if (($frompage > $this->numpages) OR ($frompage <= $topage)) { return false; } if ($frompage == $this->page) { // close the page before moving it $this->endPage(); } // move all page-related states $tmppage = $this->pages[$frompage]; $tmppagedim = $this->pagedim[$frompage]; $tmppagelen = $this->pagelen[$frompage]; $tmpintmrk = $this->intmrk[$frompage]; if (isset($this->footerpos[$frompage])) { $tmpfooterpos = $this->footerpos[$frompage]; } if (isset($this->footerlen[$frompage])) { $tmpfooterlen = $this->footerlen[$frompage]; } if (isset($this->transfmrk[$frompage])) { $tmptransfmrk = $this->transfmrk[$frompage]; } if (isset($this->PageAnnots[$frompage])) { $tmpannots = $this->PageAnnots[$frompage]; } if (isset($this->newpagegroup[$frompage])) { $tmpnewpagegroup = $this->newpagegroup[$frompage]; } for ($i = $frompage; $i > $topage; --$i) { $j = $i - 1; // shift pages down $this->pages[$i] = $this->pages[$j]; $this->pagedim[$i] = $this->pagedim[$j]; $this->pagelen[$i] = $this->pagelen[$j]; $this->intmrk[$i] = $this->intmrk[$j]; if (isset($this->footerpos[$j])) { $this->footerpos[$i] = $this->footerpos[$j]; } elseif (isset($this->footerpos[$i])) { unset($this->footerpos[$i]); } if (isset($this->footerlen[$j])) { $this->footerlen[$i] = $this->footerlen[$j]; } elseif (isset($this->footerlen[$i])) { unset($this->footerlen[$i]); } if (isset($this->transfmrk[$j])) { $this->transfmrk[$i] = $this->transfmrk[$j]; } elseif (isset($this->transfmrk[$i])) { unset($this->transfmrk[$i]); } if (isset($this->PageAnnots[$j])) { $this->PageAnnots[$i] = $this->PageAnnots[$j]; } elseif (isset($this->PageAnnots[$i])) { unset($this->PageAnnots[$i]); } if (isset($this->newpagegroup[$j])) { $this->newpagegroup[$i] = $this->newpagegroup[$j]; } elseif (isset($this->newpagegroup[$i])) { unset($this->newpagegroup[$i]); } } $this->pages[$topage] = $tmppage; $this->pagedim[$topage] = $tmppagedim; $this->pagelen[$topage] = $tmppagelen; $this->intmrk[$topage] = $tmpintmrk; if (isset($tmpfooterpos)) { $this->footerpos[$topage] = $tmpfooterpos; } elseif (isset($this->footerpos[$topage])) { unset($this->footerpos[$topage]); } if (isset($tmpfooterlen)) { $this->footerlen[$topage] = $tmpfooterlen; } elseif (isset($this->footerlen[$topage])) { unset($this->footerlen[$topage]); } if (isset($tmptransfmrk)) { $this->transfmrk[$topage] = $tmptransfmrk; } elseif (isset($this->transfmrk[$topage])) { unset($this->transfmrk[$topage]); } if (isset($tmpannots)) { $this->PageAnnots[$topage] = $tmpannots; } elseif (isset($this->PageAnnots[$topage])) { unset($this->PageAnnots[$topage]); } if (isset($tmpnewpagegroup)) { $this->newpagegroup[$topage] = $tmpnewpagegroup; } elseif (isset($this->newpagegroup[$topage])) { unset($this->newpagegroup[$topage]); } // adjust outlines $tmpoutlines = $this->outlines; foreach ($tmpoutlines as $key => $outline) { if (($outline['p'] >= $topage) AND ($outline['p'] < $frompage)) { $this->outlines[$key]['p'] = $outline['p'] + 1; } elseif ($outline['p'] == $frompage) { $this->outlines[$key]['p'] = $topage; } } // adjust links $tmplinks = $this->links; foreach ($tmplinks as $key => $link) { if (($link[0] >= $topage) AND ($link[0] < $frompage)) { $this->links[$key][0] = $link[0] + 1; } elseif ($link[0] == $frompage) { $this->links[$key][0] = $topage; } } // adjust javascript $tmpjavascript = $this->javascript; global $jfrompage, $jtopage; $jfrompage = $frompage; $jtopage = $topage; $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', create_function('$matches', 'global $jfrompage, $jtopage; $pagenum = intval($matches[3]) + 1; if (($pagenum >= $jtopage) AND ($pagenum < $jfrompage)) { $newpage = ($pagenum + 1); } elseif ($pagenum == $jfrompage) { $newpage = $jtopage; } else { $newpage = $pagenum; } --$newpage; return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); // return to last page $this->lastPage(true); return true; } /** * Remove the specified page. * @param int $page page to remove * @return true in case of success, false in case of error. * @access public * @since 4.6.004 (2009-04-23) */ public function deletePage($page) { if ($page > $this->numpages) { return false; } // delete current page unset($this->pages[$page]); unset($this->pagedim[$page]); unset($this->pagelen[$page]); unset($this->intmrk[$page]); if (isset($this->footerpos[$page])) { unset($this->footerpos[$page]); } if (isset($this->footerlen[$page])) { unset($this->footerlen[$page]); } if (isset($this->transfmrk[$page])) { unset($this->transfmrk[$page]); } if (isset($this->PageAnnots[$page])) { unset($this->PageAnnots[$page]); } if (isset($this->newpagegroup[$page])) { unset($this->newpagegroup[$page]); } if (isset($this->pageopen[$page])) { unset($this->pageopen[$page]); } // update remaining pages for ($i = $page; $i < $this->numpages; ++$i) { $j = $i + 1; // shift pages $this->pages[$i] = $this->pages[$j]; $this->pagedim[$i] = $this->pagedim[$j]; $this->pagelen[$i] = $this->pagelen[$j]; $this->intmrk[$i] = $this->intmrk[$j]; if (isset($this->footerpos[$j])) { $this->footerpos[$i] = $this->footerpos[$j]; } elseif (isset($this->footerpos[$i])) { unset($this->footerpos[$i]); } if (isset($this->footerlen[$j])) { $this->footerlen[$i] = $this->footerlen[$j]; } elseif (isset($this->footerlen[$i])) { unset($this->footerlen[$i]); } if (isset($this->transfmrk[$j])) { $this->transfmrk[$i] = $this->transfmrk[$j]; } elseif (isset($this->transfmrk[$i])) { unset($this->transfmrk[$i]); } if (isset($this->PageAnnots[$j])) { $this->PageAnnots[$i] = $this->PageAnnots[$j]; } elseif (isset($this->PageAnnots[$i])) { unset($this->PageAnnots[$i]); } if (isset($this->newpagegroup[$j])) { $this->newpagegroup[$i] = $this->newpagegroup[$j]; } elseif (isset($this->newpagegroup[$i])) { unset($this->newpagegroup[$i]); } if (isset($this->pageopen[$j])) { $this->pageopen[$i] = $this->pageopen[$j]; } elseif (isset($this->pageopen[$i])) { unset($this->pageopen[$i]); } } // remove last page unset($this->pages[$this->numpages]); unset($this->pagedim[$this->numpages]); unset($this->pagelen[$this->numpages]); unset($this->intmrk[$this->numpages]); if (isset($this->footerpos[$this->numpages])) { unset($this->footerpos[$this->numpages]); } if (isset($this->footerlen[$this->numpages])) { unset($this->footerlen[$this->numpages]); } if (isset($this->transfmrk[$this->numpages])) { unset($this->transfmrk[$this->numpages]); } if (isset($this->PageAnnots[$this->numpages])) { unset($this->PageAnnots[$this->numpages]); } if (isset($this->newpagegroup[$this->numpages])) { unset($this->newpagegroup[$this->numpages]); } if (isset($this->pageopen[$this->numpages])) { unset($this->pageopen[$this->numpages]); } --$this->numpages; $this->page = $this->numpages; // adjust outlines $tmpoutlines = $this->outlines; foreach ($tmpoutlines as $key => $outline) { if ($outline['p'] > $page) { $this->outlines[$key]['p'] = $outline['p'] - 1; } elseif ($outline['p'] == $page) { unset($this->outlines[$key]); } } // adjust links $tmplinks = $this->links; foreach ($tmplinks as $key => $link) { if ($link[0] > $page) { $this->links[$key][0] = $link[0] - 1; } elseif ($link[0] == $page) { unset($this->links[$key]); } } // adjust javascript $tmpjavascript = $this->javascript; global $jpage; $jpage = $page; $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', create_function('$matches', 'global $jpage; $pagenum = intval($matches[3]) + 1; if ($pagenum >= $jpage) { $newpage = ($pagenum - 1); } elseif ($pagenum == $jpage) { $newpage = 1; } else { $newpage = $pagenum; } --$newpage; return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); // return to last page $this->lastPage(true); return true; } /** * Output a Table of Content Index (TOC). * You can override this method to achieve different styles. * @param int $page page number where this TOC should be inserted (leave empty for current page). * @param string $numbersfont set the font for page numbers (please use monospaced font for better alignment). * @param string $filler string used to fill the space between text and page number. * @access public * @author Nicola Asuni * @since 4.5.000 (2009-01-02) */ public function addTOC($page='', $numbersfont='', $filler='.') { $fontsize = $this->FontSizePt; $fontfamily = $this->FontFamily; $fontstyle = $this->FontStyle; $w = $this->w - $this->lMargin - $this->rMargin; $spacer = $this->GetStringWidth(' ') * 4; $page_first = $this->getPage(); $lmargin = $this->lMargin; $rmargin = $this->rMargin; $x_start = $this->GetX(); if ($this->empty_string($numbersfont)) { $numbersfont = $this->default_monospaced_font; } if ($this->empty_string($filler)) { $filler = ' '; } if ($this->empty_string($page)) { $gap = ' '; } else { $gap = ''; } foreach ($this->outlines as $key => $outline) { if ($this->rtl) { $aligntext = 'R'; $alignnum = 'L'; } else { $aligntext = 'L'; $alignnum = 'R'; } if ($outline['l'] == 0) { $this->SetFont($fontfamily, $fontstyle.'B', $fontsize); } else { $this->SetFont($fontfamily, $fontstyle, $fontsize - $outline['l']); } $indent = ($spacer * $outline['l']); if ($this->rtl) { $this->rMargin += $indent; $this->x -= $indent; } else { $this->lMargin += $indent; $this->x += $indent; } $link = $this->AddLink(); $this->SetLink($link, 0, $outline['p']); // write the text $this->Write(0, $outline['t'], $link, 0, $aligntext, false, 0, false, false, 0); $this->SetFont($numbersfont, $fontstyle, $fontsize); if ($this->empty_string($page)) { $pagenum = $outline['p']; } else { // placemark to be replaced with the correct number $pagenum = '{#'.($outline['p']).'}'; if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { $pagenum = '{'.$pagenum.'}'; } } $numwidth = $this->GetStringWidth($pagenum); if ($this->rtl) { $tw = $this->x - $this->lMargin; } else { $tw = $this->w - $this->rMargin - $this->x; } $fw = $tw - $numwidth - $this->GetStringWidth(' '); $numfills = floor($fw / $this->GetStringWidth($filler)); if ($numfills > 0) { $rowfill = str_repeat($filler, $numfills); } else { $rowfill = ''; } if ($this->rtl) { $pagenum = $pagenum.$gap.$rowfill.' '; } else { $pagenum = ' '.$rowfill.$gap.$pagenum; } // write the number //$this->SetX($x_start); $this->Cell($tw, 0, $pagenum, 0, 1, $alignnum, 0, $link, 0); $this->SetX($x_start); $this->lMargin = $lmargin; $this->rMargin = $rmargin; } $page_last = $this->getPage(); $numpages = $page_last - $page_first + 1; if (!$this->empty_string($page)) { for ($p = $page_first; $p <= $page_last; ++$p) { // get page data $temppage = $this->getPageBuffer($p); for ($n = 1; $n <= $this->numpages; ++$n) { // update page numbers $k = '{#'.$n.'}'; $ku = '{'.$k.'}'; $alias_a = $this->_escape($k); $alias_au = $this->_escape('{'.$k.'}'); if ($this->isunicode) { $alias_b = $this->_escape($this->UTF8ToLatin1($k)); $alias_bu = $this->_escape($this->UTF8ToLatin1($ku)); $alias_c = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); $alias_cu = $this->_escape($this->utf8StrRev($ku, false, $this->tmprtl)); } if ($n >= $page) { $np = $n + $numpages; } else { $np = $n; } $ns = $this->formatTOCPageNumber($np); $nu = $ns; $sdiff = strlen($k) - strlen($ns) - 1; $sdiffu = strlen($ku) - strlen($ns) - 1; $sfill = str_repeat($filler, $sdiff); $sfillu = str_repeat($filler, $sdiffu); if ($this->rtl) { $ns = $ns.' '.$sfill; $nu = $nu.' '.$sfillu; } else { $ns = $sfill.' '.$ns; $nu = $sfillu.' '.$nu; } $nu = $this->UTF8ToUTF16BE($nu, false); $temppage = str_replace($alias_au, $nu, $temppage); if ($this->isunicode) { $temppage = str_replace($alias_bu, $nu, $temppage); $temppage = str_replace($alias_cu, $nu, $temppage); $temppage = str_replace($alias_b, $ns, $temppage); $temppage = str_replace($alias_c, $ns, $temppage); } $temppage = str_replace($alias_a, $ns, $temppage); } // save changes $this->setPageBuffer($p, $temppage); } // move pages for ($i = 0; $i < $numpages; ++$i) { $this->movePage($page_last, $page); } } $this->SetFont($fontfamily, $fontstyle, $fontsize); } /** * Stores a copy of the current TCPDF object used for undo operation. * @access public * @since 4.5.029 (2009-03-19) */ public function startTransaction() { if (isset($this->objcopy)) { // remove previous copy $this->commitTransaction(); } // record current page number $this->start_transaction_page = $this->page; // clone current object $this->objcopy = $this->objclone($this); } /** * Delete the copy of the current TCPDF object used for undo operation. * @access public * @since 4.5.029 (2009-03-19) */ public function commitTransaction() { if (isset($this->objcopy)) { $this->objcopy->_destroy(true, true); unset($this->objcopy); } } /** * This method allows to undo the latest transaction by returning the latest saved TCPDF object with startTransaction(). * @param boolean $self if true restores current class object to previous state without the need of reassignment via the returned value. * @return TCPDF object. * @access public * @since 4.5.029 (2009-03-19) */ public function rollbackTransaction($self=false) { if (isset($this->objcopy)) { if (isset($this->objcopy->diskcache) AND $this->objcopy->diskcache) { // truncate files to previous values foreach ($this->objcopy->cache_file_lenght as $file => $lenght) { $file = substr($file, 1); $handle = fopen($file, 'r+'); ftruncate($handle, $lenght); } } $this->_destroy(true, true); if ($self) { $objvars = get_object_vars($this->objcopy); foreach ($objvars as $key => $value) { $this->$key = $value; } } return $this->objcopy; } return $this; } /** * Creates a copy of a class object * @param object $object class object to be cloned * @return cloned object * @access public * @since 4.5.029 (2009-03-19) */ public function objclone($object) { return @clone($object); } /** * Determine whether a string is empty. * @param srting $str string to be checked * @return boolean true if string is empty * @access public * @since 4.5.044 (2009-04-16) */ public function empty_string($str) { return (is_null($str) OR (is_string($str) AND (strlen($str) == 0))); } } // END OF TCPDF CLASS } //============================================================+ // END OF FILE //============================================================+ ?> PHPExcel/Shared/PDF/CHANGELOG.TXT 0000666 00000132650 15017047356 0011706 0 ustar 00 4.8.009 (2009-09-30) - Compatibility with PHP 5.3 was improved. - All examples were updated. - Index file for examples was added. 4.8.008 (2009-09-29) - Example 49 was updated. - Underline and linethrough now works with cell stretching mode. 4.8.007 (2009-09-23) - Infinite loop problem caused by nobr attribute was fixed. 4.8.006 (2009-09-23) - Bug item #2864522 "No images if DOCUMENT_ROOT=='/'" was fixed. - Support for text-indent CSS attribute was added. - Method rollbackTransaction() was changed to support self-reassigment of previous object (check source code documentation). - Support for the HTML "nobr" attribute was added to avoid splitting a table or a table row on two pages (i.e.: ...). 4.8.005 (2009-09-17) - A bug relative to multiple transformations and annotations was fixed. 4.8.004 (2009-09-16) - A bug on _putannotsrefs() method was fixed. 4.8.003 (2009-09-15) - Bug item #2858754 "Division by zero" was fixed. - A bug relative to HTML list items was fixed. - A bug relative to form fields on multiple pages was fixed. - PolyLine() method was added (see example n. 12). - Signature of Polygon() method was changed. 4.8.002 (2009-09-12) - A problem related to CID-0 fonts offset was fixed: if the $cw[1] entry on the CID-0 font file is not defined, then a CID keys offset is introduced. 4.8.001 (2009-09-09) - The appearance streams (AP) for anotations form fields was fixed (see examples n. 14 and 54). - Radiobuttons were fixed. 4.8.000 (2009-09-07) - This version includes some support for Forms fields (see example n. 14) and XHTML forms (see example n. 54). - The following methods were changed to work without JavaScript: TextField(), RadioButton(), ListBox(), ComboBox(), CheckBox(), Button(). - Support for Widget annotations was improved. - Alignment of annotation objects was fixed (examples 36 and 41 were updated). - addJavascriptObject() method was added. - Signature of Image() method was changed. - htmlcolors.php file was updated. -------------------------------------------------------------------------------- 4.7.003 (2009-09-03) - Support for TCPDF methods on HTML was improved (see example n. 49). 4.7.002 (2009-09-02) - Bug item #2848892 "writeHTML + table: Gaps between rows" was fixed. - JavaScript support was fixed (see example n. 53). 4.7.001 (2009-08-30) - The Polygon() and Arrow() methods were fixed and improved (see example n. 12). 4.7.000 (2009-08-29) - This is a major release. - Some procedures were internally optimized. - The problem of mixed signature and annotations was fixed (example n. 52). 4.6.030 (2009-08-29) - IMPORTANT: percentages on table cell widths are now relative to the full table width (as in standard HTML). - Various minor bugs were fixed. - Example n. 52 (digital signature) was updated. 4.6.029 (2009-08-26) - PHP4 version was fixed. 4.6.028 (2009-08-25) - Signature algorithm was finally fixed (see example n. 52). 4.6.027 (2009-08-24) - TCPDF now supports unembedded TrueTypeUnicode Fonts (just comment the $file entry on the fonts' php file. 4.6.026 (2009-08-21) - Bug #2841693 "Problem with MultiCell and ishtml and justification" was fixed. - Signature functions were improved but not yet fixed (tcpdf.crt and example n. 52 were updated). 4.6.025 (2009-08-17) - Carriage returns (\r) were removed from source code. - Problem related to set_magic_quotes_runtime() depracated was fixed. 4.6.024 (2009-08-07) - Bug item #2833556 "justification using other units than mm" was fixed. - Documentation was fixed/updated. 4.6.023 (2009-08-02) - Bug item #2830537 "MirrorH can show mask for transparent PNGs" was fixed. 4.6.022 (2009-07-24) - A bug relative to single line printing when using WriteHTMLCell() was fixed. - Signature support were improved but is still experimental. - Fonts Free and Dejavu were updated to latest versions. 4.6.021 (2009-07-20) - Bug item #2824015 "XHTML Ampersand & in hyperlink bug" was fixed. - Bug item #2824036 "Image as hyperlink in table, text displaced at page break" was fixed. - Links alignment on justified text was fixed. - Unicode "\u" modifier was added to re_spaces variable by default. 4.6.020 (2009-07-16) - Bug item #2821921 "issue in example 18" was fixed. - Signature of SetRTL() method was changed. 4.6.019 (2009-07-13) - Bug item #2820703 "xref table broken" was fixed. 4.6.018 (2009-07-10) - Bug item #2819319 "Text over text" was fixed. - Method Arrow() was added to print graphic arrows (example 12 was updated). 4.6.017 (2009-07-05) - Bug item #2816079 "Example 48 not working" was fixed. - The signature of the checkPageBreak() was changed. The parameter $addpage was added to turn off the automatic page creation. 4.6.016 (2009-06-16) - Method setSpacesRE() was added to set the regular expression used for detecting withespaces or word separators. If you are using chinese, try: setSpacesRE('/[\s\p{Z}\p{Lo}]/');, otherwise you can use setSpacesRE('/[\s\p{Z}]/'); - The method _putinfo() now automatically fills the metadata with '?' in case of empty string. 4.6.015 (2009-06-11) - Bug #2804667 "word wrap bug" was fixed. 4.6.014 (2009-06-04) - Bug #2800931 "Table thead tag bug" was fixed. - A bug related to tag was fixed. 4.6.013 (2009-05-28) - List bullets position was fixed for RTL languages. 4.6.012 (2009-05-23) - setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key! 4.6.011 (2009-05-18) - Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation). 4.6.010 (2009-05-17) - Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null. - tag indent problem was fixed. - $y parameter was added to checkPageBreak() method. - Bug n. 2791773 "writeHTML" was fixed. 4.6.009 (2009-05-13) - xref table for embedded files was fixed. 4.6.008 (2009-05-07) - setSignature() method was improved (but is still experimental). - Example n. 52 was added. 4.6.007 (2009-05-05) - Bug #2786685 "writeHtmlCell and in custom footer" was fixed. - Table header repeating bug was fixed. - Some newlines and tabs are now automatically removed from HTML strings. 4.6.006 (2009-04-28) - Support for "..." was added. - By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces). 4.6.005 (2009-04-25) - Points (pt) conversion in getHTMLUnitToUnits() was fixed. - Default tcpdf.pem certificate file was added. - Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation). 4.6.004 (2009-04-23) - Method deletePage() was added to delete pages (see example n. 44). 4.6.003 (2009-04-21) - The caching mechanism of the UTF8StringToArray() method was fixed. 4.6.002 (2009-04-20) - Documentation of rollbackTransaction() method was fixed. - The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method. - HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()). - WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1. 4.6.001 (2009-04-17) - Spaces between HTML block tags are now automatically removed. - The bug related to cMargin changes between tables was fixed. 4.6.000 (2009-04-16) - WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods: zero coordinates for $x and $y are now valid coordinates; set $x and $y as empty strings to get the current value. - Some error caused by 'empty' funtion were fixed. - Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false. - HTML on footer bug was fixed. - The following examples were fixed: 5,7,10,17,19,20,21,33,42,43. 4.5.043 (2009-04-15) - Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27): C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9 C39+ : CODE 39 with checksum C39E : CODE 39 EXTENDED C39E+ : CODE 39 EXTENDED + CHECKSUM C93 : CODE 93 - USS-93 S25 : Standard 2 of 5 S25+ : Standard 2 of 5 + CHECKSUM I25 : Interleaved 2 of 5 I25+ : Interleaved 2 of 5 + CHECKSUM C128A : CODE 128 A C128B : CODE 128 B C128C : CODE 128 C EAN2 : 2-Digits UPC-Based Extention EAN5 : 5-Digits UPC-Based Extention EAN8 : EAN 8 EAN13 : EAN 13 UPCA : UPC-A UPCE : UPC-E MSI : MSI (Variation of Plessey code) MSI+ : MSI + CHECKSUM (modulo 11) POSTNET : POSTNET PLANET : PLANET RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) KIX : KIX (Klant index - Customer index) IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension) CODABAR : CODABAR CODE11 : CODE 11 PHARMA : PHARMACODE PHARMA2T : PHARMACODE TWO-TRACKS 4.5.042 (2009-04-15) - Method Write() was fixed for the strings containing only zero value. 4.5.041 (2009-04-14) - Barcode methods were fixed. 4.5.040 (2009-04-14) - Method Write() was fixed to handle empty strings. 4.5.039 (2009-04-11) - Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation). 4.5.038 (2009-04-10) - Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified. 4.5.037 (2009-04-09) - General performances were improved. - The signature of the method utf8Bidi() was changed. - The method UniArrSubString() was added. - Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class). 4.5.036 (2009-04-03) - TCPDF methods can be called inside the HTML code (see example n. 49). - All tag attributes, such as must be enclosed within double quotes. 4.5.035 (2009-03-28) - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed. - Bug #2719090 "writeHTML fix follow up" was fixed. - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader. 4.5.034 (2009-03-27) - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed. - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed. - The signature of the Cell() method was changed. 4.5.033 (2009-03-27) - The support for rowspan/colspan on HTML tables was improved (see example n. 48). 4.5.032 (2009-03-23) - setPrintFooter(false) bug was fixed. 4.5.031 (2009-03-20) - Table header support was extended to multiple pages. 4.5.030 (2009-03-20) - thead tag is now supported on HTML tables (header rows are repeated after page breaks). - The startTransaction() was improved to autocommit. - List bullets now uses the foreground color (putHtmlListBullet()). 4.5.029 (2009-03-19) - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction(). - All examples were updated. 4.5.028 (2009-03-18) - Bug #2690945 "List Bugs" was fixed. - HTML text alignment on lists was fixed. - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font. - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin(). - All examples were updated. 4.5.027 (2009-03-16) - Method getPageDimensions() was added to get page dimensions. - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin(). - _parsepng() method was fixed for PNG URL images (fread bug). 4.5.026 (2009-03-11) - Bug #2681793 affecting URL images with spaces was fixed. 4.5.025 (2009-03-10) - A small bug affecting hyphenation support was fixed. - The method SetDefaultMonospacedFont() was added to define the default monospaced font. 4.5.024 (2009-03-07) - The bug #2666493 was fixed "Footer corrupts document". 4.5.023 (2009-03-06) - The bug #2666688 was fixed "Rowspan in tables". 4.5.022 (2009-03-05) - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed". - addTOC() function bug was fixed. 4.5.020 (2009-03-03) - The following bug was fixed: "function removeSHY corrupts unicode". 4.5.019 (2009-02-28) - The problem of decimal separator using different locale was fixed. - The text hyphenation is now supported (see example n. 46). 4.5.018 (2009-02-26) - The _destroy() method was added to unset all class variables and frees memory. - Now it's possible to call Output() method multiple times. 4.5.017 (2009-02-24) - A minor bug that raises a PHP warning was fixed. 4.5.016 (2009-02-24) - Bug item #2631200 "getNumLines() counts wrong" was fixed. - Multiple attachments bug was fixed. - All class variables are now cleared on Output() for memory otpimization. 4.5.015 (2009-02-18) - Bug item #2612553 "function Write() must not break a line on character" was fixed. 4.5.014 (2009-02-13) - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php). - Pagebreak bug for barcode was fixed. 4.5.013 (2009-02-12) - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()). 4.5.012 (2009-02-12) - An error on image border feature was fixed. 4.5.011 (2009-02-12) - HTML links for images are now supported. - height attribute is now supported on HTML cells. - $border parameter was added to Image() and ImageEps() methods. - The method getNumLines() was added to estimate the number of lines required for the specified text. 4.5.010 (2009-01-29) - Bug n. 2546108 "BarCode Y position" was fixed. 4.5.009 (2009-01-26) - Bug n. 2538094 "Empty pdf file created" was fixed. 4.5.008 (2009-01-26) - setPage() method was fixed to correctly restore graphic states. - Source code was cleaned up for performances. 4.5.007 (2009-01-24) - checkPageBreak() and write1DBarcode() methods were fixed. - Source code was cleaned up for performances. - barcodes.php was updated. 4.5.006 (2009-01-23) - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs. 4.5.005 (2009-01-23) - Page closing bug was fixed. 4.5.004 (2009-01-21) - The access of convertHTMLColorToDec() method was changed to public - Fixed bug on UL tag. 4.5.003 (2009-01-19) - Fonts on different folders are now supported. 4.5.002 (2009-01-07) - addTOC() function was improved (see example n. 45). 4.5.001 (2009-01-04) - The signature of startPageGroup() function was changed. - Method Footer() was improved to automatically print page or page-group number (see example n. 23). - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content. - The signature of addTOC() was changed to include the font used for page numbers. 4.5.000 (2009-01-03) - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43). - The method movePageTo() was added to move pages to previous positions (see example n. 44). - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()). - The methods addTOC() was added to print a Table Of Content (see example n. 45). - Imagick class constant was removed for better compatibility with PHP4. - All existing examples were updated and new examples were added. 4.4.009 (2008-12-29) - Examples 1 and 35 were fixed. 4.4.008 (2008-12-28) - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed. 4.4.007 (2008-12-23) - Bug #2459935 "no unit conversion for header line" was fixed. - Example n. 42 for image alpha channel was added. - All examples were updated. 4.4.006 (2008-12-11) - Method setLIsymbol() was changed to reflect latest changes in HTML list handling. 4.4.005 (2008-12-10) - Bug item #2413870 "ordered list override value" was fixed. 4.4.004 (2008-12-10) - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %). - The method intToRoman() was added to convert integer number to Roman representation. - Support fot HTML lists was improved: the CSS property list-style-type is now supported. 4.4.003 (2008-12-09) - Bug item #2412147 "Warning on line 3367" was fixed. - Method setHtmlLinksStyle() was added to set default HTML link colors and font style. - Method addHtmlLink() was changed to use color and style defined on the inline CSS. 4.4.002 (2008-12-09) - Borders on Multicell() were fixed. - Problem of Multicell() on Header function (Bug item #2407579) was fixed. - Problem on graphics tranformations applied to Multicell() was fixed. - Support for ImageMagick was added. - Width calculation for nested tables was fixed. 4.4.001 (2008-12-08) - Some missing core fonts were added on fonts directory. - CID0 fonts rendering was fixed. - HTML support was improved ( and tags are now supported). - Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed. 4.4.000 (2008-12-07) - File attachments are now supported (see example n. 41). - Font functions were optimized to reduce document size. - makefont.php was updated. - Linux binaries were added on /fonts/utils - All fonts were updated. - $autopadding parameter was added to Multicell() to disable automatic padding features. - $maxh parameter was added to Multicell() and Write() to set a maximum height. 4.3.009 (2008-12-05) - Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed. 4.3.008 (2008-12-05) - Bug item #2390566 "rect bug" was fixed. - File path was fixed for font embedded files. - SetFont() method signature was changed to include the font filename. - Some font-related methods were improved. - Methods getFontFamily() and getFontStyle() were added. 4.3.007 (2008-12-03) - PNG alpha channel is now supported (GD library is required). - AddFont() function now support custom font file path on $file parameter. - The default width variable ($dw) is now always defined for any font. - The 'Style' attribute on CID-0 fonts was removed because of protection bug. 4.3.006 (2008-12-01) - A regular expression on getHtmlDomArray() to find HTML tags was fixed. 4.3.005 (2008-11-25) - makefont.php was fixed. - Bug item #2339877 was fixed (false loop condition detected on WriteHTML()). - Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled). - Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()). 4.3.004 (2008-11-19) - Function _textstring() was fixed (bug 2309051). - All examples were updated. 4.3.003 (2008-11-18) - CID-0 font bug was fixed. - Some functions were optimized. - Function getGroupPageNoFormatted() was added. - Example n. 23 was updated. 4.3.002 (2008-11-17) - Bug item #2305518 "CID-0 font don't work with encryption" was fixed. 4.3.001 (2008-11-17) - Bug item #2300007 "download mimetype pdf" was fixed. - Double quotes were replaced by single quotes to improve PHP performances. - A bug relative to HTML cell borders was fixed. 4.3.000 (2008-11-14) - The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page. - A bug relative to list items indentation was fixed. - A bug relative to borders on HTML tables and Multicell was fixed. - A bug relative to rowspanned cells was fixed. - A bug relative to html images across pages was fixed. 4.2.009 (2008-11-13) - Spaces between li tags are now automatically removed. 4.2.008 (2008-11-12) - A bug relative to fill color on next page was fixed. 4.2.007 (2008-11-12) - The function setListIndentWidth() was added to set custom indentation widht for HTML lists. 4.2.006 (2008-11-06) - A bug relative to HTML justification was fixed. 4.2.005 (2008-11-06) - A bug relative to HTML justification was fixed. - The methods formatPageNumber() and PageNoFormatted() were added to format page numbers. - Default Footer() method was changed to use PageNoFormatted() instead of PageNo(). - Example 6 was updated. 4.2.004 (2008-11-04) - Bug item n. 2217039 "filename handling improvement" was fixed. 4.2.003 (2008-10-31) - Font style bug was fixed. 4.2.002 (2008-10-31) - Bug item #2210922 (htm element br not work) was fixed. - Write() function was improved to support margin changes. 4.2.001 (2008-10-30) - setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags. - writeHTML() function now support margin changes during execution. - Signature of addHTMLVertSpace() function is changed. 4.2.000 (2008-10-29) - htmlcolors.php was changed to support class-loaders. - ImageEps() function was improved in performances. - Signature of Link() And Annotation() functions were changed. - (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added). - rowspan mode for HTML table cells was improved and fixed. - Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40. - lastPage() signature is changed. - Signature of Write() function is changed. - Some HTML justification problems were fixed. - Some functions were fixed to better support RTL mode. - Example n. 10 was changed to support RTL mode. - All examples were updated. 4.1.004 (2008-10-23) - unicode_data.php was changed to support class-loaders. - Bug item #2186040/2 (writeHTML margin problem) was fixed. 4.1.003 (2008-10-22) - Bug item #2185399 was fixed (rowspan and page break). - Bugs item #2186040 was fixed (writeHTML margin problem). - Newline after table was removed. 4.1.002 (2008-10-21) - Bug item #2184525 was fixed (rowspan on HTML cell). 4.1.001 (2008-10-21) - Support for "start" attribute was added to HTML ordered list. - unicode_data.php file was changed to include UTF-8 to ASCII table. - Some functions were modified to better support UTF-8 extensions to core fonts. - Support for images on HTML lists was improved. - Examples n. 1 and 6 were updated. 4.1.000 (2008-10-18) - Page-break bug using HTML content was fixed. - The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload. - addHtmlLink() function was improved to support internal links (i.e.: link to page 23). - Justification alignment is now supported on HTML (see example n. 39). - example_006.php was updated. 4.0.033 (2008-10-13) - Bug n. 2157099 was fixed. - SetX() and SetY() functions were improved. - SetY() includes a new parameter to avoid the X reset. 4.0.032 (2008-10-10) - Bug n. 2156926 was fixed (bold, italic, underlined, linethrough). - setStyle() method was removed. - Configuration file was changed to use helvetica (non-unicode) font by default. - The use of mixed font types was improved. - All examples were updated. 4.0.031 (2008-10-09) - _putannots() and _putbookmarks() links alignments were fixed. 4.0.030 (2008-10-07) - _putbookmarks() function was fixed. - _putannots() was fixed to include internal links. 4.0.029 (2008-09-27) - Infinite loop bug was fixed [Bug item #130309]. - Multicell() problem on Header() was fixed. 4.0.028 (2008-09-26) - setLIsymbol() was added to set the LI symbol used on UL lists. - Missing $padding and $encryption_key variables declarations were added [Bug item #2129058]. 4.0.027 (2008-09-19) - Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed. - arailunicid0.php font was updated. - The problem of javascript form fields duplication after saving was fixed. 4.0.026 (2008-09-17) - convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation. - The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large - Example n. 6 was updated. 4.0.025 (2008-09-15) - _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding. - arialunicid0 font was added (see the new example n. 38). - The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php. 4.0.024 (2008-09-12) - "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4. - support for Spot Colors were added. Check the new example n. 37 and the following new functions: AddSpotColor() SetDrawSpotColor() SetFillSpotColor() SetTextSpotColor() _putspotcolors() - Bookmark() function was improved to fix wrong levels. - $lasth changes after header/footer calls were fixed. 4.0.023 (2008-09-05) - Some HTML related problems were fixed. - Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php). 4.0.022 (2008-08-28) - Line height on HTML was fixed. - Image inside an HTML cell problem was fixed. - A new "zarbold" persian font was added. 4.0.021 (2008-08-24) - HTTP headers were fixed on Output function(). - getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents. - Function Write() was fixed. - The problem of additional vertical spaces on HTML was fixed. - The problem of frame around HTML links was fixed. 4.0.020 (2008-08-15) - "[2052259] WriteHTML & " bug was fixed. 4.0.019 (2008-08-13) - "Rowspan on first cell" bug was fixed. 4.0.018 (2008-08-08) - Default cellpadding for HTML tables was fixed. - Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7). - HTML links are now correclty shifted during line alignments. - function getAliasNbPages() was added and Footer() was updated. - RowSpan mode for HTML tables was fixed. - Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed. - ImageEPS() function was improved and RTL alignment was fixed (see example_032.php). 4.0.017 (2008-08-05) - Missing CNZ and CEO style modes were added to Rect() function. - Fonts utils were updated to include support for OpenType fonts. - getLastH() function was added. 4.0.016 (2008-07-30) - setPageMark() function was added. This function must be called after calling Image() function for a background image. 4.0.015 (2008-07-29) - Some functions were changed to support different page formats (see example_028.php). - The signature of setPage() function is changed. 4.0.014 (2008-07-29) - K_PATH_MAIN calculation on tcpdf_config.php was fixed. - HTML support for EPS/AI images was added (see example_006.php). - Bugs item #2030807 "Truncated text on multipage html fields" was fixed. - PDF header bug was fixed. - helvetica was added as default font family. - Stroke mode was fixed on Text function. - several minor bugs were fixed. 4.0.013 (2008-07-27) - Bugs item #2027799 " Big spaces between lines after page break" was fixed. - K_PATH_MAIN calculation on tcpdf_config.php was changed. - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message. 4.0.012 (2008-07-24) - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions. - The following functions were added: setHeader() setFooter() getImageRBX() getImageRBY() getCellHeightRatio() getHeaderFont() getFooterFont() getRTL() getBarcode() getHeaderData() getHeaderMargin() getFooterMargin() 4.0.011 (2008-07-23) - Font support was improved. - The folder /fonts/utils contains new utilities and instructions for embedd font files. - Documentation was updated. 4.0.010 (2008-07-22) - HTML tables were fixed to work across pages. - Header() and Footer() functions were updated to preserve previous settings. - example_035.php was added. 4.0.009 (2008-07-21) - UTF8StringToArray() function was fixed for non-unicode mode. 4.0.008 (2008-07-21) - Barcodes alignment was fixed (see example_027.php). - unicode_data.php was updated. - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed. 4.0.007 (2008-07-18) - str_split was replaced by preg_split for compatibility with PHP4 version. - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php). 4.0.006 (2008-07-16) - HTML rowspan bug was fixed. - Line style for MultiCell() was fixed. - WriteHTML() function was improved. - CODE128C barcode was fixed (barcodes.php). 4.0.005 (2008-07-11) - Bug [2015715] "PHP Error/Warning" was fixed. 4.0.004 (2008-07-09) - HTML cell internal padding was fixed. 4.0.003 (2008-07-08) - Removed URL encoding when F option is selected on Output() function. - fixed some minor bugs in html tables. 4.0.002 (2008-07-07) - Bug [2000861] was still unfixed and has been fixed. 4.0.001 (2008-07-05) - Bug [2000861] was fixed. 4.0.000 (2008-07-03) - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed). - HTML support was completely rewritten and improved (see example 6). - Alignments parameters were fixed. - Functions GetArrStringWidth() and GetStringWidth() now include font parameters. - Fonts support was improved. - All core fonts were replaced and moved to fonts/ directory. - The following functions were added: getMargins(), getFontSize(), getFontSizePt(). - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated. - Multicell and WriteHTMLCell fill function was fixed. - Several minor bugs were fixed. - barcodes.php was updated. - All examples were updated. ------------------------------------------------------------ 3.1.001 (2008-06-13) - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed. - Vera font was removed, DejaVu font and Free fonts were updated. - Image handling was improved. - All examples were updated. 3.1.000 (2008-06-11) - setPDFVersion() was added to change the default PDF version (currently 1.7). - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29). - SetDisplayMode() signature was changed (new options were added). - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30). - PieSector() function was added to render render pie charts (see example 31). - ImageEps() was added to display EPS and AI images with limited support (see example 32). - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added. - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions. - HTML lists were improved and could be nested (you may now represent trees). - AddFont() bug was fixed. - _putfonts() bug was fixed. - graphics functions were fixed. - unicode_data.php file was updated (fixed). - almohanad font was updated. - example 18 was updated (Farsi and Arabic languages). - source code cleanup. - All examples were updated and new examples were added. 3.0.015 (2008-06-06) - AddPage() function signature is changed to include page format. - example 28 was added to show page format changes. - setPageUnit() function was added to change the page units of measure. - setPageFormat() function was added to change the page format and orientation between pages. - setPageOrientation() function was added to change the page orientation. - Arabic font shaping was fixed for laa letter and square boxes (see the example 18). 3.0.014 (2008-06-04) - Arabic font shaping was fixed. - setDefaultTableColumns() function was added. - $cell_height_ratio variable was added. - setCellHeightRatio() function was added to define the default height of cell repect font height. 3.0.013 (2008-06-03) - Multicell height parameter was fixed. - Arabic font shaping was improved. - unicode_data.php was updated. 3.0.012 (2008-05-30) - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file. - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated). - Arabic font shaping was improved. - TranslateY() function was fixed (bug [1977962]). - setVisibility() function was fixed. - writeBarcode() function was fixed to scale using $xref parameter. - All examples were updated. 3.0.011 (2008-05-23) - CMYK color support was added to all graphic functions. - HTML table support was improved: -- now it's possible to include additional html tags inside a cell; -- colspan attribute was added. - example 006 was updated. 3.0.010 (2008-05-21) - fixed $laa_array inclusion on utf8Bidi() function. 3.0.009 (2008-05-20) - unicode_data.php was updated. - Arabic laa letter problem was fixed. 3.0.008 (2008-05-12) - Arabic support was fixed and improved (unicode_data.php was updated). - Polycurve() function was added to draw a poly-Bezier curve. - list items alignment was fixed. - example 6 was updated. 3.0.007 (2008-05-06) - Arabic support was fixed and improved. - AlMohanad (arabic) font was added. - C128 barcode bugs were fixed. 3.0.006 (2008-04-21) - Condition to check negative width values was added. 3.0.005 (2008-04-18) - back-Slash character escape was fixed on writeHTML() function. - Exampe 6 was updated. 3.0.004 (2008-04-11) - Bug [1939304] (Right to Left Issue) was fixed. 3.0.003 (2008-04-07) - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed. - "face" attribute of "font" tag is now fully supported. 3.0.002 (2008-04-01) - Write() functions now return the number of cells and not the number of lines. - TCPDF is released under LGPL 2.1, or any later version. 3.0.001 (2008-05-28) - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng(). - function writeBarcode() was fixed. - all examples were updated. - example 27 was added to show various barcodes. 3.0.000 (2008-03-27) - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug. - Image-related functions were rewritten. - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9). - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM. - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22). - Page Groups were added (see example 23). - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24). - All private variables and functions were changed to protected. - setAlpha() function was added to give transparency support for all objects (see example 25). - Clipping and stroke modes were added to Text() function (see example 26). - All examples were moved to "examples" directory. - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9). 2.9.000 (2008-03-26) - htmlcolors.php file was added to include html colors. - Support for HTML color names and three-digit hexadecimal color codes was added. - private function convertColorHexToDec() was renamed convertHTMLColorToDec(). - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported). - Write() function were fixed. - example_006.php was updated. - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14) 2.8.000 (2008-03-20) - Private variables were changed to protected. - Function Write() was fixed and improved. - Support for dl, dt, dd, del HTML tags was introduced. - Line-trought mode was added for HTML and text. - Text vertical alignment on cells were fixed. - Examples were updated to reflect changes. 2.7.002 (2008-03-13) - Bug "[1912142] Encrypted PDF created/modified date" was fixed. 2.7.001 (2008-03-10) - Cell justification was fixed for non-unicode mode. 2.7.000 (2008-03-09) - Cell() stretching mode 4 (forced character spacing) was fixed. - writeHTMLCell() now uses Multicell() to write. - Multicell() has a new parameter $ishtml to act as writeHTMLCell(). - Write() speed was improved for non-arabic strings. - Example n. 20 was changed. 2.6.000 (2008-03-07) - various alignments bugs were fixed. 2.5.000 (2008-03-07) - Several bugs were fixed. - example_019.php was added to test non-unicode mode using old fonts. 2.4.000 (2008-03-06) - RTL support was deeply improved. - GetStringWidth() was fixed to support RTL languages. - Text() RTL alignment was fixed. - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi(). - example_018.php was added and test_unicode.php was removed. 2.3.000 (2008-03-05) - MultiCell() signature is changed. Now support multiple columns across pages (see example_017). - Write() signature is changed. Now support the cell mode to be used with MultiCell. - Header() and Footer() were changed. - The following functions were added: UTF8ArrSubString() and unichr(). - Examples were updated to reflect last changes. 2.2.004 (2008-03-04) - Several examples were added. - AddPage() Header() and Footer() were fixed. - Documentation is now available on http://www.tcpdf.org 2.2.003 (2008-03-03) - [1894853] Performance of MultiCell() was improved. - RadioButton and ListBox functions were added. - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf. 2.2.002 (2008-02-28) - [1900495] html images path was fixed. - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library. 2.2.001 (2008-02-16) - The bug "[1894700] bug with replace relative path" was fixed - Justification was fixed 2.2.000 (2008-02-12) - fixed javascript bug introduced with latest release 2.1.002 (2008-02-12) - Justify function was fixed on PHP4 version. - Bookmank function was added ([1578250] Table of contents). - Javascript and Form fields support was added ([1796359] Form fields). 2.1.001 (2008-02-10) - The bug "[1885776] Race Condition in function justitfy" was fixed. - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed. 2.1.000 (2008-01-07) - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file - Bidirectional Algorithm to correctly reverse bidirectional languages was added. - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed. - SetCellPadding function was added. - writeHTML was updated with new parameters. - Text function was fixed. - MultiCell function was fixed, now works also across multiple pages. - Line width was fixed on Header and Footer functions and tag. - "GetImageSize" was renamed "getimagesize". - Document version was changed from 1.3 to 1.5. - _begindoc() function was fixed. - ChangeDate was fixed and ModDate was added. - The following functions were added: setPage() : Move pointer to the specified document page. getPage() : Get current document page number. lastpage() : Reset pointer to the last document page. getNumPages() : Get the total number of inserted pages. GetNumChars() : count the number of (UTF-8) characters in a string. - $stretch parameter was added to Cell() function to fit text on cell: 0 = disabled 1 = horizontal scaling only if necessary 2 = forced horizontal scaling 3 = character spacing only if necessary 4 = forced character spacing - Line function was fixed for RTL. - Graphic transformation functions were added [1811158]: StartTransform() StopTransform() ScaleX() ScaleY() ScaleXY() Scale() MirrorH() MirrorV() MirrorP() MirrorL() TranslateX() TranslateY() Translate() Rotate() SkewX() SkewY() Skew() - Graphic function were added/updated [1688549]: SetLineStyle() _outPoint() _outLine() _outRect() _outCurve() Line() Rect() Curve Ellipse Circle Polygon RegularPolygon 2.0.000 (2008-01-04) - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files. - setRTL($enable) method was added to manually enable/disable the RTL text direction. - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left. - RC4 40bit encryption was added. Check the SetProtection method. - [1815213] Improved image support for GIF, JPEG, PNG formats. - [1800094] Attribute "value" was added to ordered list items . - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be: T: top-right for LTR or top-left for RTL M: middle-right for LTR or middle-left for RTL B: bottom-right for LTR or bottom-left for RTL N: next line - Attribute "align" was added to html tag to set the above image "align" parameter. Possible values are: top: top-right for LTR or top-left for RTL middle: middle-right for LTR or middle-left for RTL bottom: bottom-right for LTR or bottom-left for RTL - [1798103] newline was added after ,
]*)>[\n\r\t]+/', '<\\1\\2>', $html); $html = preg_replace('@(\r\n|\r)@', "\n", $html); $repTable = array("\t" => ' ', "\0" => ' ', "\x0B" => ' ', "\\" => "\\\\"); $html = strtr($html, $repTable); $offset = 0; while (($offset < strlen($html)) AND ($pos = strpos($html, '
tag $html_b = preg_replace("']*)>(.*?)\n(.*?)
tag was fixed. 4.6.013 (2009-05-28) - List bullets position was fixed for RTL languages. 4.6.012 (2009-05-23) - setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key! 4.6.011 (2009-05-18) - Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation). 4.6.010 (2009-05-17) - Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null. - tag indent problem was fixed. - $y parameter was added to checkPageBreak() method. - Bug n. 2791773 "writeHTML" was fixed. 4.6.009 (2009-05-13) - xref table for embedded files was fixed. 4.6.008 (2009-05-07) - setSignature() method was improved (but is still experimental). - Example n. 52 was added. 4.6.007 (2009-05-05) - Bug #2786685 "writeHtmlCell and in custom footer" was fixed. - Table header repeating bug was fixed. - Some newlines and tabs are now automatically removed from HTML strings. 4.6.006 (2009-04-28) - Support for "..." was added. - By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces). 4.6.005 (2009-04-25) - Points (pt) conversion in getHTMLUnitToUnits() was fixed. - Default tcpdf.pem certificate file was added. - Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation). 4.6.004 (2009-04-23) - Method deletePage() was added to delete pages (see example n. 44). 4.6.003 (2009-04-21) - The caching mechanism of the UTF8StringToArray() method was fixed. 4.6.002 (2009-04-20) - Documentation of rollbackTransaction() method was fixed. - The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method. - HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()). - WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1. 4.6.001 (2009-04-17) - Spaces between HTML block tags are now automatically removed. - The bug related to cMargin changes between tables was fixed. 4.6.000 (2009-04-16) - WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods: zero coordinates for $x and $y are now valid coordinates; set $x and $y as empty strings to get the current value. - Some error caused by 'empty' funtion were fixed. - Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false. - HTML on footer bug was fixed. - The following examples were fixed: 5,7,10,17,19,20,21,33,42,43. 4.5.043 (2009-04-15) - Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27): C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9 C39+ : CODE 39 with checksum C39E : CODE 39 EXTENDED C39E+ : CODE 39 EXTENDED + CHECKSUM C93 : CODE 93 - USS-93 S25 : Standard 2 of 5 S25+ : Standard 2 of 5 + CHECKSUM I25 : Interleaved 2 of 5 I25+ : Interleaved 2 of 5 + CHECKSUM C128A : CODE 128 A C128B : CODE 128 B C128C : CODE 128 C EAN2 : 2-Digits UPC-Based Extention EAN5 : 5-Digits UPC-Based Extention EAN8 : EAN 8 EAN13 : EAN 13 UPCA : UPC-A UPCE : UPC-E MSI : MSI (Variation of Plessey code) MSI+ : MSI + CHECKSUM (modulo 11) POSTNET : POSTNET PLANET : PLANET RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) KIX : KIX (Klant index - Customer index) IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension) CODABAR : CODABAR CODE11 : CODE 11 PHARMA : PHARMACODE PHARMA2T : PHARMACODE TWO-TRACKS 4.5.042 (2009-04-15) - Method Write() was fixed for the strings containing only zero value. 4.5.041 (2009-04-14) - Barcode methods were fixed. 4.5.040 (2009-04-14) - Method Write() was fixed to handle empty strings. 4.5.039 (2009-04-11) - Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation). 4.5.038 (2009-04-10) - Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified. 4.5.037 (2009-04-09) - General performances were improved. - The signature of the method utf8Bidi() was changed. - The method UniArrSubString() was added. - Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class). 4.5.036 (2009-04-03) - TCPDF methods can be called inside the HTML code (see example n. 49). - All tag attributes, such as must be enclosed within double quotes. 4.5.035 (2009-03-28) - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed. - Bug #2719090 "writeHTML fix follow up" was fixed. - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader. 4.5.034 (2009-03-27) - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed. - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed. - The signature of the Cell() method was changed. 4.5.033 (2009-03-27) - The support for rowspan/colspan on HTML tables was improved (see example n. 48). 4.5.032 (2009-03-23) - setPrintFooter(false) bug was fixed. 4.5.031 (2009-03-20) - Table header support was extended to multiple pages. 4.5.030 (2009-03-20) - thead tag is now supported on HTML tables (header rows are repeated after page breaks). - The startTransaction() was improved to autocommit. - List bullets now uses the foreground color (putHtmlListBullet()). 4.5.029 (2009-03-19) - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction(). - All examples were updated. 4.5.028 (2009-03-18) - Bug #2690945 "List Bugs" was fixed. - HTML text alignment on lists was fixed. - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font. - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin(). - All examples were updated. 4.5.027 (2009-03-16) - Method getPageDimensions() was added to get page dimensions. - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin(). - _parsepng() method was fixed for PNG URL images (fread bug). 4.5.026 (2009-03-11) - Bug #2681793 affecting URL images with spaces was fixed. 4.5.025 (2009-03-10) - A small bug affecting hyphenation support was fixed. - The method SetDefaultMonospacedFont() was added to define the default monospaced font. 4.5.024 (2009-03-07) - The bug #2666493 was fixed "Footer corrupts document". 4.5.023 (2009-03-06) - The bug #2666688 was fixed "Rowspan in tables". 4.5.022 (2009-03-05) - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed". - addTOC() function bug was fixed. 4.5.020 (2009-03-03) - The following bug was fixed: "function removeSHY corrupts unicode". 4.5.019 (2009-02-28) - The problem of decimal separator using different locale was fixed. - The text hyphenation is now supported (see example n. 46). 4.5.018 (2009-02-26) - The _destroy() method was added to unset all class variables and frees memory. - Now it's possible to call Output() method multiple times. 4.5.017 (2009-02-24) - A minor bug that raises a PHP warning was fixed. 4.5.016 (2009-02-24) - Bug item #2631200 "getNumLines() counts wrong" was fixed. - Multiple attachments bug was fixed. - All class variables are now cleared on Output() for memory otpimization. 4.5.015 (2009-02-18) - Bug item #2612553 "function Write() must not break a line on character" was fixed. 4.5.014 (2009-02-13) - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php). - Pagebreak bug for barcode was fixed. 4.5.013 (2009-02-12) - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()). 4.5.012 (2009-02-12) - An error on image border feature was fixed. 4.5.011 (2009-02-12) - HTML links for images are now supported. - height attribute is now supported on HTML cells. - $border parameter was added to Image() and ImageEps() methods. - The method getNumLines() was added to estimate the number of lines required for the specified text. 4.5.010 (2009-01-29) - Bug n. 2546108 "BarCode Y position" was fixed. 4.5.009 (2009-01-26) - Bug n. 2538094 "Empty pdf file created" was fixed. 4.5.008 (2009-01-26) - setPage() method was fixed to correctly restore graphic states. - Source code was cleaned up for performances. 4.5.007 (2009-01-24) - checkPageBreak() and write1DBarcode() methods were fixed. - Source code was cleaned up for performances. - barcodes.php was updated. 4.5.006 (2009-01-23) - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs. 4.5.005 (2009-01-23) - Page closing bug was fixed. 4.5.004 (2009-01-21) - The access of convertHTMLColorToDec() method was changed to public - Fixed bug on UL tag. 4.5.003 (2009-01-19) - Fonts on different folders are now supported. 4.5.002 (2009-01-07) - addTOC() function was improved (see example n. 45). 4.5.001 (2009-01-04) - The signature of startPageGroup() function was changed. - Method Footer() was improved to automatically print page or page-group number (see example n. 23). - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content. - The signature of addTOC() was changed to include the font used for page numbers. 4.5.000 (2009-01-03) - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43). - The method movePageTo() was added to move pages to previous positions (see example n. 44). - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()). - The methods addTOC() was added to print a Table Of Content (see example n. 45). - Imagick class constant was removed for better compatibility with PHP4. - All existing examples were updated and new examples were added. 4.4.009 (2008-12-29) - Examples 1 and 35 were fixed. 4.4.008 (2008-12-28) - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed. 4.4.007 (2008-12-23) - Bug #2459935 "no unit conversion for header line" was fixed. - Example n. 42 for image alpha channel was added. - All examples were updated. 4.4.006 (2008-12-11) - Method setLIsymbol() was changed to reflect latest changes in HTML list handling. 4.4.005 (2008-12-10) - Bug item #2413870 "ordered list override value" was fixed. 4.4.004 (2008-12-10) - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %). - The method intToRoman() was added to convert integer number to Roman representation. - Support fot HTML lists was improved: the CSS property list-style-type is now supported. 4.4.003 (2008-12-09) - Bug item #2412147 "Warning on line 3367" was fixed. - Method setHtmlLinksStyle() was added to set default HTML link colors and font style. - Method addHtmlLink() was changed to use color and style defined on the inline CSS. 4.4.002 (2008-12-09) - Borders on Multicell() were fixed. - Problem of Multicell() on Header function (Bug item #2407579) was fixed. - Problem on graphics tranformations applied to Multicell() was fixed. - Support for ImageMagick was added. - Width calculation for nested tables was fixed. 4.4.001 (2008-12-08) - Some missing core fonts were added on fonts directory. - CID0 fonts rendering was fixed. - HTML support was improved ( and tags are now supported). - Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed. 4.4.000 (2008-12-07) - File attachments are now supported (see example n. 41). - Font functions were optimized to reduce document size. - makefont.php was updated. - Linux binaries were added on /fonts/utils - All fonts were updated. - $autopadding parameter was added to Multicell() to disable automatic padding features. - $maxh parameter was added to Multicell() and Write() to set a maximum height. 4.3.009 (2008-12-05) - Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed. 4.3.008 (2008-12-05) - Bug item #2390566 "rect bug" was fixed. - File path was fixed for font embedded files. - SetFont() method signature was changed to include the font filename. - Some font-related methods were improved. - Methods getFontFamily() and getFontStyle() were added. 4.3.007 (2008-12-03) - PNG alpha channel is now supported (GD library is required). - AddFont() function now support custom font file path on $file parameter. - The default width variable ($dw) is now always defined for any font. - The 'Style' attribute on CID-0 fonts was removed because of protection bug. 4.3.006 (2008-12-01) - A regular expression on getHtmlDomArray() to find HTML tags was fixed. 4.3.005 (2008-11-25) - makefont.php was fixed. - Bug item #2339877 was fixed (false loop condition detected on WriteHTML()). - Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled). - Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()). 4.3.004 (2008-11-19) - Function _textstring() was fixed (bug 2309051). - All examples were updated. 4.3.003 (2008-11-18) - CID-0 font bug was fixed. - Some functions were optimized. - Function getGroupPageNoFormatted() was added. - Example n. 23 was updated. 4.3.002 (2008-11-17) - Bug item #2305518 "CID-0 font don't work with encryption" was fixed. 4.3.001 (2008-11-17) - Bug item #2300007 "download mimetype pdf" was fixed. - Double quotes were replaced by single quotes to improve PHP performances. - A bug relative to HTML cell borders was fixed. 4.3.000 (2008-11-14) - The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page. - A bug relative to list items indentation was fixed. - A bug relative to borders on HTML tables and Multicell was fixed. - A bug relative to rowspanned cells was fixed. - A bug relative to html images across pages was fixed. 4.2.009 (2008-11-13) - Spaces between li tags are now automatically removed. 4.2.008 (2008-11-12) - A bug relative to fill color on next page was fixed. 4.2.007 (2008-11-12) - The function setListIndentWidth() was added to set custom indentation widht for HTML lists. 4.2.006 (2008-11-06) - A bug relative to HTML justification was fixed. 4.2.005 (2008-11-06) - A bug relative to HTML justification was fixed. - The methods formatPageNumber() and PageNoFormatted() were added to format page numbers. - Default Footer() method was changed to use PageNoFormatted() instead of PageNo(). - Example 6 was updated. 4.2.004 (2008-11-04) - Bug item n. 2217039 "filename handling improvement" was fixed. 4.2.003 (2008-10-31) - Font style bug was fixed. 4.2.002 (2008-10-31) - Bug item #2210922 (htm element br not work) was fixed. - Write() function was improved to support margin changes. 4.2.001 (2008-10-30) - setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags. - writeHTML() function now support margin changes during execution. - Signature of addHTMLVertSpace() function is changed. 4.2.000 (2008-10-29) - htmlcolors.php was changed to support class-loaders. - ImageEps() function was improved in performances. - Signature of Link() And Annotation() functions were changed. - (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added). - rowspan mode for HTML table cells was improved and fixed. - Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40. - lastPage() signature is changed. - Signature of Write() function is changed. - Some HTML justification problems were fixed. - Some functions were fixed to better support RTL mode. - Example n. 10 was changed to support RTL mode. - All examples were updated. 4.1.004 (2008-10-23) - unicode_data.php was changed to support class-loaders. - Bug item #2186040/2 (writeHTML margin problem) was fixed. 4.1.003 (2008-10-22) - Bug item #2185399 was fixed (rowspan and page break). - Bugs item #2186040 was fixed (writeHTML margin problem). - Newline after table was removed. 4.1.002 (2008-10-21) - Bug item #2184525 was fixed (rowspan on HTML cell). 4.1.001 (2008-10-21) - Support for "start" attribute was added to HTML ordered list. - unicode_data.php file was changed to include UTF-8 to ASCII table. - Some functions were modified to better support UTF-8 extensions to core fonts. - Support for images on HTML lists was improved. - Examples n. 1 and 6 were updated. 4.1.000 (2008-10-18) - Page-break bug using HTML content was fixed. - The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload. - addHtmlLink() function was improved to support internal links (i.e.: link to page 23). - Justification alignment is now supported on HTML (see example n. 39). - example_006.php was updated. 4.0.033 (2008-10-13) - Bug n. 2157099 was fixed. - SetX() and SetY() functions were improved. - SetY() includes a new parameter to avoid the X reset. 4.0.032 (2008-10-10) - Bug n. 2156926 was fixed (bold, italic, underlined, linethrough). - setStyle() method was removed. - Configuration file was changed to use helvetica (non-unicode) font by default. - The use of mixed font types was improved. - All examples were updated. 4.0.031 (2008-10-09) - _putannots() and _putbookmarks() links alignments were fixed. 4.0.030 (2008-10-07) - _putbookmarks() function was fixed. - _putannots() was fixed to include internal links. 4.0.029 (2008-09-27) - Infinite loop bug was fixed [Bug item #130309]. - Multicell() problem on Header() was fixed. 4.0.028 (2008-09-26) - setLIsymbol() was added to set the LI symbol used on UL lists. - Missing $padding and $encryption_key variables declarations were added [Bug item #2129058]. 4.0.027 (2008-09-19) - Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed. - arailunicid0.php font was updated. - The problem of javascript form fields duplication after saving was fixed. 4.0.026 (2008-09-17) - convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation. - The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large - Example n. 6 was updated. 4.0.025 (2008-09-15) - _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding. - arialunicid0 font was added (see the new example n. 38). - The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php. 4.0.024 (2008-09-12) - "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4. - support for Spot Colors were added. Check the new example n. 37 and the following new functions: AddSpotColor() SetDrawSpotColor() SetFillSpotColor() SetTextSpotColor() _putspotcolors() - Bookmark() function was improved to fix wrong levels. - $lasth changes after header/footer calls were fixed. 4.0.023 (2008-09-05) - Some HTML related problems were fixed. - Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php). 4.0.022 (2008-08-28) - Line height on HTML was fixed. - Image inside an HTML cell problem was fixed. - A new "zarbold" persian font was added. 4.0.021 (2008-08-24) - HTTP headers were fixed on Output function(). - getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents. - Function Write() was fixed. - The problem of additional vertical spaces on HTML was fixed. - The problem of frame around HTML links was fixed. 4.0.020 (2008-08-15) - "[2052259] WriteHTML & " bug was fixed. 4.0.019 (2008-08-13) - "Rowspan on first cell" bug was fixed. 4.0.018 (2008-08-08) - Default cellpadding for HTML tables was fixed. - Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7). - HTML links are now correclty shifted during line alignments. - function getAliasNbPages() was added and Footer() was updated. - RowSpan mode for HTML tables was fixed. - Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed. - ImageEPS() function was improved and RTL alignment was fixed (see example_032.php). 4.0.017 (2008-08-05) - Missing CNZ and CEO style modes were added to Rect() function. - Fonts utils were updated to include support for OpenType fonts. - getLastH() function was added. 4.0.016 (2008-07-30) - setPageMark() function was added. This function must be called after calling Image() function for a background image. 4.0.015 (2008-07-29) - Some functions were changed to support different page formats (see example_028.php). - The signature of setPage() function is changed. 4.0.014 (2008-07-29) - K_PATH_MAIN calculation on tcpdf_config.php was fixed. - HTML support for EPS/AI images was added (see example_006.php). - Bugs item #2030807 "Truncated text on multipage html fields" was fixed. - PDF header bug was fixed. - helvetica was added as default font family. - Stroke mode was fixed on Text function. - several minor bugs were fixed. 4.0.013 (2008-07-27) - Bugs item #2027799 " Big spaces between lines after page break" was fixed. - K_PATH_MAIN calculation on tcpdf_config.php was changed. - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message. 4.0.012 (2008-07-24) - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions. - The following functions were added: setHeader() setFooter() getImageRBX() getImageRBY() getCellHeightRatio() getHeaderFont() getFooterFont() getRTL() getBarcode() getHeaderData() getHeaderMargin() getFooterMargin() 4.0.011 (2008-07-23) - Font support was improved. - The folder /fonts/utils contains new utilities and instructions for embedd font files. - Documentation was updated. 4.0.010 (2008-07-22) - HTML tables were fixed to work across pages. - Header() and Footer() functions were updated to preserve previous settings. - example_035.php was added. 4.0.009 (2008-07-21) - UTF8StringToArray() function was fixed for non-unicode mode. 4.0.008 (2008-07-21) - Barcodes alignment was fixed (see example_027.php). - unicode_data.php was updated. - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed. 4.0.007 (2008-07-18) - str_split was replaced by preg_split for compatibility with PHP4 version. - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php). 4.0.006 (2008-07-16) - HTML rowspan bug was fixed. - Line style for MultiCell() was fixed. - WriteHTML() function was improved. - CODE128C barcode was fixed (barcodes.php). 4.0.005 (2008-07-11) - Bug [2015715] "PHP Error/Warning" was fixed. 4.0.004 (2008-07-09) - HTML cell internal padding was fixed. 4.0.003 (2008-07-08) - Removed URL encoding when F option is selected on Output() function. - fixed some minor bugs in html tables. 4.0.002 (2008-07-07) - Bug [2000861] was still unfixed and has been fixed. 4.0.001 (2008-07-05) - Bug [2000861] was fixed. 4.0.000 (2008-07-03) - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed). - HTML support was completely rewritten and improved (see example 6). - Alignments parameters were fixed. - Functions GetArrStringWidth() and GetStringWidth() now include font parameters. - Fonts support was improved. - All core fonts were replaced and moved to fonts/ directory. - The following functions were added: getMargins(), getFontSize(), getFontSizePt(). - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated. - Multicell and WriteHTMLCell fill function was fixed. - Several minor bugs were fixed. - barcodes.php was updated. - All examples were updated. ------------------------------------------------------------ 3.1.001 (2008-06-13) - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed. - Vera font was removed, DejaVu font and Free fonts were updated. - Image handling was improved. - All examples were updated. 3.1.000 (2008-06-11) - setPDFVersion() was added to change the default PDF version (currently 1.7). - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29). - SetDisplayMode() signature was changed (new options were added). - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30). - PieSector() function was added to render render pie charts (see example 31). - ImageEps() was added to display EPS and AI images with limited support (see example 32). - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added. - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions. - HTML lists were improved and could be nested (you may now represent trees). - AddFont() bug was fixed. - _putfonts() bug was fixed. - graphics functions were fixed. - unicode_data.php file was updated (fixed). - almohanad font was updated. - example 18 was updated (Farsi and Arabic languages). - source code cleanup. - All examples were updated and new examples were added. 3.0.015 (2008-06-06) - AddPage() function signature is changed to include page format. - example 28 was added to show page format changes. - setPageUnit() function was added to change the page units of measure. - setPageFormat() function was added to change the page format and orientation between pages. - setPageOrientation() function was added to change the page orientation. - Arabic font shaping was fixed for laa letter and square boxes (see the example 18). 3.0.014 (2008-06-04) - Arabic font shaping was fixed. - setDefaultTableColumns() function was added. - $cell_height_ratio variable was added. - setCellHeightRatio() function was added to define the default height of cell repect font height. 3.0.013 (2008-06-03) - Multicell height parameter was fixed. - Arabic font shaping was improved. - unicode_data.php was updated. 3.0.012 (2008-05-30) - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file. - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated). - Arabic font shaping was improved. - TranslateY() function was fixed (bug [1977962]). - setVisibility() function was fixed. - writeBarcode() function was fixed to scale using $xref parameter. - All examples were updated. 3.0.011 (2008-05-23) - CMYK color support was added to all graphic functions. - HTML table support was improved: -- now it's possible to include additional html tags inside a cell; -- colspan attribute was added. - example 006 was updated. 3.0.010 (2008-05-21) - fixed $laa_array inclusion on utf8Bidi() function. 3.0.009 (2008-05-20) - unicode_data.php was updated. - Arabic laa letter problem was fixed. 3.0.008 (2008-05-12) - Arabic support was fixed and improved (unicode_data.php was updated). - Polycurve() function was added to draw a poly-Bezier curve. - list items alignment was fixed. - example 6 was updated. 3.0.007 (2008-05-06) - Arabic support was fixed and improved. - AlMohanad (arabic) font was added. - C128 barcode bugs were fixed. 3.0.006 (2008-04-21) - Condition to check negative width values was added. 3.0.005 (2008-04-18) - back-Slash character escape was fixed on writeHTML() function. - Exampe 6 was updated. 3.0.004 (2008-04-11) - Bug [1939304] (Right to Left Issue) was fixed. 3.0.003 (2008-04-07) - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed. - "face" attribute of "font" tag is now fully supported. 3.0.002 (2008-04-01) - Write() functions now return the number of cells and not the number of lines. - TCPDF is released under LGPL 2.1, or any later version. 3.0.001 (2008-05-28) - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng(). - function writeBarcode() was fixed. - all examples were updated. - example 27 was added to show various barcodes. 3.0.000 (2008-03-27) - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug. - Image-related functions were rewritten. - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9). - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM. - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22). - Page Groups were added (see example 23). - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24). - All private variables and functions were changed to protected. - setAlpha() function was added to give transparency support for all objects (see example 25). - Clipping and stroke modes were added to Text() function (see example 26). - All examples were moved to "examples" directory. - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9). 2.9.000 (2008-03-26) - htmlcolors.php file was added to include html colors. - Support for HTML color names and three-digit hexadecimal color codes was added. - private function convertColorHexToDec() was renamed convertHTMLColorToDec(). - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported). - Write() function were fixed. - example_006.php was updated. - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14) 2.8.000 (2008-03-20) - Private variables were changed to protected. - Function Write() was fixed and improved. - Support for dl, dt, dd, del HTML tags was introduced. - Line-trought mode was added for HTML and text. - Text vertical alignment on cells were fixed. - Examples were updated to reflect changes. 2.7.002 (2008-03-13) - Bug "[1912142] Encrypted PDF created/modified date" was fixed. 2.7.001 (2008-03-10) - Cell justification was fixed for non-unicode mode. 2.7.000 (2008-03-09) - Cell() stretching mode 4 (forced character spacing) was fixed. - writeHTMLCell() now uses Multicell() to write. - Multicell() has a new parameter $ishtml to act as writeHTMLCell(). - Write() speed was improved for non-arabic strings. - Example n. 20 was changed. 2.6.000 (2008-03-07) - various alignments bugs were fixed. 2.5.000 (2008-03-07) - Several bugs were fixed. - example_019.php was added to test non-unicode mode using old fonts. 2.4.000 (2008-03-06) - RTL support was deeply improved. - GetStringWidth() was fixed to support RTL languages. - Text() RTL alignment was fixed. - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi(). - example_018.php was added and test_unicode.php was removed. 2.3.000 (2008-03-05) - MultiCell() signature is changed. Now support multiple columns across pages (see example_017). - Write() signature is changed. Now support the cell mode to be used with MultiCell. - Header() and Footer() were changed. - The following functions were added: UTF8ArrSubString() and unichr(). - Examples were updated to reflect last changes. 2.2.004 (2008-03-04) - Several examples were added. - AddPage() Header() and Footer() were fixed. - Documentation is now available on http://www.tcpdf.org 2.2.003 (2008-03-03) - [1894853] Performance of MultiCell() was improved. - RadioButton and ListBox functions were added. - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf. 2.2.002 (2008-02-28) - [1900495] html images path was fixed. - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library. 2.2.001 (2008-02-16) - The bug "[1894700] bug with replace relative path" was fixed - Justification was fixed 2.2.000 (2008-02-12) - fixed javascript bug introduced with latest release 2.1.002 (2008-02-12) - Justify function was fixed on PHP4 version. - Bookmank function was added ([1578250] Table of contents). - Javascript and Form fields support was added ([1796359] Form fields). 2.1.001 (2008-02-10) - The bug "[1885776] Race Condition in function justitfy" was fixed. - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed. 2.1.000 (2008-01-07) - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file - Bidirectional Algorithm to correctly reverse bidirectional languages was added. - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed. - SetCellPadding function was added. - writeHTML was updated with new parameters. - Text function was fixed. - MultiCell function was fixed, now works also across multiple pages. - Line width was fixed on Header and Footer functions and tag. - "GetImageSize" was renamed "getimagesize". - Document version was changed from 1.3 to 1.5. - _begindoc() function was fixed. - ChangeDate was fixed and ModDate was added. - The following functions were added: setPage() : Move pointer to the specified document page. getPage() : Get current document page number. lastpage() : Reset pointer to the last document page. getNumPages() : Get the total number of inserted pages. GetNumChars() : count the number of (UTF-8) characters in a string. - $stretch parameter was added to Cell() function to fit text on cell: 0 = disabled 1 = horizontal scaling only if necessary 2 = forced horizontal scaling 3 = character spacing only if necessary 4 = forced character spacing - Line function was fixed for RTL. - Graphic transformation functions were added [1811158]: StartTransform() StopTransform() ScaleX() ScaleY() ScaleXY() Scale() MirrorH() MirrorV() MirrorP() MirrorL() TranslateX() TranslateY() Translate() Rotate() SkewX() SkewY() Skew() - Graphic function were added/updated [1688549]: SetLineStyle() _outPoint() _outLine() _outRect() _outCurve() Line() Rect() Curve Ellipse Circle Polygon RegularPolygon 2.0.000 (2008-01-04) - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files. - setRTL($enable) method was added to manually enable/disable the RTL text direction. - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left. - RC4 40bit encryption was added. Check the SetProtection method. - [1815213] Improved image support for GIF, JPEG, PNG formats. - [1800094] Attribute "value" was added to ordered list items . - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be: T: top-right for LTR or top-left for RTL M: middle-right for LTR or middle-left for RTL B: bottom-right for LTR or bottom-left for RTL N: next line - Attribute "align" was added to html tag to set the above image "align" parameter. Possible values are: top: top-right for LTR or top-left for RTL middle: middle-right for LTR or middle-left for RTL bottom: bottom-right for LTR or bottom-left for RTL - [1798103] newline was added after ,
must be enclosed within double quotes. 4.5.035 (2009-03-28) - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed. - Bug #2719090 "writeHTML fix follow up" was fixed. - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader. 4.5.034 (2009-03-27) - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed. - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed. - The signature of the Cell() method was changed. 4.5.033 (2009-03-27) - The support for rowspan/colspan on HTML tables was improved (see example n. 48). 4.5.032 (2009-03-23) - setPrintFooter(false) bug was fixed. 4.5.031 (2009-03-20) - Table header support was extended to multiple pages. 4.5.030 (2009-03-20) - thead tag is now supported on HTML tables (header rows are repeated after page breaks). - The startTransaction() was improved to autocommit. - List bullets now uses the foreground color (putHtmlListBullet()). 4.5.029 (2009-03-19) - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction(). - All examples were updated. 4.5.028 (2009-03-18) - Bug #2690945 "List Bugs" was fixed. - HTML text alignment on lists was fixed. - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font. - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin(). - All examples were updated. 4.5.027 (2009-03-16) - Method getPageDimensions() was added to get page dimensions. - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin(). - _parsepng() method was fixed for PNG URL images (fread bug). 4.5.026 (2009-03-11) - Bug #2681793 affecting URL images with spaces was fixed. 4.5.025 (2009-03-10) - A small bug affecting hyphenation support was fixed. - The method SetDefaultMonospacedFont() was added to define the default monospaced font. 4.5.024 (2009-03-07) - The bug #2666493 was fixed "Footer corrupts document". 4.5.023 (2009-03-06) - The bug #2666688 was fixed "Rowspan in tables". 4.5.022 (2009-03-05) - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed". - addTOC() function bug was fixed. 4.5.020 (2009-03-03) - The following bug was fixed: "function removeSHY corrupts unicode". 4.5.019 (2009-02-28) - The problem of decimal separator using different locale was fixed. - The text hyphenation is now supported (see example n. 46). 4.5.018 (2009-02-26) - The _destroy() method was added to unset all class variables and frees memory. - Now it's possible to call Output() method multiple times. 4.5.017 (2009-02-24) - A minor bug that raises a PHP warning was fixed. 4.5.016 (2009-02-24) - Bug item #2631200 "getNumLines() counts wrong" was fixed. - Multiple attachments bug was fixed. - All class variables are now cleared on Output() for memory otpimization. 4.5.015 (2009-02-18) - Bug item #2612553 "function Write() must not break a line on character" was fixed. 4.5.014 (2009-02-13) - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php). - Pagebreak bug for barcode was fixed. 4.5.013 (2009-02-12) - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()). 4.5.012 (2009-02-12) - An error on image border feature was fixed. 4.5.011 (2009-02-12) - HTML links for images are now supported. - height attribute is now supported on HTML cells. - $border parameter was added to Image() and ImageEps() methods. - The method getNumLines() was added to estimate the number of lines required for the specified text. 4.5.010 (2009-01-29) - Bug n. 2546108 "BarCode Y position" was fixed. 4.5.009 (2009-01-26) - Bug n. 2538094 "Empty pdf file created" was fixed. 4.5.008 (2009-01-26) - setPage() method was fixed to correctly restore graphic states. - Source code was cleaned up for performances. 4.5.007 (2009-01-24) - checkPageBreak() and write1DBarcode() methods were fixed. - Source code was cleaned up for performances. - barcodes.php was updated. 4.5.006 (2009-01-23) - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs. 4.5.005 (2009-01-23) - Page closing bug was fixed. 4.5.004 (2009-01-21) - The access of convertHTMLColorToDec() method was changed to public - Fixed bug on UL tag. 4.5.003 (2009-01-19) - Fonts on different folders are now supported. 4.5.002 (2009-01-07) - addTOC() function was improved (see example n. 45). 4.5.001 (2009-01-04) - The signature of startPageGroup() function was changed. - Method Footer() was improved to automatically print page or page-group number (see example n. 23). - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content. - The signature of addTOC() was changed to include the font used for page numbers. 4.5.000 (2009-01-03) - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43). - The method movePageTo() was added to move pages to previous positions (see example n. 44). - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()). - The methods addTOC() was added to print a Table Of Content (see example n. 45). - Imagick class constant was removed for better compatibility with PHP4. - All existing examples were updated and new examples were added. 4.4.009 (2008-12-29) - Examples 1 and 35 were fixed. 4.4.008 (2008-12-28) - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed. 4.4.007 (2008-12-23) - Bug #2459935 "no unit conversion for header line" was fixed. - Example n. 42 for image alpha channel was added. - All examples were updated. 4.4.006 (2008-12-11) - Method setLIsymbol() was changed to reflect latest changes in HTML list handling. 4.4.005 (2008-12-10) - Bug item #2413870 "ordered list override value" was fixed. 4.4.004 (2008-12-10) - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %). - The method intToRoman() was added to convert integer number to Roman representation. - Support fot HTML lists was improved: the CSS property list-style-type is now supported. 4.4.003 (2008-12-09) - Bug item #2412147 "Warning on line 3367" was fixed. - Method setHtmlLinksStyle() was added to set default HTML link colors and font style. - Method addHtmlLink() was changed to use color and style defined on the inline CSS. 4.4.002 (2008-12-09) - Borders on Multicell() were fixed. - Problem of Multicell() on Header function (Bug item #2407579) was fixed. - Problem on graphics tranformations applied to Multicell() was fixed. - Support for ImageMagick was added. - Width calculation for nested tables was fixed. 4.4.001 (2008-12-08) - Some missing core fonts were added on fonts directory. - CID0 fonts rendering was fixed. - HTML support was improved (
and tags are now supported). - Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed. 4.4.000 (2008-12-07) - File attachments are now supported (see example n. 41). - Font functions were optimized to reduce document size. - makefont.php was updated. - Linux binaries were added on /fonts/utils - All fonts were updated. - $autopadding parameter was added to Multicell() to disable automatic padding features. - $maxh parameter was added to Multicell() and Write() to set a maximum height. 4.3.009 (2008-12-05) - Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed. 4.3.008 (2008-12-05) - Bug item #2390566 "rect bug" was fixed. - File path was fixed for font embedded files. - SetFont() method signature was changed to include the font filename. - Some font-related methods were improved. - Methods getFontFamily() and getFontStyle() were added. 4.3.007 (2008-12-03) - PNG alpha channel is now supported (GD library is required). - AddFont() function now support custom font file path on $file parameter. - The default width variable ($dw) is now always defined for any font. - The 'Style' attribute on CID-0 fonts was removed because of protection bug. 4.3.006 (2008-12-01) - A regular expression on getHtmlDomArray() to find HTML tags was fixed. 4.3.005 (2008-11-25) - makefont.php was fixed. - Bug item #2339877 was fixed (false loop condition detected on WriteHTML()). - Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled). - Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()). 4.3.004 (2008-11-19) - Function _textstring() was fixed (bug 2309051). - All examples were updated. 4.3.003 (2008-11-18) - CID-0 font bug was fixed. - Some functions were optimized. - Function getGroupPageNoFormatted() was added. - Example n. 23 was updated. 4.3.002 (2008-11-17) - Bug item #2305518 "CID-0 font don't work with encryption" was fixed. 4.3.001 (2008-11-17) - Bug item #2300007 "download mimetype pdf" was fixed. - Double quotes were replaced by single quotes to improve PHP performances. - A bug relative to HTML cell borders was fixed. 4.3.000 (2008-11-14) - The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page. - A bug relative to list items indentation was fixed. - A bug relative to borders on HTML tables and Multicell was fixed. - A bug relative to rowspanned cells was fixed. - A bug relative to html images across pages was fixed. 4.2.009 (2008-11-13) - Spaces between li tags are now automatically removed. 4.2.008 (2008-11-12) - A bug relative to fill color on next page was fixed. 4.2.007 (2008-11-12) - The function setListIndentWidth() was added to set custom indentation widht for HTML lists. 4.2.006 (2008-11-06) - A bug relative to HTML justification was fixed. 4.2.005 (2008-11-06) - A bug relative to HTML justification was fixed. - The methods formatPageNumber() and PageNoFormatted() were added to format page numbers. - Default Footer() method was changed to use PageNoFormatted() instead of PageNo(). - Example 6 was updated. 4.2.004 (2008-11-04) - Bug item n. 2217039 "filename handling improvement" was fixed. 4.2.003 (2008-10-31) - Font style bug was fixed. 4.2.002 (2008-10-31) - Bug item #2210922 (htm element br not work) was fixed. - Write() function was improved to support margin changes. 4.2.001 (2008-10-30) - setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags. - writeHTML() function now support margin changes during execution. - Signature of addHTMLVertSpace() function is changed. 4.2.000 (2008-10-29) - htmlcolors.php was changed to support class-loaders. - ImageEps() function was improved in performances. - Signature of Link() And Annotation() functions were changed. - (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added). - rowspan mode for HTML table cells was improved and fixed. - Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40. - lastPage() signature is changed. - Signature of Write() function is changed. - Some HTML justification problems were fixed. - Some functions were fixed to better support RTL mode. - Example n. 10 was changed to support RTL mode. - All examples were updated. 4.1.004 (2008-10-23) - unicode_data.php was changed to support class-loaders. - Bug item #2186040/2 (writeHTML margin problem) was fixed. 4.1.003 (2008-10-22) - Bug item #2185399 was fixed (rowspan and page break). - Bugs item #2186040 was fixed (writeHTML margin problem). - Newline after table was removed. 4.1.002 (2008-10-21) - Bug item #2184525 was fixed (rowspan on HTML cell). 4.1.001 (2008-10-21) - Support for "start" attribute was added to HTML ordered list. - unicode_data.php file was changed to include UTF-8 to ASCII table. - Some functions were modified to better support UTF-8 extensions to core fonts. - Support for images on HTML lists was improved. - Examples n. 1 and 6 were updated. 4.1.000 (2008-10-18) - Page-break bug using HTML content was fixed. - The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload. - addHtmlLink() function was improved to support internal links (i.e.: link to page 23). - Justification alignment is now supported on HTML (see example n. 39). - example_006.php was updated. 4.0.033 (2008-10-13) - Bug n. 2157099 was fixed. - SetX() and SetY() functions were improved. - SetY() includes a new parameter to avoid the X reset. 4.0.032 (2008-10-10) - Bug n. 2156926 was fixed (bold, italic, underlined, linethrough). - setStyle() method was removed. - Configuration file was changed to use helvetica (non-unicode) font by default. - The use of mixed font types was improved. - All examples were updated. 4.0.031 (2008-10-09) - _putannots() and _putbookmarks() links alignments were fixed. 4.0.030 (2008-10-07) - _putbookmarks() function was fixed. - _putannots() was fixed to include internal links. 4.0.029 (2008-09-27) - Infinite loop bug was fixed [Bug item #130309]. - Multicell() problem on Header() was fixed. 4.0.028 (2008-09-26) - setLIsymbol() was added to set the LI symbol used on UL lists. - Missing $padding and $encryption_key variables declarations were added [Bug item #2129058]. 4.0.027 (2008-09-19) - Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed. - arailunicid0.php font was updated. - The problem of javascript form fields duplication after saving was fixed. 4.0.026 (2008-09-17) - convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation. - The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large - Example n. 6 was updated. 4.0.025 (2008-09-15) - _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding. - arialunicid0 font was added (see the new example n. 38). - The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php. 4.0.024 (2008-09-12) - "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4. - support for Spot Colors were added. Check the new example n. 37 and the following new functions: AddSpotColor() SetDrawSpotColor() SetFillSpotColor() SetTextSpotColor() _putspotcolors() - Bookmark() function was improved to fix wrong levels. - $lasth changes after header/footer calls were fixed. 4.0.023 (2008-09-05) - Some HTML related problems were fixed. - Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php). 4.0.022 (2008-08-28) - Line height on HTML was fixed. - Image inside an HTML cell problem was fixed. - A new "zarbold" persian font was added. 4.0.021 (2008-08-24) - HTTP headers were fixed on Output function(). - getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents. - Function Write() was fixed. - The problem of additional vertical spaces on HTML was fixed. - The problem of frame around HTML links was fixed. 4.0.020 (2008-08-15) - "[2052259] WriteHTML & " bug was fixed. 4.0.019 (2008-08-13) - "Rowspan on first cell" bug was fixed. 4.0.018 (2008-08-08) - Default cellpadding for HTML tables was fixed. - Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7). - HTML links are now correclty shifted during line alignments. - function getAliasNbPages() was added and Footer() was updated. - RowSpan mode for HTML tables was fixed. - Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed. - ImageEPS() function was improved and RTL alignment was fixed (see example_032.php). 4.0.017 (2008-08-05) - Missing CNZ and CEO style modes were added to Rect() function. - Fonts utils were updated to include support for OpenType fonts. - getLastH() function was added. 4.0.016 (2008-07-30) - setPageMark() function was added. This function must be called after calling Image() function for a background image. 4.0.015 (2008-07-29) - Some functions were changed to support different page formats (see example_028.php). - The signature of setPage() function is changed. 4.0.014 (2008-07-29) - K_PATH_MAIN calculation on tcpdf_config.php was fixed. - HTML support for EPS/AI images was added (see example_006.php). - Bugs item #2030807 "Truncated text on multipage html fields" was fixed. - PDF header bug was fixed. - helvetica was added as default font family. - Stroke mode was fixed on Text function. - several minor bugs were fixed. 4.0.013 (2008-07-27) - Bugs item #2027799 " Big spaces between lines after page break" was fixed. - K_PATH_MAIN calculation on tcpdf_config.php was changed. - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message. 4.0.012 (2008-07-24) - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions. - The following functions were added: setHeader() setFooter() getImageRBX() getImageRBY() getCellHeightRatio() getHeaderFont() getFooterFont() getRTL() getBarcode() getHeaderData() getHeaderMargin() getFooterMargin() 4.0.011 (2008-07-23) - Font support was improved. - The folder /fonts/utils contains new utilities and instructions for embedd font files. - Documentation was updated. 4.0.010 (2008-07-22) - HTML tables were fixed to work across pages. - Header() and Footer() functions were updated to preserve previous settings. - example_035.php was added. 4.0.009 (2008-07-21) - UTF8StringToArray() function was fixed for non-unicode mode. 4.0.008 (2008-07-21) - Barcodes alignment was fixed (see example_027.php). - unicode_data.php was updated. - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed. 4.0.007 (2008-07-18) - str_split was replaced by preg_split for compatibility with PHP4 version. - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php). 4.0.006 (2008-07-16) - HTML rowspan bug was fixed. - Line style for MultiCell() was fixed. - WriteHTML() function was improved. - CODE128C barcode was fixed (barcodes.php). 4.0.005 (2008-07-11) - Bug [2015715] "PHP Error/Warning" was fixed. 4.0.004 (2008-07-09) - HTML cell internal padding was fixed. 4.0.003 (2008-07-08) - Removed URL encoding when F option is selected on Output() function. - fixed some minor bugs in html tables. 4.0.002 (2008-07-07) - Bug [2000861] was still unfixed and has been fixed. 4.0.001 (2008-07-05) - Bug [2000861] was fixed. 4.0.000 (2008-07-03) - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed). - HTML support was completely rewritten and improved (see example 6). - Alignments parameters were fixed. - Functions GetArrStringWidth() and GetStringWidth() now include font parameters. - Fonts support was improved. - All core fonts were replaced and moved to fonts/ directory. - The following functions were added: getMargins(), getFontSize(), getFontSizePt(). - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated. - Multicell and WriteHTMLCell fill function was fixed. - Several minor bugs were fixed. - barcodes.php was updated. - All examples were updated. ------------------------------------------------------------ 3.1.001 (2008-06-13) - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed. - Vera font was removed, DejaVu font and Free fonts were updated. - Image handling was improved. - All examples were updated. 3.1.000 (2008-06-11) - setPDFVersion() was added to change the default PDF version (currently 1.7). - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29). - SetDisplayMode() signature was changed (new options were added). - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30). - PieSector() function was added to render render pie charts (see example 31). - ImageEps() was added to display EPS and AI images with limited support (see example 32). - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added. - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions. - HTML lists were improved and could be nested (you may now represent trees). - AddFont() bug was fixed. - _putfonts() bug was fixed. - graphics functions were fixed. - unicode_data.php file was updated (fixed). - almohanad font was updated. - example 18 was updated (Farsi and Arabic languages). - source code cleanup. - All examples were updated and new examples were added. 3.0.015 (2008-06-06) - AddPage() function signature is changed to include page format. - example 28 was added to show page format changes. - setPageUnit() function was added to change the page units of measure. - setPageFormat() function was added to change the page format and orientation between pages. - setPageOrientation() function was added to change the page orientation. - Arabic font shaping was fixed for laa letter and square boxes (see the example 18). 3.0.014 (2008-06-04) - Arabic font shaping was fixed. - setDefaultTableColumns() function was added. - $cell_height_ratio variable was added. - setCellHeightRatio() function was added to define the default height of cell repect font height. 3.0.013 (2008-06-03) - Multicell height parameter was fixed. - Arabic font shaping was improved. - unicode_data.php was updated. 3.0.012 (2008-05-30) - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file. - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated). - Arabic font shaping was improved. - TranslateY() function was fixed (bug [1977962]). - setVisibility() function was fixed. - writeBarcode() function was fixed to scale using $xref parameter. - All examples were updated. 3.0.011 (2008-05-23) - CMYK color support was added to all graphic functions. - HTML table support was improved: -- now it's possible to include additional html tags inside a cell; -- colspan attribute was added. - example 006 was updated. 3.0.010 (2008-05-21) - fixed $laa_array inclusion on utf8Bidi() function. 3.0.009 (2008-05-20) - unicode_data.php was updated. - Arabic laa letter problem was fixed. 3.0.008 (2008-05-12) - Arabic support was fixed and improved (unicode_data.php was updated). - Polycurve() function was added to draw a poly-Bezier curve. - list items alignment was fixed. - example 6 was updated. 3.0.007 (2008-05-06) - Arabic support was fixed and improved. - AlMohanad (arabic) font was added. - C128 barcode bugs were fixed. 3.0.006 (2008-04-21) - Condition to check negative width values was added. 3.0.005 (2008-04-18) - back-Slash character escape was fixed on writeHTML() function. - Exampe 6 was updated. 3.0.004 (2008-04-11) - Bug [1939304] (Right to Left Issue) was fixed. 3.0.003 (2008-04-07) - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed. - "face" attribute of "font" tag is now fully supported. 3.0.002 (2008-04-01) - Write() functions now return the number of cells and not the number of lines. - TCPDF is released under LGPL 2.1, or any later version. 3.0.001 (2008-05-28) - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng(). - function writeBarcode() was fixed. - all examples were updated. - example 27 was added to show various barcodes. 3.0.000 (2008-03-27) - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug. - Image-related functions were rewritten. - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9). - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM. - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22). - Page Groups were added (see example 23). - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24). - All private variables and functions were changed to protected. - setAlpha() function was added to give transparency support for all objects (see example 25). - Clipping and stroke modes were added to Text() function (see example 26). - All examples were moved to "examples" directory. - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9). 2.9.000 (2008-03-26) - htmlcolors.php file was added to include html colors. - Support for HTML color names and three-digit hexadecimal color codes was added. - private function convertColorHexToDec() was renamed convertHTMLColorToDec(). - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported). - Write() function were fixed. - example_006.php was updated. - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14) 2.8.000 (2008-03-20) - Private variables were changed to protected. - Function Write() was fixed and improved. - Support for dl, dt, dd, del HTML tags was introduced. - Line-trought mode was added for HTML and text. - Text vertical alignment on cells were fixed. - Examples were updated to reflect changes. 2.7.002 (2008-03-13) - Bug "[1912142] Encrypted PDF created/modified date" was fixed. 2.7.001 (2008-03-10) - Cell justification was fixed for non-unicode mode. 2.7.000 (2008-03-09) - Cell() stretching mode 4 (forced character spacing) was fixed. - writeHTMLCell() now uses Multicell() to write. - Multicell() has a new parameter $ishtml to act as writeHTMLCell(). - Write() speed was improved for non-arabic strings. - Example n. 20 was changed. 2.6.000 (2008-03-07) - various alignments bugs were fixed. 2.5.000 (2008-03-07) - Several bugs were fixed. - example_019.php was added to test non-unicode mode using old fonts. 2.4.000 (2008-03-06) - RTL support was deeply improved. - GetStringWidth() was fixed to support RTL languages. - Text() RTL alignment was fixed. - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi(). - example_018.php was added and test_unicode.php was removed. 2.3.000 (2008-03-05) - MultiCell() signature is changed. Now support multiple columns across pages (see example_017). - Write() signature is changed. Now support the cell mode to be used with MultiCell. - Header() and Footer() were changed. - The following functions were added: UTF8ArrSubString() and unichr(). - Examples were updated to reflect last changes. 2.2.004 (2008-03-04) - Several examples were added. - AddPage() Header() and Footer() were fixed. - Documentation is now available on http://www.tcpdf.org 2.2.003 (2008-03-03) - [1894853] Performance of MultiCell() was improved. - RadioButton and ListBox functions were added. - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf. 2.2.002 (2008-02-28) - [1900495] html images path was fixed. - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library. 2.2.001 (2008-02-16) - The bug "[1894700] bug with replace relative path" was fixed - Justification was fixed 2.2.000 (2008-02-12) - fixed javascript bug introduced with latest release 2.1.002 (2008-02-12) - Justify function was fixed on PHP4 version. - Bookmank function was added ([1578250] Table of contents). - Javascript and Form fields support was added ([1796359] Form fields). 2.1.001 (2008-02-10) - The bug "[1885776] Race Condition in function justitfy" was fixed. - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed. 2.1.000 (2008-01-07) - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file - Bidirectional Algorithm to correctly reverse bidirectional languages was added. - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed. - SetCellPadding function was added. - writeHTML was updated with new parameters. - Text function was fixed. - MultiCell function was fixed, now works also across multiple pages. - Line width was fixed on Header and Footer functions and tag. - "GetImageSize" was renamed "getimagesize". - Document version was changed from 1.3 to 1.5. - _begindoc() function was fixed. - ChangeDate was fixed and ModDate was added. - The following functions were added: setPage() : Move pointer to the specified document page. getPage() : Get current document page number. lastpage() : Reset pointer to the last document page. getNumPages() : Get the total number of inserted pages. GetNumChars() : count the number of (UTF-8) characters in a string. - $stretch parameter was added to Cell() function to fit text on cell: 0 = disabled 1 = horizontal scaling only if necessary 2 = forced horizontal scaling 3 = character spacing only if necessary 4 = forced character spacing - Line function was fixed for RTL. - Graphic transformation functions were added [1811158]: StartTransform() StopTransform() ScaleX() ScaleY() ScaleXY() Scale() MirrorH() MirrorV() MirrorP() MirrorL() TranslateX() TranslateY() Translate() Rotate() SkewX() SkewY() Skew() - Graphic function were added/updated [1688549]: SetLineStyle() _outPoint() _outLine() _outRect() _outCurve() Line() Rect() Curve Ellipse Circle Polygon RegularPolygon 2.0.000 (2008-01-04) - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files. - setRTL($enable) method was added to manually enable/disable the RTL text direction. - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left. - RC4 40bit encryption was added. Check the SetProtection method. - [1815213] Improved image support for GIF, JPEG, PNG formats. - [1800094] Attribute "value" was added to ordered list items . - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be: T: top-right for LTR or top-left for RTL M: middle-right for LTR or middle-left for RTL B: bottom-right for LTR or bottom-left for RTL N: next line - Attribute "align" was added to html tag to set the above image "align" parameter. Possible values are: top: top-right for LTR or top-left for RTL middle: middle-right for LTR or middle-left for RTL bottom: bottom-right for LTR or bottom-left for RTL - [1798103] newline was added after ,