Chart-2.4.6/0000755000175000017500000000000012033074620012113 5ustar reinerreinerChart-2.4.6/Makefile.PL0000644000175000017500000000037712033074610014073 0ustar reinerreineruse ExtUtils::MakeMaker; # make the samples directory mkdir ('samples', 00755); # write the makefile WriteMakefile ( 'NAME' => 'Chart', 'PREREQ_PM' => { 'GD' => 2.0 }, 'dist' => { 'COMPRESS' => 'gzip', 'SUFFIX' => 'gz' }, 'VERSION' => '2.4.6' ) Chart-2.4.6/Chart.pod0000644000175000017500000006100511732421672013672 0ustar reinerreiner=head1 NAME Chart - a series of charting modules =head1 SYNOPSIS use Chart::type; (type is one of: Points, Lines, Bars, LinesPoints, Composite, StackedBars, Mountain, Pie, HorizontalBars, Split, ErrorBars, Pareto, Direction) $obj = Chart::type->new; $obj = Chart::type->new ( $png_width, $png_height ); $obj->set ( $key_1, $val_1, ... ,$key_n, $val_n ); $obj->set ( $key_1 => $val_1, ... $key_n => $val_n ); $obj->set ( %hash ); # GIFgraph.pm-style API to produce png formatted charts @data = ( \@x_tick_labels, \@dataset1, ... , \@dataset_n ); $obj->png ( "filename", \@data ); $obj->png ( $filehandle, \@data ); $obj->png ( FILEHANDLE, \@data ); $obj->cgi_png ( \@data ); # Graph.pm-style API $obj->add_pt ($label, $val_1, ... , $val_n); $obj->add_dataset ($val_1, ... , $val_n); $obj->png ( "filename" ); $obj->png ( $filehandle ); $obj->png ( FILEHANDLE ); $obj->cgi_png (); The similar functions are available for j-peg # Retrieve image map information $obj->set ( 'imagemap' => 'true' ); $imagemap_ref = $obj->imagemap_dump (); =head1 DESCRIPTION These man-pages give you the most important information about Chart. There is also a complete documentation (Documentation.pdf) within the Chart package. Look at it to get more information. This module is an attempt to build a general purpose graphing module that is easily modified and expanded. I borrowed most of the API from Martien Verbruggen's GIFgraph module. I liked most of GIFgraph, but I thought it was to difficult to modify, and it was missing a few things that I needed, most notably legends. So I decided to write a new module from scratch, and I've designed it from the bottom up to be easy to modify. Like GIFgraph, Chart uses Lincoln Stein's GD module for all of its graphics primitives calls. =head2 use-ing Chart Okay, so you caught me. There's really no Chart::type module. All of the different chart types (Points, Lines, Bars, LinesPoints, Composite, StackedBars, Pie, Pareto, HorizontalBars, Split, ErrorBars, Direction and Mountain so far) are classes by themselves, each inheriting a bunch of methods from the Chart::Base class. Simply replace the word type with the type of chart you want and you're on your way. For example, use Chart::Lines; would invoke the lines module. =head2 Getting an object The new method can either be called without arguments, in which case it returns an object with the default image size (400x300 pixels), or you can specify the width and height of the image. Just remember to replace type with the type of graph you want. For example, $obj = Chart::Bars->new (600,400); would return a Chart::Bars object containing a 600x400 pixel image. New also initializes most of the default variables, which you can subsequently change with the set method. =head2 Setting different options This is where the fun begins. Set looks for a hash of keys and values. You can pass it a hash that you've already constructed, like %hash = ('title' => 'Foo Bar'); $obj->set (%hash); or you can try just constructing the hash inside the set call, like $obj->set ('title' => 'Foo Bar'); The following are all of the currently supported options: =over 4 =item 'transparent' Makes the background of the image transparent if set to 'true'. Useful for making web page images. Default is 'false'. =item 'png_border' Sets the number of pixels used as a border between the graph and the edges of the png/j-peg. Defaults to 10. =item 'graph_border' Sets the number of pixels used as a border between the title/labels and the actual graph within the png. Defaults to 10. =item 'text_space' Sets the amount of space left on the sides of text, to make it more readable. Defaults to 2. =item 'title' Tells GD graph what to use for the title of the graph. If empty, no title is drawn. It recognizes '\n' as a newline, and acts accordingly. Remember, if you want to use normal quotation marks instead of single quotation marks then you have to quote "\\n". Default is empty. =item 'sub_title' Write a sub-title under the title in smaller letters. =item 'x_label' Tells Chart what to use for the x-axis label. If empty, no label is drawn. Default is empty. =item 'y_label', 'y_label2' Tells Chart what to use for the y-axis labels. If empty, no label is drawn. Default is empty. =item 'legend' Specifies the placement of the legend. Valid values are 'left', 'right', 'top', 'bottom'. Setting this to 'none' tells chart not to draw a legend. Default is 'right'. =item 'legend_labels' Sets the values for the labels for the different data sets. Should be assigned a reference to an array of labels. For example, @labels = ('foo', 'bar'); $obj->set ('legend_labels' => \@labels); Default is empty, in which case 'Dataset 1', 'Dataset 2', etc. are used as the labels. =item 'tick_len' Sets the length of the x- and y-ticks in pixels. Default is 4. =item 'x_ticks' Specifies how to draw the x-tick labels. Valid values are 'normal', 'staggered' (staggers the labels vertically), and 'vertical' (the labels are draw upwards). Default is 'normal'. =item 'xy_plot' Forces Chart to plot a x-y-graph, which means, that the x-axis is also numeric if set to 'true'. Very useful for mathematical graphs. Works for Lines, Points, LinesPoints and ErrorBars. Split makes always a xy_plot. Defaults to 'false'. =item 'min_y_ticks' Sets the minimum number of y_ticks to draw when generating a scale. Default is 6, The minimum is 2. =item 'max_y_ticks' Sets the maximum number of y_ticks to draw when generating a scale. Default is 100. This limit is used to avoid plotting an unreasonable large number of ticks if non-round values are used for the min_val and max_val. The value for 'max_y_ticks' should be at least 5 times larger than 'min_y_ticks'. =item 'max_x_ticks', 'min_x_ticks' Work similar as 'max_y_ticks' and 'min_y_ticks'. Of course, only for a xy_plot. =item 'integer_ticks_only' Specifies how to draw the x- and y-ticks: as floating point ('false', '0') or as integer numbers ('true', 1). Default: 'false' =item 'skip_int_ticks' If 'integer_ticks_only' was set to 'true' the labels and ticks will be drawn every nth tick. Of course in horizontalBars it affects the x-axis. Default to 1, no skipping. =item 'precision' Sets the number of numerals after the decimal point. Affects in most cases the y-axis. But also the x-axis if 'xy_plot' was set and also the labels in a pie chart. Defaults to 3. =item 'max_val' Sets the maximum y-value on the graph, overriding the normal auto-scaling. Default is undef. =item 'min_val' Sets the minimum y-value on the graph, overriding the normal auto-scaling. Default is undef. Caution should be used when setting 'max_val' and 'min_val' to floating point or non-round numbers. This is because the scale must start & end on a tick, ticks must have round-number intervals, and include round numbers. Example: Suppose your data set has a range of 35-114 units. If you specify them as the 'min_val' & 'max_val', the y_axis will be plotted with 80 ticks every 1 unit.. If no 'min_val' & 'max_val', the system will auto scale the range to 30-120 with 10 ticks every 10 units. If the 'min_val' & 'max_val' are specified to excessive precision, they may be overridden by the system, plotting a maximum 'max_y_ticks' ticks. =item 'include_zero' If 'true', forces the y-axis to include zero if it is not in the dataset range. Default is 'false'. In general, it is better to use this, than to set the 'min_val' if that is all you want to achieve. =item 'pt_size' Sets the radius of the points (for Chart::Points, etc.) in pixels. Default is 18. =item 'brush_size' Sets the width of the lines (for Chart::Lines, etc.) in pixels. Default is 6. =item 'brushStyle' Sets the shape of points for Chart::Points, Chart::LinesPoints. The possibilities are 'FilledCircle', 'circle', 'donut', 'OpenCircle', 'fatPlus', 'triangle', 'upsidedownTriangle', 'square', 'hollowSquare', 'OpenRectangle', 'FilledDiamond', 'OpenDiamond', 'Star', 'OpenStar'. Default: 'FilledCircle =item 'skip_x_ticks' Sets the number of x-ticks and x-tick labels to skip. (ie. if 'skip_x_ticks' was set to 4, Chart would draw every 4th x-tick and x-tick label). Default is undef. =item 'custom_x_ticks' Used in points, lines, linespoints, errorbars and bars charts, this option allows you to you to specify exactly which x-ticks and x-tick labels should be drawn. It should be assigned a reference to an array of desired ticks. Just remember that I'm counting from the 0th element of the array. (ie., if 'custom_x_ticks' is assigned [0,3,4], then the 0th, 3rd, and 4th x-ticks will be displayed) =item 'f_x_tick' Needs a reference to a function which uses the x-tick labels generated by the '@data->[0]' as the argument. The result of this function can reformat the labels. For instance $obj -> set ('f_x_tick' => \&formatter ); An example for the function formatter: x labels are seconds since an event. The referenced function can transform this seconds to hour, minutes and seconds. =item 'f_y_tick' The same situation as for 'f_x_tick' but now used for y labels. =item 'colors' This option lets you control the colors the chart will use. It takes a reference to a hash. The hash should contain keys mapped to references to arrays of rgb values. For instance, $obj->set('colors' => {'background' => [255,255,255]}); sets the background color to white (which is the default). Valid keys for this hash are 'background' (background color for the png) 'title' (color of the title) 'text' (all the text in the chart) 'x_label' (color of the x-axis label) 'y_label' (color of the first y axis label) 'y_label2' (color of the second y axis label) 'grid_lines' (color of the grid lines) 'x_grid_lines' (color of the x grid lines - for x axis ticks) 'y_grid_lines' (color of the y grid lines - for to left y axis ticks) 'y2_grid_lines' (color of the y2 grid lines - for right y axis ticks) 'dataset0'..'dataset63' (the different datasets) 'misc' (everything else, ie. ticks, box around the legend) NB. For composite charts, there is a limit of 8 datasets per component. The colors for 'dataset8' through 'dataset15' become the colors for 'dataset0' through 'dataset7' for the second component chart. =item 'title_font' This option changes the font of the title. The key has to be a GD font. eg. GD::Font->Large =item 'label_font' This option changes the font of the labels. The key has to be a GD font. =item 'legend_font' This option changes the font of the text in the legend. The key has to be a GD font. =item 'tick_label_font' This is the font for the tick labels. It also needs a GD font object as an argument. =item 'grey_background' Puts a nice soft grey background on the actual data plot when set to 'true'. Default is 'true'. =item 'y_axes' Tells Chart where to place the y-axis. Has no effect on Composite and Pie. Valid values are 'left', 'right' and 'both'. Defaults to 'left'. =item 'x_grid_lines' Draws grid lines matching up to x ticks if set to 'true'. Default is false. =item 'y_grid_lines' Draws grid lines matching up to y ticks if set to 'true'. Default is false. =item 'grid_lines' Draws grid lines matching up to x and y ticks. =item 'spaced_bars' Leaves space between the groups of bars at each data point when set to 'true'. This just makes it easier to read a bar chart. Default is 'true'. =item 'imagemap' Lets Chart know you're going to ask for information about the placement of the data for use in creating an image map from the png. This information can be retrieved using the imagemap_dump() method. NB. that the imagemap_dump() method cannot be called until after the Chart has been generated (ie. using the png() or cgi_png() methods). =item 'sort' In a xy-plot, the data will be sorted ascending if set to 'true'. (Should be set if the data isn't sorted, especially in Lines, Split and LinesPoints) In a Pareto Chart the data will be sorted descending. Defaults to 'false'. =item 'composite_info' This option is only used for composite charts. It contains the information about which types to use for the two component charts, and which datasets belong to which component chart. It should be a reference to an array of array references, containing information like the following $obj->set ('composite_info' => [ ['Bars', [1,2]], ['Lines', [3,4] ] ]); This example would set the two component charts to be a bar chart and a line chart. It would use the first two data sets for the bar chart (note that the numbering starts at 1, not zero like most of the other numbered things in Chart), and the second two data sets for the line chart. The default is undef. NB. Chart::Composite can only do two component charts. =item 'min_val1', 'min_val2' Only for composite charts, these options specify the minimum y-value for the first and second components respectively. Both default to undef. =item 'max_val1', 'max_val2' Only for composite charts, these options specify the maximum y-value for the first and second components respectively. Both default to undef. =item 'ylabel2' The label for the right y-axis (the second component chart) on a composite chart. Default is undef. =item 'y_ticks1', 'y_ticks2' The number of y ticks to use on the first and second y-axis on a composite chart. Please note that if you just set the 'y_ticks' option, both axes will use that number of y ticks. Both default to undef. =item 'f_y_ticks1', 'f_y_ticks2' Only for composite charts, needs a reference to a function which has one argument and has to return a string which labels the first resp. second y axis. Both default to undef. =item 'same_y_axes' Forces both component charts in a composite chart to use the same maximum and minimum y-values if set to 'true'. This helps to keep the composite charts from being too confusing. Default is undef. =item 'no_cache' Adds Pragma: no-cache to the http header. Be careful with this one, as Netscape 4.5 is unfriendly with POST using this method. =item 'legend_example_size' Sets the length of the example line in the legend in pixels. Defaults to 20. =item 'same_error' This is a option only for ErrorBars. It tells chart that you want use the same error value of a data point if set to 'true'. Look at the documentation to see how the module ErrorBars works. Default: 'false'. =item 'skip_y_ticks' Does the same for the y-axis at a HorizontalBars chart as 'skip_x_ticks' does for other charts. Defaults to 1. =item 'label_values' Tells a pie chart what labels to draw beside the pie. Valid values are 'percent', 'value', 'both' and 'none'. Defaults to 'percent'. =item 'legend_label_values' Tells a pie chart what labels to draw in the legend. Valid values are 'percent', 'value', 'both' and 'none'. Defaults to 'value'. =item 'start' Required value for a split chart. Sets the start value of the first interval. If the x coordinate of the first data point is zero, you should 'set' to zero. Default is 'undef'. =item 'interval' Also a required value for a split chart. It sets the interval of one line to plot. Defaults 'undef'. =item 'interval_ticks' Sets the number of ticks for the x-axis of a Split chart. Defaults to 5. =item 'scale' Every y-value of a split chart will be multiplied with that value, but the scale won't change. Which means that split allows one to overdraw certain rows! Only useful if you want to give prominence to the maximal amplitudes of the data. Defaults to 1. =item 'point' Indicates to draw points in a direction chart. 'true' or 'false' possible. Defaults to 'true'. =item 'line' If you turn this option to 'true', then direction will connect the points with lines. Defaults to 'false'. =item 'arrow' This is also an option for the direction module. If set to 'true', chart will draw a arrow from the center to the point. Defaults to 'false'. =item 'angle_interval' This option tells direction, how many angle lines should be drawn. The default value is 30, which means that a line will be drawn every 30 degrees. Valid Values are: 0, 5, 10, 15, 20, 30, 45 and 60. If you choose 0, direction will draw no line. =item 'min_circles' Sets the minimum number of circles when generating a scale for direction. Default is 4, minimum is 2. =item 'max_circles' Sets the maximum number of circles when generating a scale for direction. Default is 100. This limit is used to avoid plotting an unreasonable large number of ticks if non-round values are used for the min_val and max_val. =item 'pairs' Only used for direction how to handle more datasets. If 'pairs' is set to 'true', Chart uses the first dataset as a set of degrees and the second dataset as a set of values. Then, the third set is a set of degrees and the fourth a set of values \dots. \\ If 'pairs' is set to 'false', Chart uses the first dataset as a set of angels and all following datasets as sets of values. Defaults to 'false'. Sets the maximum number of circles when generating a scale for direction. Default is 100. This limit is used to avoid plotting an unreasonable large number of ticks if non-round values are used for the min_val and max_val. =back =head2 GIFgraph.pm-style API =over 4 =item Sending the image to a file Invoking the png method causes the graph to be plotted and saved to a file. It takes the name of the output file and a reference to the data as arguments. For example, $obj->png ("foo.png", \@data); would plot the data in @data, and the save the image to foo.png. Of course, this then beggars the question "What should @data look like?". Well, just like GIFgraph, @data should contain references to arrays of data, with the first array reference pointing to an array of x-tick labels. For example, @data = ( [ 'foo', 'bar', 'junk' ], [ 30.2, 23.5, 92.1 ] ); would set up a graph with one dataset, and three data points in that set. In general, the @data array should look something like @data = ( \@x_tick_labels, \@dataset1, ... , \@dataset_n ); And no worries, I make my own internal copy of the data, so that it doesn't mess with yours. =item CGI and Chart Okay, so you're probably thinking, "Do I always have to save these images to disk? What if I want to use Chart to create dynamic images for my web site?" Well, here's the answer to that. $obj->cgi_png ( \@data ); The cgi_png method will print the chart, along with the appropriate http header, to stdout, allowing you to call chart-generating scripts directly from your html pages (ie. with a img src=image.pl HTML tag). The @data array should be set up the same way as for the normal png method. =back =head2 Graph.pm-style API You might ask, "But what if I just want to add a few points to the graph, and then display it, without all those references to references?". Well, friend, the solution is simple. Borrowing the add_pt idea from Matt Kruse's Graph module, you simply make a few calls to the add_pt method, like so: $obj->add_pt ('foo', 30, 25); $obj->add_pt ('bar', 16, 32); Or, if you want to be able to add entire datasets, simply use the add_dataset method: $obj->add_dataset ('foo', 'bar'); $obj->add_dataset (30, 16); $obj->add_dataset (25, 32); These methods check to make sure that the points and datasets you are adding are the same size as the ones already there. So, if you have two datasets currently stored, and try to add a data point with three different values, it will carp (per the Carp module) an error message. Similarly, if you try to add a dataset with 4 data points, and all the other datasets have 3 data points, it will carp an error message. Don't forget, when using this API, that I treat the first dataset as a series of x-tick labels. So, in the above examples, the graph would have two x-ticks, labeled 'foo' and 'bar', each with two data points. Pie and ErrorBars handle it different, look at the documentation to see how it works. =over 4 =item Adding a datafile You can also add a complete datafile to a chart object. Just use the add_datafile() method. $obj->add_datafile('file', 'set' or 'pt'); file can be the name of the data file or a filehandle. 'set' or 'pt is the type of the datafile. If the parameter is 'set' then each line in the data file has to be a complete data set. The value of the set has to be separated by white spaces. For example the file looks like this: 'foo' 'bar' 30 16 25 32 If the parameter is 'pt', one line has to include all values of one data point separated by white spaces. For example: 'foo' 30 25 'bar' 16 32 =item Clearing the data A simple call to the clear_data method empties any values that may have been entered. $obj->clear_data (); =item Getting a copy of the data If you want a copy of the data that has been added so far, make a call to the get_data method like so: $dataref = $obj->get_data; It returns (you guessed it!) a reference to an array of references to datasets. So the x-tick labels would be stored as @x_labels = @{$dataref->[0]}; =item Sending the image to a file If you just want to print this chart to a file, all you have to do is pass the name of the file to the png() method. $obj->png ("foo.png"); =item Sending the image to a filehandle If you want to do something else with the image, you can also pass a filehandle (either a typeglob or a FileHandle object) to png, and it will print directly to that. $obj->png ($filehandle); $obj->png (FILEHANDLE); =item CGI and Chart Okay, so you're probably thinking (again), "Do I always have to save these images to disk? What if I want to use Chart to create dynamic images for my web site?" Well, here's the answer to that. $obj->cgi_png (); The cgi_png method will print the chart, along with the appropriate http header, to stdout, allowing you to call chart-generating scripts directly from your html pages (ie. with a img src=image.pl HTML tag). =back =item Produce a png image as a scalar Like scalar_jpeg() the image is produced as a scalar so that the programmer-user can do whatever the heck s/he wants to with it: $obj-scalar_png($dataref) =back =item Produce a jpeg image as a scalar Like scalar_png() the image is produced as a scalar so that the programmer-user can do whatever the heck s/he wants to with it: $obj-scalar_jpeg($dataref) =back =head2 Imagemap Support Chart can also return the pixel positioning information so that you can create image maps from the pngs Chart generates. Simply set the 'imagemap' option to 'true' before you generate the png, then call the imagemap_dump() method afterwards to retrieve the information. You will be returned a data structure almost identical to the @data array described above to pass the data into Chart. $imagemap_data = $obj->imagemap_dump (); Instead of single data values, you will be passed references to arrays of pixel information. For Bars, HorizontalBars and StackedBars charts, the arrays will contain two x-y pairs (specifying the upper left and lower right corner of the bar), like so ( $x1, $y1, $x2, $y2 ) = @{ $imagemap_data->[$dataset][$datapoint] }; For Lines, Points, ErrorBars, Split and LinesPoints, the arrays will contain a single x-y pair (specifying the center of the point), like so ( $x, $y ) = @{ $imagemap_data->[$dataset][$datapoint] }; A few caveats apply here. First of all, GD treats the upper-left corner of the png as the (0,0) point, so positive y values are measured from the top of the png, not the bottom. Second, these values will most likely contain long decimal values. GD, of course, has to truncate these to single pixel values. Since I don't know how GD does it, I can't truncate it the same way he does. In a worst-case scenario, this will result in an error of one pixel on your imagemap. If this is really an issue, your only option is to either experiment with it, or to contact Lincoln Stein and ask him. Third, please remember that the 0th dataset will be empty, since that's the place in the @data array for the data point labels. =head1 TO DO =over 4 =item * Add some 3-D graphs. Include True Type Fonts =back =head1 BUGS Probably quite a few, since it's been completely rewritten. As usual, please mail me with any bugs, patches, suggestions, comments, flames, death threats, etc. =head1 AUTHOR David Bonner (dbonner@cs.bu.edu) =head1 MAINTAINER Chart Group (Chart@fs.wettzell.de) =head1 COPYRIGHT Copyright(c) 1997-1998 by David Bonner, 1999 by Peter Clark, 2001 by the Chart group at BKG-Wettzell. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Chart-2.4.6/patterns/0000755000175000017500000000000012033074620013753 5ustar reinerreinerChart-2.4.6/patterns/PATTERN0.GIF0000644000175000017500000000006607610542334015510 0ustar reinerreinerGIF89a!, w{.K/(;Chart-2.4.6/patterns/PATTERN2.GIF0000644000175000017500000000006507610542334015511 0ustar reinerreinerGIF89a!, c c ;Chart-2.4.6/patterns/PATTERN1.GIF0000644000175000017500000000006707610542334015512 0ustar reinerreinerGIF89a!,۞ T;Chart-2.4.6/patterns/PATTERN2.PNG0000644000175000017500000000020107610542334015520 0ustar reinerreinerPNG  IHDRt&tRNStEXtSoftwaregif2png 0.6 (beta)iIDATxcxpa7C92QIENDB`Chart-2.4.6/patterns/PATTERN5.GIF0000644000175000017500000000007007610542334015510 0ustar reinerreinerGIF89a!, k D=î;Chart-2.4.6/patterns/PATTERN3.GIF0000644000175000017500000000006507610542334015512 0ustar reinerreinerGIF89a!, nxTF ;Chart-2.4.6/patterns/PATTERN0.PNG0000644000175000017500000000020607610542334015523 0ustar reinerreinerPNG  IHDRt&tRNStEXtSoftwaregif2png 0.6 (beta)iIDATxc.C=? 2k\IENDB`Chart-2.4.6/patterns/PATTERN3.PNG0000644000175000017500000000017607610542334015534 0ustar reinerreinerPNG  IHDRt&tRNStEXtSoftwaregif2png 0.6 (beta)iIDATxc(g P!^IENDB`Chart-2.4.6/patterns/PATTERN4.GIF0000644000175000017500000000006707610542334015515 0ustar reinerreinerGIF89a!, ~ tm ;Chart-2.4.6/patterns/PATTERN4.PNG0000644000175000017500000000020207610542334015523 0ustar reinerreinerPNG  IHDRt&tRNStEXtSoftwaregif2png 0.6 (beta)iIDATxcep k ,P1?e IENDB`Chart-2.4.6/patterns/PATTERN5.PNG0000644000175000017500000000020007610542334015522 0ustar reinerreinerPNG  IHDRt&tRNStEXtSoftwaregif2png 0.6 (beta)iIDATxcp`БIENDB`Chart-2.4.6/patterns/PATTERN1.PNG0000644000175000017500000000017507610542334015531 0ustar reinerreinerPNG  IHDRt&tRNStEXtSoftwaregif2png 0.6 (beta)iIDATxc``(C( ˩7IENDB`Chart-2.4.6/META.yml0000644000175000017500000000073212033074620013366 0ustar reinerreiner--- #YAML:1.0 name: Chart version: 2.4.6 abstract: ~ author: [] license: unknown distribution_type: module configure_requires: ExtUtils::MakeMaker: 0 build_requires: ExtUtils::MakeMaker: 0 requires: GD: 2 no_index: directory: - t - inc generated_by: ExtUtils::MakeMaker version 6.55_02 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 Chart-2.4.6/doc/0000755000175000017500000000000012033074620012660 5ustar reinerreinerChart-2.4.6/doc/LaTeX/0000755000175000017500000000000012033074620013635 5ustar reinerreinerChart-2.4.6/doc/LaTeX/d_bars.png0000644000175000017500000001056207763635574015632 0ustar reinerreinerPNG  IHDRX~N*PLTE}}}}}}}}}}}kIDATx흽n:i3s{\  ?[l6*`tMl"ﲤHDJoLBh5eY6E` Ŵ`Ro6[ziZmkYXSJC4ѥ2LY@]w&,sL8)9SvAa-6 ]XšE`J^42fZv 6"^J3W=.Ilio`-T!   W=S *cOtDJU!+YZM[4̪NdE{.G' cIGj)KX*}@-e +͞;`X C`1X Cy¢5`2,a4` ,X(*}@r,4L)UQZV=w b ,!b,zVXg1B=3Mc4X*5Fs,J ǒ:u,ob,ob,ob,ob*p`;cg+hBk+fc;V#a\\:aӮo.//)D]E_ mdӮMᴛ1+ U 7`1|7`1|7`1|7`l"%t|XDmVf6uly+\1Pd:xY +uK+7`1|7`1|7`1|7`1|V&v`u:D>D ocQcUwP^]C#&+e4,W,J X ߀ X ߀ X ߀ X ߀)v=&`:K'EW!J;nYV4XrXd4^ G*kXߟ!+`un}|X}ȱ#gPW*$,.HXa%DVX$+y,,c,ob,ob,ob,ob~8)M 4&`wY՘..Gon%tdᗓ±fOYÃd|$ BZ6 VH/ss`%X!{ B*c2,¾+©Cg:7ҍVHMoBjHVmX]ULuNK=:He-ޔ'{`1֬fsr+YHld#Oἴ6֠?rڀѼyÓPϚ:u@Ph`T# 9oK5,þP.p1`հtY' K=yR,l9Ԧ` D?#aݱ6;VSl²oU6fX]wy#=UX;U& u1aE}VWs~=kf1`<`U\9Օx30X5-)aSlEY,< ;~^M"OOM+0K!$b,ob&Tz9,/gNV X]1߀Մy=kWpPGjZ.X mdNv,kg)XƜ4#V=VDfV7`uϵ^|߀Q>:VrRE8uM6a4$X]y'}!Ұ ͒+$/ .\=K+Y!XGB:Xb:ǠO$ B> |VG `-G X! Y^t`zY%%.cֳN gXayiHn :`VҡK4II Rڌ_<ԴYjRC^ҿ7ي,uA9Ȓv&7{p`#2NHkX>+cXVX"JVE.t`kH>+cX_+!}#:gIŋTMq&C>('zlzփg Jg2I5)Ӵ?:('[*L`#.8G^jXɰ^ZϚֳ& 녿4-X8O?5)Xd`ZR2M[jY8LsZgհ0Գheޏyeԑe8z#XL >^  XXXX5}|n8XDz2qt`! ^x}֏OY8Z,Գ°^g=kih&Y8݉,=,9SXSaY````NJv}|9,czTJ=+V5kzKNj,3#+8W;ғ٦ xoX *+V:,Y-X~=5z=+8}^5JdxǑ]dVƩge pz~=]XzLJ˙/Bp0~:a5,b0, a5rM]D>"`:#'v,۳zO )@+o.MP~HpPt֊ "bTm壞)uG+{$SBTEB>Q:f|T)a^j[j"@=cOOv0VIg=FIeaQݭJ4?(~2UXiH;*8V5tgJ)dX>I2 |u6/1 |,xЮ     !gp"K R+M 6 kn2X CjHպuټrS@!tǞAAAAt:UĄŵJ4}VlhdD#g%>+YFJ {cLkI՜%51G7riwp8m,%-JClM(abS~Sğ"PI5I;zwEYFJ4}VlhdDz >{ܱ{|s~apstCLvssslTQ:bjt{{=OFí~qlhnYxFk>`e-GsʅuKr{'5e:yA$7M> }NPɪ'ӧOrlܩY^Y^Gz4a6IjnRaeTm߫dd'6{TXUL^5sd[i`ɛVGiI}KY{wj%I=Zi|7SddWV_GհշȻnJT PVgr^ ۰+_He^ rϳ?T uOQսLowMˠQi rγ4+Yvzvzzuaez}??==ջ> vlSW*ރȅd䡂K?>~~2 mXuW.հ)ankjjz rϳj:6{XVziWxe,}l],̙A4}VlhdD#g%>+YFJ4}Vlio;   hD|4Y{NIENDB`Chart-2.4.6/doc/LaTeX/d_pie3.png0000644000175000017500000000555407763635574015550 0ustar reinerreinerPNG  IHDR,PLTE}}xxdxd2mƫ IDATxIr8E8tz]}N]>7ʷmI 0I@.|,B,Ju]SSSSSSSSSSSL=bJg+{Juf[!"( 3(gvqZ7phg",N_yQBuەr T\*F!ֺ튀PJOD,Sқ 2 |t B– }bAQ5fg1Q3+ FE^oSSSSSSSS_3 I 25@jS} |=\VXwψt2[ a9o ^.V#C9˃t;St2Je7/JC}~B婚:]Pj|峱{{LJ~wدd6]ׯNY-$'Ho^C=mnOAV맭+2Q~*^[V902!19dcVna٧+Nd*Hߙp~K᠏zS|k8+ ´JŲx V\~Y>&Ovze7f@xx}@?sedkx2?>" _$;-9 $ k? % 2p|}z dpqx@>Qd9APgaT~LO0AA,xLGA| kH-\x Wt%h `A8@+.,!a?8A޿Q,A r@`1…6$@0…1$90,A`X3$(9,i b d!d $jHc% QC Ɛl nIQ@E{7 AgsL,{*yY[6 C| 3C&K Ԭ r81X">]͞x>Mzu>œy5BՆALϕ@YbS9Bݓ8"q C KC%*Z#K}QD&l+vI8pAUlɩq}Ym{kÐm)@8@\lӐr dA6d;Y1[.ǐ-ElgK6x ))R%& 9?Y@w5pCIF!E.I@[(jHQ@W 2'HFp$F2 ) )lHqpɏ`CʃIF!@^K$N[ ɪK2 7ypC*7p,nH,nHE YO Z7$YpC*YL^c!K~L0:AkLHV Sɏ bJ~L0J](c!H1ZAD^cBa$ABk!BIq~u! /O9_I rr%XR)净Hl r*-v! /ALR,fq-ߵx{!@d:$@flm1dsZhd9l!T}E:]KW% Aյ[_,9U#iZad<dY pK@箮==`^ѲkkiC ̒Zq@Uc[R@`❶<,H  bIgxg^ HnD8*V$XqK}&-XqK*p* Vv $jIE G\ @A`,<h*VCz,`HB1sMT,I ՗-$̼AK FzX !Y &zReJNN HR ˙ $:iz!@|dZup!@82鬌MTD|% ~q'1/;Ⱥu頢!_c3TXڶVmI ΏdSSSSSSS~=VZd ~" k6Sj$ϰ6ӓZK=l I\@ JQGN0bb-yv e*Z^JgX Sja!JL~.9Ȕx~X'lGo)-yU< QF) Z\II@aN_bojjjjjjjjK?4Q<IENDB`Chart-2.4.6/doc/LaTeX/points.png0000644000175000017500000000246207763635602015704 0ustar reinerreinerPNG  IHDR,PLTEBKIDATx n EA+Q*T;(JNL!B!7P@)S}8]Od}))sPJ>xؒZEؼ̒| hLRv+WqEE*"橏z1d,NwRsB!d3efvƙVL4zOur3n2"ӄ#aۚ $bk(V{_#1"Dn]9l[DOKko1#\N$A4(EРA"hP A4(EuHFl׈U)mۘESӊlzJQm+0>b5kD蹚]LI:jeX=.2&s !taߨY_< 4>A4(EРEK로HK1yC^ X#{yQ{ #QDѵEXS[1)D2zXխi @OuQ>Á A4(EРA"hP"q]RN$2P^ E{~(\ZymY-1iF؞? bнI%F"V5RKJ534mM, G6BP A4(EРA"hP A4<ʕV9.RrKHӾmzG*n0ߖȎȎBA4Hݶ ׈Y\i-)C"V-KG+#G]o88EA"hP A4(EРA"hP @$@Y^i̼3{F׽nVHxX[dG|$ H$"G|@@˒G]IENDB`Chart-2.4.6/doc/LaTeX/Aufbau.png0000644000175000017500000001403707763635566015605 0ustar reinerreinerPNG  IHDR G/ pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?(`Qi4F(`F(`F(`F(`F(`F(`b Q0Q@<Ѻa( FǔF(`F(`F(`F(`F(`]4 fty(4Z70k`1Z=Q@E@cJ`Q0 @FpȃNȝ R:%pep5X1Q0@ `8Th5DZƬ9Fcg Q@u(=4@dqLjK=he0 Ѻa =@p.`;`F0U (5hcL@Fp9'G(X@ `8XDj!F| htLi B3WbeRπQ0 =evki8 YF( (`t@u(`t@u(P( FQ0 F( FQ0 F( FQ0 F( FQ0 F( FQ0 F( FE0z8(hn0k1Q0rGQ0 pF(`F4`G(p@u(`t@u(Ѯ(@ `Q0 @ `DwF``4Z7Q0 F(@4m :Q0 F~(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@,T1q4(Gv u @,߉pz>\F#S`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Q FFFb "R֑` @{G(N X1V@FJcxw&Fwᑌq%TH@d @u(Ԇb@)Q0 FFPeHh{pQ0 hhH hsxnU F+Q0 FI*!eQ+i5A7ZQ0ȫJ%zu}G`R Q0 z\(G(C 4uLUï$N(ɘs4Z7 Q0g@1 @SmfoZ(`$s4Fh$za1AdA-F{-Q0xZ94Z 4:0 F -}=2oa&-1@ }ì53ףa; m ޷aж9FhmFQ0JF ãQ@<9Ѩ@uUaț}bsX .tƵ{0^92U5ĐNQPa~ ^ \8PMZ$'zr?*B&@P1>wd Ti@2CieH!ѡ) @Cr AA>[G(CАoO"rEa00 F@ uJ溷,>FHɅT9>q -@kXI.4iTt`1J.FQ@Ϋ1[ôȭBދF{ Q0 ^!a=2֥i >k΁:O= !]Ș҈*+GNO*@P=?=;o[T t[lF }خnD\`cX| k ;ZrQjz;J!^BȠ[OZ6=#d H=w#p1MBȠCdbwl$dA[4s! Z0cþ=-a7;S-.V4EGd{vT>_E u4w h̎!݄u?}@ *M{: )  IE ad50?C-@,?&0~qV.H^%4 t_a9Hs7e-[ @Cn: v4}phsvZõ,b]d :oM,_i5h"ǔ׈=]~QGc}~BH%꣍Zgщ^L?{`@EY @,#Qx a*@ XM`Q@aoj5G 9@T8ko@nXst_4]Z Gw1 eșI'ːK) rQZR;G>c"kÂ>e @=Z?W1;5y8ke<@P+Vk5cJ4jh {H(+p\(;t=@ D@垴>q0\zNc,#m1s} XF(Qj@6 -kj B@,`ewaDu:[[kzǦC Xb"Eޖ0@W΍Q0t3@ g< XbGsԐWK]=B2@ ТQ@,C:JA~GԀD +߆ @Ep=%$I9f:i6F݂5 Xb"s@ӧToc$A#ahhoFªoAptwty-ːo`4_ ̀.3ZߏEtp5O~'*û;846eHG<=0m5VV\J@ ň/PFnNh?i$'.0=FXF) F[d.$6Αp5F yJ_iGT c$ih" wHa  FǔF{#D!:, d,݆\oyN(bc@7>\( F놑;0zh= F.@d.vy{و9G( Z 4Liݰ첌wp V\(-A{`PhtazQ0<8Toh0 FQ0<8TO4:= Fp&:0= F( FǔFrn9 F FQ0nFhH@u(^ЎQ0sT FzQ0 Acfh0 F((`FnQ0 Fs FQ`4hhtaQ0 F:ѺaQ0 F:1Q0:= F(@4Z7j`QhtLiQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F: z0-nQ0 Fa@.֍;D+ZԳ48z(`4@ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @y3 IENDB`Chart-2.4.6/doc/LaTeX/error.png0000644000175000017500000000310107763635576015522 0ustar reinerreinerPNG  IHDR,PLTEBKIDATx 9&'wD6Z$h潪I2tc(((NYb6k}Qk]@j?fdF`q Lf.;6qv+s1-wѴG@iAi \' tE8!ZEQEQG))-)5 ף=;CN7";wR Qih,tA\(hDMD" q~&#A& "H~Ԅ Aɏ0$ QF$?jH GM D +.An]79MFGdw̓k1ìn=ii2sLϞt0zo$uKE% EQ $HQT. R KE% EQ $HQT\nimzEFl5D7fD *[T - 䆎RR@NMY.yjH^g7/ydxB$ȶ:2~%ADwI](*At)Je+ 򩿦Asɏ3AV\d 3#AYqyr TRJ1ߖմj[&L!o_ )#vvs0ZUg $L zoEI$HQT. R KE% EQ $HQԭ.;u v* [E@RAnAN<՛+XPY bHS,x2CBw7]fAdeAeb3Q4Sdf8D){ddRoqAgA"DԺK`}G?蔆G7@KiQt&T>>e:u y2 jT."MJ5" ̀ꏟD#k4|n>D\'t@`ae$mψ'>"҄6H5 M-K$4jX75qLl\%Z  A/R^6|8GA'^[ a3[qb+nZaA7P/X;i&he~ОhìAw:#R;dς$G~Zp(Mը­$Dw= YAj-*At)J%ADwI](*At)Je *KAiq5|hUZ6l2tqAe dWwiQ(J\g{=0'0x| Yi(%'nbEAqcy \ϣg1ʳtڥu#$ HGEhMzPs][D<k}{ur&d1꼔\-@1rXnME:[@6nٗq̒x'.wGO;Q5 JϏ=g(m.)((((-Rp4. IENDB`Chart-2.4.6/doc/LaTeX/d_linesp2.png0000644000175000017500000001314507763635574016257 0ustar reinerreinerPNG  IHDRX,ХPLTEĶ IDATxM{: 3u幽Np&3C'\JR1N:GFH/UȒ%K,Ydɒ%K,Yd2AY.+/=IYw|XƤԿelWXZE=u`Mb.?H{ vau)f|`- ^+f 0Ak`Mgz1/mR!*Dsk[,= J!%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ ޒ|䎒/Rr^tO"&gL>n6lM'{W%Lk%q4\[z<O 5Uχet#^]\Z,' ȓ|<,6X *X#TYF)jdw3%yk ',(ʉ``=<ğʀ2n] :V$YO~nh "VAmafpR7j_Xr Ӄ`=FjDXZ1@bJc횙r 86`#!GZ"iL`.quˊx`٘OcWU`x6O㦹ΛKY*’+˘!P^Ϛ$w1/{~]:QF=i4cϺ!,=<قϨlH(,e>OdI\,=|j \#@XL. K6ݬ'W6Co=3l`"zJd}Շ`jxLүsU=?ճa,}Ғ-fąŢqXPf8jhV6 d墮"4}kP6uZom13$,2õJxCmEl§zCK@X,&bA-/  U5Kek Ćo?L l| ,M}C ~6^yLA)/CN*//T-Vz;uVtbp X<5oZV.aTʿuqX8k~@Շj݀F[kbP% (8,2ǁikɎ# ^)X QHfr!`|DDqc`Yw_VKe>+?/T2H.5O^fdGɰa:!1;nKOKMXMN8`;²V{,lJ\tU\,Lnsf^ >,V̰KM3]4ZhE@2HA,lH$>VR.90,a`ްh4,@'],OÊya[a2, lowr<`׋‚!CW-@ۥ(hlKcVK"26#wv4Gy>YgJvj1L !T+ZF- ;kF;Fe>//iyVviY"EkL)c_ravX՟{y6H^erg|EaA[p,~ޜb񒆫aaˊ&^hmWN|Ƒ2`gjo>ߡ(%NoN| Ca,~ܷ/Xw+;tQjCUX٤̀tjn1w2WPAuWD kKfقdxI\& &e34^}oPKtJÚXb, V ' A{r!)̇E:U +hR0C7 3È:᫺/zٌ!,hekr/Ig"34Cgq:RLӝ2  jEY,/ųsJkLCaNiWLtˍ ͂> 34 mVyi}" K^ to5sX+LJZ ?zCf ?ay ͂Z۷˄j$.9MoX遚yg]P Jioꊻh>UQ7qn~:XVz ``ݠjl T _`Zljr- :hVcSW/XZjV0˄P4 PKJxJ쾹,ZJRȮ+G]bf|jnK ƿ}KrΰDX6X{{ΞDz+hvU}f榮NJ KQֹ}gx.zòH8LŠqbÊmN;g5b[C_-qXpV}b~^k^AXxq}&_WU ! ,i;MLW_s`7VË;x`77ύ:Xa.old5&:&-֔ܐ(v |@}E[``U|ܐ U5,߬Ӱ\o9`쏹ZsZ fC~.ț9,?",?v#=;6FY;c"] "",[* @Xٚ`GFm ]``ͩ7   \eGTxX)N;X!-2,UF:PX}IGZḲ,ڨQ1X{&`e3lE~9ƿvt+y` a=[*^"gw XۈK97 ݲ/ w$^ X8NA/Y>V>`- : d)XoVpz=Va sA/q3X&a Sq;w[ !l(ƿUƱl ݱ'9f%pԖ-Y/6!cAV8 Z7ae'Qa"xB0gAցL:\,u{`>xڃ28a=(Ԫ;XVK$zpX&V&"; Ed/XVnVdp\OX`!&#&6$Xu,`fx6H*‚ qmֹbct彰 %"7=~r08[/ K/˟^_ ؃ɰ,[%gW;[#,Ik]=X\)yyh$엯#cI$|UX֡qʑiB'[Xܑ6i?.+ ,ID^We:ahXa^\K[po0, ck^Ӱİ߽ O ~VpvI7X`f_MX8X]a`-"{ezJc*d+| V0H6c.d,/L(,Jlɺ 53luH" >ȖX|+]") X`+7,v7/߰Ӄs`yVoXIaWaV䰱hd,S+bOa%6>` ;,2IН9(8',aE!,Nḡ`-`Xc*_O V3R &X¿a àה`]an ? SELPz vM :9Ӻ*U[wP[<)X};|I|riҙf Wȟj 5Tӂť3,/<gRAf`>k굊o2V h24,>gD)2NpWSATV jr2$a)RVß'aV 'bPM5v6R+RzW{5dHJaOӖ?]˨갲dɒ+ kRRz]3(U^Pf zK)ߒr+6. K'c. -6'YpObir]< ^m_0],]Dd3[~,ݻ̧cp9AWJ2+bR̐, q.]ĭ%X"MQ7e+,i7_T33XKij hլ?`Yj*\.eXb7z@4CVȜC<( Ęk5tۏ}ReuO^V,Ydɒ%Kw[YPDʰߚM Y:I ra,Q7JnQ"7w/ jE.-(,v/e Y^ۈk%^r7u)ci̒%K,Ydɒ%K,Ydɒ%K,Yd2#hIENDB`Chart-2.4.6/doc/LaTeX/Mountain.tex0000644000175000017500000000231310735744465016172 0ustar reinerreiner% % mountain.tex % \renewcommand{\thisname}{Chart::Mountain} \section{\thisname} \name{\thisname} \file{Mountain.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a mountain chart, \ie, the individual data sets are stacked and the areas under the curves are colour filled. The first data set will be shown at the top of the stack, the last at the bottom. \thisclass is a subclass of Chart::Base. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale =0.6]{mountain.png} \end{center} \caption{Mountain chart} \label{fig:mountain} \end{figure} \begin{verbatim} use Chart::Mountain; $g = Chart::Mountain->new(); @data = [ [1910, 1930, 1950, 1970], [1, 3, 4, 2], [2, 4, 3, 3], [0.5, 1, 2, 1]]; $g->set('title' => 'Mountain Chart', 'grid_lines' => 'false', 'precision' => 1); $g->png("mountain.png", @data); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/stackedbars.png0000644000175000017500000000326007763635604016655 0ustar reinerreinerPNG  IHDR,PLTE'VIDATx](dݾ:r鵜@??FQ!gXEqLJAAA?PR2'B?|29=XU2}ᱫ݊ Æmv.k+#Qcbc[1 ]U)~CQ)Ǹ~[9 JzH9l JqbSL@tLذ YjIOv=6oqmLAA97m )jخ^Z DBɌՃȲv }B 3[/TR5|ms?*)HXmNG d@IH& d@B%*O>PŎ)E<\R](ܧ۷{[@lEWEoXmNG d@IH& dRr6Wiʳ(r6҂PlQiA[TfMN4Je(=)$L@2 ɤ_1VȟLl@2))ȕIA,MAgFr׹oVDeOZ KT1-:@ @Z/ $R.[H$e R@TEEk]gjg<Ѳ\6>(M{lk@ HFԕ68im,sux_1HldB/˺L[Q"[;{2I>Yy3W@vp;4c=`#Gwc%] ; qolG~ 9C$~Jsn]ߘJ^AA-t_:rY&@J@JOivA;xv]pqvS߱ݠ?fe7h=پ{'@%H; Od!>b/1qmnB?T MG~ibv<|U;WnnqӇ9WnqȻan=Ojw Ț @١F/k2 @ o}q{Y/kd}*1 Q P&2J 7Bk ehR뵆24- se^`gi_XQ+;M{ň\&Mt~ @J@J@Jӏ:UW >-td3IENDB`Chart-2.4.6/doc/LaTeX/ErrorBars.tex0000644000175000017500000001006410735744573016303 0ustar reinerreiner% % error.tex % \renewcommand{\thisname}{Chart::ErrorBars} \section{\thisname} \name{\thisname} \file{ErrorBars.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a point chart with error bars. This class expects the error values within the data array. By use of the \methoduse{add\_dataset()} method the error values are the next two sets after the $y$ values. The first set after the $y$ values has to be the set of values for the upper error bounds. The next set is the array of the lower error bounds. Note that the error values are not specified absolutely but rather as offsets from the $y$ value: the upper error values will be added to the $y$ values, the lower error values will be subtracted. If you want to use the same value for the upper and lower error, you can set the \attruse{same\_error} option to \literal{true}. In this case only the set after the $y$ values is interpreted as a set of errors. Of course, it is also possible to use the \methoduse{add\_pt()} method in the appropriate way to achieve the same results. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.7]{error.png} \end{center} \caption{Error bars chart} \label{fig:error} \end{figure} \begin{verbatim} use Chart::ErrorBars; $g = Chart::ErrorBars->new(); # the x values $g->add_dataset(qw(1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5)); # the y values $g->add_dataset(qw(1 1.1 1.2 1.1 1.14 1.15 1.26 1.2 1.1 1.19 1.2 1.4 1.6 2.0 2.5 3.1)); # the upper errors $g->add_dataset(qw(0.4 0.1 0.2 0.1 0.14 0.15 0.26 0.27 0.1 0.19 0.2 0.1 0.1 0.2 0.1 0.3)); # the lower errors $g->add_dataset(qw(0.2 0.11 0.12 0.11 0.2 0.3 0.12 0.27 0.11 0.3 0.2 0.2 0.2 0.1 0.1 0.2)); $g->set( 'xy_plot' => 'true', 'precision' => 1, 'pt_size' => 10, 'brush_size' => 2, 'legend' => 'none', 'title' => 'Error Bars Demo', 'grid_lines' => 'true' ); $g->png("errorbars.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{brush\_size} Sets the width of the lines in pixels. Default is 6. \end{AttrDecl} \begin{AttrDecl}{pt\_size} Sets the radius of the points in pixels. Default is 18. \end{AttrDecl} \begin{AttrDecl}{same\_error} Tells \thisclass that you want to use the same values for upper and lower error bounds if set to \literal{true}. Then you have to add just one set of error values. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted. Defaults to \literal{false}. \end{AttrDecl} \attrdecl{xlabels} \begin{AttrDecl}{xrange} This pair of options allows arbitrary positioning of $x$ axis labels. The two options must either both be specified or both be omitted. \attruse{xlabels} is a reference to 2-element array. The first of the elements is a nested (reference to an) array of strings that are the labels. The second element is a nested (reference to an) array of numbers that are the $x$ values at which the labels should be placed. \attruse{xrange} is a 2-element array specifying the minimum and maximum $x$ values on the axis. \Eg, \begin{verbatim} @labels = (['Jan', 'Feb', 'Mar'], [10, 40, 70 ]); $chart->set(xlabels => \bs @labels, xrange => [0, 100] ); \end{verbatim} \end{AttrDecl} \begin{AttrDecl}{xy\_plot} Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true}, \ie, to treat the $x$ axis as numeric. Very useful for plots of mathematical functions. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/HorizontalBars.tex0000644000175000017500000000313610735744604017340 0ustar reinerreiner% % hbars.tex % \renewcommand{\thisname}{Chart::HorizontalBars} \section{\thisname} \name{\thisname} \file{HorizontalBars.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a chart of horizontally oriented bars. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.7]{d_hbars4.png} \end{center} \caption{Chart with horizontal bars} \label{fig:hbars} \end{figure} \begin{verbatim} use Chart::HorizontalBars; $g = Chart::HorizontalBars->new(); $g->add_dataset('Foo', 'bar', 'junk', 'ding', 'bat'); $g->add_dataset(4, 3, 4, 2, 8); $g->add_dataset(2, 10, 3, 8, 3); %hash = ( 'title' => 'Horizontal Bars Demo', 'grid_lines' => 'true', 'x_label' => 'x axis', 'y_label' => 'y axis', 'include_zero' => 'true', 'x_ticks' => 'vertical', ); $g->set(%hash); $g->png("hbars.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{skip\_y\_ticks} Does the same fo the $y$ axis in a horizontal chart as \attruse{skip\_x\_ticks} does for other charts. Defaults to 1. \end{AttrDecl} \begin{AttrDecl}{spaced\_bars} Leaves some space between each group of bars when set to \literal{true}. This usually make it easier to read a bar chart. Default is \literal{true}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/Base.tex0000644000175000017500000005316512020722517015244 0ustar reinerreiner% % Base.tex % \renewcommand{\thisname}{Chart::Base} \section{\thisname} \name{\thisname} \file{Base.pm} \requires{GD, Carp, FileHandle} \begin{Description} \thisclass is the abstract superclass of classes \class{Chart::Bars}, \class{Chart::Composite}, \class{Chart::Direction}, \class{Chart::ErrorBars}, \class{Chart::HorizontalBars}, \class{Chart::Lines}, \class{Chart::LinesPoints}, \class{Chart::Mountain}, \class{Chart::Pareto}, \class{Chart::Pie}, \class{Chart::Points}, \class{Chart::Split}, and \class{Chart::StackedBars}. Class \thisclass provides all public methods and most of the attributes of \chart objects. \end{Description} \begin{Constructor} An object instance of class \class{Chart} can be created with the constructor \methoduse{new()}:\index{Methods!new()} \begin{SmallExample} \$obj = Chart::\textit{Type}\deref new();\\ \$obj = Chart::\textit{Type}\deref new(\parameter{width}, \parameter{height}); \end{SmallExample} \textit{Type} here denotes the type of chart that is to be returned, \eg, \methoduse{Chart::Bars\deref new()} returns a bar chart. If \methoduse{new()} is called without arguments, the constructor will return an object of size 300\ensuremath{\times}400 pixels. If \methoduse{new()} is called with two arguments, \parameter{width} and \parameter{height}, it will return a \chart object of the desired size. \end{Constructor} \Methods\label{methods}\noindent% \methoduse{\$obj\deref add\_dataset(\parameter{@array})}{\index{Methods!add\_dataset()}}\\ \begin{MethDecl}{\$obj\deref add\_dataset(\parameter{\bs @array\_ref})}{add\_dataset()} Adds a dataset to the object. The argument is an array or a reference to an array. Generally, the first array added is interpreted as being the $x$ tick labels. The subsequent arrays contain the data points. \Eg, after the calls\\ \methoduse{\$obj\deref add\_dataset('Harry', 'Sally');}\\ \methoduse{\$obj\deref add\_dataset(5, 8);}\\ \chart will draw a picture with two bars and label them `Harry' and `Sally'. Some modules will operate slightly differently. Have a look at the description of the specific subclass to get more information. Such differences will also come up if you want to use the \texttt{xy\_plot} option in order to create a $x$--$y$ graph. \end{MethDecl} \methoddecl{\$obj\deref add\_pt(\parameter{@array})}{add\_pt()} \begin{MethDecl}{\$obj\deref add\_pt(\parameter{\bs @array\_ref})}{add\_pt()} This is a different method for adding data to a \chart object. The argument can be an array or a reference to an array. If you use this method, \chart wants the complete data of one data point, \ie, all the data that are associated with the same $x$ value specified first in this call. \Eg,\\ \methoduse{\$obj\deref add\_pt('Harry', 5);}\\ \methoduse{\$obj\deref add\_pt('Sally', 8);}\\ would create the same graph as the example for \methoduse{add\_dataset()} above. \end{MethDecl} \methoddecl{\$obj\deref add\_datafile("\parameter{filename}", \textit{type})}{add\_datafile()} \methoddecl{\$obj\deref add\_datafile(\parameter{\$filehandle}, \textit{type})}{add\_datafile()} \begin{MethDecl}{\$obj\deref add\_datafile()}{add\_datafile()} This method adds the contents of a complete data file to the chart object. \textit{type} can be \literal{set} or \literal{pt}. In the former case, \literal{set}, each line in the data file must represent a complete data set (\emph{data series}). The values of the set must be separated by whitespace. \Eg, the file contents could look like this: \begin{quote} \texttt{Harry Sally}\\ \texttt{3 8}\\ \texttt{2 1} \end{quote} If the argument is \literal{pt}, the lines of the file must look analogous to the parameter arrays used by method \methoduse{add\_pt()}: Each line includes all the values of one data point (\ie, all the $y$ values associated with the same $x$ value), also separated by whitespace. \Eg: \begin{quote} \small \texttt{Harry 3 2}\\ \texttt{Sally 8 1} \end{quote} \end{MethDecl} \begin{MethDecl}{\$obj\deref get\_data()}{get\_data()} If you want a copy of the data that have been added so far, make a call to this method like so:\\ \methoduse{\$dataref = \$obj\deref get\_data();}\\[\itemabstand] This will return a reference to an array of references to datasets. For example, you can get the $x$ tick labels by:\\ \methoduse{@x\_labels = @\{\$dataref->[0]\};} \end{MethDecl} \begin{MethDecl}{\$obj\deref clear\_data()}{clear\_data()} This is the method to remove all data that may have been entered until now. \end{MethDecl} \methoddecl{\$obj\deref set(\parameter{attribute$_1$} \fatcomma \parameter{value$_1$}, \ldots, \mbox{\parameter{attribute$_n$} \fatcomma \parameter{value$_n$}})}{set()} \methoddecl{\$obj\deref set(\parameter{\%hash})}{set()} \methoddecl{\$obj\deref set(\parameter{attribute1}, \parameter{value$_1$}, \ldots, \mbox{\parameter{attribute$_n$}, \parameter{value$_n$}})}{set()} \begin{MethDecl}{\$obj\deref set(\parameter{@array})}{set()} Use this method to change the attributes of the chart object. \methoduse{set()} looks for a hash of keys and values or an array of keys and values. \Eg,\\ \methoduse{\$obj\deref set('title' \fatcomma 'The title of the image');}\\ would set the title. This would do the same job:\\ \methoduse{\%hash = ('title' \fatcomma 'The title of the image');}\\ \methoduse{\$obj\deref set(\%hash);} \end{MethDecl} \methoddecl{\$obj\deref png("\parameter{filename}")}{png()} \methoddecl{\$obj\deref png(\$\parameter{filehandle})}{png()} \methoddecl{\$obj\deref png(\parameter{FILEHANDLE})}{png()} \methoddecl{\$obj\deref png("\parameter{filename}", \parameter{\bs@data})}{png()} \begin{MethDecl}{\$obj\deref png()}{png()} This method creates a \textsc{png} file. The file parameter can be a file name, a reference to a filehandle or a filehandle itself. If the file does not exist, \chart will create it for you. If there is already a file, \chart will overwrite it. In case of an error, the file is not created.\\ You can also add data to a \chart object through its \methoduse{png()} method. The \parameter{@data} array should contain references to arrays of data, with the first array reference pointing to an array of $x$ labels. \parameter{@data} might look like this:\\ \methoduse{@data = (['Harry', 'Sally'], [5, 8], [50, 80]);}\\ This would set up a graph with two datasets and three data points in these sets. \end{MethDecl} \methoddecl{\$obj\deref jpeg("\parameter{filename}")}{jpeg()} \methoddecl{\$obj\deref jpeg(\parameter{\$filehandle})}{jpeg()} \methoddecl{\$obj\deref jpeg(\parameter{FILEHANDLE})}{jpeg()} \methoddecl{\$obj\deref jpeg("\parameter{filename}", \bs@data)}{jpeg()} \begin{MethDecl}{\$obj\deref jpeg()}{jpeg()} This is the method to create \textsc{jpeg} files. It works analogously to the \methoduse{png()} method. \end{MethDecl} \methoddecl{\$obj\deref cgi\_png()}{cgi\_png()} \begin{MethDecl}{\$obj\deref cgi\_jpeg()}{cgi\_jpeg()} With the \textsc{cgi} methods you can create dynamic images for your web site. The \textsc{cgi} methods will print the chart along with the appropriate \textsc{http} header to \textsc{stdout}, allowing you to call chart-generating scripts directly from your \textsc{html} pages (\eg, with a \literal{$\langle$img src="image.pl" /$\rangle$} \textsc{html} tag). \end{MethDecl} \begin{MethDecl}{\$obj\deref imagemap\_dump()}{imagemap\_dump()} \chart can also return pixel position information so that you can create image maps from the files generated by \chart. Simply set the \literal{imagemap} option to \literal{true} before you generate the file, then at the end call the \methoduse{imagemap\_dump()} method to retrieve the information. A structure will be returned almost identical to the \parameter{@data} array described above to pass the data into \chart. \methoduse{\$imagemap\_data = \$obj\deref imagemap\_dump();} Instead of single data values, references to arrays of pixel information are passed. For the classes \class{Chart::Bars}, \class{Chart::HorizontalBars}, \class{Chart::Pareto} and \class{Chart::StackedBars}, the arrays will contain two $x$--$y$ pairs (specifying the upper left and the lower right corner of the bar). Compare to: \\ \methoduse{(\$x1,\$y1,\$x2,\$y2) = @\{\$imagemap\_data\deref [\$dataset][\$datapoint]\};} For the classes \class{Chart::Lines}, \class{Chart::Points}, \class{Chart::LinesPoints} and \class{Chart::Split}, the arrays will contain a single $x$--$y$ pair (specifying the center of the point). Compare to:\\ \methoduse{(\$x, \$y) = @\{\$imagemap\_data\deref [\$dataset][\$datapoint]\};} A few caveats apply here. First of all, \chart uses the GD module by Lincoln Stein to draw lines, circles, strings, and so on. GD treats the upper-left corner of the \textsc{png}/\textsc{jpeg} image as the reference point, therefore, positive $y$ values are measured from the top of the image, not from the bottom. Second, these values will mostly contain long decimal values. GD, of course, has to truncate these to integer pixel coordinates. In a worst-case scenario, this will result in an error of one pixel on your imagemap. If this is really an issue, your only option is to experiment with it, or to contact Lincoln Stein and ask him. Third, please remember that the $0^{th}$ dataset will be empty, since that is the place for the data point labels on the $x$ axis. \end{MethDecl} \Attributes\label{options}% These are the options which take effect on most \chart types. There are three different kinds of attributes: \begin{itemize} \item attributes expecting a number for value (\eg, the number of pixels), \item attributes expecting a textual value (\eg, the title of the chart), \item attributes expecting a Boolean value. \end{itemize} Before Version 2.5 of the module, the Boolean value \literal{true} was represented by the string \texttt{'true'}, and the Boolean value \literal{false} was represented by the string \texttt{'false'}. For all other values, the Boolean value was not well-defined. From version 2.5 onwards, the Boolean value \literal{true} may be represented by any of \texttt{1}, \texttt{'t'} and \texttt{'true'}, where case does not matter. From version 2.5 onwards, the Boolean value \literal{false} may be represented by any of \texttt{0}, \texttt{'f'}, \texttt{'false'}, and \texttt{undef}, where case does not matter. For all other values, the Boolean value is again not well-defined. Note that this behaviour is closer to the standard Perl way but is not identical, due to the need for backward compatibility in this module. \begin{AttrDecl}{transparent} Makes the background of the image transparent if set to \literal{true}. Useful for making web page images. However, it does not seem to work for all browsers. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{png\_border} Sets the number of pixels used as a border between the graph and the edges of the image. Defaults to 10. \end{AttrDecl} \begin{AttrDecl}{graph\_border} Sets the number of pixels used as a border between the title/labels and the actual graph within the image. Defaults to 10. \end{AttrDecl} \begin{AttrDecl}{text\_space} Sets the amount of space left on the sides of text, to make it more readable. Defaults to 3. \end{AttrDecl} \begin{AttrDecl}{title} Tells \chart what to use for the title of the graph. If empty, no title is drawn. \literal{\bs\bs} is treated as a newline. If you want to use normal quotation marks instead of single quotation marks, remember to quote (\literal{\bs\bs\bs\bs}) to get a linebreak. Default is empty. \end{AttrDecl} \begin{AttrDecl}{sub\_title} Writes a subtitle under the title in smaller letters. \end{AttrDecl} \begin{AttrDecl}{x\_label} Tells \chart what text to use as a label for the $x$ axis. If empty, no label is drawn. Default is undef. \end{AttrDecl} \attrdecl{y\_label} \begin{AttrDecl}{y\_label2} Tells \chart what kind of label should be used for the description of the $y$ axis on the left or the right side accordingly. If empty, no label is drawn. Default is undef. \end{AttrDecl} \begin{AttrDecl}{legend} Specifies the placement of the legend. Valid values are \literal{left}, \literal{right}, \literal{top}, \literal{bottom}, and \literal{none}. Choosing \literal{none} tells \chart not to draw a legend. Default is \literal{right}. \end{AttrDecl} \begin{AttrDecl}{legend\_labels} Sets the values for the labels for the different datasets. Should be assigned a reference to an array of labels. \Eg,\\ \methoduse{@labels = ('foo', 'bar')};\\ \methoduse{\$obj->set ('legend\_labels' \fatcomma \bs @labels);}\\ Default is empty, in which case \literal{Dataset 1}, \literal{Dataset 2}, etc. are used as labels. \end{AttrDecl} \begin{AttrDecl}{tick\_len} Sets the length of the $x$ and $y$ ticks in pixels. Default is 4. \end{AttrDecl} \begin{AttrDecl}{x\_ticks} Specifies how to draw the $x$ tick labels. Valid values are \literal{normal}, \literal{staggered} (labels are drawn alternatingly close to the axis and further away from it), and \literal{vertical} (label texts are rotated 90 degrees counter-clockwise). Default is \literal{normal}. \end{AttrDecl} \begin{AttrDecl}{y\_ticks} The number of ticks to plot on the $y$ scale, including the end points. \Eg, for a $y$ axis ranging from 0 to 50, with ticks every 10 units, \attruse{y\_ticks} should have a value of 6. \end{AttrDecl} \begin{AttrDecl}{min\_y\_ticks} Sets the minimum number of $y$ ticks to draw when generating the $y$ axis. Default is 6, minimum is 2. \end{AttrDecl} \begin{AttrDecl}{max\_y\_ticks} Sets the maximum number of $y$ ticks to draw when generating the $y$ axis. Default is 100. This limit is used to avoid plotting an unreasonably large number of ticks if non-round values are used for \attruse{min\_val} and \attruse{max\_val}. The value for \attruse{max\_y\_ticks} should be at least 5 times as large as \attruse{min\_y\_ticks}. \end{AttrDecl} \attrdecl{min\_x\_ticks} \begin{AttrDecl}{max\_x\_ticks} These work similar to \attruse{max\_y\_ticks} and \attruse{min\_y\_ticks}, respectively. Of course, this applies only to $x$--$y$ plots. \end{AttrDecl} \begin{AttrDecl}{integer\_ticks\_only} Specifies how to draw the $x$ and $y$ ticks: as floating point (\literal{false}, \literal{0}) or as integer numbers (\literal{true}, \literal{1}). If you want integer ticks, it may be better to set the attribute \attruse{precision} to zero. Default: \literal{false} \end{AttrDecl} \begin{AttrDecl}{skip\_int\_ticks} If \attruse{integer\_ticks\_only} was set to \literal{true} the labels and ticks for the $y$ axis will be drawn every $n^{th}$ tick. (Note that in \class{Chart::HorizontalBars} the $y$ axis runs horizontally.) Defaults to 1, \ie, no skipping. \end{AttrDecl} \begin{AttrDecl}{precision} Sets the number of digits after the decimal point. Affects in most cases the $y$ axis only. In $x$--$y$ plots also affects the $x$ axis, and in pie charts the labels. Defaults to 3. \end{AttrDecl} \begin{AttrDecl}{max\_val} Sets the maximum $y$ value on the graph, overriding normal autoscaling. Does not work for \class{Chart::Split} charts. Default is undef. \end{AttrDecl} \begin{AttrDecl}{min\_val} Sets the minimum $y$ value on the graph, overriding normal autoscaling. Does not work for Split charts. Default is undef. Caution should be used when setting \attruse{max\_val} and \attruse{min\_val} to floating point or non-round numbers: The range must start and end on a tick, ticks must have round-number intervals and must include round numbers.\\ Example: Suppose your dataset has a range of 35\ldots 114 units. If you specify these values as \attruse{min\_val} and \attruse{max\_val}, respectively, the $y$ axis will be plotted with 80 ticks, so one at every unit. Without specification of \attruse{min\_val} and \attruse{max\_val}, the system would autoscale the range to 30\ldots 120 with 10 ticks every 10 units. If \attruse{min\_val} and \attruse{max\_val} are specified to excessive precision, they may be overridden by the system, plotting a maximum \attruse{max\_y\_ticks} ticks. \end{AttrDecl} \begin{AttrDecl}{include\_zero} If \literal{true}, forces the $y$ axis to include zero even if it is not in the dataset range. Default is \literal{false}. -- Note: It is better to use this option than to set \attruse{min\_val} if this is all you want to achieve. \end{AttrDecl} \begin{AttrDecl}{skip\_x\_ticks} Sets the number of $x$ ticks and $x$ tick labels to skip. (\Ie, if \attruse{skip\_x\_ticks} were set to 4, \chart would draw every $4^{th}$ $x$ tick and $x$ tick label). Default is undef. \end{AttrDecl} \begin{AttrDecl}{custom\_x\_ticks} This option allows you to specify exactly which $x$ ticks and $x$ tick labels should be drawn. It should be assigned a reference to an array of desired ticks. Just remember that we are counting from the $0^{th}$ element of the array. (\Eg, if \attruse{custom\_x\_ticks} is assigned [0,3,4], then the $0^{th}$, $3^{rd}$, and $4^{th}$ $x$ ticks will be displayed) This does not apply to \class{Chart::Split}, \class{Chart::HorizontalBars} and \class{Chart::Pie}. \end{AttrDecl} \begin{AttrDecl}{f\_x\_tick} Needs a reference to a function which accepts the $x$ tick labels generated by \parameter{\$data\deref [0]} as its argument. This function should return a reformatted version of the label as a string. \Eg\\ \methoduse{\$obj\deref set ('f\_x\_tick' \fatcomma \bs\&formatter;})\\ An example for the formatter function: Assume that $x$ labels are seconds since some event. The referenced function could be designed to transform this number of seconds to hours, minutes and seconds. \end{AttrDecl} \begin{AttrDecl}{f\_y\_tick} Similar to \attruse{f\_x\_tick}, but for $y$ labels. \end{AttrDecl} \begin{AttrDecl}{colors} \label{colors} This option lets you control the colors the chart will use. It takes a reference to a hash. The hash should contain keys mapped to references to arrays of \textsc{rgb} values. E.g.,\\ \methoduse{\$obj->set('colors' \fatcomma \{'background' \fatcomma [255,255,255]\});}\\ sets the background color to white (which is the default).\\ Another possibility is to use named colors like 'red', 'blue'. The possible list of named colors can be found in chapter \ref{app:colors}, page \pageref{app:colors}.\\ Valid keys for this hash are \begin{itemize} \item \literal{background} (background color for the chart) \item \literal{title} (color of the title) \item \literal{text} (all the text in the chart) \item \literal{x\_label} (color of the $x$ axis label) \item \literal{y\_label} (color of the primary $y$ axis label) \item \literal{y\_label2} (color of the secondary $y$ axis label) \item \literal{grid\_lines} (color of the grid lines) \item \literal{x\_grid\_lines} (color of the $x$ grid lines -- on $x$ axis ticks) \item \literal{y\_grid\_lines} (color of the $y$ grid lines -- on primary $y$ axis ticks) \item \literal{y2\_grid\_lines} (color of the y2 grid lines -- on secondary $y$ axis ticks) \item \literal{dataset0} \ldots \literal{dataset63} (the different datasets) \item \literal{misc} (everything else, \eg, ticks, box around the legend) \end{itemize} NB. For composite charts, there is a limit of eight datasets per component. The colors for \literal{dataset8} through \literal{dataset15} will be the same as those for \literal{dataset0} through \literal{dataset7} for the second component chart. \end{AttrDecl} \begin{AttrDecl}{title\_font} This option changes the font of the title line. The value must be a GD font, \eg, \methoduse{GD::Font\deref Large}. \end{AttrDecl} \begin{AttrDecl}{label\_font} This option changes the font of the labels. The value must be a GD font. \end{AttrDecl} \begin{AttrDecl}{legend\_font} This option changes the font for the legend text. The value must be a GD font. \end{AttrDecl} \begin{AttrDecl}{tick\_label\_font} This option changes the font of the ticks. The value must be a GD font. \end{AttrDecl} \begin{AttrDecl}{grey\_background} Puts a nice soft grey background on the actual data plot when set to \literal{true}. This is a flag. If you set this flag to 'false' then you may redefine the background color to a color you like. For further information see chapter \ref{colors} on page \pageref{colors}. Default is \literal{true}. \end{AttrDecl} \begin{AttrDecl}{x\_grid\_lines} Draws grid lines matching up to $x$ ticks if set to \literal{true}. Default is \literal{false}. \end{AttrDecl} \begin{AttrDecl}{y\_grid\_lines} Draws grid lines matching up to $y$ ticks if set to \literal{true}. Default is \literal{false}. \end{AttrDecl} \begin{AttrDecl}{grid\_lines} Draws grid lines matching up to $x$ and $y$ ticks if set to \literal{true}. Default is \literal{false}. \end{AttrDecl} \begin{AttrDecl}{imagemap} Lets \chart know that you are going to ask for information about the placement of the data for use in creating an image map from the chart. This information can be retrieved using the \mbox{\methoduse{imagemap\_dump()}} method. NB. The \methoduse{imagemap\_dump()} method cannot be called until after the chart has been generated (\eg, using the \methoduse{png()} or \methoduse{cgi\_png()} methods). \end{AttrDecl} \begin{AttrDecl}{ylabel2} The label for the secondary (right-hand side) $y$ axis. (In a composite chart, this is the axis for the second component). Default is undef. \end{AttrDecl} \begin{AttrDecl}{no\_cache} Adds \literal{Pragma: no-cache} to the \textsc{http} header. Be careful with this one, since some older browsers (like Netscape~4.5) are unhappy about \textsc{post} using this method. \end{AttrDecl} \begin{AttrDecl}{legend\_example\_size} Sets the length of the example line in the legend. Defaults to 20. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/AppendixRGB.tex0000644000175000017500000010116512033072733016471 0ustar reinerreiner% % AppendixRGB.tex % The list of all defined colors is:\\ white black red green blue orange orange2 orange3 orange4 yellow purple light\_blue light\_green light\_purple pink peach olive plum turquoise mauve brown grey HotPink PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 DarkBlue BlueViolet PeachPuff PeachPuff1 PeachPuff2 PeachPuff3 PeachPuff4 chocolate1 chocolate2 chocolate3 chocolate4 LightGreen lavender MediumPurple DarkOrange DarkOrange2 DarkOrange3 DarkOrange4 SlateBlue BlueViolet RoyalBlue AntiqueWhite AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 AntiqueWhite4 CadetBlue CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 DarkGoldenrod DarkGoldenrod1 DarkGoldenrod2 DarkGoldenrod3 DarkGoldenrod4 DarkOliveGreen DarkOliveGreen1 DarkOliveGreen2 DarkOliveGreen3 DarkOliveGreen4 DarkOrange1 DarkOrchid DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 DarkSeaGreen DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3 DarkSeaGreen4 DarkSlateGray DarkSlateGray1 DarkSlateGray2 DarkSlateGray3 DarkSlateGray4 DeepPink DeepPink1 DeepPink2 DeepPink3 DeepPink4 DeepSkyBlue DeepSkyBlue1 DeepSkyBlue2 DeepSkyBlue3 DeepSkyBlue4 DodgerBlue DodgerBlue1 DodgerBlue2 DodgerBlue3 DodgerBlue4 HotPink1 HotPink2 HotPink3 HotPink4 IndianRed IndianRed1 IndianRed2 IndianRed3 IndianRed4 LavenderBlush LavenderBlush1 LavenderBlush2 LavenderBlush3 LavenderBlush4 LemonChiffon LemonChiffon1 LemonChiffon2 LemonChiffon3 LemonChiffon4 LightBlue LightBlue1 LightBlue2 LightBlue3 LightBlue4 LightCyan LightCyan1 LightCyan2 LightCyan3 LightCyan4 LightGoldenrod LightGoldenrod1 LightGoldenrod2 LightGoldenrod3 LightGoldenrod4 LightPink LightPink1 LightPink2 LightPink3 LightPink4 LightSalmon LightSalmon1 LightSalmon2 LightSalmon3 LightSalmon4 LightSkyBlue LightSkyBlue1 LightSkyBlue2 LightSkyBlue3 LightSkyBlue4 LightSteelBlue LightSteelBlue1 LightSteelBlue2 LightSteelBlue3 LightSteelBlue4 LightYellow LightYellow1 LightYellow2 LightYellow3 LightYellow4 MediumOrchid MediumOrchid1 MediumOrchid2 MediumOrchid3 MediumOrchid4 MediumPurple1 MediumPurple2 MediumPurple3 MediumPurple4 MistyRose MistyRose1 MistyRose2 MistyRose3 MistyRose4 NavajoWhite NavajoWhite1 NavajoWhite2 NavajoWhite3 NavajoWhite4 OliveDrab OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4 OrangeRed OrangeRed1 OrangeRed2 OrangeRed3 OrangeRed4 PaleGreen PaleTurquoise PaleTurquoise1 PaleTurquoise2 PaleTurquoise3 PaleTurquoise4 PaleVioletRed PaleVioletRed1 PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 RosyBrown RosyBrown1 RosyBrown2 RosyBrown3 RosyBrown4 RoyalBlue1 RoyalBlue2 RoyalBlue3 RoyalBlue4 SeaGreen SeaGreen1 SeaGreen2 SeaGreen3 SeaGreen4 SkyBlue SkyBlue1 SkyBlue2 SkyBlue3 SkyBlue4 SlateBlue1 SlateBlue2 SlateBlue3 SlateBlue4 SlateGray SlateGray1 SlateGray2 SlateGray3 SlateGray4 SpringGreen SpringGreen1 SpringGreen2 SpringGreen3 SpringGreen4 SteelBlue SteelBlue1 SteelBlue2 SteelBlue3 SteelBlue4 VioletRed VioletRed1 VioletRed2 VioletRed3 VioletRed4 aquamarine aquamarine1 aquamarine2 aquamarine3 aquamarine4 azure azure1 azure2 azure3 azure4 bisque bisque1 bisque2 bisque3 bisque4 blue1 blue2 blue3 blue4 brown1 brown2 brown3 brown4 burlywood burlywood1 burlywood2 burlywood3 burlywood4 chartreuse chartreuse1 chartreuse2 chartreuse3 chartreuse4 chocolate coral coral1 coral2 coral3 coral4 cornsilk cornsilk1 cornsilk2 cornsilk3 cornsilk4 cyan cyan1 cyan2 cyan3 cyan4 firebrick firebrick1 firebrick2 firebrick3 firebrick4 gold gold1 gold2 gold3 gold4 goldenrod goldenrod1 goldenrod2 goldenrod3 goldenrod4 gray gray1 gray2 gray3 gray4 green1 green2 green3 green4 grey1 grey2 grey3 grey4 honeydew honeydew1 honeydew2 honeydew3 honeydew4 ivory ivory1 ivory2 ivory3 ivory4 khaki khaki1 khaki2 khaki3 khaki4 magenta magenta1 magenta2 magenta3 magenta4 maroon maroon1 maroon2 maroon3 maroon4 orange1 orchid orchid1 orchid2 orchid3 orchid4 pink1 pink2 pink3 pink4 plum1 plum2 plum3 plum4 purple1 purple2 purple3 purple4 red1 red2 red3 red4 salmon salmon1 salmon2 salmon3 salmon4 seashell seashell1 seashell2 seashell3 seashell4 sienna sienna1 sienna2 sienna3 sienna4 snow snow1 snow2 snow3 snow4 tan tan1 tan2 tan3 tan4 thistle thistle1 thistle2 thistle3 thistle4 tomato tomato1 tomato2 tomato3 tomato4 turquoise1 turquoise2 turquoise3 turquoise4 wheat wheat1 wheat2 wheat3 wheat4 yellow1 yellow2 yellow3 yellow4 \vspace{2ex} The following tables will show the named colors, the corresponding RGB values and an example of the colors. \begin{tabular}{|l|c|c|} white & [ 255, 255, 255 ] & \color{white} \rule{1cm}{1.5ex}\\ black & [ 0, 0, 0 ] & \color{black} \rule{1cm}{1.5ex}\\ red & [ 200, 0, 0 ] & \color{red} \rule{1cm}{1.5ex}\\ green & [ 0, 175, 0 ] & \color{green} \rule{1cm}{1.5ex}\\ blue & [ 0, 0, 200 ] & \color{blue} \rule{1cm}{1.5ex}\\ orange & [ 250, 125, 0 ] & \color{orange} \rule{1cm}{1.5ex}\\ orange2 & [ 238, 154, 0 ] & \color{orange2} \rule{1cm}{1.5ex}\\ orange3 & [ 205, 133, 0 ] & \color{orange3} \rule{1cm}{1.5ex}\\ orange4 & [ 139, 90, 0 ] & \color{orange4} \rule{1cm}{1.5ex}\\ yellow & [ 225, 225, 0 ] & \color{yellow} \rule{1cm}{1.5ex}\\ purple & [ 200, 0, 200 ] & \color{purple} \rule{1cm}{1.5ex}\\ light\_blue & [ 0, 125, 250 ] & \color{light_blue} \rule{1cm}{1.5ex}\\ light\_green & [ 125, 250, 0 ] & \color{light_green} \rule{1cm}{1.5ex}\\ light\_purple & [ 145, 0, 250 ] & \color{light_purple} \rule{1cm}{1.5ex}\\ pink & [ 250, 0, 125 ] & \color{pink} \rule{1cm}{1.5ex}\\ peach & [ 250, 125, 125 ] & \color{peach} \rule{1cm}{1.5ex}\\ olive & [ 125, 125, 0 ] & \color{olive} \rule{1cm}{1.5ex}\\ plum & [ 125, 0, 125 ] & \color{plum} \rule{1cm}{1.5ex}\\ turquoise & [ 0, 125, 125 ] & \color{turquoise} \rule{1cm}{1.5ex}\\ mauve & [ 200, 125, 125 ] & \color{mauve} \rule{1cm}{1.5ex}\\ brown & [ 160, 80, 0 ] & \color{brown} \rule{1cm}{1.5ex}\\ grey & [ 225, 225, 225 ] & \color{grey} \rule{1cm}{1.5ex}\\ HotPink & [ 255, 105, 180 ] & \color{HotPink} \rule{1cm}{1.5ex}\\ PaleGreen1 & [ 154, 255, 154 ] & \color{PaleGreen1} \rule{1cm}{1.5ex}\\ PaleGreen2 & [ 144, 238, 144 ] & \color{PaleGreen2} \rule{1cm}{1.5ex}\\ PaleGreen3 & [ 124, 205, 124 ] & \color{PaleGreen3} \rule{1cm}{1.5ex}\\ PaleGreen4 & [ 84, 138, 84 ] & \color{PaleGreen4} \rule{1cm}{1.5ex}\\ DarkBlue & [ 0, 0, 139 ] & \color{DarkBlue} \rule{1cm}{1.5ex}\\ BlueViolet & [ 138, 43, 226 ] & \color{BlueViolet} \rule{1cm}{1.5ex}\\ PeachPuff & [ 255, 218, 185 ] & \color{PeachPuff} \rule{1cm}{1.5ex}\\ PeachPuff1 & [ 255, 218, 185 ] & \color{PeachPuff1} \rule{1cm}{1.5ex}\\ PeachPuff2 & [ 238, 203, 173 ] & \color{PeachPuff2} \rule{1cm}{1.5ex}\\ PeachPuff3 & [ 205, 175, 149 ] & \color{PeachPuff3} \rule{1cm}{1.5ex}\\ PeachPuff4 & [ 139, 119, 101 ] & \color{PeachPuff4} \rule{1cm}{1.5ex}\\ chocolate1 & [ 255, 127, 36 ] & \color{chocolate1} \rule{1cm}{1.5ex}\\ chocolate2 & [ 238, 118, 33 ] & \color{chocolate2} \rule{1cm}{1.5ex}\\ chocolate3 & [ 205, 102, 29 ] & \color{chocolate3} \rule{1cm}{1.5ex}\\ chocolate4 & [ 139, 69, 19 ] & \color{chocolate4} \rule{1cm}{1.5ex}\\ LightGreen & [ 144, 238, 144 ] & \color{LightGreen} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} lavender & [ 230, 230, 250 ] & \color{lavender} \rule{1cm}{1.5ex}\\ MediumPurple & [ 147, 112, 219 ] & \color{MediumPurple} \rule{1cm}{1.5ex}\\ DarkOrange & [ 255, 127, 0 ] & \color{DarkOrange} \rule{1cm}{1.5ex}\\ DarkOrange2 & [ 238, 118, 0 ] & \color{DarkOrange2} \rule{1cm}{1.5ex}\\ DarkOrange3 & [ 205, 102, 0 ] & \color{DarkOrange3} \rule{1cm}{1.5ex}\\ DarkOrange4 & [ 139, 69, 0 ] & \color{DarkOrange4} \rule{1cm}{1.5ex}\\ SlateBlue & [ 106, 90, 205 ] & \color{SlateBlue} \rule{1cm}{1.5ex}\\ BlueViolet & [ 138, 43, 226 ] & \color{BlueViolet} \rule{1cm}{1.5ex}\\ RoyalBlue & [ 65, 105, 225 ] & \color{RoyalBlue} \rule{1cm}{1.5ex}\\ AntiqueWhite & [ 250, 235, 215 ] & \color{AntiqueWhite} \rule{1cm}{1.5ex}\\ AntiqueWhite1 & [ 255, 239, 219 ] & \color{AntiqueWhite1} \rule{1cm}{1.5ex}\\ AntiqueWhite2 & [ 238, 223, 204 ] & \color{AntiqueWhite2} \rule{1cm}{1.5ex}\\ AntiqueWhite3 & [ 205, 192, 176 ] & \color{AntiqueWhite3} \rule{1cm}{1.5ex}\\ AntiqueWhite4 & [ 139, 131, 120 ] & \color{AntiqueWhite4} \rule{1cm}{1.5ex}\\ CadetBlue & [ 95, 158, 160 ] & \color{CadetBlue} \rule{1cm}{1.5ex}\\ CadetBlue1 & [ 152, 245, 255 ] & \color{CadetBlue1} \rule{1cm}{1.5ex}\\ CadetBlue2 & [ 142, 229, 238 ] & \color{CadetBlue2} \rule{1cm}{1.5ex}\\ CadetBlue3 & [ 122, 197, 205 ] & \color{CadetBlue3} \rule{1cm}{1.5ex}\\ CadetBlue4 & [ 83, 134, 139 ] & \color{CadetBlue4} \rule{1cm}{1.5ex}\\ DarkGoldenrod & [ 184, 134, 11 ] & \color{DarkGoldenrod} \rule{1cm}{1.5ex}\\ DarkGoldenrod1 & [ 255, 185, 15 ] & \color{DarkGoldenrod1} \rule{1cm}{1.5ex}\\ DarkGoldenrod2 & [ 238, 173, 14 ] & \color{DarkGoldenrod2} \rule{1cm}{1.5ex}\\ DarkGoldenrod3 & [ 205, 149, 12 ] & \color{DarkGoldenrod3} \rule{1cm}{1.5ex}\\ DarkGoldenrod4 & [ 139, 101, 8 ] & \color{DarkGoldenrod4} \rule{1cm}{1.5ex}\\ DarkOliveGreen & [ 85, 107, 47 ] & \color{DarkOliveGreen} \rule{1cm}{1.5ex}\\ DarkOliveGreen1 & [ 202, 255, 112 ] & \color{DarkOliveGreen1} \rule{1cm}{1.5ex}\\ DarkOliveGreen2 & [ 188, 238, 104 ] & \color{DarkOliveGreen2} \rule{1cm}{1.5ex}\\ DarkOliveGreen3 & [ 162, 205, 90 ] & \color{DarkOliveGreen3} \rule{1cm}{1.5ex}\\ DarkOliveGreen4 & [ 110, 139, 61 ] & \color{DarkOliveGreen4} \rule{1cm}{1.5ex}\\ DarkOrange1 & [ 255, 127, 0 ] & \color{DarkOrange1} \rule{1cm}{1.5ex}\\ DarkOrchid & [ 153, 50, 204 ] & \color{DarkOrchid} \rule{1cm}{1.5ex}\\ DarkOrchid1 & [ 191, 62, 255 ] & \color{DarkOrchid1} \rule{1cm}{1.5ex}\\ DarkOrchid2 & [ 178, 58, 238 ] & \color{DarkOrchid2} \rule{1cm}{1.5ex}\\ DarkOrchid3 & [ 154, 50, 205 ] & \color{DarkOrchid3} \rule{1cm}{1.5ex}\\ DarkOrchid4 & [ 104, 34, 139 ] & \color{DarkOrchid4} \rule{1cm}{1.5ex}\\ DarkSeaGreen & [ 143, 188, 143 ] & \color{DarkSeaGreen} \rule{1cm}{1.5ex}\\ DarkSeaGreen1 & [ 193, 255, 193 ] & \color{DarkSeaGreen1} \rule{1cm}{1.5ex}\\ DarkSeaGreen2 & [ 180, 238, 180 ] & \color{DarkSeaGreen2} \rule{1cm}{1.5ex}\\ DarkSeaGreen3 & [ 155, 205, 155 ] & \color{DarkSeaGreen3} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} DarkSeaGreen4 & [ 105, 139, 105 ] & \color{DarkSeaGreen4} \rule{1cm}{1.5ex}\\ DarkSlateGray & [ 47, 79, 79 ] & \color{DarkSlateGray} \rule{1cm}{1.5ex}\\ DarkSlateGray1 & [ 151, 255, 255 ] & \color{DarkSlateGray1} \rule{1cm}{1.5ex}\\ DarkSlateGray2 & [ 141, 238, 238 ] & \color{DarkSlateGray2} \rule{1cm}{1.5ex}\\ DarkSlateGray3 & [ 121, 205, 205 ] & \color{DarkSlateGray3} \rule{1cm}{1.5ex}\\ DarkSlateGray4 & [ 82, 139, 139 ] & \color{DarkSlateGray4} \rule{1cm}{1.5ex}\\ DeepPink & [ 255, 20, 147 ] & \color{DeepPink} \rule{1cm}{1.5ex}\\ DeepPink1 & [ 255, 20, 147 ] & \color{DeepPink1} \rule{1cm}{1.5ex}\\ DeepPink2 & [ 238, 18, 137 ] & \color{DeepPink2} \rule{1cm}{1.5ex}\\ DeepPink3 & [ 205, 16, 118 ] & \color{DeepPink3} \rule{1cm}{1.5ex}\\ DeepPink4 & [ 139, 10, 80 ] & \color{DeepPink4} \rule{1cm}{1.5ex}\\ DeepSkyBlue & [ 0, 191, 255 ] & \color{DeepSkyBlue} \rule{1cm}{1.5ex}\\ DeepSkyBlue1 & [ 0, 191, 255 ] & \color{DeepSkyBlue1} \rule{1cm}{1.5ex}\\ DeepSkyBlue2 & [ 0, 178, 238 ] & \color{DeepSkyBlue2} \rule{1cm}{1.5ex}\\ DeepSkyBlue3 & [ 0, 154, 205 ] & \color{DeepSkyBlue3} \rule{1cm}{1.5ex}\\ DeepSkyBlue4 & [ 0, 104, 139 ] & \color{DeepSkyBlue4} \rule{1cm}{1.5ex}\\ DodgerBlue & [ 30, 144, 255 ] & \color{DodgerBlue} \rule{1cm}{1.5ex}\\ DodgerBlue1 & [ 30, 144, 255 ] & \color{DodgerBlue1} \rule{1cm}{1.5ex}\\ DodgerBlue2 & [ 28, 134, 238 ] & \color{DodgerBlue2} \rule{1cm}{1.5ex}\\ DodgerBlue3 & [ 24, 116, 205 ] & \color{DodgerBlue3} \rule{1cm}{1.5ex}\\ DodgerBlue4 & [ 16, 78, 139 ] & \color{DodgerBlue4} \rule{1cm}{1.5ex}\\ HotPink1 & [ 255, 110, 180 ] & \color{HotPink1} \rule{1cm}{1.5ex}\\ HotPink2 & [ 238, 106, 167 ] & \color{HotPink2} \rule{1cm}{1.5ex}\\ HotPink3 & [ 205, 96, 144 ] & \color{HotPink3} \rule{1cm}{1.5ex}\\ HotPink4 & [ 139, 58, 98 ] & \color{HotPink4} \rule{1cm}{1.5ex}\\ IndianRed & [ 205, 92, 92 ] & \color{IndianRed} \rule{1cm}{1.5ex}\\ IndianRed1 & [ 255, 106, 106 ] & \color{IndianRed1} \rule{1cm}{1.5ex}\\ IndianRed2 & [ 238, 99, 99 ] & \color{IndianRed2} \rule{1cm}{1.5ex}\\ IndianRed3 & [ 205, 85, 85 ] & \color{IndianRed3} \rule{1cm}{1.5ex}\\ IndianRed4 & [ 139, 58, 58 ] & \color{IndianRed4} \rule{1cm}{1.5ex}\\ LavenderBlush & [ 255, 240, 245 ] & \color{LavenderBlush} \rule{1cm}{1.5ex}\\ LavenderBlush1 & [ 255, 240, 245 ] & \color{LavenderBlush1} \rule{1cm}{1.5ex}\\ LavenderBlush2 & [ 238, 224, 229 ] & \color{LavenderBlush2} \rule{1cm}{1.5ex}\\ LavenderBlush3 & [ 205, 193, 197 ] & \color{LavenderBlush3} \rule{1cm}{1.5ex}\\ LavenderBlush4 & [ 139, 131, 134 ] & \color{LavenderBlush4} \rule{1cm}{1.5ex}\\ LemonChiffon & [ 255, 250, 205 ] & \color{LemonChiffon} \rule{1cm}{1.5ex}\\ LemonChiffon1 & [ 255, 250, 205 ] & \color{LemonChiffon1} \rule{1cm}{1.5ex}\\ LemonChiffon2 & [ 238, 233, 191 ] & \color{LemonChiffon2} \rule{1cm}{1.5ex}\\ LemonChiffon3 & [ 205, 201, 165 ] & \color{LemonChiffon3} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} LemonChiffon4 & [ 139, 137, 112 ] & \color{LemonChiffon4} \rule{1cm}{1.5ex}\\ LightBlue & [ 173, 216, 230 ] & \color{LightBlue} \rule{1cm}{1.5ex}\\ LightBlue1 & [ 191, 239, 255 ] & \color{LightBlue1} \rule{1cm}{1.5ex}\\ LightBlue2 & [ 178, 223, 238 ] & \color{LightBlue2} \rule{1cm}{1.5ex}\\ LightBlue3 & [ 154, 192, 205 ] & \color{LightBlue3} \rule{1cm}{1.5ex}\\ LightBlue4 & [ 104, 131, 139 ] & \color{LightBlue4} \rule{1cm}{1.5ex}\\ LightCyan & [ 224, 255, 255 ] & \color{LightCyan} \rule{1cm}{1.5ex}\\ LightCyan1 & [ 224, 255, 255 ] & \color{LightCyan1} \rule{1cm}{1.5ex}\\ LightCyan2 & [ 209, 238, 238 ] & \color{LightCyan2} \rule{1cm}{1.5ex}\\ LightCyan3 & [ 180, 205, 205 ] & \color{LightCyan3} \rule{1cm}{1.5ex}\\ LightCyan4 & [ 122, 139, 139 ] & \color{LightCyan4} \rule{1cm}{1.5ex}\\ LightGoldenrod & [ 238, 221, 130 ] & \color{LightGoldenrod} \rule{1cm}{1.5ex}\\ LightGoldenrod1 & [ 255, 236, 139 ] & \color{LightGoldenrod1} \rule{1cm}{1.5ex}\\ LightGoldenrod2 & [ 238, 220, 130 ] & \color{LightGoldenrod2} \rule{1cm}{1.5ex}\\ LightGoldenrod3 & [ 205, 190, 112 ] & \color{LightGoldenrod3} \rule{1cm}{1.5ex}\\ LightGoldenrod4 & [ 139, 129, 76 ] & \color{LightGoldenrod4} \rule{1cm}{1.5ex}\\ LightPink & [ 255, 182, 193 ] & \color{LightPink} \rule{1cm}{1.5ex}\\ LightPink1 & [ 255, 174, 185 ] & \color{LightPink1} \rule{1cm}{1.5ex}\\ LightPink2 & [ 238, 162, 173 ] & \color{LightPink2} \rule{1cm}{1.5ex}\\ LightPink3 & [ 205, 140, 149 ] & \color{LightPink3} \rule{1cm}{1.5ex}\\ LightPink4 & [ 139, 95, 101 ] & \color{LightPink4} \rule{1cm}{1.5ex}\\ LightSalmon & [ 255, 160, 122 ] & \color{LightSalmon} \rule{1cm}{1.5ex}\\ LightSalmon1 & [ 255, 160, 122 ] & \color{LightSalmon1} \rule{1cm}{1.5ex}\\ LightSalmon2 & [ 238, 149, 114 ] & \color{LightSalmon2} \rule{1cm}{1.5ex}\\ LightSalmon3 & [ 205, 129, 98 ] & \color{LightSalmon3} \rule{1cm}{1.5ex}\\ LightSalmon4 & [ 139, 87, 66 ] & \color{LightSalmon4} \rule{1cm}{1.5ex}\\ LightSkyBlue & [ 135, 206, 250 ] & \color{LightSkyBlue} \rule{1cm}{1.5ex}\\ LightSkyBlue1 & [ 176, 226, 255 ] & \color{LightSkyBlue1} \rule{1cm}{1.5ex}\\ LightSkyBlue2 & [ 164, 211, 238 ] & \color{LightSkyBlue2} \rule{1cm}{1.5ex}\\ LightSkyBlue3 & [ 141, 182, 205 ] & \color{LightSkyBlue3} \rule{1cm}{1.5ex}\\ LightSkyBlue4 & [ 96, 123, 139 ] & \color{LightSkyBlue4} \rule{1cm}{1.5ex}\\ LightSteelBlue & [ 176, 196, 222 ] & \color{LightSteelBlue} \rule{1cm}{1.5ex}\\ LightSteelBlue1 & [ 202, 225, 255 ] & \color{LightSteelBlue1} \rule{1cm}{1.5ex}\\ LightSteelBlue2 & [ 188, 210, 238 ] & \color{LightSteelBlue2} \rule{1cm}{1.5ex}\\ LightSteelBlue3 & [ 162, 181, 205 ] & \color{LightSteelBlue3} \rule{1cm}{1.5ex}\\ LightSteelBlue4 & [ 110, 123, 139 ] & \color{LightSteelBlue4} \rule{1cm}{1.5ex}\\ LightYellow & [ 255, 255, 224 ] & \color{LightYellow} \rule{1cm}{1.5ex}\\ LightYellow1 & [ 255, 255, 224 ] & \color{LightYellow1} \rule{1cm}{1.5ex}\\ LightYellow2 & [ 238, 238, 209 ] & \color{LightYellow2} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} LightYellow3 & [ 205, 205, 180 ] & \color{LightYellow3} \rule{1cm}{1.5ex}\\ LightYellow4 & [ 139, 139, 122 ] & \color{LightYellow4} \rule{1cm}{1.5ex}\\ MediumOrchid & [ 186, 85, 211 ] & \color{MediumOrchid} \rule{1cm}{1.5ex}\\ MediumOrchid1 & [ 224, 102, 255 ] & \color{MediumOrchid1} \rule{1cm}{1.5ex}\\ MediumOrchid2 & [ 209, 95, 238 ] & \color{MediumOrchid2} \rule{1cm}{1.5ex}\\ MediumOrchid3 & [ 180, 82, 205 ] & \color{MediumOrchid3} \rule{1cm}{1.5ex}\\ MediumOrchid4 & [ 122, 55, 139 ] & \color{MediumOrchid4} \rule{1cm}{1.5ex}\\ MediumPurple1 & [ 171, 130, 255 ] & \color{MediumPurple1} \rule{1cm}{1.5ex}\\ MediumPurple2 & [ 159, 121, 238 ] & \color{MediumPurple2} \rule{1cm}{1.5ex}\\ MediumPurple3 & [ 137, 104, 205 ] & \color{MediumPurple3} \rule{1cm}{1.5ex}\\ MediumPurple4 & [ 93, 71, 139 ] & \color{MediumPurple4} \rule{1cm}{1.5ex}\\ MistyRose & [ 255, 228, 225 ] & \color{MistyRose} \rule{1cm}{1.5ex}\\ MistyRose1 & [ 255, 228, 225 ] & \color{MistyRose1} \rule{1cm}{1.5ex}\\ MistyRose2 & [ 238, 213, 210 ] & \color{MistyRose2} \rule{1cm}{1.5ex}\\ MistyRose3 & [ 205, 183, 181 ] & \color{MistyRose3} \rule{1cm}{1.5ex}\\ MistyRose4 & [ 139, 125, 123 ] & \color{MistyRose4} \rule{1cm}{1.5ex}\\ NavajoWhite & [ 255, 222, 173 ] & \color{NavajoWhite} \rule{1cm}{1.5ex}\\ NavajoWhite1 & [ 255, 222, 173 ] & \color{NavajoWhite1} \rule{1cm}{1.5ex}\\ NavajoWhite2 & [ 238, 207, 161 ] & \color{NavajoWhite2} \rule{1cm}{1.5ex}\\ NavajoWhite3 & [ 205, 179, 139 ] & \color{NavajoWhite3} \rule{1cm}{1.5ex}\\ NavajoWhite4 & [ 139, 121, 94 ] & \color{NavajoWhite4} \rule{1cm}{1.5ex}\\ OliveDrab & [ 107, 142, 35 ] & \color{OliveDrab} \rule{1cm}{1.5ex}\\ OliveDrab1 & [ 192, 255, 62 ] & \color{OliveDrab1} \rule{1cm}{1.5ex}\\ OliveDrab2 & [ 179, 238, 58 ] & \color{OliveDrab2} \rule{1cm}{1.5ex}\\ OliveDrab3 & [ 154, 205, 50 ] & \color{OliveDrab3} \rule{1cm}{1.5ex}\\ OliveDrab4 & [ 105, 139, 34 ] & \color{OliveDrab4} \rule{1cm}{1.5ex}\\ OrangeRed & [ 255, 69, 0 ] & \color{OrangeRed} \rule{1cm}{1.5ex}\\ OrangeRed1 & [ 255, 69, 0 ] & \color{OrangeRed1} \rule{1cm}{1.5ex}\\ OrangeRed2 & [ 238, 64, 0 ] & \color{OrangeRed2} \rule{1cm}{1.5ex}\\ OrangeRed3 & [ 205, 55, 0 ] & \color{OrangeRed3} \rule{1cm}{1.5ex}\\ OrangeRed4 & [ 139, 37, 0 ] & \color{OrangeRed4} \rule{1cm}{1.5ex}\\ PaleGreen & [ 152, 251, 152 ] & \color{PaleGreen} \rule{1cm}{1.5ex}\\ PaleTurquoise & [ 175, 238, 238 ] & \color{PaleTurquoise} \rule{1cm}{1.5ex}\\ PaleTurquoise1 & [ 187, 255, 255 ] & \color{PaleTurquoise1} \rule{1cm}{1.5ex}\\ PaleTurquoise2 & [ 174, 238, 238 ] & \color{PaleTurquoise2} \rule{1cm}{1.5ex}\\ PaleTurquoise3 & [ 150, 205, 205 ] & \color{PaleTurquoise3} \rule{1cm}{1.5ex}\\ PaleTurquoise4 & [ 102, 139, 139 ] & \color{PaleTurquoise4} \rule{1cm}{1.5ex}\\ PaleVioletRed & [ 219, 112, 147 ] & \color{PaleVioletRed} \rule{1cm}{1.5ex}\\ PaleVioletRed1 & [ 255, 130, 171 ] & \color{PaleVioletRed1} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} PaleVioletRed2 & [ 238, 121, 159 ] & \color{PaleVioletRed2} \rule{1cm}{1.5ex}\\ PaleVioletRed3 & [ 205, 104, 137 ] & \color{PaleVioletRed3} \rule{1cm}{1.5ex}\\ PaleVioletRed4 & [ 139, 71, 93 ] & \color{PaleVioletRed4} \rule{1cm}{1.5ex}\\ RosyBrown & [ 188, 143, 143 ] & \color{RosyBrown} \rule{1cm}{1.5ex}\\ RosyBrown1 & [ 255, 193, 193 ] & \color{RosyBrown1} \rule{1cm}{1.5ex}\\ RosyBrown2 & [ 238, 180, 180 ] & \color{RosyBrown2} \rule{1cm}{1.5ex}\\ RosyBrown3 & [ 205, 155, 155 ] & \color{RosyBrown3} \rule{1cm}{1.5ex}\\ RosyBrown4 & [ 139, 105, 105 ] & \color{RosyBrown4} \rule{1cm}{1.5ex}\\ RoyalBlue1 & [ 72, 118, 255 ] & \color{RoyalBlue1} \rule{1cm}{1.5ex}\\ RoyalBlue2 & [ 67, 110, 238 ] & \color{RoyalBlue2} \rule{1cm}{1.5ex}\\ RoyalBlue3 & [ 58, 95, 205 ] & \color{RoyalBlue3} \rule{1cm}{1.5ex}\\ RoyalBlue4 & [ 39, 64, 139 ] & \color{RoyalBlue4} \rule{1cm}{1.5ex}\\ SeaGreen & [ 46, 139, 87 ] & \color{SeaGreen} \rule{1cm}{1.5ex}\\ SeaGreen1 & [ 84, 255, 159 ] & \color{SeaGreen1} \rule{1cm}{1.5ex}\\ SeaGreen2 & [ 78, 238, 148 ] & \color{SeaGreen2} \rule{1cm}{1.5ex}\\ SeaGreen3 & [ 67, 205, 128 ] & \color{SeaGreen3} \rule{1cm}{1.5ex}\\ SeaGreen4 & [ 46, 139, 87 ] & \color{SeaGreen4} \rule{1cm}{1.5ex}\\ SkyBlue & [ 135, 206, 235 ] & \color{SkyBlue} \rule{1cm}{1.5ex}\\ SkyBlue1 & [ 135, 206, 255 ] & \color{SkyBlue1} \rule{1cm}{1.5ex}\\ SkyBlue2 & [ 126, 192, 238 ] & \color{SkyBlue2} \rule{1cm}{1.5ex}\\ SkyBlue3 & [ 108, 166, 205 ] & \color{SkyBlue3} \rule{1cm}{1.5ex}\\ SkyBlue4 & [ 74, 112, 139 ] & \color{SkyBlue4} \rule{1cm}{1.5ex}\\ SlateBlue1 & [ 131, 111, 255 ] & \color{SlateBlue1} \rule{1cm}{1.5ex}\\ SlateBlue2 & [ 122, 103, 238 ] & \color{SlateBlue2} \rule{1cm}{1.5ex}\\ SlateBlue3 & [ 105, 89, 205 ] & \color{SlateBlue3} \rule{1cm}{1.5ex}\\ SlateBlue4 & [ 71, 60, 139 ] & \color{SlateBlue4} \rule{1cm}{1.5ex}\\ SlateGray & [ 112, 128, 144 ] & \color{SlateGray} \rule{1cm}{1.5ex}\\ SlateGray1 & [ 198, 226, 255 ] & \color{SlateGray1} \rule{1cm}{1.5ex}\\ SlateGray2 & [ 185, 211, 238 ] & \color{SlateGray2} \rule{1cm}{1.5ex}\\ SlateGray3 & [ 159, 182, 205 ] & \color{SlateGray3} \rule{1cm}{1.5ex}\\ SlateGray4 & [ 108, 123, 139 ] & \color{SlateGray4} \rule{1cm}{1.5ex}\\ SpringGreen & [ 0, 255, 127 ] & \color{SpringGreen} \rule{1cm}{1.5ex}\\ SpringGreen1 & [ 0, 255, 127 ] & \color{SpringGreen1} \rule{1cm}{1.5ex}\\ SpringGreen2 & [ 0, 238, 118 ] & \color{SpringGreen2} \rule{1cm}{1.5ex}\\ SpringGreen3 & [ 0, 205, 102 ] & \color{SpringGreen3} \rule{1cm}{1.5ex}\\ SpringGreen4 & [ 0, 139, 69 ] & \color{SpringGreen4} \rule{1cm}{1.5ex}\\ SteelBlue & [ 70, 130, 180 ] & \color{SteelBlue} \rule{1cm}{1.5ex}\\ SteelBlue1 & [ 99, 184, 255 ] & \color{SteelBlue1} \rule{1cm}{1.5ex}\\ SteelBlue2 & [ 92, 172, 238 ] & \color{SteelBlue2} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} SteelBlue3 & [ 79, 148, 205 ] & \color{SteelBlue3} \rule{1cm}{1.5ex}\\ SteelBlue4 & [ 54, 100, 139 ] & \color{SteelBlue4} \rule{1cm}{1.5ex}\\ VioletRed & [ 208, 32, 144 ] & \color{VioletRed} \rule{1cm}{1.5ex}\\ VioletRed1 & [ 255, 62, 150 ] & \color{VioletRed1} \rule{1cm}{1.5ex}\\ VioletRed2 & [ 238, 58, 140 ] & \color{VioletRed2} \rule{1cm}{1.5ex}\\ VioletRed3 & [ 205, 50, 120 ] & \color{VioletRed3} \rule{1cm}{1.5ex}\\ VioletRed4 & [ 139, 34, 82 ] & \color{VioletRed4} \rule{1cm}{1.5ex}\\ aquamarine & [ 127, 255, 212 ] & \color{aquamarine} \rule{1cm}{1.5ex}\\ aquamarine1 & [ 127, 255, 212 ] & \color{aquamarine1} \rule{1cm}{1.5ex}\\ aquamarine2 & [ 118, 238, 198 ] & \color{aquamarine2} \rule{1cm}{1.5ex}\\ aquamarine3 & [ 102, 205, 170 ] & \color{aquamarine3} \rule{1cm}{1.5ex}\\ aquamarine4 & [ 69, 139, 116 ] & \color{aquamarine4} \rule{1cm}{1.5ex}\\ azure & [ 240, 255, 255 ] & \color{azure} \rule{1cm}{1.5ex}\\ azure1 & [ 240, 255, 255 ] & \color{azure1} \rule{1cm}{1.5ex}\\ azure2 & [ 224, 238, 238 ] & \color{azure2} \rule{1cm}{1.5ex}\\ azure3 & [ 193, 205, 205 ] & \color{azure3} \rule{1cm}{1.5ex}\\ azure4 & [ 131, 139, 139 ] & \color{azure4} \rule{1cm}{1.5ex}\\ bisque & [ 255, 228, 196 ] & \color{bisque} \rule{1cm}{1.5ex}\\ bisque1 & [ 255, 228, 196 ] & \color{bisque1} \rule{1cm}{1.5ex}\\ bisque2 & [ 238, 213, 183 ] & \color{bisque2} \rule{1cm}{1.5ex}\\ bisque3 & [ 205, 183, 158 ] & \color{bisque3} \rule{1cm}{1.5ex}\\ bisque4 & [ 139, 125, 107 ] & \color{bisque4} \rule{1cm}{1.5ex}\\ blue1 & [ 0, 0, 255 ] & \color{blue1} \rule{1cm}{1.5ex}\\ blue2 & [ 0, 0, 238 ] & \color{blue2} \rule{1cm}{1.5ex}\\ blue3 & [ 0, 0, 205 ] & \color{blue3} \rule{1cm}{1.5ex}\\ blue4 & [ 0, 0, 139 ] & \color{blue4} \rule{1cm}{1.5ex}\\ brown1 & [ 255, 64, 64 ] & \color{brown1} \rule{1cm}{1.5ex}\\ brown2 & [ 238, 59, 59 ] & \color{brown2} \rule{1cm}{1.5ex}\\ brown3 & [ 205, 51, 51 ] & \color{brown3} \rule{1cm}{1.5ex}\\ brown4 & [ 139, 35, 35 ] & \color{brown4} \rule{1cm}{1.5ex}\\ burlywood & [ 222, 184, 135 ] & \color{burlywood} \rule{1cm}{1.5ex}\\ burlywood1 & [ 255, 211, 155 ] & \color{burlywood1} \rule{1cm}{1.5ex}\\ burlywood2 & [ 238, 197, 145 ] & \color{burlywood2} \rule{1cm}{1.5ex}\\ burlywood3 & [ 205, 170, 125 ] & \color{burlywood3} \rule{1cm}{1.5ex}\\ burlywood4 & [ 139, 115, 85 ] & \color{burlywood4} \rule{1cm}{1.5ex}\\ chartreuse & [ 127, 255, 0 ] & \color{chartreuse} \rule{1cm}{1.5ex}\\ chartreuse1 & [ 127, 255, 0 ] & \color{chartreuse1} \rule{1cm}{1.5ex}\\ chartreuse2 & [ 118, 238, 0 ] & \color{chartreuse2} \rule{1cm}{1.5ex}\\ chartreuse3 & [ 102, 205, 0 ] & \color{chartreuse3} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} chartreuse4 & [ 69, 139, 0 ] & \color{chartreuse4} \rule{1cm}{1.5ex}\\ chocolate & [ 210, 105, 30 ] & \color{chocolate} \rule{1cm}{1.5ex}\\ coral & [ 255, 127, 80 ] & \color{coral} \rule{1cm}{1.5ex}\\ coral1 & [ 255, 114, 86 ] & \color{coral1} \rule{1cm}{1.5ex}\\ coral2 & [ 238, 106, 80 ] & \color{coral2} \rule{1cm}{1.5ex}\\ coral3 & [ 205, 91, 69 ] & \color{coral3} \rule{1cm}{1.5ex}\\ coral4 & [ 139, 62, 47 ] & \color{coral4} \rule{1cm}{1.5ex}\\ cornsilk & [ 255, 248, 220 ] & \color{cornsilk} \rule{1cm}{1.5ex}\\ cornsilk1 & [ 255, 248, 220 ] & \color{cornsilk1} \rule{1cm}{1.5ex}\\ cornsilk2 & [ 238, 232, 205 ] & \color{cornsilk2} \rule{1cm}{1.5ex}\\ cornsilk3 & [ 205, 200, 177 ] & \color{cornsilk3} \rule{1cm}{1.5ex}\\ cornsilk4 & [ 139, 136, 120 ] & \color{cornsilk4} \rule{1cm}{1.5ex}\\ cyan & [ 0, 255, 255 ] & \color{cyan} \rule{1cm}{1.5ex}\\ cyan1 & [ 0, 255, 255 ] & \color{cyan1} \rule{1cm}{1.5ex}\\ cyan2 & [ 0, 238, 238 ] & \color{cyan2} \rule{1cm}{1.5ex}\\ cyan3 & [ 0, 205, 205 ] & \color{cyan3} \rule{1cm}{1.5ex}\\ cyan4 & [ 0, 139, 139 ] & \color{cyan4} \rule{1cm}{1.5ex}\\ firebrick & [ 178, 34, 34 ] & \color{firebrick} \rule{1cm}{1.5ex}\\ firebrick1 & [ 255, 48, 48 ] & \color{firebrick1} \rule{1cm}{1.5ex}\\ firebrick2 & [ 238, 44, 44 ] & \color{firebrick2} \rule{1cm}{1.5ex}\\ firebrick3 & [ 205, 38, 38 ] & \color{firebrick3} \rule{1cm}{1.5ex}\\ firebrick4 & [ 139, 26, 26 ] & \color{firebrick4} \rule{1cm}{1.5ex}\\ gold & [ 255, 215, 0 ] & \color{gold} \rule{1cm}{1.5ex}\\ gold1 & [ 255, 215, 0 ] & \color{gold1} \rule{1cm}{1.5ex}\\ gold2 & [ 238, 201, 0 ] & \color{gold2} \rule{1cm}{1.5ex}\\ gold3 & [ 205, 173, 0 ] & \color{gold3} \rule{1cm}{1.5ex}\\ gold4 & [ 139, 117, 0 ] & \color{gold4} \rule{1cm}{1.5ex}\\ goldenrod & [ 218, 165, 32 ] & \color{goldenrod} \rule{1cm}{1.5ex}\\ goldenrod1 & [ 255, 193, 37 ] & \color{goldenrod1} \rule{1cm}{1.5ex}\\ goldenrod2 & [ 238, 180, 34 ] & \color{goldenrod2} \rule{1cm}{1.5ex}\\ goldenrod3 & [ 205, 155, 29 ] & \color{goldenrod3} \rule{1cm}{1.5ex}\\ goldenrod4 & [ 139, 105, 20 ] & \color{goldenrod4} \rule{1cm}{1.5ex}\\ gray & [ 190, 190, 190 ] & \color{gray} \rule{1cm}{1.5ex}\\ gray1 & [ 3, 3, 3 ] & \color{gray1} \rule{1cm}{1.5ex}\\ gray2 & [ 5, 5, 5 ] & \color{gray2} \rule{1cm}{1.5ex}\\ gray3 & [ 8, 8, 8 ] & \color{gray3} \rule{1cm}{1.5ex}\\ gray4 & [ 10, 10, 10 ] & \color{gray4} \rule{1cm}{1.5ex}\\ green1 & [ 0, 255, 0 ] & \color{green1} \rule{1cm}{1.5ex}\\ green2 & [ 0, 238, 0 ] & \color{green2} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} green3 & [ 0, 205, 0 ] & \color{green3} \rule{1cm}{1.5ex}\\ green4 & [ 0, 139, 0 ] & \color{green4} \rule{1cm}{1.5ex}\\ grey1 & [ 3, 3, 3 ] & \color{grey1} \rule{1cm}{1.5ex}\\ grey2 & [ 5, 5, 5 ] & \color{grey2} \rule{1cm}{1.5ex}\\ grey3 & [ 8, 8, 8 ] & \color{grey3} \rule{1cm}{1.5ex}\\ grey4 & [ 10, 10, 10 ] & \color{grey4} \rule{1cm}{1.5ex}\\ honeydew & [ 240, 255, 240 ] & \color{honeydew} \rule{1cm}{1.5ex}\\ honeydew1 & [ 240, 255, 240 ] & \color{honeydew1} \rule{1cm}{1.5ex}\\ honeydew2 & [ 224, 238, 224 ] & \color{honeydew2} \rule{1cm}{1.5ex}\\ honeydew3 & [ 193, 205, 193 ] & \color{honeydew3} \rule{1cm}{1.5ex}\\ honeydew4 & [ 131, 139, 131 ] & \color{honeydew4} \rule{1cm}{1.5ex}\\ ivory & [ 255, 255, 240 ] & \color{ivory} \rule{1cm}{1.5ex}\\ ivory1 & [ 255, 255, 240 ] & \color{ivory1} \rule{1cm}{1.5ex}\\ ivory2 & [ 238, 238, 224 ] & \color{ivory2} \rule{1cm}{1.5ex}\\ ivory3 & [ 205, 205, 193 ] & \color{ivory3} \rule{1cm}{1.5ex}\\ ivory4 & [ 139, 139, 131 ] & \color{ivory4} \rule{1cm}{1.5ex}\\ khaki & [ 240, 230, 140 ] & \color{khaki} \rule{1cm}{1.5ex}\\ khaki1 & [ 255, 246, 143 ] & \color{khaki1} \rule{1cm}{1.5ex}\\ khaki2 & [ 238, 230, 133 ] & \color{khaki2} \rule{1cm}{1.5ex}\\ khaki3 & [ 205, 198, 115 ] & \color{khaki3} \rule{1cm}{1.5ex}\\ khaki4 & [ 139, 134, 78 ] & \color{khaki4} \rule{1cm}{1.5ex}\\ magenta & [ 255, 0, 255 ] & \color{magenta} \rule{1cm}{1.5ex}\\ magenta1 & [ 255, 0, 255 ] & \color{magenta1} \rule{1cm}{1.5ex}\\ magenta2 & [ 238, 0, 238 ] & \color{magenta2} \rule{1cm}{1.5ex}\\ magenta3 & [ 205, 0, 205 ] & \color{magenta3} \rule{1cm}{1.5ex}\\ magenta4 & [ 139, 0, 139 ] & \color{magenta4} \rule{1cm}{1.5ex}\\ maroon & [ 176, 48, 96 ] & \color{maroon} \rule{1cm}{1.5ex}\\ maroon1 & [ 255, 52, 179 ] & \color{maroon1} \rule{1cm}{1.5ex}\\ maroon2 & [ 238, 48, 167 ] & \color{maroon2} \rule{1cm}{1.5ex}\\ maroon3 & [ 205, 41, 144 ] & \color{maroon3} \rule{1cm}{1.5ex}\\ maroon4 & [ 139, 28, 98 ] & \color{maroon4} \rule{1cm}{1.5ex}\\ orange1 & [ 255, 165, 0 ] & \color{orange1} \rule{1cm}{1.5ex}\\ orchid & [ 218, 112, 214 ] & \color{orchid} \rule{1cm}{1.5ex}\\ orchid1 & [ 255, 131, 250 ] & \color{orchid1} \rule{1cm}{1.5ex}\\ orchid2 & [ 238, 122, 233 ] & \color{orchid2} \rule{1cm}{1.5ex}\\ orchid3 & [ 205, 105, 201 ] & \color{orchid3} \rule{1cm}{1.5ex}\\ orchid4 & [ 139, 71, 137 ] & \color{orchid4} \rule{1cm}{1.5ex}\\ pink1 & [ 255, 181, 197 ] & \color{pink1} \rule{1cm}{1.5ex}\\ pink2 & [ 238, 169, 184 ] & \color{pink2} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} pink3 & [ 205, 145, 158 ] & \color{pink3} \rule{1cm}{1.5ex}\\ pink4 & [ 139, 99, 108 ] & \color{pink4} \rule{1cm}{1.5ex}\\ plum1 & [ 255, 187, 255 ] & \color{plum1} \rule{1cm}{1.5ex}\\ plum2 & [ 238, 174, 238 ] & \color{plum2} \rule{1cm}{1.5ex}\\ plum3 & [ 205, 150, 205 ] & \color{plum3} \rule{1cm}{1.5ex}\\ plum4 & [ 139, 102, 139 ] & \color{plum4} \rule{1cm}{1.5ex}\\ purple1 & [ 155, 48, 255 ] & \color{purple1} \rule{1cm}{1.5ex}\\ purple2 & [ 145, 44, 238 ] & \color{purple2} \rule{1cm}{1.5ex}\\ purple3 & [ 125, 38, 205 ] & \color{purple3} \rule{1cm}{1.5ex}\\ purple4 & [ 85, 26, 139 ] & \color{purple4} \rule{1cm}{1.5ex}\\ red1 & [ 255, 0, 0 ] & \color{red1} \rule{1cm}{1.5ex}\\ red2 & [ 238, 0, 0 ] & \color{red2} \rule{1cm}{1.5ex}\\ red3 & [ 205, 0, 0 ] & \color{red3} \rule{1cm}{1.5ex}\\ red4 & [ 139, 0, 0 ] & \color{red4} \rule{1cm}{1.5ex}\\ salmon & [ 250, 128, 114 ] & \color{salmon} \rule{1cm}{1.5ex}\\ salmon1 & [ 255, 140, 105 ] & \color{salmon1} \rule{1cm}{1.5ex}\\ salmon2 & [ 238, 130, 98 ] & \color{salmon2} \rule{1cm}{1.5ex}\\ salmon3 & [ 205, 112, 84 ] & \color{salmon3} \rule{1cm}{1.5ex}\\ salmon4 & [ 139, 76, 57 ] & \color{salmon4} \rule{1cm}{1.5ex}\\ seashell & [ 255, 245, 238 ] & \color{seashell} \rule{1cm}{1.5ex}\\ seashell1 & [ 255, 245, 238 ] & \color{seashell1} \rule{1cm}{1.5ex}\\ seashell2 & [ 238, 229, 222 ] & \color{seashell2} \rule{1cm}{1.5ex}\\ seashell3 & [ 205, 197, 191 ] & \color{seashell3} \rule{1cm}{1.5ex}\\ seashell4 & [ 139, 134, 130 ] & \color{seashell4} \rule{1cm}{1.5ex}\\ sienna & [ 160, 82, 45 ] & \color{sienna} \rule{1cm}{1.5ex}\\ sienna1 & [ 255, 130, 71 ] & \color{sienna1} \rule{1cm}{1.5ex}\\ sienna2 & [ 238, 121, 66 ] & \color{sienna2} \rule{1cm}{1.5ex}\\ sienna3 & [ 205, 104, 57 ] & \color{sienna3} \rule{1cm}{1.5ex}\\ sienna4 & [ 139, 71, 38 ] & \color{sienna4} \rule{1cm}{1.5ex}\\ snow & [ 255, 250, 250 ] & \color{snow} \rule{1cm}{1.5ex}\\ snow1 & [ 255, 250, 250 ] & \color{snow1} \rule{1cm}{1.5ex}\\ snow2 & [ 238, 233, 233 ] & \color{snow2} \rule{1cm}{1.5ex}\\ snow3 & [ 205, 201, 201 ] & \color{snow3} \rule{1cm}{1.5ex}\\ snow4 & [ 139, 137, 137 ] & \color{snow4} \rule{1cm}{1.5ex}\\ tan & [ 210, 180, 140 ] & \color{tan} \rule{1cm}{1.5ex}\\ tan1 & [ 255, 165, 79 ] & \color{tan1} \rule{1cm}{1.5ex}\\ tan2 & [ 238, 154, 73 ] & \color{tan2} \rule{1cm}{1.5ex}\\ tan3 & [ 205, 133, 63 ] & \color{tan3} \rule{1cm}{1.5ex}\\ tan4 & [ 139, 90, 43 ] & \color{tan4} \rule{1cm}{1.5ex}\\ \end{tabular} \begin{tabular}{|l|c|c|} thistle & [ 216, 191, 216 ] & \color{thistle} \rule{1cm}{1.5ex}\\ thistle1 & [ 255, 225, 255 ] & \color{thistle1} \rule{1cm}{1.5ex}\\ thistle2 & [ 238, 210, 238 ] & \color{thistle2} \rule{1cm}{1.5ex}\\ thistle3 & [ 205, 181, 205 ] & \color{thistle3} \rule{1cm}{1.5ex}\\ thistle4 & [ 139, 123, 139 ] & \color{thistle4} \rule{1cm}{1.5ex}\\ tomato & [ 255, 99, 71 ] & \color{tomato} \rule{1cm}{1.5ex}\\ tomato1 & [ 255, 99, 71 ] & \color{tomato1} \rule{1cm}{1.5ex}\\ tomato2 & [ 238, 92, 66 ] & \color{tomato2} \rule{1cm}{1.5ex}\\ tomato3 & [ 205, 79, 57 ] & \color{tomato3} \rule{1cm}{1.5ex}\\ tomato4 & [ 139, 54, 38 ] & \color{tomato4} \rule{1cm}{1.5ex}\\ turquoise1 & [ 0, 245, 255 ] & \color{turquoise1} \rule{1cm}{1.5ex}\\ turquoise2 & [ 0, 229, 238 ] & \color{turquoise2} \rule{1cm}{1.5ex}\\ turquoise3 & [ 0, 197, 205 ] & \color{turquoise3} \rule{1cm}{1.5ex}\\ turquoise4 & [ 0, 134, 139 ] & \color{turquoise4} \rule{1cm}{1.5ex}\\ wheat & [ 245, 222, 179 ] & \color{wheat} \rule{1cm}{1.5ex}\\ wheat1 & [ 255, 231, 186 ] & \color{wheat1} \rule{1cm}{1.5ex}\\ wheat2 & [ 238, 216, 174 ] & \color{wheat2} \rule{1cm}{1.5ex}\\ wheat3 & [ 205, 186, 150 ] & \color{wheat3} \rule{1cm}{1.5ex}\\ wheat4 & [ 139, 126, 102 ] & \color{wheat4} \rule{1cm}{1.5ex}\\ yellow1 & [ 255, 255, 0 ] & \color{yellow1} \rule{1cm}{1.5ex}\\ yellow2 & [ 238, 238, 0 ] & \color{yellow2} \rule{1cm}{1.5ex}\\ yellow3 & [ 205, 205, 0 ] & \color{yellow3} \rule{1cm}{1.5ex}\\ yellow4 & [ 139, 139, 0 ] & \color{yellow4} \rule{1cm}{1.5ex}\\ \end{tabular} Chart-2.4.6/doc/LaTeX/Split.tex0000644000175000017500000000622110735750075015467 0ustar reinerreiner% % split.tex % \renewcommand{\thisname}{Chart::Split} \section{\thisname} \name{\thisname} \file{Split.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a lines chart where both $x$ and $y$ axes are assumed to be numeric. Split charts are mainly intended for cases where many data points are spread over a wide $x$ range while at the same time the $y$ range is limited. Typical examples are weather or seismic data. The $x$ axis will be split into several intervals of the same length (specified with the mandatory option \attruse{interval}). The intervals will be displayed in a stacked fashion. The start of the top interval is set with the mandatory option \attruse{start}. \thisclass will draw only positive $x$ coordinates. The $y$ axis will not be labelled with the $y$ values. Rather, the axis will show only the sequence numbers of the intervals. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[width=\textwidth, height=\textwidth]{stunde.png} \end{center} \caption{Split chart} \label{fig:split} \end{figure} \begin{verbatim} use Chart::Split; $g = Chart::Split->new(650, 900); # Get the data from a file and push them into arrays open(FILE, "data.dat") or die "Can't open the data file!\n"; while () { ($x, $y) = split; push (@x, $x); push (@y, $y); } close(FILE); # Add the data $g->add_dataset(@x); $g->add_dataset(@y); # Set the options $g->set('xy_plot' => 'true'); $g->set('legend' => 'none'); $g->set('title' => 'Split Demo'); $g->set('interval' => 1/288); $g->set('interval_ticks' => 10); $g->set('start' => 260.5); $g->set('brush_size' => 1); $g->set('precision' => 4); $g->set('y_label' => '5 minutes interval'); # Give me a nice picture $g->png("split.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{start} Sets the start value of the first interval. If the $x$ coordinate of the first data point is 0, \attruse{start} should also be set to 0. \emph{Required} value for a \thisclass chart. Defaults to undef. \end{AttrDecl} \begin{AttrDecl}{interval} Sets the interval of one segment to plot. \emph{Required} value for a split chart. Defaults to undef. \end{AttrDecl} \begin{AttrDecl}{interval\_ticks} Sets the number of ticks for the $x$ axis. Defaults to 5. \end{AttrDecl} \begin{AttrDecl}{scale} Every $y$ value of a \thisclass chart will be multiplied by this value, without however changing the sclaing of the $y$ axis. (This might result in some segments being overdrawn by others.) Only useful if you want to give prominence to the maximal amplitudes of data. Defaults to 1. \end{AttrDecl} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/rgb.tex0000644000175000017500000004432612033072733015145 0ustar reinerreiner% % rgb.tex % \definecolor{white}{rgb}{1.00,1.00,1.00} \definecolor{black}{rgb}{0.00,0.00,0.00} \definecolor{red}{rgb}{0.78,0.00,0.00} \definecolor{green}{rgb}{0.00,0.69,0.00} \definecolor{blue}{rgb}{0.00,0.00,0.78} \definecolor{orange}{rgb}{0.98,0.49,0.00} \definecolor{orange2}{rgb}{0.93,0.60,0.00} \definecolor{orange3}{rgb}{0.80,0.52,0.00} \definecolor{orange4}{rgb}{0.55,0.35,0.00} \definecolor{yellow}{rgb}{0.88,0.88,0.00} \definecolor{purple}{rgb}{0.78,0.00,0.78} \definecolor{light_blue}{rgb}{0.00,0.49,0.98} \definecolor{light_green}{rgb}{0.49,0.98,0.00} \definecolor{light_purple}{rgb}{0.57,0.00,0.98} \definecolor{pink}{rgb}{0.98,0.00,0.49} \definecolor{peach}{rgb}{0.98,0.49,0.49} \definecolor{olive}{rgb}{0.49,0.49,0.00} \definecolor{plum}{rgb}{0.49,0.00,0.49} \definecolor{turquoise}{rgb}{0.00,0.49,0.49} \definecolor{mauve}{rgb}{0.78,0.49,0.49} \definecolor{brown}{rgb}{0.63,0.31,0.00} \definecolor{grey}{rgb}{0.88,0.88,0.88} \definecolor{HotPink}{rgb}{1.00,0.41,0.71} \definecolor{PaleGreen1}{rgb}{0.60,1.00,0.60} \definecolor{PaleGreen2}{rgb}{0.56,0.93,0.56} \definecolor{PaleGreen3}{rgb}{0.49,0.80,0.49} \definecolor{PaleGreen4}{rgb}{0.33,0.54,0.33} \definecolor{DarkBlue}{rgb}{0.00,0.00,0.55} \definecolor{BlueViolet}{rgb}{0.54,0.17,0.89} \definecolor{PeachPuff}{rgb}{1.00,0.85,0.73} \definecolor{PeachPuff1}{rgb}{1.00,0.85,0.73} \definecolor{PeachPuff2}{rgb}{0.93,0.80,0.68} \definecolor{PeachPuff3}{rgb}{0.80,0.69,0.58} \definecolor{PeachPuff4}{rgb}{0.55,0.47,0.40} \definecolor{chocolate1}{rgb}{1.00,0.50,0.14} \definecolor{chocolate2}{rgb}{0.93,0.46,0.13} \definecolor{chocolate3}{rgb}{0.80,0.40,0.11} \definecolor{chocolate4}{rgb}{0.55,0.27,0.07} \definecolor{LightGreen}{rgb}{0.56,0.93,0.56} \definecolor{lavender}{rgb}{0.90,0.90,0.98} \definecolor{MediumPurple}{rgb}{0.58,0.44,0.86} \definecolor{DarkOrange}{rgb}{1.00,0.50,0.00} \definecolor{DarkOrange2}{rgb}{0.93,0.46,0.00} \definecolor{DarkOrange3}{rgb}{0.80,0.40,0.00} \definecolor{DarkOrange4}{rgb}{0.55,0.27,0.00} \definecolor{SlateBlue}{rgb}{0.42,0.35,0.80} \definecolor{BlueViolet}{rgb}{0.54,0.17,0.89} \definecolor{RoyalBlue}{rgb}{0.25,0.41,0.88} \definecolor{AntiqueWhite}{rgb}{0.98,0.92,0.84} \definecolor{AntiqueWhite1}{rgb}{1.00,0.94,0.86} \definecolor{AntiqueWhite2}{rgb}{0.93,0.87,0.80} \definecolor{AntiqueWhite3}{rgb}{0.80,0.75,0.69} \definecolor{AntiqueWhite4}{rgb}{0.55,0.51,0.47} \definecolor{CadetBlue}{rgb}{0.37,0.62,0.63} \definecolor{CadetBlue1}{rgb}{0.60,0.96,1.00} \definecolor{CadetBlue2}{rgb}{0.56,0.90,0.93} \definecolor{CadetBlue3}{rgb}{0.48,0.77,0.80} \definecolor{CadetBlue4}{rgb}{0.33,0.53,0.55} \definecolor{DarkGoldenrod}{rgb}{0.72,0.53,0.04} \definecolor{DarkGoldenrod1}{rgb}{1.00,0.73,0.06} \definecolor{DarkGoldenrod2}{rgb}{0.93,0.68,0.05} \definecolor{DarkGoldenrod3}{rgb}{0.80,0.58,0.05} \definecolor{DarkGoldenrod4}{rgb}{0.55,0.40,0.03} \definecolor{DarkOliveGreen}{rgb}{0.33,0.42,0.18} \definecolor{DarkOliveGreen1}{rgb}{0.79,1.00,0.44} \definecolor{DarkOliveGreen2}{rgb}{0.74,0.93,0.41} \definecolor{DarkOliveGreen3}{rgb}{0.64,0.80,0.35} \definecolor{DarkOliveGreen4}{rgb}{0.43,0.55,0.24} \definecolor{DarkOrange1}{rgb}{1.00,0.50,0.00} \definecolor{DarkOrchid}{rgb}{0.60,0.20,0.80} \definecolor{DarkOrchid1}{rgb}{0.75,0.24,1.00} \definecolor{DarkOrchid2}{rgb}{0.70,0.23,0.93} \definecolor{DarkOrchid3}{rgb}{0.60,0.20,0.80} \definecolor{DarkOrchid4}{rgb}{0.41,0.13,0.55} \definecolor{DarkSeaGreen}{rgb}{0.56,0.74,0.56} \definecolor{DarkSeaGreen1}{rgb}{0.76,1.00,0.76} \definecolor{DarkSeaGreen2}{rgb}{0.71,0.93,0.71} \definecolor{DarkSeaGreen3}{rgb}{0.61,0.80,0.61} \definecolor{DarkSeaGreen4}{rgb}{0.41,0.55,0.41} \definecolor{DarkSlateGray}{rgb}{0.18,0.31,0.31} \definecolor{DarkSlateGray1}{rgb}{0.59,1.00,1.00} \definecolor{DarkSlateGray2}{rgb}{0.55,0.93,0.93} \definecolor{DarkSlateGray3}{rgb}{0.47,0.80,0.80} \definecolor{DarkSlateGray4}{rgb}{0.32,0.55,0.55} \definecolor{DeepPink}{rgb}{1.00,0.08,0.58} \definecolor{DeepPink1}{rgb}{1.00,0.08,0.58} \definecolor{DeepPink2}{rgb}{0.93,0.07,0.54} \definecolor{DeepPink3}{rgb}{0.80,0.06,0.46} \definecolor{DeepPink4}{rgb}{0.55,0.04,0.31} \definecolor{DeepSkyBlue}{rgb}{0.00,0.75,1.00} \definecolor{DeepSkyBlue1}{rgb}{0.00,0.75,1.00} \definecolor{DeepSkyBlue2}{rgb}{0.00,0.70,0.93} \definecolor{DeepSkyBlue3}{rgb}{0.00,0.60,0.80} \definecolor{DeepSkyBlue4}{rgb}{0.00,0.41,0.55} \definecolor{DodgerBlue}{rgb}{0.12,0.56,1.00} \definecolor{DodgerBlue1}{rgb}{0.12,0.56,1.00} \definecolor{DodgerBlue2}{rgb}{0.11,0.53,0.93} \definecolor{DodgerBlue3}{rgb}{0.09,0.45,0.80} \definecolor{DodgerBlue4}{rgb}{0.06,0.31,0.55} \definecolor{HotPink1}{rgb}{1.00,0.43,0.71} \definecolor{HotPink2}{rgb}{0.93,0.42,0.65} \definecolor{HotPink3}{rgb}{0.80,0.38,0.56} \definecolor{HotPink4}{rgb}{0.55,0.23,0.38} \definecolor{IndianRed}{rgb}{0.80,0.36,0.36} \definecolor{IndianRed1}{rgb}{1.00,0.42,0.42} \definecolor{IndianRed2}{rgb}{0.93,0.39,0.39} \definecolor{IndianRed3}{rgb}{0.80,0.33,0.33} \definecolor{IndianRed4}{rgb}{0.55,0.23,0.23} \definecolor{LavenderBlush}{rgb}{1.00,0.94,0.96} \definecolor{LavenderBlush1}{rgb}{1.00,0.94,0.96} \definecolor{LavenderBlush2}{rgb}{0.93,0.88,0.90} \definecolor{LavenderBlush3}{rgb}{0.80,0.76,0.77} \definecolor{LavenderBlush4}{rgb}{0.55,0.51,0.53} \definecolor{LemonChiffon}{rgb}{1.00,0.98,0.80} \definecolor{LemonChiffon1}{rgb}{1.00,0.98,0.80} \definecolor{LemonChiffon2}{rgb}{0.93,0.91,0.75} \definecolor{LemonChiffon3}{rgb}{0.80,0.79,0.65} \definecolor{LemonChiffon4}{rgb}{0.55,0.54,0.44} \definecolor{LightBlue}{rgb}{0.68,0.85,0.90} \definecolor{LightBlue1}{rgb}{0.75,0.94,1.00} \definecolor{LightBlue2}{rgb}{0.70,0.87,0.93} \definecolor{LightBlue3}{rgb}{0.60,0.75,0.80} \definecolor{LightBlue4}{rgb}{0.41,0.51,0.55} \definecolor{LightCyan}{rgb}{0.88,1.00,1.00} \definecolor{LightCyan1}{rgb}{0.88,1.00,1.00} \definecolor{LightCyan2}{rgb}{0.82,0.93,0.93} \definecolor{LightCyan3}{rgb}{0.71,0.80,0.80} \definecolor{LightCyan4}{rgb}{0.48,0.55,0.55} \definecolor{LightGoldenrod}{rgb}{0.93,0.87,0.51} \definecolor{LightGoldenrod1}{rgb}{1.00,0.93,0.55} \definecolor{LightGoldenrod2}{rgb}{0.93,0.86,0.51} \definecolor{LightGoldenrod3}{rgb}{0.80,0.75,0.44} \definecolor{LightGoldenrod4}{rgb}{0.55,0.51,0.30} \definecolor{LightPink}{rgb}{1.00,0.71,0.76} \definecolor{LightPink1}{rgb}{1.00,0.68,0.73} \definecolor{LightPink2}{rgb}{0.93,0.64,0.68} \definecolor{LightPink3}{rgb}{0.80,0.55,0.58} \definecolor{LightPink4}{rgb}{0.55,0.37,0.40} \definecolor{LightSalmon}{rgb}{1.00,0.63,0.48} \definecolor{LightSalmon1}{rgb}{1.00,0.63,0.48} \definecolor{LightSalmon2}{rgb}{0.93,0.58,0.45} \definecolor{LightSalmon3}{rgb}{0.80,0.51,0.38} \definecolor{LightSalmon4}{rgb}{0.55,0.34,0.26} \definecolor{LightSkyBlue}{rgb}{0.53,0.81,0.98} \definecolor{LightSkyBlue1}{rgb}{0.69,0.89,1.00} \definecolor{LightSkyBlue2}{rgb}{0.64,0.83,0.93} \definecolor{LightSkyBlue3}{rgb}{0.55,0.71,0.80} \definecolor{LightSkyBlue4}{rgb}{0.38,0.48,0.55} \definecolor{LightSteelBlue}{rgb}{0.69,0.77,0.87} \definecolor{LightSteelBlue1}{rgb}{0.79,0.88,1.00} \definecolor{LightSteelBlue2}{rgb}{0.74,0.82,0.93} \definecolor{LightSteelBlue3}{rgb}{0.64,0.71,0.80} \definecolor{LightSteelBlue4}{rgb}{0.43,0.48,0.55} \definecolor{LightYellow}{rgb}{1.00,1.00,0.88} \definecolor{LightYellow1}{rgb}{1.00,1.00,0.88} \definecolor{LightYellow2}{rgb}{0.93,0.93,0.82} \definecolor{LightYellow3}{rgb}{0.80,0.80,0.71} \definecolor{LightYellow4}{rgb}{0.55,0.55,0.48} \definecolor{MediumOrchid}{rgb}{0.73,0.33,0.83} \definecolor{MediumOrchid1}{rgb}{0.88,0.40,1.00} \definecolor{MediumOrchid2}{rgb}{0.82,0.37,0.93} \definecolor{MediumOrchid3}{rgb}{0.71,0.32,0.80} \definecolor{MediumOrchid4}{rgb}{0.48,0.22,0.55} \definecolor{MediumPurple1}{rgb}{0.67,0.51,1.00} \definecolor{MediumPurple2}{rgb}{0.62,0.47,0.93} \definecolor{MediumPurple3}{rgb}{0.54,0.41,0.80} \definecolor{MediumPurple4}{rgb}{0.36,0.28,0.55} \definecolor{MistyRose}{rgb}{1.00,0.89,0.88} \definecolor{MistyRose1}{rgb}{1.00,0.89,0.88} \definecolor{MistyRose2}{rgb}{0.93,0.84,0.82} \definecolor{MistyRose3}{rgb}{0.80,0.72,0.71} \definecolor{MistyRose4}{rgb}{0.55,0.49,0.48} \definecolor{NavajoWhite}{rgb}{1.00,0.87,0.68} \definecolor{NavajoWhite1}{rgb}{1.00,0.87,0.68} \definecolor{NavajoWhite2}{rgb}{0.93,0.81,0.63} \definecolor{NavajoWhite3}{rgb}{0.80,0.70,0.55} \definecolor{NavajoWhite4}{rgb}{0.55,0.47,0.37} \definecolor{OliveDrab}{rgb}{0.42,0.56,0.14} \definecolor{OliveDrab1}{rgb}{0.75,1.00,0.24} \definecolor{OliveDrab2}{rgb}{0.70,0.93,0.23} \definecolor{OliveDrab3}{rgb}{0.60,0.80,0.20} \definecolor{OliveDrab4}{rgb}{0.41,0.55,0.13} \definecolor{OrangeRed}{rgb}{1.00,0.27,0.00} \definecolor{OrangeRed1}{rgb}{1.00,0.27,0.00} \definecolor{OrangeRed2}{rgb}{0.93,0.25,0.00} \definecolor{OrangeRed3}{rgb}{0.80,0.22,0.00} \definecolor{OrangeRed4}{rgb}{0.55,0.15,0.00} \definecolor{PaleGreen}{rgb}{0.60,0.98,0.60} \definecolor{PaleTurquoise}{rgb}{0.69,0.93,0.93} \definecolor{PaleTurquoise1}{rgb}{0.73,1.00,1.00} \definecolor{PaleTurquoise2}{rgb}{0.68,0.93,0.93} \definecolor{PaleTurquoise3}{rgb}{0.59,0.80,0.80} \definecolor{PaleTurquoise4}{rgb}{0.40,0.55,0.55} \definecolor{PaleVioletRed}{rgb}{0.86,0.44,0.58} \definecolor{PaleVioletRed1}{rgb}{1.00,0.51,0.67} \definecolor{PaleVioletRed2}{rgb}{0.93,0.47,0.62} \definecolor{PaleVioletRed3}{rgb}{0.80,0.41,0.54} \definecolor{PaleVioletRed4}{rgb}{0.55,0.28,0.36} \definecolor{RosyBrown}{rgb}{0.74,0.56,0.56} \definecolor{RosyBrown1}{rgb}{1.00,0.76,0.76} \definecolor{RosyBrown2}{rgb}{0.93,0.71,0.71} \definecolor{RosyBrown3}{rgb}{0.80,0.61,0.61} \definecolor{RosyBrown4}{rgb}{0.55,0.41,0.41} \definecolor{RoyalBlue1}{rgb}{0.28,0.46,1.00} \definecolor{RoyalBlue2}{rgb}{0.26,0.43,0.93} \definecolor{RoyalBlue3}{rgb}{0.23,0.37,0.80} \definecolor{RoyalBlue4}{rgb}{0.15,0.25,0.55} \definecolor{SeaGreen}{rgb}{0.18,0.55,0.34} \definecolor{SeaGreen1}{rgb}{0.33,1.00,0.62} \definecolor{SeaGreen2}{rgb}{0.31,0.93,0.58} \definecolor{SeaGreen3}{rgb}{0.26,0.80,0.50} \definecolor{SeaGreen4}{rgb}{0.18,0.55,0.34} \definecolor{SkyBlue}{rgb}{0.53,0.81,0.92} \definecolor{SkyBlue1}{rgb}{0.53,0.81,1.00} \definecolor{SkyBlue2}{rgb}{0.49,0.75,0.93} \definecolor{SkyBlue3}{rgb}{0.42,0.65,0.80} \definecolor{SkyBlue4}{rgb}{0.29,0.44,0.55} \definecolor{SlateBlue1}{rgb}{0.51,0.44,1.00} \definecolor{SlateBlue2}{rgb}{0.48,0.40,0.93} \definecolor{SlateBlue3}{rgb}{0.41,0.35,0.80} \definecolor{SlateBlue4}{rgb}{0.28,0.24,0.55} \definecolor{SlateGray}{rgb}{0.44,0.50,0.56} \definecolor{SlateGray1}{rgb}{0.78,0.89,1.00} \definecolor{SlateGray2}{rgb}{0.73,0.83,0.93} \definecolor{SlateGray3}{rgb}{0.62,0.71,0.80} \definecolor{SlateGray4}{rgb}{0.42,0.48,0.55} \definecolor{SpringGreen}{rgb}{0.00,1.00,0.50} \definecolor{SpringGreen1}{rgb}{0.00,1.00,0.50} \definecolor{SpringGreen2}{rgb}{0.00,0.93,0.46} \definecolor{SpringGreen3}{rgb}{0.00,0.80,0.40} \definecolor{SpringGreen4}{rgb}{0.00,0.55,0.27} \definecolor{SteelBlue}{rgb}{0.27,0.51,0.71} \definecolor{SteelBlue1}{rgb}{0.39,0.72,1.00} \definecolor{SteelBlue2}{rgb}{0.36,0.67,0.93} \definecolor{SteelBlue3}{rgb}{0.31,0.58,0.80} \definecolor{SteelBlue4}{rgb}{0.21,0.39,0.55} \definecolor{VioletRed}{rgb}{0.82,0.13,0.56} \definecolor{VioletRed1}{rgb}{1.00,0.24,0.59} \definecolor{VioletRed2}{rgb}{0.93,0.23,0.55} \definecolor{VioletRed3}{rgb}{0.80,0.20,0.47} \definecolor{VioletRed4}{rgb}{0.55,0.13,0.32} \definecolor{aquamarine}{rgb}{0.50,1.00,0.83} \definecolor{aquamarine1}{rgb}{0.50,1.00,0.83} \definecolor{aquamarine2}{rgb}{0.46,0.93,0.78} \definecolor{aquamarine3}{rgb}{0.40,0.80,0.67} \definecolor{aquamarine4}{rgb}{0.27,0.55,0.45} \definecolor{azure}{rgb}{0.94,1.00,1.00} \definecolor{azure1}{rgb}{0.94,1.00,1.00} \definecolor{azure2}{rgb}{0.88,0.93,0.93} \definecolor{azure3}{rgb}{0.76,0.80,0.80} \definecolor{azure4}{rgb}{0.51,0.55,0.55} \definecolor{bisque}{rgb}{1.00,0.89,0.77} \definecolor{bisque1}{rgb}{1.00,0.89,0.77} \definecolor{bisque2}{rgb}{0.93,0.84,0.72} \definecolor{bisque3}{rgb}{0.80,0.72,0.62} \definecolor{bisque4}{rgb}{0.55,0.49,0.42} \definecolor{blue1}{rgb}{0.00,0.00,1.00} \definecolor{blue2}{rgb}{0.00,0.00,0.93} \definecolor{blue3}{rgb}{0.00,0.00,0.80} \definecolor{blue4}{rgb}{0.00,0.00,0.55} \definecolor{brown1}{rgb}{1.00,0.25,0.25} \definecolor{brown2}{rgb}{0.93,0.23,0.23} \definecolor{brown3}{rgb}{0.80,0.20,0.20} \definecolor{brown4}{rgb}{0.55,0.14,0.14} \definecolor{burlywood}{rgb}{0.87,0.72,0.53} \definecolor{burlywood1}{rgb}{1.00,0.83,0.61} \definecolor{burlywood2}{rgb}{0.93,0.77,0.57} \definecolor{burlywood3}{rgb}{0.80,0.67,0.49} \definecolor{burlywood4}{rgb}{0.55,0.45,0.33} \definecolor{chartreuse}{rgb}{0.50,1.00,0.00} \definecolor{chartreuse1}{rgb}{0.50,1.00,0.00} \definecolor{chartreuse2}{rgb}{0.46,0.93,0.00} \definecolor{chartreuse3}{rgb}{0.40,0.80,0.00} \definecolor{chartreuse4}{rgb}{0.27,0.55,0.00} \definecolor{chocolate}{rgb}{0.82,0.41,0.12} \definecolor{coral}{rgb}{1.00,0.50,0.31} \definecolor{coral1}{rgb}{1.00,0.45,0.34} \definecolor{coral2}{rgb}{0.93,0.42,0.31} \definecolor{coral3}{rgb}{0.80,0.36,0.27} \definecolor{coral4}{rgb}{0.55,0.24,0.18} \definecolor{cornsilk}{rgb}{1.00,0.97,0.86} \definecolor{cornsilk1}{rgb}{1.00,0.97,0.86} \definecolor{cornsilk2}{rgb}{0.93,0.91,0.80} \definecolor{cornsilk3}{rgb}{0.80,0.78,0.69} \definecolor{cornsilk4}{rgb}{0.55,0.53,0.47} \definecolor{cyan}{rgb}{0.00,1.00,1.00} \definecolor{cyan1}{rgb}{0.00,1.00,1.00} \definecolor{cyan2}{rgb}{0.00,0.93,0.93} \definecolor{cyan3}{rgb}{0.00,0.80,0.80} \definecolor{cyan4}{rgb}{0.00,0.55,0.55} \definecolor{firebrick}{rgb}{0.70,0.13,0.13} \definecolor{firebrick1}{rgb}{1.00,0.19,0.19} \definecolor{firebrick2}{rgb}{0.93,0.17,0.17} \definecolor{firebrick3}{rgb}{0.80,0.15,0.15} \definecolor{firebrick4}{rgb}{0.55,0.10,0.10} \definecolor{gold}{rgb}{1.00,0.84,0.00} \definecolor{gold1}{rgb}{1.00,0.84,0.00} \definecolor{gold2}{rgb}{0.93,0.79,0.00} \definecolor{gold3}{rgb}{0.80,0.68,0.00} \definecolor{gold4}{rgb}{0.55,0.46,0.00} \definecolor{goldenrod}{rgb}{0.85,0.65,0.13} \definecolor{goldenrod1}{rgb}{1.00,0.76,0.15} \definecolor{goldenrod2}{rgb}{0.93,0.71,0.13} \definecolor{goldenrod3}{rgb}{0.80,0.61,0.11} \definecolor{goldenrod4}{rgb}{0.55,0.41,0.08} \definecolor{gray}{rgb}{0.75,0.75,0.75} \definecolor{gray1}{rgb}{0.01,0.01,0.01} \definecolor{gray2}{rgb}{0.02,0.02,0.02} \definecolor{gray3}{rgb}{0.03,0.03,0.03} \definecolor{gray4}{rgb}{0.04,0.04,0.04} \definecolor{green1}{rgb}{0.00,1.00,0.00} \definecolor{green2}{rgb}{0.00,0.93,0.00} \definecolor{green3}{rgb}{0.00,0.80,0.00} \definecolor{green4}{rgb}{0.00,0.55,0.00} \definecolor{grey1}{rgb}{0.01,0.01,0.01} \definecolor{grey2}{rgb}{0.02,0.02,0.02} \definecolor{grey3}{rgb}{0.03,0.03,0.03} \definecolor{grey4}{rgb}{0.04,0.04,0.04} \definecolor{honeydew}{rgb}{0.94,1.00,0.94} \definecolor{honeydew1}{rgb}{0.94,1.00,0.94} \definecolor{honeydew2}{rgb}{0.88,0.93,0.88} \definecolor{honeydew3}{rgb}{0.76,0.80,0.76} \definecolor{honeydew4}{rgb}{0.51,0.55,0.51} \definecolor{ivory}{rgb}{1.00,1.00,0.94} \definecolor{ivory1}{rgb}{1.00,1.00,0.94} \definecolor{ivory2}{rgb}{0.93,0.93,0.88} \definecolor{ivory3}{rgb}{0.80,0.80,0.76} \definecolor{ivory4}{rgb}{0.55,0.55,0.51} \definecolor{khaki}{rgb}{0.94,0.90,0.55} \definecolor{khaki1}{rgb}{1.00,0.96,0.56} \definecolor{khaki2}{rgb}{0.93,0.90,0.52} \definecolor{khaki3}{rgb}{0.80,0.78,0.45} \definecolor{khaki4}{rgb}{0.55,0.53,0.31} \definecolor{magenta}{rgb}{1.00,0.00,1.00} \definecolor{magenta1}{rgb}{1.00,0.00,1.00} \definecolor{magenta2}{rgb}{0.93,0.00,0.93} \definecolor{magenta3}{rgb}{0.80,0.00,0.80} \definecolor{magenta4}{rgb}{0.55,0.00,0.55} \definecolor{maroon}{rgb}{0.69,0.19,0.38} \definecolor{maroon1}{rgb}{1.00,0.20,0.70} \definecolor{maroon2}{rgb}{0.93,0.19,0.65} \definecolor{maroon3}{rgb}{0.80,0.16,0.56} \definecolor{maroon4}{rgb}{0.55,0.11,0.38} \definecolor{orange1}{rgb}{1.00,0.65,0.00} \definecolor{orchid}{rgb}{0.85,0.44,0.84} \definecolor{orchid1}{rgb}{1.00,0.51,0.98} \definecolor{orchid2}{rgb}{0.93,0.48,0.91} \definecolor{orchid3}{rgb}{0.80,0.41,0.79} \definecolor{orchid4}{rgb}{0.55,0.28,0.54} \definecolor{pink1}{rgb}{1.00,0.71,0.77} \definecolor{pink2}{rgb}{0.93,0.66,0.72} \definecolor{pink3}{rgb}{0.80,0.57,0.62} \definecolor{pink4}{rgb}{0.55,0.39,0.42} \definecolor{plum1}{rgb}{1.00,0.73,1.00} \definecolor{plum2}{rgb}{0.93,0.68,0.93} \definecolor{plum3}{rgb}{0.80,0.59,0.80} \definecolor{plum4}{rgb}{0.55,0.40,0.55} \definecolor{purple1}{rgb}{0.61,0.19,1.00} \definecolor{purple2}{rgb}{0.57,0.17,0.93} \definecolor{purple3}{rgb}{0.49,0.15,0.80} \definecolor{purple4}{rgb}{0.33,0.10,0.55} \definecolor{red1}{rgb}{1.00,0.00,0.00} \definecolor{red2}{rgb}{0.93,0.00,0.00} \definecolor{red3}{rgb}{0.80,0.00,0.00} \definecolor{red4}{rgb}{0.55,0.00,0.00} \definecolor{salmon}{rgb}{0.98,0.50,0.45} \definecolor{salmon1}{rgb}{1.00,0.55,0.41} \definecolor{salmon2}{rgb}{0.93,0.51,0.38} \definecolor{salmon3}{rgb}{0.80,0.44,0.33} \definecolor{salmon4}{rgb}{0.55,0.30,0.22} \definecolor{seashell}{rgb}{1.00,0.96,0.93} \definecolor{seashell1}{rgb}{1.00,0.96,0.93} \definecolor{seashell2}{rgb}{0.93,0.90,0.87} \definecolor{seashell3}{rgb}{0.80,0.77,0.75} \definecolor{seashell4}{rgb}{0.55,0.53,0.51} \definecolor{sienna}{rgb}{0.63,0.32,0.18} \definecolor{sienna1}{rgb}{1.00,0.51,0.28} \definecolor{sienna2}{rgb}{0.93,0.47,0.26} \definecolor{sienna3}{rgb}{0.80,0.41,0.22} \definecolor{sienna4}{rgb}{0.55,0.28,0.15} \definecolor{snow}{rgb}{1.00,0.98,0.98} \definecolor{snow1}{rgb}{1.00,0.98,0.98} \definecolor{snow2}{rgb}{0.93,0.91,0.91} \definecolor{snow3}{rgb}{0.80,0.79,0.79} \definecolor{snow4}{rgb}{0.55,0.54,0.54} \definecolor{tan}{rgb}{0.82,0.71,0.55} \definecolor{tan1}{rgb}{1.00,0.65,0.31} \definecolor{tan2}{rgb}{0.93,0.60,0.29} \definecolor{tan3}{rgb}{0.80,0.52,0.25} \definecolor{tan4}{rgb}{0.55,0.35,0.17} \definecolor{thistle}{rgb}{0.85,0.75,0.85} \definecolor{thistle1}{rgb}{1.00,0.88,1.00} \definecolor{thistle2}{rgb}{0.93,0.82,0.93} \definecolor{thistle3}{rgb}{0.80,0.71,0.80} \definecolor{thistle4}{rgb}{0.55,0.48,0.55} \definecolor{tomato}{rgb}{1.00,0.39,0.28} \definecolor{tomato1}{rgb}{1.00,0.39,0.28} \definecolor{tomato2}{rgb}{0.93,0.36,0.26} \definecolor{tomato3}{rgb}{0.80,0.31,0.22} \definecolor{tomato4}{rgb}{0.55,0.21,0.15} \definecolor{turquoise1}{rgb}{0.00,0.96,1.00} \definecolor{turquoise2}{rgb}{0.00,0.90,0.93} \definecolor{turquoise3}{rgb}{0.00,0.77,0.80} \definecolor{turquoise4}{rgb}{0.00,0.53,0.55} \definecolor{wheat}{rgb}{0.96,0.87,0.70} \definecolor{wheat1}{rgb}{1.00,0.91,0.73} \definecolor{wheat2}{rgb}{0.93,0.85,0.68} \definecolor{wheat3}{rgb}{0.80,0.73,0.59} \definecolor{wheat4}{rgb}{0.55,0.49,0.40} \definecolor{yellow1}{rgb}{1.00,1.00,0.00} \definecolor{yellow2}{rgb}{0.93,0.93,0.00} \definecolor{yellow3}{rgb}{0.80,0.80,0.00} \definecolor{yellow4}{rgb}{0.55,0.55,0.00} Chart-2.4.6/doc/LaTeX/composite.png0000644000175000017500000000432110730344060016345 0ustar reinerreinerPNG  IHDR,PLTEoӸtRNS@fjIDATxm6s,'Xj.kU1?Bj}` PL?-ɴdtuD D D D D D D +=\>Uo\/B ;`+avfFثPO}P,Aq#"lxܰOsOsE4?'DE# '̮C!eh--|OH0i @?D@?D ]UE6h]w:~cB= U b RY,V@**K66-@؈!x-ic 2I3wc&Ђk>$ uLAYfwBp:0iTI l9z8_=fiw Wsi)Dْ>e4IhC\ ҭ* u Vi|ɟZ'ӉUD|SjNo.4I-Ơ5ssDW Ij}Acx%@Nl~$욒c+DO8?R $2)jrB[R $1ތUZl5r9HZl5[R$)䕔iNz[@Ft)p%'Ӹ $%%VU b~zfsxlZBlUl잔i[ i HBla - ˵UAⱵd o4zR([$[@:G eUhV*;eY#8pz J 8"gyb+w c_0H$ &A=kDb+ u1 WAoc+^ ]$["kQ68@l c?\ÁR7īeWW@ ܒtP q|/%_K_z@e@.B굜+IJ )_N8"Ǻ9Z%U~u Q}AM *;yyv@:w[|Ň@Z~jdx->62 r8j5LuCV#Ay82A]'ej\y U6T97?ZA_5?_%fZG"jn@$! Ѐu/.8x.9w#9 Ҵ m$%WB B B B {_VK! x^xv9?raŷL޻5 r7s'H>s &A,u@jVs?\UP ]i.]d1_xoC *NK @@@@@@r@ (x})^<{@hi rJ!y~df8Y"I"5b&u 3ht4у=(IDsV+S\0kY\ .29Ucoė2m`afp&\`Q ̝@~ =,Tm V$hp\vo@Edg\MiyꆯV2Hmbϛ0:dw y,f1 -߀3M܏CR>rA69kx< k@~Rc> #mi#E D D D D D D D D D D t($^ IENDB`Chart-2.4.6/doc/LaTeX/direction.png0000644000175000017500000001736110730341202016326 0ustar reinerreinerPNG  IHDR9¹PLTEB\ntRNS@fIDATx (@ 0N|}$m+>UP jw6BUx[Ow@G9Qw@(|b?qHT-etHAO" -EbN>MxCe#' ,*śLѲy&lrd'ax]4_R\D`)n޾Uꝛ]vi/+;ʁr(;ʁrx[7^Itqǁ_Ytqǁ_Y^}X^]l-ۢ3`ky@zyP/@@@@ *}|@=;<1l2]v@MӐᎿ=:`XsdXPtʁn%z3FvyͩCطB/u Go^`\S#@TSe+ I>/pt -VWԙ'bsnxǢgEg>f"j/Us5q;C[UJoD2O8Z0JUR>|>Ƀ ~vtyF:A5 4 =>|ZftdrXҒw*f86HR!(ћWSB#gZWW|UDvt|@vQ O_nE/7&FwA2ȍ-uuCgq3ItN+OZwkN5<+ML-W/$H'⫘J%6^7ի]giXҗ'дŨzXB/Ζ{.+_M.)/\b}sA_.WOYjĻF2z}o"tl|ESڳ]43C%Ɗ#ubHHb{K*+8KANM1VJUG7^Q'FO2\{G4լ-INӌ07g}QqF+ +ǯ(MIQ9zBe+:& tiV*T3lHܸeSݿbdTkN BQوv1YX;0FGkD.f0-- -X%x#OlnVn´=Ϳ-Q?4clz/t4F̎z4nm:J -?$4CEr_28o]h]t,EV1z (z2 m{ :x~yjie}:L{/$>Hm|GeƆGh_t̹Rbv=N3L+KP? 0ERO;s젗aڷA+g%vAGMXJ-6BGV`t)11гYA;xYl=- ;K&_h ϾR~: g'W;:y4̌Y( B%=A_nTkG/. 3KCO%k>ݙxt0f|F6K;z ]Gcy3s)X 1 0"̑~ TtcQov=⎻@!sD N%tfҚjc')G&2;4N8Кm"th6[|:tN=-'E)y=:Ct0քfz7ґ_[=':Ict(%R(Uduzn%:v0G ?]O>JODdڸ-B?#Z+&jV#w`oFv|܀1jɵ7ECOˎT^Qxdv:TCEn~H9LVAб.>GOcKHHBGg5gvE;|j9):#MgvgUoQG&dY׊.--{/t71_eIt[_U_-z櫴6M~S`Aҳ^%P<^5oʌ>Ok҆աQɒJgzqH%?ڊNEI ]?S|GE.nBt_G=%Us8sgM.PG5{nCNxnPEht٠K ϻ=T/-} :LbKk5 z[_ՅЗPۡ'`f:";RJ :<x;GSFk՝ztϛ55~¾%1A?w0PN2ב=ޡG8?WNuLLhv=hMTqU.@'G<ޡ'sW]бۣ$T3>^lE;NT :]G>4EO| _mNsMѽ ٴ7"10WUr9}xK֜nKFl}Yɣ뾺Oi?DCp[ѥi &SS0gr͠y>)4;^畹1;ks׉[_Dw3]>yf=~Q-̓Jg}u{g5^ZҋݞDK|p=UE#\amWJvzBO~_.x4ZS/"-ѵ~͛E?d*#8UGE==]A=7{rwpG{>sEÝl/녧~3ItjOt=dW~}qY}Z~Ξ3oN*N,uLҖ<{i.?X8N-ɁDZOmX_qDʘz5!j1O>y#]x[D|9Gݮ'mD_Ym9-R}HLP}nT Yw78-_H6VtGQ糳O_]ܟ֖)۬x,+% }!/v:SRUf ]9na};b+tYu\ 44;EB]~fe\}Z]ùiFM1סg)Eؠ1(7'L: U4x'56Ƕm$B]:4J].؟8/Ol[M_ ɼ~LW_lVlixdJ;C ^ m ա޳B!Oף!kvix~ 5`|[;s|F5trT䯄86_8>5wKO k^]ǐ] J,9D^o%{#tЛ<.Ni>.32]*w~kE .̡sa "RC-jtl<Ŋ^CF0Jѓ$意N[BLǔu":.; ?Bc{2,DMK ~6: -Ko. xz s1Q݃[8_iL7 }2X^}6.UNMPM] q!嚑C,uRguC!WwB5F[r]=M*ۻ}ܻ:19vryc4"GnI+Mqj=vahi~otqf#^Or^NWp5FRt6H63ս^3M` S܎\%x@ɴ9T4OUkTQsnbWOJ 7yyB^< EE> 11AytZWԼSI=0NI,uxEI%u׆/,u ___FFsߌD_7Z~^|Y߬с5X(K+~lN}1+ɥ-ѵe%ᮏ(Y=8>+ɥ.ҠAaL5ղ#t$Iu-Α;)si&; od@k+Ѓy5"Eᩊbgڽ*r6'PKWv0:uj^QX_:#Iϖ,h\:j躨н;H*ڶAL Ct>?>iUr)(T* %y2}YCH_j(8=%+3ucwJY+Ǡva-WViW;#hNހ(pzE):0L=;ʵ](ր{[QoD(\䆣0FGZv΀J..qc\wE: #7nkdMK:=xvj+֣*0z :֑%4J:tr{IE ]ѓ)ǵ+(&In3 [8v=:K>Td$btAhO))觴*hBeژk- &+TbvA,d|GczZZ+!$=G4L+YY &F]mNt/z˯@0Dbw!^q Fcmȫ^^Pvz^c+;m9ɪNgG>ѩX=ǣWVQ(qoNIUct=`U :m;LNz\l^d/\@cCȷC/TS9+Xh|MԿUGƀW@eSt;/r*A ʭaOCzr3t9rr*DOmʢda/ta*yV]IfC{鳞R'/}|@=;-ZԪA\ )rٲk }ܵ$>71qx!0˽]V   H ;_`] 1 ˏ+cw@HwH7 ׀ p3 Jo;  e B .]w4@nEn];}kՂkuU.o\ZS+PtT}]ix dTlBi|bMe^A X q<#x _4Wc= bolm3>t-gB~@@AթBȞ @yݐO=!̈Q ."S9Wi@dr޶^@@@#]@}*u@F =ϲwN%5 왓!GQ.|ol=Ci]o( &ScI'ob&yϾ4?Cx$gM-@B6 qf=Sf RLjJHUEbstBϒ@i"D%=.y|Z !6L>#IV "@.d@3[GwӇ|=|x|kT~S! @DD󚽀Njm[ @@@@Ȯ!#T  vFݐuLJ > }L:i2v͐ #y H{+\,o+ z䧏Ttd8Rz)\Z֯#YVgϥtᯱZ|h 뤳g#AܱH>\.mEƈxR2;F9e5 Sث> ij\7>6ˋMq?xy MI=,AJ4SCAAAAd++tX`IENDB`Chart-2.4.6/doc/LaTeX/Lines.tex0000644000175000017500000000655210735744630015455 0ustar reinerreiner% % lines.tex % \renewcommand{\thisname}{Chart::Lines} \section{\thisname} \name{\thisname} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a lines chart. (If you want the data points marked with symbols, check \class{Chart::LinesPoints} on page \pageref{Chart::LinesPoints}.) \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.5]{d_lines2.png} \end{center} \caption{Lines chart} \label{fig:lines} \end{figure} \begin{verbatim} use Chart::Lines; $g = Chart::Lines->new(); $g->add_dataset('foo', 'bar', 'junk', 'ding', 'bat'); $g->add_dataset( -4, 3, -4, -5, -2); $g->add_dataset( 2, 10, -3, 8, 3); $g->add_dataset(-10, 2, 4, -3, -3); $g->add_dataset( 7, -5, -3, 4, 7); %hash = ('legend_labels' => ['1st Quarter', '2nd Quarter', '3rd Quarter', '4th Quarter'], 'y_axes' => 'both', 'title' => 'Lines Demo', 'grid_lines' => 'true', 'legend' => 'left', 'legend_example_size' => 20, 'colors' => {'text' => 'blue', 'misc' => 'blue', 'background' => 'grey', 'grid_lines' => 'light_blue', 'dataset0' => [220,0,0], 'dataset1' => [200,0,100], 'dataset2' => [150,50,175], 'dataset3' => [170,0,255] } ); $g->set(%hash); $g->png("lines.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{brush\_size} Sets the width of the lines in pixels. Default is 6. \end{AttrDecl} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{stepline} The points are connected by a stepping function,instead of by a direct line if set to \literal{true}. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{stepline\_mode} Determines whether to plot each stepping line at the level of the start of the interval (if set to \literal{begin}) or at its end if set to \literal{end}. Defaults to \literal{begin}. \end{AttrDecl} \attrdecl{xlabels} \begin{AttrDecl}{xrange} This pair of options allows arbitrary positioning of $x$ axis labels. The two options must either both be specified or both be omitted. \attruse{xlabels} is a reference to 2-element array. The first of the elements is a nested (reference to an) array of strings that are the labels. The second element is a nested (reference to an) array of numbers that are the $x$ values at which the labels should be placed. \attruse{xrange} is a 2-element array specifying the minimum and maximum $x$ values on the axis. \Eg, \begin{verbatim} @labels = (['Jan', 'Feb', 'Mar'], [10, 40, 70 ]); $chart->set(xlabels => \bs @labels, xrange => [0, 100] ); \end{verbatim} \end{AttrDecl} \begin{AttrDecl}{xy\_plot} Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true}, \ie, to treat the $x$ axis as numeric. Very useful for plots of mathematical functions. Defaults to \literal{false}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/Stacked.tex0000644000175000017500000000275510735744747015773 0ustar reinerreiner% % stacked.tex % \renewcommand{\thisname}{Chart::StackedBars} \section{\thisname} \name{\thisname} \file{StackedBars.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a chart made up of stacked vertical bars. The first data set will be shown at the bottom of the stack, the last at the top. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.6]{stackedbars.png} \end{center} \caption{Chart with stacked bars} \label{fig:stackedbars} \end{figure} \begin{verbatim} use Chart::StackedBars; $g = Chart::StackedBars->new(); $g->add_dataset(qw(foo bar junk taco karp)); $g->add_dataset(3, 4, 9, 10, 11); $g->add_dataset(8, 6, 1, 12, 1); $g->add_dataset(5, 7, 2, 13, 4); $g->set('title' => 'Stacked Bar Chart'); $g->set('y_grid_lines' => 'true'); $g->set('legend' => 'bottom'); $g->png("stackedbars.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{spaced\_bars} Leaves some space between the individual bars when set to \literal{true}. This usually make it easier to read a bar chart, with stacked bars, however, it is not as important as with groups of bars. Default is \literal{true}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/description.tex0000644000175000017500000002465611701663121016720 0ustar reinerreiner% description.tex %----------------- \clearpage \section{Description} \synopsis \begin{verbatim} use Chart::type; (type is one of: Bars, Composite, Direction, ErrorBars, HorizontalBars, Lines, LinesPoints, Mountain, Pareto, Pie, Points, Split or StackedBars) $obj = Chart::type->new(); $obj = Chart::type->new(\$width, \$height); $obj->set( $key_1, $val_1, ... , $key_n, $val_n); $obj->set( $key_1 => $val_1, ... , $key_n => $val_n); $obj->set( %hash ); # Graph.pm-style API to produce PNG formatted charts: @data = ( \@x_tick_labels, \@dataset_1, ... , \@dataset_n); $obj->png( "filename", \@data ); $obj->png( $filehandle, \@data ); $obj->png( FILEHANDLE, \@data ); $obj->cgi_png(); # Graph.pm-style API: $obj->add_pt($label, $val_1, ..., $val_n); $obj->add_dataset($val_1, ..., $val_n); $obj->png("filename"); $obj->png($filehandle); $obj->png(FILEHANDLE); $obj->cgi_png(); # Similar functions are available for JPEG output. # Retrieve imagemap information: $obj->set('imagemap' => 'true'); $imagemap_ref = $obj->imagemap_dump(); \end{verbatim} \clearpage The Perl module \class{Chart} creates \textsc{png} or \textsc{jpeg} output which can be written to a file or to stdout. Therefore, \class{Chart} can also create dynamic charts for web sites. Many different chart types are available, viz., Bars, Composite, Direction, ErrorBars, HorizontalBars, Lines, LinesPoints, Mountain, Pareto, Pie, Points, Split, and StackedBars. Each specific type is implemented as a class by itself which is derived from the same abstract superclass, Base. The hierarchy of \class{Chart} classes is shown in Figure~\ref{fig:Aufbau}. \begin{figure}[ht] \begin{center} \includegraphics[scale=0.5]{Aufbau.png} \end{center} \caption{The hierarchy of \class{Chart} classes} \label{fig:Aufbau} \end{figure} You must create an \emph{instance of one of the concrete subclasses} to get a \class{Chart} object. Take a look at the individual class descriptions to see how they work. All the methods and most of the options \class{Chart} provides are implemented in the \class{Chart::Base} class. However, drawing of the graph itself happens in the appropriate subclass. Figure~\ref{fig:Elemente} shows the elements of a chart from a layout perspective. \begin{figure}[ht] \begin{center} \includegraphics[scale=0.4]{Elemente.png} \end{center} \caption{Layout Elements of a chart} \label{fig:Elemente} \end{figure} The graph area in the middle is drawn by the subclass, all the other elements are drawn by \class{Chart::Base}. But some classes do not need all of those elements, or they may need additional elements. The \class{Chart::Base} methods producing these elements have then to be overwritten in the respective subclass. For example, class \class{Chart::Pie} needs no axes, so the methods for drawing these in file Base.pm are overwritten by methods in class \class{Chart::Pie}; in this case, no axes are drawn. Furthermore, the legend in a pie chart is slightly different. Therefore, Pie.pm has its own methods for drawing the legends. All these rules are managed by \class{Chart}, so you do not have to attend to it. \class{Chart} uses Lincoln Stein's GD module for all its graphics primitives calls. So you need an installed version of GD.pm to use \class{Chart}. This module is available in the CPAN online archive at \texttt{http://www.cpan.org/}, just like \class{Chart} itself. \index{GD (module by Lincoln Stein)} The table lists all attributes that are currently used within the Chart package. It shows which of the concrete subclasses uses each attribute. { \begin{sidewaystable} \tiny \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline Attribute & Bars& Composite& Direction& ErrorBars& HorizontalBars& Lines& LinesPoints& Mountain& Pareto& Pie& Points& Split& StackedBars \\ \hline angle\_interval & & & X & & & & & & & & & & \\ arrow & & & X & & & & & & & & & & \\ brush\_size & & & X & X & & X & X & & & & & & \\ brush\_size1 & & X & & & & & & & & & & & \\ brush\_size2 & & X & & & & & & & & & & & \\ brushStyle & & & & & & & X & & & & X & & \\ brushStyle1 & & X & & & & & & & & & & & \\ brushStyle2 & & X & & & & & & & & & & & \\ colors & X & X & X & X & X & X & X & X & X & X & X & X & X \\ composite\_info & & X & & & & & & & & & & & \\ custom\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ f\_x\_tick & X & X & X & X & X & X & X & X & X & X & X & X & X \\ f\_y\_tick & X & X & X & X & X & X & X & X & X & X & X & X & X \\ f\_y\_tick1 & & X & & & & & & & & & & & \\ f\_y\_tick2 & & X & & & & & & & & & & & \\ graph\_border & X & X & X & X & X & X & X & X & X & X & X & X & X \\ grey\_background & X & X & X & X & X & X & X & X & X & X & X & X & X \\ grid\_lines & X & X & X & X & X & X & X & X & X & X & X & X & X \\ imagemap & X & X & X & X & X & X & X & X & X & X & X & X & X \\ include\_zero & X & X & X & X & X & X & X & X & X & X & X & X & X \\ integer\_ticks\_only & X & X & X & X & X & X & X & X & X & X & X & X & X \\ interval & & & & & & & & & & & & X & \\ interval\_ticks & & & & & & & & & & & & X & \\ label\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\ label\_values & & & & & & & & & & X & & & \\ legend & X & X & X & X & X & X & X & X & X & X & X & X & X \\ legend\_example\_height& & X & & & & & & & & & & & \\ legend\_example\_size & X & X & X & X & X & X & X & X & X & X & X & X & X \\ legend\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\ legend\_label\_values & & & & & & & & & & X & & & \\ legend\_labels & X & X & X & X & X & X & X & X & X & X & X & X & X \\ legend\_lines & & & & & & & & & & X & & & \\ line & & & X & & & & & & & & & & \\ max\_circles & & & X & & & & & & & & & & \\ max\_val & X & X & X & X & X & X & X & X & X & X & X & X & X \\ max\_val1 & & X & & & & & & & & & & & \\ max\_val2 & & X & & & & & & & & & & & \\ max\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ max\_y\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ min\_circles & & & X & & & & & & & & & & \\ min\_val & X & X & X & X & X & X & X & X & X & X & X & X & X \\ min\_val1 & & X & & & & & & & & & & & \\ min\_val2 & & X & & & & & & & & & & & \\ min\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ min\_y\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ no\_cache & X & X & X & X & X & X & X & X & X & X & X & X & X \\ pairs & & & X & & & & & & & & & & \\ png\_border & X & X & X & X & X & X & X & X & X & X & X & X & X \\ point & & & X & & & & & & & & & & \\ precision & X & X & X & X & X & X & X & X & X & X & X & X & X \\ pt\_size & & & X & X & & & X & & & & X & & \\ ring & & & & & & & & & & X & & & \\ same\_error & & & & X & & & & & & & & & \\ same\_y\_axes & & X & & & & & & & & & & & \\ scale & & & & & & & & & & & & X & \\ skip\_int\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ skip\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ skip\_y\_ticks & & & & & X & & & & & & & & \\ sort & & & X & X & & X & X & & X & & X & X & \\ spaced\_bars & X & & & & X & & & & X & & & & X \\ start & & & & & & & & & & & & X & \\ stepline & & & & & & X & X & & & & & & \\ stepline\_mode & & & & & & X & X & & & & & & \\ sub\_title & X & X & X & X & X & X & X & X & X & X & X & X & X \\ text\_space & X & X & X & X & X & X & X & X & X & X & X & X & X \\ tick\_label\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\ tick\_len & X & X & X & X & X & X & X & X & X & X & X & X & X \\ title & X & X & X & X & X & X & X & X & X & X & X & X & X \\ title\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\ transparent & X & X & X & X & X & X & X & X & X & X & X & X & X \\ x\_grid\_lines & X & X & X & X & X & X & X & X & X & X & X & X & X \\ x\_label & X & X & X & X & X & X & X & X & X & X & X & X & X \\ x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ xlabels & & & & X & & X & X & & & & X & & \\ xrange & & & & X & & X & X & & & & X & & \\ xy\_plot & & & & X & & X & X & & & & X & & \\ y\_axes & X & & & X & X & & X & X & X & & X & X & X \\ y\_grid\_lines & X & X & X & X & X & X & X & X & X & X & X & X & X \\ y\_label & X & X & X & X & X & X & X & X & X & X & X & X & X \\ y\_label2 & X & X & X & X & X & X & X & X & X & X & X & X & X \\ y\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\ y\_ticks1 & & X & & & & & & & & & & & \\ y\_ticks2 & & X & & & & & & & & & & & \\ ylabel2 & X & X & X & X & X & X & X & X & X & X & X & X & X \\ \hline \end{tabular} \end{sidewaystable} } Chart-2.4.6/doc/LaTeX/Points.tex0000644000175000017500000000721111701662677015654 0ustar reinerreiner% % points.tex % \renewcommand{\thisname}{Chart::Points} \section{\thisname} \name{\thisname} \file{Points.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a point chart (also called \emph{scattergram}) where the individual data points are marked with a symbol. (If you want lines in addition, check \class{Chart::LinesPoints} on page~\pageref{Chart::LinesPoints}.) \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.5]{points.png} \end{center} \caption{Points chart} \label{fig:points} \end{figure} \begin{verbatim} use Chart::Points; $g = Chart::Points->new(); $g->add_dataset(1, 4, 3, 6, 2, 2.5); # x-coordinates $g->add_dataset(1, 5, 3, 2, 3, 3.2); # y-coordinates dataset 1 $g->add_dataset(2, 6, 4.8, 1, 4, 4.2); # y-coordinates dataset 2 @hash = ('title' => 'Points Chart', 'xy_plot' => 'true', 'x_ticks' => 'vertical', 'legend' => 'none', 'sort' => 'true', 'precision' => 3, 'include_zero' => 'true', ); $g->set(@hash); $g->png("Grafiken/points.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{pt\_size} Sets the radius of the points in pixels. Default is 18.\\ The points are extended by different brush styles. \end{AttrDecl} \begin{AttrDecl}{brushStyle} Define the share of the points. The share may be specified to each dataset.\\ The possible shapes of the 'points' are \begin{itemize} \item FilledCircle (default), \item circle, \item donut, \item OpenCircle, \item triangle, \item upsidedownTriangle, \item square, \item hollowSquare, \item OpenRectangle, \item fatPlus, \item Star, \item OpenStar, \item FilledDiamond, \item OpenDiamond \end{itemize} To apply a different brush style to different data sets the following example of code can be used: \begin{verbatim} $g->set(brushStyles => { dataset0 => 'fatPlus', dataset1 => 'hollowSquare' }); \end{verbatim} \begin{figure}[htp] \begin{center} \includegraphics{brushstyles.png} \end{center} \caption{Points chart as an example for brush styles} \label{fig:brushStyles} \end{figure} \end{AttrDecl} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted. Defaults to \literal{false}. \end{AttrDecl} \attrdecl{xlabels} \begin{AttrDecl}{xrange} This pair of options allows arbitrary positioning of $x$ axis labels. The two options must either both be specified or both be omitted. \attruse{xlabels} is a reference to 2-element array. The first of the elements is a nested (reference to an) array of strings that are the labels. The second element is a nested (reference to an) array of numbers that are the $x$ values at which the labels should be placed. \attruse{xrange} is a 2-element array specifying the minimum and maximum $x$ values on the axis. \Eg, \begin{verbatim} @labels = (['Jan', 'Feb', 'Mar'], [10, 40, 70 ]); $chart->set(xlabels => \bs @labels, xrange => [0, 100] ); \end{verbatim} \end{AttrDecl} \begin{AttrDecl}{xy\_plot} Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true}, \ie, to treat the $x$ axis as numeric. Very useful for plots of mathematical functions. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/d_lines2.png0000644000175000017500000000725207763635574016101 0ustar reinerreinerPNG  IHDR,PLTEd2}(MIDATxK(òV7|L_}M_k&f4WGG_HH`Q-n*>%#"E)RH"EKm줬 ocJ.߾/H+ <6f[֢VհF$^iBW hAmCDnY؈,³K)DdV"E)RȫR]ۊIZ o%)$d˺ϖWmsu/Ou6is@ukH;Ob kMf"<5U$ш}Ϻ4rwP\aZqɪ=rq3Dx7 إ]ҵDdFwFtjdn;]˨- a ~l7% i o219 #bk@p8."vl@ TAk"8 ,҈7D 2#7<`IDA k$>-҂#J]aPPӔ$[ @Dz)W,VA U1r>Xs-%|BY x2jx@Pf-c$߮sڽ Ȗ6tLh=F꺾AK[j8 򚾎,iyUSx \# 8=DJkiL(C3u2Ȁ  N YaEi{Q\SjjDz< u·A k"`n Vaןrba[^iATMԋڷq@Lf (ejWw"A y  r¼Ǩ`"i52VLZM^:pA Iuo6) ww.- `JO䤀n6;֭Qix?9`(p{BLvMPxA#' )A0/ т 20É=A )ݸ \+6|4D *+ٮ Jpa|lL xY׃K$ @NS b?1=m{mR!|m= = snM.QRDJziI A-O;l,L|h@ 6? bl*<#^#w_lun 4G#MTyB>{j7@4[ uAKgE9 "=0| }fyPZ,y b$A/OX^Dw4Ha*j@ {e m=k~)ܱ&8Zi'g k ,hB:9a˚D?5tA1v7}hk?t"oA {!@qH\AݛAeقAJv1 L4{JV 9hMr @0 D-]EAY.=k}gAmqi3zHh ҽ0/8/B׋:RO{5_Dmq(laaF,j3JfDH{5Y`tV:،@%aiH$7sV, 墲_l%,~=-a@^ ~?~A^1g_ qSv7BH 4$ adN| kn^AŖacAd)L6x& #7k A=fx-nm qOԌ.yKI 閖2a񊃨' û90뀌e[^G^eEY2H5"n:Hغ3|\y+/d Fb@<4^0.:Z/ "(j$ҽ@dPI S[;g٩y+ol;^AHDބ7H5o" f] `JX[Br-}hAHmZ( Dl ׽Z &c-/*sF IGq.ȳGqLkS3 D>'dZwoqq UY )3q~3wo`f-,#<H}虣1 91[DAE,#xAN]fo 0tA\@ԍ2 7dE%H>!sb8bz#ճJҌ/'Bmpļ(o2iE\Nͅ21Υ46B Mxc5qvҋYQvG+'ю_ӁH׈6`_;[)f]'uŇp@H//4)?[/xj jr-n/5>N,Dsh_ljvŁm-S"W )TRVH nV쨔SEf rmB(s mk쒘\elyMըŒ+y=|r >"LMc HY+; Adm`c%ާD;Y>{t,ʦ nD2C&KDyQRz0Z[d / (o 26 /˼BK) P[/ dAhU@ Z ѳ1fl tFO$ՀŲ+(-<;lyQċb([<[ H V>cz) 36GAt}|‹AI4+tnC]At+>LX]v QT*VDžDQwmi^AxjI ݭd-qA\M15A*QVi:-3/>co HSɨFXR<; :]`i_)RH"E)RH"E>1IENDB`Chart-2.4.6/doc/LaTeX/stunde.png0000644000175000017500000001010307763635604015663 0ustar reinerreinerPNG  IHDR[g PLTE_ŠIDATxn:E%@Qy H{BG р=}))JRN%b߽R%JZ%ىwέ*FLUOS4_ms=窭q燿xEi?nhl߱vܽlѱ966=t}U=~?n#J~ނj["Q8G(e p2Q8G(KqXӿmLxayy[xILZkXj^v0ŨL棳Ƽ),]4 ЦQyRZ=ds>~}z(AnL *`HM&h2ΪHϞ[s;S699әJ;wvx6tOD[g'$9]3y䬡^29Ir Gi/t_;R1DtL8֧N1GⱣȱgZjؑNăQxrꠕ?|?LG}#Ig̡>5819^߀go.uH\꒣1<:'f?7}̎컎G@z9lG:-ixGQ;r|x{k3߷p?>|FGz9ЭQmѿ9/w38ˎ*;9뺄E{ 8Kx-,|,±.{O<KxX5S½+ p<;hX \k{>ZKyu \ϹVϹd(ϹWq F~֫قԘ~똲{::a+uqZG[~Hr}[4ަT`8K 4yE=5 %pfx| C90ۼJ\>Ęk=mmL;0C[Gf_gkn7u?q7cp=kg2u %uE{ Y>.]K8p>TXXXXĽk pa<ߛ}+u[Kp|x,qL!G82Q8G(e p2Q"/Wͅo *g]}lP)Rˉ[shV0C[M3.:wi:Ir7oQGP"W-򸉔-45ajeC :NՃR7s@eԑӼR~<𔎧q)5Rü۱xǺkk(UQ8G(e p2Q8G(e(qB#G(e p2Q8G(e pƑkTrWWVYǽXTC]oRv5(ssXJ0M¢/rY;VCsJզ#uur7%T'lt /).{.gXw4~ьo2[G:WK-q,8qEUp82Q8G(e p2Q8G(C㮣ı:(e p2Q8G(e pH匣la|KF9|lAc|ھcUq,C k p2Q8G(e p2Q8GǕı:(e p2Q8G(e p28վS얃~ &" R1[kuZ:Zo;o pOpnZwyO{^6FhOITG_GEh7.Q\a85-wR81o6f'J sy`^ĥui2E}ƱMo㷺Xq e:5R n3O;V 8G(e p2Q8G(e PXqp2Q8G(e p2Q8Gq=VSAޘJjǩT>z㪑 g\iVs Zf[Fy͈:4o#4iq4#GhUnuW=6FoSfX௥ VqS:8?;d~/z`iGS:prSiŜJr) 2g yZje(p\e p2Q8G(e p2Qsfx[ / >liOq ӮmsS//{e{޿~j˟Fźnt]7i}[Uv;_޴7Ͳ]-Uqu]{اN-{"oռ=HZ_y/qGr' i>Vìs᪝~r^vdGstlɦyc̼]-?/_,ۓbjrt5wt yjk?Vv3_YNG:zfqk0Tv;[^ U{|~S͗7~<;^_vtfgP;ì{N\\|?k/u IENDB`Chart-2.4.6/doc/LaTeX/Composite.tex0000644000175000017500000001261110735742040016327 0ustar reinerreiner% composite.tex % \renewcommand{\thisname}{Chart::Composite} \section{\thisname} \name{\thisname} \file{Composite.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a two component chart with two types of charts which are layered one above each other. Just set the option \attruse{composite\_info}. For example, you can create a two component chart with bars and lines. A composite chart does not make sense with all combinations of chart types, but it works pretty good with Lines, Points, LinesPoints and Bars. Note that two similar chart types may come into visual conflict. \thisclass can do only composite charts made up of two components. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.6]{composite.png} \end{center} \caption{Composite chart} \label{fig:composite} \end{figure} \begin{verbatim} use Chart::Composite; $g = Chart::Composite->new(); $g->add_dataset(1, 2, 3, 4, 5, 6); $g->add_dataset(0.1, 0.2, 0.3, 0.2, 0.4, 0.1); $g->add_dataset(0.3, 0.5, 0.2, 0.6, 0.7, 0.4); $g->add_dataset(10, 11, 6, 7, 7, 8); $g->set('composite_info' => [ ['Bars', [1, 2]], ['LinesPoints', [3] ] ], 'title' => 'Composite Chart', 'legend' => 'top', 'legend_example_height' => 'true', 'legend_example_height0..1' => 10, 'legend_example_height2' => 3, ); $g->set('include_zero' => 'true'); $g->png("composite.png"); \end{verbatim} \constructorblurb{\thisname} \attrdecl{brush\_size1} \begin{AttrDecl}{brush\_size2} If using component charts having \attruse{brush\_size} as one of their attributes, you can define the sizes of the brushes individually. Default is 6 (pixel). \end{AttrDecl} \begin{AttrDecl}{composite\_info} This option is only used for composite charts. It contains the information which types to use for the two component charts, and which datasets belong to which component chart. It should be a reference to an array of array references, containing information like the following:\\ \$obj\deref set ('composite\_info' \fatcomma [ ['Bars', [1,2]], ['Lines', [3,4] ] ]); This example would set the two component charts to be a bar chart and a line chart. It would use the first two data sets for the bar chart and the second two data sets for the line chart. The default is undef. Note that the numbering starts at 1, not at 0 like most of the other numbered things in \class{Chart}, because index 0 refers to the $x$ values which are shared by the two component charts. The ordering of the components may be important, since the first component is drawn first and then (partially) overdrawn with the second component. \Eg, when composing a line graph and a bar graph, it is safer to have the bars in the first component since otherwise the line(s) might be hidden behind them. \end{AttrDecl} \attrdecl{f\_y\_tick1} \begin{AttrDecl}{f\_y\_tick2} Needs a reference to a function which uses the $y$ tick labels for the primary and for the secondary $y$ axis, respectively. These functions should return a reformatted version of the label as a string. \Eg \begin{SmallExample} \$obj\deref set ('f\_y\_tick1' \fatcomma \bs\&formatter1);\\ \$obj\deref set ('f\_y\_tick2' \fatcomma \bs\&formatter2); \end{SmallExample} \end{AttrDecl} \attrdecl{max\_val1} \begin{AttrDecl}{max\_val2} Only for composite charts. These options specify the maximum $y$ value for the first and the second component, respectively. Both default to undef. \end{AttrDecl} \attrdecl{min\_val1} \begin{AttrDecl}{min\_val2} Only for composite charts. These options specify the minimum $y$ value for the first and the second component, respectively. Both default to undef. \end{AttrDecl} \begin{AttrDecl}{legend\_example\_height} Only for composite charts. This option changes the thickness of the lines in the legend. If `legend\_example\_height' is set to `true' the thickness of each legend line can be changed individually. Default is false. \Eg \begin{SmallExample} \$obj\deref set ('legend\_example\_height' \fatcomma 'true');\\ \$obj\deref set ('legend\_example\_height0' \fatcomma '3');\\ \$obj\deref set ('legend\_example\_height1..4' \fatcomma '10'); \end{SmallExample} This example would set the thickness of the first line in the legend to 3, and the thicknesses of the following 4 lines to 10 (using the same indexing scheme as in `composite\_info'). The default value for each individual entry is 1, \ie a `normal' line is drawn. It is not possible to change a 'legend\_example\_height\#'(where \# denotes a dataset number) which was once defined. (The first setting will remain unchanged.) \end{AttrDecl} \begin{AttrDecl}{same\_y\_axes} Forces both component charts in a composite chart to use the same maximum and minimum $y$ values if set to `true'. This helps to keep some composite charts from being too confusing. Default is undef. \end{AttrDecl} \attrdecl{y\_ticks1} \begin{AttrDecl}{y\_ticks2} The number of $y$ ticks to use on the primary and on the secondary $y$ axis on a composite chart, respectively. Please note that if you just set the `y\_ticks' option, both axes will use that number of $y$ ticks. Both default to undef. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/Direction.tex0000644000175000017500000001073110735744554016322 0ustar reinerreiner% % direction.tex % \renewcommand{\thisname}{Chart::Direction} \section{\thisname} \name{\thisname} \file{Direction.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a diagram based on polar coordinates. This type of diagram is occasionally referred to as a \emph{radial} or as a \emph{radar} chart. \thisclass plots data specified by angle (\eg, wind direction) and absolute value (\eg, wind strength). The first dataset to add is always the set of angles in degrees. The second set contains the absolute values. How additional datasets should be entered depends on the option \attruse{pairs} (cf. below). By default, \thisclass will draw a point chart. You can also get a lines chart by setting the option \attruse{point} to \literal{false} and the option \attruse{line} to \literal{true}. If you want a lines and point chart, then set both \attruse{point} and \attruse{line} to \literal{true}. In addition, \thisclass plots arrows from the center to the point or to the end of the line if the option \attruse{arrow} is set to \literal{true}. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[width = 8cm, height =8cm]{direction.png} \end{center} \caption{Direction chart} \label{fig:direction} \end{figure} \begin{verbatim} use Chart::Direction; $g = Chart::Direction->new(500,500); $g->add_dataset( 0, 100, 50, 200, 280, 310); $g->add_dataset(30, 40, 20, 35, 45, 20); $g->add_dataset(10, 110, 60, 210, 290, 320); $g->add_dataset(20, 30, 40, 20, 35, 45); $g->add_dataset(20, 120, 70, 220, 300, 330); $g->add_dataset(45, 20, 30, 40, 20, 35,); %hash = ( 'title' => 'Direction Demo', 'angle_interval' => 45, 'precision' => 0, 'arrow' => 'true', 'point' => 'false', 'include_zero' => 'true', 'pairs' => 'true', 'legend' => 'none', 'grey_background' => 'false' ); $g->set(%hash); $g->png("direction.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{angle\_interval} This option tells \thisclass how many angle lines should be drawn. It is the difference between two angle lines. The default value is 30, which means that one line will be drawn every 30 degrees. Not all values are permissible; the valid ones are: 0, 5, 10, 15, 20, 30, 45, and 90. If you choose 0, \thisclass will draw no lines. \end{AttrDecl} \begin{AttrDecl}{arrow} Draws an arrow from the center of the chart to the point if set to \literal{true}. By default \literal{false}. \end{AttrDecl} \begin{AttrDecl}{brush\_size} Sets the width of the lines in pixels. Default is 6. \end{AttrDecl} \begin{AttrDecl}{line} Connects the points with lines if set to \literal{true}. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{max\_circles} Sets the maximum number of circles to draw when generating the set of circles. Default is 100. This limit is used to avoid plotting an unreasonably large number of circles if non-round values are used for \attruse{min\_val} and \attruse{max\_val}. The value for \attruse{max\_circles} should be at least 5 times that of \attruse{min\_circles}. \end{AttrDecl} \begin{AttrDecl}{min\_circles} Sets the minimum number of circles to draw when generating a scale. Default is 4, minimum is 2. \end{AttrDecl} \begin{AttrDecl}{pairs} This option tells \thisclass how to handle additional datasets. If \attruse{pairs} is set to \literal{true}, \thisclass uses the first dataset as a set of degrees and the second dataset as a set of values. Then, the third set is a set of degrees and the fourth a set of values, and so forth. If \attruse{pairs} is set to \literal{false}, \thisclass uses the first dataset as a set of angles and all following datasets as sets of values. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{point} Indicates to draw points for representing the data values. Possible values: \literal{true} and \literal{false}, by default \literal{true}. \end{AttrDecl} \begin{AttrDecl}{pt\_size} Sets the radius of the points in pixels. Default is 18. \end{AttrDecl} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted and \attruse{line} is set to \literal{true}. Defaults to \literal{false}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/Documentation.pdf0000644000175000017500000151115512033072734017156 0ustar reinerreiner%PDF-1.4 % 3 0 obj << /Length 491 /Filter /FlateDecode >> stream xuQn0+x$cE9nMXR@-KKy;3;+ɖHZfqq,QЪlVԆ4-JƵ! /SgHM7C*OUӰ4l#ּGNffw€"\+4?3Qp,VPN ЪF+l]B4 MKR _KY( œտsp CO9]q0Ri$=&VXiY pf/6#A(.,.r-}p`Q4- _G)z v],(*3E4]|øRZUqvq,M>~c*g8 [%2uœq~ezsا.1ݔ8,' fR-.qBsWeLf?gu4<Sg[n' endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 1 0 obj << /Font << /F16 4 0 R /F17 5 0 R /F18 6 0 R /F20 7 0 R /F7 8 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 13 0 obj << /Length 403 /Filter /FlateDecode >> stream xmn ,= IUJ]5Cd<®T Y|s Fu0PTYRkeE;;[ |2nﻯ:uAkP܂qHƏ.SH;4HtWꀋ|}+KSM.R*U*m$a S6:MNGqkF +9d \;^hpBY.E--oJH@5nCXL3.,!FAI׬aZP=!aR UX}+Uˏ6oG*2Մ@^ÔDC$ǟ֣J;N2,ҟOOOBs7;طi-Hր֭3j0mnp endstream endobj 12 0 obj << /Type /Page /Contents 13 0 R /Resources 11 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 11 0 obj << /Font << /F17 5 0 R /F29 14 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 17 0 obj << /Length 658 /Filter /FlateDecode >> stream x՗o0+|LIv0iIVX %AgaZ`%&xl&wc)@\ 1b&:ZaPP^%0Fu]|yQu9^ч$|pZplXfMTmZXc~}8b0"u d"z [2>4DZЋ`a^K"IC@7By[RI H✛ Cu5tt!1T n(c7Xit0zRO+_j,}AF/2׫psv8"`O`R;GosjdžɎ̳=5@u rݕu1Jb.#`hMM endstream endobj 16 0 obj << /Type /Page /Contents 17 0 R /Resources 15 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 15 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 21 0 obj << /Length 700 /Filter /FlateDecode >> stream xڝV]O0}WDSԘ8`|jm*8GG~ءH{}cDZVc]9f;<# z` ]kZE`4[C" }N3AYX&XDz]ɤ[,iBSV&y! i"'=ɼ_"t*9PNp| #K y7,,XN髊Tp7('ڙqx }8R MIÞ35WVH4*2sT q3%@Ul#LL?h}';>j+s74x'TZND"`.o㜨G:dq\zj ~-4mn5ٱ{;a eZ5iѶ|g;6cYPfu~{ AJ|֘ ܐwSRPa{5qKv5R&KW!I/UK^AQTNJ]W7۳ٻ]wJ?N`SJo?ݏb4ō RԚ` k"-_ XWJ|="+xEoDpJ++xe雷[vWUWt7-9 f^$k4/'B^P{K: endstream endobj 20 0 obj << /Type /Page /Contents 21 0 R /Resources 19 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 19 0 obj << /Font << /F17 5 0 R /F34 22 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 27 0 obj << /Length 1852 /Filter /FlateDecode >> stream xڕɒ_#U5 er3Y*J}I>Et . HM~)RIڥ/JvOdD֏w?;URNe:.Rˍ)w??\hpFmkT_?Rť㻓ŏȤGuRO, Se9@l"5JyUL4=y\׋.2OX G18/JJcU|K<O@ 7 c Cdhmi] iޤ*iAE4[٩*zl Ӟ`8 bV:J&i ,*Q PqGݤ 4!GFۑϓT40'||c!S:h@[zTο"ף; MU} r[fq߹L!{&N~/^ :n'g{z}!ЏƏ`Mڮi+8ZR2Ve>ABG4Ov Fnf9&qՌrhccaK%<0Q2*qO"ec[FLk䍶uqE ;~{f*wҙ47SeSeIrU'oxD?K0Wܩ""eI ]:VBBMk_.>L7W.I:\]ZhH$C3rW|[oi3>H &6IƟ{_\0Yw.Ȼk5h|D|nmw1%㵣X#/Q ^ #$e''-R auTs#C0&Q",3-'(vEwmxωQ.9yJ 'H`IYgvE$ԟ1囹 5RYu㉥9~ͺ,zfjqn[ρd qFZPǴR('N7KX__y@HW!IPa0;$2ЭEⅵWLˣ`'8PE=KH;y 9x,BT Zķru xApmo]Y2nV)a8Jvv?OQdj3u#0f'(س/K|jD}g1tV>tF&17{-ťpO 4U|VC%>0jyQG |kBH5VQ&#P+NB~ ![S %BQJS'l :.Hhqe3X1$Q72I$O* UՄ) %ߌ9DuD;z^7c?8Mwp/Qpi+nB3˲նX(#rN߳dK0l)=k 8Hj%D>W"Z vId9&05gЀΫ$hBv5L5kR] mf7.3?$*{@O F크h3TsFb׸s-Mt;|׸'d- rhF9khcCxu;#?PVCxlp%kV?n<E#tA[ "r{(K< MUskx'\Cv#Z'A+{2PdA/P3xM-HJs !${ji/xz-!iСhO(`K endstream endobj 26 0 obj << /Type /Page /Contents 27 0 R /Resources 25 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 23 0 obj << /Type /XObject /Subtype /Image /Width 521 /Height 271 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 6037 /Filter/FlateDecode /DecodeParms<> >> stream xb?(`Qi4F(`F(`F(`F(`F(`F(`b Q0Q@<Ѻa( FǔF(`F(`F(`F(`F(`]4 fty(4Z70k`1Z=Q@E@cJ`Q0 @FpȃNȝ R:%pep5X1Q0@ `8Th5DZƬ9Fcg Q@u(=4@dqLjK=he0 Ѻa =@p.`;`F0U (5hcL@Fp9'G(X@ `8XDj!F| htLi B3WbeRπQ0 =evki8 YF( (`t@u(`t@u(P( FQ0 F( FQ0 F( FQ0 F( FQ0 F( FQ0 F( FE0z8(hn0k1Q0rGQ0 pF(`F4`G(p@u(`t@u(Ѯ(@ `Q0 @ `DwF``4Z7Q0 F(@4m :Q0 F~(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@,T1q4(Gv u @,߉pz>\F#S`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Q FFFb "R֑` @{G(N X1V@FJcxw&Fwᑌq%TH@d @u(Ԇb@)Q0 FFPeHh{pQ0 hhH hsxnU F+Q0 FI*!eQ+i5A7ZQ0ȫJ%zu}G`R Q0 z\(G(C 4uLUï$N(ɘs4Z7 Q0g@1 @SmfoZ(`$s4Fh$za1AdA-F{-Q0xZ94Z 4:0 F -}=2oa&-1@ }ì53ףa; m ޷aж9FhmFQ0JF ãQ@<9Ѩ@uUaț}bsX .tƵ{0^92U5ĐNQPa~ ^ \8PMZ$'zr?*B&@P1>wd Ti@2CieH!ѡ) @Cr AA>[G(CАoO"rEa00 F@ uJ溷,>FHɅT9>q -@kXI.4iTt`1J.FQ@Ϋ1[ôȭBދF{ Q0 ^!a=2֥i >k΁:O= !]Ș҈*+GNO*@P=?=;o[T t[lF }خnD\`cX| k ;ZrQjz;J!^BȠ[OZ6=#d H=w#p1MBȠCdbwl$dA[4s! Z0cþ=-a7;S-.V4EGd{vT>_E u4w h̎!݄u?}@ *M{: )  IE ad50?C-@,?&0~qV.H^%4 t_a9Hs7e-[ @Cn: v4}phsvZõ,b]d :oM,_i5h"ǔ׈=]~QGc}~BH%꣍Zgщ^L?{`@EY @,#Qx a*@ XM`Q@aoj5G 9@T8ko@nXst_4]Z Gw1 eșI'ːK) rQZR;G>c"kÂ>e @=Z?W1;5y8ke<@P+Vk5cJ4jh {H(+p\(;t=@ D@垴>q0\zNc,#m1s} XF(Qj@6 -kj B@,`ewaDu:[[kzǦC Xb"Eޖ0@W΍Q0t3@ g< XbGsԐWK]=B2@ ТQ@,C:JA~GԀD +߆ @Ep=%$I9f:i6F݂5 Xb"s@ӧToc$A#ahhoFªoAptwty-ːo`4_ ̀.3ZߏEtp5O~'*û;846eHG<=0m5VV\J@ ň/PFnNh?i$'.0=FXF) F[d.$6Αp5F yJ_iGT c$ih" wHa  FǔF{#D!:, d,݆\oyN(bc@7>\( F놑;0zh= F.@d.vy{و9G( Z 4Liݰ첌wp V\(-A{`PhtazQ0<8Toh0 FQ0<8TO4:= Fp&:0= F( FǔFrn9 F FQ0nFhH@u(^ЎQ0sT FzQ0 Acfh0 F((`FnQ0 Fs FQ`4hhtaQ0 F:ѺaQ0 F:1Q0:= F(@4Z7j`QhtLiQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F: z0-nQ0 Fa@.֍;D+ZԳ48z(`4@ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @y endstream endobj 25 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F35 28 0 R /F36 29 0 R >> /XObject << /Im1 23 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 32 0 obj << /Length 674 /Filter /FlateDecode >> stream xڍTKo0 W6Im aC}vp%ؙ-7ؿeE H9NnWR?'H.Y&syRQzLEF-|Hn/U ׉%s|cZDpVBrKH䂨,aBKRn7zcw`8I*/X)MH'MɌ-e兢T`}^bA)Pƹ^.0x|μ4Bۮ]^ sZm?R-*օP[a{k)YC|$VqHV6 igUvLhK ; a|T9IW853,3Ӳ#zoYfG =GZʶգI Lk *_\w킧V=tEtP/6.Cձ~حZ-%=SC˵ ot!qlr0no` %%4uW[;zbzu87əp !0F`M=m6?Z!ryVʊ$;oPOi;P.Ej1#y/XV8qzen C|^3r$ vtRzLݸ.WiQ endstream endobj 31 0 obj << /Type /Page /Contents 32 0 R /Resources 30 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 24 0 obj << /Type /XObject /Subtype /Image /Width 512 /Height 384 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 6518 /Filter/FlateDecode /DecodeParms<> >> stream xb?(`i4F(`dF(`F(`F(`bA022(` c XȍQ0 F(N@C@`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`G+Q@-@(>|Qh? F-@V`Q0B@V`5}d.  Q0 4ZA c>hѱ BJ00ZQ@ `Q0 F( C6G(h0 0=pJ@Ѯ(#h0 Fi)Ѯ(d p6VA!Q0 (4` h` h` h` h` h` }膚Q0 F(! +*.}@` EFK @C@`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q@`ddfh0 F(#h0 F(#h0 F($Fd@T WK;@F(`Z.L4`jx)ObS h`Q0 P]%@V`Q@f>[`jvp5aW F{`Q@r^pA4YLͤ `Q0 -IehthQ0 d/.@=Q0 F(Nўh`C4:4 F(#h0 F(#h0 F(S.KS@(`V_Ij-2 ; F+Q0 F( F+Q0 F( |? c;)N@V`Q@Y@Ge4ZQ0 FcF(`F(`F(`H @(`P @y@7 F(kxUY F{`Q@50n(` %+E4ZQ0 Fuٲ"!Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( uxL`tz(9kބl;@ ||zh`9w=qF(؆ AF{` :`6<@ D6 F(t6@ eFQC>Q0 Fh=B@V`Q0B@ `#9~ EWl7 F@( Th68 !&(`4. &9v-Jс!\\VBd"@hm@~raFahmb߲7 (GkTl4Dg@,imf>IQ0 va C@򇼀dAD)T,>C=P7GG HQz!W5!; V-у (Q0F} уh h,PF?0@ã U#,-D$8N]@"T4V  R3<Ѣ!Ѭ>r`t u@ hF(C6ZQnb9G` ~@h@k@,DFZwQ0h[luM@: F(-aDl@Sp&e `d.ٟF 9x Q0 OmGS@C@`DdLgU3 F(DTv0FchA bLhQ0 (o1A@s`۷m p51 Fy> XȈͣQ0PDIďQ0 Fx7hC#@LA0 F(lm)hF ]}Q0 F( ș`C@ht(`ͧmP"4(>=@ bO0 F((`Ёѝ4ZQ0 #iw(`,F@ t`ahthQ0OZDQ0 FhBO@ŒQ0 F4:4 F(`t FO` t)@V`Q0B@V`Q0B@V`AF7$(` s44` h0 F(t`t)}@V`AFx` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` 322thF3D A< F(i'!Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q@o0{AhG($ F+Q0 F( F+Q@@5u i` h0 @D:~]XQ0 hT!P( @,A0 HKjf>]X{(hH9/ъlu.\ \ F(4:4 _OP]( F+Q@Bu-Yσܐǯ e? FDWa d`h`Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( =eQ0 Fh)1h@W[G(U4:4 F(#h0 F(#h0 F(#h0 F(#h0 F(#h0 W_ 9 F 4ZQ0 F4ZQ0 F4Zyd( zwĨ`'?KlL{Q@@=Q@$Q0 F`4Dumv\%蚟Q0  `(\-z݅Q0 F@*W4R< F(:( gڨpZ׋`+0 FBգ2F(C2 H +` h` h` h` h` h` }ޜQ0 Fy P*ѵ`Q0r@Q0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F} endstream endobj 30 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im2 24 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 35 0 obj << /Length 10455 /Filter /FlateDecode >> stream xڭKI+b~1rQ@R*!*_?{%]=wS*T1g$gnNۻwݿ~ovj~Y<ڻ~ۚ?{ka[AuNSOw~}3]ۻٖQ#~S sM_kvww?4?~o_~ϟհ<.oa}hml~o!:3r>&ǣc6L9Wg=<[ʹu]iޮr|ʧqn (^/y} d"ROlԏYkť1CC"j@ho60!uJ$ `1BTq/IQ#O8FqZŝ@r#Q((4?AF2ldov49JᴦǦuz,59Jez"j=oH7+K&^vtͲN9dcqSKH"%G Q"ҢD?A;t *TU۲Vk*e )hWiѳG{P z.1j-R"BџHDi/""P`m0"B*H@#Ҵb놘뛶n,1 ^b}A',X1ZG%FDHĈ!%O#"PbDJ%FDH (1D.ن-Ėi(|ٗx]aՊ?Bkkp'GhM/\ؕʅ̹U*m-Z'rZ[ȟ-9צ]A Ǡj-"" CDz@#W"^fۺ^vzvtvCj !O^!"+D?A{@ !B$WW햐^,Ǿ}~z>xXmM}?cZ?< d+,$'.C3IuH#.r5iѶ4pi&13L FjyiZ<2˂F̃}*8v dDhk}qI?CF ^ DݐH0Ǐ>WLxƟ75[9VSbzV7*&"ЭJ"BH@#ˆi鸺Y>W_?Iz5꘻^St6fBclcwMxI*"$*D׮"xdZ @*@j7HD\ED~W@UE@0$",$qa Ռ Gh%RD*+me>:3*93 b4yfDk>$|&,F_Msm#P\MjӝktGG6 ZvhbvR`]/_;n>AT_.{yR)2Rk-,PKh Z V$ ԅ (Jb~Y.X@5 %'th W, AeqA14K+PuahU,dw-G~[ӫo&CΩ_^lᆵ]+ @By&RYHH/ ȋ""> >)@^g/ B@M0yQIFE @B&$O#TFv0NP㑊)m t jUؚyd6j:R # 0Հ<2@€H y`6` @ $  " @T֑j@ h ŀD5A" 7~SS>X?|TOJrUG4Rud!UG<:2YG4Rud!#Ĭ#:#): TĬ# YHYDO dTYH'BGQuty%k`,Ow)_;m3)= Ke[Kj̀~OipGd #P\]zԝ{=rG"`ZDVDAk#X֘O$tsү6/C\=;}FDZiDT?A+@Ri4"FDZi[[+|gU*4*6.>&LwX,x{6췦۬d|J5 JrmـG겁DY l` \y.XH)" 7e @ʲE7@]60$ ,$eUl` UmU|⣁T#h/;1ۥ6{!޻n[7vٳ}`Q"ZG?AMDD@-DŸOD1|M?h-h"BH@#СݾammuC9Xǘ-ڡ&8f\?CR/ ,4eWK yi"! ";R>)W"^FD$ )@B<QAĕz)a!/b Z"O#D.;&ݖFu7pExZߤrGd#`wB6?Bv' Gh"ԫsR݃@Zak1d[n_ Xˤ%g]BDKclk]="CDH{t2GhR&De,ͼ֥72ˮ*?6mٟ7o_>U'DgĈεï(1#" ZbDJ@#Ĉ)1"%%Vo)YmbJ:Ek^k<&RKGjI֑$i$5M$J'ʺE%L#i"ye]$i 5-bvuMrnU9dG >~]`ڟ :{B#" (?hƟ ""B ޟMD4?B#`m~MU04XzMbb* 8ZLKpm#uo!ёH:RKG$BJ17ZĀ%<#KV*4 Ѝ7 Ý2p'ܽ ZRoBnFwMҫޥm-/ݶV Cg3U\Qku]-/"EDH}GhaDJ-֦im~ڦǘ+j(8ͰK-7.0>hKqW*1CI|{꿿UL 8T_ ؏B~P@B|hz<ҳEyb<<.(bEvO\@Bthܺ4m޺:O/˭oA$?dix*H&.@M {D4?D$\'hyM;fm/g?}|(o۾z\!|~yRi-he\+dID'@tbH1IRYwVjAbU:wjr'Oބ;20Sq2yG7Yr'`$o@ɝ[t"oBqȝ 7Ao4CԌl򥯓ă[`+e ޳b[ތqyA;ޓw.b[p9ʤ>^+0%5prS{v7fH2|5ӄtќoDޠHonr_&HedVQyH10=4?b1pXJ?khY㬡f!KPD¥ s㬡=#L׹قL.п&DDZOD?A@9-"5BDGZ$ Mi3fT?"wɒK\lj7Ѿ<|zzP듓>Gh#r#'' Ыr \Dԕ4Gh]#;B'u洄9of Cec?65VNjw@#>V+Z ,T4i>"#"T?" qM.ogMa{}d? ܝ1]v/_j_`8V,JL.HGb!Z}99hdnxy< oG" y$V -.L.1Dc!$ԥ ELUL˘'G\ Mԏ߿|F#~?j׻O5 تi By$h i BB<4Y4Rh!U_~9{O맯ؒ=ɨ?"2(*om)h]?r}uѳögsgmGEmX;ǝw'5]S }gg£Ous<7?"7;#7^*~ޥ iߏ~׬l?]lKj]3Jꧧge mYFnY-[Zǝ[wnYcܹehYܲD,-˟ܲ-,--|&<]jۭ"֓W?PqkB%|zT\R6^K9?Dd0sOV.e~ZָQY O0, bٚnYIJ4: ^%F,|lZ8hn47HMhV -R Z84LYgΤǂfPTBuf!Y%k@dy05Y<3K-LC )P2R6Y'GR~힘 S>noq{syg#WXzYST;֙Y<3`Huc3 1 3H'f1ً֑LT-0EV @,Eh0:@28%Dc״x6L!N,t?53BU<4тFC-(T;̬GhAՏPbB<2 `fC@ՐT"-:24Y<4K҂’LTMirߌ;HkӶ-LЮ1,|?,]#,h U42bd $H,EY(@i B,auH# ʐF &f֑Y,РibAT C*pi%2Sz߮|T&=pY L`W#>}ֲ#=T U;p?#u(۟ ٟ+֝Qt?CK[͝{m0>1M LsHL#>5^+k^#2kkD^G^#2׈ 5F5"FDh3r-]A^rkՖ *Bɯ"Т RTW h1,(/ 37% T5*yM`ꪂղb]b`@Mxh^[OSW,,;:7Ƥ{|{|1?> endobj 33 0 obj << /Font << /F21 36 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 2044 /Filter /FlateDecode >> stream xYo6B2fŇHjwɷnʖhז4;ádK;AS`!Cpq&J 7WL*-눋F:L6*bXrŋo\|,KSw7x[h|[s6 ˒18F.%,U6+#Y۞lڲ;C=aBs:RJ۝*ۻ.<ޔᓣm뫦vOfƯdʌLH&sm$ЂI[,q[$_u}{Zub v;m=1gL$%J̘r.8pyRԐ*fK7]Շ7[}Di b r0]m7?Ӕ^~o>ߜy,Ls^m|_eк)piS4US}쩮CTuXyuhfϰ2q P!քb2aVer'|J))>/w >#yV!Zp㢬,jpn7й | v@(n< oaaIܺY[*gj߰xC;Y9 hP &[m#rN kT27)wrY9J;\m6[8Gjd)\~[]a#s@1ጄ4jIICMO]0"KڑI2D:@$*);FB6&r sC_q(k 64ɑag@ie{_ո(/ꠕ+#:P<?P!&9b/BQ(2#$/i.^_]|@wEhhe^s(vFw6LB`]^~9zԞA%IPybCHhgoR/5@sc_5i!Ŧ>\ාEHyk^.yE1óc>T/9X@<+!3L|BAiߍRɤG\2>M82 'Z)V;{-(HAe:ޖuÞt(j@p}U cDՁ|qGlwǼc]TL9ڼۡ3ЊS>p_#,侭@c4RLnj ~4h ŁKc}klO3cWCk0AIGvd/#@ Gp͌̀)" ?{NгKg :J.r[_"=3S/=_C?TqzơqA}+CŻwJTמNRQ2pݺ (5xfQ)=kF` -QqkڒXY3 n G@8STj؊ EЯ ߸Ŝ |=c81>5 #]hMƶi=nm %Y|l A,p?dL endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 38 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R /F37 41 0 R /F32 42 0 R /F36 29 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 2296 /Filter /FlateDecode >> stream xYm6BW ;^bk7loC$./6IQCp3"ˊ짫"7.:3cLf4gBvW .:,vq#ﷻL^ښƖH϶k?,S|u!l^p. 8mŻ_~x#tsB [􀓮^^ gJHWfwEdea>LI]唰L=qWw݄a~g/r*iiJͪj0l]F+R^3`f rR24gᙴpה K FпQRV'̭{©ŤO:a gs~+twgf-kݫiCJ& ;vƭna%nم{+"_3]}Wو$S~o+/-4F,̦5p+MTyYϢ2Ȳ_* '>:e{";7 fC0D"o]}*S-UmI|z^@~F}ZDӑj^C/S y*J:D)9ɶ5r GhbM N. 8v\ t=EacUa$Х!l6a==CF9yqžRp(xK}(0luZFŘ᣶: e r<|t.\X.+`1{AZ܉l-q%@ݐ({?"&X{y4E41@3S{y z&Xgk!Ƕ!dž/G_jz[N *`ojzw) ,1`Zm(Q >K6 Ә4 !2<%L0ei?KaX.䪯1X}7$ EliE Kg, onL[{Be},T/hxE5 n ՈXB/DBB,5I"gxbF y}CgC%Y x#=!x4M{JЦl"us .xгpNA(L8-g%=)oYsDS)r)Pp9?.H$v!^ȩtNu3Ú2E W8ImlRLɶ~5u2T^|P{xk rf!zH]_/|'Y<x`12&e K+v@%M8'q&Vo%k0EܵS VƩtĒ5X-]e1$%sB2)s60$wqEώR2QWR .*PB 󈻻}_=T퓟fm.%B8/ qy EB2? `wڔV endstream endobj 45 0 obj << /Type /Page /Contents 46 0 R /Resources 44 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 44 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F31 43 0 R /F32 42 0 R /F36 29 0 R /F30 18 0 R /F37 41 0 R /F38 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 50 0 obj << /Length 1929 /Filter /FlateDecode >> stream xYmo6 _ 7ZM7 v0`Xa7qܸGJrb6>)")|d^|LȄQь%W ㊘&Z1•M.ɋI}y={y0!38Q2G,d;yzq :MX¬%ܢRd~s%M0SB}M"FUɯQ2NcyE?斧O| J KΙ Jf^ŪlgBg{vnnUιMaMqSπ~.*?J.Hʑsɫ|%,bҢXWx\W4K+|gK\Nt v\(bv-:t~`e]הw]Y9M unhH4p, ʒ[ӵJΫغ\B,AEv\gsUJ97\JiƘ ^f5F|2OK51b/tOۼ:hUNWg]Ɍ5AynuWеfw' &d(zϯU1Db`XXLʶcN:;I-sps/[eX.l|EK`Ig^&36P6e&1b_(; d|q%QtԒ zB_M~?^'9 VMQxZH@ h(یϢp|}[obBo6 8~Q~g3ߘ~@&qcMp0ts _ń{w,@_2r_#XCՋaApCp<}51+(A|WkP9RӚi~⼱&z,#e(a=0 Sf$6w%͸8Q~DH"c"־۱9l9 RDQm"m0,;aAf .H1HNT=_r_f{/)Ɏ endstream endobj 49 0 obj << /Type /Page /Contents 50 0 R /Resources 48 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 48 0 obj << /Font << /F34 22 0 R /F32 42 0 R /F8 9 0 R /F36 29 0 R /F20 7 0 R /F23 51 0 R /F35 28 0 R /F30 18 0 R /F31 43 0 R /F38 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 54 0 obj << /Length 2793 /Filter /FlateDecode >> stream xYݏ۸߿=%jIs(ٷ$)2m"[D|烒,/Y\"g3!v,^_%۫B$qbqYLY-2-bvx*2?|g`M_mk4_90goݮ^I{SytW7 SǮ>\È㦃=sWvlv.&cJ r8ӋPN i14LΖkYڠ2X['XVG>L[Š:Y,zf{7d]e<]Բڂ":@]=(zd2.u5+%L=RB@Q9n߄DMbGQD'hZ"ˣm :PRčKXYXtvpn#kԠzLֆ̊|n/C8-d温&9<R \M8$ʨ8k{)Sh=&'%_o}L% I `Qy _}Hky]/T*Yc|K`9-diD@i`d4 3E+x;q6IZB -RiYw|ﱾ'T[?Z6m/a +~ ܌ 0,?p =S3"C}"K< @D=>c)Fp @`޺Kv3J3Q`H l.Й%pJ+|zs$`& J6io,@vMymEn=T79M/C+ޙWd}pM1EM2bГCx 5Us%g`ɉ~d77?0YYr kbD`տ3vڃ+'(8 {`z:LssO$eGmA'JTLH>Ĝ7H>şZ@C`=~!kTzT܇tNyMk++9/Uy ;n7vBa$]U qqhT_}2 >яHNDބPb~%s.B&G31PO%d+ c ū:Čq1cDʲ \ L>գ?~Q=A W)3 @T{$D#H0=,T@B&X \'W7ERʅ s\9GcS-,pO s 6RGspb ЀbPЧ>Pd|| Hb`x,ʕ2r-j;>)QEO>>{xxeؕ>zX( Дv˻֒sī<)=IwLTTɔȗ @ w ,;%‰M\1ųbO<>^Ajm:[p9 ]kN -QRPJUoQm 7qZUU(4JI&Ӑ',9$H{\]@(0P5jx؆^دGZEb1'gX1'ܜ!x.}/}@V6tVjsOiTޢ ":]ĚGMTt=rM:^5!Mj"ba.@C*)0Yɣֹv[ O@=ʐ!7(X|:9'`k,{cQI~Z U{zgюNzp/J"얌:P pXUۭC5 ,(g0MrYQuyq/ Jo<@2`9nWiq%j Do6MT~h$q0'T<ސ=q!o\Z{qOϯHTDVc1,QbpWz_>m=pFԪw;@ y\HbmBHIY<ym6[Lhqr`9!w2&$1˴)+xmXgb:ʢw{ T$zfL|ޝ8@νx?!iR YpgϏU'~ǗVofwr,Vx*j\]N刊Uۧ WєN,ܠkLH z_)̦@?LwQ endstream endobj 53 0 obj << /Type /Page /Contents 54 0 R /Resources 52 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 52 0 obj << /Font << /F8 9 0 R /F35 28 0 R /F32 42 0 R /F34 22 0 R /F30 18 0 R /F36 29 0 R /F31 43 0 R /F23 51 0 R /F17 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj << /Length 2200 /Filter /FlateDecode >> stream xڵYIsFWfl7}$RTRQfI$J `$0dKvr{|okū*^}s~޼yJNn+iZ%V e~[{,yM>!b{|h#x^oT]WTG^D.ykmﱍXodDG:|ppWteևn M$Sq7R_mM;u*.^&*Ձ+A UwEM[/9HV,2`wRzԡ׭U `Tf+kDNӱ^1Sk.oys[_:OE  vKH=܌Z`PP51c?G]MF:­p#)S*S?eL$:) >$̕Ds&KXs1ɧc1[RՈ@W7p}bA%LT# AAԾF|eA++ IUwU_47IA7kGGD'O`&};}!L*HeP0;{l9 !'Zdnf .à+ Zqzu)xז0W*aK)r5F<ς6l@ ED\O}hN"^HR%BgTD& q|rڽ8v ADQzиTU<*!T 3j<-Ǽ'1gvc8]TA𢯱4ӫve݂4s<嶫"mz'vʒ` Pz]Bޠ}{K*~hʓg@@|]}:]-ʢ:R,եE( Olc zi= HAӓbz̢:FhYtl =Pqʏ>vu]8\rtd<r ŘåŖs_\8@z˓3IGH3ok44 y?ޓL@|ͺg805\{.Bš`&8i h%"{KɬlûtH2loriKk(AL΁οL_"ZWR&*×Ѣ2"/ 4R7 ˣd@If)/9GT{\j:YǢ>?Tzã#{vǑQN9 "Gd hX/ |AHgZ֚9_aYSM% endstream endobj 56 0 obj << /Type /Page /Contents 57 0 R /Resources 55 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 55 0 obj << /Font << /F32 42 0 R /F8 9 0 R /F34 22 0 R /F29 14 0 R /F30 18 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 2636 /Filter /FlateDecode >> stream xڭZ]o}_CX(-/E1.[vԱTV&\%N<_"qyR͌yw?ݭgf-nv͝ʪv?~R| i/e]NƖ|t_&\7+*٬]mi06mC-6Z. U}jV~}6Xl5VB1a5911cP%?'6sСZi.9WCmcSw՛{2Zl׫P.my?ס=g:[6k"kG]K]kKUJe|!4QuC7ެ5 03sMM6_Ė_|XֿqWX6*N<{b=V^&GwX ' ֫/sxȧ`V w8y K*:܆P0+tY&93ʌXhÉ +ۇ`(ql1S.1ʙ2%|m[0t69۹xM}oj uuS.X0eGM99|B)#g?`$WlfZf-w~Vhyƙ*we;!DM'F3-+Xab;%AwKfOtE% &~B9>2mE|eٗ{?\!С9)OWZ<5M "O e}%8#1نݦtbq-uk~n:Tv7)zSS.&3_`Ѥ'.P:C)9zS' b#⧹C+d<Y^82$ar>rG̓%Op5#F4lKeMہo>'.Gx7jg:͙TUs >q*J(SV8'9W 8120xUUv@ZP9G/P=V> ''9Q"SCTrhb­U)U!3(#-Ag)?zV|Qd Pb$+l06KQ}5m+wh}_n6YCn@QgD +nj}5e:imUh}+BB 5׏~BC# ?xO%=E[O6]UE[ ]~%U|~%7~M ޒ$u<(^dh,+UH .3]w7:z|sL{`r9a_"uP!c0Nh"(`r ^R֚E(^储ل,CGE5OhܯBdO5it44idZbs&2( \8$_78S1ciAYD&}}r>NciZ[cWHMdYj(x.rHM GGys62 =GBoOUJH 㲓wOE@[r;aI܆g4iyy+Sj5/{E!91GKPYǔW١rt TޮcUU(15U!EW2"#nK;3#^ 1wDlFOqa}>u@ ^@BȲ!ǠgHf dWH3ad>ݩr* ά˯Vi,[V2gT9'փ 2L HXy5g%U挚h2{E(+nsx##rˎk$$oxW) rgϻ/\MLc0?< V#):Y`]c!$Rߴ[AX-3g* #;6p!?KP`qzp)ŨCfU>> endobj 58 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F31 43 0 R /F29 14 0 R /F34 22 0 R /F32 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 3100 /Filter /FlateDecode >> stream xڭZ[s~[ !ykҤ=yLxifH9Ա.@J Y"ˇog|~r33{>qÙ1ff4gBrKv.\V.\\j[x*]˦8|*o$)qga$%#g\G]Δ:&xf;tt;W^eELJEWmn0ۺb1@9bݖnj4}a\rì9L+j$euIN/FaBgu8W|l֕elI6[&v==e|P5J<懞ɱ۹y! _BgXONz@BI:cM^C%.Ѩu$^!', *v/~uqO ՐLp˦U<[Pݧ07!=p߇ qXAHaz7?|gY9io0_~L*f z_nMP &b[)NJQl9sjyju'K:G[g'Nz8*qv ΙL;WMQp s$KsXoJ1Xw]0lg}1vMi31y!퀾 Rʬm0ѐk@SZlψP߅+X"nLVb;e}ҶXQc[Ij R(Uq Cx.ǪxAƴ)֡2f`0s`q_r Fzn < ~4ESERe7tOt▂<2?NfZ%۔tvBs0!kGJfJ8Bu,WRUed ۂ[*. rҺPL$o&L9+9dye@ivk X_r}:ZhKH@_M<^+V0G4 oG @y)VwЈZ!-ZR}uCGŮE= k͉S:lqۛ.-jsxl<.Ŕ!pӥ=mCb"G:3ٰMMSY "&c ErnAql&Cfqcγ=;ेCe=d.Cc9`y#,!L( aX 9TÃ=<#<[]Aa 6B> "Bfx* ӽI) ar;P^ Gsؖq0mmHZ?IZO@Z}IR?FY7Ogmc9S!SpC\<轧wa3rػ g"~Q4wu 2K }@M]͹t60bǐS;N4YCZriN`QO(y \LڳܪuY9ᗓd^^Ʈ]1?@laaWZ*kەPd mWϮ>Y'(G +_eV=WCO𕯡eC#Vrpɛ>=2([% .%G4 P=X.-g u4E(̖D Q St`F:G[ ѽꉰZn9@73뙰_r>.1ˣ;`%&^२|>&ЛbO$ρmcVJnc8CrP$F K7Mr"޳#~X@ceF%E coxvD'=R u^(K֥0,$1*NA{A/zz -?wݥ=#j?rR9 j/N"uiص]I.9Y$ՌKq> s<崦#ﴤ$^6χ\t+_E~ ϫIt :kv*aQ)l:ƵzS>|a.e8 9y(b7h)SNF j` endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 62 0 obj << /Font << /F8 9 0 R /F31 43 0 R /F34 22 0 R /F29 14 0 R /F23 51 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 67 0 obj << /Length 2497 /Filter /FlateDecode >> stream xZmo_Fb)n{]hA T[,|t|gHJvl?욒3 dg4pyOY(Բ&au#\e:JgiX ")Y,??˜inb)O˛_ۙVЦ59}}7;x< K-N*vgWi$%]"FUιJ4zѩ%TF6j;ٗxE["+e|u.^ N\(b2,p 4DA$"C2E Ҷ5eD ,'0\""lKnuTe<&8~2 f"Z8Ɍ,ڈ@5TV]Y.*?ܖuu1aIBĔWU^!Ҿ * pX埶Nyۿ{*YCELvyXύm>~\x#uL 3󷲈 @i$FKA5dq*3D_LH 7QfO@l_LT4#vD`={EFZ4O[mQ   U_6icV]!DҐKpKAK|^hīMQ/}̼{GBʺkc,#L.LѳI W0m$ൟ|iZ\؃źBỆ!{>8kҵsI8ەmmwǻ!'*!{uVI 7xOW {KKw宬v%BEb1C̕Yq gaq(Kk4x$:sSo н7X)m`}LJh"L6g`9WM%4IJ&֦]lVEIn36vX: ]!|s߹ЎۅDhi|޽+&_6ﶠ0Sڳ&>µqgJ;{7n>t|֣ȺGbƤT7}t#iz yvyT8~]y/_³HuWGFG70 ̴`߼_MuT7.+u}|R踄ML"j6֢,0h92#:Wq>4Q.n}a$usA6l.q2;__#A\;g}jWmh-@ &%wYd]?ytS|$$eO0Ytg:P] ʕx We|H ^f;I%VbRE-aס1ci+Y:f!bg9p3VN)*P1;`{$!94{iK b@3h#&ǻP'e$Ҭ>v(7߶N]uulA $ۂLfZ&Ǝ-42A'KS=\EuD?1{*;c~?0ʡ |9,L0p~S><ܰdQIi-wy=gZ d8엾]&FD d)M#> 2L~do*ߖ7mmao;+"(`EUEwr6.ľXms]xTmO :gc Iq+Sask}Ё&`s\}30x$h!a^@ hj}5$SxD~mP}ӱ< ]?s%\mǯ(,]oH$Ïf_У%NyHHhWP3jHrK$C`R_4 {}KHɞC5/L? ^wEOl1.s=ZĎ0ϽTx:yM+oW?ۺ[ZT]ε_ˍs1=9kPpXu8?W ,#Xg09yCa endstream endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 65 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 65 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F23 51 0 R /F31 43 0 R /F30 18 0 R /F38 47 0 R /F36 29 0 R /F32 42 0 R /F34 22 0 R /F35 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 70 0 obj << /Length 2233 /Filter /FlateDecode >> stream xYK6ОF ItfE- ŖmmW3>U,9r{=bU} ͓]“7D1g5oC:e+d.nATg:;==>xiؖ@+]'[r$E5lmP5Ѧs<"si` |; Fسc8GǻPڸR^?DvK~]YU[ %I0!%QֻˬPeڈ@K0)"%(!V{A84`^"D GCiӀ'XSZUw}PfHXdY:#YÌb#J|0'V)c2@ǰ6vf3:'ry} j5a)D[ЬJd'+]3 i g0 M*"E1`XE#-qZSCpGlK<`~eȩy+_R@J3Zhh& ϜPB)F5}ZY,T hmKcO4s _#u{⌦UKc)r}mf @ -ɶϋT;ŽO cz  \L/xwﺥ(T+5hBs\.Moүd72J\WQ1Ӌ? 7ܳ=x%[Ky@~̣OCpmkLmv14"$6]-j|hienR9Z/y̠ywV "Ldԯg4CZN.K߈UL[(!_Yֻ: S!=DyZ@(VLșyЕY-\BDžތH]A]PEMwV`Y\&z^ A]nfOϠٷA/މ oCSk5W>)=-5^k:^sNo@o6Feà rP5>HHK@{HRwq{H؝ GHRK@2X &ӛ!pNFB98z_#m#v.j 'ZCe _FXZ`9@cn Fӑ@pAupt Wé XkSs|G]V47482)vz8 @=гi&ű!zgW蜛ͷփ}#4ǿQy?7ЩY(ҸP1\B%49Mi(UDn@p>d+S&TmW9hiﮒ4$Ǒܰ=v=ix/M{ðee M ۓe(iO"N0jYuڔ,Љ>B3#I 0\4I~>Nm7L1i SǑM.z67.)Gj##֣R6wdϧMe3 ^S"ߟ\. endstream endobj 69 0 obj << /Type /Page /Contents 70 0 R /Resources 68 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 68 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F29 14 0 R /F32 42 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 73 0 obj << /Length 543 /Filter /FlateDecode >> stream xڭTˎ0Hpw4հTʫ(m ɢsNOϛl!H# 4LLB L$9M?$zrAJG$Nr|%I8MКH y_*4rD4󥠅EmbpC@"e<@iCTO]`H6}c; %1\\~gb+Ē03Ȧ=0?7g8C1Ґ@p[1eP}묾l2;m=[m:|<'L kR?|,ߕbq>0Pg",_(}DZ$kݵpn"fD IGiy.v5ga= hZeɯ ~,R18 "|܇it*\X | a}v-В]yXn]+qBvw$9Ve3[edlR~X sSǝUg‰u L/فZ\ 1 endstream endobj 72 0 obj << /Type /Page /Contents 73 0 R /Resources 71 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 71 0 obj << /Font << /F29 14 0 R /F8 9 0 R /F34 22 0 R /F35 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 77 0 obj << /Length 675 /Filter /FlateDecode >> stream xڥTn0+x(` &Ihٺ-(IX#m?H&8 =Y8]#ގp9Qp`\R4B PFRBie,/ܘv=L?,RQTgIӈ`(qIW"" A99V~fBao7uk=$= X_Ĵxվ3jnh=ݬWz-ف2&@K(^ l67]L-QXrOv@(PLYkvXmLulV.mgfN.}v)uHK?*Y\w$&\U}\gSC tuv4v֞Հ;cUlGOl:r>Z1,Dft;GHD7 .G_ݗq ԍ #$޴6Msc8}!7;㨄R⛁Q5ciLڦm=^{~21(I|ߛGvi:p)rKM#SU?+v_{ضz1>/ŲwEYԳ]Chd*Kl`li65M Di-92#{jtX Pֱ؂ endstream endobj 76 0 obj << /Type /Page /Contents 77 0 R /Resources 75 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 74 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 500 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 13 78 0 R] /Length 4355 /Filter/FlateDecode /DecodeParms<> >> stream x흽n:i3s{\  ?[l6*`tMl"ﲤHDJoLBh5eY6E` Ŵ`Ro6[ziZmkYXSJC4ѥ2LY@]w&,sL8)9SvAa-6 ]XšE`J^42fZv 6"^J3W=.Ilio`-T!   W=S *cOtDJU!+YZM[4̪NdE{.G' cIGj)KX*}@-e +͞;`X C`1X Cy¢5`2,a4` ,X(*}@r,4L)UQZV=w b ,!b,zVXg1B=3Mc4X*5Fs,J ǒ:u,ob,ob,ob,ob*p`;cg+hBk+fc;V#a\\:aӮo.//)D]E_ mdӮMᴛ1+ U 7`1|7`1|7`1|7`l"%t|XDmVf6uly+\1Pd:xY +uK+7`1|7`1|7`1|7`1|V&v`u:D>D ocQcUwP^]C#&+e4,W,J X ߀ X ߀ X ߀ X ߀)v=&`:K'EW!J;nYV4XrXd4^ G*kXߟ!+`un}|X}ȱ#gPW*$,.HXa%DVX$+y,,c,ob,ob,ob,ob~8)M 4&`wY՘..Gon%tdᗓ±fOYÃd|$ BZ6 VH/ss`%X!{ B*c2,¾+©Cg:7ҍVHMoBjHVmX]ULuNK=:He-ޔ'{`1֬fsr+YHld#Oἴ6֠?rڀѼyÓPϚ:u@Ph`T# 9oK5,þP.p1`հtY' K=yR,l9Ԧ` D?#aݱ6;VSl²oU6fX]wy#=UX;U& u1aE}VWs~=kf1`<`U\9Օx30X5-)aSlEY,< ;~^M"OOM+0K!$b,ob&Tz9,/gNV X]1߀Մy=kWpPGjZ.X mdNv,kg)XƜ4#V=VDfV7`uϵ^|߀Q>:VrRE8uM6a4$X]y'}!Ұ ͒+$/ .\=K+Y!XGB:Xb:ǠO$ B> |VG `-G X! Y^t`zY%%.cֳN gXayiHn :`VҡK4II Rڌ_<ԴYjRC^ҿ7ي,uA9Ȓv&7{p`#2NHkX>+cXVX"JVE.t`kH>+cX_+!}#:gIŋTMq&C>('zlzփg Jg2I5)Ӵ?:('[*L`#.8G^jXɰ^ZϚֳ& 녿4-X8O?5)Xd`ZR2M[jY8LsZgհ0Գheޏyeԑe8z#XL >^  XXXX5}|n8XDz2qt`! ^x}֏OY8Z,Գ°^g=kih&Y8݉,=,9SXSaY````NJv}|9,czTJ=+V5kzKNj,3#+8W;ғ٦ xoX *+V:,Y-X~=5z=+8}^5JdxǑ]dVƩge pz~=]XzLJ˙/Bp0~:a5,b0, a5rM]D>"`:#'v,۳zO )@+o.MP~HpPt֊ "bTm壞)uG+{$SBTEB>Q:f|T)a^j[j"@=cOOv0VIg=FIeaQݭJ4?(~2UXiH;*8V5tgJ)dX>I2 |u6/1 |,xЮ     !gp"K R+M 6 kn2X CjHպuټrS@!tǞAAAAt:UĄŵJ4}VlhdD#g%>+YFJ {cLkI՜%51G7riwp8m,%-JClM(abS~Sğ"PI5I;zwEYFJ4}VlhdDz >{ܱ{|s~apstCLvssslTQ:bjt{{=OFí~qlhnYxFk>`e-GsʅuKr{'5e:yA$7M> }NPɪ'ӧOrlܩY^Y^Gz4a6IjnRaeTm߫dd'6{TXUL^5sd[i`ɛVGiI}KY{wj%I=Zi|7SddWV_GհշȻnJT PVgr^ ۰+_He^ rϳ?T uOQսLowMˠQi rγ4+Yvzvzzuaez}??==ջ> vlSW*ރȅd䡂K?>~~2 mXuW.հ)ankjjz rϳj:6{XVziWxe,}l],̙A4}VlhdD#g%>+YFJ4}Vlio;   hD|4 endstream endobj 78 0 obj << /Length 41 /Filter /FlateDecode >> stream x 0X'N0U[D-0b"qg endstream endobj 75 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im3 74 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 81 0 obj << /Length 1116 /Filter /FlateDecode >> stream xڽUo6~_6ߢ2@5C{h޺ %V+KD5Ɋ#EʖX^b;`37wg7196@(g`&4yz-tJ-k "<_1ȟԟgF zָZ!bStp9G,:Lt݉຤:X2:Eܢ:ab~zt~s us ?ykYN B.[40"Z=u}/J,[N%**"5VAx f+ZӶYNUk%_uYOTt?sQ:O3&O3&FUܞMm\cݔZ 81%ʢ{L]T!AQ eMKyxu_eLe ޺ ob&o1)]53սVp貕&P~󊞪U.Z!g3a1r}Ȋ7p:Ѓ|p3SP 2/zߏo%J'kʟ!lYO?OoÈ ZQ%IdǚgPz>z*ژǫ efk,jùiҪ`w^܈AC6 n a\yC [|QvE[}@1Ɠf/ϱXTjg3Q9l8ZxgIVxIzO)o0Mdh,˖ۉ.96G~hkcKB/g2X@GHGH;?MeN>dxW*q_!KM&0_N!Χyv{= Nz%^aAm'sEq>,@VM_m`+.s[V Btm s'UJ7U1 ?zξִ=ocFTOB<TA Px=e 0LG6(ittZ#iK)ňىZ!dka,pv,,ҙnXLoѥ+Zd#(Vjle95q1_8rاQgsf.|SRUgf .&I!k`Ne-lK ۻXQ endstream endobj 80 0 obj << /Type /Page /Contents 81 0 R /Resources 79 0 R /MediaBox [0 0 612 792] /Parent 82 0 R >> endobj 79 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /ProcSet [ /PDF /Text ] >> endobj 85 0 obj << /Length 827 /Filter /FlateDecode >> stream xڥVKo6W3SdnMbEQt2m -W;P ۤX7#dC qQjq1jd&+ZZCb+CVɾ`YO aeѨ K&h[P";S}tڦB-*\Fe{I'nw i&\h*L~]WW.I9$ (P.Tdp C.M{5:#?E'tn&^#0d,_6`30K]qU.!dL9ԩwm!_Yۤvbu_? &wBuP7 jnuػ;  aӂRE@ CF-ԑO-m+NyH5\/) | Q/P^Jj_ُAjDbdFŪx Sf~a;xwk4aqiLq>ԓQOa.ux3IɊSz aC"[)%VZ{{]u%9B'btKqx%&ŒP~Kn<_З> endobj 83 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 1085 /Filter /FlateDecode >> stream xڝVo6_=SRl4݊h7}`l&GL̀"yzFDht&]"aȓ&MɧT/Wҫ Wm[H۾VPxB{W Y bV3SVĂ̿oauW`R}SV/r31v6r-)ep&31 gȘR@uCwͶ_~ӕlJkʰ<C1#}n*dZs-mYa,!c߻\٨|O-RmC#y9"X@08p@(! ȴXu' ?64ݒx-߻ :Zp[H; rs~Qg%霧mlJ5xkc j{55<]z񸀺?H"1J\dS/>}8S Z'LU%/>ҰZ2)I];SSA`NoJێzWaa)힎6D($-c*|gU0[\E6).u=QИDTe{M[T=nvr͆ܫX8C)`P([6 eN=v7^f zy-dDH@`e]V:yr?yulT{-UL Sn67F%(44>@XQx.&M9Vcyڱ<lvxG8q? xbw5N"*{z(=6DEV`3Xc)F\!5 >OY@zCk)WaAH$8ex\SJT\Z'-Gx5"Πc ßL+;~=;OmڌI \:hO"JOnXPTQg뱃%<4EIyկ?|ÿx=Y<9|߬,|/5D endstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 612 792] /Parent 82 0 R /Group 87 0 R >> endobj 86 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 91 0 R /Length 3335 /Filter /FlateDecode >> stream xaQ3FocVT2U]. t^㸡u"@ $I$I$I$I$I$I$I$I$I<߶{-) :_^Iy5$gtsJqWV-=i|(ss^o~%=[Q[_]v(s/╔ܫ*#zW %^Q*Nj)^Io^iW!q dw_F[ ARx%I$ĨIIɨ-/5dȖQcKF:o̟l^gx+ʖoUV'kUVEg?)嗵?xQWU3^E0U\Un^?W"s(W_/+O_= OOهmگrUd~IM\$?,IMYlIȱWUYϖ 3:36WWR:}uS#>3Y\Wq"¬LD^EEYYA?lGEYY&^Wהݫ=0Lh5eZZm^v^ _9޻WN [ _9|٫K=ʯW72֋WdȖ[^QcKFlyɨ%ƨ%F{[^J$I$I>l]X-W17xI12~)~_[U#ݚEcd&n)id#8\x08W9y-Iu=ī#]|~c@i:xuWsVǘJ{ʫѫZyڝY+x%^Jx+Wx+^I+^W|xū)BxūBx+^WUsx+^*?Sx5 Sx5Txx+^MwW2xJWJWU6LxūD^|hN]Cxs?ϫ^WgVg$KJ YUO>EIշxū>O>s2Śsd+{uLrIP=}m{q3>~S:oxū^g }f 3,.l1a=\kdx5x ^%_/:׍xū/dW>WUg=,^?߾z{Fz y5:ͯ+dWzW!W)x^!Wx+^ Yx+^JzYnՍxe+^W+^WBx%^WŐ?cWO&WUAyyu3xūn3̫Lxū ^UMxXxū^n;[ Ͻx+^]W'oO+^ JU\>믶YUj>(&^]7q:UwO6 xūyWU^5yxūՏ)^jP5Wj"jxū)t5W0+^Dd}<7r)^WKֈ#Lx5W*ikYU?~ C&Wg-OK^:ՍfVz^jO@!x$LjW~ Vz *+fb_l&W6x+^buGx+^&Tx+^*(x+^QިzWLY:WDW .z|{=r{qWqjxzWx٫U+^WIyūf Ձ;ΫlOՐW_WI4W֋Wx+^Wx+^WxūR^WjU=ϋWЙUSW(>>6^~y+󫴃"W?+^Wo/=+^ Y[^e[+^Jx%^Wx+^Wx+^Jx+^Wx+^Wx+^WUBRy+^jy=xū^AW1Vo+^WcWf_:+^W\\9+^*W3Wx+^*!/ ^WIkoe"^Wy6xx0nڙ/Wݓ<>Wvv^*I|S{9n]8U^E>g;A^*6=ߙWګgq^}mժSW96HWEg_kxUu}w>yvWv j*zA+W5(xeWx%^ʮ ^5A+^Wkx+W ^J]+^x+W^ʠ+^5A+W2(x+Wv xePʮ ^J]ëxMʮUivhO5*~T2T2`*πN?9'6TJ &e>*ۄ\W>FBN'x%P2oBI$O5!qJ$I$I$I$I$I$I$I$I$I$I$I$I$I$M׿ endstream endobj 91 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 257 /Filter /FlateDecode >> stream x O 4( endstream endobj 87 0 obj <> endobj 88 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R >> /XObject << /Im4 86 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 94 0 obj << /Length 1524 /Filter /FlateDecode >> stream xڽWmo6_,1wQ6֡ÆmXAXBd/Q@ a'cm8GwB*(uAF9*11:-ItL'%t+o RF2R V'3͚²L5eצ#}A: ô0dxm}ex"nؕ̂Mw{()=ſ"i)!'~ d}l!&&aS3p=&G͚muH#{*Y;f)JAl^9Ԋ]~)řM> endobj 92 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 2159 /Filter /FlateDecode >> stream xYKo W(@ˀޒA|X[V$ҫ-8'\Z*fLLpuOy(dM;%˓ur^mbeK]}<08g<՚ͱaX,=ZuWGm˦k]*ކ`s-Z}w –_Zu>-Sw'7L2 E2/-96>>g 2Q^,O\nDTr?S"O>1Bg.RBVNi"|XwАUr2\?M{~Nq. Կ>Tq0x7 +eP\HcfDz*_ə╕ B04?𞺼bڧ9h}B [zP#`A!) 1E$0m(쑳ĆEfMK1!2B .%xZWa9@Gc(RoI}ߘ"! jhp*Qk1"xA_'9deK kO5 .HՏTUZ~EC|dmȝ섧FGK42-t>A:9G)Y5'.=1,eKח rPMJ^To'A??U07bsX96k=-dPF-/ro~JVʧmM5twnd)rIoqivI5G*PDxu =Ts /5Wcm]QKU?#g w%rKR21)q-H0qiuǸ[@Ԗz+Ua8!D.z\S\ }> nOYABm_O}}tum[7?p Tk/8u1c'rղyٽ(% Zx{ɼw/sX4y˚8VK|\ {)W/˫R޼ gP9o++*Œk%c/5U8>ewa R3͡jZh#?%t{fN͆o$`sS>a䯯9Ru=lhrv \=:/+SGef3h Qtd׮yy={p»b%i endstream endobj 96 0 obj << /Type /Page /Contents 97 0 R /Resources 95 0 R /MediaBox [0 0 612 792] /Parent 82 0 R >> endobj 95 0 obj << /Font << /F8 9 0 R /F32 42 0 R /F30 18 0 R /F31 43 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 100 0 obj << /Length 1573 /Filter /FlateDecode >> stream xXKoFWHS@.[ФhO-[PKR3zPf^ݝٙἾxv .^ȮVYk3kgW]>Ls~6WB튞5peZWMeCGgs {es҅YV_L۲f^l6翆UVWs*> x =_UR2#, /I\Sb厥`& LA\]s!g"3_ T!-o G>L1,(x'RHeBfBERǚסYSԆywory)01 Q&Wy>e~nΠyc>>?hFj3>KP/3wͻ4Scz2~3'wOCOpc.ǭj]!^Xwl[DŰN 8<]n&U՜bC"s%BĻZ'*ZB@[d:Re} NOLm<SUy}E0BB*Ϭ: S$_)$]56f r-C u~. ) )Wm88pW`hH ҇!qS@(Øc)zݴݦ/ԱeWΤtaOZbrrBWcpJ$-P^輤mX0Xh ˤ,(ѯa3gQ "+*f [.3^c?dbp0Rpsa4}vE]*u:lfX,q0o} rZC? LQnUS ҅M9١C qwx0a\fu qV6V+ x> PS &tZ΢?1ҏ1ܨ}ω[`/VPs .o5mI#SP!]6Z+7}0bӴؔ&-0%%u=Z|&9b0 x=Vv_;~]y۞8ѺnSƫo0{XVANUHXYGx7kUxl!h`6z^[fSCV ~(a+`CYiB^$ &wy<8K>16M{yWC!k"`Kd{Gc֓- ;"M"9&p`YYcN\RA^H> endobj 98 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F32 42 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 104 0 obj << /Length 1562 /Filter /FlateDecode >> stream xڕXKo6e f-}u\nelH$op(:Mc͐4mg|+o_QؙL\ή73! e1ˍ`,6w_~_jv/$@/ϖ(B^]1Hf5Ñ`j|e`[ cckq~iXq}~]/Q!U~Sbju6$}&6u&Drr恶jSvDBY^NFdt6)iד g^JYTFm4>PV#+K@Ix9 x-5^ay6`R,&Ed Ë47>gvT^AEn- P0%+8 }zL`#0 ZrӞf?V40\RH0UoQ,P+CMyVaq2,4(t~F$׭4@F+@$k(Hn黮}U@#qy5ע@+dD#m!#Wh}zD uMҔd*|jv= v$%;aؔ18PnG\y>bPr2!Gpd*UPKT_ys ˲J>j{7f>=ZbX쐿.xPY 2ѶO6u[ T~Ob;nfCǺ3Od rPCzϘJdRDrߦA_! DtTn' x[d@5'yAAY.!KiQLC/OHR'HF7)챘'{&Q7()i`ӏMcV!|>%A"pR[3%bsxh@)^/%E{(/`2Y8΁"ܒܩM&;5rNgU=0z> endobj 102 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F36 29 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 108 0 obj << /Length 865 /Filter /FlateDecode >> stream xڽU[o0~PSiq}]$7BYm2T~=DZ6]& T;~;8|Ῥq@ 8sяF\0!Z}{)p{t+No"xW>AyN\]s4$X*`Z#` >jeqy*]~ϪriWɦ6V1"}_ 5@IcrחYt]uR CYe#tNbBP @ >) WRyc+'qXA20 s+ç |gWlvE #(|R!@и2Ic>oYxIDBNWJq$ULJ'Q~ `d= -u`ݽg[nl_BQ(>6D&͠)>pzWO:` )G$FPy T&`i{rnwRe)lW5Q{0=ٸ]e]UxV I.ȷI֨۵bG1T!`4 )Qbp9?:{79쮱_ΠxϚ愤3">R9)|jiBÖ%(ՐL(bkM>^&CS:RCZ FIԾ¾ֻe -!m$KSťDgɅzj_aQz\z= endstream endobj 107 0 obj << /Type /Page /Contents 108 0 R /Resources 106 0 R /MediaBox [0 0 612 792] /Parent 105 0 R /Group 87 0 R >> endobj 101 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 500 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 109 0 R /Length 9162 /Filter /FlateDecode >> stream x (@Q3ܕ=}6ӕHs!wtcn}0/:ۛDp{Km3@ZgpDӋɻ߿}t_n?_|/=Y]& 7mٟ_p } _?G=x~tn0SLيۉzn0o$>X'= }{2~hlBPI/nnvvnnvv HvnLvnЃwr;1͈wI nvLv۹p; S۹ vs;p;s;p;v22Hd,d#F n22HX#F 퀑p;,]e,1y> @{7XM9c Hr%yp;5ظ-%=331zۀۡ8>cI"8cI܎^1RVv^d,tF d.HۍȬKn.&Xv#+w72HZX Lk`),u5RXHŐn)Üu=v2VJX#6R Hn 1ix?ǧ?-.ad,2Rtʈ{c9+|$q{#FSP6и}~J9_G3r{D:x~G[t{kAO9`q3V}1g]n;=Ҕ{%NXz>ۯv۹#|;Sʡ3'뇋r&اw{Eg۹]/D|Ï1.BFFM.\Uq"Y>9#gC}!d>nj\Cl|]]nnv_ַ7q;p;֌j%c4ngn)4&a\69ۧiVDn&L'n53E2Z}]O;q )Evdo:}:Y(6=ڼѸ:5s|vn_n ~u:r}5}݇۫z~Z+%E̷sjݔ)KI~p}FMO?)+|ɲW'xW;`s8^*g[ՙi_+w{'v],a;q p E:nxC}~I- ʹ/}>-;uʛa /`6wp=rKܾr/9p"q~Hz_˺}/kɄ鋗WnFJآj BtDA)n)B(w퓅" vS_#:*xF+KE^$Y7z 纹#.J'n_' q&.qlǡr=;J/?hmWaȟ-rxuwq#pN~+KW>jb=1ۅ}g XΛ0GQk c0ղnof#? 4^KFC`3bԍ?}%N;v{Ywpxq__E?2jF'^ɣm_ʺoofyjh/u٧5t{)WH/Qsvp(u{t{n?/^N!^䖿fwU ^laL2'\2^@ۯȜe.ν/=tAܾ7syE nnsv;6n{1P=L./cfEXG0|=~ɇ'-Ewcg{-xvx -Mn/!Hwn؎אV1ۛҌPn0OmU5=!*m&vKPz|Ep=~*Fm,K oD?*# "n.z,96۹]<_S]R@q{ܨ&֐" ?s*zznre3jhxWs{4Kizv? AHvɏ?6cs.ޱ Fɾwԥe[=koҾ< b#fN~7y\&$!p$~|/W$0k8vbf&zȪn%1+)iPSb(C|C} 8SD zӸl\.zŧ}BۣNjCD'WՏNDoٯ4G ^i%tq7uNpɜEPBew[e]A[  '=qkvgԭ{0GL;GqAE @nO^}B=;~_v+݉e/"b}8Z&[5k)[>qWs/7JwnWGJzo k*+FVOtvE{j|.~;ɐ>T.jKFvnRz{fnpo?tTS[בۉ=rErIauu_U;sMuWo}O'a @n'7[yV{Gu6UcCzvn3n?dnP/wV۹}k~tF//&0[2!#jIݖunƭϮJwNCtrfDbxǽֹ=| z|nOϓE. LFc[JzZ?zW?ioV7`B&@Yz; |xۻRe}EʚZeK_ӲDxfM~TvEd{2b=`~AIr("!3LnFzwa7u Unm]TbdU|ޫ.~{y5jnr;g=c&oL'۷=ժSs; NǼXZSp?RkunlEWs- m ׂ7c,&bEl3`}Ȥ@o _sluXgbc:GEW5c$<&ъ9#>{s;sA#2vp Xr?xoGnO8y|9>?>;}"d):f?_?xXk/(2㸝GV"' 5>*)z/ibK"Օ7>ʃڒ{`Gz_<GLRlG۷ {œ9;9H~<+n'kwb-Ut3|'L+ lV/.p;7o-ճ}/B^Pfn/͓𘘔Jپ(+" ß߬ӫtn11V#ncͽgq/cb2w8k/ܽP~#[ŌI Kvn[{sW)oyLLhs^Yʕ=W/#7^dֶj> k=b? ;p;q"5\i_{+Rzt{>f2̽Ӌn8ͽ9n ?F?/3oޙunvn\*k{zў^?x`nvn._.I9H8|Ke/ew}7}bn2Vv[ Tm[ڄ/youˊq*nn٬ˇ/~[_OE[ g=7E~6!s_E[ڪP?pB/ӷiD[zodžtE[T& VKUYz;hʆk7 ZɚNSߊ~=5oΟEʔ|+/M*RFv~ܮDu6Sk]ZGIǏ7' ?5V_RjE{{{m=2|s ԂUk|_='gO߻=vs&mSMOgn Va_l JcJq nP].b/Rz/u30<կÙ7[|[I4#>em:IoP.2nV\4ÓR>quzmn9G)WU~S}Ri룉zm]?c6n*Dxz}7ǿ;8m5|v\{ ?ݾOA%QDURt{>΁^PyzJ>p;kkh_jxLߒO$[J&nW-ĮMz>Nw]p;߮~B;+EF׿۹oG.={Yc$\Vג;m-q;MU3$߸_j~͹}nݞʳg~miPjp;su {B=៵/Y4V}xLL|勹oqpS۾U* +yLLt{w?<L9;kK}Ds~cJ^ʃI8Knvʥ{ۻ}c]E3Ovn.٘ г8ROnuH=ǃTn7O2Ѡ߲ȭ[67~\l#|8wBgw}R$d;};U_.w,wD7~I*n$&,kϊId:?4.?2g~F}LptݿʭGk z%'H> $ Zw?]^*>zq7! ٳF cF~;hO<7{_nq+Wgnͣ+fvjb!A.8RT㷽϶ }a/F+˖uMn2킣t/$}Og`v+d]ps^ ~V\>nv /@nk-KpŊۉ%OX'<^gB&Tn6\?.D }hۉOL3|gb"vv)XEbB&f՚bv2ծYVٳ1/;^EI|Gޝȼpkq$ZRՉg.W{dǰKqM9#oeyT5_v2Mٕ=Q36H2%Pz'O)/HO-㼻h,.J͚ n7 q e({/ӓ:ߋ}JuTZn/Rwh+J"bEnxjbctk7Mgp⭿??`Ec JtHVk=g?6۷ =T)߯/m7~lgȹ&w{$Fvӻāع]Eb?no6[2-ZgXVŃ_c^]t?ع]վGp^hߋNYQ6[(n6pO3*_Nh*_˲be/4b<۱y%ϋ@e%t}žMlS-Z%tG{ֲ3b'Ct^7OԷ;p*v=uEkk[b6_vvw%bovqwPu6]/Vd,ûәۉ۹]/w"nNƀ%Gʚxt.K^:1mW2}RF;/n*4DrUo-vnӏH"Hr^yBf)[ˆ퍖.=}P, [Ƅ۫E\,@ZU}.co -)s[%BѾ;Nۅ5{p{rjE{-:vn3V<7- E; lk'i#26bvr b{Meelw .nb"n{1W{w T3^'k|˕|},yHcکe9c޺S]_ƓZq+tSq{S; r"Gj);;s{{^a&/b6ɉŹeu]3z>~b{6x}q.pz[<({b}/)#+u#\ncx2RdYq`q u;ۈ 7qGg81E{m7V:b[.{0$z)15Yv|~Y*8 ۅO)n&]>he!~V|d]6gT=?E6\Oa]{g cHŌN p߸nQƖF]V?39OST]q^}_lρy%B}t(5;czUBh}'a_qݤF Hwv]ƶR:brW ^in;{JD26]KȔ˂}_{˩h+u )- iwAľ'6dC4sܛuDxq/`/i]4 QͱsNN >qD;Hqm=}rְ{[ŕPOG7̂% 8op9tKcN>qO ? qG.1g^f9nDq t}Ƶq>zrD52vSzgvI0.q]3$XX{كW7dL+udZya3#^8uc<SВbٖѰ]*G{lRClA{L>խ~ ZxօǴb_LNn8Gvf߳$Ck>ϫy/lv*ډ= pyhe)<9@G }Oc.h`%ts 2}߸(qXݑO/rBA7 =n[Ad >иH'F%F s;"P_ gJgndd.#E|* =aA1R Ok"abv2V4`x+%dYJkF*0]aXF @Ʋ5RZp 4F 0kN|_5RVv#2]P:)tn7R@/3e,s)cYۍt@i0֥:D4GR:Q'rh`rp;H~tp;V|{5n| l 4ve[nGDp;lR72A vnp;`X k22HX#F XX#F p;np;p;s;p;c& n|2. n>DnS n|2.>dpQEzpnCnP vnnp;۹۹t;>O endstream endobj 109 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 500 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 508 /Filter /FlateDecode >> stream x O3D| ފe endstream endobj 106 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F17 5 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /XObject << /Im5 101 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 112 0 obj << /Length 2182 /Filter /FlateDecode >> stream xڭn6_#^}ډ`do+njɑ~VHZ#;>bu;KvItۋ?rpά"O"5gBm}}4R{\݅$~qպfT-3.]ㅻ k͸m,RpYRIT$Hfr4&0.Xa*pMdv#E:&W𚞃l| } fB^`ˠ(ZiVbom_?10ӡ}|'$t(ۍ0E˦n]`lwm/6#bh RǖN( w6@|p#K׆C#@`@vݗ&v$*x*3?aEHiplʸ/GZu]$N]WA BP#4B.ă/ 3Wn;эk̖>fI~_⁈z # ~z:3 Dq""Dƅҗ! S: L BBvf܇W;@h8DOP0Vv y̘Bʾ0<$H͊8sik@+zLX@E$C +d1]M 7:e2j{kG\Fyc&X%ff52QY{TP uZR1L(f/Pr=ݡ{-`W71zqOXUM{Oñ Yk7%6dp,|]s 6k[\*jce ˳\0&ojTZ!7.)j t5D&+eJ3?WL0͠~_=$xWn[m~۸%/j*Sʸ1FmCiW,=}OA=ε/G0"NWb7%ȉ&+D,2VxC@;X#ij _, n>w)5]9tmy"O9~Tn@;)u]{wGAc M aTv‹+f!ubUD*pS\E,Aǻ l_X'rk,t(o#,/@3Y[de6/}ń1 ( ̷y!Y`e0L)LoC } 7 ـg>)Ӕ7 ;ͳ, ,${]]YaR?@ec5X]wEe JL ]xuހ%q\ā)q|OOS@`Cލ;p5.3lƱ@x3/hP$0;G//ʺXe݆K6 p B7`_ <_*qQZG?l*15fT (">='~'E-- N]Klʧ~dPZl\mo 򵚅hoCA8i15v|]eElD&㤂~Pu_=YI< OF2V6y. "yal ݱ]%N4]MW8隡%a s^%Se}RLw^W21o$OZ8!gKY #PKhN8~#Ck@23|#$sBη 18.yW7j+b2ԶuY.g4=(Oaݻ IENm|7t/LsM4XWU ]zƟd6>9%{KQ'c 0TJH#/%ϥ+Gn Eg:; * endstream endobj 111 0 obj << /Type /Page /Contents 112 0 R /Resources 110 0 R /MediaBox [0 0 612 792] /Parent 105 0 R >> endobj 110 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 115 0 obj << /Length 390 /Filter /FlateDecode >> stream xڕRn W+.dx ۦ&ݎImŤ_l< XHcM@Y" R)BҀxnrtW 4S:,. VnFݚOێ(9wXgVS0% eDZaRR0$ ~p{^x2 S*T"'a;tcX6u\ĺ4[tZ%anlDmRtk?&~)+Y9~)cH3i61ne1']BĺkIŢm]3/gVXwI\;-)]uV7KLFyMfqY!y =P"^A` *6W endstream endobj 114 0 obj << /Type /Page /Contents 115 0 R /Resources 113 0 R /MediaBox [0 0 612 792] /Parent 105 0 R >> endobj 113 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Length 1663 /Filter /FlateDecode >> stream xڵXYo6~Y(hMR[ ]m$mlp(J4Ea㛃CS“_x/.~|-l"4S:u"aIf&O.4[,,/n;?4usQ4[b 33YȌ+9N6R)i0_cKv6EhDDl=>g*p|=!3(bJy (}C-vMyR %X& ^]U&ч@5eX`bF;qyS.Ҫt)ڀS:c57f!/hC2 ë,%2ÐuC]iD>o6,B-G2XDlrw$\u~F5_ƤPS(t/u4U4~T2y^ӮCyYqS;3&ehJV۳yŷo 2o&iI bVdAp}حkwU;lGY)F::?8ANWFU黺C$hD<&шK>qaWSm_!*zzsjWi ñ>*2|^7)hj(Ɉqs1EW iKa@ѓj!-CU~T0&{ĒL3ӆ(kCˉaQ1>P4h:TLhW]SrB9Qp:\((o0}чbSx9*'{T>)8M܄ЎiF)o53 q.WVVtrtznDѵ#Xxڱ^;Sypь%'qp@cY>U 1+T93D&Oz| z7P!S8ʹV)>YDk2{*Is 7eGJ} 0oDm۔!k~U}h|jM&Q4Ŧ}/׶~i){i$)͜mf" hdjTnqWfIT#s&m},ʸMUmPM "Nx`,VXg|eA% U1rtʇ 69BxvdbP_=.}׭|O2S\a$ل%x|uWl98D:jE f\myC,2P]`F⎆/C#w$qrQً7CJFJEJGD*2z;,X@ TF2 QB!嬨O sBLO,RǨ7?F;@)&h$A Gx4Gs=8<#8@ O8x6'!2R5_Nf엧2NyAT9דt,?p%> endobj 117 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R /F31 43 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Length 826 /Filter /FlateDecode >> stream xڽUmo0_a&IH14!K4S sI`Pؽ=wKAf''AQ%1e 0 ʶ3u?[ Vz~qϯgg $1`)Ta-AF_"Y9Z.b!d6-XmV-_#dzK.b N؄RukF$YĒh桬|3JH]'wvgK!P?XMQW`HmoH "MS2n(Vf[xހM&7ڣ򼪫>c W҃s:~-vag!,*kMX#P&LÙPL'ƇdoxvI5TJ 1%BPW Đ.Qkr|_=BG-${ ({UeiEw!Nh Bx2e J dXk9$;tίG+Ok<bkb(pH7A y endstream endobj 121 0 obj << /Type /Page /Contents 122 0 R /Resources 120 0 R /MediaBox [0 0 612 792] /Parent 105 0 R >> endobj 116 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 4 123 0 R] /Length 1517 /Filter/FlateDecode /DecodeParms<> >> stream x 9&'wD6Z$h潪I2tc(((NYb6k}Qk]@j?fdF`q Lf.;6qv+s1-wѴG@iAi \' tE8!ZEQEQG))-)5 ף=;CN7";wR Qih,tA\(hDMD" q~&#A& "H~Ԅ Aɏ0$ QF$?jH GM D +.An]79MFGdw̓k1ìn=ii2sLϞt0zo$uKE% EQ $HQT. R KE% EQ $HQT\nimzEFl5D7fD *[T - 䆎RR@NMY.yjH^g7/ydxB$ȶ:2~%ADwI](*At)Je+ 򩿦Asɏ3AV\d 3#AYqyr TRJ1ߖմj[&L!o_ )#vvs0ZUg $L zoEI$HQT. R KE% EQ $HQԭ.;u v* [E@RAnAN<՛+XPY bHS,x2CBw7]fAdeAeb3Q4Sdf8D){ddRoqAgA"DԺK`}G?蔆G7@KiQt&T>>e:u y2 jT."MJ5" ̀ꏟD#k4|n>D\'t@`ae$mψ'>"҄6H5 M-K$4jX75qLl\%Z  A/R^6|8GA'^[ a3[qb+nZaA7P/X;i&he~ОhìAw:#R;dς$G~Zp(Mը­$Dw= YAj-*At)J%ADwI](*At)Je *KAiq5|hUZ6l2tqAe dWwiQ(J\g{=0'0x| Yi(%'nbEAqcy \ϣg1ʳtڥu#$ HGEhMzPs][D<k}{ur&d1꼔\-@1rXnME:[@6nٗq̒x'.wGO;Q5 JϏ=g(m.)((((-Rp endstream endobj 123 0 obj << /Length 22 /Filter /FlateDecode >> stream x?ÇO E  endstream endobj 120 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F17 5 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /XObject << /Im6 116 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 126 0 obj << /Length 2071 /Filter /FlateDecode >> stream xڭXߏ۸~߿BVb?$JC694(ZZYr%Pps^l"3|3Oxۛm"8+x!m"`ZD&7Ur]6W+}E̘ jѲ`YiUV1QRpsnȒZ3z\UAI{7e8˱uWͻ-M e~uJn&mqk3iLYAUJUC_@a׀IVdɍ6D#⡁#m+l':P6uEk$VUxRC,Ri,rpsɬ(qH- Lf:8Ʊ^0]bt2!>G'\ӑX >8 ,mC` X+'`-SVU W~&]HA[Cd-+9P"kPv=͏z8sZ_?&\ 3 PIDn $$˥L6;TC!l/'$IL<LRRѹ^X~A[B\G)wӳAV!wG ,ӿmyl`H& 58s91#*v l.?%eu8\- ٗU}$dҮE(9xoNQC:{ N,If\PgQ%fL,YY3LNDu@0׹qW >H$̈&va@G7гq .YE6bVz?E0Ὧ_ݱ14H)N; -T0ka1BƂg!s7;ג+<7)s 8R78r+)]l8+0pswN $9:B5 m&ZeZ3c%a<Ȯ_{~AU%r")kW3x @hHh874wݱH6EbИ< O RZu{8gvE]Y[=`&uƤT}lJ0^I'0c_[z=|eԩru {$bbILNX+ Ky*dZ\u,LA! ˏ̌~s! ,G7L_ KИq}%?lBBm> endobj 124 0 obj << /Font << /F8 9 0 R /F36 29 0 R /F30 18 0 R /F17 5 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 130 0 obj << /Length 319 /Filter /FlateDecode >> stream xڍRn0aK#-T9ꥪ[ AJ>cDػE:r.lec"hV ܠ\+p떼Oninq˦9".7v.7W ڿR./48I?HaJ&|tIK:Kٷ@E6öH fBa5cp~W Zi#1#dUc9s/R⇰ǺkiJ ~)DѠCL^GnXrd endstream endobj 129 0 obj << /Type /Page /Contents 130 0 R /Resources 128 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 128 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F31 43 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 134 0 obj << /Length 746 /Filter /FlateDecode >> stream xڥUn0+xHa'\EErH=h[[jeّdח)JA!F3o7c戠 tprE#$4AdCtU3߬Ϫq58U=>(RHabI/%HIJn^=)Pvb )Rl9xPl"i' MV;`!vMd<M&L|S_N5acyc,m_^i db90v3-i~Tv[!>+7"-.LgmːVG4%V3|  y8w-`%P[w ]/zet!&o 3`DgAT`/hg,]ݜbȇ*n4R'Цo 4PGsH9y endstream endobj 133 0 obj << /Type /Page /Contents 134 0 R /Resources 132 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 131 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 4 135 0 R] /Length 1368 /Filter/FlateDecode /DecodeParms<> >> stream x:.T-Ogt' &̸7$0   /7tJނXa_r}^Bኄ [ Ϸ } EwsYH8UƺP!Ӳ}%v j$Iv3k1|9|XSB)!>-ZԪA\ )rٲk }ܵ$>71qx!0˽]V   H ;_`] 1 ˏ+cw@HwH7 ׀ p3 Jo;  e B .]w4@nEn];}kՂkuU.o\ZS+PtT}]ix dTlBi|bMe^A X q<#x _4Wc= bolm3>t-gB~@@AթBȞ @yݐO=!̈Q ."S9Wi@dr޶^@@@#]@}*u@F =ϲwN%5 왓!GQ.|ol=Ci]o( &ScI'ob&yϾ4?Cx$gM-@B6 qf=Sf RLjJHUEbstBϒ@i"D%=.y|Z !6L>#IV "@.d@3[GwӇ|=|x|kT~S! @DD󚽀Njm[ @@@@Ȯ!#T  vFݐuLJ > }L:i2v͐ #y H{+\,o+ z䧏Ttd8Rz)\Z֯#YVgϥtᯱZ|h 뤳g#AܱH>\.mEƈxR2;F9e5 Sث> ij\7>6ˋMq?xy MI=,AJ4SCAAAAd++t endstream endobj 135 0 obj << /Length 22 /Filter /FlateDecode >> stream x? ^C9 endstream endobj 132 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im7 131 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 138 0 obj << /Length 1645 /Filter /FlateDecode >> stream xڽXn6}WA k,ͻ( 4M/hQ[.XI9vbqyrΜ9&&?}yrpZȄQӜ%'g 3,ъLrLޤV`?WЏޝ VL%掕7wTaaY/Ҿl'vc}_.λ[}- UX6W$t[waA?]͟wYuѭ <#4ߙxY'Ӣz2N?zͲ1+n5'h[M{즏Gn"FQ_Tis ]Ce=ci7FQ/,7gx2A'Ta]dbM?7U~n꾨^b68gEQp0aEk.We~m1p5b S8*#zmm\4\"ghw>?ל!{ڜ~L hmP|Dh>ᛘK،82،?R'݉Wb5tij%H Sֶ\)G;7 EG9: (%8cޔ#yQUv,o63wѮ6vywϠSbU6j$DK=AyQrsD򈧆H3C!o񲼶UGfs ԊH'#xM<]Uõz`N͙c+3#z;#LK$aQA EL jӆpqA-'qqJAX7niLӌps9q[ GtGιwݿ.䜳mq24 '@0kS ftإOR8=\h"re'p4 G/fG߷馷} Pt$cё4hu#0epЄhp0f \g 5nS,;X(xhOJYSU ?֫Nmo)5RUu?@{K_9xr>0i trqqM0e#$W~E"H䯃?0nȔ+9ro  @C_eO-tOgC9^M Ēb]qZgvƦbeMTcWZ,kYc¾媤0EIF4   LbP8[Z^GT(XU&\LDV9CݽZnIy#f2}eϊMw87X,'PwY,2pa >A١[m)ʧbbHoK%JS01i׸&G^PPdXX[-N\j%;-uGWal 6bWS> endobj 136 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 142 0 obj << /Length 882 /Filter /FlateDecode >> stream xڝV[o6~CI@*Q6Ma(o]0ck%WGr,Gɐ!@xxx\ItX-oX0ILy W$u*FE:ND7,kߗ \)A<'Z|w_(5 endstream endobj 141 0 obj << /Type /Page /Contents 142 0 R /Resources 140 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 139 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 143 0 R] /Length 3661 /Filter/FlateDecode /DecodeParms<> >> stream xK(òV7|L_}M_k&f4WGG_HH`Q-n*>%#"E)RH"EKm줬 ocJ.߾/H+ <6f[֢VհF$^iBW hAmCDnY؈,³K)DdV"E)RȫR]ۊIZ o%)$d˺ϖWmsu/Ou6is@ukH;Ob kMf"<5U$ш}Ϻ4rwP\aZqɪ=rq3Dx7 إ]ҵDdFwFtjdn;]˨- a ~l7% i o219 #bk@p8."vl@ TAk"8 ,҈7D 2#7<`IDA k$>-҂#J]aPPӔ$[ @Dz)W,VA U1r>Xs-%|BY x2jx@Pf-c$߮sڽ Ȗ6tLh=F꺾AK[j8 򚾎,iyUSx \# 8=DJkiL(C3u2Ȁ  N YaEi{Q\SjjDz< u·A k"`n Vaןrba[^iATMԋڷq@Lf (ejWw"A y  r¼Ǩ`"i52VLZM^:pA Iuo6) ww.- `JO䤀n6;֭Qix?9`(p{BLvMPxA#' )A0/ т 20É=A )ݸ \+6|4D *+ٮ Jpa|lL xY׃K$ @NS b?1=m{mR!|m= = snM.QRDJziI A-O;l,L|h@ 6? bl*<#^#w_lun 4G#MTyB>{j7@4[ uAKgE9 "=0| }fyPZ,y b$A/OX^Dw4Ha*j@ {e m=k~)ܱ&8Zi'g k ,hB:9a˚D?5tA1v7}hk?t"oA {!@qH\AݛAeقAJv1 L4{JV 9hMr @0 D-]EAY.=k}gAmqi3zHh ҽ0/8/B׋:RO{5_Dmq(laaF,j3JfDH{5Y`tV:،@%aiH$7sV, 墲_l%,~=-a@^ ~?~A^1g_ qSv7BH 4$ adN| kn^AŖacAd)L6x& #7k A=fx-nm qOԌ.yKI 閖2a񊃨' û90뀌e[^G^eEY2H5"n:Hغ3|\y+/d Fb@<4^0.:Z/ "(j$ҽ@dPI S[;g٩y+ol;^AHDބ7H5o" f] `JX[Br-}hAHmZ( Dl ׽Z &c-/*sF IGq.ȳGqLkS3 D>'dZwoqq UY )3q~3wo`f-,#<H}虣1 91[DAE,#xAN]fo 0tA\@ԍ2 7dE%H>!sb8bz#ճJҌ/'Bmpļ(o2iE\Nͅ21Υ46B Mxc5qvҋYQvG+'ю_ӁH׈6`_;[)f]'uŇp@H//4)?[/xj jr-n/5>N,Dsh_ljvŁm-S"W )TRVH nV쨔SEf rmB(s mk쒘\elyMըŒ+y=|r >"LMc HY+; Adm`c%ާD;Y>{t,ʦ nD2C&KDyQRz0Z[d / (o 26 /˼BK) P[/ dAhU@ Z ѳ1fl tFO$ՀŲ+(-<;lyQċb([<[ H V>cz) 36GAt}|‹AI4+tnC]At+>LX]v QT*VDžDQwmi^AxjI ݭd-qA\M15A*QVi:-3/>co HSɨFXR<; :]`i_)RH"E)RH"E> endstream endobj 143 0 obj << /Length 33 /Filter /FlateDecode >> stream x{!É; ?2h*  endstream endobj 140 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im8 139 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 146 0 obj << /Length 1397 /Filter /FlateDecode >> stream xڽWmo6_,12@-Æ Ð|kLh[,yܴw'R0AehPR4 6 ~Q7_(`$4a:`qLD$%RY>fclXB7lqs3d(iܚn_&̭VHS:UUTu3gޚ-, Ww8qD"M)wM]PO7Ҧγ"/yoMRPd7^{EQщ$=?˧5CMr)o:$1_>Pɾۑ$`cBz|VA~MQ:A}ܗ|e׫Ac$#Qɔ*>ڪ@MF(:pv =Wم J-qpt =E%-3/a|$Տs0GFhfCaZ9{I'6ߵ.ЙGhI4ym2K1Ρl1bH(⻹݃]^i yfͅeCP0^cݭ[?ujyjgh 7P z$?n_vuU4CE!q&ð6+=wϪLmڎ iZwRe? (_*zu3dWp=EֲDw,9:FXOp/+l!ruZxx6UDtf?tF)bAt,G M\@ endstream endobj 145 0 obj << /Type /Page /Contents 146 0 R /Resources 144 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 144 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 149 0 obj << /Length 1524 /Filter /FlateDecode >> stream xڥWKo6WP 4sI!q.v7K6@r*MphR]bS̓"OD˅O7y"wdMZX#yjdInتv=,iU#bц]$#ux{u_훫"oiw|v^Jōvd٦jAbbux\iVmi/ZsN9$(.i#%f8NZԼLp#QY59*;SXRwγLMsS$ bTCŇD<˳Ħ+V$؄pr13aU'\NY e%M BlynƷ݁(o/ֈ{\z!Y?x״fE rĩ"Hiư&'aD /YxH |{|KFZ2ʪJ f)M}U{R]PKkdeњ,3d4D|n|E92H˾/i.xevT$(=gffWid@C`--ϋ0JYKYZo֞@N;O!hb?/r f-Mjc$a}mCp,(Q,uyFΡT#$GgF# FNkCO4 YE}%lʸ (e$x5faT8lYN΂+0#; rPt@Pj:@9ʪc&^?; gHlXVkLyChx+zCSFC]f6R(ŴMYc8|-\IuB_Q᳣r)} rW;t'ЋAŋay-|EX2#'E#Ua3Kk=L3DSaS$Gp&5CP\~,+"\^a[^]0xq&6Ha 0@żŜ\;ݺ gidݻhT.ҢYj'ŕnrHL}]v<3*3j-߰beAV 0~p7.$׋vcQbTES ]2$Pۿ}k_Ne'1Y)A9;M&dP̞gMxxE{(/}c /x}hᬈZiVH'㼇o ۆx|_Z HVg^FE:qo:xfޯ|HL Lel:CGL  endstream endobj 148 0 obj << /Type /Page /Contents 149 0 R /Resources 147 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 147 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F29 14 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 154 0 obj << /Length 967 /Filter /FlateDecode >> stream xڝVK6Wd&E"$MQm[w]-$!-C|,{Xq|\mʈlq-]f4Bl˂p8߭}7\oB򼭷-B(NK#HA~\-YɃU48Vԍp y7$^RećL 3^nsݑq{Qa$n "?Ņnt~jRwUջnȱ£`&5uZ\WLS%;-a1W4qUʎWU<&`$)d u%j~ے"PrWNCMRx>¢ޮ½/jTq+ȤˢwwAatb12>=K>RfSp3;ʎ9 '=H` H4=&届\ATT3QԚrnSXi<'ȟ4<>ec6Rw?h0Hl"l;< dXdp޶hS{3WS|$t-gv 0dC,)fre)t sh,~wBպG]{,~Q> BT8>M0EPN3 p!hY&. Wl=>Z86&2* *!o>m]{$NCI i'iFH-Wi|lvΡG-(Xf޵OSԢ}廹?CW? GaI6/hf7qQ9n_o׾_7ONt G|8n B( ¡(Qpd '$x $bR;q=%$"$AI3KTHFą\Hk 8tjPRRᥞ\o_u endstream endobj 153 0 obj << /Type /Page /Contents 154 0 R /Resources 152 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 151 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 6 155 0 R] /Length 5643 /Filter/FlateDecode /DecodeParms<> >> stream xM{: 3u幽Np&3C'\JR1N:GFH/UȒ%K,Ydɒ%K,Yd2AY.+/=IYw|XƤԿelWXZE=u`Mb.?H{ vau)f|`- ^+f 0Ak`Mgz1/mR!*Dsk[,= J!%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ ޒ|䎒/Rr^tO"&gL>n6lM'{W%Lk%q4\[z<O 5Uχet#^]\Z,' ȓ|<,6X *X#TYF)jdw3%yk ',(ʉ``=<ğʀ2n] :V$YO~nh "VAmafpR7j_Xr Ӄ`=FjDXZ1@bJc횙r 86`#!GZ"iL`.quˊx`٘OcWU`x6O㦹ΛKY*’+˘!P^Ϛ$w1/{~]:QF=i4cϺ!,=<قϨlH(,e>OdI\,=|j \#@XL. K6ݬ'W6Co=3l`"zJd}Շ`jxLүsU=?ճa,}Ғ-fąŢqXPf8jhV6 d墮"4}kP6uZom13$,2õJxCmEl§zCK@X,&bA-/  U5Kek Ćo?L l| ,M}C ~6^yLA)/CN*//T-Vz;uVtbp X<5oZV.aTʿuqX8k~@Շj݀F[kbP% (8,2ǁikɎ# ^)X QHfr!`|DDqc`Yw_VKe>+?/T2H.5O^fdGɰa:!1;nKOKMXMN8`;²V{,lJ\tU\,Lnsf^ >,V̰KM3]4ZhE@2HA,lH$>VR.90,a`ްh4,@'],OÊya[a2, lowr<`׋‚!CW-@ۥ(hlKcVK"26#wv4Gy>YgJvj1L !T+ZF- ;kF;Fe>//iyVviY"EkL)c_ravX՟{y6H^erg|EaA[p,~ޜb񒆫aaˊ&^hmWN|Ƒ2`gjo>ߡ(%NoN| Ca,~ܷ/Xw+;tQjCUX٤̀tjn1w2WPAuWD kKfقdxI\& &e34^}oPKtJÚXb, V ' A{r!)̇E:U +hR0C7 3È:᫺/zٌ!,hekr/Ig"34Cgq:RLӝ2  jEY,/ųsJkLCaNiWLtˍ ͂> 34 mVyi}" K^ to5sX+LJZ ?zCf ?ay ͂Z۷˄j$.9MoX遚yg]P Jioꊻh>UQ7qn~:XVz ``ݠjl T _`Zljr- :hVcSW/XZjV0˄P4 PKJxJ쾹,ZJRȮ+G]bf|jnK ƿ}KrΰDX6X{{ΞDz+hvU}f榮NJ KQֹ}gx.zòH8LŠqbÊmN;g5b[C_-qXpV}b~^k^AXxq}&_WU ! ,i;MLW_s`7VË;x`77ύ:Xa.old5&:&-֔ܐ(v |@}E[``U|ܐ U5,߬Ӱ\o9`쏹ZsZ fC~.ț9,?",?v#=;6FY;c"] "",[* @Xٚ`GFm ]``ͩ7   \eGTxX)N;X!-2,UF:PX}IGZḲ,ڨQ1X{&`e3lE~9ƿvt+y` a=[*^"gw XۈK97 ݲ/ w$^ X8NA/Y>V>`- : d)XoVpz=Va sA/q3X&a Sq;w[ !l(ƿUƱl ݱ'9f%pԖ-Y/6!cAV8 Z7ae'Qa"xB0gAցL:\,u{`>xڃ28a=(Ԫ;XVK$zpX&V&"; Ed/XVnVdp\OX`!&#&6$Xu,`fx6H*‚ qmֹbct彰 %"7=~r08[/ K/˟^_ ؃ɰ,[%gW;[#,Ik]=X\)yyh$엯#cI$|UX֡qʑiB'[Xܑ6i?.+ ,ID^We:ahXa^\K[po0, ck^Ӱİ߽ O ~VpvI7X`f_MX8X]a`-"{ezJc*d+| V0H6c.d,/L(,Jlɺ 53luH" >ȖX|+]") X`+7,v7/߰Ӄs`yVoXIaWaV䰱hd,S+bOa%6>` ;,2IН9(8',aE!,Nḡ`-`Xc*_O V3R &X¿a àה`]an ? SELPz vM :9Ӻ*U[wP[<)X};|I|riҙf Wȟj 5Tӂť3,/<gRAf`>k굊o2V h24,>gD)2NpWSATV jr2$a)RVß'aV 'bPM5v6R+RzW{5dHJaOӖ?]˨갲dɒ+ kRRz]3(U^Pf zK)ߒr+6. K'c. -6'YpObir]< ^m_0],]Dd3[~,ݻ̧cp9AWJ2+bR̐, q.]ĭ%X"MQ7e+,i7_T33XKij hլ?`Yj*\.eXb7z@4CVȜC<( Ęk5tۏ}ReuO^V,Ydɒ%Kw[YPDʰߚM Y:I ra,Q7JnQ"7w/ jE.-(,v/e Y^ۈk%^r7u)ci̒%K,Ydɒ%K,Ydɒ%K,Yd2# endstream endobj 155 0 obj << /Length 26 /Filter /FlateDecode >> stream x? ^O0x!a p endstream endobj 152 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im9 151 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 158 0 obj << /Length 981 /Filter /FlateDecode >> stream xڽV[o6~ϯPvHE e˶b 0A˴NtP=Ry=!ܕ$~! '/U;VDJJW%0$b)BlV&+c`k^g5v%e@>"tALg^)%WUYfteL . Ga4 ;SB\ۄmeɪkiwDnVhHfe 3~hڙu#/ﻃ$8QQ_Fe endstream endobj 157 0 obj << /Type /Page /Contents 158 0 R /Resources 156 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 156 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /ProcSet [ /PDF /Text ] >> endobj 161 0 obj << /Length 1310 /Filter /FlateDecode >> stream xڽW[o6~À@KXehⷦdٰCʱ\5H2$)\?ih넆7ɫ,b4g:b #IDb,ݫs!(HK(1$Ь't&X/%o*tS[.e͔g5ǰilWximݴ=w]նk qD3)H"hQ26%H㙊7kÎ48Hs"×O3"3H%n6d:8"RH*>NI[;hg[ny>ua\$Dr7#+N2,' C梓Sڶ6omeHƾEG2٠X{ʐ͇| T<{$00$RѠ,+gqA%wu &=KfnC L6[ܷ~@@}v/"%b*%*UbP㸈O4*]D!~Ɠ#AES]L4ŹDt;F<|Ո:xjl`;/U| z$2|兝 nLY\P4Wx]pF/PCWxXY1}W^TN-bX8F)}(. aQ˼`1U^6ˎavy,}FW;V5u}^fAڌA.'YF>EMv5wݜg|f8EOnkRXś4T?G\xv5]xXS/ua?ԝyv.lѾ~/ YU7M-( C{c[O 5;g tƿn}'OĖ(l%.U*p {Ly#MS-۾`7 C͢3]w ˓ç+:rLu- 1(zOhtxx2x@| uX[;2.rרJ߬*9a`άznX`($G1 f?DZ endstream endobj 160 0 obj << /Type /Page /Contents 161 0 R /Resources 159 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 159 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F32 42 0 R /F36 29 0 R /F30 18 0 R /F17 5 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 164 0 obj << /Length 1860 /Filter /FlateDecode >> stream xڵXYoF~CS@ٛdE@-b1PJZYK?ߙ%-ʔ}cœ'?.^H.Ykk&O.UٵdJەÁN}qq(. gfV͛jelQyl4$#/?BϿ_NO;9"gGa9p˳?pቀ,c,B%5O dȓ@NˬQ|>jIQ^xרL/yn^Z ="v *E~U*T"q_jXY4t/hbC.YD1p w~ =ڱã! fcaᡨSac|Ha6=YƗIQR3*t/ (׽ ?&!X!{.,ʭw]}"kmz&!2,7 9f%OG\8lp߸>%',K~9<(2&uZV'K UCFWbd" i֯_e! :}/<25hZ.z4x%w ^=^ p484JHP\ۧCP"%u P@`e6Ϻ-ۗIP&"nV%;^0}9aLe&\pܙ^*uwY endstream endobj 163 0 obj << /Type /Page /Contents 164 0 R /Resources 162 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 162 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 168 0 obj << /Length 789 /Filter /FlateDecode >> stream xڕUKo@Ww $@m-;쫉CBU:3{PE I(jsUd1dC4255U0\_LWZFp<"h4q>*ؘ`m]t\u\xwLx])`J9y c 襪k/^?6REfz>J K NX;ڛfda=|00ktlr9FI,Ms. d\OIj\;CG&ka2MX"Ho;eB@1"Y'OmNȱY(<&8n'_/bG,"g;hGu6f _ö !x68^\w}1j׃[1HXqeF̓}{${ה/߱#cЪA,!9g'9۱b*> endobj 165 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 5 169 0 R] /Length 2171 /Filter/FlateDecode /DecodeParms<> >> stream xYF` 8@~'DWq-ВgVz2ͨՈnǟZ54u\\\\\\\\\\\j }[Uj6n?i*N峿ێzL}? XCԺzJA2Ga 4Wrt_H7rh@k!چ3D Ǩ;V(}BG)ÕZdAyLgtqe+@a 5K?*Cx1%< 8S2S Ul юHZLHKDd̆\Z|u%A.XuDȯwfEVq_Yr!,rU.f6܉!#" ʻI~ƮnEZ bDDeTW˻v@֒梆O*\$D-5h(!vGp$]rzivn4߉ vFx$-tFRhH!yQ ׊xI|pF\ > C$|>Yc֯O$6`HH$=@k6V`$ Dv[rɗ\tRH ϥ}~A8(2ֲO>Pq2DtTh-@Hvvۼe $_ۼe OD@C!d9 C) sRB( t0! aqk :5p.eN炈r:d~m&z"e!2?R^Agt%Ⱥ ?h3@bC>{SPZVIai!rHZXP{5 3P8%B}{5 36!Am{ hAHc^AbP:f :D񐨶7!=a$1T55TD@ N+ ta@6 )*C5!X-UBQBFq00! !Ǽ֩ "= .__vu*u.~ ZBzso;ک#G{6VΐB.٬nVC[ԛތZŒTNn{ :]T D"VY7bFl\"QDm$ws@a95$it띐Q'֝]uo֛灺Kl;#~oa lZ܎r endstream endobj 169 0 obj << /Length 23 /Filter /FlateDecode >> stream x? ^>|J endstream endobj 166 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im10 165 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 172 0 obj << /Length 1264 /Filter /FlateDecode >> stream xڽV]o6}ЊDfX[(a^bS,V!KD~.EJRH^bSs%v~Y`ff<")HF ) *d.]#xiJS*aDWDP/7e>,/VֿF\ IdWrז_UYnNyiSmʦ3OF$;!&o띅"xqX&m\^,")!ePPIMݙ1M{edrJ(@'qsDYo(v^o_:< "S_>_Qj Bj"(r8=g{w8޴:7p+=MS'd"K x3UqcZl,,t{}vy^67&|L寔.%H? oLgSY@|h(ٿYb^ R1;4n+i*b ex|٭ ~UY۱Uxs4y;tYl:( \eNVڗbY<;C۔_?0^ID&aD\a;NWIv"eO$,S"H{_*`Jt?[ADy=岧< 4&Ek"9@ î.'H2ҬJA ".mqVG)+b&#j-R,{fV1U&Ɵu Vbx:'mBweG^u(㒡K*^CFU&~zv.[;_Vp* lî¦[N{ȷ.[`$J4 L`K|w:]Px% )9Q{aL[.5;bB'kr8SrYo=/vbGo%Bg"xILj&/S9mj\9͖ znӏzP֖Z;oe7g'? kthB9,>|Qo=D7R*c{!Ͻ d1+elw:* !O{m9Ʀ * S{/Ff'9{Wڎ)i @>!G96NA#9`鞽oN4AkZIm;tZ{a 'n`q)8Oz+96Pgg>6$K`l b ?Ww endstream endobj 171 0 obj << /Type /Page /Contents 172 0 R /Resources 170 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 170 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 177 0 obj << /Length 1250 /Filter /FlateDecode >> stream xڝWKo6We fIQ*Ϣ(Ea-16YrEIZwl+h/P>P?[|3%l0caLL̒0U15`ldɦ,j F8*lJā{uΉ$ciDPb;yڗd$4sO|Fzg]J(uny%!fp;ib9>B˪(տDP&oue=9/\1đOj>K8ӜQQJ>Lٹ0vv*^gg@j0dn F(SW8ukA ')'N? 'WbL/ͤP ]q$NDt+]#6Zﻠ] >FC7L&2}jN&= T@jg?glCGX7Cfƃڶط=[ϖ7[w ROHΘۈR)ʽ.eQPb̙i'NXVy3a+㋃LbElh唫Wb/d~x/=$9~t:Emq;M\1| s$ sU@ĖQ8ba5*x<3az*#l{:RfDW*b#?i endstream endobj 176 0 obj << /Type /Page /Contents 177 0 R /Resources 175 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 175 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F36 29 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 180 0 obj << /Length 765 /Filter /FlateDecode >> stream xڽUM0WDڸ $X(ZN if&K_8Nd=Jk͛ #aӌcgFDN9$$~a떈G\ȇzO=Ghj6_&,. HMcjM˲86y !EI/!7Am62;ߦMX}+R;pNDCJ)"zXߙbWo+Íu;_"4( m#b]CnϠ+5Xj]KaTg[(uZeyqp&((˸M-'MX8Y! -fz=Dy5yks*ۭm,)L4.D8HO~WɦR |vcƹݨ`x}Lsqí` L~ 3=jG$A=a5k/IyTdŶJ($|8713͚H]i6`*B N!QcAiSyek=\gNYVYcS>*&*}Z"2Vw7`̧8 {"5Ts:];|wK1 ?E* _h |ZohÓj=(ԔHa,i(\f* endstream endobj 179 0 obj << /Type /Page /Contents 180 0 R /Resources 178 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 174 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 400 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 5 181 0 R] /Length 3339 /Filter/FlateDecode /DecodeParms<> >> stream xY1zw Cw#7PV)&?.X 1Uy_LV;'Fuat;v,-I+"ZkW597%NF8M~Tl[$I2cܷJ]>ҥ\jJ_L.Ǘv7EwOUEgbEg~^w6G_ < ѱ[ӅjY^էY}נk[խSjYN#0s;RHe7*h,.v nZ;h~֯C缼ոӞFOscq=utQTA ðv n5sEόMт|׋[[#;*tSC7Fo8z odaŭfA\X= {eoNCI誻$\}N7rKttӉ=5 ZWѯ|7ӹQ _,Zj-n1t褑[ӒZi?Sd]×5rsNbu褑[-I#J9贑[7 ui|7Fo=4z3[!FoftZ/~6UQ5zѫqӦ%kcKFK-k a#NtQm:ѵշ^7dZta`F.nQWsܺD&/yv a>F/u԰- C2* }ލrF^>yN>GWSpakn) JƼ|n~>eɉ++-sP?Гv䴽/LF *tHi幑b tStp<dzZ*{aR#EmxƼ SBGDjSNIl'W]m1=jyZ{9 =AcºkC6~c>1D@S,of}=eVmlM8ɕУ^m*21j)؋oCŮDpLb䲍 \=#; Wp#>˽c'nL@r1Đ^hVԋ>ԇx&Kt}W]Wm%\rxJ.nn"Y0У^amz'5_xQO@o" ^7k`KУ? ?NҜxfo9pꌬ'IˈAe`/SLO'xJmYOl8&05^[}lGjI AjA$'|K6dH5h%LJE@+t='pB3*&oУ&^uyH/G~ uq[c>' ñ,z/ Gӛ;(-c#= ɂ-g5؁E)W A$ܪLk쵱3A$LFO\y OM~%z]}ɝ|*yZ2sA$hϼHo' '(U @_zsf/v~kMD,#>&EӖ,GKD#|n`?+Hxm-ΝDS|n)K _FEg'f^.t[!MD|svУR "?w JV:# j݅ O%m7dKaF'ޗs+VFziF?V *>N@6TO͕gtJ3h<5r+g 4IuDSVUjV |SF',,i}t2NY- {2C&zFG߿%OF[ v|nnR 6qb~xVktpZ,,蔛=>dSnbh-C c@En~@ձN6ExsX Yul%1e"}nǀ!×nZ, QBiQI?E׺>z>vйP3/ A$ZK][!Z@_mR迄 4,n=oBL'$T=(+F7 R?ՏޡR?#WguA}X3W7y]AG:V,Gm=z[7;5*G_ |sj悑hjF7w:= CO$(WYrh*iħJc='h6 cl$`0Ah? k"${ ` Q#_2IW;ya':> bj+u.|O9'ZCV?>r:C ) endstream endobj 181 0 obj << /Length 25 /Filter /FlateDecode >> stream xZ Dm-C/cT endstream endobj 178 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F17 5 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /XObject << /Im11 174 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 184 0 obj << /Length 973 /Filter /FlateDecode >> stream xڥVK6WVXsŧȽ5mS4hk(ע-JT6;|hc ^LRofяLSQuT9Dxw21a'I4'U3ŊIG9$Ɣ0RaʋpFg_OګᄼFzZ;y`0 s>~jSw?4yJwMyk 5CJg.>ɗϜ֖Qh, j/`=tbό2TS<8w" ;ۖu]_>n}\uIS׿R,G@M~\ ~; }nlʨ!TSxw'1Rb KWU[eEݛqI&b|Dk\gNMӟ.fBPFa endstream endobj 183 0 obj << /Type /Page /Contents 184 0 R /Resources 182 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 182 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 188 0 obj << /Length 784 /Filter /FlateDecode >> stream xڍTYO@~ϯC+^ By+Z%Xr`;?͵3[yػ`w^,&$G[JaV,rfϡYnUt^P^ #̋:. rE4a/P(J.t?2!ɿ-7iZL`*s cRHyiQl(96*քzz~=yр,QT(UF%bmFBĸ{jxz&<Ƈ[sA-t!Xuʚ+ 2=4:y~zi[.R߷|t;y6'?6|1vh-b+: TewK^jb@W|[oQL]ѕ7g.U /^-Ժn0atMao,9A_/JU9X U])xmi‚M3.aG?F endstream endobj 187 0 obj << /Type /Page /Contents 188 0 R /Resources 186 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 185 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 9 189 0 R] /Length 2825 /Filter/FlateDecode /DecodeParms<> >> stream xIr8E8tz]}N]>7ʷmI 0I@.|,B,Ju]SSSSSSSSSSSL=bJg+{Juf[!"( 3(gvqZ7phg",N_yQBuەr T\*F!ֺ튀PJOD,Sқ 2 |t B– }bAQ5fg1Q3+ FE^oSSSSSSSS_3 I 25@jS} |=\VXwψt2[ a9o ^.V#C9˃t;St2Je7/JC}~B婚:]Pj|峱{{LJ~wدd6]ׯNY-$'Ho^C=mnOAV맭+2Q~*^[V902!19dcVna٧+Nd*Hߙp~K᠏zS|k8+ ´JŲx V\~Y>&Ovze7f@xx}@?sedkx2?>" _$;-9 $ k? % 2p|}z dpqx@>Qd9APgaT~LO0AA,xLGA| kH-\x Wt%h `A8@+.,!a?8A޿Q,A r@`1…6$@0…1$90,A`X3$(9,i b d!d $jHc% QC Ɛl nIQ@E{7 AgsL,{*yY[6 C| 3C&K Ԭ r81X">]͞x>Mzu>œy5BՆALϕ@YbS9Bݓ8"q C KC%*Z#K}QD&l+vI8pAUlɩq}Ym{kÐm)@8@\lӐr dA6d;Y1[.ǐ-ElgK6x ))R%& 9?Y@w5pCIF!E.I@[(jHQ@W 2'HFp$F2 ) )lHqpɏ`CʃIF!@^K$N[ ɪK2 7ypC*7p,nH,nHE YO Z7$YpC*YL^c!K~L0:AkLHV Sɏ bJ~L0J](c!H1ZAD^cBa$ABk!BIq~u! /O9_I rr%XR)净Hl r*-v! /ALR,fq-ߵx{!@d:$@flm1dsZhd9l!T}E:]KW% Aյ[_,9U#iZad<dY pK@箮==`^ѲkkiC ̒Zq@Uc[R@`❶<,H  bIgxg^ HnD8*V$XqK}&-XqK*p* Vv $jIE G\ @A`,<h*VCz,`HB1sMT,I ՗-$̼AK FzX !Y &zReJNN HR ˙ $:iz!@|dZup!@82鬌MTD|% ~q'1/;Ⱥu頢!_c3TXڶVmI ΏdSSSSSSS~=VZd ~" k6Sj$ϰ6ӓZK=l I\@ JQGN0bb-yv e*Z^JgX Sja!JL~.9Ȕx~X'lGo)-yU< QF) Z\II@aN_bojjjjjjjjK?4Q endstream endobj 189 0 obj << /Length 38 /Filter /FlateDecode >> stream x10 0cS~$8X61 endstream endobj 186 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im12 185 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 192 0 obj << /Length 1488 /Filter /FlateDecode >> stream xڽW[D~_V8R3;w,R -*DmUx6qvv[3{'@d~;g&8ZE8%HcMuD$Qy'ؾkL3"t:T?f!ؖwL}Gc N냆+𰬊nFe].L_)o1"iC161#q޿'PBǁZ#j~n7ntvϋy1`?}ٮVߊ_fO!C_V >AZ ?/_$6եyoiݲ++ݏzR &jO'qE,["i4󵋆D+:ROq \!^|zԼemd6on+Ei&bXZ-ȨB)0G~xc ¥Ŭ|q `2c:ALGlv/r фr$=3\'!K]u4}G30" ^$ `ڋ!ˆj[W;`ozۘvJcM7Eviwum~0$4tIWOMۭM0?ш)y@@ q%2 uGS4h:OM)ghp~ uH]k!?{1B6@Q0Fሣj+2 $U9 Us;j5}> M$yf<q;v&; D3 gUk'E=~0uK8kn:n3fbJɾTӋU B/HL úTԞZ̙k-3pgBҢqʭ t-MlQSZT3^|I(_m~$z1B*}B[S/M &vh1я])?k\ThpC4 }JeUۅߚYq : , J:֬;G* |Pw 7A=}FZKD$>1(F 0N[3@k endstream endobj 191 0 obj << /Type /Page /Contents 192 0 R /Resources 190 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 190 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 708 /Filter /FlateDecode >> stream xڕTn W+2q}RW:&Tb33(<#8ut~mo  `D$RD ]4ueo׷ ?AsDTF解Ψmsݚ_8OQٖ>ZWEǵٖq&ݱ% Ѥw-]F`Ul-aH" !ިP&S|AWSgӖ+r\WQuFB&b>HVBЇ?`|) *:/-86o'9lzTW ,r=lH"[Dhհe=?#& P6wT \F 0 tL@$:3?"-CFwAMlLu| 1="})բEa aLjE7\.P z endstream endobj 194 0 obj << /Type /Page /Contents 195 0 R /Resources 193 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 193 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F34 22 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 200 0 obj << /Length 950 /Filter /FlateDecode >> stream xڝUmo6_!,WQРhӦ-ambl!Jr\bЇ;qpt^Y-^'2"1hu*,(QG2;&,I o./H۪I>gTaap 9N_syD0*pA1ɑY$w' 4 Ro׍>Oé'S|,"Z@sf`RMer.NƮ\}.cIeH]Л6zlejȼLlW3UL!\NL`L|@-g endstream endobj 199 0 obj << /Type /Page /Contents 200 0 R /Resources 198 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 197 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 4 201 0 R] /Length 1246 /Filter/FlateDecode /DecodeParms<> >> stream x n EA+Q*T;(JNL!B!7P@)S}8]Od}))sPJ>xؒZEؼ̒| hLRv+WqEE*"橏z1d,NwRsB!d3efvƙVL4zOur3n2"ӄ#aۚ $bk(V{_#1"Dn]9l[DOKko1#\N$A4(EРA"hP A4(EuHFl׈U)mۘESӊlzJQm+0>b5kD蹚]LI:jeX=.2&s !taߨY_< 4>A4(EРEK로HK1yC^ X#{yQ{ #QDѵEXS[1)D2zXխi @OuQ>Á A4(EРA"hP"q]RN$2P^ E{~(\ZymY-1iF؞? bнI%F"V5RKJ534mM, G6BP A4(EРA"hP A4<ʕV9.RrKHӾmzG*n0ߖȎȎBA4Hݶ ׈Y\i-)C"V-KG+#G]o88EA"hP A4(EРA"hP @$@Y^i̼3{F׽nVHxX[dG|$ H$"G|@@˒G]> stream x?ÇO E  endstream endobj 198 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F36 29 0 R /F34 22 0 R >> /XObject << /Im13 197 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 204 0 obj << /Length 1396 /Filter /FlateDecode >> stream xڽXmo6_,Wʰbm0tC-Ţmvr(RE`${kw;`xd!(Z`NeSpy5WoNrӋPKY"VРW? OA`-Tmwq]{?RRʇ[»,W*:UwۺU}ISD xOhRkuga1J%J(5JF}Λm`@n0 _B4%T t9L'c;]Bj(gYHW[7.*G$QqiX>mIKH F+DEH *Knn wwnԙ3أў1R߮*jUokmbckH [/~a"@#&K1pPkϪ29F32@4 LpZ#v{: ]߈ J%D ŴqT*'E]O T(;=a2C9>E#K0Oݐ>EX >XX(ѭ*(VzxJbok~2ȚQ&' ,:A2FTM;TfK:7?1&Pj2QCl%JRg;ejmjo:xm @SXc> endobj 202 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 529 /Filter /FlateDecode >> stream xڽT_k0ϧ 2TdIݱ>.c{Ym݃ˎSa+}gI q(2sw;1yNt2[qFpGF*Bsibf'g< ~_E< ,Xwӭ: BxDj0ƿoT~Lìz]ϘuY8ȡoE;kZLv[MSglpD$TJX& "XoՓgK&  Yvw.[;SeКL3}>2?ܣ.l :!ћP}>PWF83^Ե?>8aיzģn1e0 7P=SyAp*ѿ gW66N͙^}C1ug_,zO? CP(P erV8[d SPξlD;d嵏x#ETvLH0ߦt;9*u;Q{O=oZ?^ a;ך-T0HJ(:ՠ` endstream endobj 207 0 obj << /Type /Page /Contents 208 0 R /Resources 206 0 R /MediaBox [0 0 612 792] /Parent 196 0 R /Group 87 0 R >> endobj 205 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 209 0 R /Length 5104 /Filter /FlateDecode >> stream xa' 6Mpǀ jY,Ģ~0.e IɣB!B!B!B!B!B!B!B!Bط*=JRRl7[~<_;?ݫTx[qq[s,_uCg"FRBwwuN3CQ$o帥^oge?ru~nɔݰ+uzʎˋԋUQwKJ*{>-{UtǝUۥW+g߷v]=իjO{zYӽz/l@x㿏xU1ի^GAֽhqbո΋ji F7O?ץ*躋^zZƃoB!B!B\|R-BZ>`mP4+%j MQ-^TKHX.enK=7%ĈU7_.MQ-!=0owVuMk>j iZWW^[E,ՃXdݿA^e޷![ֹ&TJ|.>~G^EN2TWxUiSE:Q[j8MoTWxW$^j  `[~ V۬Vjx+UrWEkFpխxUﱆTUlicnxXWغZ'^E.vRYu)ʜ A=j[WkJ7/:jf+{exWxuUW+sjQS^e;+Vpv^)=:Wu##e\/ѯgtbs;i xW\ѴWnk) ^/Z^jxZʫR^mWV-dUlxUym*ņ^U7(sY^ wtM_>?(g+E'#*aW!RWΩ޿JVƸՆ3Y9e^ T{{(Ε+,MT`h17 fz T|{0gUWηקENW\WWʜUSͷ3#d蒨W>g۶>鯑+jC^\1lxWzykVmxW 5y=y^Y.׋nZ9i#^5|+5Um>,«Y^}J.^Y9 ;~,eW- j «""UjA9Gj:U,+ՠ"@ fy4(P`jItRkgWr8nvՠ @㼢W_ҿ"xWK_ 8?Hj9i^W[m/~oǫuz5m# xW/ǃm*HV/ܢ'-^I.,`q4WxEv𪴯"9~*uG;9xe?_mRmWѡ{%]*ZG0gs+Zū+:}+8Ѯ*])sk?@N,]W!7n|x\ݏ>v @֍,ʕzJRG/e*9DuUv.=N;Wd[Hd|dTǒl~."xei vRc&1uxe&vCQlw~sYS#46Wd)㸬3^]sD{zU1g\f]S$ؿ,^ݘvW~5 ǃxExe!kڿz P0 J F̷S-^W%jj njy>-0+Z)^i9VK=U{xE8kOV˻Wջlҷ-U6pzjyxA^Z+g𩶋Wٯc# ^*ڬ<_tDxWxDZ«ͽ } hT;+Wѭ5~ Hȫ,PF@Wr+i^lSBPEhJ- Jqk%?N zGWTxձM-hm ^}*U)ZƱ\+gKxWăWqxu#TQ[hu<8«hT?"xu3c.6W'ᶅR󃣽R%N%xWxW^Yy]*eޞv«{'Z[ W7^+Z"xxWxWxucy$+Z"x\pW]LNX++Wޫdw vK:Q7~,dz5e,WW-da+iE:%z~,sY7~WRuPj.rO>r^M>!zeYsYxEjұ^Ve~~^߮Er=3߾W?*վ|\/Ro08rӊ%xiMO^ 3Y>۟啼;j0Ww6(P7r^e1^Fw8^Yjzu/Wz͠N Վ*dΡEjU^/m;?l%SwTIQm^^ nޖ^1;FhjX)dEG.vREJ ru䮢CZ'T[Ѩ]1D>ςHRU1nū^UUp,E0ݫ~^y{ZWWs+r3Zh<ڪ+ƃxEzJoW淋3sV'ʭWfhxUњmj{yxWArvπWx%gvW:j, @}bYxܫ?>;-T;«3SW__I ZW)d}V>Z>Nx7fۂl?^qEn_YڬuzJAI* gJmWzu:"㯊bccʏWd_I1Y7Wc^^җط<+"zU}~tū^+ƃxE]{}~[]OMfƙ|+WG쩺-s)^9?J R?{fb>WշEvJR 9Tݫ/VxWjGmPnZ« ^TsTWx5^=ftrՎ Mꌕ+2-7^:DžWTWQjv9s> FYd!Iyz=W4p(]%zLE<5jYuBSW0("d|{vJRWxE@'WxWdWI@*+Bzyx>!^^}DZ«>^O&ī4ͫ+ʫhrI ֭Wg <{4(P;q~~6п(Yz^UHҙg`M+r~~T> stream x O 4( endstream endobj 206 0 obj << /Font << /F32 42 0 R /F8 9 0 R /F34 22 0 R >> /XObject << /Im14 205 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 212 0 obj << /Length 1490 /Filter /FlateDecode >> stream xڭWYo6~ϯCKFFNzbr}Mq(5ߙdL Ty@fi@ ФNL@Q ͭ>({ {3 a+m^ m. b) = VTzO=6-ey<,&,yu.l\^)o.o[No'Qa894)(A:X8w.oG PǑvzLȻՏǸ%amn.0I34[gZ>>yZ]~4P&( BI[lR<>D+ T\_2;06TeInh,Qܼ_?y_Բ؄λ!~.ڏQlGS;8u.'iAպ?o/GcPogπIpJ +#.H 0 endstream endobj 211 0 obj << /Type /Page /Contents 212 0 R /Resources 210 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 210 0 obj << /Font << /F29 14 0 R /F8 9 0 R /F34 22 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 216 0 obj << /Length 1490 /Filter /FlateDecode >> stream xڕWo6_e"FRHk5؆am֡P-&&K1Qeblr?aXx};'\ƉLn…uf&Pfr[L8|ny۽xqUHǙR^Mf(/R#_g&8i#DK|J,̸Sл:^Wu,&z LٞsgOgIDxBF7y g/y]T)7Qu\ueS{OԀ$V2dvabѼ92}IitM R*Τ;rW5&^ Lg`)o+3cz##nɔ9 czTZL5Ym9&|Lrt]$i;t >U'pԘDiyTAWAosG-l6yT&OL1 v'%=~YCz ӴzmlPRǙ3n'N%=2 Ǯ:) @),N̆|ͳs  _}-+yƜ^]t(nFPx1ljtHk0> :z:o){p  u:ٖ-zncW4vs%<6anϢTQCS(ƕ]I=1֙@:ue_nv"KiqӾ0סּcUlJu^v21ͱ3fǣ:gP\jg (z|^UMw#T0&᫮}Wg]5To SpO(8AEBy{% endstream endobj 215 0 obj << /Type /Page /Contents 216 0 R /Resources 214 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 214 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F31 43 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 219 0 obj << /Length 1774 /Filter /FlateDecode >> stream xڽXo6~_u5CRDuXnk yۊB[,y4wǣdad{(x<~''xx~yv6UH.!5 dZ0MrY%,Y/_ 5jK-5_|G힃ϰRL⮪u\6-r=iҘ; >zi Z\ٻȌ3W~|ޮZAcS^YDPI~Mme{YA$l,֫0Wn۵k4ـ`l!XD¡ vp~%O\o1_SLfnYtW`l\,lX9aţxk2+8i^d֦ʯYJxvW@rG*fab(rtR2;!fIfxc'FɌI>" @AV "[7.`Q I2fLgYMRi8Fw{1Geom0'9یauШQڠ%e\c럘~irc@^d|;(w L3G)X1Ɉ'CZC o𧣉h#Z ׳yѹ)PɔtL dQ;cck $ D1ە= AeKB$"XP-R<_,9NjkO4]3'9_6uE2[ R#o;8O2XzpߗA )!`RH;&pu砽y4:J(!A"`; N082S^0OYf9d)F^AB!8kړrhӑXɅj}kDamjYNkb5>zKG0Tr"¨뫺U+Ef8L- {m}+G_džRonR@6-ѕ[` Eɡў?>!#V) ø.i?V`9l5Y<%}Q{> od0,[kt9SBy*#  brL$Zz,AAGsQJ.H̓N9UZW~@0 8k,%]BVz?b0F3lQrhOQp JV۳?>op-rg/MRgx&yq9tf2 r M4< KsG%vz.!VB*4DRCٰe KYf^:D{HrY(yjmP'Ii"XQ(=--i"}|hkI%[ VRA(;o񦅭8`%@҇``P:hlN<+E `l. q-(QHwr >O83fgxuW/QE v/f<_&|z? U6cŸZ΄  B endstream endobj 218 0 obj << /Type /Page /Contents 219 0 R /Resources 217 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 217 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 223 0 obj << /Length 625 /Filter /FlateDecode >> stream xڍSn0+x "s#z+l(іYJe*/ )\D.tDؐ~on4b(U+3ѾDY}ȷ\5g:9_׾cO>ݩn]YJ'Rl==6Jw;@vig{K9l<"c 3spJC ]ci}C{zBaиY‰=?#]_#a 5h|p1Q }?8ZXNIpvU74%ԾϷYq"[96,@q> kN]2B#46U+f6S3Ŗ8^ǟ}=Aр IqA)z8mn*eF1BaנgٔrSc-I/Aqks",&LN,|l]ﯯwD+I8rAL̚ӬV{NU üSו>SB9jwDcOT!&iuiuq۸_AҜ*\b&|f>V}m[˒T>[!<)HМAzi V B8* XEVp? endstream endobj 222 0 obj << /Type /Page /Contents 223 0 R /Resources 221 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 221 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F34 22 0 R /F30 18 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 226 0 obj << /Length 183 /Filter /FlateDecode >> stream xڅOA @ +rl(Zћ7 UkKKA@̄?NZ0a@Q"B ~J'ɪfMmvHFc$wE)#좼*)N14Nh{Vvд> 6EuA e2HY @ endstream endobj 225 0 obj << /Type /Page /Contents 226 0 R /Resources 224 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 213 0 obj << /Type /XObject /Subtype /Image /Width 650 /Height 900 /BitsPerComponent 2 /ColorSpace [/Indexed /DeviceRGB 3 227 0 R] /Length 4082 /Filter/FlateDecode /DecodeParms<> >> stream xn:E%@Qy H{BG р=}))JRN%b߽R%JZ%ىwέ*FLUOS4_ms=窭q燿xEi?nhl߱vܽlѱ966=t}U=~?n#J~ނj["Q8G(e p2Q8G(KqXӿmLxayy[xILZkXj^v0ŨL棳Ƽ),]4 ЦQyRZ=ds>~}z(AnL *`HM&h2ΪHϞ[s;S699әJ;wvx6tOD[g'$9]3y䬡^29Ir Gi/t_;R1DtL8֧N1GⱣȱgZjؑNăQxrꠕ?|?LG}#Ig̡>5819^߀go.uH\꒣1<:'f?7}̎컎G@z9lG:-ixGQ;r|x{k3߷p?>|FGz9ЭQmѿ9/w38ˎ*;9뺄E{ 8Kx-,|,±.{O<KxX5S½+ p<;hX \k{>ZKyu \ϹVϹd(ϹWq F~֫قԘ~똲{::a+uqZG[~Hr}[4ަT`8K 4yE=5 %pfx| C90ۼJ\>Ęk=mmL;0C[Gf_gkn7u?q7cp=kg2u %uE{ Y>.]K8p>TXXXXĽk pa<ߛ}+u[Kp|x,qL!G82Q8G(e p2Q"/Wͅo *g]}lP)Rˉ[shV0C[M3.:wi:Ir7oQGP"W-򸉔-45ajeC :NՃR7s@eԑӼR~<𔎧q)5Rü۱xǺkk(UQ8G(e p2Q8G(e(qB#G(e p2Q8G(e pƑkTrWWVYǽXTC]oRv5(ssXJ0M¢/rY;VCsJզ#uur7%T'lt /).{.gXw4~ьo2[G:WK-q,8qEUp82Q8G(e p2Q8G(C㮣ı:(e p2Q8G(e pH匣la|KF9|lAc|ھcUq,C k p2Q8G(e p2Q8GǕı:(e p2Q8G(e p28վS얃~ &" R1[kuZ:Zo;o pOpnZwyO{^6FhOITG_GEh7.Q\a85-wR81o6f'J sy`^ĥui2E}ƱMo㷺Xq e:5R n3O;V 8G(e p2Q8G(e PXqp2Q8G(e p2Q8Gq=VSAޘJjǩT>z㪑 g\iVs Zf[Fy͈:4o#4iq4#GhUnuW=6FoSfX௥ VqS:8?;d~/z`iGS:prSiŜJr) 2g yZje(p\e p2Q8G(e p2Qsfx[ / >liOq ӮmsS//{e{޿~j˟Fźnt]7i}[Uv;_޴7Ͳ]-Uqu]{اN-{"oռ=HZ_y/qGr' i>Vìs᪝~r^vdGstlɦyc̼]-?/_,ۓbjrt5wt yjk?Vv3_YNG:zfqk0Tv;[^ U{|~S͗7~<;^_vtfgP;ì{N\\|?k/u endstream endobj 227 0 obj << /Length 21 /Filter /FlateDecode >> stream x?ÇO000ri endstream endobj 224 0 obj << /Font << /F8 9 0 R >> /XObject << /Im15 213 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 231 0 obj << /Length 801 /Filter /FlateDecode >> stream xڥUn0+x(`.HHPoMQ0^HtPCvb j8f1@ycG ϨrAF EuaH8ʐф|Kn˩mWgɓ+'Ol>"R#9} ^Lgԟ8:C]K€%KG̤ ͥDjLceCf)l1*rж R&﮺C\fxv9BvT+WΓm#}T0$UYMKX26dZ]LS%`|b| -)+[4ies ; .WH{mW4_Kz>4 ]5A*N|i%FygMI&Yde`myƐNkoz;]Eڹz7> 4$6I{yW(Ö9+W衺 .nQjјE'ڵNX'~XUn<=8 R15̂aa]Ugs (7"a E!wבv̌u,"U OiNw2 RnB]y~Mxz> h.:fa9,! O WثBV Ϗirs߇0"?0~^ӸkDs lS;N fr3A+ڑxx J:-A (}Wyهf//P*oØ׮l-O ג*Ƅ) endstream endobj 230 0 obj << /Type /Page /Contents 231 0 R /Resources 229 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 228 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 6 232 0 R] /Length 1622 /Filter/FlateDecode /DecodeParms<> >> stream x](dݾ:r鵜@??FQ!gXEqLJAAA?PR2'B?|29=XU2}ᱫ݊ Æmv.k+#Qcbc[1 ]U)~CQ)Ǹ~[9 JzH9l JqbSL@tLذ YjIOv=6oqmLAA97m )jخ^Z DBɌՃȲv }B 3[/TR5|ms?*)HXmNG d@IH& d@B%*O>PŎ)E<\R](ܧ۷{[@lEWEoXmNG d@IH& dRr6Wiʳ(r6҂PlQiA[TfMN4Je(=)$L@2 ɤ_1VȟLl@2))ȕIA,MAgFr׹oVDeOZ KT1-:@ @Z/ $R.[H$e R@TEEk]gjg<Ѳ\6>(M{lk@ HFԕ68im,sux_1HldB/˺L[Q"[;{2I>Yy3W@vp;4c=`#Gwc%] ; qolG~ 9C$~Jsn]ߘJ^AA-t_:rY&@J@JOivA;xv]pqvS߱ݠ?fe7h=پ{'@%H; Od!>b/1qmnB?T MG~ibv<|U;WnnqӇ9WnqȻan=Ojw Ț @١F/k2 @ o}q{Y/kd}*1 Q P&2J 7Bk ehR뵆24- se^`gi_XQ+;M{ň\&Mt~ @J@J@Jӏ:UW >-t endstream endobj 232 0 obj << /Length 26 /Filter /FlateDecode >> stream x? ^>|?e endstream endobj 229 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im16 228 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 235 0 obj << /Length 1492 /Filter /FlateDecode >> stream xڽWmo6_"#ʰ6 C}iN[,y4Q*mbx|:Z\*1KW7% Lh\:zֺMwߕEڳeyF߳ٻ3_/^GD\2ҏnK)NU鑊]FO.[i=7]I9Kx%!t|[W-G4K{KW*WH8nw& PU+oOqk(2g- M`bO*X WLgոs9ixWt6G5b"Sx' 3xn 2# SLJ9u'}*iH J_]3!E\+t/h&Ȋc";:|NDjٸbfUb;#af5Ǜry$}h!ap/Kd7~ÎgzuOמÜ âP.K57QoFil04wm9$) M-SV2 wW .4LIH89K:1e u4q "n5;+G$C̪ Α>s{",0)|l.7[ =yj$#갌zzRP=3k'=\]ʄ9AIp@y{9cIM~NWm2 o,%[ RyY :Gk>*pi/WeֶsX iL /͘|<$¦LpD%uMq\{+ <(.A"&`pdi[ ` _cD&\Q1YhعpR܄nW7uYjޤˑXxܽ 74mi~v\_-ZpT]520mE.^;%TQo;=#LKk_?F'g{ᥡm# ?KHXh\ʋ"g߆ MU-i\gX aH׽"B!ط{$ xO.ckh7И4$~ h%6xV*CdoQk0,'}S Apu|_뾙uSw~i#& s7پLv^,_SG38~&$Xfԅ?Q%K ߖV,$TXyS>hڕWXOa&UŒRC e:P]KA@p8j gS9= ި^y<|u|97|Cv#GJ!ZR! 1hi _b$$D B>H endstream endobj 234 0 obj << /Type /Page /Contents 235 0 R /Resources 233 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 233 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 238 0 obj << /Length 1585 /Filter /FlateDecode >> stream xڭXs6 ~_U~&(wwk-ۮ[&ݮ+YJeY(v}2 H9Q]ٷ?@%Re"@,(ӐG׫] l_<<YU>\,hNDƆ9d.hF%4Du`зy[ݖ%uz}W*v&j vǣ~)rnjx&L񮺙 YU`9#jmWT3WM%.dՂ-f *ov]9MNlaКfBe YB&"LgqQmA(YH⢳1KJדF̍LM{ܽOu'xfk i0.pDfj=[77W}4>]Y6Aw*Muȕ;w ϒ4_@$ %s &u lP-aUЯNuڽ{3zޒۮhXty9(&<컹jta;"p} Fx[E fsCP-gn",o#qTGWgsO KfГIJD|P ,l޿4׈!4x1{P5v݇厱>L ްwm#6wnU zэeҰ)yOA8E]^P`̈O?_ܫ csŪqD2Uup^"W$9;ȊՋ^M;:A>7pCq_Nkkt&8G=̱RPs J1X9'+NjI|nU E!P@ 28h>=HzG-sw|PkFm9[8˓tYP|=EᴢvL!TctyQye0!Q3A\" -CƻVx$V4o+(cu0$B=w(_O\3*茣 uuinݶ|xLmKCjVAeېk&UdL؇1@=% .]sj V-Nx #ƒClĝuJW)h _'ⲕKLpsl;;yZoLl8#vUO bWtWېбuP<$&`aN+K8%=A_pAZ۸}8i(Wk+8'Q&>Q+" ؤJ`,8b-M0ܿuqT. x  y3=pZYgGv[ `" 3EIs)ta#vٲ endstream endobj 237 0 obj << /Type /Page /Contents 238 0 R /Resources 236 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 236 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F35 28 0 R /F34 22 0 R /F32 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 241 0 obj << /Length 1353 /Filter /FlateDecode >> stream x}XK6W_LUIj29$9hZ,8>jAeI8_WC?|S|zQl}Ez>̞AfW/j-ڄj18գ^;&ޗ2,\Yy ඐ{7M"צJzB$l"Ja7 ѫ6I&rO-cqјяmL%s0_]=EnGV5qvN25=ڼ*KFr+F"VCsv1d>_&Lc# $c]sPvPRhpHdm?8wWf#]ߓj<=J"1YGXPNs,o~nFZ6votX1W>Ap0Eo{:+mdԽDs:ԹvHgz3A!09zw+P}(9`MϟR6s3\hab**S{n1XL$^f( PUa @ Ծu7A (ɊqKH0GbpxFEZF(YHcwQ# v(PHt__NVk7MrNZ]-^:fܑ"ErWPݾ5!{c~}ljĚDFVSqS4ӡqU.tmX;cp^kDS||HMcfhN3nW]^H>;Ί7-<Uf%TT3 endstream endobj 240 0 obj << /Type /Page /Contents 241 0 R /Resources 239 0 R /MediaBox [0 0 612 792] /Parent 242 0 R >> endobj 239 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 245 0 obj << /Length 2354 /Filter /FlateDecode >> stream xڭMs7s6X|\S:ڃ7QAYri]!C "y^ W7^QUjPډm7o! }=~u#M~?7_qPR$p{X׏OooΛoē7%d};c ?wvzw޼]Q mu.%dLEWAnqFBjJ v ߞv"^h*ĩlpKjS%.yd KQ8K9೴WW5]xnz`ċ.ti.Z"tZ^O%vNW?na'kD L`&u;C{p7pwv;wƌy="(wǝpwAk!ĽApwFBZaLwZcg$tQ*a'kDk/v1mOzؓ%"*x*_̛<[Cމy|}S9OUK9?Oz%.۔ׁ4yN7pqlO<<%{~LوZ.äVq=wmu}^^]8iHDP.5"~^7PVo}cY6K8qp9in{ACWuvyLE0}#kD t`.IN6r\:qqu#.*̡jEPǁ>Ǒ5"sQaKőv^],סUcr^+:Nֈ@NXUkSL؁qtؠϐgkSeK3%}\< ָnNYUIe%~>nhdY Fq5T>GP'}&'3LحJ뱓^ŪC@_ (}=rO:@Kw_GP d6Ps1@bZz;N>c ʭїCNi} kD Sȳc`n7Xd7 JH3Y:ya":E 8!LgNJU wGwkDG-y:G2SWN+֡S%G؝<Ԟ#󢶏9U"'yF%sk6v{:XN7[3:w*hjܞ"(wǝ*Y.aW=}ٵ{_= g*Ϧ3}.(x5jW" @r X-TY U4&~,2 jj>>5"6)=6Zڠ1cQlPX5"6PNT$n֠!ؠ|ezU !YW=\) d [<^ /U2 jaJRۀ ~c9haJHY*Hy4;5"&!PN 54*eqxbQ *<A=<@ֈxʳTLwyUi"P| ]W`gF- 5$9K]:ޟO>5 endstream endobj 244 0 obj << /Type /Page /Contents 245 0 R /Resources 243 0 R /MediaBox [0 0 612 792] /Parent 242 0 R >> endobj 243 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 248 0 obj << /Length 2401 /Filter /FlateDecode >> stream xڭMo#7}.?dw&#9 `XgcxȿOQMlu[E2JQ/"%g9Ii'BQx_>޼{/{xI /֏F8懛no8))Lj^V"?yE0z޽:޽xxzۛvZKagA k/1_l bN_s #&L!NOȏFYe<~ BZ7=_3gG 'bIBE3_?~Æ }"ȯ/?K C.äȯp>鍝7wO-kHO_K^ǾsU|W|22q/,K_'3"Gy\y!Oޔ~l>^< `L /CS׺d ExpƟ o. ϑ*^mK}t*me'"J_G3"GgлhYio7gȮp\fIE{ uС~/Cғ}&0I&Dϑ[kUxKOƂ;kwEUz}$yydF8 Oxv 6@fb}'ѱJ_W# Ȍ \>ȳ `]F9pxܰD@Q/І} "tGnYP# Ȍdg ')% l 1hSA V^3N[ uaGp!. y%lԄ=E[MavsV}wAaqqAԂiuEl &\@Tv'h [@SjEu@%r1OBt0-%l =D5ETW~EDy/".W?ب8JpoN5J<$=j怶^hzɃ0@=@;Nѱ"_'3"CFt @-[㟁'H HNб/ɿ XDp!('dbPl-zjPD5gX il" ̈@*xggk%[?A3@OЦQ?Xa-ώ\6T#pH_?dX; [ǚ}\ة|w2Fp dFD~ȳGUfNWO}; P_Dp dFD #Nr wfFǑo_? 4Vj!Ɍ3OO Gߨ87sίbGRON//"yH:c(柗IIL^O'N(=( endstream endobj 247 0 obj << /Type /Page /Contents 248 0 R /Resources 246 0 R /MediaBox [0 0 612 792] /Parent 242 0 R >> endobj 246 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 251 0 obj << /Length 2257 /Filter /FlateDecode >> stream xڭIs7srCbe[N4@ QC}!UMxl,_HB{9Ii'BQx_?^\m~$wՏl>L/~㤤H2!;-t}ׇÝ}wWMұ:h}iT}1d/I_Û-Z(5HaOoʫ>Q*s3?0OAH $b/& 8߇7t1ov&<BwJoUw9 8@%>ձD]Z8΁ O. s|r9`U]c. C".A4 2L;&x:C@P<`L,0qT,XYn N*d `':U~P~9z`U=c C"A䁠5*ooU'C"Pa2zǀP<dAȐ!m~QǀPaOK d*9dUw 9 uIJhóNu@'r V8TyOVP!! |mBI%ϗK"!ҩ`kV91!x+J=ʎU3_/  =0iODw#ϴ8+[I9:W=Yy NkJW~Äor3$UBIR3.~ys O<:+\x@S (:yfF򽍞u֛>WvTp"鄯TpxLy2$Lye,0hݫmGzUSz_z2UCǤ'Cng_ 3;)y۔wUU2^n\}`R`ϵs;9wܯzor^*vd(t&-7W*xLx*#OB|u08w{'17},,fi{TFDw-d__?8W<Tm<釤1ɐTkv0Qy q0pMűtۖюX\ŧMTp#ȐrKtAƎz:y\N1'!'(AJBzY:لAq~D$sA'& `sqTqQN`qB/2T' ۋ)_ y0_ChbN1'!NP1xw*QBjNZ(Fh9Utpl@gDl @_, _>~wHe>ugp$U@g<2$q6 99ZZ5h` %Ϲr*s`AP-l9o2W> endobj 249 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 254 0 obj << /Length 2290 /Filter /FlateDecode >> stream xڭMo7{%9&h=/C8cA \-Iq#Kd##$WN'9+&1L\|uZNoӓ/') =AXWn~5LJ(nޥMjAO7o'}~|xRヹ~}ꗛ@tdY6F& (OL?5^o@:0%֤N* Pq't`4vr7{%¥_C"J1Qـ?\:g8~{Z rd,)R'sˣ\c'C"JXy_u`Ey(HX+K 贙YU # @DAHd}=~~ vOJ w?uʸmFXoc}8}@i5uiӱ`/>῭/CC"9j FĀ U L++e<5=侃 .@F $W€?C@ːHϕsG:V\ @Fs 8`A <Xr8@'r@T Z5(AF H`H`L :aJB d4HJ-K;U #I@D$Nxmy$~9Ћ Ձ !*Y-W\x2#b@z^ycB32!C5a(h]#a$DB2U HVp1Ȍ[LicJo<^$Ճ䶎unxm;7Ha* ]DXUp2 tHĄ<&(2kB'rV(5 `.X 'T<Qka52.*t2"JUEAFIXe pQuF<Q=ϊqMWNT@*(rCy!+\aY<\Up2 dHDc70& mׄNdd zM]E%2z$*d+xL*#bAja<T?>|uh*5ad8fR۟ODTtH{ lv X݇mJ # @DF`dxD^$dH\@ЙHX*yL2VJh 1 t @` A{yHʱo9& *@A}gBz48J\l`,Jra2m,xdH<P~!s%fWG{)H*g|X& +y2$b'uF8 IՀ S ̈F4tR BEئ@S׍5U&olK7 #)@DАY.t.V r B-6y}NUBags7 @D 1ʳJʤaPzAALY\#l`(݉@:TI}evm\ <&r+Xw6 %,"TJ7!:Vja1h<*yH:$@ЂJPjg $Ab R|'!*%8;6 WTB<&鿋Bڃkw BPNR.DHʳ~Cc2"hSqP hFmV.CH'mJW #)@D0Zȳ w9ʥ!;]7 ѩqo+ C" C:tI׻,QǁbTI`NO/{QTp 2dHDeLaPEY zqZRI] :agfeGy[-c! J,p2 (-EnT X禹dd1 Ȑ[ T"F Ilca 9 -D2wuy.S U.\UP2tFDo1> endobj 252 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 257 0 obj << /Length 2365 /Filter /FlateDecode >> stream xڭMo7} kM8.ZQ S=MR2{ˌ̑>CVl$g2?vYNjRډmWrz/>0ҟo0Φ~⇋o/wI&5]OiL7{Jˏ?]Esyzu_ VVgYP(7W_c.t+s\x2R ڗwIg~Vfg~AGaM79 ?GrD\0N(IBEuv\`@.(eRv|mZ@¹)?ظj]c.!'wzc=Ywo:0 hmuqP>;pW5k8X d1Ȑ"5J n(uhʌm. 8 RyBh[p2Tƭ.Yaa0(p0A`P2:k wxHyX !萈4()~ƁNaPhD DPG? б|^Je"h[p2dHR&G ՁW Lwuz)Zp2dHg`2<_lN%)VP йTS Zp2dHD #PB*@+B( ?궭V-yL2$""h# {EC5 ꥀd,9l<y,}2#>I_6нWEP𢟧L<x,{26{ P'{iq.zs_?m7u/ :Ͼӹ;|rg!萈 xI e5"@(2טy2$b@ip t?j@ pSKb2u5xsu, j,U n@f3 HgCz1SrTZnй>>,-y2$buXMS2_on ~TNwK Fʈȳ`9? w{ J5EA &?_U5[p2 dH]&}z!KeR\2d1Ȑ <Sц *вlD UjyMțJ- yL2VІH0 b_NRdXl ƐFtRfhՂPdC"2ϖlS_NRW,HXwUjŰh܂\ C".x+=0> ن?oͿ/-e_@cAǍyXټܶgɐH#qVx)97S9>Nc+uZɌH:3L[%THe/%tt<KA]Β-xyL2$"ExW 2TZz|nn.pt,(i[p2dHD@Q Jiz @Q`(XSyXd1Ȑ[tD#_^:wp-KެGU&_NgHQ @=).LcޱܩH> yIr{fc2OZ3XTF$vϖgo@e?ɽSqt^o;,ի3'CbN7ɯZ3XdH$z]p!y8Sqt^o;,p~dRƵU } D]zkϵK'}ZzyS:WKq{+-yL2$"rB&*O%DO}z"umzιMa2\<&A*xg[0>uD Մ56K1D:-~,Z&d1Ȑ[ )(*Bbrt!!yH:#ABNA RkY>":2Kض"d1Ȑ ~>γ  kjB Rׂ˜q2u OPfY n[p2 dHK唰ʬMcwQJ2UOzpІ} \Ǽo\>Pj%c! gBe?'AJ䀨U?1HkN-?܂> endobj 255 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 260 0 obj << /Length 2298 /Filter /FlateDecode >> stream xڭM +8J}\ $؃\>v:8X߇f$$ylvmvKzey0T*y>? li?/m}SewOk^VE< J).1X],Ϗ{c?~rž_:$\L7r=Z߮Gc-fBD*E&t ]^a=ҹI4kf|\>,}/9W~B#Q.(cjtvj׀VZ:оրKkKWNj`5jkTE=;5k@@VekG ϕwHu(vUy}Y*`*2`,|_׵ }goϭxW|,_q~Q{KxPF}(YKfDJ_quץ>E(U~Fhe*o%7}Kuml]hNFH(y?[#?¾KBQ%/ @͟ ^4%gk$I O"0~F7l]hVߛ%gk${^E};x Zt dk ق%6[YxQ%dJA۫+.@@BN@L_pتjzV},MD?l7)W\zK@zR[E앳K[w?[%~7$_;Hhh{ XJ+s `*N2 |bC_яD}Ȍ} ?V{̷|U9Wp;D(UwF{*XOQFO"umCj=YG<[ltuS/ <*#HY$3сp?߷z>u5:`#|!ɣ9lyV3*ރFO sg>toU8 5BbGsع ,g)wAHZ|Z<[\Gs R:!@cH\zC6 xI_^|\ڱs%U#<.lЍI%ϑgk$G`]!2e$o$2W[?ds-ctǗ.~=FwC5z)3wUqpKn|yF˂כsI~S<-  :sFJ[oly.`|<>GH(y=[#:P)3w6f_zn\8- pC#$zT<@ ;C 䮓!wmu٪ ;t>BGs/2#{փȿ]݃/}zܛUn"$~<99BoWCJ63a˂3H'7D(U|D},멈H3yLߤ1Dv d>d?CO+޶y|Qyхԑ> endobj 258 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 264 0 obj << /Length 2243 /Filter /FlateDecode >> stream xڭKo7{Lq-譩ы8iAA;+qV\혫"ov9;㤧_t}zeYOf26T}V1竛7zz/6i~TeɓѪbQ))s/\vu@D[ ~܋T^W!7[,:`!*dxzz8n{[r-g~f|>LwӇ7✍*4IwA#$eK|6x<׺7gciepW1lHB5*"#>3:m}q/jbZF6U8ù\ 5N`(W1lHBSS2W.kw=h \lAy>? 2<+&67Xac%gSK~5B?"g3uz 3rO 8obzmQޤ =6XZFhG1lƭz_6ɨsjO"Rѫuk7 |>| cgW!|H>|adŭm:Dz̯۹>X3x}ߎޑy; VST{ȓ۸_ij! !dZ>:N'ŷqQ Ƃ ;(Yt!AAnͼ0Rh#<& I.e޽YeZN 2o?<k|e3φܚw(dfxW%;Dj~xVkCc.68BG!|H|J*fKkSIDFmB-^vh|Zǥy?NJ-+y6$a>zeLŬLYx|xJ _ouZW1lH|wt]~{ߝ%Zͮmj{7ѹlܬFhG1lFB`NH7hs2ޛ6S/NO=9gCέS>tMp^'i] .:o> 5:6; I8R3oN{@\tކ}%>Rk5ysΆ:%LSy6>|yiwtn|7|*S.:BClе}3 FMؤ G=Pmkc⹌X9mrʅp3 ^ z7޹P^jwW'&xe$x2y |x&3K_̷v|*J:Bcِ{o)2y#Lj؜|]u$}YVҸKwA&Oئ ߎЙP2 IdBYL( -vƘ{A*N]#t*TT`CMU(ЫP0ZM=hJZ X35%!ЩPR I6L;0uBD@ThI+;t:m>OU"ЩPR M*E&`RKHgBf --v`͘Ouڊ osBO!ȃ2m 9÷:z$aй-k >U{ Fhx?}'2K&zUwC %Z%j0*X!p2&卣SJ, tnλ Tx:*X!pe:%#ZP`Is jo[%~{%3W u??8 endstream endobj 263 0 obj << /Type /Page /Contents 264 0 R /Resources 262 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 262 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 267 0 obj << /Length 2244 /Filter /FlateDecode >> stream xڭKo$}6 6[6{PveLj m.r[ŭK^~Z_ ,J^*Ƽ||7XrN_w_ˋѪbmRK V%gOl=w~COP2&XMiOݷιXYm?{|8BTTvLo ?osPYx!$}X.Oˏ9?C] B]QN^˻oߟ aV=f5<T+Rn9sr I5*"ý/vM{jj sl*^pgV/FhH< IhYi+cXs講۬q֍u.*o-sC'#"=tt.pr㛯u>иUmR{%·$g2{^{wuڋ{Px׹jgCanZMn֎sِ`t2CR9o??w ^"4̖}n}F֞Ol,\z m}#zDSφ$u:2WΕAa'c{6֤{Dsφ$ۨ 2ܫw.gSa1W̶ʻ:B߈ij IQFI?$BW]Cy?7|gSa92VZF<'xKQ&Pnu7?(DbW}Cg\3= KpK]WGh<IQ$qں}

K.gCi,vo#y3φ$ E@{{2ž̈́ys ,gnwABݼ_x=NPVυN|#x6$a@H'dZClKyA#O jy-O?φնq7BG9lH¿p)Ӹ:T ݼ > ;wl[/ s <&+FY'-LA'P`ph:Iҫ#dTC Y2B&@h #{?/PX䙰n:B'%Hd.fԀ-zC=ݩÇbpk:x.ؐD2]}X@漋z|g[wpϾ}1B+x猳 9!@jA'9~t6ԤtΆ$[|i;`j7N n=>PXͥmߍx: `tu7룢N n=u&7[gCa sg}7B[G9lȣu[rY߬*9z֤ZCacg}7B[G)|HzJVcϗK6N ~{߾^^{j Vn_s (+s r?(uR{wA \&-s ^L8s:REAw|Zәߍx?HLlHT = =޻8}ǧU > I$BO*L% h Kijw1H<lH"LPRWo;4w◶9gc,!n?BG9lHB6LYu٫U}--ѽOnj öu#u6ѺI"c}J>>($BW}ht^:˟n η!#r>#<92}{ ;y>=}@k%_~sِEQۛUvo}PIĮg.v]oaJ]Ou>Ƚ>&#x6$!')Ӻ7@[[{V\:^޿ísِtUg\R9G@&sl~/ݿ*q!~_+cSj endstream endobj 266 0 obj << /Type /Page /Contents 267 0 R /Resources 265 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 265 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 270 0 obj << /Length 2190 /Filter /FlateDecode >> stream xڭME+H+ qel`@Uw^~_z㢗4ug^/f16T}V1Ow<Ӣ==t/˯w?}wy1Z]r;u;GmCbߨ1XL"t"wَY.7gu!g Yi+C.nkY81p!>rs]Wow(^dDxUp{%t Ngx>wTr9+]v8dyChex^\!tr ]r.uZ~EclS@/3ҧ稳MvǤ\@t~zx Fo= jپ_9d٣9lX'>y~D ~پ&9l^+ |~ ՉhZ[Ouzgy^):U||UA{'!M+i5gH~W?[#!ețߓ= i"_Iyg Ԏɳmi^Ќ&~W?[#ؒh yT\KK_|~E }M'=שU=OQ$߯P?z"H'پ9lɪ`e>E?{"D'.O=/Lu9l!d>:0➈8ѯʼnSy .*}y>d/ʗp$}%2ض(_8 |dy=c<`Yf]? KZm{Kg:5v.>w<ǝm^9!? (IZ z>no8ٳ}Q[!nARGs&;W)L*T< a"_ wB޶ پ(ҝVCVyɖ+FY'] ʖ\<a$n)9PEInP><V^it1{)l4Ĺ4z٣9l>YfW149OBW_iyybN7hӠ= yB_79ocn8Ma;GzW<٣9l)e&r?zVo_߰٦._?u zTGs&;uO5GqO@Mڻ1|w/3]gl[",3wzx7(KZا=mJeeVMN'Nk&mt iP=ѣ9\߆&6YODMf_lg.J>Z6DlH AړǎSoҞ:>o 1UU||BWpè (Z&sj)ګJ;:6nE(ꙢLظnx7@/!WrvP757پb?U}}X7 5ʗP'z7,~/\ꧯd\-~9l-~*E?xR.Q_DM7v[7\hO?1UاJ>Zba 단Z}IV1}/~]Ta*}y?dEfoW%k/[zӶs|-v]Wi*}hy>dO )37gG~x8"kݶ |<tZTGs&;{(xSQ%n|uoQ=ρןvgG 3c: '8P>a endstream endobj 269 0 obj << /Type /Page /Contents 270 0 R /Resources 268 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 268 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 273 0 obj << /Length 2213 /Filter /FlateDecode >> stream xڭMolJޢ*ƼzT_n՗ǝ luǻo7UlחJ)n1X?mgwwxluSQ:'}oι{}M'F_6F7ʵBh/u?{ݦ4q_Y9ۗdN'eY0I`wA#ea9`{]n\ u}Jm Ի M Qg$[B,2{F̈́..8sz8jgٮvyVvIJ[VFN "VГ8jgйvyv9Ի  1zOFy(Yo'm]Dwc[᨝@&^iP!%|\w9C"VwhFۇv ~~X5lKBؓQ%_&]DN77vz6oL9  qg$u2CR9(#V{;,Lj{W5lwM^eK}%{-rwm>nB޻  qg$ۨ 2]]tg]BcO[aoolK}n7ms*45lIQIӧY_P-A2nU; 7,qs[}5qKQ&ک"VvX8*4ppDo IXA|Edx';L|z5lj$XݧBqIEH3q#XwĻ Mܮg$\wLơ~ s af:ᣑk f,3lW٭wIˬϽ/uZMBlg4)خ iF8uGz%L]=lPy<^rq2|S0=sBck& J:!_-,'[=٦`x'6a׸MܵW)ˤ^g}j&: ee:aK̄t oIf v+FY']mǯ?>=?9wihqywݼyI|J*fKO~2؉h#VgZDгMW$.fe+NDѷtg-oRK+s v"zdǬ.t)~;tIzE&7ѫ}2҉"Vv F6l`p*4t0mS M0w@ s"sc٦'t^}  Ag$;We:'o'c,uSlOx#]~*4sƜok܁vzU>Qǘ/v] endstream endobj 272 0 obj << /Type /Page /Contents 273 0 R /Resources 271 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 271 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 276 0 obj << /Length 1390 /Filter /FlateDecode >> stream xڭKo6+x%9|^ rkC8ā_J;\SeW|jFCI׃FYe]Щd}1fި;e4SGG/]Lc=muJQtn?_<>\߾;zgI;\@;{'_boN%K\FP?z:_y++'g:UןxP^i 0IRE výDO܇ 7ؾ{6L+tTݟEh< IwVXdߌ݆{}[ssgsUL;5~#{6$dmz봩7^=lyVͧ;`si' yLa*>hVz>$~Y!׋/%׫2ЗޓΆ¢ܕ#v6$=& IH{Cotx"{ygC zG1lH{ڄj3{ݝHf'^5wšHLJF޲صv-B{G1lH»px^CoyhD2>Km }L}\uv-B{G1lH»: jоI$F]U[13O{gs}.~g#xdφ$ۚ;W;[DfOL̝o6^9y<0oNYfPM٧Vg';s'gs}i0M3<2gCCULR Nvyzݨ"~sW>j.X߻y>$?ZdF//B{uǣ/mx? 3-/B{UoGgCaϦx?j2S|^@DP]\n̈́~~1}oxL>k}4NV7 |}ڗu,h endstream endobj 275 0 obj << /Type /Page /Contents 276 0 R /Resources 274 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 274 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 279 0 obj << /Length 2082 /Filter /FlateDecode >> stream xڭZKs6Wh4։oh9ѫ]EP -8ɓ@}bW4[e4>x B)c\mM@d̾]wtdK-sߢ=gD;wUr,r3 RX]Z70C31:SM![ln}KF MkכDX[T4jm 6_vw\@!Zi{v;?ã4crx]ITauԢm_ECr C7JWP"pi8<ж* <TK}=:x[ݭ%Jkn^69bߡ/1$VD&)Ʃ4no5Fע>HvKF̗q3ALXY ƍd(1BK^ g5˅CkWR&񐔧:aFYBcv竒>$I5XBD)j|x:'gX!/CI3(M@'B|`))@QB]GJ%~C` BF@e$JH_g_Ȫ#5Od:ϬyVZ5zlJN,6‡- !1jX]fhucސv/ۥPжn {UU.c(%ahj҇Q<AUڬmqD2AW&߇'@]_H4~*=bwj_EumCo6J 5bj@*4LXu3|SA9uQBջ f |TC14p"gVG<0i w7 m5{I`9v MCA~H$(Qm6Thד)PSJ1hLukvW̵-]k  sLVPsQEScJvC ;v{O&y"qŹQgĻ;F$Q/NG`ݜ5 uݎWLPjHaP>bE,zSԃDQRfKqxxlr~_-~;QBJY-ny//4&"-FitO4P}y5:A!Q%# S2J S{*&h4(OS0.] O>CR{9B-(Zg*߄*a:ólK `l H|fNFҕ{0_MhZ&E t4c|Cwy 65f,c]oB_Ȍ嬫th 0r"J Wр.܊k8ߥN Ҍ')IK8i=~1 <8rK9NJ֢8m- sIY1M~5۪ vMSXl%^9\oTŢs\^n(CGlF"J|`*Sp)yX"=<(1/u4,բ4Sd6ƚ̧(ִ6@xt^.Y;_twFʐD }cJUt7o$PICZR`]Օ 9!S_$DU}( uO%Z<&txH )Ǽ#9}oRjvn,MDp]n`-c,BZ^#OKʼn`;xjmR ]Rupx\qMboJֆ/&; ?` v0.H#'fC'-:kU߈^&VAHpC"; WѫR(ź"Ѝ_` Ӕ16L-(#/7z7R{N̓*c3DwUr|4!v?(!mY9 endstream endobj 278 0 obj << /Type /Page /Contents 279 0 R /Resources 277 0 R /MediaBox [0 0 612 792] /Parent 280 0 R >> endobj 277 0 obj << /Font << /F17 5 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 283 0 obj << /Length 1316 /Filter /FlateDecode >> stream xڭWKs6W((#8i:}Kr`,a+DOwI IӔ"Ň}`erL_]Rx!+M*%Oogog΀ +ZQMVdo)лkJP(,-ٟc{`LͲ(//q\-90.$+fZ񈂴oFI+;Id ʰe-U`kA<8e0(T⍔<`3pf/̘qA"(kGk=6Zۉ7e6M1)clZ]ωNLw4}:7^u@˵{jh@0v>*grU?v#D1}jqݮHE.N< qjC=fy6jq߮3{埛 4]+\46}DWfסOf'v .@'}\76 q0!ŏLnޕۇVgq+/`DaF0S78L= G0.zA'D:Ԡ版ɛWGIrU g̚{9NsSfDVB/qd L7BS{]1!1 CH̪SwxĞsOt=y8 ORsq4Nx} euMy؊}>FP /s'5F/XCM4m䪕ggPFd~enG( +֊ܟ8Uk(8c$ᢦz!scF$14{fEF5ƌ턶wW}J7#<`xVفis̀gӽ]q[=.<(nkGMCx~XZAP- `\XpZ"Ҵ8~9?Uhe^ I=x)4V}um_v endstream endobj 282 0 obj << /Type /Page /Contents 283 0 R /Resources 281 0 R /MediaBox [0 0 612 792] /Parent 280 0 R >> endobj 281 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 284 0 obj [546.7 492.9 510.4 505.6 612.3 361.7 429.7 553.2 317.1 939.8 644.7 513.5 534.8 474.4 479.5 491.3 383.7] endobj 285 0 obj [500] endobj 286 0 obj [600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3] endobj 287 0 obj [777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500] endobj 288 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 289 0 obj [611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 351.8 351.8 351.8 935.2 578.7 578.7 935.2 896.3 850.9 870.4 915.7 818.5 786.1 941.7 896.3 442.6 624.1 928.7 753.7 1090.7 896.3 935.2 818.5 935.2 883.3 675.9 870.4 896.3 896.3 1220.4 896.3 896.3 740.7 351.8 611.1 351.8 611.1 351.8 351.8 611.1 675.9 546.3 675.9 546.3 384.3 611.1 675.9 351.8 384.3 643.5 351.8 1000 675.9 611.1 675.9 643.5 481.5 488 481.5 675.9 643.5 870.4 643.5 643.5 546.3] endobj 290 0 obj [562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6 408.9] endobj 291 0 obj [580 591.1 624.4 557.8 535.6 641.1 613.3 302.2 424.4 635.6 513.3 746.7 613.3 635.6 557.8 635.6 602.2 457.8 591.1 613.3] endobj 292 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 293 0 obj [277.8 277.8 319.4 777.8 472.2 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.4 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1 516.7 461.1 683.3 461.1 461.1 434.7] endobj 294 0 obj [575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.5 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1] endobj 295 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500] endobj 296 0 obj [569.5] endobj 297 0 obj [531.3] endobj 298 0 obj [326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544] endobj 299 0 obj [562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8 500] endobj 300 0 obj [706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9] endobj 301 0 obj << /Length1 2062 /Length2 15938 /Length3 0 /Length 17183 /Filter /FlateDecode >> stream xڌsT  gnɶlζmTmd]Sۍ}kjljk QT67J۹330DE4LL LL,p.6(ԁNΖv<u|Č\> 26fV33'?N<1#7KS<@ G!jdin?*j377'ݟa[@hbob tT|..< F NtwK 24A`d @/!49ڙ*r@23G K?LLm<-f6@g 9:F6FnF6FnV}03fq;SQ{[[3Y:M>p,Lafg C`gbb@ ?z:T2!`04~v6r\\V/cfZvpDw0}3鏟>}l?QQAUJToU{9,Lff6ǃoO+=/7ﳡo}Y]&v&_OGIGodki>|܆Dž_S _-bocu.F"lgn6Z:KXzM-]L,ZL#P>n1?Uߔv&܍<>FGj s v..r3{'?&`C08 .?(_`}D}D/bX+Q忈俈CgboѴH 3GE1(_]ab/`zm??n&v!ۇ?Ju(_e3O? to>zO>. |Tn/]? ~dW2Ta WzW'O?K'4[Y7 |w?⟧8Ƞ^qr}AN :ڇ'Nu/J:=YϫAA tOABXzUC7G@k6o\HO kaJ5sj1%?(pH\ ahЮ<?̣N&I=e-f{^ڨTeq%!G9N^.-_ጌY HZU%Sq ) A'u7rQ7VP~"n(4K&-5&~##TI5N{vC{4eK۝ Xa4+)jIknR%W\y9[gwC#UO&/c󷢞QZ{nwf:ill- [g50S3AAr5 3srT,|C$}5?Jb/rFh0-vL}rssT&}%{M^>Aj+J]%:Id=‹=ˠ,@}FN`jq]Mv% )wǧ$-wm mTB[LY:jԥAǫG;27G,1# .,J*giENA6Yڨ;/A ;| s  X! M>ԏIC.̈́ <;A 0 XJ#ٲZgS)Dq'VcĹ@US"Fۅ(A:qFifкǩL'DFT_^尭PIl7Y::Ɲv}ϪA$xWh~adLuGo_Q|b95_ot5́T,13$K!8 3;~Gy޼8OǝGSQGb)UIԮ Wװ^O):$iw׎ɘ;V'ji9mxPk|3*zr{'/O%Ŕ3!W,PQ=Tw_ qĶGRF3Pj\ OD_qvtN Ɠ1a~P"Qaɸ-9#!f s;.l{}CrJFɄ}Tw:I)OYوچ梽 B׉߇=U!l6f*U,.C̊6%lggh6SߣxŖЪ b0ܨt8 ,PpЍịG few-b_pz QhB*1?qV]4'f8>ºXeg^Devg GmO6>Aٺ]zsWo끰 $i,1^[  =1IGL*X eٚs }_e:(I`烈G.V0^!t;W-B/"3?."%t-3!QrACeB\^@ F*H)pyud[z DqQen @滜T2?_~ޤ*4̒Ve ɴ?~O^Yd u DEL#|eQD` sKXg|b:/ɍ#0lmDs Esb^eM']n.E[QS'(RrbQmIg>2R. j1b|as41$AYMRe>EgK̓V2Rgr )ʖBA7)ͳn@zK. J@s`qO|$%y~/Ҝc06)_VS\f M=tYo |Rh>^Syl:^RjNevΦ;"K: @'k\>PGqaDx&[5"NZb;{VY}߭:yN 35^\\%(ۤ((pb-uD B5 xWDg}KRPF`?Xѫ$]$N:7+`ڕJYXD%vȯcVaƪ5HcO6~5c3&; Y>EL;4:r# Wok=іAȉwNіqc<{F3xέ RJE8ga˘#d nP3j*#2tzCsVsmc"GJQM,3V~Kr3:V9HTߓC1p.;@n ЍRF$<=D Yt;PBqcS/y&>u]NJ uAU9\a7~!6QòӨp.=Do68[%ReRwi/ 7 Z ۓfz/,oa4׃)D= ӌq:r(([Tna$"S;QrrM)ɘgR\\u&'~  o&8}Y9hXCWEDMq8>E8xu [4]P`\gE']xhi=`^6}z/wC~.f,ݗ: {+y~-D}`0JY* {chc-pIw1zO|K 7: S ARHccXuQ\`QNT3!fTdTMw1 AkA2Z(vpb./Ttb1'@wmA@Р6pcN^Y QMGY6=@vYgEL*3zQQJ&I~?dm}wZDޜtڠۼBԙEN6;y!Gfcjaj& :3h}{EZ[ 64I_d 3&h_h sp>ڊs&`Q-V[%7Vz=pE~n)`ڻP?[Y/[lUI歉_&_^  TPnN+r/Q`rr {܏?㆝^'A;kؔX/f5&aɈ a'\w/H0{*g[YGۨbcIP\0g0} Jz|?&fͲv` TThu/ȊΙ|<:Na>&:iCdŠ -W|JJ%'Wm5Q۩ TUʡ&n~7]h%yWf,ϥt w_|]z!VU^~pdѕNi_9+$2by,@ c`QыFgylО™}TY ;vDFJh3xyq%݈6.YZf>f GEfE۫d‡3K_?:sAoͨ?EMW|Q-8sJ@r#M6z]+gLdT&Zqje5%AC,5KRo[cKh er<֠Ɛ#ID dRpc_:I#uX47p{;/in%aռrBSz<@~2La0ҥ) Uyg~oXXpW猉%˜˓Ɯ1rtTgc5b2&[;V塩9D&m _*c3JBEH?v0*ق =q֣LYj}{ާ(wyin4wh[qble}ݓpoS3]E L6[ad. /_i1 DʧZ.!OO%c)Ӛ^9'+Kw$Uή3I +N8u6k2 ?~>wXlȶRbB,E6ٴ8_׾{n48/@H4/.{;M,ao!"N_daA($:CsPīMmf(MˎMf+XWI]eK[;k;MME;ܡ46#e?6v8#xXQO$_岺Hrenc)4^rLsɫV' & IO\2qmqkyB-^]t7ZzƻU9 T%*5,AA#~uUwO㵪-~_ Ybwf"|!geLҕ L6׾zf޴<؋MˈCJ{) *ֿ,,Fy }xIwӉe,}iӆ)[?N N1 !-wDү3^Z{}?sz<[iAQTH] it]HFL 朜E F SBAGtcl&*P@h'M* [dxF12C2WzD@L0!f^ȯ3 _m謽f0w<+{}`wd·w+۸l""erG<& *qtY$7vOx1\'Ȭi\btCݔO:w;P.[Ux.~5#b艉չ2mA ,*{)Ȋ9&YI #%ILT;!HLyUޱ>28T32sVhaAuCAuX;p"ШCӯ wա)]7)_6Y\Z*DLcRhP(. }fGxgyjF~(8{zo,sؤv0{{2\oo,w=:&(1ðfm h;=Uҫh#cL_{#v?)/7IಮPqzxk&؈2|tm,S1SFtMRoO Bf{ɻv{ &q qr?HHcVǗFHcj=~L[uPn1F$~֯wXᗉn'H=.NXeS TaNuJrʇ3d*+^%JR@v= ҿVqlUQZock E*C-V>v2gspABK£g]A >bg.Ԃg^)jIw*tA]Hn-XC EQ2O '$OK2Ũ͛LO߾ ̰PA%gw VOV]FN$3꽒$S49w'hpGOxJѶS[ })6NBbnUkN񟭶"=k- h{%VJzk$UvqW Hdr8h]mVi~G-.2s+: e"4(x0>e65K|4*Ow! _=Cxf|[)C,)gЩ*,j!ѸX{gK{?۱ W suMcݩr f)1͎y/"-\w('pϛ}SH. (cW.QXTEu%.80/9qV"&CYZ W$Bby߼8Ψ9LaXsƂE>qFlS}v|Qw_Q@ z6^OlթFTtRi^,֖eod1'-( +© MSW+(9:S_[h$F -pivK^Iq-"RLѲ6!ə ݇|z*(1i 1<"NBAQB'D֏WH$KJpeGƻ h<) R[ g4y.M?ȢbgQqqk(M~we;uz5{hMRI,Eܟ2Ȅh+;s+X,y)KV ;76n{dA Qu0Ŕt Z6IԖIN?T lt(ϠIFWs;X'(O&tYCY%{_43_s6jδ*)hxbkGRAD̹[3X8ks?:A5Dkܕ|^?D(["!vu$4d}^ )xZn@qM"98Y˪Ce<{'~zZeYlB]VMۧ"ȻcW K+oу[+~VJsiM_ePfxX/밄%NI[T-NbeـcW1x= ۯ5Jx`8Y1z(ڷb-ӟi| ;S8}k i5](a e}j[kxzס H9/1Vf.=b]ϞKͲɖ!318h2)}C$#dq֦ܹm+*$@a~V _ l5pXfC3,Гsr>A?L~A)]&{"_یn#6sB+u;cZSl-RmBX vX'|+v=hv 1ZMNޖ/s 60cnY6j =×f7ů]1 @ےQu!Nv;VV -VN,mZNy݊tA8͈o7u9҃hષ="E ;-е5R-+EP+{ 5cWzÝoVu6Ȫju ~"x@z㬇~H'l+rYا=yC [V~hjMUM(6&&'yl]lT^@vu%iʗqvQG Bׅt[Nxf0|0ܤS*kĦmUH/䵧#v[E!6XtRS"|\jBkn7Kf3Ľ8bmmJEp&=}wThs5iBћ?Me)ݽؚ ݠ~Pɺ-^4QW"C*;\q c4el5^JM򕱝dvvӄҞ  [dHiُљI_4C| gJ+:5^J_~Xza645W4-igj&eżA'NXn(߼jT~]aFqmMO!gJ`k̾PtM \o U'G3ڳFWC%0 Jx[פk7/k0TE/H(%7Ũ,0>Rh9-C&`e( $ iu+Ŀ{<zV)xcءle7{>M+I Di< {ŋHE6iN'r&mq,3V&P=QgxK({@z:VxPx::ږ=skm\#`̌WO,HS321D,k*A^_Rhם~j[ˬsVa[$eHsVv}vHKS@b(t2̧SnB?r#aQts9{+W$^64*ˢ>9\@A~DN1{!T)Xi):{c+hu4čKZJ|iXQg9UP !|v zoR ld GʤJO OpVX&^ؿk M'b+ϛa t2ЙB(Xf=)^#ɥPHOnZHSUk&k_Jj!m?Vt}z}Wz LPe4أp)~ljMvg[`wfqDBgB [)Ѵ6i6m͹rt`m0 -%p z禖 05vGF$F`z:{:<FLWu;Y5)T1umN(=rűr,ոPuXzm!wlPIO"v+5[v}8̻*n`sf2J!ߩ&+T 8S2j^L9NIZ'&π]ٖӑ@K ʥ$díVd3E'Mb)UGJHD@PSbO{f3_" R̩t4Nw}I-)2W{J!AXD)¼&"x{SPdksА*eהB{T%.5qZ *RQ% e}&4:뮵b^_]%l_ZήuG5`z#in y-G AE&QS/_\j#\Y:3r(B5q#<膣$oTvL}*LkG5!㜞|eP5~<~~Ẍ́(1kr磭"IB;1N%X2}Lua!q1 IRJ8V@T/Y`iu ߪ jD$zGD^:$kSA1".Y3CGTg,R+%W:WzA'hZ>\TLfPfvR<"@'C" KNLj ὑAV6ȟa`]ޖh88޸*) 6@_MPKEm\g&t;!!.}u5R>-_ +XqOb7mr!$A!KAªk iz5s>.E%s\=k0g>[][bx#Jm)k4;,ģ?2eӊ- '& F.q+ l7MܦM<3xr>pm3{"ei?I 6Y5 li<7]ʨ N.ϐP!ݱY GUZ}Pߧv_qF}TsH^1Q1aZX7M->xXq|TSɂK|/ ǒ9ўh/QxRNGC-Tm6y Y jԾo4S1"\v.a={?243,"lLԇD[45g)Upxj #d㌭1]Mm~HL*E1sӇgL8tD._pߵ#N͒e*y`jP'z H;eR  PB>s글눊FW~/As/qDt>ٞ(P ?HNYNct ƂF27*&JO(QMmlwl1GU~-g@ n},-\L̥3f ># G.}4;xx',^ӟO_is7;%17ONіRQ&r07,>F4VevVG%vf2`@謃.UC)7Sz5L&%RTLUɧ;;5au]8|"%cSjl54ᬺ=D͂Sy2'K &_" G)a%_V$z͊T"T"l|mŀ?Ao܈ Yi i~k[D:y2=Mj^WviRa 8fj mEI73!/2k1M+и#Q;.5.Q18z'`S+v>$!ìE;(7M/8*6@P!7m&lLSã _ n$T鷂Y8,> f6[2h`j9Jf3+sQI3dJW51-V;`n'9DάE+Y-\:3v *x/χku"IЩ0Ncn T_;8EՋ8xg{C18~P̷7%2o hFFWaK, sh*mug~XMciu~bYDIfT{.RX[HFomf!9wSJO HoV/H-31_iEaA> endobj 303 0 obj << /Length1 2135 /Length2 14557 /Length3 0 /Length 15827 /Filter /FlateDecode >> stream xڍT%z gkqɶݮvmLdۓo߆_SMпZ]"lgn6Z:KXzL,]L,D{pK;_oQq~*IoJq;{ӿntrz"0/+HMA6N`fD99L8L"I0A<&".f `L{?=AzϠ_AzϠgP/y cA1M8u&6 0@kb3Kxwuû? ;}T|'c ǻC:^?X'_Gwsgޫq:*{34a`rput\d}{|g'{@N ?c~[@ y{!mk vf(w5Si]Q`i36{Vwĩo?-x7Æ$)><&L",NbL 2}yqlqtFQ'Q_26W)\6X:E-r"]R'UdFd0C^Kڹ_625{h(Z3gM)2|h݁SUS"qn7Ą75SAI0arO l>oCUoւ1SV2^(o ߎM >!Al.8,邦bӭxeFd"YUjtg Vȃه|. R">7+ONF<41M.< 2p,ZU>";g*gL`a\%OUÓ>!k q¥ƫPL!CǪ"o.UսrṞ"Wޖh!ƴ޹aN{OYa+C4R0ef%[ƛzx\bk\i\-Jc炦Ɨr[f }q4@wu"b(R[!fۑ*t U慘m%Ac2eR :=_?s1Cve6|d{.38MvER$B5I8ri.\ n[s>rC&ON }Hxm|pmX]ڗSHv#?3h~ K|+2@Z2շ4ݙLpD:IFzSҹ-\ק;jLJm`d/¤X!P]6,PtԘz_x1x\ǂPAH̠b/އ>\쇥h)Ӑ1cgG81>i6SD-M6坴4Oz}ge4T%w͛`qco$}Ad3ԌPPNRzq/#1v= G'{ g_^ʯʠ|\] Nd6al8Wm{Y,`Nɥ'7:gBcJ:0 1Ϝ- _x,Ļ <~RrkAr`] ifԈŖw@[mI!x^m%&l`$tKnky\6(W7hsp[jR00'Dh_EQat$+KV54n#s@{:m_"O' C[19M-g)Ѱט):h~vpƩP[䈮\>+ c|q0z` jE-=OVMA4 +¤pX4kHH*]}lk uQ ǘ5/JwOtNUB/<@F^G^(8\*@^$K &Qe8 eјh{PZPir2,6xO&Yr ՞ǖZh@XgלV)DMD0xh¤9ه[ w]ޤ,M$0)f*j:ZpXJƷ a~RJ{3#w&씍A#Q2F) 3} <đ[5SdE] P+֫W3ԃڝ\Tʛ=լm[>n~:AZ bBZJiSozɫD9< ./t8s^f(y,h39k3Yb!|/h㣆1ҜUm#[ v /*LiN%)s` C W:]JcC ENBCJaq &XʢV$} ?/uBMah XX._-,:LR خㆵJ/Jyc: տR$x"jp~Z0{/P2TD5,ju\D}L-uy+`U Z=M,հUvR=Y1pUf<쏐A3zU&6j<&J{}ʀȽMBFOv{ȯ=]*<5jHyT#7oqoV]%H'8!o˟%~nʀTFQodE猬k }m\=Üؚ>x$'M Y!]Eg V#)7NP(,罔}&҂nr|w_<?ɚ{&; =5å WH D/Ć޵rIN$C>8W8Z' D3tXb֤tϫI![T>M[6O{A􌜇Q:Ѓ=Dѧ=_FݽMazHfw צ}!2iz#-wpTߨ,AVFWteh=g QjȺCo=+1fsR4z=脠P08tWgZc ic`pY{ fSx ~ hhu"~*\Z>HǢ1~IVm3xasƷ8YD@OK˩Qf+ 6gs(%TݶјY6#\Q2@Ȩըiq21⇚cG©C}:c8":۲zurP%GĹ3j1o-mF,+K @Rmv,z[n nhoqǩ%{*5L)i@ GT3NCMoűaQ:USp/)ȹ_[V8%u~^rގz`*4Q^ 2rkV &5LMM@ c=*1C(aQ lSuoCwдkqX@*LRư@oϻ sqJ%`^7(ܼt[m+c.u4ǀJ\y^^R{_+D$96!5o}B<߱߰7FE,Q$VFIS%KW BZ֏  yqAκ˛_i.qJ}`ؖ])mUz.&&w$ɪZQ:K# -4@U!m <GJVL|ɟhX@"$uJ,ԃ bڭwPL: c.)F1C )_΁lzW]^O;zi$~Fyrd'? F$g+a/C:S CӤ)n04'ZȿG4\…PMS[ĿiR.Y;Bw7Tϊ]!ccH)v3wpYMQP>QV:u+|([X#>VC$ io' VutIx/ce `| 9&qtTc)UsF‰sw]uwaardvQߦWgR˒22Tƣ]^s%L٥˻jg" #wmXwe%o32ƹ.PS8kt'&[h{3{VQmLߣQ5GΏ$l#F\q~Zt{*䒿5\#M;Ii]7Wn;iO}Wn3Wעر99Zk;K`3=^inF$hnt/)2t,L?M5%9{cjCJ~';gcpFCK`'CN^B'I"cY)w7n;&}dM9@U|SM-J~΀~q[iZSN#gll5cg}*7'-xC_ ͶhmlَtD%7!i 74O)QP4r66XMc_P$0}L{+Z86;Ld"UЈ_U\ 4mU CȚ<r9T/`SGF\D#%,XFf.T|P |H.]I1C`u*)İ)ot4 W rI(r(Sq+iTbC ]Zq-"CO|վ4.(1" cO:y@^n?txS^Ⅱ9|%BChh3b;ft8WZ=ګQ-ov֬|"܁7hOq2h5p8%R EK}kN<r~eg B4ZX> g0H<4߇فUvֵ)ybݣoIBQ{GA\F&z>>2@sEl_HC5.i;YZ[ dLx”g9ӆ ^]J&+mDn_f>ɡ}/4M8 94g([(33=0r<ӗ 7~BlO(]NrZVkl|a: 比08@Ov{ |ބ֊Q^5$0ƐdT\o^+WQyZ8ͣOM {f܎bcʶK{k O)dC9oko.Z1'ĸ#)3~3Zfⶍo't8GxCB 0]u^j'9.DMc̉XCiF%"GCDJI͛0 TB},zM"ZY hpts3Y}DSIH*lSi'ľ8Okk#ÿ 5<~:oGg &D=e\!Wsз[C܃U:z2I Mԙ\C1}gMv91Ժ_)/? g+L0Lh;άf7Myl3x(5/o߈?s'Sln/1Gv<Kh;T=}ғ.~^ɶCi) Ck% ӥ|6/^q&^L aq9,ZH)VTpC&&5;oǦƂ^ʪh\Z8LbNwX[1<z4J~mf dϊiht5տr?%YkJe4ŮevH8ARVV厬 cw5+[ЦҞg2ۙWa_dUr0<|:WsUռQdf3=>F"<_nB)މ&&p<$RyI$]Jvw!ЙJkrO^j&)}Ħ .;MC($3w/s0I قnqa~~m<|a8ӢB,ѾF3tm9}d4R^v>.8ܯQ,Ձ7^92ԩϾ2=2`[?F$Йj40PbGӝx[`v'L=zG[{DZ=nD- S$%h02xJGfZ8T+lw؇߆׫a!M sHH\O}Dye6-B+3PdT%ppB)V8'q*Őб+Ɇf )./KYCGA \(3l6'YNL  2Eg]+#$dp{eUN~MZ. 5+";bd7̤ܩXe'H5bϯX38eT𲻈oc:ٙ!/?7~𥥷'lHI$1:/ޞY(vf$f ' eqPP5? ;:-šN/m ۦޫ[-߲n"BG&g+eԾ82HCZ"myҳT^@q6ߠ:lg4WHQs󃯺f(' q8'҈DS `ڛZT/x pqճjbJykMJ ˬ_uvzWpy-11=:d?\c'̹s_K$̹~imJZGF0˩)8JYO0Ǐ>}kA,Nd(Vss$D"F%l#^xa% A..jju:ZsbFGov%?/^zvM3*kkS8xLa/h yE:F7s(3MəiU$/9 sq9OkC}=ȭlEK~d`=ya%dGzx&!oDExP^jB؂A4].HZ(\\(q-ú#dž09kaοA( EW]ʑ^UgԛHbW0-Qoxڬ"(F.l&s0-/E 70_~3!q3JN|M*+1R+ssÐ];xvxݸnTO 8v= ܤzk:YzL r+ O2Ho=8ሥM7 b.?dr϶,%{T=Zu.S֛-N=,9@&B+0࿦ dTt~ݒ?1,rĠlb.׬kܙӜD*ڱ|7;֑vݘj T#H֮ ^dL#6R.$T? #ᴿyMW3"Ȩg*QŲPk|x.^E|TTN:Uޖ^IMJ #(Agh' !AhmL#4wߤ;a'u=*oLNYhm!4Dol9O/ˑ{ZDUY큕S b 6%LGr|~?PۍHR pFLsr US);N .,:Z|3:?F=R`dݍ=? 7_W g̨t'(Kb8~h͑Ǝ iTnK]B'/ A.We+#LqZ,QUśSdiN׬⤆W v9e8*K_u1J-+ ոmS!"Q::7QovG@TEL8,"R+GZRPGs=ak&o#{A*9Pu>Taj I5G+zTrE]*Vu&C%u,.w߬s+*p8~J qoܧItUC mBnYL!%DZciݤ̗½FvroD'/.2ܗٹگ_p7-hnUrPuV@Qӎ;b{D-pV܃bo (rXawd(f{SWt8/^ SjaqEiC3߸Sĉnf`#bj/؍kÙT7kan (`rΰ;7IPdϔ!S=OcS 85Tv4AL/M2< |Umt^jAu]I研w/Ut5+6PP,cޓBNPRN]T &Ub=v%fv?萗LG@*iTF}+V=U=J%׋COq88ISͽo\h2&'iFofUwr{N\ ;Ti\Q]4)y*PWΞ10v.,'cAnvE(.yw9:EtG I|ǹӷhb8R9Wl&zMNEYL4Q^:sI{x0u iM#*M# IwȲ:)!Ƙ&Kx)SSeR9j I(&E9% )G]~WyÜt=;M9?ňsIDUZ29i x FQ{a}šfw ( NCjh.f-3['_W34.Iu*<< kG({^U]^_q#7("a$IE9nhKw[ 9#Q$GlDW f< }Z5r`>bY ѵ!$eRNw<\DR6S,atҜ{wjmB= u,Hc_֎*Ec{>(GvNjWyB;9g""Gwێ&kjdۖ }`*'M#}uU[0Lbpe'Dod<(gR$,Td"G1ˬ`{8.,d66pS#:|F Ztd1U(RE3ZQ7~:*|OIy]]H2rݲa=6NQ%=D)%j>71|b}ci^άJt-0ߓ{[y 2k{L M #'&7hQrEDUi_]BvcZO󉜄\Yl4ە "0u?7e*P#Ev$מf5JtmPTʘh$ E.#?bjMӛ& Ts0\YL5oI6*c^ЏvZvPVb h'c0.s'r ; &P,`N= kL- ƙc,9Hp ◦wc%_VֆT49 3{|`xYٴR:L:?gvo j#ZBDcU`G7[fABb/[z [[fjRx(% 9K'&$ar(D<'zA|N΅E/V9ƺÄ\D{h /^bq{Щ6,<2 .+{{L %=khc@sO=F;~.+FŠdx9]sΨ=.&xoEM4zoܕLRc2bMdwZZ^dg7ˑ#E u3!TH=&1pW&2h³Yg=@nOfqwf0= ܯdy}U/&B.Q6N+FWhllmt82'}I^2"~!^jQim&Ѹ zjO4NR݀EW_-a|R!B8s-cϻz|_BS2Pդ!iV@5XN;yT~wd0$XTV8EW)ܮC*=X}D S2Fv6qc=<1׾89\vԡd;>/4;Nc,|1^uRғutIƶkM^vC66yigvhUɘ.< |e`[W{u\A9XcMMyl<4 gUFX ˵KSU5xU/#Y^ng~gcYwXa3(z.48*mgVʴ.c=֖;]%rB͠|Ģ;>BLQ} oWz(,NHtrFXECЈR`~M&GFrU3di [7OIs*+Hp[- YOX$3lj>;Ld}?$Z+`9qYDd+Vb٘Vr/Ҟycb_$yƓdkfp5YukS=rD0.TST +'tA2Fݒ.x'ZG~At 3es낔'=y lcVc;b@# endstream endobj 304 0 obj << /Type /FontDescriptor /FontName /XBYENY+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/E/F/H/I/L/M/N/O/P/R/S/a/b/c/colon/d/e/eight/f/five/four/g/h/i/k/l/m/n/nine/o/one/p/q/r/s/seven/six/slash/t/three/two/u/x/y/z/zero) /FontFile 303 0 R >> endobj 305 0 obj << /Length1 1656 /Length2 9126 /Length3 0 /Length 10181 /Filter /FlateDecode >> stream xڍT6Lw H ) 3C%%tHHH#ݍH# ~{[y~vSkhK- P7vn.,7^fWAvq8BEȺn29#S PqpDE<\\]Dr@P8BN^.k@LnaaAi l-mGK\0ٸ9przxxp\9]%7ƁAбvr{%h]ʪN`_dտlֿAN@j ؃/T9<@(hh!@G܁iMĿ tt8rBc YG0W~rc8_;_h~rwԅBrEY\B|\<3ii+ ?'G'c!`?\~>*aps@K7G1/8.O1r~}=>j[VP~B8z|<\n.AAہ-BP+Gxl?W!g ` psY>~q?/ooߌ8n &Zk50Ze7HC%U i@,mѽ= ptzx\\{\=KR]M䡖_+/0?ut{4<rtuBN_0_+?N 8|N? ?p:>!'t>u>u>u 8ꢥcc_90l4h)j[~U+̃}k\ (ʀ}%[D K} /m;erWN}6Q5x]S)ZSYM$}W*C)RAׅ. צe]L` z ֮U6[\X`]˭bPg)c޺C\FIdz&skD}A*cp7|yAr9>υ8wyL EB}P9/ EoVĤO9L> %})8B}* }*&a%hhQ!:tc^!N5Wpy/%{h@}dl:6+x\T7K(+o̱cz=Tr&CG[t4vEkD,څwjITs`BxR9+0{Cbd5!-Z NO7w fa* !sA ۳mIS0@Sm[ߣTEI`.keVBc0 !TH׬|wR6k&s,6l阚?LuJ:={k_PJKie⫹&䥖|^7ngh2itC|KZFVcg/lUF,W>;JGA.IG &n>V:Rz%wi8l;Z%l2xjⵎKx-C-3~F #d4I$;iGQ|A&D{@vԏg3Q#=mEgI0 gP$u/#%2%I+QIU"{ q~z/g#v.S˭g.ay߮o.PC#XOzV̔jI؎FDȣ_fEZyAL`ƒǴ=- Ϛ+ӃgVw!/{+AT@5Vf.u ܸS {**~cy-Z}5ڌm*VitLz95֙AnP[G_M/J v/F0IϪ[M܆}P!xW;B?srFH=MgK}uǾvwϺPYf>̟G`]PuC𲪂q~X-"Hr3~y;o G4{cj鄋m>pى|D<岑e>t[5=-׵\-9sنT] ]_{IK ;\RxQ,B!#fVw'jD[S,T}st)1 G̖i7#`! ˚4>GI(O ?Y "v O;gQٵ*\ -Olu}SQ%ߎ, V<0huΩlrb#TNWEžUJEΠ 9{*h:&`PGh[Xڃ72^ф5Sf ]^<]Ѝ+G (6ܷ" Us!!Eh 'dxoT!WW̟2"*gX Z4 w'3cZz l }60{@ )ٻn߸kT5~~f_E>371ۏPH=JL9KQ^1!{sAͼX[S%pd`BXck1.&I ~5k}ߣ9T/J<{! ce7k&Jjӻc YPjk{JekҶ|\DR{+yt}iYjpqvnQ1%yex\_r >aM/ WDH)XSg`x'ҫ-vVO(9HXz䖗Ph 6f:ͽ`{8)}=]]ƎK\dḰu#nBu?ȱ,N5o~>Gɭc㝢\ְz:nu)g-ϳ&I(7+ ח9!R.A_6,^Տ~xTw `! CjH'wC-QC*>9krf}{;.OJ_7_*_(YkO_ [1L@B~Zo _cEtpPLRVyuNU]HS}n l&+xQӾ)UZ"b-PVNVֽ_]S..3EEB>Kj;)5.u'IB.Ԓ\䤌Uw; !B>`Duzص@BXkt8T;c88&~Zȱ6^ES=DGOY$0AC؎lI;ԥt&yv>uMryY|} lX<5t?V/rKGyoi^r;MHEKS ^\ Z*F V1,k{i1Lk BNORאkYcEN.č9=%}Ũ &%-:pARDHfGyoE|P̏09)}Žpإ:8Xt~_6jeMr.Q'/~]ChbKU9fm"Ǔ)GX+qW,?O 9XfaTCxXQ|y$^'xqqGaAxᬬsD ,XxiNHP|#kr^1*d%Pd50LVԚ!&e]|Zƃa|SNqy\A^.+̼NwPL4m4M+c0nArϱڶ#^V렵T"fs.((J 1>UQ-ŻtUY8h*ZFWwfsG<t;Ҙ! X":#>a Wu(uJý!~, 4`W7W }/+2u( wtٴ¯1Xw{JF6~݇/D lBV~1-E\㝅uuoldn]d0f| w2cYb*1Iqʌ]aug-*?O!6ɴ WNq<&%M"4( lgh#D(I vr㐙 1^:^1y24DsϚ"-Ȍ4&V _ f< SW-LqkN"r4q ܒ@LZA)LѣMkУTSw7|r-!d»M!qK~IlT;\qj'aħ2 }^H%hC\좱9VgpH04 L8a3R1JU{m𵏌^$Yؓt@gEsӼьŬGֲ1c{|ênroWKC2oyb N $QN% #_Vx']3_:Ѩ@~lk/.MP]g߾](ZAMyyJ❭zbI5I)f͏ϒTLLN_(4ظ;I؈>2/0ƿ40c_%Dpz݁a&[D?EIǦ$=b[X[!el_GY$&ca%I @wb׉UܔI Q;yQ+&K~ zKN%l*js )ixLxϞ6KWNFŽ~?WJ9u.KieA+~7RgC rh8(9oJN4 㯉I,xғxra K:C[Qo."..C?8ᤅkXg (d9J4nl۳gcϙ Qn $ Ap6=_6@|KW`ճ٢X9XFsyOzc,k:L?|E .=-se6l}Kt#Xw-3stA;z%].rSAhٌ\%r;'[s,"r3 Zayĩ2Iq6P 0TŊ2%9VfC4X$9 O2Pp@nN|(}u2'i]eZ7Qj>W:#hqF[TO0[2ʀKsxw-ɐf`v%'l*OvCةfK<>%3j;$/KLarg+I|f7Aԛy3NW",| Z)]ýNPN t1YA %5Y J}N9W: 'joX뱃[>&aTW,I'xed.:ndVD* $2d'N$o_rz`RsԿ}FER5~gȦ:Cdqj~jzNYͦ+5,*1%̦LNPfԟ2e71`·( B_834?/t%իEVI{keQC2D4gW7y9j :RDR=FVO85%kE0/|է&!]Fۛs=8tBQw 6݇pj3"IGk@Hz«Zu}6 ֫6(ADk *|.S^g,Kٺ3u.ee/e$5ÍbGx=jr mJ*9YϓҌbOnyZ`WdY?Ŕ~!~(2wU%B2kXu~&@S' 9419>/anHMk9Nۯ ybX|N꽱q,3jlpkib$k);ֲiEq&_UX7-O^ѺxQL~ҿ'q (-RHVO]Oѫ  -{Ai1(Y˅ݠƊGBBۓd>\Y;^MsVE+;7xۊO@_05kYa))PK״ *LpA6Ο^#^$ uZ89; 6H_~V_Ib8hYq3YCRkUssVN<77]1U?q/zgH9)+Du:8:Uj*׷LptIgU{F% ]<}q@YIo5m-FS{wGjDfAyڼkݶE{07$OYm6J éZtSios< S]V,濉p. VvfCu{# ̙b<CX"YW<=˓GWzL玥 RU)crI9po6U۬61I|3|١䲋NR15mnD(W88@VZ :v{VY#3(*) 5Sc3_/ݔ7kǢkv^FHQ)1#A`Gqlj)/@] )LHueVWMaṒ DAC6lb$NJ;9Lţdh8} oHԞL#PS;5!6b#~ÎB^]z HΡQiц4(QN,J*嫦a9K k.Ž<}y.*JzG"$ |[vt&';6+hGN;]ۑ6[6:"z/8{f| MUQ'~o5@r'Rޘ^]BB*mχv+m/{t|%,L<:n[$NfryDc`cƻc&)l4 y<][$8i|Dz)~n!&Ջϸ% w66?\ZO\俭i& j[@uGWVl5'O6&Eܼ<<?V[yOSYPɶZpTi݋OP{dRʁ@M숹A]hD'١6TXGulK,LC9']Go$+ LJXP^CaziA['l9Zqbhn5 AZkʦڶ*+O_۳R[Hw/7Փ1&lAbUi|6mהuE5{e2Rhݺ;mFӏ1ek"W*ңH Kͥ.bP 򌰙ƫ9?1"oCeZ笣Mr= ҧO荌Yk\W;IJk0VE)$mSs*kw[sm q| S駋mhy"2.td3_B2pZV]T &v9BrVLGRWFC ?x>(Xڔ[/cO7+T</ 1/.'{-,nl2-Jd ,Q6\vJ NKNq%2 `\W.m^M~\ٵnX[t^UiH<{.! _t\ofMl4'XlAZܳp΍^cބ-dž O3ځߛ |#G[s"~jۋH;^ɺLF?y m<8ْesUn{LnBT[U5"lN6_\2C=+ӣT<@YKgcD=Ɵ4zn.X3\[\ endstream endobj 306 0 obj << /Type /FontDescriptor /FontName /AFIOOE+CMCSC10 /Flags 4 /FontBBox [14 -250 1077 750] /Ascent 514 /CapHeight 683 /Descent 0 /ItalicAngle 0 /StemV 72 /XHeight 431 /CharSet (/b/c/d/e/g/h/i/j/l/m/n/o/p/r/s/t/u) /FontFile 305 0 R >> endobj 307 0 obj << /Length1 1463 /Length2 2105 /Length3 0 /Length 3034 /Filter /FlateDecode >> stream xڍT 8T}Ŗh9k3ь"ٲ d)3qΘDHH)Y˛5J޲T^"-*%!ky~マK)9Ņx}OĨ@\&=Qs)?A ,h\IE`6 B0'6B l`V8碍_ &@ tf i0@q #:r)ޟeQp aha r@v(fhAn8qE_n  A g{:{BU9 ИC-bAPJpQyPT$7QSA{ԆKCebT% 'Kem- :!hӃ&P j׶0ähHhl6-GyF44D f)`芑/:@e5kP?Lcd=g_F٨ngɃ;o~$@1]86Jl230[I&C`Bpu JםȶpxPE(Y&7q2q›*;Pc4+MR8yf$OƼřBko8)i[]qdbwGMR{1+c>JFj?ncP:>tًFH\q/!upȴ_JfZ7Qy`JԕQ%o=w< 157,boU[e'NF=,ɩBPPddoζi Ӝ +Jbҕ}佷2o,NV31ڎIЍi-Otqэ%"Vn2If퇳j}_Mpf4$,ξڤ6O}jE8rM(+":\\Y{ mC_y<+>5ud-oZAƵ:IHn뮵+ӑQ]IX6mE0^M>Eub8V.mIڢYZ|iTsZ;tv_*vʢ1Yz45K{)q¶٫Mmz'Ut}։\؄goWLf/:U8w||er^/O]-@#Ұwר X-Etd*.Uҕ,y蝊C~?WMnZN6堬-eˮnMsrQq睓T yݪ2&MhX9dt4[N>;O0r5( }+{Ep/\Du/i8UbT^afueEOe>+I!eo rid EXQŗ+SK:y dƧo݊)UV *t0d(J.^_+&$+{Ğv RIk,> ]$?)ϳ]j8PI-kbxcZ~0*L#WxU#۳'T-a3pzQI=mS _*n!GE.о]g@poʮN+4.%S٥JʚKqNo"İP3Ʌ\٨RQ1N{=<g3U&.oBNG¯pQF n/[[[P9}C9Yn%nO/RfQS{^w/Y=]c.{މ|4|&mÛVJ>5]]n궥 D)^h$ڞ{IR vYػq–+" ;w<>ު^:Pη(PC7(*P5UuSLTbI19s/WG.hqmpw mGaݡhp\#- UiQ0ogB pG05?>8:{(\0(/#Dp0`p;X#) - gǩavep)G?'slg1HSEGCG@o^~ / Ep/ȨCw|#qC ?{ g -$0 ǿo -#,+#Gο;GGXrh"q+oWcքU -Gt^ XQ{luXd{pLxpQ`pgㄻ\06A1EO[AI~!a zpIB@onyma8!X\hD~:S[lj!B _?d7q q37Muh5. n@! p ZaxTjɁEn[s<H4Un~9's~lZkT {tR7M,//3̝\m1ǼIԐf|ю N,`۶ivzY>*sV\IҍͺjÊ />Vm1֏9_mۘ<<Juo c'zKYBO',΂^FkvFle-Or\1QlIoZ|9Ory,ӿ{ 4@B-oQN @(Ff\_ߏBf*fFyH}T=1e67P:x혮>%[Z^8.y=Gdd5:m/a+oPxsRHgčF)WDWRz]w)sX /CbNCd`$;=eujr>esa5'O[ ]xL7}j^!"7x򔷵V;/#YbE'[s2 r?!GaLmh4e5 f 0ԃ{";yʕDΪPQB}Iw(%31uI A-lמf{Kŀr*+ CleP~vjX]g{` 5m!A] H0w71NOz +WY[ޞ n58,dA"fM3bg ?j4Q]VsX5E`Clf^hm Rیi/%ta\Y;EWXwF}v6*GF6]ЭMi$HX>&WcmhI4DCz0)M9Orp;Q?w ˍ 5Ԍ_hm;<:fjTWr(Sw$b2dPdq>"i?g{Qv-HkR``_iM[Ÿչ[ 2id"-^jZZUy WB00R5c:}%/Omzђ3a%\>zзw Qn!^ wr ϻ?563zT=_&;뵲Zjs{X°DnBTdN4+ܿgͽ /W1x6|eX=jҒ0{UUX̔(.,_za]$Uҷ?ybS|~QL=X${Cæ +9fҋxe<ι;De9ex3+BW!ޗN~ò_7\P(uT ';X9P %A}0j˱rQ`uVv]b]~'3'{1Ik0( N63zR ѯ>7 |{Tr_hAA|{?VQi70tD1*tl׉8/hO.c\s#MRrXqj<J,hX/l6gN;1d!­KpjmTQrc_̿5_Ao(+u7i&5H1Ò}^CCP^aK/3BKgۤK{ tο3g~6ZQlI淘Gp0JVtgj$*?~|b^sAn c͎<4RY&`ZA)ً7ޔ8oE:XY_927rY ܪtM^U WzմxA#s2= 8ڸ"Wo3綾PyU#^WcCEtSxwFy y Dꍳ MJ>w:-{ '"3ro?}CPT"5vQh -/S!wIGYD%=~Sw!ḏXWW0#sDyB+OP52=#]Vx.b9-cy)1?z7hX3O72$Vnw\RH fe!K 1H*K'P_ {MeNc]].d>7Hx4 vyZ=F>O1e;ZAI78< 4޲x?C[r00b۔*0oܳP/i FRA_.=4اXѫn5uoWO:\9?mӪ,%NcY낌l D%i׎f6kipTbUqL?g'JEEoUEX/ ܕzB±()QXx27|̏bk;UIxi?vM:(2BA>w!jJj;lCZo>ӞR_M2~)AAYĤܠMa,>s)tN^˽6c'e5 @ m|11|VDTυo>?#+O0Fr0+8;["tw%C+'|^}R72b)[NB)geS+P%tuJE6lZ,A0ߔC I*z$ߦu3kM⮄=}3u&9B:}vJH(nE̕r]뭽uKel^{tkYΊ=aҽ'xYd{fT<#n2[I/Ǘ}]SK:1݀uUM`3 /]ZSΒ#e%LCO~kHԩ J,i}|C$!u=P^"h{h k;E(;T,50=/LidװapmLsɕ9R5-DQS?YtK]&sTh-<3#[#aԐӎg$aS2!2_^1>TLlb\doLqPY B}=W| PdW<.4_Ix&I,xqoIgnW[%㩌'q>CvBd>U6{u9[^~}'t"c*;r䣫"ץH DJEŲ;'e\ic\<ǘKe.j)l4=Hܸ]U#iW I<|T6h's1c/PP_tim~NO=G5du3SV E\aŒօd(qv k`m0]Oۃ#+ŏ'GhsEU,w&{^EAƭ;)국g_c\ S; &]iqEaW3˞ mk>˧˞phPfsiLϚmt 蟺*)|}׏3T;P;н-+f~i Y|Sl>5lֵ|W/Ckt[PCvУV:V?6q]=LI( ҜD3pYɼS,>1>hda75 kܴ-+hTڠ4x6w4vE/vxc0{tGy[T5kXŐgdVdy!ۜƙ37k,}$wK(B8RAi34=zYj0:oxp|kDU舶r1 1fc%Ԛk膂7>r7Jx/F^(V$L~O3lG}խX6e:Grp eUQ ^<ʭp8 <2 `/f\;s嫈?blPvkp9C` ŵ6 k/:bk}:Ix+_im:hy;xǑ0ZlSыټ9͔|HYiwً]p1 iA5kLҪn屷Ghm8dGY޼Qfy_lWÐN(]n( ੟3 TCN50>t['8!o\r.)r rD\ci%tcwԷF$;k$\7W1;keJ\~ C?mZ oeoL-Ij>ZQ.Rȋc|1?+~wy_EdQ5soJ$Iw ShкeK7)9g3 c[FN2^T^l%EIjD^TITEƝr"=D3d),; Y'(r|4d9TGgw/\/%i68; X;gmJ[_0^;X%MK5蒰%Jr^y dnpLl . uQ)8g+l8CIţ%#V@_!Z%XҸ>np[M؛l`682F?sZG:(#DJ۩`R$4󋄞cF\=eO[޶,tӞHWICV^]R$:҈G+?w endstream endobj 310 0 obj << /Type /FontDescriptor /FontName /MGPLPB+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/n/x/y) /FontFile 309 0 R >> endobj 311 0 obj << /Length1 1468 /Length2 6963 /Length3 0 /Length 7956 /Filter /FlateDecode >> stream xڍX}6 (RJH8cKrt ݡ4H4HJt 4M}y?;v+1kV%4 K44T` ,@#$ C+FIW+0,.O9 DT ']%P;Q H労a .9!\0@C8N9H_-8Xg ~~>j+@b  Є9! #퐘?~= Hk pC=u3'YO௻@ iWFHb5Bl6HG@KIP_0G Ws!aVߓJr:_0֮Hg,tW-+ h'' !5銰]:( $ n ͙tqC@JH"a @xZjr868? G⃁#XW7m@ 8 B"Q$tǹ6l]` qQ^/"ˣ=>B^a0 Wk8?UP6ho_K3Ƒf`a5V?;; Ü^%BSS#ݜ7!q"Gb6kmIw#Fc>9*0b8Y;>+`FT9Qh/9 `0/!p0-~>+0lЮ$k~/_~"~o_3YM%ۿ'šdzm-j*ZރwnB blr}qJͽZ/C{J'.%1L7Jg(qf!o.jJ`]$֨R]N n}kխ*=w)!d9,*M3EMG‡Y֘ UoX EnQl/>VT z̺$ owi΁DYQvI$_hd١NBrX"l}RsJMo'#zGh zWo 5pd}힗اWZ!&;(<7*CҤ!Q!6SSؿяLangtZLitE,$)'cF>oor%G5'ò70;Alb x?W:|KDA,3'V4mFY"CP1xyy껙J+鍍NM7Nkۓіv&U _UW.ˋ:s}en14(7onfIC7 ?whBx*g 6yK!xZy4FŊk7DxKƠy4hd'ZVAv%:+R]!)>D({L["J6 ~L|0k3XCsIKzWU"뛠+_!FXۘ3beXدXm BD$dVu ]~S|o{kw^S p",7F)Q\[eF<[`JEܯ!: aAL0]'*c끌"@ya6Ù*?Vo-4,= 72WA:@UgQ`Iʫ\>V~慉uiK(XYuGF 3,t}m_c^P>_jX_o_h}9I1`0eI: :nBKHU(%zU"{\l+uIՕj_XіB]ٗ|~WbE Bzjv#5_{bAnMe_@rp6u#nfNO>er[epmޜB'v:}][3`*dGOO?TZK?>|f8 ϒry7ɶpk1ɄYL߉N.< Z|m7 NͥTO)lld* bF#1a.]}^ݤ|ݙ,5;̛jg/$c{-։n}eds\*ל4]8V%>GBXM<&4qwrvo)dC?6@HWZak \qcT}}3)t,V?FE+@(6M͆<@෣s6 `VVau5E IU쏉Hs\{7Ggn BZS2y=:ʍ rE.z:zNNrjMHɅQ77*hn&@yJ䒘ShyA=Ex*l҂3y1g⺨uX{:-*3Ј[b_Xwd19A~6v r6 Y }ЛM1YTIϤ} z |c1PfUH+!m'Ӆ$>iNUZ!߁a)Iή`OwL]1RaJl*ڈPv.K PqB @Vs?AێZgln>[Lc{PSI`GeZ}mcYl.:c kJ.C$$:dy >"<3LzQG=z 3^Q>՛A*Y^[hȷu-Q{(:1gSlY}_խ;SμWV#6d"Bޏ{v4a+)鉓StmPR'Tx1~Pev\ݑwgu ( \`xG)CNzy&X.?C&R4to5F\vŧff<S=qx~_ٷʕqe3&z5(MصT ăOV3^`Dgj8~pk .}KحD57Ah!c4Q _AiBVT٭b5W ͞<#0cn=(l9z,F\ ]ǡ|jxTmQiSO`Hw~ߞxޝZnJ Opܫ{U#O/q^!Ku5l0A5巪s9-Gqk7 o,pcѩʪ-I-ߦ[3E6lg5^x2г=Cgt tKN wNꐬ{ӇVg4zbӑP ("]ӌUZ36[1%|:h2;ɜAPc\RXe3vQa}Ci330 GCMgykSω}F qlNgi$x/Jmj5.^HƲZ!G LP.W-0%L*5⪧r&7^%kJpTOW, ٵcie %=ĺ'ES԰ްqīy}zdig`B3uWH#*٠ Pn傂55Ov1^_L7lq-aT=S ~ě 2գ_Pçb`ʦ='qΙ]n=Lzf͚!kL]9?{-(Z<,ī1 Nj385VY}@؃|$?CbBs(j/s9aC'+A@h%y_$נrP5)~@GCBTȹ _+8rsznʠd@P@LtI;? ,컳|91ᡘ:ɫ=ke>-=gnj0h(L/6شNLgY^~uy̝9*,|}}B[4EVғXRž{ <+F2T1G%C)cK3b$3)6Ļf.UXvR>%WXŴk8Wa)7Dvz-ݣLx.‚ir aTytl < FX' HغwټtcV#g x:s6IbSF&Buxx8*D_<7\kãd5rȈ ;!b͌vϝJ(Fo}VujHZxSJX3i/Ig w~Rܴw_=n ጧک޻5zk(wLȍ"?f-&m9UiG8iFΐ•UG7Ln"^{~l<1:vܹ} Cw+rkѤ!~:Py~9W⭨.Xz9V7Sq"CZv"ŲM3 :.Jy(|~ֻI$wtOx-|.pfnSd|\wbܼ6I]?Od93+GDtL98"`C>~}Xc;Tz^ZmLFJkmEZhށYUi`n*o%:J @NG')wSc0)}|3!orbQRp`}Ri]Zڀ~iI`^[>­@PWڷ&0B6FKjMl=cʂ,63󛅺䀻A\;٥31f6JA)#kۖN yr]D7~koŖ"u2U6b'I&%n)j[\qbhAqל]He7mCjdX?, z2o,NIp݄Ks?(cs籙aYʲ%@+I{-@fN]͞ Kq\#[`zh7?׽%9(IQ7pcx;M.scX,Kzg/,̩4B召Xб{:Á{Nң՛ӹ/LUaIΏJ+#w. uKkW k\y51n:n76.^ǃ+P{w¥.Zk"GhK(m=nQ}sL6jzZt5Oz?ebCMGtAw]qp0 &7oИxΐvp鍟ڻgB7>Z h\%8M:H"QදMf/ m6xs$ d2E91pbV2-كw2 R oe@U;>o]81CLa@wx2o_f_8ݖx+'>Pz"?ޣxMfWy*iA2Oxe܌z>*T))~jeG ϺޅQde*;n^/Xs_'!3 {pQlw-+O0}M)'.)=%|p ߱yN鸷ugɿ7=*pktR)w3F=(O}ٓdӚ(4mxzk2tR} e4xM/  J#䄙Bw}eLmnu4n|[Z4 GbZ?;o8mBe,VB*ܞ-K DYyK$$@KwHo/5? o~QE$xL^u_dl.։l+y#h7è%v!^)j۔KF]p%<2$]Pus/ 2)^ضԐ9|Ȟ)mӞ"+k^d~ׁa[&G xΪI B<afس"|CVH!{leJg$!=&};w'T}jݬd".G ЇOn FE%M9AC.J~w;3FaG;9uje^wqՑsR?BY3PSV'5Sv~!WnQ= _tZ_7xvLF(ALʕS^#oSbCȽ-^D/jXM+ h~ߜ՝CE;.֪/44 U:C_TnkI=ﻄ0:!j~F1Nt߹*[EL> Vy^VE,Rdlfb/y@nWu#x/dɼo̻f%QnWu{x@9WD;hѕܕҴpgVMA$ј w endstream endobj 312 0 obj << /Type /FontDescriptor /FontName /QSQKOE+CMMI8 /Flags 4 /FontBBox [-24 -250 1110 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 78 /XHeight 431 /CharSet (/d/h/n/r/t) /FontFile 311 0 R >> endobj 313 0 obj << /Length1 2647 /Length2 22810 /Length3 0 /Length 24311 /Filter /FlateDecode >> stream xڌPX-;ww$$C33$WuoQ}>$UVc5w0J:ػ22TYY,,L,,l֮@gk{? ĝ& [W=@`ccau P;8z9[[Z#ƌ;@lmfbP0qځ2̬^ A#`dbl)Dv]@s&v;cB[Y-Wsp0q@[k3  %mg6V&+_&ffv&^ k[ @IRӕ`boonbmkb 2r ?9[;0XjWД%.{k 4݋}ga7Մ#P?& o%:fV̿«{9R:qtpXY[A|\L܁Wg7ϟ"VV+him;:H +Ͽ @2wm2k+J:11O# dܠ~ _Re#@_Ђ柕7@op~^\W7߂$lmRQYzc+h-@aMje\M@!joi]$=֮fVs okmTvpuAt3{P\@g ڧ7s0xl\gg/у'@Ͽ `fwp@,~('Yo`o `q%#Vo`2Y7"j@(FZ#P-J"P-ʿ(oʮF(oʮxA:s4qjclbz,bWe2q9؂? /8l3:]@lmM dO)l"A3q 4]Ki;$/;/o/s?KXA:.+/G+ Ԅ4w@4mQ h#s\A{Lnv.B?*55b:k$ՠ7?d`G_*pqݗ :& pH4?f j7A8AN.@; s^?aU;-`vr4\=pp=^@и t;.Q37gм]z@_ h0?`jSzUq{Lpr[+g޹6*#xF4q miSZd簹÷xG'XՉqD";NA R8(ayHy.V٩C|*dֈ*5KHGq:}}3D6(GwOru6< <]\"k *$7>ŅK}s$ KhL{lU֪#[9Pj>̭F,#g2%HLjw@v N dW4a`ScPowC~ZE½„tVzK|DХZ@,4D'h0s|֍]nO~gk賶!!\ߓ %3Kt~]L_)e>[az[E"9wOQ!#ս=[9esϛtYÙBu8W4 {cqSV&fyV.6i];4cj`vRh$ė͟bvQ6G;E=M~ΨTHX*UA Ѻ>9l; ؑ4:cEu&>f;Ss`~ ֵ@X~8[p'IO\2-*ʙ, y67zYiWQapf{p`?j>'b*K䒆2USȢV1AԈˎɺQuppU#iwwI\2"9kA&ə\-·5AE`lw,qؿA .Ue~.cel%'tb?tA[JVHywv_:zD~-[2dO{0N;ɍ_gδmT`#Ug(9,_ʹ@!6 m/ G :٣fH T%@Asf*Y }0 kKa+,ڰ5ND09L$݋p@ۙ#7\ҫ&xF_GtXJ1>+:Y.Pam BAƨTbRZfh)!9~f-/&B& 'ykۮɖֲ3st"ziga{7_GeNME#8wy.Qc;`+w f峼 >:#F敆+mT楐~$X YRB@~Py@铨(I<;:10< 9 v5i~8Otlvp/ eWVQL$GLzjsl fגE >ۑe^TRb2~znGO< )eNѥxl l$@bQ$F̉V%7K7yK!3 JO`< -VI'{ɫzOML2ro"GNL7sLb)t+Yz\KEoy)~ 3şq0o$@8xm<i5BKnf/f(f)K^zayVkm=*cm=!1md쭷ʼG.7+ \ID`,B2 è8<0Jlw(ٴN1k^3p$>otNwX#:Y(S0NTMS 8~hBDmO{`Ij*v!Y7M}zC6I>);pwے:"^jab3$I,{ H˫'%&zwʞa9ؾZOuR3Xh:dbWO;wdSez0wIcfwBlܲ-bϗ.̐' 4W%* (Bzg.{YehX"~}%4ˁ >zH{rdS[dD@7rSi8]+Ā+6AW Gth^Ea縓<С&#E0.n[舶2U>& [q(7پl W._h_YdL@nx~ǜ-qT6tN1MF'ƍұC\G}jLD59/'D_cC:I1w˽F _]#"n|+Xɮp:ꛣ7R3 8.R/kM%NuP7VQޡoK\Eoi{ s"B6ZV[ Bycͷ?}}F(wxӧ> :h A6*w3E>ӈ"y|k8Iȟ { x,6`IDmxU6Yh(W$Ys% k3LivgAm=$C;n$?"U15uI~J̅8I:߱Ȝ]WDX5ejr56fɷVj!h ՠ'=u$nuU]7g쭓 s//:ƟH{vF@jdFRkA՘AA'I ]z4zNg^g]c|mK2rd ZyxV"&5I03bio܆j ; ֩0Y$AR&Y҇moX_~:5̈B@ҟvE]짟gzbgjd3jq+/p̎pQ}a]mX'Ew_"+;&*_FdݻH|/~$jd <-htjB/, PU+,q ."ɨSo]24-ꅃYDybGDob):Wtx z/j.#N`h@yȐ cě]*TV-YzxS;>9"q67.XgKkFrCB!v m@F69JΆ:׀~~/D`$p>~\jF8A**zEJZJ\L}"{ov+)]FfZw蛴:0sȇHƤMXH%?B)&OJbw\m;[ofWF bABo}y׹|$`$ _' (6:ɐm#J 9;;92q: D)bThḷF=1B>% wF&W!k7XDž:٪~bC&+y<6 9Y~@rnPVdǀ),>|뛙77&:)uʁh፳Ⱥ>MlɃcK{ w&(v$L05 $ɪָv)%)" "ljwpY(z= ܱi/H[2?m{J4th||j~ۥ6I!0K$4y3r,`7C`t{ .(x |vaOev$F//>o11! ֺO;T=h!_3:~| IrN;<#D1[0W:g@; Hr?DK& Տ^U"\E˟[ກf& =VfV])1<L8"pH:(FÇ1א:HsJJ80G̺pGȆuG>iT<3Ge,/VwDNqlЩY(,eiD9qݟ;_t;a&*6 &558B?65!%0T>_(ouXse-E;-XιJޯ|/{U;ڬ[xI[m!Xn{ifd[[-fw6A/RݕMu6e'9/5mA+?q`ԅr鄥џ ``ltMYPv=l~xvGL ~ uN:RAeET ueE++%vTϓw %3o;=Z;5VS7bۨEhzcrzt ;'/RC~ Fx rֈr kUQ  nC 4ra1XZmsW :vϊs*lڻ%pg$ NĻt0>fG^)^\PIV'} gl ~ 7w';2O[אd*+Uj57&3&o 'xM9duӂYES+xM|/r^ay3XB,Lv?. Y7gy͢?{#(ǸGoVk cLXQ[|z k]X'C9yKfvjX; $#wiK,- YOg zp7iii'@ͳM@BWrVXݹêDzl荒O a˕.abO3C#)Cܝ n.fomN 3V Qܷ[vwyooPAOSQ>(kq+ãBMalmE8D>>Ǭ7a[ o09 nWGgF]Zbvm~;b29BM~NvXJv4`41yA}KSEp@L$IU#^֔"5NuM]8Y̫~?|cU6{t$T{hJ@Kk2t刅3UzvxkOj? H{'[*<>Yr-&I2#2Mxx:RlB.Td/W#"I(Ay@ݭ;fHmKS1f/I`=\cع0"NX9n@%gch.g!ѹB*3^WX~ę'D'l0~)Ӷ+'=%MHUw>L\L=]BIfZ-qQh*eqp0|ߎdB0ƠwM6:-vG)߳Sq/S(=,E.̼`ÓXR,̤ifGa O(0jYXtm)5|rwzqhK6fዣ_<Ȩxt ɰ^ SSHidHo R'L26vĺmg9zUw`u{TKE?DHaԝQ_k^TN3wQC|/_-b!y^XKI ^f7b(.K4w2:>BTtg; 5橒{#4ZN("VvđͲ#؃'XY 4[K2©+C/CU\K<+eWC339H-Yk)+[gm{:cPmwO5v qa԰t`|r@?%?*,hT]δM4摒l]?|'R,H餷6_ЈZӶΕ`^cnnE}cwh9r޽m )ܤ+edP Q!usMO:s;\nO*ϛI,wg)2y{4[4{S8٨ѳA\4'V~7†|u[q^l"v7>Z\f^VìȎ˻J78[W_ԤZ+_cYm:T񅽐ŹϞ__arCK6(zld'qzw0H!+Tzs !ӏӓˮb `6ѿ(ɵbEdvKiRLבܠJ   $=H+ %}m9`&3<.v6duU*9 +1<ϰ*#?oҼ;J."GB4.R(jaMg3dhL#&$#1C8׹~[j!Ayv|sR:Z=,_O Vb?> 0iO1{:˷ڮQO7J~!pv!d)Gƽ_Q{`8 ʕe V9=ۗɩBnL`ƒk_(yi/Lƃsl(y+y,Rřv[QG˄: &ݔ.rꝡji׷e{=Zy7W]HnWs e]IIE6keU56♋*w,+dRMFΉyO;I8I1ޣdMo\q\rT|Nt[tՁ^,mpR|&JMf=4ݒڒڼZl3p&%1W%r6קxc)w;Ye!IN5*iD̝e?ȺB1xE-] sgtX}>y<7]BVQqWi<^fb]Tа ެ]^5k0i§iÞEbB%p9(| I2 @Eǎ^CR90N.GR;L @jJSh p^e@}>h`"[[8)%[)ra%fB֊NAX\=_KajJ}\J:nЊY[۝eoX,\s {x{1|޽|Qc6Swa-/Ma̪W/Ao.W]7 BI6?IvIdkרgPj)<+?.&%abEv COL9+@ \ա&% 9w%*>6eEgqt; I bqٻfR2zL>8_ݯ=7 ؒTN)WzKVxԆG=sbL| /O^[9+rhKr_evL4Y+3SC xT4:w~:C>vÞ.}k~.UT;=-3M1QRR%Rփ&dluӹc/A4.*X^f}p@kYǒ50 @\޳9aQVMZ*YO֟#Ōxfu}p~p̩O6[ibսf@nrmQdzf])dfNm?ߺe|L<{9Mj07ՃRR_n0 Cu8K,A<_1&sZ Yno5pNv9 A`r, )(C3!DX1|ltMMq9y|q_zNz0ݥnBÿrb^Kk*&?P~&4wќyMA#2[QeKH51f~r$6A<%I^- w`]cUW!m*4Y Z̊0{Y8&!wz'׷|+oǞ,KXW:|"ؘK.h'n!_Ct~G<NNJAQ|73wXq1{ȍPy7`Aɜ_b#bN <@q*[$0њG9m"Ў&},,UbAl%|hzq~rPF~tpa6y;tg>uK0l9ڔQL;ϴ>F=nÔk\"c7 iaK#<83S:V $QfNf\w"ʀDYplT-Q/$(֔#^ LH~_ue^hmuH < c-ytZuiU&Ô"A@)&SP}83Baep'0)_] {ٽ*RҖ){01Yߚ[1{sO?xA|!tQlScAzU$62 L‚/b7xHTBRjoYK-Z^M.X{H6:EtFB0(LqJ YU*QLMIf-*!yB^xK.We+|ukHSTRyq{]!C9.XCt%w1X1M>h&M-E^3, ~((0zFOfpr閽Cm"֐遘( TsDGr"NR%< \_Wm|EqL<~ pbcN-b:AS5EE5^0b( ë@IZ3},t"t|f:z)FF=L|?  S D[«i3ΧrcyېPo+[CʻPd|~^{:~Ͻ#4<3:E|3%xqo25]JZ<غYv =պ"xT?M?V)lqѷڽ$6YUMJD[UuO/O#P[CIƇ 8HD7/>9V#&aRw 8)uЎY-@|=嘼q3q[["[$' q-+F|l6m6Jr:2*~/cO^)+Zl@J^%"q^3nxp-‰` s: L۲ NxJm0_lъi2 64Vkl\0WvzBT~p 8JqF<_M;_ A;W a<_ #E̺xE|riTŘVh1odBk޼tE+v"@yC(1N5TdA~:n\EbeNq D/֦s^ڷ.{5rOG]?W;{3R Д?IA Ax5Ȗ$s.~* CƗ'xsr%d,1;j~ G1G[w-:dϤ} |muenQn=Ik(l-VffYLjZ'\")) yȁF`FFcO3V?mMz @n 齭J3-̺Iy.v?2ҐOh'kg{X0sxFMYat^nkZT U"~á3w AzL6TފҷA)hT Xmg:lOÄ\G'l=^Q<1a(os4aa^ꚣ{f .x=ʞ53j5ʣ;p5g45ex7N%Y/Ejphpq^ GiWAHdWb;ND{SE;#Quz`eB1_pY2ly]&3G,KA>)rN/&Q)}aѮ4+/VAg~h,G8aʦSZW -TG'vSԻ4lBpSIA3n :[m#섏u2j\WW)=?fwpƢ?DKS mϳHcӌaLiiG)<[o\-P x}<^fkkʗe?..{AVqkZc/bE?I#M-{L,t/4@ʢ(?D܇)l\pU z;U;J>\ 82:M'D((` fX<߽~T~c`@5?{;C"YRod].jQRNfEsTtZ_jHfYeJD6 Avnd{Qo@ν$䧯qOU| {{ңqG]wV!L 17S6CUo:"r.t '&ȵeU&XA 9dRmtXw( '68=+!)2au|EY?J ī%=)4lg+Dlr0f{m2xzı9wxw`kkY'Ū2nQ^ htȱQ$M +fbu²Ɇ=RHwXYJjbI?Wr5H)(eu.,v NTVZ݂dD+kJ˖ jMRټK JҸr]Q9WQsV%hg^y\%#}lTGO# INC8,/^8iȦ$~4dq M2oƌFhPGYôA;;-3* %Ś׼iGL^j=`wCaAK`bRY\hO\uOn4Nfyt0c*rTꞄ -=_*hdc>=ʽVƯNJ8/0|[O*$t=C=}x>h'v[V#c_ \юa*E)Txx8_16AN|@tIwU!^d}AlSO_+"@SFe%3A#*~iuE4+&1DtN8N9#!>36nK8&ڕGB!@\k-[Epy^sQ0苿G#/7 &wS(ْDe+^+hx] LJW<ۏh[X1?w]Jo3a~@&ބL'-1\{{ @;LDP nZM,|5`&y\X3 Fȥ,i%Sna-7~JD\lLgq)xNYnenkkrc2bO;oEF!Z;\{K#p`+ߖ iϝqՍU8i}6q^UH~ +}t+vWC8mw]Dr_P$;Rg<~dY+MyJ>:0`CC;F5T"ј `v$W&,4{gCJ3Ob8Q08Z@,oen-T|I[͊{n|36%&y2)[~vS7Z?~6<.TOW78`+XXL+!Tq?A?s3&=rD]ߔk| 5Z< ^DB\ufmMGuQ X&jswDpr{qC?I^*N ͺ @WP]_b8AGQO:a\k' OAOǨbsJ `mͰ՘f@?hF3"H.w8*%/8?`B0i38ğ68~9u`bq>㶽,u֑'{eo. Jcy&R,:T#5n=z gZExm[mT;|OKkmx۫VvӥH 8߄ KXU$,BIlj@=ݑ ėuoT027.z68˭Z i(Y d=u"#a]O25OD&*s7e礼 ڱf^Tx!m\$}X;QĨ*8Bl\IE}9 9aCE$P:^^ %[;WY{QKP?f }*wbɜ9xJ#*Ú-*-]s3_`vFmr&YU8JѺԳq6')*~=tXٔ${P6=GtGO ~>K@ւlp!&W0syBՆ)M+r]BORSE7Ŀ4Pɦ_MVnk,.!Yd8dGhsg5{̐n 0,ِd}~r3jıvZĘePH%S~ @bbfyE*mēSf H.1dD6SLԙ\8ζXI3x% tw!*2R @q%}ߪ+tIF}ٴfHT遁B:ةR{_}vzFNG?=<}9D!`כ2X2hIJnhڴ6$} ly\^v2M>sHx"xc3K.L6_}H^*MV^-ly*S?Ynꦫ:?ս\p3d̯vHѰUF͏OAے% yU,G_Ks?>; OMeOqYsפӵ,;a3i"~΢쀙g9_ eO\ξאĽlqR^. LBZXASs;bϹM%ljCD{Q9^CqaC!2 3~?UM0!W>àuhjx/42:Xm\GM\rޑR ul`,`rxjBh")p֡-ݾ% sW_q ib$,yU^8*V5U~1gYsf# rČvޣp)IAT`횐s/Jvdp*f )N̵7$}.<2R{fj 8 &Q|Wew`@iom=WIæ)zIC Ft.t*>8MU *SirbqChARWiq V2Kk!үK4@BÁWL= zt>i[kk񃜱p$% n/ʅ/`D(ef|Hґ%Dީږ 6^Wo88mkHǐp֌@ nJ>uCcHPKd`?I9&ܶƈ͚ik.\ڎt} >(DLA7l8g\Ź饍bIoq~|NACijm6qҴGV{SÞ}hNX@[Czo8,a qH_Ftp-;Y.ӷHȗWD򇵐lŴk,q;?ZE۾bAǽ ~3L,0:kp`@3΢O a@iX_%+h!LgmƳ]kX!fH ?HFK~xP5:Ļg9 q>W[r& j{tZ/Y>x5.esM{iU8Rp9t,۱VZ֝r,\SOWl%@Wr_hXlO[P{~_,NH~]AՈxү \BwmYa "KeG牷[V } P4`gM|Q^^,  SHl-$Rxq,c7(cphKwh"ѓY%{j)B tPwYL1+^Uշ3'8 r_=p׻n#@>|@61B]JPf(~6"eWCVɍ3_O%&^t*T8Aܫ l,[JcX$"A3H!#;\F7[,جիP䬿tG##` o艂q$(191[`΋?sclbVh#/PbEYǮ+TaNoR󧫘帀p5<#OE*а7JP+-W-PWzY2SM8uō+e_͞_ ~9g K;:M:l/|~rEp5qŦ<:Âf;"c7 .ET{e0wA(vފ ib ?B7ZLuzdA1EǁꦴeE<_I 9N:D'k_rdgTn_"ǟ;!2 2RQ^*hSˊ939vcm?u"(Y`JZh^AeIel} 7UϠ*Nf_. bG$joRC{ ed*~\O6}rQj,vkmi gw^CĽ'-ά1NR7퇳{bȹ Ft)j ݝ E  f?Q7"ꞚܦMYkbUMڰΉW+KBQmloҹ[c״ϋ Ua@TWxjfjf@PmQ`TWl7h:a 9 LjHt0LŹO7:@~' rn8Mc+[@bURV[haSj!jrJk`Sֻ֗Gxg0:y]j0{=őAV_-AdZˊ!RԤ0 {ٿ;@/R )WfP%E#W wH[mLJx2O~L)'}@մ&ʚVZӡ`!()y"y"gZ[_|9f,=I H.pW |fԵ SM,t Mx2ep d1P/u# hH<2; ;g昏#gtT8@]$,TzCl1>y#RngBgX C @f c;t!3 hDӐ>z,%Ǝ;qxJB:kIUآ1pkɚᓟ`:Re.po$ yk _1#:'r&_-kև,!Q䚰[0uqB2=LMvem" V5MGSYxXӻLk(S\PSGl`y=%Y u1.RWCȽ=r;E6%fhƖFߺ!^%~GDܲ9ipb'b=`ɲ $vU?3~a:67Ei+[:jadVtGe]s&ݫZhHI8-pWP Z)e8YL8ÃXINA~ }ffKIrfW[ݵfmv\fU2_!ZsSR77.Z̭9{I/_o Kj` TS)Zio D{M{1Pf-6mlth8T-*C$9|w|/b3.Bp U浴"7M;&h 8 FМ861mpg ڵnA:o5 xgğ7蹼{(1Z^U["٘q]mKd骧/`C)z' ET}6\& zRچ ҀvF.<8m׼SWߊvFyL닖X|I\om3->Y<܇!Q:V8b\2)}ukUZb8s?uYy29h߹93b-rhdܦ .F ^lKJgPV4[TE XbוG( 0D,[Z1ҏ#e%6 ԷrAaX \`ޢ^g2;}O7Ku j.* /;/~hTOJ6!UQY`-L.3"p"~  zp^XVtK#yOAq:j FQ1FXŝo 2Xmu l]MN:ڛ:p@c!l1aN^t1A,}D&/gj41.Ȧr" 7nqh!EЋp#ZphYx_׀\Gҟ{11i G/2lBnXC' NNԆx T 5:8-#5?-Z:8hA|?ex|E|K۬#U:,#y"qثdܳѐqg%*ՃB5|=pqA*jPXzDbrG[ä95W`jYsznwHl2u,P6F[;!D*-v&B"UeΝL[ݕ|vفW 8H@lƻ %GBOWkE~olBMi BDso#RӅ^Ŝt) QUaqQx9gUOZ,< J;wV({ՇNbp :d^8άR%bԊq!Xnߋ^3TV62o JYXLqeK~vwA߱?^hij mh"/`7;ڮZoݷ6A"[ێkd9MN LPЎ2+%.7YDA`]PukY 0U&Q hz3*ݳu4"G ¾$d tZv~߇yUMw(q*eTk^Tb8G ׇ^IBɔZgK YEߗً+9F39>kbdssea7ߴVG_i0YY![ӣ+K@rmӈJ0[*J2_OE#gͰ~H-u"lH-)n[w;yinsKz\I5fk2O! ٠CC$qUW&`;1䃾H\Ĵhix g=;w=ߠ{Rlۜ%W`Spj22Њ!=?o+TC;bT2L'ޏ*xGr ) e-%ޞj$F&v&;Bu endstream endobj 314 0 obj << /Type /FontDescriptor /FontName /XORHRC+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/Y/a/at/b/bracketleft/bracketright/c/colon/comma/d/dieresis/dollar/e/eight/endash/f/ff/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 313 0 R >> endobj 315 0 obj << /Length1 1757 /Length2 9811 /Length3 0 /Length 10938 /Filter /FlateDecode >> stream xڍ46]`DC{oQ 03:{'H=:уBD%|rι{[g?=f}nY[5X Erz| )ȏlA:22 */y8)~0(@'$',@8bPA\fy7b/6v0Y0b4AH}E3@f#+*rAR\OF`[o- Oe<O> g pڂ}U +Ɵ\w'@\\APo`q4x^H.j䌀ǃ<@gJн!lW$q-wSV\\P$w 8ؽyY'(@m~uw5B ܛpكA (,*^6x ~\v";/ `p$l _>0/Aq~yM 58T7''r?p DED‚@g[aA OBU aw-(lLs 7&Rrwvf _쎼 Mn@MB]UECj1BJ/i;C`p{?(:wIE @p8x?^_{1^( yqߨ0W$U x5F"o$zxmF"|/?yൃ? x6?{vﻻEwz?0y7!iDܯ?}?}/HOؿru6pǶ_*و:օ$9ɼ;<;:+x~.:hi]Lfݶk$6ܹϏ <6gނکƜ.BOӳW٫|q$|fSwZH|;0yPsu4,$7C/©I;z$N\E+>_#L)iHFY|v(f}K#ӏ:FW]^9lj[0QQ򢓩.$0$c d.-{ X#!wzxW9>;luzZԜzȂM8l !kl%Rm\Ϫ b05:u3鱻Lvxj EغPY276KԴ(q<Ϧu?mcLmyڨ7`i^=zgd߷ur;\,B&QGʟWDE߲ qn#}Õ=i8;˥oc)$6m4~52DKK%&i> f4)1pMhtgVԄ"Oiola8-S WOܻ^0SP;Nfh5ˡ ()bڷ#V2!ۓ9(C jr1#L&r٤{#UݗT'_űү=$7dqnRC 5ltƧ[|  UBES83VjN-OXӨ~daMY7b垬S&C6R>m"Ak<֥s~ć,)#->WN5vnϸSE9^r;:4 !Yh^3xJ״)hNRgWU&Z8׫IXr2%I1^ՠCCNkx 6RP"(wX*#D6r|ja]#SO,(*/ I"L,{*fj'~ 5A\hxX_/~xA|t[T0&;:]ʢD#g2ћU@d-η?y+eB؜s]RG"OcgXթ~e:ha9ue|> 1F:î۞fZW ( q qPAݖ*_c)Gd됈/[弜l,F W%B8瀟Y^o>JF6Tvng('+kukF `"̭P5Ķc/x.Txy3 h37dBD+6W-NjIϨd,CGQ IA܏dV%E)%Yxaz5-Q ^@PkΨ+ L~YQDH93?;%ξyERA=NS#>:̶h,gF43(UXw VzKy_? zɗ2'$ROË:eԺ^]r:_sMaOM(Cȍus"ڥˬJQsVs9>zHo]^OGg茧9 KTq]"+^:A&zKC7/K JFR?&I|HoQ+:.d/S! DrpH׍z ˞ 2:7KKSNHY튃kg1T~vuy[q驖2߀S>$B);&F\pJd)Yԓܺien!j0Ax0^?G#,hhɼN®weךx8f8|RQ"}MN/n;<]T;b\U|{gSk|mӦ7iŋ*l"cZe^U :<{\SZ}OB-pȮ0$4Ky<Q2fP:͘q)g!-S|\r>"*a[j$kew..(M-:iI882*Yd_HúzrAr ,=Qn*MM¹˓4`b|HF~]X.UwZb4l c[j.}ߋv\3:Fd~eRDm=22L թ :p̳e̊: HH!C9,1=쬪B#y֌`P}*/㈛,0{ఱ?{dQ*/ex44CQWS ␑~\kS`]zB׮Mle̻\\ ҁ\[0̦kZr*{}Fcm'ޣl|Q ^ w̨S@Cj(A,].Q4#1d;? ʿ-(!)Rke꽸,pYc'UYԡd&3gNF$lS:۵:aH 䄭6k[,;yFƲ]ʎxi6&#v3i( bL.걹 N`xlkh&Gecզ& ="o-~$ĥ`~z_x?I3gi8XA}s8$0Y\džܱJǃhN9n qAV#~nQ0~zK>ʴoBS憎*fL\hKʯ/q ܬ >5dOYp3{&306vؙ,A؝,2^ 5&fxv2DoKEv']O\<+;]qr0(!4c7|:)%w~>+4%kSO4_C&2/3o{vz(e95Z??[ߩPr5քK$UvɵODZԻ P\N Gf!)BFgΩAh#6/1$tG;tɢ3M1_ŋ<+~Z寳=̡n "0DZ9OR6iCʍT_'-P5)/\xEԍNT "{\c*rpEE6Xz>ڭ3<[+V7VOA8NIYNR,C,PKGwa-c+Q^d15@ؓ12ƐT!QU˫_6MRsDߘlQ,?V'k(JB8gf3CdW `@䛝(ߦ3^ d^l}ծAΡ5 &:QT[n"5CcO?Lgg`qRȰvD'=7ʶ~ǐul6#;9%ޜ%,@I![~HHė.EpIIyKmVm\NB؟g+@?%/An AؼRCeL~_-[1U9.>ߦTȣ3 *hslt&{|_>Gor7qm:JS~[\2&$g̵[mxx5{hdt! o$%.c$HGSU܍Ȅ)~XKq}{[]҉>Rqkc ,-'Jq'dn;+HJ9IRPMƜ_ 7c{ׄNρ_[ټ,*kJ@,KL.(0$^MQ{ҡmlx؜10;n#}kO.Cr Մf c;1S% 3Qu_g@-haz=A#,/|_'F}%~I;rrhڪ[ p//ls ?1RݢnE, ) 4/8#Fg˯׿~ M_+}jJmhUo$>Ҁdܦ2`) f`mBx%$FJjd`cvRS1/v:³dr>^,tJ78'dzi3G?6J@"gZe" bA, bpZ4]rǃu҂kjS%Iʼ^fE$+^)6P0_#y?6sľ&4sY^] <62>kDZt|RU[ˋ xiT"@.H7_㓓AɋY=~NY;T]O^U}$sN\;:_b>G9fHcRww4Zk*_6] ]lV_^[R;?H9d6HmX|,oL*^'Z^ \#,bP#߼wƥ]EqHеK3qQH&ss"JZL(t22@ sqۉ׾+2hϼ᙮a؂˭"@9rw`Cp˔\C}7ҋNT>p-ueJ{<;iג +5'dl-s [YQjBz-hUX\sOVun't8?}LpXqn'L6R$mAL:㝓X$l}MԞ<$#{lb MENn0eBZ+zgzC5ByqEn1MiL(zjTT3 vjkFnZL~$}M~ 3$qz0/Go}0 {sTYCMԗ۴>@(sTg$uhTt"%ݓi%R;0.QS hJdWǕѦ,.Jj 5M?z$ xx쫤Wum |:FQqäR=Sߎ‡:XW4S?\(kz꛹VRN+ߔ¥VOY; UM [8bjes]dt#I-QL5ȹa<{/VG%-~d& ~Xc6NYv?x=Um`SI1͞{w ]ə:,{2843$= @ǟ2̼$)p<!F #o(=oٷA wOuǮvӵ½V R8rvdB9GĴX 5Dk{׍5G-JmEV<da z)TBhR-3!ߞ6?֖W+eS( }/jvf(TmEq{m{GQK;V~~4py|BwZוQ0CF߬OڻU\M_藇 4sZ1^f>wUHZQv#~됼,!Hnu{ub.ߞ5yc`eP(ACLan[>3MNrW<_,h_s%ʴI-!.cJ_"E,OЗ/[f U]yj$\6D% '&6(C@:.ln'bн'Vp <kERdHx6<ʈkp|iyvoGncjՃu ʷ*/17۝vn'@_ ^}o1VxǪS0~KG]Ay&BwDBQ~U:(s;cY#kB_ ]N!$oH fbBߨ1rAQfyv4vu6Ӆ'Jv/ X>r*`k&Ͳ "= "h+%l_*Yt'جic8?!>6s!=˽uhPX[KDPR&v\3LP%*6 ï/STR0<_CcX3⪻ʧQq[1:3?i^a `fW(= ^"m [/]SQ XYVS:v鎩#L,[kߐMn]E}5Tp&]L @ƻ| #_^BpCg7wSI]B 񯢋ILUJ|"ad+%.jۆSK8ƞpKv0&_*tLYz.Ň66xo?tm*-6Lk%r,ċ~-L?;Y}}Tg:Oʦ$nyY5<،KQmҔkoEX]_Z1`$>(|JYE=F(1:%-Ky=^q~ ULu1|7_]c\".Nz<91BG t9jN\zHGΉOuakEj^Ep}"tNxR;k5d^ Z&xM!˙`*x14K :\Ck՟3zW߇ޕN\ηEo*wL+Nؑ_ۄ̎NV옫j?xV`9\ oȍ\Z"ANfl5!\Ăt!RZp3Sgz QEyl`օsdCa%1Q: Trژ%vbÏ/_a;߬y_}|=e\lE:n(B=~)n3`Au324x Éa*2VkB|ȎVʆz/id L<~쵪6^Dq!;cQ2o9].ˏ/K="=9 vZedh lLpuPY .%S*M~CJ,~hBRsNZL^5gv&9HqZO*+Ƚ1\N?mdcY^&]OI6>56$K—H8?Ԉ0O endstream endobj 316 0 obj << /Type /FontDescriptor /FontName /YROTEL+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/C/G/L/V/a/c/colon/e/four/g/h/hyphen/i/n/o/one/p/period/r/s/six/t/two/u/zero) /FontFile 315 0 R >> endobj 317 0 obj << /Length1 1606 /Length2 8606 /Length3 0 /Length 9646 /Filter /FlateDecode >> stream xڍT- 9 14HJ+- RҝR ҡswuOy._hIBPS %aFn (D2n@+ؓM =\<.~a.aNN7'пnY+O-@ e.>n {S00X@7fs:X9t6 J0:`.^^^V`wv8+ sh݁n@[ou+0/fh]_v x28l -  pB V+l\\.wB ȟd+( @@*; rv>[yZ /z"7=w7 ̝"2OS@` | 7}8Y' 7Al~pЃ\=J}[y07`?и hh~|77I{\ߟ2{-?a$/?67'@ +*/VJ;(@/ O ϿU0:I@oiYRdM{ yg?n? r;IP>C m_i; #] lпn᩼3Ԅ~56.N=훍{tW\urXYq>ɋ@?pC 8d AN濑?HaoP? 7a>v|:?S# ә O}@~_Cps{zLi^. h s k"bۛ3Hcb[vzTv)2܃#x!B}c$[;6)Rl_]>R!է]_y,|aOK5 ] X9ʝmv|/qBfKo`x藫dS_v/ZZa\vg8Ɨ=3@Ac1 zx,vwG 6JalhJ(A.Љ%U2g{),pu삼~Q-icd/tk R\1.*9"ůõ_"xr`7x{a}7R Hh©>gtս;Z^|o`AglVyjAu];dr\F %m!8IQ0.ؤ\{c$SBP6S V=6YEs~j9)ϙ㯙#Q_EY+r:q]tv!KXVHYz5ptJC8_Jաy>*gou%ڼY}QR_H/l1e6aL!;W-clp͔6HFv4:]R,&R;w'ɞ]GǙd1Oj%HS`Sy+`nbwg w^Z(yY XyG/gP-aT3yOw:fd"  ͳ$uY`w-CC]4S-޴ {=܇ҵW㯥I]h֐q>mXlD\|R;\ד^O/a?b_>wԸQnNr thIsx`x]r_2я_9Ȃ~6tfQ는puRH)ukqE\nӿ@io4<*Eze G6-n.ZAw8HP+AEWPa ~<{-OQte;JMVy}z>PaΛXe1B~M܁EL-(0k 1˓=%$kbA<6?FPhz޷{v<2 0'li}a.nA Z}-XzGP-|GRѝRf Zh/~EE\Cbг9_׳͓Ys6Y ,38~U"EfAyowz:WfǸ $ * w^ӋD$fc*cfL]6)sn`^Y;5՞eHe0|ddqn2U^YPU5퀾qTq8Z{ޚ5 &vd䶨Gt!pȃƆyYM&wPzhݪ=6i>f"$71,ڻKa'teLd{SXgĉr\Oծ(^F>ʘT\ b\TG֙:-H@`g4ok-ԱkNRM3I_ڜ&ky[})g^<ӺgGRk^,WZFp&J(V3 ~H?6\v,] ⢞^8 6bGl$s-֫4WfQ|Ƚ[r+05:[VR:[yW.$1S{ͬŠ>L8ĨM&角>Dˆv\髊6!|^lq"*gAʲY5,ϰHCZr*Jyzÿ ֚M 0<ٰ/na8OQn :7"])OsȒuxB㳥$"4EBVS=u?Ù#/'Cn*FC_ߢ5HptA̠y+ܯMRӭEY~nzi#Y2ܩVvG@ɶb^,a#ܜ*!Ѡƹ\&{\F+0 tب5S8[~e7"{ǤӨ`l<DK)WGP꽺0Bɼ'//]q_q&=q(a>$9~T iL8JinMg@\] qZegE,,7%uКhoXS#6 ~zL^W!+~/Sef d^] 6~΃vA[0kII]r4wMX }p8:l dĪ&sT4mЌWCBq2:mj]_V R E4xm+me)L5@<©MCyWϸ+j]ߑR]ĞI-m=lQm?\GD]J{=qPB"0uch=uѠ|VbQzҕ8G:r^!b8}vez ;ZQaz6]9u#?.Fὲbfϭ>}U;HQsGl|#.o8IN5j~ ^]3i*W&ͺC 9W-MxlKv7f$1zV4DMWr1j [#v%Ѷ6;ŏG15[ؓG殪d9$ h}duTӏC"a\lO!p?~z6d(#QaJ(R#F*\wF})FDJgѪڛ#On]z37uހ'Jv^846B}̌A8MNRj=KwZN1TSHmT`vY{|1K՟*,h Ynu~zm741_>W\is|,&9̛ӅC9/sooy'C3$s+|g\򬌏h4@ Iuboy^~GInM %Q3KKkKVK`z=VDH^(&-5NU< ZK.pLѫbȵf#H YwjesZ8U溙v?Ft \Ǫ3Ld:٨왑!yĊdH=$LM&ZJ% Vs.@ .,5a?Nץψkzso<un&l%..!s2/#ߧ dž %|oK߉jGI 2㣉w\ދaXqէ嬋l*A*W:P)KS sѫjZ'0WͶ.k>ՉCÙ;Uo٬Tt9L<|&Rl:]$t$cХޜ@Fbh>zٲb[0(;.QAGߕ'8٠&-Kvz)&T bxހYS@G*ᎅp@W= m6d9x ]Y E#wO2};y>?$yPZZX!V @; ?H,Go# )a&>phM5=f|)EYgs 2b u[ v Wy`~_My٥hwpq2]iV/QSUP7trTDW\~V_Q7{І+@3F's/ɛh1`g֟ Ћv s?yne G8~n9ٹ`&W$O%໴b77Wxl`|qԒλ)|WOD$+6䲑[ș&EԴ/_*DcN1¾zad65SMTėk/sU~`AlZ3w']SDaOm'|ȱѰfrQ14&:JLj,Lg׈;օsW=oy6:)KT؍F8ŗ163&M02iG(߮{}ýRӡAI`t&Ό|Αe2B4Gjtu@lFG>τ^4nR{LVY;ս}ge~PEx%뵭7`G|y6A:D!oh~/6Ր^bCgY\/ܣ;Pq0mP^3HltgCQ!jQ6֞mB(E* 37 ځ9ujV y9!_8ӭ[mXϣb2=_7m/KM&S^"CKbd T,BЯ,bטB4H-i"SC{J\~z5"_9 {q2~XkUBp.ᙌ'˹sGݑU{` 9G,`ΰE&hVmk`;eCS n$|vn١Egl ȲBdv7#2,}omѮbڑL*v}tb1LL|\NL *tcs~jS@l*WwWeu.#䂲H I|9onpݯ09 _ZXc^U=,=?bl ]2@$[)?t~B⯷Ezw9Oq #}Ķݤʜ.@=QON)$'´gK6̱{q:D(,׵Q~ KJDT˅,ЛίAwݐ,E'u`B+Cr"_#Of֗oMB۲( .ya3&AV0oToZPF p12PaPe._8u((0O?br(j ~؏gMbk?ټ-և"GpDE8(gEFN 5Bddӷ):f:)+#LX\={-#%gf)D%o=3^4iN +\~mN[ T渊DhҤrR`ۋ7oJ ܝ(Gx2jM@{`b]Lom猷rnsV˯GQ2uۤ8N ̩6sܣD2dc[QD \4;(pye+\꠫ [&0s*\՛•gfKl|gF"P|xdP_%WFnӼ/Dz;+a`+x#eX1^HƝۘTni&XiVK A-Gֹ.FvH5PַVtw`1TgzMpaޗN Ĩ/YhN;UkZU5)3JW%F2$T^H}gL'ʦ7 "Gh+xFԖ^/\5C5 ,6=_3( ?r5։KGe4SPk7z h(xd׸ZLhe[7jh^0ŁoIO@g\]N\3b01FߤΦ+:B,(%gg%1-59W qiTU8~mŒRhC G@q uOxqA,Ril,$\tq 'X ى+!7Ƿ%bX]c$]39̈:oy{p'bDZ6]6pm(~h|Jt2(+dASE›~o"jDay;pXXV̊T?,8"3^,iG',Kxx8uU9\ޠ3Z= rF.4uӾDK坘22oB_0#_@gXbkȆnL y4OȐbcG#!e4X}  t Å'EsA QV?)fTDϰ,9 "/aq KcS`/ 45H6%Q#b* 4'o,ٳ|oDGޏc/,ˑЁ;Юai >^/3^UD`ɥeWLB,j*$< endstream endobj 318 0 obj << /Type /FontDescriptor /FontName /YFAHSK+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/D/P/a/c/e/f/g/i/k/l/m/n/o/r/t/u) /FontFile 317 0 R >> endobj 319 0 obj << /Length1 1906 /Length2 12829 /Length3 0 /Length 14001 /Filter /FlateDecode >> stream xڍTҀ H4]%Xpw9gfkݻz]wn2"e:!##=#7@DVBȌ@Fr%E S;l:D dmN&;77##뿆6QCg @ mc t@ u;G#Ҙ Ardlh 5t4ZG46(nをіŅʁތr4(@ F@P19%V1ut1 c'k==6@Y @h h=G ?XZ K @^ #-CCKΆ KCw?7 ) Ou [Gz2}ŬMDl֎' ßjamb׳)LlTAvN@)Xl\jls7[J?{yLKzL@ߊ%&& `4Y#] 4O f|o<&t{?ASFSDNςV ۸<tl&&.zT(emjo #ټ1@O011n??GO-?.vr|YXhrZ)G6{A WYl@\3:&F{5cTGCYۘ1slC{{C7'6p]k{y^S{?Γ /b0C q&f??Eod0(C,=zCэ?_` ߓ34'a/|_?= [_ly po .6R/|O_|\i rό?&/y@ccum5B\v&fvS<۝Q`37o{VQ.x4&(x|֏Ss g`H3狝d x4Y'B>Kk}jvo3tQ:~%sdyFY0tp箨s79oq4^Q,EZk*]xxZ7c=J6RqǷ,)w.&)p ""7Z%JaXW7\.9ZhAouPDFXOq6v&QXJy$`#ywx,/{䕓򷔩zr'76Sk0r# ?ӽ@?ܻp98h:.4%"I2򏆠 m$cWXkr[Il+bָId|ɾ~ILhq̬}[(𖛛0in8i:/J|٠7 h8jy26/xVHv+*#Z3icU!Nf 0r>bgn{oWsen XR޾Wg?k@ry7bDt2I Ṉ%LlfM觕2]MT|[Y+Igap{iur4>-3o B[i ӰLo5,gO} \D  6D 'C` ᒧCۤL>Է*-ӤE^KX췳c|.R.Ky7]KGh{\tHL,_C4vSJG_8b1ꔡ$rcqԋb< oS"xՆzLwnl%k-nh~5lU] t RQ33WHE%~]7% B4>]XHӄ`]o}l\Hݟw.y%/Y#R %Ŋ ǕA M$toip+;VL59ԚzE~qpGQ5d-g8:7*ߦo= wF>"Q4#ӆaU)(m$a5A>@H\hag(KO-XxVo*t'g 1Rlmy,e7^BM0w7WH.C2ܭ;ZXpIy8ٓ/PΟ$i#g#?Ӳ7$Bӈ4_ٛՅaߕε{| a'ǁ.75A;X뙜R2:יY%^^*ɇwkO\YEg(F!fRxAY.'J!kDu56q-FHr fC$dqIĖgd8DW4^%( SJ:L Un &mvRヨыKUϤ/s"YVU:"NJWRe&^+DJa|OoV=dlxkg&BΘx_7:ԡO7Pi5+^mQ*Q}OK>n,JnaM[cKJ` E6hs7L Sę@pJ< _mRu.笠TyC⧷3̜2{Grε-A^3FBޖ[EQ00ݥH$m+X*>ҝ"*;K^SD!Tb4[+&vX?;RZ\hj0 OG{ Coe}qIJY*eI+ ߐp3.;Ki0)sDZdAMg:7Yڵ07QaI3|QCQ(N_fhEU^#\Hg]]hȰc¨=>L7$ᵩ5RZw@F/8ʆ:l ,JTUh9NVjqMQf`Y ]dFd5^_RqG4Ϥ 㵢 KyΏT \69AFwg8,|`)WHE/ OJQ]X)[徱7WkTVoV] ;T*. CȂ.m)TGl(JN䔧pngW9g]{By'2瞢g*s9NXuдbMpUɳ@6qoQgƩU8 JRyE@r7hN!l@cB+*X,CT]`s?U4fCSjHkkl]J,YEHO:O}:c_͍!PxY;墰ЬrBWq0(,#.B<:a'Ð#F}5*ʱ{sYq4S*a NtUD}PǥʼVS"RRLp;/mcmO %|4L>w)'4`XLhi}p_J.T-nДxIo1‘6+˽=ْ@h$V=2 qsR% }4=ޒU^^MzVAP!0 >Hnp%^sCł~*v [$Y M6r֡gssCF^%g>Vhˀ@:TA}yp2g*F6W(/Dh}lOw;B{WL"  l-l+l"7Ms{_Pl$Vb@҉wNk>Ӕ}8~.yƹLD;B-Ԧ>=bI8YGbe*uucX]!9 W ;qwTW+;ۀk7"3Yn欈S6t=y1ӪY}W;8ʵtq,ڕI!ad ra``}Vش&pJ,6%nSiPFr0]s KV^=] N՛$BĪT*:ZG6^6+9} ~,I]34iz pqiG!OX6BH1%)kE`0^#⠐"=iZμ3 EBefk(P7^@&دwq’ayذ'2+_7±Uꪓu^f4@ˆ2w}9E֖Lʥ~Cbn*ñGS-֘Tˌ"SG^l^u';.7v9K?>oƁgQLORCZٶNɑxej.,E2P}?Cc/ʡF׳$;Ȯ_0uچ>d<)'%EU\6uh1py(-#YUVWw1NCJxN{x˒PaQx\'lŒmLoI)@= WGo؄ىnEb]O!l>j)k7,**o,+/gYQѼG4%oX0G1yv@.kf'HE)^+Og dl*,H0J:y$0XHfq!YP? \_b\Lfv wv#m#үPɂMw\L=S;ʀ! 6"=gϴ 0HbOb> *޴:1oԄMmҡk#xE.[޴@hw Oڼ*:O@r a-&ujMOGDݜ,"Y7 Cn`v䝂s<_sN~r:_h⃦Fnj0B/ecH"ב8 V0io$ 4!X @1O0ygUepd{퉍fO^%[-ɞvU867\4VWCjdF}|kP:zo2%[;[a^.=o7N*IPfWR&_|ཌ ?u bYx'YeU m 6ڵ+6}1YuV !m~W ƔBeǏRÚTYɥĒr-3jHxږ]nFǒ,8[@<`?TF,bE0#W;fhtrf9Eru'HGy0,X$KGvI"!UhP6dKNxLvq)?tym7Qg^f#@Bpp J*1r86|X*1ht$O\Tb5+fRjp׺ab~Hj|3Ij!_Y7(r>32>{%n\ 9b cπ|=2/ϕ{vl\C펱ϗU<ڀ"٘5Fq>;=4oqd[CBV7i&},\9WeEsY/YZ9nzi@_i72 euliq(3=kaOA% q|2,hgäx?ZHopOC0 (,,^Ib*} ŝ+WΟؿpĤ\ekS$|uM,ٻ^QBfշ?s/!\p!-=Ȯ~&Y䂓SIazIZ _y=Ũnw5y,V#ORzj aIM&52LPij5 +VRC9̉xIeτmLb `7ՁP4(1TqwIoޡpf"am7[Ď#YbH{j&_{C}7_b- ONE.H'j:9[D|cqkv%>l!׌~c-Tag7Rbɽ^w|Ml٣mȺHEJmtٷP.M}>|IMilk"}N{r0,׊d~/(4O_2f"ൗ?;'By~ُ%a-]sF] udh0{aXO/FmH\STTV6mj}~#h82!Hvj;3cIH>~J%K!875jҿפRUК )>ڗ}o0q).t#-qg !C&06iX9hkJHl+?-. ,$4w.9QP{Ikpϡ4ȂUY5 XeMQ^==G%?þɋIf>o[[H?RZDl(+Awܱ 71z:"ϒb i1ٕ؟!M/zVi  OJU]Vtiypp6'AFaI0xg!{v(ĭ8\ 38bUHŬSJ؎K1Y2HX@{u+1azDԳ@kxelӲ"1; {q'mbm ksg ܘ@i鯏ZAy s*mAuEC I9ϣ . g[Z"ΫVIEG6 KBk'bu`=SyAx]<GمX쉳S=@o_EୗςU}mcH5z+c>\z-~SI$./hr#{l_mDv]ct38نս>|v}I<#oVڅa͉@g\fGؖoZr9-gBMBĞ7#E<59i*)-qW>>Ip̒ڀAˎ6y% #C63UL_B&D#%Sb$Q|b)Wҷ{uB6C8x~=BqN%aW,O-&5:[w-C~|$eǝ^[9U~8 i=,):,Ñ%5L%DVf;-Wi|qj% Drp 2w4,O6-%Iq>gfJRo5[#X]{ ϓCO8]燆w}LIq _?=ܟwD>B"]{1PfqU4W`Z9mG TU*[F&cZ ?: 0ngO;–^$ 鄛W>X!Owjwvy(g(szBzJ;CH8vIF+6I5.&*{Zh۪=˚^tBCTk iCs~b>Z l~K7&,Y#1p&Q e27sT[#D!zHHW]LA˔86uCѧ䏬K|_СKOb_,fg&3?A3_Gp/HgI%75US԰N_v3FHePE~|&#XW^HP j,^?9&Z9jwtlp+≎Qp.CE2Kdi4_XK7G4)ʢi'Ŧ%~d_'aXJ8x /dʗLa:]7KoQ*~'iG>BxM$q#?lVJm̵1%cU>HJ 9L .OrHmusgT<[K,(FS]N,eԁ'=x$12x05-u]&;=P*'ttIJmƏmI!z՝QD2F( _#E¹ WKgτ1mn j;78-"dT( (y^& a0Bog|;whAҏICZҳy7AQj)G3fwɝRS~R}1(=:JQc%^`bUrXFU1 aZ*0j6eF~Jqr #. k%x,^6ar)!&IZ[dvz&t" T#k4X6/Ѩ$*3+MyZ۳5Ӈ@X />%a(口~ pɚ>ecbaً lm Z"#}">Н=AeRzXP:k9 W|vn#劉C"^ 4~$4,6=%  +oR9b+#ۉ}N`ÁETh-z]D]hmS0m^caE5UP-_GN[uih?r!c -x/?Hp^=f:[\,W WH/c7/v,Ul+*D Y֔PV];ꥰ\Vds=3{?`3 \uO[@jv/8+-1 1D}iDLž%)a.#`fI۹(Z>͛u|$ӷV\oGh(p΁:EN߂<7x#ctN@Uq=5d">&zBּB>(SogON>҆܆IrXw!{D}h)Y,o[3)NT$C+&%np>;ٴ'v*S^Ү5Ht,;íBV#j]v&]J#0 5714ɑ֝Un lDrv~]ޥ ^ͱ$@e9JTay?a/ }U\xS>`e$%8|,mݕ'0)pkvgh蔥賞)yEeY敭J4*a='o0&c\6k :hhzTYHyI8t=*r?SV6VVK|sU)أ0Vr nR܂  !8x2Hˢ*%tYn -Dg%W-8l<+! X]`KGDR$DŽs.{Ç褽2BcPcCe[c% T٬$흏&vTOz5Re.^?b\>\˂?YI\y))W# d67vx3]=.͎]`pm+HMw#yGC݆~t@g܏*_HՏ&z7*+{twd;4@Nڸ))gDȵ o)_qjxRofuXʜ51 ^l׺12쒹wlg &&HxOt&=_遹 [S["5L&l&KxGNjϦ.?BӃuz qħ(,) o%@bb.L5P`8<&guv$JE,HvKv)anDM4tTJGqђm1|>2ysK6I`ro7FYX%Be8,=#RַL凾u@ԯ&u|8`>؜+7cΕ߹NPE/6{rLT>3Qi+n"g%݅Q7)noE ]wj6v]i]m.S:j[| q1Ú'aؿNnʉ_2vC}Ċ^kBs=)Ľ/nYIJ\Q_/pKƲX]3wf\:2]7rP^S'}l ZF8@9 ;{,tɢ+ty Ӽ%`:6qݚ~{m1adr(iFT˔|X眼Gp$<;E`Wavk@F-R]L'!p|i%ÊyJpF,K f@XU ǝ]J"&P墌Dְ j]]J_gf:_+HON#160no(S'9pDc6hQq}X ԍ{`W'QV4m[Cècq`JSpM4-!]i~TgP>ƉD1 J/л= &-hg*Uݬ "^jzBc\ay<2?J)F^S4HW?68QF 맶%E0KAs4_w3J09E__W̋ l$ 6,7GFCv.u=)\.$J8@raM)>uIdžW+:WOluGTfXa U:̱–QokK ,L8Nܝ Y<.!Oo!{ v侪q~ynA޵!AoVi endstream endobj 320 0 obj << /Type /FontDescriptor /FontName /YKYCNH+CMR6 /Flags 4 /FontBBox [-20 -250 1193 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 83 /XHeight 431 /CharSet (/A/B/C/D/E/H/L/M/P/S/X/a/b/c/d/e/f/g/h/i/k/l/m/n/o/one/p/r/s/t/two/u/v/w/x/y/z) /FontFile 319 0 R >> endobj 321 0 obj << /Length1 1379 /Length2 5946 /Length3 0 /Length 6883 /Filter /FlateDecode >> stream xڍVPݳI HG~R*(WMZ$j&*HSAtE҉H"ERyѯ{=gﹻ{'M-$0 ' ( "#H-8V5ĠEpD Gt3Ơ*@啠 J (*Z@`,`&7DTQQAw8B`p0<(bF8\ȿ(DxpJ`pPP /zJAH'`G`n/ -L $ Xz"0[`qA0, |pڟvC`bnB@lP)tF"Bp A=wc$ I0/G? !}`D:fOup,/xh7M @AΧ"[.7vGIp [~}?=&?6@  _! xp/p'J@#pD8ށP $;ьpcO< \ @~}^9{ wqF ih` )-Pii@7j Cy6?hw %#Ϟs\Dg097m  C!}Bĉ]#N18tA17d?Q}8h/鯃 F"qp?}h)$`Y{b~C(;6q5sr '<8n} 1 1XЯz*`c1<%=D0/zy^:ObQI)*MyV vW=ザȎ$1~UlCYaؑsb#h|U* Rر_ oz\K {AUw1cfK iKޱJtQ<"xS'G-Ʋ8;̒3po, _#S?驥+='˻ xtx$c4 WBɗ^v_B[׋ЍLt,Q~—Lni}i?WRR艂ޫg# s++\Lޞ WJ87a0~Ap!od G #XUG4n)Nշx($AxhWy{y] ZiFF}A"eY5ồ89nQM\hvJm~V~>";K i.wզvYӦUS^Q}N]!x`7GVtmC^D5W1"n4Ȋ%ֽ}iJgX>NsҚYݦ]n%ZmEa~m.ڴ2q=Yh 3-7qfԻ\!t+%E s3C&WNr<-8+/7{T_JҘ%e`:ػ=6zd*~@3rdL;J%$X`4p̿͘NڞGف>Igjܠ _?>~hUs׊6iU\O*H""Tnk~=:j˽ ]it|jLٌQ|}/ iĝԍWa{Otymkz~ؼyB}0<^ֲ*7Dy>(oK >xgx`dAjUyZ]*?_[z;;Uy%wؓd0*DٍC&RՑʹ7j y;@b5}QQṔѤW*Έ[i 'OV6_P(q_P?#4V!.S5*Gg#kK !/iepJ򊵓9O /12->wv6ky51,Nx}P1[Fh:K) q|L{aWocrs b,/'1yj4?1~r .S|&[ ۦ:݋xLhi|4)~^n" ܛ؅i{*e/PTa% DAE;hcG4Sٹ2A_=U@:QMydl4HJ/>$riWH퉆tܳS% `';&[˰'W֤C&_-Uhz ri?Nv:+›OLx 6eq썋,b_k.U?/[sYٕ%BڻqkRc(Y%6 z>SyKҜ6IWtBjzn= fQeD/>9gαT#y,hWijԵoz^SےMj6vȹ]WLbQQ4Vp'Ø~E:3jJ()_p wp`?`3N`#,Un}YL^ےxҦ\@5%~q]H:&La뫱P\85݁Ԕreu'MC\_C@car͇fkֶٛiRE:oñ5!v8'GvG55Qkڻ5Cyۈҷ.W3| Wʗ<;7iANIjJ 3Ϝt$ڴ+I^h|֋$"OKPk>/zHrY`ս" m}_ja#}G{YjL󒛵ZEsM1b_K3C؏ seTRdHT8٪ޖq"c OQDQ\|ݯ2 G u/TD5S@yRiV]"wPTo;N.rK̠Okʭ+Am=5?4@em;OḟrNZh#7mRw6 {&6Uo*ܼk"}F'Fut?Kj̺}olZ9ΧAL^Ä$𲄝Z>i3Ql*lmÒ]?J8;eTGyn!X} aYܖQh?_?TmKAy r#|6$F' ɜ7f #ɸ]}i hfK/OZX3LR݉3SpI,׎Df_@ʃ$⋌}/_C|P7EK]qV)d[.{w[FDš8B[gFԡH-,\Yfj6󭀭GNkcn=+-Zh7U]ܴzyGWdxE"+;g=Iۻ%+fv%",5˱)stdgP="em`1WZS:(7-8jLNs8TW`)IIKĤ*YsƕyrUë Pؑgb zKBT^TE|FU?]#ˢ8E4& *nu:(To[%\X'wQ:S*2pf ԣ}LM@:MἵƲ޹\[(8b1\a^h` `,Պؕ|&%!\x+_Bn9*d,Wn-0(3# <~'1oqg&}EeTO"NegHţivK,՟MSZvw92Vl3yTL铋p$F]RdTZq|{pFG¨$뛱KD., ݔcLCJM|_ױS|>SZ:S`y|S31X`%?%0/ÒǜW,5#]7_C.X3JX9d>2ܓR.űAjU6zzK2& Ltd\V1A+3CVzIF/6gfLwي-@T6+ѻ ux̧PZvv6vzDZ  =jGGbI.YگԎA޼NQE/5= ӊ$7;)Տ)G.iڃN Pi;)1s}j`[=I2,lbih짌)5_:矀-c062s5ʄ]DBd:_\ur^Qb6ĉk[.Yֽ5ȑ>N=oߦsZW<'1+U۞S78P=MnP]|+ZO"γ]("?w.]`Po"m+j۰`ԩrՐV L2X§C紐>͟ Zb>[}GM.Xql `B?-Dz ]u+XN}^(xL,]w |vwSUS}˵,ME(|a䰢r]8?_>w7Z,CЗ>1rkzclH$(?(jj=Fyvoney _iN^q}_:;#4tXG6%ie#F^)ESOF*GSV z²Sz丠uN`0(HOװc`x /^:# QsO٫hܳjȋP^Qѝ$0ʒgu&ۤk`%L͡I U ByMUv\{Ew<]a:K{7X{蜢p$4F(җ΃Y-/K2Skx{- ~D|+K'F<]p}oG86tTrD K^Ky{oz4p#Ϋ{LN֤Y@, i-T4绖&_c< ";1VLb8}ܩ:휌린P[͚%UۦomEv[JiC&1S}}$* jWCYaDqbiU|Vo](U e|Rs0pb};2rZ[7IrA#~n{Y2^S^zﰷ1}D^8Ėw>$z H1VLӳ.4M[B$L:?|HCH7mO='THW.9?K&<]xư} );V_p LKoLLIݭcX?ݧvj1 3; SkQz6,fKV3osݵk)B|@ɁH:P,]Nj.2IA>keotՎSs7ɝ`ȓsq TGp}) W/69P*+O^?(yꅠW *NDqltFNc`FLH~Z/`h~}^#_yxi¿xQArb/`ɧt_l*άknj¢褹"W5bL '1&a:4Еۮ) F.Dƚ1.~$9Z`ݶwL &8A\3Y>eaޖ'UWLqsA]XHo yniV3`W?&J _Tf +  c/#=PTc* {ˀlFh7 endstream endobj 322 0 obj << /Type /FontDescriptor /FontName /EJASTL+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/one) /FontFile 321 0 R >> endobj 323 0 obj << /Length1 1379 /Length2 5943 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍTTݛAJ鐔sf`f.i锖nIQw97y>ea瑵[0_ ' `a1?,F`I7< Bm :LA@APD(*+(!M^F]{_K (..; F@l@0&vFwApP( >>^3 z`$ 9%`8@v( @0 Npقto@ #XnW.gBd v(Dq@0_ ( P5:A%Y]OtHEB*dE< C! ~O۠o݋X`pk;[7>C gD`WƁWq/oo3~>.pbF A` @-C`TGvѓG@<fh~,ܲà^.6oA0?/E/]oamA<?Uavpw ?9\8G `6M)U?hQrB{ zG V& >!bM-?(Z0{ߗA*A<:kP GB~=3 ?ZqB?%H~h)"nKs""@{5GShx~;8<|ꗑ_m~oe`isǪͧtfԗZ$_R˘F5KeTdLHH;ʆ^kʛHirIҲѦ[.;TxtNҨK'3CB<)z_Rۑ\*KQ_1>pޓX%9lE+IR`O<ƴ3=ɺv~0B "'#sW8~o*׌ n2hb(kt/h:qœv$^[@Pl.PU~fb'6X0S`f6a.@tSՓjĹ9嬏=F~I#wʃ[JPTgݶ{; sJg%Wک|{4a.K W-B&ÚqhD~ywy ;HrDr?m[0:vCB /4#2t 7F@Ut.Fu~?}j R CԴMJM cG>9^ '~\o4ƸE_<2[@c1,}Kpf9Mxk^j,]K=zwO@2 *Gօq2.z-M-{v}U@$Nd&`ޮRrQxNKvVm3oqf{̎w4 "~G<5lqnm9zƦߩ桛D=^ lH$Da#IaWvWkx-MX߽/҉# t6&4T9zӨNoɧ&.Kcӵabt?Th~1@=J"gt5ƴ1l%8+J:ҌM 2hlwod566B|Df~:]T/'[!YgnH7ݪsgr|˹l,~{MMwgH[AsRQd򱼢Z9ssSaQb Qs[/|vFqK חz1Fe׾'ä2]cȻ"i1'pKl3gUs7X1Y3ra:vL\=ֶl{cbOՅ>Ox].;gb ю Uc}&]7@hy05o8-D`q3#vMF+䍰B9%+G+&nQZ&fuXl(TS +wc#2ŞU=B yG} J֏%Aξm~t8H 4짾V2y)=~L-) PsŬޥpyӝ?-70#'~c'ֽ I&57*n{#k9JQ,a. 5S(t[l]cVHNkS}傁54,N6sl@~_M,URԏXINWM1;r"Inه;gۻtvӬL' S ,S4QGۙCbj> -l睛NٱBeRufNvrzURY T} H^HK|s5cn 錣 7n!dU&9l9XLb'J KX1X[FnM tlj'#@T1m\u(Zyᙒꍁr }Dt֔oR, /Lиr/M3S;yotlB'Ku} Y'mX'grr 9}j7Ks`$^[$Wiw45=A_N45+zJVlmVaq}ʋh \E³Jx@QMz`{ހ|F\䣶Z nU~I7`v7wwYa8-HQ%$u!NJr[zSI7+.וʃEG˜n}Q,ܮ2qY$J+:E;,26'Fhb@+E i:ꎝ}uRGt.sڼh] B6[~ DDץοVRyRZ \j\߳|rm(k$SL`OQmЎOSOcb/Q$Ld*+oc A o*b9o|x4C<,1P:w*qQPz&'ݿ 49y>22+N?(S+ }Ol-lis6Ww<R?z3k-l^|cv/c 6Y:QE|5wva*2Ux([-%0nl_[˾<ܸr14T~g~dq{>Z}oq"|0ȣEz{w]+PC."n}[CsW[s أW,کyG ~'- ~F`(.78wτh:Դ)}Ę}m'ׇF#-VdT 2ʨBi3+wnE0WT(oU?Lx5Q~:.zӒX|Ǚn ETLv3)A|靕OaTl`=uE18o=l*G=!ԑw)ϴVS>7;‹*lXoFh6;\ 9p"ִ/V_dffG|]}.&uNj{쭹Vyz@P?-G2E Kk }QNfV&2և?| ⤟B[H^upGKjQ7➶wfg)i6y»ƴbXebGj^ JMXd=llmcf<.`b(J{NT2|d*S?hI,+useĵ(m a|j2gwL^S%Sԯ`Հ3A8ulDr_`*B5v+Yq>=z, 4խkd:=at8J vfN}?i\'DݣڲC]3+Q}H j璒 Ф"=;=y,|r-°T ;# z An}aF[[~Z7Aiy# I_`\qJA1֨WLږ["K=] i<=2&?!0#g_ʃl4erGH^Eݏs6S$'+m ^/GW$=zonmoi1mW Zj?|opE3`o>zV#}Mςz?Qcsr8:ڶʓf|JmhYxzuv_''(-;;)I:;;Qǖ1agR;iofgw@/FXɤxPw5׮2yq_:vi+r08,ngaoUlJ ?^3]h\ }ĒP?w7r[=.pW:pzɓPNV^̃}d}l(c KKOf'uZeVP[|ճJ⎠5'4'*;o~!M9bQ2Oʹ U)&߃,-ɉ 'fTF7%GTz+t9X&t"yA\~AGC/2eYt2O-)GE6fPo4x2KS:>-fKf?ziT/ +WmEv)oқZ['P_X T/Jq*P6 +?ǻ]|1,t_)k}PȺfN^.Ji$z.Uoz-VRxM澄K8ekS!e42C5Z(S);qsGom&\%=AqJݨ.:o=3 olh֚;wK)bn.X ^ոso7~s8R}C>8-)u\xì۾U ,7S~j8BeeKX%4>#Ҁ] /{W]giKvͥ wO-| *uPp={Z}*d_zX(7C(xkGfN:U.cPavUiL7'IJ}Q#(9 *uFUSZ(QsEh@TZ啵'_ѭ΀m+.LٟevbY'`mO/(FmBr+D{4$U />Z&bVF(X8-U)ȊQaK ű*Lh\24Hr݆`sfȚYNgYgӶQ; wyXRw*.EGRQ"BWw֩t n7f~ǮNsߩ('( hX)+nSzxz1xW[%Uy >/S3@D .w=oZn-yk>mAAYI/nt:O%rr`k8XTe-%Qe{Cup ވNavnIĶ!Zݫq)z59΂3_,DlHdƩK@g96l+%vWpDV&Ŗ^Pe>!`XRݵ(ӶrS)gݔ,ؼLnvgBZ-ug> endobj 325 0 obj << /Length1 1402 /Length2 6034 /Length3 0 /Length 6983 /Filter /FlateDecode >> stream xڍwPֵQzS$H ФwiJ $@ $ M(wH.H M:4?}9{Ȳ H(, $P5  rr0pqRNS( C"d1*"-8@X ,!#,)#$DT`@ I9Un^(7G=@XZZw9 E.uMH{rN-D9*@ PD\ ,," =ϿNo`؟GGM  Mep 8=CC!q!{ܗKH 0N7t8 jкP0# #N@i10: 0NIP$ W<{ܫ)(XGB~9PD\F^8VaU!PoH p@Hݫ@_q@p׿b3H{`A7=C"b=ϏVԘȝOƿ,Row1r.C?St30ZCvk(HƨHi}u"c7˜v E1JI72˕+Ac-wJC,'"=WaK777)ܴ26R;$mc+jg1܁GMvƊ+;5#ѡ':d5\ֈɷڴm+ݱ.z5\l'[4F(}q;X#mRdT!eX7:Wj04:-{K~.8)ȌOPx:B]íD/2 \yGjƊL؟V"P.1J}zϑSTW]U+9 GJâFVB0,uW㷁6#;\{x5wq=P325;Q?vy ?;nCA9A7;2rHH>O32` hn)6QHCdČ],? htGmGt1RKUZeioB[}V7{0=?o lDas k&Z˜G>ekݼD,2c.o_@}*#3Alf7N-|L&KK^0r\k)Xr?{IZeζKRRMȵƏ7Ϣ_yrs 11p&jB敀UKnj괞dJ3i6/MEZz 3ys1kf / ,=%R0k lHhaҧ hb`paV.b/CDUޅs^JSҕ|D $P]A { V&,Ve)/5a9 HMU1J}nQh76hZ~OL [}3,xDP-D,:\j1Ál y%,;vؚ ѩOdd[N~V+ۧ|gj\[]5w ^wy.E;T9Ɨ=v]+X\Cg&2e-.<ޫow~௔?=LczJ`uyjz:@ҵ" 8<_D?Y0^rcÐtËO_>GD*od#,tzv(Q}%O2w> ~Xc~m7pM] H*[gu$Ci~PtshVѨ0 !glqͱD{;|[,yooUۗӴ$%^1hWRNwf_VW˪lL:^3ZN?n*gultFrF{/FSL'֍ИNwi\˵itvQQ<3-@xoag#L%dlZf/05$ oL5^=|폠[Q1ϙ rmpdlۦyKǕx%JȀ瞥J@RJ.' S;*cn9©Q*kۭVrR<"-=|8s|WoWa Ї?307՛l%#)ޔ+%+rk,2mB_g<Ϣ>ߦ{C $RВ6pVdԶ$G[i~ߡKJ{sZQCHgv O6S1h^8Eٶ4únBZt8+r4}D1XW:!oSJ)TküE*W~t|̇7w~ KW8M4p6xT*٣J8~sS4۔jQEU[Q=A rw+L_,t"{_zg<qYk9P(T/w.@R;!R\s9)'9!k© 튧imσ Dnz۬ yjz^m0S ST"#j@p#dܰi-J% *W<%&~O,Ԧ8>u$Uخe/q;L>6-cOW':N/#q4b}LVr[4$s*6Foar6:=B"u h۹a2 OmIΚb\ 4_ zʼ}!u:ԭo2$v-FK<Nc`LoF ^_:YSgf,|[XD2x9mq'ބ3Q<A8+Ѧ?ȗ(5V&Š1u+4 5o? uvzr]㪫l`8&xJƉ9SBsw+8 IGbӣ/)UW6b}PwU*HƐ=LX }_nRĶU')pͦ;PB{+a m4h#Er%nS0wf1֣n-P$i mo>@dyܴ+O`"'m{ .*yho׋\5W$iD%XkJyOI-*kJӾ JȐ\ZrL \+qo,2.[X9qxwArA\) _z[yoMh oxѠ-e)OLdM$~N807=Fqr iZV ]{6rD}'44H~QөbiXd'S-g~H戭K~IJU,vh72M!inL8dJYZ)h]Z,FwXtZ:*wQ;%Sj "!"?S/>Z[U` 5O4l=31Dw4ee>cq??$Gdw*GD;U(\q"m= H`ٽ9瘝iq>!l۞ŶU g\3N& txkb>ookr0lʏEDV@joBAD**fNK֔pJ/n?VhCr&F~rD6Z1 /2(A4YO*pY_V5/zyMy}&0Йqi}524=abhg?F˚IlŇY?N`B_gk{hHcM zr1}Zvo&1a;؉ ߘ9f!Bi%îAѓCe_$zrυ^Y|/otɠKu1RϝOQ!^LmLrcz8wDI0Q?X_]2'\)ժϴl PUeݒ|YaFMz΃=%,]){!Rڼ/ȅm8%*DYܺY3+3 v7hxmFfGVWNZy1zʴ2Z=kY\ 7m{h|K~ʅI2ۥjj"(icfdQõ~C&n%$ӪKp;5cxkXѵUq6Wy{làafחC y\?3y[wV9jVi_5.OTUOd?pih}VL7Hh`>a [;HR\0#l{w2BvdQ ?3'|dzakܢ@RYFwi…&>p61@^̣hiFzb狘i*4c_o J0h"}AXjaӈoqLPN.K1nYAjF+(͋I3*vUBw_=8)Q CN$gdB\ 8L'|ϪSg4lz緷7&_(Q?Evv OK[QfYQ̗YL.;;0v$>>@)0}w;N]صQ8tqwly|X%W_IM>h\mP+$]yF&\Ǧ|`:pYp"(@wɍڲK x2AMȣ SgV vV"Wb};  RYqo]5 sZ_BF-gӳPrUQ>$F26,1C{RT?u2$ZeNC?,M˝(^͞]ε j4¥vV|xM]q1a$oMe&5gOSndYFɧ#W81`X2qCX5l9nZU}=ۂHHh|P"X}Pfsry0n_767hl7!=W!t 9N"[$/}5i;9f 8]6CǯEt{4@ݯk..}]LWfdRi?eEvT8oa_,_Dsݵl<X.ِ]s`Jy-~0 J PIm_MᒩkZ4e%| 9Sh ]SQR\✰9v]zR쪭8/"2*5w9j/ g'keKAWk5{ik%CIN^W|ϟdEkJCWPa'lhD9[o1 P:Q9z> endobj 327 0 obj << /Length1 1775 /Length2 8744 /Length3 0 /Length 9855 /Filter /FlateDecode >> stream xڍ4Vڛ"j؛A#!b(F5[fUJmjOs${]2i­!pW( i @(ʪE:C@P8L7 Fd`$Py8b@ @(= >qc]}P{$*_6 1?]  # .6`g. A*vq#e9y^P@AxBlR<@JuS CzJ QG<`t4VӀWq|/GP66pW0 A!Meu>72;Q`3eeym_ Hw>wAY f @`Hw_S" 6\' 7AavҰpׇA< ٠Dx!H  nz>?Ĩ\;THjXC0?` D7sԄa>b~5y#_)TP{xE"@@LD_7j]70;8@P;Ͽ㯭78j! (A ?GF=siу]>YZ 8jA`kjs5 Pժ";SH2bE89E hݡ8^ tqB=UQCAC*l඿OPDF >x@Ԅ P[j c|08uJ/`Gꩨ(_O%q$W*ʋZ_@Y%TH*ߒ_ P!*oB-.j!*w C5]=`%dsPшmudi?٠Y{f\JMkIa7` K^"KԦ'24eO2 Z\-nq_3NRq-[1L,>c3xRi5z 4T9g4>TwVVDѐ1eLCƦ r*MDپ`yqA}.zc,$\KƚބY=!] ɀp${nA5n9,e|RZb&׊ȃJBK"oJg ysl~bd˭}+k8ؠ|Щ ;5 u Jѡ 1F}B+;CmXX"!4w/ݧR*Y-1w*I/aΦ1mEJXhkoޭK|q)Bl<6T>xXn:0}ƹQRd%D9#%M1dwȪ:] y G90':6xۅmH7 Fa'sZq@pל?6̪3Jhb.Zҕ@Z\R@{5n?q~qjv^ JZ-mjƸr|$^MGpYEmc-O/ϖx[~LM{Ptٚ2,k4Γ<$ЊКB4D9Ԯ;* urs-j݆y(m;uz7o:fXT)zIa7R] :L)f}?ry&#TBWubnWAoeQ"] {6'n IiG"8r "-ߊ z#`" ^|jG) m糴cPIҖbCy+|F-^ҙz͐LV8uZmkMYBӫ @SEty!qsCl#MI~fA8Y`wjT!XWP{YVk s5GEn ;Xεb|kME|9 p.HVTgt冷. pI=I!|]S:ҝ11䕃hFe,ρMxyHDaiQ-t@ҟ7s#0toiME9>Q*HWMz\>^k&<)Amh*@vZ)mrB Do3+l8Cq?eۼgy!<]jSw][AUM]tvCm3[Jp3Q4~CPMz]_d8A\8@s73MvGV;'Ef$ Tw'VzNYxC+GT~JϹ`2T=\D|]efT9 >d7މ@vj7߹`$Uz + uc^3?.] rߞ Hg6+@政$x%4iٰSPo*,S1U<49QTOQ *@{7h>mƳ| z?_l +J-Y8ʓT "~ض>bG^kYC['%Z*]dzF|r!vJCipHShxF7H._倫2{FWu (O$/zoi8T gUե F#j+SdLJ0cנx2$z:1etiCB^vB_,¯i2zUk,Lz*_ҠWZi]eȦNO^]nvut ~Up1DTj&+v n'G0ESQ.TBXxN'w=d%mam.f+ѝ;aX͟wBZ\9uWZf- K LgPV~M}W{HB/xKe+)?Ox i'(=+ʊW<ݯ!(|emoC]H27>])ڦqE'F7#Ko!Sum6uICs,$P1ew+@+~T" r'+".ě} A gyˣ˺[5YqM9q&5,aV0+߰,KIvԘeoE\YU^ ZYFԭ|-MmIP$͋u[Y_4$0e8MOlz#wPoLb'M d(5HMLQ kr M+-fq vÑ8hd WԒ +W-vEP5;hV c+_eV#T˷ *Z_ 0MtWT7/bJZnA??l-TȆTtFzM 2 fzA)-bAcjGRs@9&IVVu!!EG&Ζ~Ԇ<Á{rMWzdz$2BkR-I#8zi vdc\vieWײ!Oe:auR  s䀡lm|e1KOU߹Z}d>C3XN$<0k JZo|ϟANI:7rBӭ6&_mISN:NGjNVyAz>Ru!uEu閦-Nbmu@Dk/T=9Xa le:['Boh/l%ό_XVjy}*X~.` h[DUrG#%.TC)$KCŖ`揟N?˕й*yuD`cpe$sZ*n''3¹^ Mh^*`:bL32F“qs}1{{Lp!1 V#FwXB9޺J>Ìs=O_[ѯpFT";>xѝ>\͵(q4hᓟޝT&n9ITNu )en  T^!(Oy'3t/h kub1wqWy9.g'K%3/?*"JWI]"5рoCb9.xR[jtO2I=3|%`Bd l;تOhuYvV->෤h_svBSÇY,OPYU&R“ߋ~YuFT@Zg֘~J QAڝzH 4 G#d1\|+uZ_X,=g;TѣSM2:w2~` c0Ǧe8 Χ"qoE$>Y*ҤP4:~.l,>S7i@AEUqsKMrq>]wj\Tz"&(`Y>n;IzJWYku[J"Q:Z 9XߎP_'M;{vǾ^+T: $mOٵ}cfuUYjt]OMǞ,?I]h3mT-+RF%HL$IA#Z jdD[J~~yi8d&ƵvF;GBg i?/D陛Y#@+gB['.K^*o]9* "|폅c*Ci;V82!eLf tð>VOBoyA`5b*'C+sŒSKZ]Ǵ<q>6͙K/h 7x)H&x/wP\̥]6۠<`+? Q;IyNf 2"Sj}yl ՗EsA @?fePTlH8Sf"MO/YzW}lOcuQ# >*PݺC<|#H-Q/m„̽L04ԓi1J•bP{P`0pQw WPq/WLpryDzȽmSC-WK Я>4J-^Ļ,7_k %9Y/۪Q|wv6EǞ6^H:R 쩩 P%!R6'-=S[LRx @d3mA%#Ib'.,ny /} KoJI)#Ζ9$Z1=v2 {xuTVʷ[}+ć @)lg^8kFϪ3Ql IXfjs{)UvhQnM m5|= Q'fKI2=h5v:s ZM3SX(Huq]o>⭌j`>m"4mwr#XvqdʈŬ2ԽE=-rz<$9z-u*,UJ;S"8PژjjRO8iT5DE[:[ ehqaXs&a>+5jf Rz>%,2:M%cG(MPwA局)©i~l7vjwJE9ox HY*&*w#Z *Y|vPe; [ehYJc"0crVȴʮcr!LwihO[)w}*_P 9*n[dzG)o];`>Jy!uÊa#05jKtE bV!bo ȝ/e Mʂt#(ƹ|v8atiupV)栾^ZcNZAM6Mش}iÛfa@cQzRqF᭻,lGUJgEšUcD[D:wnҸ KX ,n8OQwTJREBQv{Cۗ: G;m)dϔt}nM^ACptFhs>"˄v+$p$10}>C GV,iO3E3@cbz>|KM}\Yrb\S'n8ݥޜ-/~=Ö%0NtsԪ)=$c7CDnXg<2\@bNQ51k^y-m d. ݚ}CPc谆]ϊ1]qsZ] k/yӏ<:^8 ?¦Ӄغ f q(2G-3 xoT4 =Sa761+氛)3 8]Wyer9i}#7Iɵ%k\F}zGܲy&<^Epg hvx~Yӕgج>XN6"'W Ceuбp9wThqT7UV 3STg ۻқU 86X -S ?0kc¤UT]ыx(q_KsQ+2vKWʷ+9SDoK6W"ppLO4Rʙr#Ip> lbHwL~Nel[iVLKzB'Itތvdzٻ:Y ~W5?- yT HBWVjD: %K .ַ''5`<{o~8YZR^SrIoRlRW<ߦNC?BdLR^M\Y&s5)YNJ^4MWQre.{:t7-YpP­H=[t;Y|}4Gˑ ƺ·7ЄWqͯ8Y2><-E cb}.@WykHK4aO o?3ӟֿJfQ:_.J.`W(f]> #Yi[5/|ݟq6Sy(W7N_uw/>]p>d}0p&pǾ<^Ur I;ї-g ɢ&o?nݩD3,O.0MzǛQ5msiJ9P>jzQ e9aj$DHn- ۺ[IȏFpRS-LPU홼iZ|aDvϹ[ l>1nGFRH )wP?znSr MbOiǽ'lWx6> endobj 329 0 obj << /Length1 1599 /Length2 7305 /Length3 0 /Length 8350 /Filter /FlateDecode >> stream xڍT6t #--9 93twHw  %- !(]*7zo1?W+Y8|[{wp<lA _H13r3>$|ygd- ++p)?,-  ]oǣ d.3 ;4aH>lS>A>y ~q+gK[8B|h @ !Zh ˿Q5rGdHs?{ vD@ƀ8B0{i/ z gG7Fn?*@A0_+( (vwE2y#w^( 4 k q '5 Fޑv_ 0c~$󲵁 #kX'RWl SA_ptEy#DF6 pa pu24^ܟ17cL, /Աrfdlk(G3+"i8' YP.@( lɞp;cQO gl'YDw_\ 4x}g& L ͲBfk\l?HkH{(W/1A+|p)cշӺr%y:TҖ\CyD])m 2* ^K9*ʾl+`$m;?q8uѸImg!I¶Zai&y&q 252:iH]4Kmṙ {. '}` .Xܭt}C[֋ ^K"[zcrtR0WΚFM&O>4d|qnXZ=d[Xd&C=p @ w ;;xL󩝼&9jǜI/ ߦ)4޿^BK_୹G,F(s"xj2* a7CXjS2CQ 6[et! ʷf(! "`pEb]i7r%2?0vy#cTq(]HcUc1"=%?|sC ]v27Fϓ{sbt|ҏ[ }lOȊ(qf OΩ<+9]z;pa_sͿ>WɅȫ똢Cγ.'S&]`~k¸8GQ/a ~rLwh8 SŰvY ܚ?BKk`g"j^:y<' c/v! XO30Z%uTXiq vH‚ %Όb?ݡ-/TzE-%qߺH o,EE}@bG1f^҅?RxZQU~-]kv* {I2f'QKs`,{Wr3Gc|Mu<_4:IΏ/ }jY&žNc/XuŰw|Lnzt90ߙFҟ>N|Bޱ֬D V>S5(0 Mi\KA~ =-OʁKi*UFߩJ@Dn8T8~qFmS"-q^rQ nF{,*#߁P;x{H5 (]WdOf&XCG"DT"Is?/ZK"AUlOٟsdʫot<%z޻6 +>e+m;8\zB[/_%T#EOI¶ &dz@u9ɡ5o{1UɃɻ6FWMziY/K_E%3XҘK:tDzBAhqPNs1\izXa핔w "4KFC^:˨G?и& j+imNc)HJfImRް ?YxyM?M}XwR%g&IaIQWn2۬JYN@cIB_%` {]6Px?6&lK"u;a(1[}^m/hm_)? Y&a"7uF]:39;3?ޯ%G?ٵ~%C7ʐ>=|~S"Ug';f^ ZTnit˻9>{E.j ~,Oz1C\ζ&)OY9(n݌AOhx*\G'.j76}mZ1/U1t׽.ve8ܟ+!hu3 'g+ +3hP94ioda vQ9(PD"tC%֫M5엘wysHھ4ih65 z4׎\ɭj4=)u8T<ˬWjpء6Y9c &bKvQow}sD;)b둸X&t6MC~^aC&9T\/g(/RKaLgi1+Jt Fa^.]*-j;4j6XEaSO/A>Ϯѓr R=a)BFަb (o`%cJʌcKlL_U^#(Q 8,O蠎QFh-&SG'Ԝu?ʂi>qz}tWMw嫷Sdwe-:+FCbq[.sMk]/Wz v+U܅ È{W:?/Γ[)p>vE(b2o+JG7[ {`~\ov4?2*eP;ůWaĞ <עV5]X}:^Sɛz \K_, oFb\˝5[1,/Y[fCϼCkKMY kηKu23VjlYwmu^S_A8 \}N{t/t2]NfѿTr–uĿ?|TpDp<8 Rf"Oa繩d_;0l_ yxQb}v OB~oz uSJ+=5/\hxÒؔ"m?}Fcڻ@rȧ-3T0n_ Typ-Q Y4]21c:Eo`i9WAsɖHb 9?kcA(Va><ܗלx1Uށ׳[ NC (SG@[xj׽gPP_[gөk:cѽw\SZfi NT4~G ?dI;D5MhTmHkRNr/*qơ_MWq~ܽS,B@h"cZh9{vͲp^Ԧ-zp)NӵkK ;gXuZ!n.;_^>>YcŸ`yA:ol\c饟_J^П"QuXH"Yס6ٝބ@k3R[ԃ8v{}9ɍv+ZJהo5? .[0yi\BFj*DJ] {],ﰫ=U"35>`O~"z#0kgOJuõ1)=RY Σ+xҳhބ<ҞdiFDuWC(doĩONwJ[}!y> endobj 331 0 obj << /Length1 2017 /Length2 15466 /Length3 0 /Length 16694 /Filter /FlateDecode >> stream xڍP !xp03Kp{pw =gwb~Ov3SP*2%@L,|1y5V ; %%_9ގ_bN@#лLn(oob`errXXxkh7r43>(<,-@y1r3:Y@@&F6U{K BX@|nnnLFLNB 7K@ tr(`d OiL5 Kf 7#' ]`cis~wq3:޳Te@2`9V&ֿ@v::yXڙ,mEI9&;`dgԍ Sșf ;S1{[[~N@{0p,L(ŁY(#w?2s :&$PpdC^  9}_ 04vDd>~?^?O?14J[;`eep?o;*Yݿ"ؙx*{-?A󟵡oyh]N?OG$]lle7vh3m) cg9=ٮ.Cv;Ssn"8 RT-UwgM &#aqyxؑ ;D3;>֊uP8_L$I> q\)cJ#8:Bv<J=—5RJ>^; gL]J_D˨HmB@mƑo‹fS/VI][^.)( ؿ/9;)][vx:A_99k6a4IIku~42)ƒcѶJطhXEIPzA{4"%)j1yF7e.Vs;5scS>֫~HoFHrdF_KqB}@m["^xTɥSڳ7Y2AޫyӖf/ۄzoaϵ-2dk}!R3@,u7a"RV?{S8jW]Y ERe=EbB^:IƲr1ey;WKx脡Fo~];/7]}%fL?ʷڐgKΑɒ`Vz]zU/d0"OܗDRBM*J"JG*zaa?Pu3*5ݣܜVomOE(D%Ud93\ ݤqCJ2ԯ*k߇ HN},ۺl " oPvխ*N$ a>;w!}]>O,u2/뙝h-ۘ]3>JNx/!ʃɨ5l<Uݶ#fYSHp >yַH'ĺd`N6G1kRr~);ӭ @Nr Mn;Yd45{UǛL A̫VoVnдh[ԓDÒY\?ؓ&q9QxXRNpCeH6խNl׵vd>/Ũ#DOC[s>9Yc:ڍP$h7" #Ns#(w8m왫_2s0JLv̯8+Vrxg٪4' 6 +nTBQylܛx@enE ;0֣D1o|rD2ƼiV8z/5M< 5B,ћbL R@&tM:jA u&ۂn4ȺBC@ͼXxēWLa㹖"vzqޗg@&`ȩJ9ysgƴ7y=&w=Hs;udz5ʑn5xqFrPL nMcF!_6+_Ţ q`i$BBq2.% g9zycPH)rgWr;:x-,3wMCy OmN{QmJhؔfkltŞ7򓷢2g=`-pGŋHOu+)(Ey,yv$K]+bHM0Mlcg]Nô[ӧ6?5x1>mQYtK0;@|?$mJ>@Z.*r$9 hǁ%8wbƔlѲ-6;]+yGZ6TJ(Yd7φc~奉yE0(a"BQ!tfb/}GUGYl-^1{تs.Mtb1.ЊEt DJ%"v_;7u[mY}_ ذ׍x~Y)mr?&%( V1zvU>su^s,b45Fvdq$u.͸YgT0rdy.Oe-[6̡RUx̓XjxxCVU&dzb8noќxWSl=p+mcrjx4K )+sSi \3k8u;n$_bҗw̜wJxalL'KQnfc E`wAuў9"-zBN3/ɨ03,ܾ)b%9 D5?# -μٟڬOرޭ-)3a {09 WTMJ\6TSI2 H6Rqb-\)"JՌ jzSg) ayw"Y|w&nvOS;2Tyr" sDoz+_Hu969n m:qNSOI"F4/747?L_?AʎcU'i3R&[^Y* ^p>ZP pz ԔUQ$*,mb5^Yxc2gػGnLI' ,VM F꣥hF>:lq,7 v-2K_𶹬pM5c ]޹-W3b鈃Я3|OHQyaJ-fnp=wU-AD- [9]^iMM#Ou΃![~GTM e)Lfj !'$,.¯ajf,:5PfFB-LQMnR7є?DT:x[*vedt~ES-G,.ʩ* sJ nІ/ka !Z0osK3WuEbMD pF֫4s6&8=Ag_-_;>-.Yɍn7OX %HT k >ISJO™'` }_畘`Sk'p9~jrA0T\dMcP sB?g_EǦj͡4/NCӭ{uEyToiG@Ş’ۛK*`O@ee93ˏU\B{O~[8@Q&=Z[5lfs&U‰ye,zW.~} 4JP'̓q4 U`wGӞ{W潿3 FO[ m{RݷƠZ%ĚD` @#g!}/. 'EJ|dmㆂnah0s 5'X@_6zkv;&M@iI?bdꚮf%XuѲQڽP:dmU>p:Xb)r Mhr$OjYlNdnAyFr[ÀUt7q B8Cc euSϡGqYaW&ޱ956T1U|c5>_'= piIbu \mF)Acs\fLӭzdV犵_||jwBw)wt .aPU#Y-)ek ufM8}LG..V]@5D} z^~0tNi6xl+0/u 3=-xQTpB9[  B@k݂Z ^j %[3t_w|,7:nΑ8:#YU {Ԭp`LE{_J n_Rf!Bx[_لCqҠNeZ?JBrj1QTu5A~_Tnb}!TnehzdŀyJЇOC!92Dem/~1j-!s)+o!WmʕT4۸h,lh-MA?tP,D3(?.z6_}4b͎ܙ̶LKYuky[u#2Ke`@3;uj06ĜdÆg@K~[8+bI"7,P3C7qXNypa2:B :8جB1DoWr+hk3g` Ep2tX5A'7$Mraz%3IQ5&4bK?ō{n2`$J(OZOzd5_X/372k[D:sx8/`&~ޯi>lH`.c&%}x䔴=W|GgbixMmyo(4Os^+x`;ЅPg$;MWı7 ,IϷq &u0xDdu-JI9h}˹1oq!aPu!Und euf$ y= K:K5eyxN` 8qLۛ;DuEjIJR@14@5ht׭$t*b eX˰Q |`6oᠠXGCfr a?ȧ 8&~آZeX ~na1B4T NQrDTokY J0HycTM f=5'轲`@u;hG? NU{FΪOy= /8o1{sѺbHB6oϋ@f[z^/LAtcwE(>2 ^uLފ?NV~[Im$b ~"EVS3)(L/[Kiq& D6iq&}YZa&Ǭ\&c:[!>˟qAOuS /U`RUL,ihDtW\&vL.f:F/~U%a ܉$;'JCm,26-rf -tQEƟ0M(|D2T2j{`w58$:.9>'`(tOhM'6RQpY4M (pE!l@&C(E#DqCLh~Os=ThRUL"! YBb<8 2%4e :UРNtsO|;ccB0g_D􈠜ad}{\־/f2 c|"`?aeVv<UϏIf)Bff!#!J}#_鉷]E Uhr5\b5zՙ P߈]@#峤/Cmf{LHfQ YjE+RJ("|KbbS!N0lkuWlC2k/=>\²nm 2c{~ maWƾXkW/z~AMIu#dJe1[ l(nVxH)7Xs#kf_lba)K۬ҷ#W|^luLU?!~dk~_j40啭qܹ:Fe4g% uީT4u@+:6*J ~ZE6FqD‚G%ha32!HtLcӍᠻK3 &0[YR m/jJGpE7hћ8=4~&!m>u3[`p\mP kóe4-Oʌ uXJ6#Jloz ciI3ϬstE҇iЩF ~(3 kW:=iT436L5|17銀CDžUCl|Ps".>ɑZrڎQ Kf0%Fݢx܁lqZ[C"FQsRCg`#]㵸)/(Q|Z~fK8bkCrZ `-\*u;}il AB'^ÌeV@t\aNӳBA%bϓq7n}oFUcG Eq*ߦL{_Q@YQFJ0}aN8:G?=AYE v& W9xA%' NJg[JCE("./W˃B#l\7Bw D1㮠7ӶW٘IEXԈN٢Uv悼\RIl=;pQN(+;P!RZ'+STWV }pOY"D[8l> @')t ~k} =-]{DNz @̚}t-y{E罰*`l+ɠںE+OV4 d8WXy  +>Ppm7hT%mJLoDq$8Y''dWNB钕 [zWIRyO/P-Z$~TBԏ6d(~{Dޯ,%["-ùl?¿!;j(xI"\TsOY|(&?dQKoE@Ҍ)\9aK %DX򫅗^eRJ EE XйؚCq29(KH|#Lm(UX&zY5jv0%gQ?~&uWt/rBH>uu+/U^z6lH:TZUvqHؑF[rh)t xWŞRQ*3洌L+O}gQ>,E{޻Ž'(OSU947^NKJTgM} Yݺjԯ= -qrBsdI|o%$-b"̬#)39IْsR,jzҜ %:+|b tVCc@/*GXӔ&eT6a/V !6o=gnMZ,e~0$M}Q|i^vѤ'^a)V}wv`EbFȍ25b&4 [|ضeuq0IcHz;0tEߎ~~Pk78a;Gߢp+"p]g3[e~ZZE>J>=\YGMZ/SB>ڕR"KM^ÛR!H#dٹUiIoFЦȄfe!*%Y| W̴.XyJuJjП*p*mg pbZ4rDp6Z\˺nYWA7P>_RS^KDh`]e͠>衸辍V~ ŸqM?1MmMjzz}7d.U$}҇|(Thy2Aɖ͖1AQI4g‡L#DkGE,ĦNu&)Y q`CU禶@ BI{Y̓=V{;rp@}q/,bpһQN4b~IuV*roU.B,ͼ}"Dʘm"6"j 'obw!f'2%E)EY&wa0`FgߏĻT K#ܤW"wddhX|<~̚ъ& H>IT#C4L(8ұ,3^J C|[wK Y]fD%%T!CjԜy RQFc3LNgu,ʅEM_\lS^VPNl MD7 =bm.S?uQ/lZ=8S?JZVD1fRb$Lt\=fo"W}pɈ>>|/bwK]c3Ħ>SOV* *J{9.C>!ti!1e(Q%tcr⾶P*,a'b9=Ȕ#vx:!bY;N0gˁ!; o9вgFn1Y~&ϬNw%3OG$Ձl&+ יW "14y83¦;etxwJPEci0~5w)?Q> C^Gm&8pn M ~NE# agH/2lCVch6bBmc#LjGC6i R_?Nw2Ĥr)2IF/skӚj1_~/%^f?)2V)E/^C%4'"-UV2q |#uU2Տ[S,c_lPs: Q#=> |qJ1zHDXzVX [/~p@f[@,^vRG#qQӪ-d0Fי%%Gqjx ?m | )|+ZGbn;]ƭ׊L) C / D˫9G| _,];.1;uICjDS G$!Fr)ռ J$p-:L/,Ja'ɟQ䠃}m9E)x tw޵:=lbfʬ9Q*aS[JT໺%a񰫜ҐeZs{k넣iUa5ɻq~s/r0oGټD(ϟ6a\|o!e ]:\|/笵mT$A[U(:qp}"x%eMOHpt0PԚuL53m\WD41,愒z:4Fk;޺2{,^e0J^r :CeFw>%8wxW@My;OfE(NPd:ܮX we1eЇah3 lL1]Sfĭjش"9 2UQذ `j~U-!U~E!B9^( 0  MX|Re@B~CԴ8Pok,9A =mWXrZ.λ olX.u?0V=IuN>>kA32pX*T!Tռvf:r u^!ˆ-2WP7tY[{ sBazƝzr6>˸I k{f1"Vw2aoʄt9w,_l'+7 © d>nrKڸTu~l\@YMtRX&ƋPU&v525^<@w}|+Uڴ3[X1lS>eHz/gO^G \*u" jqdgqpwB x?p}܇ (BߋvؙnJnm*H7K{#k q(";ؼ-|G–Ᏽi4Kx<˷ߖ>^½'\wEYE0 tjӴHNU 3h:.^ϾbDT J!몹+r㐏 "3'T0qM:8>'|EUT ٶPy'Xvw1PzS1˴)?ePF͸j ZK/-bņvCo=xgt Ыo$ʿNy-1 @$G=)(9B/X"G"TlѩynۜZS|c#8U4իI&QN rRΙH'\_3z%ouh#QT>!& Pc^eE;h ށm '@:ϚV3:zW_?|+qOIa>T:׏^Ds2*y߻tyR#`xD0=JGFz?'.OTbKQмD}% ay&*L~.Vtpf&=o(Ͽ6}e%lv{Zecеr?b_[8M첈Pumi"_3M1qtkgRhj{E;RnH|g7-8k6-Y sl|%Ƭ|Q$((cR{f*M;-Gそ__sLE}Z'&нREXкyeFV|vHg~RD_^&%Gohk 1FєGnWV-L>O_H1Kg8{WVin4ժO$;ۏ[Y+|{bқ~[Go_ Nmȩ˒ %_% w$z]V9-% c%rFnoDCJhqim¨*!pO1l/_:=RYVZDم,Ml#?QW%UkP3|%>^SOk%wD`ܭc6xC)eL˻U&Q8g/O;n]JfU7p. - $ >*W}j=?+w !OsPx zG}P*}݁nۉ7u WR(riDU7*,jCA YB,/'&KL."dS<"VҀY .G1+}>]a~l&,eEWO68:yaIS؃FAV ܿ2y?}K7p}73241Y)/Vag-D#יX+(W%Ϳ 6KI`gϛ¤3pn_\(ֈM/ȏJ"D=L=`E@*qeW5;3Ou*R2?%(L%e/F,uFT:Bo,D54Rich3lK0I9.]\j-7]ktdFSJ8(-d_iࡐ: k 0(1]կ@U}t?ik\=eoH 7jQ,AUIiB6O]wF逽)Wݬդ)蔲z*4aϑO?Ӝ5&{BH!KAn(#8b`=#GW JR -f=QsO&łi=k{Wb~abϴ%pV'e' K[؎3gSs"Ltq mԍ-85WcFnG_\wř gzVj|2ȂeQlA(ׇZ{jILQ 8[.3[Q&)ЯVBDH_S#\'tQ۸Y^\YoOO^}U] P5tS8#N=*8GۅI9ٗV\&͵?ƈm4@:swT B <#/xMgͣ9S ҁRaι5*tQo:!k4ؚ@%G*OeD@jjl? , ëx7URVL-ɩKfr֞)?K&s쫲 endstream endobj 332 0 obj << /Type /FontDescriptor /FontName /YMPOOH+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/D/E/F/H/I/L/N/R/T/a/at/b/bracketleft/bracketright/c/d/e/f/fi/g/h/hyphen/i/l/m/n/o/one/p/percent/q/r/s/t/u/v/w/y/z/zero) /FontFile 331 0 R >> endobj 333 0 obj << /Length1 2772 /Length2 19853 /Length3 0 /Length 21427 /Filter /FlateDecode >> stream xڌP cnwww [pN.5ޜs=꽢 fu^m{ s ɍM `cdac@ִusWD ڂ 2)37 ` 8k o:zmLd3@p:j "do!m]eln6O`Tur;ҬU@FoDi' _0ͼ e%8 GV 0_-%JFV߈*XElV߈7FV߈ *A(F.oA \T#E7p \4#Ht]7Ctf"N33GgȆu[-o3G FͿRv;sh6_'Ǟ_9I_ adrL%\\IxΉR!K  o KY@A/X_ja!&ֿ@?M ..66@?, 2? e? ^-T 4P_N]Hh'wGU?(AVo?NCupN.} R[)2[! u} RDw#?w!\;s= 7ĉ+y#va!O Ǹ@ ć=gq!B{^@HT? 1>9C<a?;W_( h 'dޝɠg]wߣ!WoSG0VwVȞ|6 D%?=$#}*!^?HH̬)d -O·sW`]jY8Xày n$ν篮^8|79-UjrR^aJ/n/ѳ@m}&?0Pgs/og GA0ufsDh)JKHM$R#AwokJǕ)1mDmf5%x_{|=~veTvSs^{^CҧhH؅YMԣW\P+2ZX\.N 3|<=Rͱ,Oq+a2y Gjn)Y~i9Pؿ5)/xĤf!| #n^CY@KsqN,ʎ~PAaA`24DI89>ki6V͑U9xc2} eFQ Bs-=/EWF52zzyTEH$Be`5-Rw%ntϘ]-ڱSjcrlY3.rŮLpe; htZe75r[.>Z0pmJ6KQfYɇnQwrxEbxJ*h,bemuksnsqt+:>q;K(*=:uqY@f/pzue~0pK[ې#j+3]Tc-Ƽez_IpevώFS;^b/x#3_4Y]"hN$IO6}CNNX]4C˾bPXvkϛ}.nm^of>G3ćQ,?bhFo#e,8;-pv.x S!-_Y񬱧̦z2C]15ٳOz#S(P kK<6 M?/΃GBP;#o3p;%ȽS(>?˜46)),X )OMMNQeэzvd$q5?/-FaTGbIu%t:{LPoQI xzpL`Ki0&+)/ڗ6LD0gMIRh3IhPiE0s7U|58rm2/~; cquGwlV^9YyĴv-wyYsOtׁ1*XQrۡdӗ28X>Mc>Mx '(IoM֮w2Αhtpz{QZ3*4Mi}CX$m'?v{2c{lK?sypF/=Fg 0-v5b”&{PI9BTVvx{ }yvQ)W%+, @gV[X7K#i?=P.Wʹ(%?!eVJ {GWqrm!GC4zǶ˞?ÿ|Qծʄl#T<  f$fʘ> :Z>Jy 50t9ʌr=Ks$)li`[m`~2 H&/@ [_97 g燯|:.R}WOLpG,=SBQʿ6vSF-Ce~U,+|?1o:f6=56ց*gHq&QɟKYch >J gb½f@qM1O@]"sф}ITQӜECbk88~'#jQ ,g>WcΓ6_{'{J/µ`} ׻EaHb?_P름^Q}7wi1̒$]W1`d8"ωփ2Uj|Ez]}2]*N9dIaEK' I-IRlTʡx>r!jCG3*aarLxѬ$4ɾAC#nk˳DU i)2yLhZ./Ih}`cI~ϾNlBsL~B=PsO9 M)bD4CrD귷Skgm(HNC[^d8[ixnxԭ37֡@<T?`lÆ>^֎>uJ(Ǖ{ayb WК) gM+0~Du*Ƒ_PzTa}UW3KNS1oձe>k{gY&[f@>!fI.tv.%P)b|Ŵk4aa}nol*YtM\|ZNlQx4KDV=MTA;4{7K׏xْ>MY%oM|k8bH-+w]}hGvt3E`7I5/㮝e#qJZ|k;n_纽> ~,O[S'ło;fbIDX721p,Ox3u/Se_Y\KŮ;獕=i2یz_{{-)DFD)KzшϺZ, B4v/~X"E p/Ⱥn?\^nŌkYHy*YD;rsU䡨!-1TsLEǬPA4|ÏJZ79\_Wr6m#L7Z_\~)%24xF&'9-)(OʨˆICBiMF}̅wY&N )I ηP@uziq[tBeG"&y-U?퍅Ą%^VV S#x2P( Ófx.m+⎳YXCg6LHj>TmDˇ;8R^|8 s; b' Icd"2DtF M _R[7ᯡmB6Y3 jgN8D/%OqԂ*p( #n3UTmnt4w P7FMD&e9_k2i"ORH+ԉbKIw&|9yVom7Qn2XK@̶AYd/ zvG Z9Deۢ.vHcd16c ϐL?nNH/:_~?7 UX5hWzo>O߻w&%% GԪ4}%k5IwA>c6fЏ]-LW"X2 i,#v &!IRpŞw@O$ }^WT#3KYͮ!7~>2[z\:_5e2Jr߽P甘tc_ {FlKWq \,s Ckh}p՟#WM{\[NXu,NlDs?w?9zx Â2)Ϋ?b˜ M_t4t7$A^YAS]eJ}W2{T?&JojgZ 29X{QU^{BsP9Iǥq.Hfk,UH7 jnx9kSmG5HI)aapR EsTBN9vakxX@n@We{s|މ5ޫEgz\g#/MKǁe7mڴf^縤(} [xbv%%}r6K"r͞Ԑ#7=`00o,D\NUí),򌷐"w aI%J)FY ~d. XZ*d?i \呵o!jbdϭ|'.ͫ}qOdk㏉H<ʌkQ#i>fQ،fʬ%ۇn_X v%7<; W:-L01PP*xQjQz&՛6%.|(䂣,SD ݊J7g)J f l=PP 5%gRB_z (y}"HnQpᛑHLɆ~ɱ]8O)܅ե|JHc-sge[f^xSz(MQnj'qgge殛."LoHK9btEC_AŸac旼WyvVHI *cBx#fIs#8J_ڣi?q}6ddhf~TJv]~?8{Z~3 vl.8ceQğV}w!m^<=k9-1-)b>~Ñ&FQg\muG7:9(|gDbKdONj C:a _i:Xcv,J9y#m1\7gp4*Sšqkۨ@qo?t`3 18̚ĎЊzoI}A{şfޝyitc_b6R!lo͵LQ!d41yPDƜ4$kQ֎ (Z^YQ ( '[y"^FceZt)HtԉL.S?a}|?f]4gΫe#vfѣ &(ŇIC_Xk翠ҶOgn)Ȥq^ m,bשi~^aai{X}{n*qsgJ !VG~)Ѵ#Xd&:IxQlI=Q08U>ˏ@%U]o8fCYIPo;CuVHtʚ8??25D'WTzWb6IX&;ݒfÛaf Kyqy47(,uWf}dY\9ls_/t+[MjLx_ֺ䵹$pZˊxz(aFavvEږ: hka 1B/'W%poB˲Q^|oTN鬱97=Rv=-)ķ`AÃ>*krCl*&[J. \^IAI`峑Lyc>н'jvexL3qc._R ?O~ZZPbgE@cĠٷvm#ef ,m s9,+Jd({pA}GKB&k_&b4ISjKNmwS ltW_5G}́F=! P}+EEرzNKDWVlD RA:SO"U׶Jk/2M t$ўakPͯP#}pD8sC6,R~] smp~ͯ_c'p;شbYrmmW~B3@405:ͤ}H\{Uڼߎei;Ekf=P9ygߍD}tR^DMsʊZ{^Lm֞A^Uc 'Z7 yo.SMtWa|T3UZػQxZWس'PXkZ埑hlXd$*[D\Lli6?|H*$%"애DAQr:i]T |Wsmggi-#(CZx {^D 7 a/?wX57&E_^MCi)@)0h',,P ~5H$/%WicwcpbELxk>݉)h0װ1Mpk"{BGJoUe~Y2 ͠䮏Ɛg26jhcOsFz'-*vۭ]H()ov輋[K㧯>Ky3=7yq, 'hLIy/l>]|[I)U#p[$RYت@)lJid 5NI{UOZ(8yq䈱޵`ػ{~LIqD$R,Bm?~N].m/Jc,~JN,M;`=Ѻ#oݮהZ;Qpo%d5:t93xѹsjWvx;IS?mDB/"o7?uҺoC;1`Ҫl`z;G\"lg.Z5mͅ+_)Ʌ2=T9+ Vêt&CNiqX|_\+`7?0ch<)"ZEuHoq]o|3HWtW֥)PcriYwV屖UW̓ xf^)iR0->6D$XJ $_QCx(s_ ,lR])zI7yLؕeͯiRm'QF<G^ۮ/b<0ff+Qdp.=T xj]|Hgz^yB'*rpori1 ͧY?8T,LEm#,(Ӈ=Bp!a!2Qw_kCH؂ޑC^i ?峨hV9i'U~VgN:~-pxOE0~K^h)r5wէR=UY&OKW$ίt I/Ŗw0@CX~/‰{pI` -%nܕ3QStSEA(t7Nx [0bЪ 1 اBKGm7/[MUЛEO}l>աcEc L`},}v=bc`XpsbZR\d[RAYzz3[1 d35OvөHڄKM-u^ʃEss٢R˗u?(1wZqLƦ+||$3WA:鳁': [.5*v\qo"pKݭ;b#M]ރʊPG rMjqЈ=(q@>`;&'z_ıCgpB"O-V?$2 5\Ѵ츬I>b!GF\0ANVAo~fw a.6o‘^{d< N ;W\3bXo!v]DqQʼ>X(^5dBj#! isD-m2(ns{yGNMskjWBF\ۯR4"R 0I%*EoGF缗$V1G;SpϨ9NRK#mo1}|]UWUh7e8b #'O ,Z.{s{Y@Rb0cP=x6uQ2*D+9bLܞC$Bʱ%=&^3(VpeQHMB,ͧ\VYhk2\?+:$Œ>Tɼ&7ud5oѭKsGMf Rqg0tb>~Ӿ"=zG>SmQtj׬]d7>ڋRǠ O[0]QZmN>)i?}J(&à MYC\d-Jō-YvĊ铃M1@J  Uغ}mnnYM i4ɥ A} 3%hqJU~wFUPT}u3V3.H$[^CК1fC/^дs30J[YoNJX4o9U(޴;PrIU?Eqmy'ï Ysg,aPǡ)ءH/{Jk)+^q( , [y~_+W?ǣy].ujgS%q]{pDc4SVvoaI&iQ1墾:Ez!VGڮp)Hfn: 0S燎 yʚ2Z(aE8#va1H?`AT-$kF;P3T:p">K۫' ["VkU`UWb\a+,L/|ӢͮvgwDW()9jGhջ4p -MsڱԀoE,}r=G"ˆήD+/2-׎9 9H w-j~Kn,>ST+B|kw\;egAޠGgLJKU}o^i 84J+NG+k1aD1hDR ^HgZMKda {3aozٹq,%`87XԤ]]{;V ~[XHI'vNƅ n(MvD+^_+!gZ}cM٘)B߶͋*]Pc8FmP0Wp[BS Ӏ\d Uo^o}U@|GQ:BJ,a*D⸠Z:iZ|rgYp ɻ矞߳}%ˇiH=u ůU7&=v0[ڞV#Ba-gK-$VNoz:{<ɦN11@AX+lfX۠]r8/-UMO)TE^͇[g \]:v}/1Kdboi7Z)(SO.q\_J*{`ti^Hm?34}ZGү+ʽX5q؈ːTOs>5TZIy]l)-}HG|ҡwXi2æ< 'dVYengSArTP&_ҭ`"3}m ' ckN /*j [bi--SFAJFCMܐ{0z7յo`kCA/m2$Vkoz]ٰ43u}f޸cP~ zkcǏl"ӌ˺$ϞTE'vm_}n?SXQii72t'PD1>ٛuׁ'OQ/g ~Ӱot4>[5>x 0~}x*1Pr<S$plMUŻe(Ce`f6Iݶ&HÄST ?{'7? JZu?]բNj?|yEW!1t:Ť Jm.[-> Iۦ3ʶB@dse_)B~lU™55w)u XJG^J1]<Á3z8§Gl Dq{4hɚ:-[JL[WD'0r)m vĒH g4$ƪJTz[ibH\]/&i 8t9ڗɆTMNssz)*2k8%G t98< fd #⵰Ǟ;aЌswHA/3UdPױ͢ ޿tU iʶ+Cde^VP. غ.{bTD2aOBWhY1!vBkTX)\mt44#e&].>~QW(=f^ ts2Fv΅vN22߿TIB^GqLt0 1}_v(a_Łϳ [h{ctd7)W= V^ e#WG91.#9Bo|} Jd.زXnNI?@Y4{mg 䐨l>gG.is|rA] f4h6:ufp6L+TC)hIxLIOohgd0jW!r2^VŸf$S~t k R!6qܩ/`2]] .hyh\;܌L4a߄lJ,=/Ek#+k_>JYI ~J鮆<3;C5+~$`s]w߇wV33 -5 pŁ]ș]g,>^i!32%2<~}X(kŒ>sP(%$l!\]>cmgo3@pq1G3 u_~**n2e@{/eԍKǭ4mV7wpHٻjqJC Z*(>&TSUڇ.skoUX ;OYv0DOqsᲴUeo^s `bim6{7LP̲G& ^opd$UDBѻ+$Iuu{,@]o:1~k:Q&7x*&fאGl֚iA \5ӧx7v?@-¿ܿ#m epɹLP7{~h?+MݓY};u!3ێ-5(Y?)Hh,q >V3ogR$gw-3Sq"fCtŖe)vp)1FVhUk 7[-Ѕ毱`hŬncɌ^D^O}i￈΂Ww{? (=alN&w#wkBzB=G@dI-.ja'7̳I#<}Pk ȴnN:N~]8k* 7iPpS_`EH!|oQ֫VPc x+OŨljpu>KyȔΤe"<6Gzԇ˓i[[Tspƙ4۩ׂ/?uՋc"0`ț2g7mF7 G.0NQYQg^k:BdVC"govTE*1SKb)K FTps'i]c ﻔϗMfTF_r1oG- $z &QaxNfϡf(Җso=4" wbO\7I^b؃Bw1洇w?\Ρ l^Ed*>kͪ0CYJϏɤ/G1+3qI] h}+M /U9 B\Ǽ峞Dn6RX62ZN`x&&HhcrvsMhc>~8PQK9ZqU ƕE~ u.ٌfwK4!|m&2e?oi>5{̾LOIh-ŊK. J~\/]!=ȸѮ2jWԳodAV*JHrzh3gۋ ¥/$5{ͤF^ew(oG;V!~.x ! \fˣy9ô /r{G\ǸI1u tjW.X@(1Vhpzֲ>?f:Ƽ/I\h53&Ly;MsO^ y#Tm80곚n-)˶Dlʐǁ>ÝQWX0m(p2^-Ky<~ : `Y%L(j~ji֋TXj4|Ҽ/ <Ct [\>NgW7])_LF,P]6@Ja }H̐HhC9E~I疚e“R"13'#?W/L˓䒐hZUj̀1orCFedbg^,esU\ռ\~"h*sFk{^17Ǫo ؿoaz//YeGgw)!vˡYnȕ4ޡ>θz~ʟѕ-T$!,Exl(mG&zUT\1L{D\(4(a׭6?G(j臗/j?Dm4WsbZS>/jPS/2Ƕ3/-?={ mO9s"T.sB@PK/s|(G c2WeWL(ܧ>$E_RH:)uY)E뿈ط iW@ xyV]XoOC-:UX*1Ƌ5F-}a;\|B*JTx[6YSgg#&?~βRhOJ3=Ey}>F6e[_uC\T:?B>6;puN3-x0hF+U$ ~ZUG SŚL;:Hr?j1e}swhгqzV{ 5B.4WЧ0Gի%W;[!{Smq1f^@nhW7܁a{ṃc9w7 hf.WNTlUnI{]pNQ9QCN4O禴ljm~q nsls,ED#>}2lK>}=̃?ɦE]-ߺ WAJ0E%?5PE{9ԟQrEP3Ov,1 7\ŁS'1 (?n(y? xsF%GŗvIժ1v";!/ o)h8S@VPh|7GE_unegs%[1ȥJzlCH0e{;2÷/')GJ +b{,;,2$ 1#d}Pf;ѥ S5`R:^g@[%l-@&yS]+slCⅺb*~]lsUV }ƺ9Ks&kw)C uC['e4@DeQ!q(ei=N!1vHƹJKJTYErܟ7 VeLeaX(P%>㓟CG74c;ʙRRʟ1q;~/:s]iF<[uGӤ;J3s}\qyHfxw|<? 4$猖~$%=.$hyB[/rF#?Б[ O *|OUE5*  ?WQfk J3&Ivs~aj;Cr{d>ڍgsT m)HQks3I֓{+=9M(i8+@rs.>Jv:tdu%P%OJHi^לԳrQM2ӝHB؏2?ќ(lGD﷒ bv\~!b!7;1.ufsZFZP"m3Jg1_vA߰H.`\dPoucƀ(L^34Hl՛`U]/L Rt^jKwfh5I4h򍎤PWKuZvTBzYDS#twY!ZWǨ_51lswkvG j bݩg҅pj&/=#ۋO 飓gt U_qUź }Ə͜ĞɘN<&I1BʙfT/|#_HbDzuh9qx&*uXǧwG&?zf%R,7/ı[Г7)_#_e{[OA/t 'HN֧lc,wW 0M冕껯T&xm8<f_?6뭣1D"4&LX%uH}QԠU_j4m џe}ɚD4TL Q;Ћ_ ITVI6W7oBu%'C1ϰ=܏\_ғ >樕 ޅ,Pp2N@L:g m 55kI",Y&>m&x?1f=:%rPFS;IbqMhmbsmGډ/8_%j$[2Hpcs}\y+la+!O p=.*{pE;88v [x3y xJx)-!yh})_NL7G9v(EKЛ,U?)eujRX[giH $Ťt >ݽBQꜥ +fhPUg}wl3 =VWy9!Ʊ&: &󠬘uT=*K ɉ_07)|lD7\)ne4qp(SdO:. kǧbIz+Lh,r=IY]'G MF?߲{$$R)i7Rz6gF4BpU}9_(wŏ[mx^A\q-^ .A m:Că/m*}6+FjSQEZECwb2`@&[^#t#fBxy7&](uz;`ݭںV碕IDMB2&D`B<kn;GGVfc|0 \%\-?U@_gDkN@#쐚r Aǯ>m6hA%"%'S bTy>(wr`_^d:Fea'A{'\)vcPcE? vӯ~,ۭ -cM 8 с2ñ VjxĝYE\wLR 6i/jcb1)pjMHC0f h-@ ?l |%a}Q#V0''+I W͹e9(a& qlݫ?s!:k0ʬKlu'!q~lz$Iɥs Q.pO}bI3Ƞ3a1~c ԅCy$ Z6T ^b5Vq4@ТBI6ߴ)mQ}G.O< ѿ)q*IهXᑻiޕg0 30t6!B(^t:/W ~nѨfQ!SXhg#`f 8Fݠ'`9I]Cب,gYZ |Ƌ\}/h.+tit endstream endobj 334 0 obj << /Type /FontDescriptor /FontName /PURZWJ+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/V/W/Y/a/ampersand/at/b/backslash/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/q/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 333 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PNTHCM+CMBX10 /FontDescriptor 302 0 R /FirstChar 48 /LastChar 122 /Widths 294 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XBYENY+CMBX12 /FontDescriptor 304 0 R /FirstChar 47 /LastChar 122 /Widths 299 0 R >> endobj 28 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AFIOOE+CMCSC10 /FontDescriptor 306 0 R /FirstChar 98 /LastChar 117 /Widths 291 0 R >> endobj 41 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BYKEND+CMITT10 /FontDescriptor 308 0 R /FirstChar 84 /LastChar 121 /Widths 288 0 R >> endobj 43 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MGPLPB+CMMI10 /FontDescriptor 310 0 R /FirstChar 110 /LastChar 121 /Widths 286 0 R >> endobj 51 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QSQKOE+CMMI8 /FontDescriptor 312 0 R /FirstChar 100 /LastChar 116 /Widths 284 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XORHRC+CMR10 /FontDescriptor 314 0 R /FirstChar 11 /LastChar 127 /Widths 295 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YROTEL+CMR12 /FontDescriptor 316 0 R /FirstChar 45 /LastChar 117 /Widths 298 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YFAHSK+CMR17 /FontDescriptor 318 0 R /FirstChar 68 /LastChar 117 /Widths 300 0 R >> endobj 36 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YKYCNH+CMR6 /FontDescriptor 320 0 R /FirstChar 49 /LastChar 122 /Widths 289 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EJASTL+CMR7 /FontDescriptor 322 0 R /FirstChar 49 /LastChar 49 /Widths 296 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TNKJCO+CMR8 /FontDescriptor 324 0 R /FirstChar 49 /LastChar 49 /Widths 297 0 R >> endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EMDQZB+CMSL10 /FontDescriptor 326 0 R /FirstChar 36 /LastChar 36 /Widths 285 0 R >> endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JAXCFM+CMSS10 /FontDescriptor 328 0 R /FirstChar 58 /LastChar 122 /Widths 293 0 R >> endobj 42 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IXFQDE+CMSY10 /FontDescriptor 330 0 R /FirstChar 2 /LastChar 110 /Widths 287 0 R >> endobj 29 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YMPOOH+CMTI10 /FontDescriptor 332 0 R /FirstChar 12 /LastChar 122 /Widths 290 0 R >> endobj 22 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PURZWJ+CMTT10 /FontDescriptor 334 0 R /FirstChar 33 /LastChar 125 /Widths 292 0 R >> endobj 10 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [2 0 R 12 0 R 16 0 R 20 0 R 26 0 R 31 0 R] >> endobj 37 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [34 0 R 39 0 R 45 0 R 49 0 R 53 0 R 56 0 R] >> endobj 61 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [59 0 R 63 0 R 66 0 R 69 0 R 72 0 R 76 0 R] >> endobj 82 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [80 0 R 84 0 R 89 0 R 93 0 R 96 0 R 99 0 R] >> endobj 105 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [103 0 R 107 0 R 111 0 R 114 0 R 118 0 R 121 0 R] >> endobj 127 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [125 0 R 129 0 R 133 0 R 137 0 R 141 0 R 145 0 R] >> endobj 150 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [148 0 R 153 0 R 157 0 R 160 0 R 163 0 R 167 0 R] >> endobj 173 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [171 0 R 176 0 R 179 0 R 183 0 R 187 0 R 191 0 R] >> endobj 196 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [194 0 R 199 0 R 203 0 R 207 0 R 211 0 R 215 0 R] >> endobj 220 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [218 0 R 222 0 R 225 0 R 230 0 R 234 0 R 237 0 R] >> endobj 242 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [240 0 R 244 0 R 247 0 R 250 0 R 253 0 R 256 0 R] >> endobj 261 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [259 0 R 263 0 R 266 0 R 269 0 R 272 0 R 275 0 R] >> endobj 280 0 obj << /Type /Pages /Count 2 /Parent 337 0 R /Kids [278 0 R 282 0 R] >> endobj 335 0 obj << /Type /Pages /Count 36 /Parent 338 0 R /Kids [10 0 R 37 0 R 61 0 R 82 0 R 105 0 R 127 0 R] >> endobj 336 0 obj << /Type /Pages /Count 36 /Parent 338 0 R /Kids [150 0 R 173 0 R 196 0 R 220 0 R 242 0 R 261 0 R] >> endobj 337 0 obj << /Type /Pages /Count 2 /Parent 338 0 R /Kids [280 0 R] >> endobj 338 0 obj << /Type /Pages /Count 74 /Kids [335 0 R 336 0 R 337 0 R] >> endobj 339 0 obj << /Type /Catalog /Pages 338 0 R >> endobj 340 0 obj << /Producer (pdfTeX-1.40.10) /Creator (TeX) /CreationDate (D:20121003192859+02'00') /ModDate (D:20121003192859+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 341 0000000000 65535 f 0000000690 00000 n 0000000585 00000 n 0000000015 00000 n 0000420279 00000 n 0000419280 00000 n 0000420138 00000 n 0000420700 00000 n 0000420561 00000 n 0000419997 00000 n 0000421552 00000 n 0000001402 00000 n 0000001294 00000 n 0000000811 00000 n 0000419137 00000 n 0000002339 00000 n 0000002231 00000 n 0000001493 00000 n 0000420981 00000 n 0000003318 00000 n 0000003210 00000 n 0000002430 00000 n 0000421409 00000 n 0000005449 00000 n 0000012727 00000 n 0000011726 00000 n 0000005341 00000 n 0000003409 00000 n 0000419422 00000 n 0000421266 00000 n 0000019485 00000 n 0000012619 00000 n 0000011865 00000 n 0000030255 00000 n 0000030147 00000 n 0000019612 00000 n 0000420420 00000 n 0000421661 00000 n 0000032567 00000 n 0000032459 00000 n 0000030335 00000 n 0000419566 00000 n 0000421124 00000 n 0000419710 00000 n 0000035202 00000 n 0000035094 00000 n 0000032718 00000 n 0000420839 00000 n 0000037471 00000 n 0000037363 00000 n 0000035354 00000 n 0000419854 00000 n 0000040627 00000 n 0000040519 00000 n 0000037646 00000 n 0000043178 00000 n 0000043070 00000 n 0000040790 00000 n 0000046130 00000 n 0000046022 00000 n 0000043306 00000 n 0000421771 00000 n 0000049546 00000 n 0000049438 00000 n 0000046258 00000 n 0000052359 00000 n 0000052251 00000 n 0000049674 00000 n 0000054956 00000 n 0000054848 00000 n 0000052535 00000 n 0000055815 00000 n 0000055707 00000 n 0000055084 00000 n 0000056782 00000 n 0000061519 00000 n 0000056674 00000 n 0000055919 00000 n 0000061398 00000 n 0000062969 00000 n 0000062861 00000 n 0000061665 00000 n 0000421881 00000 n 0000064111 00000 n 0000064003 00000 n 0000063096 00000 n 0000065525 00000 n 0000069486 00000 n 0000069556 00000 n 0000065403 00000 n 0000064238 00000 n 0000069051 00000 n 0000071418 00000 n 0000071310 00000 n 0000069706 00000 n 0000073904 00000 n 0000073796 00000 n 0000071557 00000 n 0000075795 00000 n 0000075686 00000 n 0000074032 00000 n 0000078880 00000 n 0000077680 00000 n 0000077554 00000 n 0000075911 00000 n 0000421991 00000 n 0000088922 00000 n 0000078754 00000 n 0000077808 00000 n 0000088235 00000 n 0000091461 00000 n 0000091349 00000 n 0000089086 00000 n 0000092160 00000 n 0000092048 00000 n 0000091577 00000 n 0000095256 00000 n 0000094109 00000 n 0000093997 00000 n 0000092253 00000 n 0000097138 00000 n 0000095144 00000 n 0000094237 00000 n 0000097035 00000 n 0000099574 00000 n 0000099462 00000 n 0000097310 00000 n 0000422108 00000 n 0000100226 00000 n 0000100114 00000 n 0000099714 00000 n 0000101270 00000 n 0000103003 00000 n 0000101158 00000 n 0000100331 00000 n 0000102900 00000 n 0000104989 00000 n 0000104877 00000 n 0000103151 00000 n 0000106216 00000 n 0000110253 00000 n 0000106104 00000 n 0000105141 00000 n 0000110139 00000 n 0000111991 00000 n 0000111879 00000 n 0000110401 00000 n 0000113848 00000 n 0000113736 00000 n 0000112131 00000 n 0000422225 00000 n 0000115125 00000 n 0000121137 00000 n 0000115013 00000 n 0000113965 00000 n 0000121030 00000 n 0000122459 00000 n 0000122347 00000 n 0000121285 00000 n 0000124090 00000 n 0000123978 00000 n 0000122587 00000 n 0000126283 00000 n 0000126171 00000 n 0000124230 00000 n 0000127382 00000 n 0000129919 00000 n 0000127270 00000 n 0000126400 00000 n 0000129815 00000 n 0000131525 00000 n 0000131413 00000 n 0000130068 00000 n 0000422342 00000 n 0000134194 00000 n 0000133120 00000 n 0000133008 00000 n 0000131677 00000 n 0000137901 00000 n 0000134082 00000 n 0000133236 00000 n 0000137795 00000 n 0000139240 00000 n 0000139128 00000 n 0000138074 00000 n 0000140345 00000 n 0000143551 00000 n 0000140233 00000 n 0000139368 00000 n 0000143432 00000 n 0000145381 00000 n 0000145269 00000 n 0000143700 00000 n 0000146422 00000 n 0000146310 00000 n 0000145521 00000 n 0000422459 00000 n 0000147670 00000 n 0000149281 00000 n 0000147558 00000 n 0000146527 00000 n 0000149178 00000 n 0000151031 00000 n 0000150919 00000 n 0000149442 00000 n 0000151907 00000 n 0000157640 00000 n 0000151781 00000 n 0000151171 00000 n 0000157204 00000 n 0000159453 00000 n 0000159341 00000 n 0000157770 00000 n 0000164811 00000 n 0000161253 00000 n 0000161141 00000 n 0000159570 00000 n 0000163348 00000 n 0000163236 00000 n 0000161381 00000 n 0000422576 00000 n 0000164318 00000 n 0000164206 00000 n 0000163500 00000 n 0000169257 00000 n 0000164699 00000 n 0000164435 00000 n 0000169155 00000 n 0000170365 00000 n 0000172356 00000 n 0000170253 00000 n 0000169371 00000 n 0000172249 00000 n 0000174190 00000 n 0000174078 00000 n 0000172505 00000 n 0000176120 00000 n 0000176008 00000 n 0000174342 00000 n 0000177782 00000 n 0000177670 00000 n 0000176236 00000 n 0000422693 00000 n 0000180398 00000 n 0000180286 00000 n 0000177851 00000 n 0000183061 00000 n 0000182949 00000 n 0000180467 00000 n 0000185580 00000 n 0000185468 00000 n 0000183130 00000 n 0000188132 00000 n 0000188020 00000 n 0000185649 00000 n 0000190759 00000 n 0000190647 00000 n 0000188201 00000 n 0000193319 00000 n 0000193207 00000 n 0000190828 00000 n 0000422810 00000 n 0000195824 00000 n 0000195712 00000 n 0000193388 00000 n 0000198330 00000 n 0000198218 00000 n 0000195893 00000 n 0000200782 00000 n 0000200670 00000 n 0000198399 00000 n 0000203257 00000 n 0000203145 00000 n 0000200851 00000 n 0000204909 00000 n 0000204797 00000 n 0000203326 00000 n 0000207253 00000 n 0000207141 00000 n 0000204978 00000 n 0000422927 00000 n 0000208842 00000 n 0000208730 00000 n 0000207333 00000 n 0000208911 00000 n 0000209032 00000 n 0000209055 00000 n 0000209146 00000 n 0000209770 00000 n 0000209941 00000 n 0000210403 00000 n 0000211066 00000 n 0000211203 00000 n 0000211594 00000 n 0000211993 00000 n 0000212428 00000 n 0000213072 00000 n 0000213097 00000 n 0000213122 00000 n 0000213524 00000 n 0000213971 00000 n 0000214286 00000 n 0000231590 00000 n 0000231933 00000 n 0000247881 00000 n 0000248238 00000 n 0000258539 00000 n 0000258788 00000 n 0000261942 00000 n 0000262171 00000 n 0000269777 00000 n 0000270003 00000 n 0000278079 00000 n 0000278308 00000 n 0000302740 00000 n 0000303260 00000 n 0000314318 00000 n 0000314610 00000 n 0000324376 00000 n 0000324624 00000 n 0000338746 00000 n 0000339040 00000 n 0000346043 00000 n 0000346263 00000 n 0000353262 00000 n 0000353482 00000 n 0000360585 00000 n 0000360811 00000 n 0000370786 00000 n 0000371061 00000 n 0000379531 00000 n 0000379854 00000 n 0000396669 00000 n 0000397010 00000 n 0000418558 00000 n 0000423012 00000 n 0000423126 00000 n 0000423244 00000 n 0000423321 00000 n 0000423399 00000 n 0000423452 00000 n trailer << /Size 341 /Root 339 0 R /Info 340 0 R /ID [ ] >> startxref 423719 %%EOF Chart-2.4.6/doc/LaTeX/rgb.dat0000644000175000017500000004311712026413630015107 0ustar reinerreiner 'white' => [ 255, 255, 255 ], 'black' => [ 0, 0, 0 ], 'red' => [ 200, 0, 0 ], 'green' => [ 0, 175, 0 ], 'blue' => [ 0, 0, 200 ], 'orange' => [ 250, 125, 0 ], 'orange2' => [ 238, 154, 0 ], 'orange3' => [ 205, 133, 0 ], 'orange4' => [ 139, 90, 0 ], 'yellow' => [ 225, 225, 0 ], 'purple' => [ 200, 0, 200 ], 'light_blue' => [ 0, 125, 250 ], 'light_green' => [ 125, 250, 0 ], 'light_purple' => [ 145, 0, 250 ], 'pink' => [ 250, 0, 125 ], 'peach' => [ 250, 125, 125 ], 'olive' => [ 125, 125, 0 ], 'plum' => [ 125, 0, 125 ], 'turquoise' => [ 0, 125, 125 ], 'mauve' => [ 200, 125, 125 ], 'brown' => [ 160, 80, 0 ], 'grey' => [ 225, 225, 225 ], 'HotPink' => [ 255, 105, 180 ], 'PaleGreen1' => [ 154, 255, 154 ], 'PaleGreen2' => [ 144, 238, 144 ], 'PaleGreen3' => [ 124, 205, 124 ], 'PaleGreen4' => [ 84, 138, 84 ], 'DarkBlue' => [ 0, 0, 139 ], 'BlueViolet' => [ 138, 43, 226 ], 'PeachPuff' => [ 255, 218, 185 ], 'PeachPuff1' => [ 255, 218, 185 ], 'PeachPuff2' => [ 238, 203, 173 ], 'PeachPuff3' => [ 205, 175, 149 ], 'PeachPuff4' => [ 139, 119, 101 ], 'chocolate1' => [ 255, 127, 36 ], 'chocolate2' => [ 238, 118, 33 ], 'chocolate3' => [ 205, 102, 29 ], 'chocolate4' => [ 139, 69, 19 ], 'LightGreen' => [ 144, 238, 144 ], 'lavender' => [ 230, 230, 250 ], 'MediumPurple' => [ 147, 112, 219 ], 'DarkOrange' => [ 255, 127, 0 ], 'DarkOrange2' => [ 238, 118, 0 ], 'DarkOrange3' => [ 205, 102, 0 ], 'DarkOrange4' => [ 139, 69, 0 ], 'SlateBlue' => [ 106, 90, 205 ], 'BlueViolet' => [ 138, 43, 226 ], 'RoyalBlue' => [ 65, 105, 225 ], 'AntiqueWhite' => [ 250, 235, 215 ], 'AntiqueWhite1' => [ 255, 239, 219 ], 'AntiqueWhite2' => [ 238, 223, 204 ], 'AntiqueWhite3' => [ 205, 192, 176 ], 'AntiqueWhite4' => [ 139, 131, 120 ], 'CadetBlue' => [ 95, 158, 160 ], 'CadetBlue1' => [ 152, 245, 255 ], 'CadetBlue2' => [ 142, 229, 238 ], 'CadetBlue3' => [ 122, 197, 205 ], 'CadetBlue4' => [ 83, 134, 139 ], 'DarkGoldenrod' => [ 184, 134, 11 ], 'DarkGoldenrod1' => [ 255, 185, 15 ], 'DarkGoldenrod2' => [ 238, 173, 14 ], 'DarkGoldenrod3' => [ 205, 149, 12 ], 'DarkGoldenrod4' => [ 139, 101, 8 ], 'DarkOliveGreen' => [ 85, 107, 47 ], 'DarkOliveGreen1' => [ 202, 255, 112 ], 'DarkOliveGreen2' => [ 188, 238, 104 ], 'DarkOliveGreen3' => [ 162, 205, 90 ], 'DarkOliveGreen4' => [ 110, 139, 61 ], 'DarkOrange1' => [ 255, 127, 0 ], 'DarkOrchid' => [ 153, 50, 204 ], 'DarkOrchid1' => [ 191, 62, 255 ], 'DarkOrchid2' => [ 178, 58, 238 ], 'DarkOrchid3' => [ 154, 50, 205 ], 'DarkOrchid4' => [ 104, 34, 139 ], 'DarkSeaGreen' => [ 143, 188, 143 ], 'DarkSeaGreen1' => [ 193, 255, 193 ], 'DarkSeaGreen2' => [ 180, 238, 180 ], 'DarkSeaGreen3' => [ 155, 205, 155 ], 'DarkSeaGreen4' => [ 105, 139, 105 ], 'DarkSlateGray' => [ 47, 79, 79 ], 'DarkSlateGray1' => [ 151, 255, 255 ], 'DarkSlateGray2' => [ 141, 238, 238 ], 'DarkSlateGray3' => [ 121, 205, 205 ], 'DarkSlateGray4' => [ 82, 139, 139 ], 'DeepPink' => [ 255, 20, 147 ], 'DeepPink1' => [ 255, 20, 147 ], 'DeepPink2' => [ 238, 18, 137 ], 'DeepPink3' => [ 205, 16, 118 ], 'DeepPink4' => [ 139, 10, 80 ], 'DeepSkyBlue' => [ 0, 191, 255 ], 'DeepSkyBlue1' => [ 0, 191, 255 ], 'DeepSkyBlue2' => [ 0, 178, 238 ], 'DeepSkyBlue3' => [ 0, 154, 205 ], 'DeepSkyBlue4' => [ 0, 104, 139 ], 'DodgerBlue' => [ 30, 144, 255 ], 'DodgerBlue1' => [ 30, 144, 255 ], 'DodgerBlue2' => [ 28, 134, 238 ], 'DodgerBlue3' => [ 24, 116, 205 ], 'DodgerBlue4' => [ 16, 78, 139 ], 'HotPink1' => [ 255, 110, 180 ], 'HotPink2' => [ 238, 106, 167 ], 'HotPink3' => [ 205, 96, 144 ], 'HotPink4' => [ 139, 58, 98 ], 'IndianRed' => [ 205, 92, 92 ], 'IndianRed1' => [ 255, 106, 106 ], 'IndianRed2' => [ 238, 99, 99 ], 'IndianRed3' => [ 205, 85, 85 ], 'IndianRed4' => [ 139, 58, 58 ], 'LavenderBlush' => [ 255, 240, 245 ], 'LavenderBlush1' => [ 255, 240, 245 ], 'LavenderBlush2' => [ 238, 224, 229 ], 'LavenderBlush3' => [ 205, 193, 197 ], 'LavenderBlush4' => [ 139, 131, 134 ], 'LemonChiffon' => [ 255, 250, 205 ], 'LemonChiffon1' => [ 255, 250, 205 ], 'LemonChiffon2' => [ 238, 233, 191 ], 'LemonChiffon3' => [ 205, 201, 165 ], 'LemonChiffon4' => [ 139, 137, 112 ], 'LightBlue' => [ 173, 216, 230 ], 'LightBlue1' => [ 191, 239, 255 ], 'LightBlue2' => [ 178, 223, 238 ], 'LightBlue3' => [ 154, 192, 205 ], 'LightBlue4' => [ 104, 131, 139 ], 'LightCyan' => [ 224, 255, 255 ], 'LightCyan1' => [ 224, 255, 255 ], 'LightCyan2' => [ 209, 238, 238 ], 'LightCyan3' => [ 180, 205, 205 ], 'LightCyan4' => [ 122, 139, 139 ], 'LightGoldenrod' => [ 238, 221, 130 ], 'LightGoldenrod1' => [ 255, 236, 139 ], 'LightGoldenrod2' => [ 238, 220, 130 ], 'LightGoldenrod3' => [ 205, 190, 112 ], 'LightGoldenrod4' => [ 139, 129, 76 ], 'LightPink' => [ 255, 182, 193 ], 'LightPink1' => [ 255, 174, 185 ], 'LightPink2' => [ 238, 162, 173 ], 'LightPink3' => [ 205, 140, 149 ], 'LightPink4' => [ 139, 95, 101 ], 'LightSalmon' => [ 255, 160, 122 ], 'LightSalmon1' => [ 255, 160, 122 ], 'LightSalmon2' => [ 238, 149, 114 ], 'LightSalmon3' => [ 205, 129, 98 ], 'LightSalmon4' => [ 139, 87, 66 ], 'LightSkyBlue' => [ 135, 206, 250 ], 'LightSkyBlue1' => [ 176, 226, 255 ], 'LightSkyBlue2' => [ 164, 211, 238 ], 'LightSkyBlue3' => [ 141, 182, 205 ], 'LightSkyBlue4' => [ 96, 123, 139 ], 'LightSteelBlue' => [ 176, 196, 222 ], 'LightSteelBlue1' => [ 202, 225, 255 ], 'LightSteelBlue2' => [ 188, 210, 238 ], 'LightSteelBlue3' => [ 162, 181, 205 ], 'LightSteelBlue4' => [ 110, 123, 139 ], 'LightYellow' => [ 255, 255, 224 ], 'LightYellow1' => [ 255, 255, 224 ], 'LightYellow2' => [ 238, 238, 209 ], 'LightYellow3' => [ 205, 205, 180 ], 'LightYellow4' => [ 139, 139, 122 ], 'MediumOrchid' => [ 186, 85, 211 ], 'MediumOrchid1' => [ 224, 102, 255 ], 'MediumOrchid2' => [ 209, 95, 238 ], 'MediumOrchid3' => [ 180, 82, 205 ], 'MediumOrchid4' => [ 122, 55, 139 ], 'MediumPurple1' => [ 171, 130, 255 ], 'MediumPurple2' => [ 159, 121, 238 ], 'MediumPurple3' => [ 137, 104, 205 ], 'MediumPurple4' => [ 93, 71, 139 ], 'MistyRose' => [ 255, 228, 225 ], 'MistyRose1' => [ 255, 228, 225 ], 'MistyRose2' => [ 238, 213, 210 ], 'MistyRose3' => [ 205, 183, 181 ], 'MistyRose4' => [ 139, 125, 123 ], 'NavajoWhite' => [ 255, 222, 173 ], 'NavajoWhite1' => [ 255, 222, 173 ], 'NavajoWhite2' => [ 238, 207, 161 ], 'NavajoWhite3' => [ 205, 179, 139 ], 'NavajoWhite4' => [ 139, 121, 94 ], 'OliveDrab' => [ 107, 142, 35 ], 'OliveDrab1' => [ 192, 255, 62 ], 'OliveDrab2' => [ 179, 238, 58 ], 'OliveDrab3' => [ 154, 205, 50 ], 'OliveDrab4' => [ 105, 139, 34 ], 'OrangeRed' => [ 255, 69, 0 ], 'OrangeRed1' => [ 255, 69, 0 ], 'OrangeRed2' => [ 238, 64, 0 ], 'OrangeRed3' => [ 205, 55, 0 ], 'OrangeRed4' => [ 139, 37, 0 ], 'PaleGreen' => [ 152, 251, 152 ], 'PaleTurquoise' => [ 175, 238, 238 ], 'PaleTurquoise1' => [ 187, 255, 255 ], 'PaleTurquoise2' => [ 174, 238, 238 ], 'PaleTurquoise3' => [ 150, 205, 205 ], 'PaleTurquoise4' => [ 102, 139, 139 ], 'PaleVioletRed' => [ 219, 112, 147 ], 'PaleVioletRed1' => [ 255, 130, 171 ], 'PaleVioletRed2' => [ 238, 121, 159 ], 'PaleVioletRed3' => [ 205, 104, 137 ], 'PaleVioletRed4' => [ 139, 71, 93 ], 'RosyBrown' => [ 188, 143, 143 ], 'RosyBrown1' => [ 255, 193, 193 ], 'RosyBrown2' => [ 238, 180, 180 ], 'RosyBrown3' => [ 205, 155, 155 ], 'RosyBrown4' => [ 139, 105, 105 ], 'RoyalBlue1' => [ 72, 118, 255 ], 'RoyalBlue2' => [ 67, 110, 238 ], 'RoyalBlue3' => [ 58, 95, 205 ], 'RoyalBlue4' => [ 39, 64, 139 ], 'SeaGreen' => [ 46, 139, 87 ], 'SeaGreen1' => [ 84, 255, 159 ], 'SeaGreen2' => [ 78, 238, 148 ], 'SeaGreen3' => [ 67, 205, 128 ], 'SeaGreen4' => [ 46, 139, 87 ], 'SkyBlue' => [ 135, 206, 235 ], 'SkyBlue1' => [ 135, 206, 255 ], 'SkyBlue2' => [ 126, 192, 238 ], 'SkyBlue3' => [ 108, 166, 205 ], 'SkyBlue4' => [ 74, 112, 139 ], 'SlateBlue1' => [ 131, 111, 255 ], 'SlateBlue2' => [ 122, 103, 238 ], 'SlateBlue3' => [ 105, 89, 205 ], 'SlateBlue4' => [ 71, 60, 139 ], 'SlateGray' => [ 112, 128, 144 ], 'SlateGray1' => [ 198, 226, 255 ], 'SlateGray2' => [ 185, 211, 238 ], 'SlateGray3' => [ 159, 182, 205 ], 'SlateGray4' => [ 108, 123, 139 ], 'SpringGreen' => [ 0, 255, 127 ], 'SpringGreen1' => [ 0, 255, 127 ], 'SpringGreen2' => [ 0, 238, 118 ], 'SpringGreen3' => [ 0, 205, 102 ], 'SpringGreen4' => [ 0, 139, 69 ], 'SteelBlue' => [ 70, 130, 180 ], 'SteelBlue1' => [ 99, 184, 255 ], 'SteelBlue2' => [ 92, 172, 238 ], 'SteelBlue3' => [ 79, 148, 205 ], 'SteelBlue4' => [ 54, 100, 139 ], 'VioletRed' => [ 208, 32, 144 ], 'VioletRed1' => [ 255, 62, 150 ], 'VioletRed2' => [ 238, 58, 140 ], 'VioletRed3' => [ 205, 50, 120 ], 'VioletRed4' => [ 139, 34, 82 ], 'aquamarine' => [ 127, 255, 212 ], 'aquamarine1' => [ 127, 255, 212 ], 'aquamarine2' => [ 118, 238, 198 ], 'aquamarine3' => [ 102, 205, 170 ], 'aquamarine4' => [ 69, 139, 116 ], 'azure' => [ 240, 255, 255 ], 'azure1' => [ 240, 255, 255 ], 'azure2' => [ 224, 238, 238 ], 'azure3' => [ 193, 205, 205 ], 'azure4' => [ 131, 139, 139 ], 'bisque' => [ 255, 228, 196 ], 'bisque1' => [ 255, 228, 196 ], 'bisque2' => [ 238, 213, 183 ], 'bisque3' => [ 205, 183, 158 ], 'bisque4' => [ 139, 125, 107 ], 'blue1' => [ 0, 0, 255 ], 'blue2' => [ 0, 0, 238 ], 'blue3' => [ 0, 0, 205 ], 'blue4' => [ 0, 0, 139 ], 'brown1' => [ 255, 64, 64 ], 'brown2' => [ 238, 59, 59 ], 'brown3' => [ 205, 51, 51 ], 'brown4' => [ 139, 35, 35 ], 'burlywood' => [ 222, 184, 135 ], 'burlywood1' => [ 255, 211, 155 ], 'burlywood2' => [ 238, 197, 145 ], 'burlywood3' => [ 205, 170, 125 ], 'burlywood4' => [ 139, 115, 85 ], 'chartreuse' => [ 127, 255, 0 ], 'chartreuse1' => [ 127, 255, 0 ], 'chartreuse2' => [ 118, 238, 0 ], 'chartreuse3' => [ 102, 205, 0 ], 'chartreuse4' => [ 69, 139, 0 ], 'chocolate' => [ 210, 105, 30 ], 'coral' => [ 255, 127, 80 ], 'coral1' => [ 255, 114, 86 ], 'coral2' => [ 238, 106, 80 ], 'coral3' => [ 205, 91, 69 ], 'coral4' => [ 139, 62, 47 ], 'cornsilk' => [ 255, 248, 220 ], 'cornsilk1' => [ 255, 248, 220 ], 'cornsilk2' => [ 238, 232, 205 ], 'cornsilk3' => [ 205, 200, 177 ], 'cornsilk4' => [ 139, 136, 120 ], 'cyan' => [ 0, 255, 255 ], 'cyan1' => [ 0, 255, 255 ], 'cyan2' => [ 0, 238, 238 ], 'cyan3' => [ 0, 205, 205 ], 'cyan4' => [ 0, 139, 139 ], 'firebrick' => [ 178, 34, 34 ], 'firebrick1' => [ 255, 48, 48 ], 'firebrick2' => [ 238, 44, 44 ], 'firebrick3' => [ 205, 38, 38 ], 'firebrick4' => [ 139, 26, 26 ], 'gold' => [ 255, 215, 0 ], 'gold1' => [ 255, 215, 0 ], 'gold2' => [ 238, 201, 0 ], 'gold3' => [ 205, 173, 0 ], 'gold4' => [ 139, 117, 0 ], 'goldenrod' => [ 218, 165, 32 ], 'goldenrod1' => [ 255, 193, 37 ], 'goldenrod2' => [ 238, 180, 34 ], 'goldenrod3' => [ 205, 155, 29 ], 'goldenrod4' => [ 139, 105, 20 ], 'gray' => [ 190, 190, 190 ], 'gray1' => [ 3, 3, 3 ], 'gray2' => [ 5, 5, 5 ], 'gray3' => [ 8, 8, 8 ], 'gray4' => [ 10, 10, 10 ], 'green1' => [ 0, 255, 0 ], 'green2' => [ 0, 238, 0 ], 'green3' => [ 0, 205, 0 ], 'green4' => [ 0, 139, 0 ], 'grey1' => [ 3, 3, 3 ], 'grey2' => [ 5, 5, 5 ], 'grey3' => [ 8, 8, 8 ], 'grey4' => [ 10, 10, 10 ], 'honeydew' => [ 240, 255, 240 ], 'honeydew1' => [ 240, 255, 240 ], 'honeydew2' => [ 224, 238, 224 ], 'honeydew3' => [ 193, 205, 193 ], 'honeydew4' => [ 131, 139, 131 ], 'ivory' => [ 255, 255, 240 ], 'ivory1' => [ 255, 255, 240 ], 'ivory2' => [ 238, 238, 224 ], 'ivory3' => [ 205, 205, 193 ], 'ivory4' => [ 139, 139, 131 ], 'khaki' => [ 240, 230, 140 ], 'khaki1' => [ 255, 246, 143 ], 'khaki2' => [ 238, 230, 133 ], 'khaki3' => [ 205, 198, 115 ], 'khaki4' => [ 139, 134, 78 ], 'magenta' => [ 255, 0, 255 ], 'magenta1' => [ 255, 0, 255 ], 'magenta2' => [ 238, 0, 238 ], 'magenta3' => [ 205, 0, 205 ], 'magenta4' => [ 139, 0, 139 ], 'maroon' => [ 176, 48, 96 ], 'maroon1' => [ 255, 52, 179 ], 'maroon2' => [ 238, 48, 167 ], 'maroon3' => [ 205, 41, 144 ], 'maroon4' => [ 139, 28, 98 ], 'orange1' => [ 255, 165, 0 ], 'orchid' => [ 218, 112, 214 ], 'orchid1' => [ 255, 131, 250 ], 'orchid2' => [ 238, 122, 233 ], 'orchid3' => [ 205, 105, 201 ], 'orchid4' => [ 139, 71, 137 ], 'pink1' => [ 255, 181, 197 ], 'pink2' => [ 238, 169, 184 ], 'pink3' => [ 205, 145, 158 ], 'pink4' => [ 139, 99, 108 ], 'plum1' => [ 255, 187, 255 ], 'plum2' => [ 238, 174, 238 ], 'plum3' => [ 205, 150, 205 ], 'plum4' => [ 139, 102, 139 ], 'purple1' => [ 155, 48, 255 ], 'purple2' => [ 145, 44, 238 ], 'purple3' => [ 125, 38, 205 ], 'purple4' => [ 85, 26, 139 ], 'red1' => [ 255, 0, 0 ], 'red2' => [ 238, 0, 0 ], 'red3' => [ 205, 0, 0 ], 'red4' => [ 139, 0, 0 ], 'salmon' => [ 250, 128, 114 ], 'salmon1' => [ 255, 140, 105 ], 'salmon2' => [ 238, 130, 98 ], 'salmon3' => [ 205, 112, 84 ], 'salmon4' => [ 139, 76, 57 ], 'seashell' => [ 255, 245, 238 ], 'seashell1' => [ 255, 245, 238 ], 'seashell2' => [ 238, 229, 222 ], 'seashell3' => [ 205, 197, 191 ], 'seashell4' => [ 139, 134, 130 ], 'sienna' => [ 160, 82, 45 ], 'sienna1' => [ 255, 130, 71 ], 'sienna2' => [ 238, 121, 66 ], 'sienna3' => [ 205, 104, 57 ], 'sienna4' => [ 139, 71, 38 ], 'snow' => [ 255, 250, 250 ], 'snow1' => [ 255, 250, 250 ], 'snow2' => [ 238, 233, 233 ], 'snow3' => [ 205, 201, 201 ], 'snow4' => [ 139, 137, 137 ], 'tan' => [ 210, 180, 140 ], 'tan1' => [ 255, 165, 79 ], 'tan2' => [ 238, 154, 73 ], 'tan3' => [ 205, 133, 63 ], 'tan4' => [ 139, 90, 43 ], 'thistle' => [ 216, 191, 216 ], 'thistle1' => [ 255, 225, 255 ], 'thistle2' => [ 238, 210, 238 ], 'thistle3' => [ 205, 181, 205 ], 'thistle4' => [ 139, 123, 139 ], 'tomato' => [ 255, 99, 71 ], 'tomato1' => [ 255, 99, 71 ], 'tomato2' => [ 238, 92, 66 ], 'tomato3' => [ 205, 79, 57 ], 'tomato4' => [ 139, 54, 38 ], 'turquoise1' => [ 0, 245, 255 ], 'turquoise2' => [ 0, 229, 238 ], 'turquoise3' => [ 0, 197, 205 ], 'turquoise4' => [ 0, 134, 139 ], 'wheat' => [ 245, 222, 179 ], 'wheat1' => [ 255, 231, 186 ], 'wheat2' => [ 238, 216, 174 ], 'wheat3' => [ 205, 186, 150 ], 'wheat4' => [ 139, 126, 102 ], 'yellow1' => [ 255, 255, 0 ], 'yellow2' => [ 238, 238, 0 ], 'yellow3' => [ 205, 205, 0 ], 'yellow4' => [ 139, 139, 0 ], Chart-2.4.6/doc/LaTeX/d_pareto2.png0000644000175000017500000000654207763635574016262 0ustar reinerreinerPNG  IHDRPLTE}}}}oΡ IDATxY1zw Cw#7PV)&?.X 1Uy_LV;'Fuat;v,-I+"ZkW597%NF8M~Tl[$I2cܷJ]>ҥ\jJ_L.Ǘv7EwOUEgbEg~^w6G_ < ѱ[ӅjY^էY}נk[խSjYN#0s;RHe7*h,.v nZ;h~֯C缼ոӞFOscq=utQTA ðv n5sEόMт|׋[[#;*tSC7Fo8z odaŭfA\X= {eoNCI誻$\}N7rKttӉ=5 ZWѯ|7ӹQ _,Zj-n1t褑[ӒZi?Sd]×5rsNbu褑[-I#J9贑[7 ui|7Fo=4z3[!FoftZ/~6UQ5zѫqӦ%kcKFK-k a#NtQm:ѵշ^7dZta`F.nQWsܺD&/yv a>F/u԰- C2* }ލrF^>yN>GWSpakn) JƼ|n~>eɉ++-sP?Гv䴽/LF *tHi幑b tStp<dzZ*{aR#EmxƼ SBGDjSNIl'W]m1=jyZ{9 =AcºkC6~c>1D@S,of}=eVmlM8ɕУ^m*21j)؋oCŮDpLb䲍 \=#; Wp#>˽c'nL@r1Đ^hVԋ>ԇx&Kt}W]Wm%\rxJ.nn"Y0У^amz'5_xQO@o" ^7k`KУ? ?NҜxfo9pꌬ'IˈAe`/SLO'xJmYOl8&05^[}lGjI AjA$'|K6dH5h%LJE@+t='pB3*&oУ&^uyH/G~ uq[c>' ñ,z/ Gӛ;(-c#= ɂ-g5؁E)W A$ܪLk쵱3A$LFO\y OM~%z]}ɝ|*yZ2sA$hϼHo' '(U @_zsf/v~kMD,#>&EӖ,GKD#|n`?+Hxm-ΝDS|n)K _FEg'f^.t[!MD|svУR "?w JV:# j݅ O%m7dKaF'ޗs+VFziF?V *>N@6TO͕gtJ3h<5r+g 4IuDSVUjV |SF',,i}t2NY- {2C&zFG߿%OF[ v|nnR 6qb~xVktpZ,,蔛=>dSnbh-C c@En~@ձN6ExsX Yul%1e"}nǀ!×nZ, QBiQI?E׺>z>vйP3/ A$ZK][!Z@_mR迄 4,n=oBL'$T=(+F7 R?ՏޡR?#WguA}X3W7y]AG:V,Gm=z[7;5*G_ |sj悑hjF7w:= CO$(WYrh*iħJc='h6 cl$`0Ah? k"${ ` Q#_2IW;ya':> bj+u.|O9'ZCV?>r:C )q]bIENDB`Chart-2.4.6/doc/LaTeX/Elemente.png0000644000175000017500000001500007763635572016124 0ustar reinerreinerPNG  IHDRTBM pHYs  gAMA|Q cHRMz%u0`:o_FvIDATxb?(`i4F(`dF(`F(`F(`bA022(` c XȍQ0 F(N@C@`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`G+Q@-@(>|Qh? F-@V`Q0B@V`5}d.  Q0 4ZA c>hѱ BJ00ZQ@ `Q0 F( C6G(h0 0=pJ@Ѯ(#h0 Fi)Ѯ(d p6VA!Q0 (4` h` h` h` h` h` }膚Q0 F(! +*.}@` EFK @C@`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q@`ddfh0 F(#h0 F(#h0 F($Fd@T WK;@F(`Z.L4`jx)ObS h`Q0 P]%@V`Q@f>[`jvp5aW F{`Q@r^pA4YLͤ `Q0 -IehthQ0 d/.@=Q0 F(Nўh`C4:4 F(#h0 F(#h0 F(S.KS@(`V_Ij-2 ; F+Q0 F( F+Q0 F( |? c;)N@V`Q@Y@Ge4ZQ0 FcF(`F(`F(`H @(`P @y@7 F(kxUY F{`Q@50n(` %+E4ZQ0 Fuٲ"!Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( uxL`tz(9kބl;@ ||zh`9w=qF(؆ AF{` :`6<@ D6 F(t6@ eFQC>Q0 Fh=B@V`Q0B@ `#9~ EWl7 F@( Th68 !&(`4. &9v-Jс!\\VBd"@hm@~raFahmb߲7 (GkTl4Dg@,imf>IQ0 va C@򇼀dAD)T,>C=P7GG HQz!W5!; V-у (Q0F} уh h,PF?0@ã U#,-D$8N]@"T4V  R3<Ѣ!Ѭ>r`t u@ hF(C6ZQnb9G` ~@h@k@,DFZwQ0h[luM@: F(-aDl@Sp&e `d.ٟF 9x Q0 OmGS@C@`DdLgU3 F(DTv0FchA bLhQ0 (o1A@s`۷m p51 Fy> XȈͣQ0PDIďQ0 Fx7hC#@LA0 F(lm)hF ]}Q0 F( ș`C@ht(`ͧmP"4(>=@ bO0 F((`Ёѝ4ZQ0 #iw(`,F@ t`ahthQ0OZDQ0 FhBO@ŒQ0 F4:4 F(`t FO` t)@V`Q0B@V`Q0B@V`AF7$(` s44` h0 F(t`t)}@V`AFx` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` 322thF3D A< F(i'!Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q@o0{AhG($ F+Q0 F( F+Q@@5u i` h0 @D:~]XQ0 hT!P( @,A0 HKjf>]X{(hH9/ъlu.\ \ F(4:4 _OP]( F+Q@Bu-Yσܐǯ e? FDWa d`h`Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( =eQ0 Fh)1h@W[G(U4:4 F(#h0 F(#h0 F(#h0 F(#h0 F(#h0 W_ 9 F 4ZQ0 F4ZQ0 F4Zyd( zwĨ`'?KlL{Q@@=Q@$Q0 F`4Dumv\%蚟Q0  `(\-z݅Q0 F@*W4R< F(:( gڨpZ׋`+0 FBգ2F(C2 H +` h` h` h` h` h` }ޜQ0 Fy P*ѵ`Q0r@Q0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F}$IENDB`Chart-2.4.6/doc/LaTeX/Pie.tex0000644000175000017500000000461610735744653015124 0ustar reinerreiner% % pie.tex % \renewcommand{\thisname}{Chart::Pie} \section{\thisname} \name{\thisname} \file{Pie.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a pie chart. The first added set must contain the labels, the second set the values. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale = 0.6]{d_pie3.png} \end{center} \caption{Pie chart} \label{fig:pie} \end{figure} \begin{verbatim} use Chart::Pie; $g = Chart::Pie->new(); $g->add_dataset('Har', 'Sug', 'Ert', 'Her', 'Tar', 'Kure'); $g->add_dataset(12000, 20000 , 13000, 15000, 9000, 11000 ); %opt = ('title' => 'Another Pie Demo Chart', 'label_values' => 'both', 'legend' => 'none', 'text_space' => 10, 'png_border' => 1, 'graph_border' => 0, 'colors' => { 'x_label' => 'red', 'misc' => 'plum', 'background' => 'grey', 'dataset0' => [120, 0, 255], 'dataset1' => [120, 100, 255], 'dataset2' => [120, 200, 255], 'dataset3' => [255, 100, 0], 'dataset4' => [255, 50, 0], 'dataset5' => [255, 0, 0], }, 'x_label' => 'The Winner is Team Blue!', ); $g->set(%opt); $g->png("pie.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{label\_values} Tells \thisclass what kind of value labels to show alongside the pie. Valid values are \literal{percent}, \literal{value}, \literal{both} and \literal{none}. Defaults to \literal{percent}. \end{AttrDecl} \begin{AttrDecl}{legend\_label\_values} Tells \thisclass what kind of labels to show in the legend. Valid values are \literal{percent}, \literal{value}, \literal{both} and \literal{none}. Defaults to \literal{value}. \end{AttrDecl} \begin{AttrDecl}{legend\_lines} The labels drawn alongside the pie are connected with a line to the segment if this option is set to \literal{true}. \end{AttrDecl} \begin{AttrDecl}{ring} The pie can have a ring shape instead of the usual disc shape. This option determines the thickness of the ring as a fraction of the radius. Default is 1, \ie, a full pie. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/Pareto.tex0000644000175000017500000000457610735744645015647 0ustar reinerreiner% % pareto.tex % \renewcommand{\thisname}{Chart::Pareto} \section{\thisname} \name{\thisname} \file{Pareto.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a Pareto chart, \ie, a set of absolute values overlaid with a line chart of the accumulated values. (This latter curve is also known as an \emph{empirical cumulative distribution function} or as a \emph{Lorenz curve}.) This representation usually makes sense only if the values are sorted (either in ascending or in descending order). \thisclass plots only one data set and its labels. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.7]{d_pareto2.png} \end{center} \caption{Pareto chart} \label{fig:pareto} \end{figure} \begin{verbatim} use Chart::Pareto; $g = Chart::Pareto->new(500,400); $g->add_dataset('1st week', '2nd week', '3rd week', '4th week', '5th week', '6th week', '7th week', '8th week', '9th week', '10th week'); $g->add_dataset(37, 15, 9, 4, 3.5, 2.1, 1.2, 1.5, 6.2, 16); %hash = ('colors' => { 'dataset0' => 'mauve', 'dataset1' => 'light_blue', 'title' => 'orange' }, 'title' => 'Visitors at the Picasso Exhibition', 'integer_ticks_only' => 'true', 'skip_int_ticks' => 5, 'grey_background' => 'false', 'max_val' => 100, 'y_label' => 'Visitors in Thousands', 'x_ticks' => 'vertical', 'spaced_bars' => 'true', 'legend' => 'none' ); $g->set(%hash); $g->png("pareto.png"); \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{spaced\_bars} Leaves some space between each group of bars when set to \literal{true}. This usually make it easier to read a bar chart. Default is \literal{true}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/Appendix.tex0000644000175000017500000000054712033061036016132 0ustar reinerreiner% % Appendix.tex % \section{Appendix} \renewcommand{\thisname}{Named Colors} \name{\thisname} \label{app:colors} The following list summarizes the named colors which can be defined in respect to \textsc{rgb} values. The colors are defined by\\ \methoduse{\$obj->set('colors' \fatcomma \{'background' \fatcomma 'green'\});} \vspace{2ex} \input{AppendixRGB} Chart-2.4.6/doc/LaTeX/mountain.png0000644000175000017500000000432207763635600016215 0ustar reinerreinerPNG  IHDR,PLTEi{IDATxYF` 8@~'DWq-ВgVz2ͨՈnǟZ54u\\\\\\\\\\\j }[Uj6n?i*N峿ێzL}? XCԺzJA2Ga 4Wrt_H7rh@k!چ3D Ǩ;V(}BG)ÕZdAyLgtqe+@a 5K?*Cx1%< 8S2S Ul юHZLHKDd̆\Z|u%A.XuDȯwfEVq_Yr!,rU.f6܉!#" ʻI~ƮnEZ bDDeTW˻v@֒梆O*\$D-5h(!vGp$]rzivn4߉ vFx$-tFRhH!yQ ׊xI|pF\ > C$|>Yc֯O$6`HH$=@k6V`$ Dv[rɗ\tRH ϥ}~A8(2ֲO>Pq2DtTh-@Hvvۼe $_ۼe OD@C!d9 C) sRB( t0! aqk :5p.eN炈r:d~m&z"e!2?R^Agt%Ⱥ ?h3@bC>{SPZVIai!rHZXP{5 3P8%B}{5 36!Am{ hAHc^AbP:f :D񐨶7!=a$1T55TD@ N+ ta@6 )*C5!X-UBQBFq00! !Ǽ֩ "= .__vu*u.~ ZBzso;ک#G{6VΐB.٬nVC[ԛތZŒTNn{ :]T D"VY7bFl\"QDm$ws@a95$it띐Q'֝]uo֛灺Kl;#~oa lZ܎r7K]IENDB`Chart-2.4.6/doc/LaTeX/Bars.tex0000644000175000017500000000476510735752112015270 0ustar reinerreiner% % bars.tex % \renewcommand{\thisname}{Chart::Bars} \section{\thisname} \name{\thisname} \file{Bars.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a chart made up of vertical bars. \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.4]{d_bars.png} \end{center} \caption{Bar chart} \label{fig:bars} \end{figure} {\small \begin{verbatim} use Chart::Bars; $g = Chart::Bars->new(600,500); $g->add_dataset('Berlin', 'Paris', 'Rome', 'London', 'Munich'); $g->add_dataset(14, 5, 4, 5, 11); $g->add_dataset(12, 4, 6, 7, 12); $g->add_dataset(18, 2, 3, 3, 9); $g->add_dataset(17, 5, 7, 6, 6); $g->add_dataset(15, 3, 4, 5, 11); $g->add_dataset(11, 6, 5, 6, 12); $g->add_dataset(12, 1, 4, 5, 15); $g->add_dataset(10, 4, 6, 8, 10); $g->add_dataset(14, 5, 4, 5, 11); $g->add_dataset(12, 4, 6, 6, 12); $g->add_dataset(18, 2, 3, 3, 9); $g->add_dataset(17, 5, 7, 2, 6); %hash = ('title' => 'Sold Cars in 2001', 'text_space' => 5, 'grey_background' => 'false', 'integer_ticks_only' => 'true', 'x_label' => 'City', 'y_label' => 'Number of Cars', 'legend' => 'bottom', 'legend_labels' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September','October', 'November', 'December' ], 'min_val' => 0, 'max_val' => 20, 'grid_lines' =>'true', 'colors' => {'title' => 'red', 'x_label' => 'blue', 'y_label' => 'blue' } ); $g->set(%hash); $g->png("bars.png"); \end{verbatim} } \constructorblurb{\thisname} \begin{AttrDecl}{spaced\_bars} Leaves some space between each group of bars when set to \literal{true}. This usually make it easier to read a bar chart. Default is \literal{true}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/definitions.tex0000644000175000017500000001171312033062011016664 0ustar reinerreiner% % definitions.tex % --------------- % % Lengths \newlength{\parabstand} \setlength{\parabstand}{2ex plus1ex minus1ex} % \newlength{\itemabstand} \setlength{\itemabstand}{1ex plus1ex minus1ex} % % Commands \newcommand{\deref}{\ensuremath{\rightarrow}} % Dereferenzierungspfeil -> \newcommand{\fatcomma}{\ensuremath{\Rightarrow}} % Fat comma for use in hash declarations: => \newcommand{\ie}{i.\,e.\xspace} % Nicely typeset i.e. \newcommand{\Ie}{I.\,e.\xspace} % Nicely typeset I.e. \newcommand{\eg}{e.\,g.\xspace} % Nicely typeset e.g. \newcommand{\Eg}{E.\,g.\xspace} % Nicely typeset E.g. \newcommand{\chart}{\class{Chart}\xspace} % Our most prominent name \newcommand{\thisname}{Chart} % Each class will overwrite this with its own name \newcommand{\thisclass}{\class{\thisname}\xspace} % Abbreviation for frequently used command % % Standard text for constructor: \newcommand{\constructorblurb}[1]{ \begin{Constructor} An object instance of \class{#1} can be created with the constructor \methoduse{new()}\index{Methods!new()}: \begin{SmallExample} \$obj = #1\deref new();\\ \$obj = #1\deref new(\parameter{width}, \parameter{height}); \end{SmallExample} If \methoduse{new()} is called without arguments, the constructor will return an image of size 300\ensuremath{\times}400 pixels. If \methoduse{new()} is called with two arguments, \parameter{width} and \parameter{height}, it will return a \class{#1} object of the desired size. \end{Constructor} \Methods\nopagebreak All universally valid methods, see page \pageref{methods} of class \class{Chart::Base}.\hfill \Attributes\nopagebreak All universally valid options, see page \pageref{options} of class \class{Chart::Base}. In addition, the following options are defined for this class: } % %-------------- command class ------------------------- \newcommand{\class}[1]{\textsf{#1}\index{Class!#1}} % %-------------- command parameter ------------------------- \newcommand{\parameter}[1]{\textrm{\textit{#1}}} % %-------------- command backslash ------------------------- \newcommand{\bs}{\ensuremath{\backslash}} % %-------------- command name ------------------------- \newcommand{\name}[1]{\label{#1}% \parbox{15ex}{\bf\large Name:} #1\index{#1}\\[\itemabstand]} % %-------------- command synopsis ------------------------- \newcommand{\synopsis}{\label{Synopsis}{\bf\large Synopsis}\index{Synopsis}} % %-------------- command file ------------------------- \newcommand{\file}[1]{% \parbox{15ex}{\bf\large File:} #1\\[\itemabstand]} % %-------------- command requires ------------------------- \newcommand{\requires}[1]{% \parbox{15ex}{\bf\large Requires:} #1\\[\itemabstand]} % %-------------- command example ------------------------- \newcommand{\example}{\parbox{15ex}{\bf\large Example:}} % %-------------- command literal ------------------------- \newcommand{\literal}[1]{`\texttt{#1}'} % %-------------- command methoduse ------------------------- \newcommand{\methoduse}[1]{\texttt{#1}} % %-------------- command methoddecl ------------------------- \newcommand{\methoddecl}[2]{\methoduse{#1}\index{Methods!#2}\\*} % %-------------- command attruse ------------------------- \newcommand{\attruse}[1]{\textbf{#1}} % %-------------- command attrdecl ------------------------- \newcommand{\attrdecl}[1]{\attruse{#1}\index{Attributes!#1}\\*} % %-------------- command Methods ------------------------- \newcommand{\Methods}{\parindent 0pt \textbf{\large Methods:}\\*} % %-------------- command Attributes ------------------------- \newcommand{\Attributes}{\vspace*{1ex}\parindent 0pt \textbf{\large Attributes/Options:}\\*} % % %% Environment definitions % Environment Description \newenvironment{Description} {\nopagebreak \parindent 0pt \textbf{\large Description:} \begin{list}{\relax}{ \setlength{\leftmargin}{0.1\textwidth} \setlength{\topsep}{0pt} } \item }% {\end{list} \vspace{\parabstand} }% end Description % % Environment Constructor \newenvironment{Constructor}% {\nopagebreak \parindent 0pt \textbf{\large Constructor:}\index{Constructor} \begin{list}{\relax}{ \setlength{\leftmargin}{0.1\textwidth} \setlength{\topsep}{0pt} } \item }% {\end{list} \vspace{\parabstand} }% end Constructor % % Environment MethDecl \newlength{\minilength} \newenvironment{MethDecl}[2]% {\parindent 0pt \methoduse{#1}\index{Methods!#2} \begin{list}{\relax}{ \setlength{\leftmargin}{0.1\textwidth} \setlength{\topsep}{0pt} } \item }% {\end{list} }% end MethDecl % % Environment AttrDecl \newenvironment{AttrDecl}[1]% {\parindent 0pt \attruse{#1}\index{Attributes!#1} \begin{list}{\relax}{ \setlength{\leftmargin}{0.1\textwidth} \setlength{\topsep}{0pt} } \item }% {\end{list} }% end AttrDecl % % Environment SmallExample \newenvironment{SmallExample}% {\begin{quote}\ttfamily}% {\end{quote}}% end SmallExample % Chart-2.4.6/doc/LaTeX/LinesPoints.tex0000644000175000017500000001121011701662470016630 0ustar reinerreiner% % linespoints.tex % \renewcommand{\thisname}{Chart::LinesPoints} \section{\thisname} \name{\thisname} \file{LinesPoints.pm} \requires{Chart::Base, GD, Carp, FileHandle} \begin{Description} The class \thisclass creates a lines chart where additionally the individual data points are marked with a symbol. (If you want just lines without additional symbols, check \class{Chart::Lines} on page \pageref{Chart::Lines}. If you want just symbols for the data points but no lines, check \class{Chart::Points} on page \pageref{Chart::Points}.) \thisclass is a subclass of \class{Chart::Base}. \end{Description} \example \begin{figure}[ht] \begin{center} \includegraphics[scale=0.6]{d_linesp2.png} \end{center} \caption{Linespoints chart} \label{fig:d_linesp2} \end{figure} \begin{verbatim} use Chart::LinesPoints; use strict; my (@data1, @data2, @data4, @data3, @labels, %hash, $g); @labels = qw(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17); @data1 = qw (-7 -5 -6 -8 -9 -7 -5 -4 -3 -2 -4 -6 -3 -5 -3 -4 -6); @data2 = qw (-1 -1 -1 -1 -2 -2 -3 -3 -4 -4 -6 -3 -2 -2 -2 -1 -1); @data3 = qw (-4 -4 -3 -2 -1 -1 -1 -2 -1 -1 -3 -2 -4 -3 -4 -2 -2); @data4 = qw (-6 -3 -2 -3 -3 -3 -2 -1 -2 -3 -1 -1 -1 -1 -1 -3 -3); $g = Chart::LinesPoints->new(600,300); $g->add_dataset(@labels); $g->add_dataset(@data1); $g->add_dataset(@data2); $g->add_dataset(@data3); $g->add_dataset(@data4); %hash = ('integer_ticks_only' => 'true', 'title' => 'Soccer Season 2002\n ', 'legend_labels' => ['NY Soccer Club', 'Denver Tigers', 'Houston Spacecats', 'Washington Presidents'], 'y_label' => 'position in the table', 'x_label' => 'day of play', 'grid_lines' => 'true', 'f_y_tick' => \&formatter, ); $g->set( %hash); $g->png("d_linesp2.png"); # Just a trick to have the y scale start at the biggest point: # Initialise with negative values, remove the minus sign! sub formatter { my $label = shift; $label = substr($label, 1); return $label; } \end{verbatim} \constructorblurb{\thisname} \begin{AttrDecl}{brush\_size} Sets the width of the lines in pixels. Default is 6. \end{AttrDecl} \begin{AttrDecl}{brushStyle} Define the share of the points. The share may be specified to each dataset.\\ The possible shapes of the 'points' are \begin{itemize} \item FilledCircle (default), \item circle, \item donut, \item OpenCircle, \item triangle, \item upsidedownTriangle, \item square, \item hollowSquare, \item OpenRectangle, \item fatPlus, \item Star, \item OpenStar, \item FilledDiamond, \item OpenDiamond \end{itemize} To apply a different brush style to different data sets the following example of code can be used: \begin{verbatim} $g->set(brushStyles => { dataset0 => 'fatPlus', dataset1 => 'hollowSquare' }); \end{verbatim} \end{AttrDecl} \begin{AttrDecl}{pt\_size} Sets the radius of the points in pixels. Default is 18. \end{AttrDecl} \begin{AttrDecl}{sort} Sorts the data in ascending order if set to \literal{true}. Should be set if the input data is not sorted. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{stepline} The points are connected by a stepping function,instead of by a direct line if set to \literal{true}. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{stepline\_mode} Determines whether to plot each stepping line at the level of the start of the interval (if set to \literal{begin}) or at its end if set to \literal{end}. Defaults to \literal{begin}. \end{AttrDecl} \attrdecl{xlabels} \begin{AttrDecl}{xrange} This pair of options allows arbitrary positioning of $x$ axis labels. The two options must either both be specified or both be omitted. \attruse{xlabels} is a reference to 2-element array. The first of the elements is a nested (reference to an) array of strings that are the labels. The second element is a nested (reference to an) array of numbers that are the $x$ values at which the labels should be placed. \attruse{xrange} is a 2-element array specifying the minimum and maximum $x$ values on the axis. \Eg, \begin{verbatim} @labels = (['Jan', 'Feb', 'Mar'], [10, 40, 70 ]); $chart->set(xlabels => \bs @labels, xrange => [0, 100] ); \end{verbatim} \end{AttrDecl} \begin{AttrDecl}{xy\_plot} Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true}, \ie, to treat the $x$ axis as numeric. Very useful for plots of mathematical functions. Defaults to \literal{false}. \end{AttrDecl} \begin{AttrDecl}{y\_axes} Tells \thisclass where to place the $y$ axis. Valid values are \literal{left}, \literal{right} and \literal{both}. Defaults to \literal{left}. \end{AttrDecl} Chart-2.4.6/doc/LaTeX/brushstyles.png0000644000175000017500000001034611701126457016745 0ustar reinerreinerPNG  IHDR,i6PLTE}}}}}}}}}}}}}gbtRNS@f^IDATx흋v8 EI#m?;7%lc,BΎl@ՔTT 1)Ƥ@iL 1)Ƥ@iL 1)Ƥ@iL 1-ҿDk։-=yOI;{|q}\L>_u'^s@ Bqx{H|q/:U؆/y8ܼU*n?gs}}x7O=Zg zh=];߅Ʈ =9{|q~nhgZ!$q֏Z iq6@]@l E@`q(a6)a{=.jKHO$+b7Rc _Oq&$j <3 vvv{? 3YOtt9w>l>e53R.ҘHcR IP H4&a ;{D ҘHcR ) $}\= p="PH?c/H2@pY b&\.fYh_+PKj #!-OB i>C^Ty^‘俁5B  eDύ$;g}1<(MsU.@l[" µU,Rʏy.7brrmLy 1DӬeh14Hf@WR) gLdd~9KGyK@JEVyb6OI<ʙ>p+ Wb3%[EKkEs =1wY# C+%ԏ [b[**Зd\bX*Y8" qh ;?`?30}#ӾC_1g< gKYV~dc 7Ri [ֆ@JE&<"*!lI*2@nqU(Y1 f6?UzǑq_ -]@)ݿviM>@ns׺*Y!׬>s7aK~q!N!2fN,WS @෡8~ 2-~o AIFR ?)b@DepVbxK'b)Ԅ!$=`E@flkY孤beq7@uWX&!BķV~dy]yx 5znՀ [vYs-Kly؋xP=rYݓ!v-i/|,Szb'ҦHc[qѵkJ o½֗y f ľV5;Q/4M2,C R>C.+fzifw ]yU,=̹l, dU[F,], " wV~dȞDP 3iS@0B'jE `ydt/iT/)1r7I`iXi:@ ^4B}@( S2 0Vl34{ :H)E\x{}dW կB ;d4~Zo QB1{ ZwR H֯!Sχa K,84 \cqR.=1D&|a-%M(eC#/,B Uj 1}]mƕI{ BA@R"~AXOʾ}2f+b Blv=!h{}IAļP$K1|MwYq5d>@H\h A=i $yc*9S$9@\I¶U22w-k&6Rddr#hYV_Ի*H.wCضE*rƶU,R\,b?xO+ZVH 3% "1YKm,@Xl|:0n߹JE!HXX6U* He%ȝmXdx*QΙU,vڻLERyñU.ZVS@\w7\/.χL=ཀྵU0@PSFپ Fȝmdda.G@xχپJFȢCl[E#ˀ2zLkEzP " v-v#QЗHP5PcP|h[[qltr )H@a;$Ɂ]#D.s Ve# O̰M.|5ķ-AG4<%ԏ N'[!,SHkY 1 ˥@@( )lZy;̴7$'- q9eh> .!/) g>ԛ5տm~ޣ}NzK'RbLD܆Ң2ʀjQ8SP PԄ<BszK $9ˊ)d;pm)@Ri/G92[Pd͉!S/ل5/L<M{U.W{ w6_V*r[nm*rۗ&@~9JF` !&X;1p_[ϱe,lBp )SKF<s50d)[ 6MnqUUo)rs/Zi<%5!Fjl;[6UC@|@lwS .\!tDhnS@0q3< Ee]= xJE^˝w8Fǃ\d@=>\_# 7el@Uyo+=xp}ٓH1z7C1Ah ?4J̲Xo-Wщq)C)#g0!{-@kY03CC "A}@"< 8r@.9S/W@l"3@.r' %R|r}<3`d(%#@.6|r},riBu[@֋\H.5c?K l[gYbZ/{su_纮~  3$;BYg]√Nk 2u ,$8xtfYHpf AA!(3a=L9e ^^}x-ke6܁ br<ҧ\cI :gFx?o0~5XpV :gV #'QZ0m;=~ Wm kr xa7>ǟ؎ r5x\E\0*/FiّusZ jtvcS8r@ͰZrorg1JBBqBi/obd;2Ǿr˽hnWIrz=YҽDZQV TreeView

Chart-2.4.6/doc/html/inherit__graph__1.map0000644000175000017500000000030611666707222017677 0ustar reinerreiner Chart-2.4.6/doc/html/open.png0000644000175000017500000000016612033071320015270 0ustar reinerreinerPNG  IHDR =IDATx1 ت@@ ]01QXY~Jr?D>n F͐ }\ áIENDB`Chart-2.4.6/doc/html/classChart_1_1Base__inherit__graph.map0000644000175000017500000000442111670177756023073 0ustar reinerreiner Chart-2.4.6/doc/html/Points_8pm.html0000644000175000017500000000560712033071320016554 0ustar reinerreiner Chart/Points.pm File Reference

Chart/Points.pm File Reference

Implementation of Chart::Points. More...

Classes

class  Chart::Points
 Points class derived from class Base. More...

Detailed Description

Implementation of Chart::Points.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1Points__inherit__graph.png0000644000175000017500000000610411670177756023504 0ustar reinerreinerPNG  IHDRk{si~bKGD IDATxP? ԘAE!bXDfL4%e5$4Zej;)6DCl-Tb*bmm:Z#C8Ȼq{.( BP( ˖ w2e4s=(UY닢 dI%JD(Yl="2gT;~cnk:eg#@z?Q]@@YNzv7v#xf&'U[^ LtZwx:Bw0|ݲb r_ݎEC,B+~~~|[/Psׁztk!z& \x۲f vw"@Ɉ.򮾟`b{qbꀽ8)ARw % 9w NwW4^'!E߮}m G|rozw<, hz@^柈{'1x qb~:ch)'x њ.D? _$p3[iOwZ֗@b:bOW!V CЛ쪛/Jm|@$ &T6B3.n0U;lcPW8q1.c(bh e4- ]> !e w Aq SF"Ɩa1z}!pq@L\b8v홺[]ixdZV,+|K>u*ӷ7uwNߥ} z~[ Y}1(F1ٲڢ=l<㿃w#$X}1lghAi٨3xQoRxGYNDɒ%K",P$Bɒ%K",KY9]_WW$| ߱{~E[#(1 yw}]]|Us 4rCvwGKj2n}[oh5jGMx|2X41Z4j2S5^.mv\Ґn ˧,s4zwWD/dEGg5.Ё{,>iɾ}ܳ# BVs6{V C_͐^VLLNoo]ލ4`PzYYNL hSsvYPb%x:eƾi uK) ::'#**?X[JD(YdI%JD(YdI%JD(YdI%JD(YdI%JD(YdI%JD(YdI%JD(YdI%JD(YdI%JD(Ycy xj08|<8q"^. ֮]KSӃov)+%%ΎI <^YdI%JD(Y7S\\ŋ4Ç3e{.|sv#yKBBBHJJ"!!Vpxg:;Dp2dffrAL&z+WbZczJ۷SNa61͜9s%Ko>Y,:%ᖵaYj&8k,,X@ii)yekN8̙޽T;--'xž޻w/nc2(,,촘KZlرc vQ,_0"̙Czz:X)s%%%̝;Tz)@mm-˗/СCL>Z8{,{aݺu:Ӯ0`n̙3dffƂ 8z(555+ܾ}\ ==L^^10c l6wC->}Я߃/Þ4i7oޤ/k.bԩǓkƘ1c(//';;t9wӿ-ZDnn.Æ ĉꫯrnܸAaa!ÇW_}Kʉ'x7yw0 >}&Ξ=Ktt4;vl6EYY;wɓ'9x 6m"22kײsNrrr:rtHV]]Fѣ͠AX, 6mĐ!C"((Bpp0,[>}iaaaǏߢ4͛ٲe $&&b JKK#=]<„ ;Ç3uhjj#(((b!,,EL 466b4Yz{|Cz͍7Z-AS]]͈# ""žg+k0`۶m\vp{h+g^rss[Y6f3-R]]r?q8qQVVƒ%K #99y:BƬaÆd2ٵkeeen/--sNnJHgvR|hw6n߾M=ڽOŋٿ?yyy444w4T;e49s&o6W^?vǏw1a68p IIIpy<ҥKSFq޽lIHH`ڴi\~sSL, .dРA466RUU/LbbbL0;vl2 }Lؼy3T.227tRʡCpFx 편8fϞMVV \tɓ'3zh<>~ǘMƁ$"" ^|EU򱶶+W!C?vFEӯ_?lu$'';FWL&L&Suy$UL$hCȕ%K",P$Bɒ%K",P$Bɒnȑ#nr%.G6/;BP( ׅ8_#IENDB`Chart-2.4.6/doc/html/ErrorBars_8pm.html0000644000175000017500000000677712033071320017212 0ustar reinerreiner Chart/ErrorBars.pm File Reference

Chart/ErrorBars.pm File Reference

Implementation of Chart::ErrorBars. More...

Classes

class  Chart::ErrorBars
 ErrorBars class derived from class Base. More...
class  Chart::ErrorBars
 ErrorBars class derived from class Base. More...

Detailed Description

Implementation of Chart::ErrorBars.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1Direction__coll__graph.png0000644000175000017500000004545311701115623023425 0ustar reinerreinerPNG  IHDR95bKGD IDATxy|gH¢QAT mqيת(hZ[bw׊[VE[hbqATTdH23\$wy^̙s;l(((((((JbL ꬟d+Ƙ&MtVv(c޼yZk ڎtRqq3<%YmPNП㔜ѣ:Q6͛7%h`0<:iҤx 9v6@QO)רS%Q'(J^NNQ&\{A(]J`v_Bt'\?`Z; (Jg_;g.q/x-F!ɈTEى_N mF`8;v70=*>@=Pm,G|8x,jtXla1^|l';@uGWRM |8:ב/3 _wvӀ_z_xȳ"._8ܘOv=8 D-&#/wEsWSa+}`QݎDozVn>D~@TЄqi=!R%;i񎿌8%Hu\tx"yWҀյHCa0HuqyL{Ŝ{Z;}.8Eȃe~P<8FhwqFQ<a;z~#A:!^Ҁ }OLɅN ҸH i[4>c(@w;RUҌ_ՍȰEQ@+/#8EQѩ!5Ek)רS%Q'(J^NNQ&kܽGpŽU\~j63)3_` |;Xrr'SĚb`Rp\xvbK\Uqr5c_e*EΉ(`(i܀[əbV -bkIs)ʴ]w}uQǽbC0 'W `=]ך)OCu k 5hL ͙:mnu_FRƝlY"ʊ]W`RHIT-~##F)̙:@;3;PxD-Our1_%Wgֿx ps?} hUi fG$%.Tqo‚3X8G9lzn?;S&39&o!kN&Xk&%W\nol-[w ɬuߋKwȌ|YXgXU܄16)r=x:l-i^\<]4o.n>P| ք«1gőb0Ƚ >EPD6~ґj |I{&;0kފ3ޮ遲Sk ږ|$kM%8QN(6% %#yNeG@89R?uZcQ{Ym&E-ELܱsJ''; cLTgA٤(8f:@89oXhN4-EZ69'5m{`k\c7gm fmGjI4&$븯_=((((((282z?Hf2ppC`x'\sPҘgפ(9͉>QvπO4{'Q0`[L \>kRԸc޵,Yn0h' b;Em/%QV45BM(|ݡG \R0 }kCkB 47F`5p?9Hd.GC AVrFswWn1pƛ2~** حk;xqK3%#&!zԓ{ *8f⚂`Z5 jCKjBu?&ޚasN\'p$}yA&cAʯ'#m|}ǁ4eRtՈC+(x-3c+'Pvs^y ȼȏ^'!N{x˻[|b8}MP ?\jH `7g HVDvZy)mݽ݀MƤ]`1@N>.&q&)$? b9X ܁D6"UISF/#'pl\o2B+q@ ڎ|$p'v;J 歾8ʽ]$rHH$"R% uFE(;DŽUi | N `Yt$2LdoG CѼMzmVk cF+i&p'geV"$~/_ TwYw%GxFx.U4Įcۢt7pN_xEQEQEQEQEQEQ%C]06>:h;%gPxfv# !1^ha$Я ehFxo2lZ>r>m4H}iBDNI-f`0;h[ieZNGN:e o#$yغtDD˭`B5ּ8&.>#2N=L2DRQr@oF (KgHu9 Q1eHM=6DB* |͈0@d2{`QL"9rE @\73xD 2qUDq#ir}j$ѿ+")u?]oi/g95!AT`DVDLChdt"8[5H47J6jV!+fTy6)(H$׹3n"c75aȂ,KQB֏H=y xcCgqtVqituHaQ]U]+#0U,::odYhiF1pwl^H5"zu?>eW#()q9eE3yh>#vjv^D GTiCW'YND}=.+t^xÁ/yB"@\߯e+odyp?%%Z+~J+((_ O E&jCj*ڎ|$3\8ۅS VQM`+>i]Tc%X+S( ڀ|%Nؽqe̚TW `M45IQAdUWk>|S^2)HNI"Pdr}T:[~{Iۋ2QklwG2Ls0LLEQiBY"D˙Ȥ \-ycMmW2\6,Ox` =uҘgy:WקFr; v񢱫<%ӑsdh's0"IS'M}בLyPS#싖3G{wD"cHS0< 7rhBf\Kkٶ\f,{%V5Q"Yh.*;Cx2g(hb[~<ɤCd֯/i ptr"^8X4rO4ѹ_|VYgӖ!;u2KWo{6b[ i{u Qeʓe˙Y;w&}3#n*\AېdYjF"HU-7HU6BD-L/Aն 47EmH_WFV:L&ahR0lKVI89O|:+I߲t&e;9t*&j$AWsE-| #NngqW%t `]PR?NsTMV8ű@|]Ȉkv-sZL ,7w>,ȔӀULD vhurʫP)T# $Aduat^'qn=x#$*:ڞM)"\4!VExi߉XMɉIQ҆dETd{-Z#O"# 3LETK~UF{l6\rU\Qi.VЪ D@d"sHHuusy%H(+C'FdFGHR#dwrɟk$(yHnpm̱WlC*:xyœHO,q ^k/(7:97T8<z]ɫ%ғae65H'HIH Us%|urUѶM}NlH% Cک U͟WO">Gn+Wc赣t\iY?TKRqMbi\2ſx1Bg"xyxqٔ (G%9|Zc`MjblŚ||0DG|>J2_#e42+!2w9mݞ*v2)ux~Ȳt,BiǦf}}ߎkQMk]R{LQi)Heκ=>w@锓sݞaJ+Ic\g5`|nv4vI=~RJXcSln֚uH[t;"aRwdׁ@,R8Wf*j{+[sTpHt;D M Q;:1iHv9c@yΓۑ(H s "K[DPxrM(t nNg|s9U@lEؗ=wʼ]h}۾QXS}3 <qy67z坄8Q Q&*<»/w%1T3j*:F@MeCݡ)sR=~ uBMeêP8yĻ_^ޱȜUEQ@Q$S Q_Sٰ sLK.ۥJRL21zq?o†X#'|}1[Wy`kj*^ KmYN<ӎ\AUشÓ,"dyhD-Q5p7I@IGtP8jZ#z6hDf&xg `\2Bm(AQV]M3ϴdDJǓOGzכRp>"}imw .xDE$ [(`eIBخK{5{ye ڗ $6+hOqPlyɰ2HPY 7ĿQ  \<v=/Nq/Tk 6)3HcIKJ'MtTD#rS)g{ZOt ÐHp Rmyl45Ǭ(k\cŜы;4%9Bw%÷vʹ_mb%zSldE˧DimߊW^<*h&\@ß xc*`Ό<ֱ3V%"Q%QnD"O#.N&Q:Tʿҳ}.\l0ViʋG99G?@3\Ȋ`뙉ȳ(H&%S%|;OG{ɖAr02lo;:s J8, $3mK˦{(mp^zKFڱ)i[U^6CEQE)(i Jto)9n ڞBǗ55~(NIsq;{m-nж(M:؏ 55 ;_EI+%`/yЦ(3w5fdփd-֚0v^v(_YjFTWi`cM]ж(/NΤ>'2Y޷8Ṉ:훺m)`Sߪ5ӞK&ݳ򙜖E~Xqكmr%Nw0vwKwފ炶Ci%:,h)nh}:oO6 `)2%Y2O9DN+U Н'EilC& -EGי,zж(㏞5۱Ʒ(kZch|b)cƚm1TW݄5~c TZġ~O`qU]m> [(\6(>5%+(2vS,ƯfM2p6r~LslV.ŒeKGnc|qrͮs:gwk+-jg9dZ7:8( @fRD~mDpsgG{"zt^-AMEQQ݆8sNߊNxi B_DTEBA6D,c7`0 T{ޱh';vgш>)dr`N.X; s"Ů(GE3}oD"vd/ǶvH~WN?"(G\ 1Qz߂U>r]w.qSy~`M(]+EIurZ?QhU!-!Uh'׏'n%{dze%|`*0 %@P .Iuk*n H:APmX{ N-YAM(|meÃAۡ$/mr-U%;J(#¹&m 5\oYVHVu>>㩨}F&X,{ʆ\"/"k>X6Ϙ/l6Q)l#ghq3GϹ+Y?;5آ+u{ׯ'ʗ<#evlQ;rc75Noj %y|J[6GZ{[2QRxԌk:n@m%ms5V 1L ;xszꅠMQR'Ilsɜ 5N3uNQT U64Ԝc9Nn#ⱎ8Ǻ#TJaqoN{l5s?oZPEQEQEQEQEQEQ{j+kԒ=9ktoN&>68 3!Y=%KՎ_PZ Xz=i{yG5m5 :~c)U{Q~08(m賭@/ Aۢt?g<(qAV;sMg i]`:m}xFxڠmQNhkDiţw;~vS 5㬬9Z\c>*rA1 ̙d{ X [jBS̚P IQ "9OwS aeam):2H;E _YXg.cqfamv;H;E _`]=>4qJQCEQEQEQEQrye@ϊ{v~2TWi&h;(m)X,lA L~wk0C'5T6oj=zFx+AۤFrbejq1X FUMkjwZcNSDH.5p[5{ڶ\X}{ǂG)@LSRm/xRMUcuX JS]U2ּl1#|!AZ?|/'pg#c*#v=""Ļo?xp0R-,A;k,c,ptG"'l Lxi݀/"mM_!/,C }:kG8&% ҦJ*$Gg5P 8owmkQeno~8;xO>rwgܡMX0<oBƣYDo7 nb@^ԈS5[$*i?YW.%J 8oo&Hqr :s:?^_+$ɍB~\N1e݆8dQ'dwhuܻ_D {#T@uV#/!/ϙ@~vWn,M' rî/p9$:Zu,6Cg!=E8=00AO H4~ ]U!B$ӮG? ?<_GZۚȋ ^ʍ%e z4Ḻk6✟n?"z/R|\}Be_7ᓽJ o`)y!OG1H{L{ C瑗`"D'R,po$MF؈TkQOLk{eGt*mH5s7!,^G~1Zut~mD'`FMe7kBm&%EdzZ0yT˞C,DzA~gxxgtюD6 հ$ҦBCHJ_#R|;H^3lF˱ۼ|#i#8 l!wmSRf\㸚P]p`  K衯n=iKAQI:~ԢT쎽tnHv6+OkD*q2>i7#ֽ-3fu U%vE*LAtΜ%mr-R:!Ւq>[3dVء(J dcnDȿ!lCQEP=̠mr9N.]UE4Ek)רS%Q'(J^NNQ&lfa>?~AّLE2NIɠ}LҎ+ݼy[(3KJtJMe*kM3R1T*-JϞccO>'SEg:+G zI°HjJK7lscZU%ɽbl1dGZk.jiS[ch'WUs䌱?o}_8 m)T$j`/C`u+4SQ:MNƅMnkrurdȐGxQ۩H/{@On앜$!$;j ֤SRѳJfh-󭵧!tgݴcGK%k ~ϛmPųvXƴu~1)/\pCv|2YdǂXK1vʕ͜e~tO3dXkNUUs܊ͰYVp]]o#ZT 5M d1ƞ-BYKJxfU.&EXckQ$(+(c|"s'ܪMQȪJj&p1퉠mRlG\0lC[Zv< v08>dv}6)J.PJb`u`UfM+dXmCP rűcKKJjeAۤ(D;5׆‡mK)+y.}W~xmRCᆚP fȐg "( ǚ)U{ml IDATL/2dr+WvqV%>90XA_yyZ׭k+WVM䄓;uXs'0_=~0dȕ{hUf+h% '`n{ږt3tql-q+~M/䌓#|,/忎[ݺ+n0h%)gaXHC\> ˖M(iyL;d7CD7tj=zVuk= +Vz6)J>Dsϋ77Z3+n}*h%H.C_WSS˓@"{m9 23/[KL\6up!LYٕ_cG>˃IQ vr_xPme/#/awk+Wnvc6)JNg ]K0wYkjmCMSF)J!5?fLj#F\mfwƘS5WAۤ(LGrXc _ ږaî}˖|qܯSy'7#<0'Ai<;{/--gEQVr l<5.8/V\͛7MyFDBl“O>:ӯ2EILZ"ٳg3j(zSN9s93zt 8S:_2wg}ocRVV!NP%1]֬YK/Č3v:8sWӻw|IN;4&OM7݄2gᬳc_:?06lꫯ橧OgÆ x,Z$ ^=?QFqM7C=7|3g2ydxѣ7tC .ફ`=tg1j(}oNcc#.wy}z믧=؃G\{L0G}n?O\uU;\v2֯_u]ǥ^1Â O~Bmm-zbѢE 2x5k0}t?~|W*E)HnJϞ=J;m42dlٲF @yy9lٲRo_΀<ݻ7bަ֭7oetyuuuL2J&O̼y4hƍ#O;vлw]0|Fɓ8#8èOs=bg}زeKRפ(ʮt|XkTW/^ի;v,n<I[RRoMMM 1}Y8tvv.oժU|mzEoaFKK Æ ۹38#ak֬am >իW܎+*]vrx 466 {0`cǎsr7rA8'x~[ne…\s5.gϞ3oy۷c`m} Bիò{fƍ㞣(JrCϞ=9?/o]^W^Y-5kְ^{1falݺ5,Y… ;qL7ofӦM?`bĉq󮪪bѢE|;1c? Todo List

Todo List

Group Public Object Methods
calculate the width of the labels
Chart-2.4.6/doc/html/Base_8pm.html0000644000175000017500000000552312033071320016147 0ustar reinerreiner Chart/Base.pm File Reference

Chart/Base.pm File Reference

Implementation of Chart::Base. More...

Classes

class  Chart::Base
 Base class for Chart; all other classes derived from here. More...

Detailed Description

Implementation of Chart::Base.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/inherits.html0000644000175000017500000001101512033071320016327 0ustar reinerreiner Graphical Class Hierarchy

Graphical Class Hierarchy

Chart-2.4.6/doc/html/classChart_1_1ErrorBars.html0000644000175000017500000002177512033071320021071 0ustar reinerreiner Chart::ErrorBars Class Reference

Chart::ErrorBars Class Reference

ErrorBars class derived from class Base. More...

Inheritance diagram for Chart::ErrorBars:
Collaboration diagram for Chart::ErrorBars:

List of all members.

Private Functions



private _draw_data
 finally get around to plotting the data
private _prepare_brush
 set the gdBrush object to trick GD into drawing fat lines
private int _draw_legend ()
 let them know what all the pretty colors mean

Protected Object Methods



protected retval _find_y_range ()
 Find minimum and maximum value of y data sets.

Detailed Description

ErrorBars class derived from class Base.

This class provides all functions which are specific to pointes having carrying vertical bars which represent errors or standard deviations


Member Function Documentation

private int Chart::ErrorBars::_draw_legend (  ) 

let them know what all the pretty colors mean

Returns:
status # let them know what all the pretty colors mean

Reimplemented from Chart::Base.

protected retval Chart::ErrorBars::_find_y_range (  ) 

Find minimum and maximum value of y data sets.

Returns:
( min, max, flag_all_integers )

Reimplemented from Chart::Base.


Member Data Documentation

finally get around to plotting the data

Overwrites Base function

set the gdBrush object to trick GD into drawing fat lines

Overwrite Base function


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1HorizontalBars__inherit__graph.md50000644000175000017500000000004011666706742025061 0ustar reinerreiner7e5ff7ef3ac12fe94f8e248705e6d242Chart-2.4.6/doc/html/classChart_1_1Composite__inherit__graph.md50000644000175000017500000000004011666706742024062 0ustar reinerreiner9c7c8b1bdc22ccaf78d89a3925d213d7Chart-2.4.6/doc/html/classChart_1_1Composite__coll__graph.md50000644000175000017500000000004011701115622023326 0ustar reinerreinereacc40a02d817695b7513ad2a0ec30bcChart-2.4.6/doc/html/main.html0000644000175000017500000000253212033071320015432 0ustar reinerreiner Chart::Base

Basic Class of Chart from which all the other classes are derived.

Chart-2.4.6/doc/html/classes.html0000644000175000017500000001275212033071320016150 0ustar reinerreiner Alphabetical List

Class Index

B | C | D | E | H | L | M | P | S
  B  
Composite (Chart)   ErrorBars (Chart)   LinesPoints (Chart)   Pie (Chart)   
Bars (Chart)   Constants (Chart)   
  H  
  M  
Points (Chart)   
Base (Chart)   
  D  
HorizontalBars (Chart)   Mountain (Chart)   
  S  
BrushStyles (Chart)   Direction (Chart)   
  L  
  P  
Split (Chart)   
  C  
  E  
Lines (Chart)   Pareto (Chart)   StackedBars (Chart)   
B | C | D | E | H | L | M | P | S
Chart-2.4.6/doc/html/classChart_1_1Bars__inherit__graph.md50000644000175000017500000000004011666706742023007 0ustar reinerreinerc0e4c0762c0be7636e57839151474f10Chart-2.4.6/doc/html/ftv2mnode.png0000644000175000017500000000030212033071320016223 0ustar reinerreinerPNG  IHDRL1$PLTEStRNS@ftEXtSoftwaregif2png 2.4.2^G*IDATxc`.BtRTn bLJJ"05y'IENDB`Chart-2.4.6/doc/html/classChart_1_1StackedBars__coll__graph.map0000644000175000017500000000030011701115624023643 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1LinesPoints__inherit__graph.map0000644000175000017500000000027411666706743024471 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1LinesPoints__coll__graph.md50000644000175000017500000000004011701115622023633 0ustar reinerreinerc585635147a789a725d02b07a7f6741fChart-2.4.6/doc/html/classChart_1_1StackedBars__coll__graph.png0000644000175000017500000005571311701115624023674 0ustar reinerreinerPNG  IHDR3!bKGD IDATxyU?zf'dL 2=  \YDdE!6E\&3â\nrQdzAe YfLWtWwUgNVuپEQEQEQEQEQEQEQ7ŋm) *ƘgϞ}jv(cɒ%֞A>1XA%4:1UOZ{硇zgK, J8c={vU<9v6@Q%ԙ)R3S*Pg(JULQ l$P"أ_[Eo3@>7·{ٿ0{Eo3[ @>G!QQ~Hu5f`= " 8;v#0/-a@;m tKwx 0x<T"|l3= xJ4HQ28sw:>84/- DoÐ/b$࿀1^Yozݳ+ A_Á3>ڂ{$p0 f{!o>Q˨L:7/||؁DH! `-Q"*`7Uux/87yC~>8X5*J:=3 =}ZDmF>xX6D)KO p8L6E"A"Ӽcہf `26#FHDbpo.AQ2ރKx$w#ETE)1ȯ#­y??|IL6C:R Qy8p[wq"pPa<=?p.UT~"N*ómH[ ` 1$p0&V6tf D#o??! qNy/G?5{GsH5b.HQ%0 X HQ(nGJ.(RJ=LLQ%0tJ(U:3EQufTE ԙ)R3S*3up⚶ˎ&E : ێjǑ1^xqɗzA9C?ؾ/nNԎ}!ŋ>nZ{1rŋgjƆEqW.gH_8;KfE_wnzvݒFŷ4]g؎fP6qOL%d\}S2Gfwl~n_1n/3<&l2imNmیuXsѼ+öOQ_<%n ۦj Rmfmq#=xSZPSpxBP3~ʪ.\o0CXXLyƲ ShmX0Xcۦj!2άvMM |l3rqJsEY01!S5D™0 {٩C֥mZ^N%HZw3~697 Ӟ5LНjZ} ff,;<)Jkε"FcSp,.BwfmMO3a"hUS8t1v>;iP٭ӗ\-` ERڥ(A3tӰfp/jquKvCkͰ0ݗw?,wJE^o%}3cR ͙ޫ~tZBIRڜ8 LmebIQ$8X>DdiZ8]Q"s5U>PلG(d:U_X(rS<1kyQĵP6êPZc\kfbXsMȆT"+ nÚ -iV B"3Ѽ%xck.&f?57`̩ČwC2WQ b57xb_2s[o5uii6*E+G7ƶ˾O%hSHOj'mGYfbD1ך>)J1Po}'l;H83klx}ݐy̱&IR2,uێj#@3ƶv5}CEhn`kưm6"̀f/AksbxlQ# ݙy3S{Td=Mƴ0;WLd]=%:yKݎe5LQJ@Қe}ض(((((((Ud1V4G ,kpigפjh61%.czo?6iinvϣ py}MJ5ho'}p[3lsiky<р zqn[<5*8hv5~^ȑt[Da7ozw |g{psZ[S~ `Eii.\TQDϱnqR+Ro܏D{]j_o{0""8 |+ͷה7u]Y ř6!qB:ݓ]O^5_"U 7^#蟡g/H[^ {0K{6<R{W ם@V!U87|KqMcl=,f,^8{qhOmO"`⯘[C89~lpSʗ#=Mj X^[FO NrU@6{#mVm]ŐoԱ U;iC_I> 3 ~U}WJߒT9?u!:2~U}WEQEQEQEQEnZۧN(?4ke+rJیeG4T&)J9h'~|cS~aQ14c殾`]5"J2=?y#Z=2,K ۞jYKs{}\cẹSYg226)d"v.eGgƊ}oLI%ٛXֱ> Ԗ&%+w 9S D4>GsO9*,:Q6Xr еu4cJdUr,"O@0&b"mzfNF$ϻK2cM~Յv$Q^gf<3Nی5)4F.@5%?Hr2Y:w_S̔']X $z JDy;BODZd}l,Ad'#HgR/՝zc3;V^lvE_ RD1"DNmz:ZoF]LuؒeJ<}Fdh ޾)o(+#QSNoA*b6gC6 Q}߿i+K @87әv}0EQLnEz! a8M'! jwymw|VPʥiRJg+J(lvRt)EQE)T3oԮ3-:ZQRPjf,lƚƶe|r\]2S%lnԮ5e;j8{öZ) xƊ|VDL2`ĻcLQJ%wƞW:C¶)3fodJAČt&Œ#꒱¶)cl,iM[948LN=UhDɏ83 {Yk &c8gUq,p@& 3@a^Ph#C/[UҝTQD9DdnHtt/u#8;{ٗ.Gog#'!an_8vQf,;xBe~ɏmtV"$D'k]}()RNj2;3OsM"dzg qd#SʇN4&yZ#Zvl)IJ āe9q)Rm_yR:hҞhfoTgTC3C䭣W"}'ۭT1++mOCڻ@#D$f!нR} ݲas?ځZނth5-T`RQc;~!6+?yk^m?}zk3KE_䵯F@lol >HїYo..q9UlO̬bkin?m~b/KYN#=TXG,K&(e[:εƎѼ0l[ A;Me0pR! ҠSDb#%OZlEV+e=;=wB%(ufN5S-y ~=D/ˁ"}Gqgޅ8l?-Mb`ˬPbxbGkbR24eɭ:"?_|(m{ 9*mrݳlל:BDw#RouJ yn+RD@0#ldv̦i-ݮH-Hmc?Dtv1啖xx¶47N@y>>[:Ɣ9g95IkSǹY3k=諈7K{eD |丬\9eC48+XIC*W!rOFW'{.6O[Sp[f.ۣ5ӗ,Gy!RLݳ|yK9ۑvV=kMqf"m^[)"%_ݘjeec ;fVnJ6a- IDATL*EEĚXSԾᄒTG=vC6(v~+]C6H48 i?=ꗮ2:3ϝ"QUlvXt¢5׿"; igv"HIޱHoO:*$|y}`ڸKϰl00Zt"=NOlKl^TQ"*J񃑒>˧ ޱv'ݲg@x1N<}E\wgbm9tx秈\-B{ MlC@zNKߛH%[l'|*V Aeu{{S.f5}SrR="oHy8;Ww"l( rk^3|%\끡HA']6T6̘XIk6E}>}R+;(;tnC.pWEQEQEQEQEQ u`T Ð9R6δc6/ܮR:nB4JDGQFs3GZvZcZ3+_O]ĉa)ڙ9al`237#g6;!w SErQr56⫑ŎĚP"3kk)(?d@F#`. AHD ds1QoV#2q}8rp;;9qsXb\'D53:F!Zf5u *&#΃ Hz;sq"DLjS8^Ň{sɕn"coyv{wH븡❙ƚB + f 5]V {(i)"s N&TM}>O^hwu(hk<6pBz;;3k´fS:]c{#v8RhL1uf!P3[u&Y4 1.cMc凌gPʱW5Ǝ:f*}5-l;B`"R[8M@zHQLxu gjw/t@TymLNk4-_j'T*G):Ke#g61|ۣ".%ZG1#wJIW3e(JY9ѥʟ.((((0N_SV EQvƒ v{P(Jqә/p@ik8-ޱ(l;KKs{mk<ƦC¶R3i\gS@-؅ T@"lOg$=8 @[©::v34{E.sbqٱP7iy%O8[j:Y' me Ē:<$dc{XRfGJ B{5;xKz<ȴYu8v %ʅt(/D L* p)^_xۧRkpO~¶CQ+?2W_I3tGj{J.h2^m `W4INCO>ٟ~OR=p-p#ȟ7]QvFU3/~Sqa}5L"mi  U!x}[QzE#_tCDmC,z !].C" 90KJu!+z7T 4;ܰn=.94UP3 | ?LSRƎVŌh>dJbHVlkᥘrk@mӞ-e$ #g96 k-* rfg>w4yVG6(hA wŒ} coR˭9|fc덪*J2-ܬq,%!T\{[GN(J>d*ލ8r*ށO``gGo2TQos((j=KwfCcg{6Ǫ (J?#JUFzޕyoP݊f,料X4eU])}c@:#ϖݱ 2c%fgƚ[ۿMJ8:{qU| vfqZ1 |%.l{ӹy}¶CI1mf#2j=aۢ ЩLSHČ?mFd9 k%c3GQ*Eqv ΜaU#\t>:[aۢx.x%0-Yu9mRo[K5}yy|c(ݨ3+#4utÁ'fWt?rdm,yH7j`mlĻXr2(:rcS!e-7%h{WN~~БL&Xkv680kƺ;-;^UMeFfUHیeG[׹ h,5vY{ܕ BE ufULہ5XkfbAf1[3>E uf[g/a8ּ6aۣ(} ӗ7m(JQ.9'٣LKsycۀ'f|MQSWl>aۢ(lk[1JvČ5Wk^nin]QM/qNv(;S3sy kFe>g=v3KvnX́4_hʪ  #qArfrk'?? {Օ1wy]ƚ5iU76umaq۴7öEٙb#0&s񵧧3wy1:lbkm(E:㸸0XdГjGO'f a3vk*fD⪙؛1'tN &`ۢxt%c&TR3ޱu]L8"BT:1 uf"HNh~Gy˜< nǰ+gZ~. x9qvy r88Gڒse{k^hmn Ӟڵ\ 5z! EIg`x I RzC3Az'^x~m8BS.Z`6P#mYhk8%x5x-g:]NQ3ۙY`OK7qCW-ϐ( MEW.H!]a}qZ3j(@'R<, /r3Kڒ3?1cf>'zR"Fzi]iiATYH䖪Bt>Uv*7+mhhۙ8wڟһ38t/wy#|o{_o"UnRm#(~:{+x~THЏ^i$v;8QQ"K[<1Szio>ǟGvD:f}c~bƋaے[f>9uO egYZ3xsQ7)WxT$kjmJضqUCW5~?LJܗ7M&p_F;".i׵G8ucEnSc4@*fD`fuܨ938qՔ3.5"~}x''Eef,83YL \k`mw4ֺHm5]Qqfư6mfJqΓ5#>k.p['2Rq',\)A`0v϶mWWF k c0:!SVhV*Co燀yu,p@@yU罰m`ʔ3#`6L@y  U--헶mZY\ͪ}p6(ѣf|فk\,dnDp1u"`!  27gK_SS+͈J 2a$2b'zq(ҞQh,8l$23E!yY5ʳSměolQrsǴZ`Y(Ny]\#Hs`#922R6[≎x❖%|S5"DGjndq:)R]+< s?|:O;JyT]u7dƚ?6uBl\wӗ9Km8Ws5p4mh#ty]j?Mϡ rبʳYKOLnin %;9:q}(f̈́3>#4BxMsVy1 018EO%5`ץtCx9[=݆Ht!,02LDf/L<2{BDs"|:(>@>V+fG9[e,2]+yWm3 =ŠmfUĭnHtv4L ?H-:'[o#b)"RMُr׹\;KG1eoMiIgivy~Ȳo"Zr)˿lGD&K)##F}8JdlL>q<8!.wgڧ=@/]NA%?$3w:7mYȲW!_G"tw7x},pnҖѹSf6әY5@$_ڏ:ıLC~s1ѳ%H'wgeo8 rWgD?s{yߡjb7^)UaE ~t ^5ɺS?j?v #sEt]_ 鑫CiAws)fn ^A, Hv8;7m@qW(ccRUܕjjGsr J5Ɨ&$LEC~'#AH9RP,*]3湙#ԙ)R3S*Pg(JUPXm |=tC EH4G(|҃JtfQW;s2# o&O>w,g]%]Фupj!-eYef5OOBaI3dz5u3])鯕q ͉bf" V J Ӎ?/Cj]vi?IBK!#Owxn3xGƏ}!cƜzA{NհMYUOlkmBYIXEn'tŜ}*,koUk$wagfyI**] 2z􂆆=n؆"l۔PUSv+MKo8!/r9lGV:(^'{hCcS#m_H- Fƹy85ۗ Qu>8rw[2"M3Acа෵f1Ɠ210[;;kqr, cgxn. |A^̽gi%mD"%r#!s4]Ry-~RFdLxA}2ɗi 1CtYkظ'òS)/%wf-p⚅K${"d{)NM<%Dov^>o3a#;ۆ WR_nR\uPXC{FFtk=$)Go喾.AUu^:{ܸ hu/=5iaGf7/[kf뺧9s1Zc۶v5-!tR44,tgg6\L,f>ioM0\+0QgDqn}}.ǼX\צ`m̞(JnC? KȄ [ce6Mem3c 6Йn9U*b oe0[wՍa[DU3-$zBa(Euر?~]`O5Lɇ93u>`a(E6`:",c/q\v5,GJSk Y } V='^09Zj b1c6\D6)CYK>44Y`QP$z뭈3 Qzʲy3v&vLf͵ϗLE)k'??5^HYTgQ}Lt?;ʲY?O74,2~{ƎxHQ@i'nmnSܞo%xZs(˦[-XxG9 I*["2.~ Ҏ=ρpWt54,hNW\}n5pjTgS4[XʨdeYа?~Z~Y2~DٝYhmSCr-}85J)[ e64 NsuWݚExjf$9J1 &{g"# x,T38nKWH۟yjf:Kj}.ѣ>a_pA(A;+tKag:I Rq,wy#/|o{_odrh.D@"άRK7#~$ ]AKsf~(d9_7~x3%*Q(jzkU7 l֯zuy*J:Qrfՠ:[2*BYႃ{,f>fUomR}4N5Ζ+ˎxp̽9m͚mRD)2S {ׯYw&öIQ/?mhXw%+JV\u;~dk~b#a١m2sںuWg&PlBk(ca٠n}u-#uZ*udJu a´A /9od~öI_̬waފJ2qӬu1A6\t6)PٺDRdP\ih2vÒI7cspڵWMJ$Tg浛Xs\Jhh84~j7>KQJCfZ/8㖙%Ə?`n3kׯ^mR7;7?lL&τm'Ə_pk^} J)JrSSLJ,Vg#D/а omh8saۣ(Qb„G%w>k~4l%(M4W"ر5Ck{6)J&)Ѧ[ vKWWuԑ)D S>qOևmdCRze_n7;֭>VuE,ƍ[݆ v)Ja6u|㊰,ih&Yya[(}!rmfƚ]aҟ3kC޹ ]YְmR9gwHea_u=f 'lDΙ-ĸ[ ۞jg„ Rk_Փaۤ(9gv;0%cͷ¶;1lAk\B6)JDҙ-\rh_aưFƏX{T33F4 C2sW^`֎F@,5 ʣT$SNyZv1Sjx/XgG^@\gy~zs(lj2;)OzA,lN\oO|FLBW-f)95ҔwY, ijfX e)<\y MvMS\.mݾ$DGbv-@+*2;M~g ՠwv+((M1*f\F]رcy!enB'L !<3!Gb&vl}}=_}hÙ0a/efb| Ltt4zkQYY#^x6iӦq]w_|Enʒ%KtL%D=3Aaa!w2/^>iӦMZZJ5ό3?~ @nn.Wv妦&N'555-2O>G}ڼZĉ7oR_uֹ?'xg4if"??߽;>}:QQQ$''_r/vJKKaʔ)L8D5hYII W7ngϞrQ\\ƍb޼yL4Xb@tt49rݻF~3gIII 6 u>>><#X1cp=bl6đ#Gm^3ϊ+XlG?fʕl[-RdffrI֬Yi\x%K0sL֮]ѣGINNl6Ú5kX|9l۶,"""mr)Rr~5ǯ<`ժUlذvZ|}[5qqqL&V+EVVb`2[nO`` Ip91cZ夤$ƏOaa!| ݽn}}={/Nb966ŜY~~>k֬a֭m3w̙3[LU{lذa8N:t{7n~0k,6lo_ؽ{7-^ۘ;w.v6…_ek.l&55~,_bb"=zܹs-<5?WHH?555m? .d۶m חSkQVV~}}',, cǨmuǏgW\ /R/^ZyF޽{VZ<>>>F ";;۽Ç)--ϟϮ]`ǎ9sh>QpD%uuu\p .p80`~~~m͛7hdȐ!DEEqxyya2X,_ 33{;3۷w1zh$''+HUUr WlZyVZ㉉; н{r>̙3(BCCc… 2SN1|pa_MLL  QFhkҥF#C%%%ŧ~J\\z oWgܹsg~`00xVHUU6#F\zѪ9~8555Ӈ8e NPPP$8}4'OO>͓8qs1tV%mFhhh`РA-1[#??ጢSb&<3YɍB L !<3!Gb&R̄A#H1Bx)fBp{3 n` U߅謮z;Ӎ"I!B!B!B!UPZ3tIENDB`Chart-2.4.6/doc/html/classChart_1_1StackedBars.html0000644000175000017500000001426212033071320021347 0ustar reinerreiner Chart::StackedBars Class Reference

Chart::StackedBars Class Reference

StackedBars class derived from class Base. More...

Inheritance diagram for Chart::StackedBars:
Collaboration diagram for Chart::StackedBars:

List of all members.

Private Functions



private _check_data
 override check_data to make sure we don't get datasets with positive and negative values mixed
private _find_y_range
private _draw_data
 finally get around to plotting the data
private _draw_left_legend
private _draw_right_legend

Detailed Description

StackedBars class derived from class Base.

This class provides all functions which are specific to stacked bars


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1Split__coll__graph.png0000644000175000017500000005153711701115624022601 0ustar reinerreinerPNG  IHDR0uYbKGD IDATxy?fdGE1JXEF4nɛD\PI~n Dflh"fhL(L 3tަ|UTMs(((((((OL=)Ƙ0ovawmR<,Yb!T6c̉4oA1W81cƽ4o,Y OXk=C+^mcoEQ:0EQu`-E)[ԁ)Rہ U:%\ |&pށs8*) ,vy%[ @ \UI^y8ш3Tɇ;El_6xnĝg0 4x_^57{W7D@;2pJKQJ.u@pYB:%9C P8w'ϊ2A?Ro$Z`Wߥw{ kS88-mLv@~;o ҟv,pH.IJ%[ˀmH$t u] Vo!ZmCP~ D$"rqȯܭ^ǀ_t}t`yS}w{6!-\c*IIkM/0k8D"ۯH޾ !0XOhܢ %c"#么RqJ&_l/ '܍4"gL{<ώ''x؏2 MR(R}w p  ˪&_c'`2p>c|/")Cc1moE)6#wcob/&d H# fO#lM+3{iޓ)JI3.+}$_M ː&; upImd$fY@GgÚtj%9%Q{2 vCy \ˁt#M2a#ݛo{/·ʿoR}w;楒ф܈LmPE)*AKQ%h(e:0EQu`-E)[ԁ)RSl݁gfeE)MGmC%tؒ%KwAk~9se]xsSQ1ܵdɒ;?UmjGfy A\W3 8xK9^ڕ^ }BM/d=U=6~U}Պ'8Y&MKR*` t;"n=/}`sSTsBFܘ^T&G-/g`E@Xc5bC}Fܺ䣔>Rtz(|ԺQl{XW]lb~TIl%;7 ~kjz+S{ٺKŴKQ yjpdu*D``dVEQs+ɜ.יQLPDl7litZkNŠ h֚& 31ÒWrدcWǪj32OŁYq^̚\1lRBr~ύƚzkmhh ( sf?t,l퓮2us}:Qu i]]3 hk3^z ԁ6R(3.逧c\GeA 4@56T G 4wŘO}31j0s뤔+NˤRԁxsNil{]P>_v!JO L~~Bڦ(Z{VEO[4kQ)EJ&saۤ\k Cw ~`emj"ӜVQJXh뚱kqO5ŗqHmi@QoŚƶpk愦 ް[.xubڣ(Šuc͛IsCS_۞J(X;݁ƚg>u^dKQS,lq9Kja1P2( <ㇶ4xL`jۆJr:L 1vCQP"1v6T*Es`&I58ڮ])5Es` k."RX5X^gŲCQMw߶(((((((x2YɁӔ9p5s \cN^9&E)Y,-p|,6,2Y=z73£xNI)EЃߺsot6|6~A]~? `c*Odi_0x#5BPB8MF} _G"/KqHK/7(AGćG@0Wĕ z?2pJܾt&cwcw"*v-5u:h_WmoMɁ;`c{;`Km(!HtppXfG Lv@qj=I!3[=v |] ,GQNB@b@I nd \8˼GHR XuFy̶}Yy H')bgm)yO!E;*`%8 Ĝv#LtHԓ5HD,1h<8я<;?#~!y rMt,w`5S16d`+[60{=|/Ǒ& ~ؕs V Mxϧ#b)v}8.7 8ޫ+2=o!I37`du Yrkl5i/~| "Q<"y޾_!}Y+̩D'ĕ{電y`;1zdRR`zG{?lXhoƏ$⚔r)m 5B/ќR?p(ढ8{%C#fh6CFҎFFGҽOg!tc'{fy\Λ56!z)m:"n|.h | p;s!_ﻒ!E]VDi(ݐM__xEQEQEQEQEQ -?6(Rl&~}W[s_4ae/[3HR47l _vWmKQqGcxl;5dewLr"β1#(tOq>gq80'4k v2SP2 Xj%@h}J Dg?#^z(pflT*D`50»g=s2$w2J$>k2; z *JJ fzJ(1LN= I2d')~(7!(_= x <3LYb 5V<\8 ZHJ4#vɠg'!I#)_=IrrҊ yw`&v|[).-$q\ZHن(_܇DR:K'|B1+5mNT)#i %Iˑ(liy(vFO8*w.rJNoS;>ZZU)㐅)^F"[O&)xy};GF+nUNXޤS(%D>Dfy=ݝG:c[~y<qhQ#ƨ:6='-rady&;0~EQ&SIDn흑v|Cɯ FNZTRErҊ3H]"\HIiEQEQ-Ф%EQr'MHcZc7#sR2ƒ]>ˠ-۽s i7uKsmKיuj3f]g|ڠ(q)Q\%ys` g,t;] 8nM(7ֵqȞ@uuEQ5!t}%o``U1 IN;̆9B_gcW)F>>+sCSQzg ΐ<ڠtD(rI ̏ێg} C[2$o/6pWcD4_8|7PqC<:0bKvhNFꭈx`z~Y2`IBz,^&:՟tӇ+00sD4N@` tv9tT7 }\k=|҉e/dvzu*R$&"i);!VJ%\ Ru=Dt{xu*"0w|ո΂3aҍ\$$ɹƚR'cNif:lsEO\1#L]h]ف9a˚ײ=q/`!*drƌXs|Qu`y&gh[&q')t#i=XLQ><0pxXP8h%:VQ݁56#J[(Lt:6Ɂ57F:)s`YGX|;̧ijF{"Jj.fl/ǻntͰ\Pb0oi|*f&Rt?DC5>t;j9o#256Pr"Jh$,$ocD5'SpMurU>MT}Xg2{<^"(eF*шN3P쎌JjB(RMК(eF*Ҩ<\ |JM6B,tWhMWVPtUe@r!Ht.nTఁ ) }S>M&Bl*92IRT oi*5lbUU*Lҩ&#k!OSɦRM$ .L0Zh^iL4: SH\|JM6B,tWhMWVQl l 0muՀ~GZâ +r¶\W%d` lx{F6W"h/ $|8ò;XsYL.C,bX6o(J WiY z[Nɑ;0kv'r56^Wġn42\Lbo*\F!,G`j;`4EEQ'OF]́[0vTRSrpG tYV^0=bso*>90J=O62?IQ*ǚAh~!"}7|)J 1hE_=E(w+`= (:#iD'k8"sÓϓMJzX$8 ;-+8y9-КV~ pT;_ޒ6qsMwmK5vgD3ǝ{}[ESL pTӅ`+RzKZRڈ=o;*:c&]2K z5D/ p5q*/#rf~RNLScJJ_٤+@@8uA>2!SRNdtc@IDuf'g qy1m3;3f.$-eIRw`ƎF(ʈm^Я=bk"{7TLqqT0d&'r¶`S[FO3+JYu:5Aٳ V*qi˩%5<+\}ظ PEQEQEQ*FT*)s X\]{zPIi% hO)eo.s\nAdjrq^BT&X4Y 6_+1JN\\=.=.Fh!Mx j!QRݟH|hDۀ005n $}.D_GZ"뼲Kh.?@贼n훛Z/_0"Ryt TIip[O28~l8?&d㐨vwyiLD׮DAӼA^tmH } ݗؘ?bx0-StitT1@ꑇb E%}{_{*ۣlo$'6HlUT:}+H.]8u{=OW9q`QnAdބ  2Z3T ې_?$|k_C.OTRz uI;G_'G:Ih8̳&D'UQI#M?QBҎ1]{&wLH}v"68 Lo@Q:gq>/' _œD ?xGTuDTf܉fc,uSPk/$1i/tqȗϏfx<6rq^}sKrN Q%HTz# J;vF[`]k#᱒ ͔詯tȗϣ1ڄĜ4d0';orLʁ4OG"^}B5vƾi0v9Ϧ?= mY%Ndx,tȗ#\6@Y? lFT8ɇ2S@c;#sؙ`c@( '/3S_*mJJ]@Ei{Dl#=s&o ʴ\?$<df:癖υO~ul ٺ PJ IDAT^ Bl%3HJJG>mOy{ETb5yA})ׁ43"c674#rI˘q/]5 _LQG4J1IeEQEQEQEQEQEQc0(ceBLz~7mQDP7E TSٜpuc-Sڒ )h2S>aA %D2r`uF šӝ`[I5[XIO*d*  / sr̉/MO"QdYo6ya4%u1SPD4^y 0gLwy,*]L-e3*^E+T}`qk0 ifKs ijm==T-7 .Fs}F$]:lس}1YjYq**WT43ᇈHq^kY(z=kSb0gKM&I3/453e"2ueH/r ϔT|QJ2Ŷ%_=TJ G)0ۖ|WJPQ m +m(%mgk0z%*Y3z_~ۢ(JqdhM?7<)Jl l H&bkۧ!csڔ>øc:5HZXǍǜq'Fk9eEQʟvutcۡ~R%S1d4*tdY1)+ <;o[dXo*tY+y5v>+R&քf2(憦><74^PI2&GU$A| Moe刄HPs#EQr&$s^ٙDgc`wSrOjNsS-SEVNl1f@\xD-fD o{<ۭT8:@ɄT];:П}ϞB{7! 6 i%+Q(J D"17.i>^ADU}J "̟MRv=8t*~ )pJ0RI2'Q?<{Y* s}Lt:i!@hSRm RI23+7RRR%:Cv)Q1ka8q儒*TY)KRݺβ+s&`G'mKnNRhnj=%:o;*F!k],EV0k@:ѕ`ܕ%t5dYu9nIΝ 4NDRbl{BJe0憦 <{߶(_*ށy|lK 4)mIEQʆ16pyY0;d3;ܴo[dT*G!l%m(QJAYu8$іBPJ&]u#愚J^U3~).vLo~Rʉlnhj7^&RnML `$ 78ִmTʪ 9TVY,%``gGozbQ&>{QP (ea~ d`s}l\ϦÀEjc%f-ێ"SJʪS XxvJ8ύԧT U)hZFpZ苲ʪ_B"$*jM{s S*P}JS-Y174Xs͝=E/ʪC~ĒRV݈%6$)P}JS uQUMza宬iR[r@h}ZB[--EUHS}`G!/F:#}ej'eqn";7oaPG:4)韚L]xiE> 51Mk}"#Q~LK>%//dCjUAMX9pk1kݷ7n 20:` t.(}' Y`[9m?Dj'ZxmK ܶ v)J9`MӖN8g焛j@:Rr#QHcXկv$6U sCS_1<8fQr##&Դ;Po0U#gZӕi!<{x)5S2r`1$tbƚ0v9jGm=7~ۨN}fcgMcUX0ƒ1f\ǝ Lš}a?'4*f-襽v}䏋bu`eʢ +7kŵ:𹡩&+:XX5kx¿熛4UL);2K%RJWN؆|j?pwZĚ5;0ց f @R6;^s'Fd47d ɪC[T;o#p[S`[r 焦dsݰ2X[۵tmSʗ oY{?83cv.(EYr3nyX݁k~o DM%Ze%D񇣁[o{gJnxPێ"Y  lnʹ/ʘ"p2oC_6_A oze ,m^*@+0,xv 8?n 6{:XhR6TӤ/ňyq 3 KIy;8:ǐjnrI8t8sK޾q+tϴ0@WGӑE[6zJ` 0MCӗ.Mw^W %'Nl0q}ĕy3p3ՁQ}?6şA"Lxo2ԗ+W\l@"#r큤Fs ` a0Zl _pƒ~ۤ<ޅO2 :H*OSH' Fa_ر 841Brv'Ⱓs+ =DjOo7RB 7uv;0{h֢mSJjr`"}HkD"!j?bΠX D,  AwX8S瘫J&zFN{ëR޶GFd3+/o0'4k[Uhl߶)J1m'!P w┢LG"H]o2X45!'栧!w҄W9{D"(Gk'/߳%^-RL `>D7݁8'Gr"M?E:񶿒=&(88&;0uHtT \H_b E)/nrЂ>90z-;+7 lDIǷ}=CF`g[QJYigKl1RxX4~tF;K^^fco¨>҉̓JFR91 i^LϑRX ?l D.>u6?i8[9~mfv`]j]OAI9mqW/eB߰^Nk0gx{ܺc͵jLVH(]Z`3Y{%gf4|?́yg,mAV+} cwϫ%G n v@W>ƚ t!57"FvmN_Jɖ90c_ *|}gqIV96IJ אz|(^"T}\gz~M)YJETPN5>E`sr ,D2#Q?0(5];~<ΎT4"4e~Ƚ'2HA?ˉ},Ҽʜ\rlj?9aNi|T`JET(7#fq8$}YFn 5$6 RXE"烑 ?}N /)rYV:wr )R9 N!6s3dYd`׎ Glr8No u$n(l;i}ϻS9/"ڭcH*,d>`Ő3ִ[c%DWb7t vFDXhh&'S33t;2q9U"ӈ|@؀d|M,} 1>@M!H3 >xBm3˃oę$K'@6?"Ρ WEmPMH͋S*Ȉc)$#L&*6"ü8)/Q2$= 'x'1ňӋNofaTF;ӊ\p[.$}QnGcmHTH4C !}S{mo{kv;;Mdrb͎;Hb$2\DvKYD`N _$}"x>Xo@c9\tF"}F]58Gq*HҋUfC!LQ59ЇzՁu`), Jہ)QJAD7+i: qҮGS$YPd=zȈ:dOkA6"WK6yDYQHwÑf64s$ab-դKE){JEA.EdFݐd#>ԡ3~ ]e7ɍ 8 xRM{Inib9պ1"0<']fF`ţ,"}/%TACxEꢟ=&'΁YbHgnt^# 8 iFdvwKG|1GV"k]D8lQV< xeTADlĽO<xV db".iN'|/1'rG&]8|vt+UJ19b*9!j?bQrζIDAT )ziא wD|9^li263r:X_Hy)E$zSO,uGjںgP*r3gϥ3^母߲iJDs-G4d#mDBj>O5RQLaڀ-n:"|_%oudgO¾r/#M i^_2-,A)Wzu< 2w6NG&].lU!=lj]i&"&f3EF "$`Eo* L^?!A~9st ډ_<ʢ?˪Y&"(ұ+}sUNyeQ^: e^!6#S:&3bCge*ţD^y+LzY>aw(ՎR?W:NAm0ϠAٹ>1r E=injtՎӗVF}fРacFEl n}emgͩ,I7獱3w͚>d:0= ~uͱưKB1tZ5kn3gN)ySRa̘yW?_d:v!Z yF(yZgi=unm83֭{5(Jy3o |@?D#t57\W<|QX9KVsIf͖Ynm8lXU뚖)s`M^MӖf#nOz 1!QUHuqL^Zā-MMdՀm3ӗVh+?)ر8>k p]|eG(>PvㇶO[M,YR0oر5Y3`6Fe^1bwUɍ5!VɈLňy,M=f"R_vHÌDJ;}>LaEѿO7|?I(N @A硈 |W"Rϧ#; W;vg::X8k^9;;;t] DN^r6Ur`̸w{c8!# }ݓ!5b^K>hAAJ:Y[H4u3uA"C)}C!Q5 bѕ!bv1fy߱ǭeDMF~6m^v/&9RF́ gfq,hǎp1cvz{1ko8fڛ%[ug⇝J);#fBՑ%,Y]RϣG;Z<0uWR4׮C+EA灹֡i J:cl7f̼c~[Sc{3ёSX0-Z&=_ #[y?DF$[Di=b!#{"s}d`DžH-1Ѯ$/54aH:$:YzO67I=ofg`{q1{̘y;OT1ըF1{uKd3)ĩHdeNw=&3uZ*f̘!D7QTUo;Jd/US/;k k+N%锊TrKV1c.< %-kz&4L0Ə?ߖ-5mG{7j+U:0$;½5w{Xk[;I)=]NG)AƎLkMԘ:/%)%CCüan 5?^!DKQ؉ Nn:Xu*僗}P8yb6!?injӺ~Je: [QRQlXG7kkNF*g wv1\f͍yJ-;qmZ:e̘ & [Qz;MӊYR:D^\)(d0Zayvv[䓆2vōF3ZI)o>['T0c\t3`:Nd:/%=>RsggMݩjaԨKwt_$l%DV`$$a{7jWԁ)y{6舜IJ!PMV&s+yCb3E%)*>Mv$lDuomP{F&RMݍ5/aqs%= I\Z= cΟD%&a+ `N-JhRބ nUWLo{I`fYsIQD"0Zku^-'HV祔%4BWƚl ۞j&+a+KD`]oEmfƌ(|̞kZR uFmC2~Ǝ'csnjw&EIEI5!$l)&+U1;:J$lU3zNWUWvJQBYD`-W\s7-匮T%߉hz.1v|l[hRC8qmui ]=&a+LB߶pպ߿$l),W]]k~hz)q4 [ &O[[inJ)E4 [&ʁBs,n'ЕjlQfX ؐ߶ $l0#ҨK.SIJ5SvcyghRhVheJ$lEX٠I؊HD`M{ʜw%hN%uW67^!Dh^w 5;رsv61[KQJr`kZiWL~o&a+JfTR1][yj6e&a+JTTeAcxWe3v_u܉ۦtHv/#4 [Q2"(g޴~ &mO:V[WV̩,ʭV:w~ۑe}k::"g_FRrX)I؊;~MdSݾ3p`ƍ]u+[YyY9*X=PMPQTE)[ԁ)RSlQ(J٢LQY;::Xx10O?qhooz/=so^VBFE" 555J0LדTVVI&総)r~zzzF300@uu5^h4Jss3Ңoߘ#|A \|*<_:?̹shnn^"*F`cccEה4߿͛7tww9y${nijjb׮]RWWGee%D!rq|>"zk֬&***عs'[nbO hli/qFGG1LXV0PExv_~I%b1֯_OII25 tuuzݾ`L&+Fqq!nZ P1Ռ~U˗`0L6l}%]_iZcddd(kqb L),,\0QLNOG^BB$ !TKB$ !TKB$ !TKB,Q75BZ{!wE+jmB!B!B!BGIENDB`Chart-2.4.6/doc/html/hierarchy.html0000644000175000017500000000564412033071320016473 0ustar reinerreiner Hierarchical Index

Class Hierarchy

Chart-2.4.6/doc/html/classChart_1_1Direction__inherit__graph.md50000644000175000017500000000004011666706742024040 0ustar reinerreiner23585dacd159211a076b15c5317b5e3dChart-2.4.6/doc/html/classChart_1_1Pareto__coll__graph.md50000644000175000017500000000004011701115622022616 0ustar reinerreiner49423bb6ce0c1be565c897122b1fa5b2Chart-2.4.6/doc/html/functions_func.html0000644000175000017500000003210712033071320017532 0ustar reinerreiner Class Members - Functions
 

- _ -

- a -

- c -

- f -

- g -

- i -

- j -

- m -

- n -

- p -

- s -

- t -

Chart-2.4.6/doc/html/nav_h.png0000644000175000017500000000014112033071320015413 0ustar reinerreinerPNG  IHDR ,@(IDATxݱ 0 A2U !kJrZoIENDB`Chart-2.4.6/doc/html/classChart_1_1HorizontalBars__inherit__graph.png0000644000175000017500000000676711666706743025207 0ustar reinerreinerPNG  IHDR{n;IbKGD IDATxPT~VV5D); gw4h.$%irXHF&T1Mz&jLɥ13REH#Y( {9,{}9g9~|sB!B!|KTy(esB,1#z1;cP\^Fhi`1 7cOp&Z5mSz{F 7 J-r5ݺ07o CTA[فf8KIZ~+ӟ;U/~r3_l՟?Qj Bk"w8L7&t~ V#Cz9N6CfhwϞb$] / N8 0NNB'L' I$tt^Y/_զ thkkZzߪ/<5fؿc:~Tppj1уAˁ)::k'ԺX>0-A~DEE]E:a.םPUZE $t) iHGQ*+ y΀rEqB E!"**lv+H p8BR۴YO}z$t8EQ( Kcb2[GB{yi7Ca/SbTUAt*Ϙۣ%󛚦(=(X4vQf(PI}(E~tح%yINt t:?(G Y|wd I$tt:a: 0NNB'L' I$tt:a: 0NNB'L' I$tt:a: 0NNB'L' I$tt:a: 0NNB'L' IĠ XƨAAC(CwzOikk벽͝;NGJJJ(..]tt:a: 0NNB'LݫQ---qEa̟? OHKKvA̙CttÇ3ydBzaO?T'ۿ?okӻ(XVf̘~l6;v("""سg/2p8)z-jkk>>??~?*Cmv =(nw^Wy޽TVVbٸ|2Ŭ\;闙nΝ$&&yfE'==N:Ųe>#طom/b |AWyӦM:t^z/qJJJ ;vtzDDD`X\eǹ={tR,Xlԛ>t=1ct裏pUN'.\z233Yp!k1c ***"%%V6lƲfIJJcȐ!6=Oիnv;׮]W^aڵ̛7SNuV>~DDgΜ 99@[n޼8usYbbbfIYYٔp86)--ŋJuu5宿皚;ݻd~zcACp8 ، BBBaܸqv, wf„ DGGngȐ!n:F t,CBϚ5˭ 2ݶݼy>IHHpgGĉ,^ح:Jll,oIIIE:,YB[[+W$$$hXVSUxP]]Mllqn[[[ W_3sFO?nWsQ__ϔ)S bȑ}Z,*++yaĈnqtOeh˃]\\~Gmm-vrmU'V縵56V^+..fǎ:t8Ϝ92^xV+ӦM駟v[*EtIII.;PVV%%%ٳgy|{=BCC]{zAKXXׯ_wv }I=ʶmf_uHcc#v8?Ç֭[>.,,e˖os%Rl6?=AAA;wwUUU|W=}6mOvMq5>sNy~-[n2NOF͛455Ԅfc߾}?j>,8q"-ʕ+MengժU7VxINNln:,kHvڵky8~8ϟR%!!˗ĉc^؎=JSS[V+Zm6Py0Ɯ\NCZ{{6(q1&~C9NfϞ}G9 MPZ{ǜ9sjyJϱ(KQD(U:/EQu^T%v^〯LE `FQCr;}`WQ| " |v^{ш#Te:C;lxǮ$3/Zۼ|o <u)J{v ts^>nFiƌ.0 86)``k7J0!w1 8o`Wq[=[\õ)`|1h dzv#&f{ 2Ӄd p ]Զ.F]ժnv^GnmCO2Ѓ< /"rZ/Cρy>]$s{ʾLpo_>BO^/Ϡᑴ^Fnxü.RyxRCw? %g 1es{g^w(}3@]$9 ?yOٞ@/V!lE/:N&a$`DrTdzv p ^!_)@λ K_1߳S#1iXG1$^(&ӳ{  ? 4/o9?$@ggoe񷐸Zx;8ȞGsAR _;O!qj6n@G+@mo:sO$7G'F6 刳h>S(JzRC$ N}_b{<kH/YҸH,6ѿ jޟ~Rv#MJHh6nB/( ?j^!{KQWtꁢ(U:/EQu^T%EJy)RR* yE:FFñOp;mf)hjo/o;n_^{hFc(WQc}naٖ=ۯl_Y2"1ur޽ޓ06u^V:r޵+C?lɰk<&£-X3c0]mzc6k쌅ֿmSXki8vƞ51v;uJV}Wrc\8b9>Kr%q^8:FtƞMR gLXUL y5Fb_ši$lBM׷t .Eflb ТQvuqoMo1{\YR:c{\Gm(ju^[oWfW"Xoi3u^>QVu+0 ˌ4ɝfq~-G\5̪)B,{*CT-سmC*yex¦Zl+y~+ZJ؊Ru$SL:ǖߪڣ,k:k5` {h[C:Wxoh~r>zNz"(iB{ ~ckΞNQ*HGdXK9EJn0?m7u]\ԧTQzm:I٪7r޺}q}-L$7ɃW0S.;-`A`\[k u& :#yDT\t6#gj,tXՄ71:cN֌0О J`6쀱Á< ĭ5Í͵Ӟgm`%?±h8 <^2&5X lD%5A5y5y}M"plҖJY;htH3IoPV?gפT0e@ _J=h8jlIB'OЧso>xqFȏ.3׀ڕLI@4Co%trmӁ"?Ӓe7y{ovnAU&RG3[k*)moh]qPv"es^ƚ}wS}s\4˖$ZՊ.NB!\Ǵ9 888K҅Y # ,6xeS1ŶQY+u9؛+{^Zksc&R-5[fe3"ˊϔy>^?p̚Q( o|p-Cýx}5x QM< yF{KHm'OkkCHSt^\`O7p7p@|;{ Jʇ=c\թ+ es^>j3Nd4}v9=4 %#͙4o.Dje됚` lC~'#={$]385u*Ҽfo: MdAa6|JJN. 團icML^93M$#}J*sR hKs:i~ x'uVnbڑ~6|KqM%uqNOARgYeXA4#BɒJK,i?}],, <4r= |c ┞B?R;<ː>H d؉^YŐkbJ@YT%&SOԼ~qrH%yxDzvDz~ĮBz,[qT7A9 5$o!kp(M/ ^V ͭG^˦]\ٰ#?pn&J1vG ۾jJ-p, U.sM&ꀃWo@jG M|h@z̎F^ wyOΝ棽^{y_JBhK纠Uʶl&.?#1F EU_"65] ~ݯZqݾ+CׂȟU"#͇t4EK~ݯZ(((((M9:sUj(JQ|}ooݙ6|(EG;ƚ]pz[k=6_ #bJE:F׹ /9cʠEJ?њ=kFcͤR;"3{MEtS,9=r lu0: ARcbF% 5$s8h^e #uQRuU1֚\ʅ=dO:VD']xQ`XKT=I&7fqwضm:QRrܩqy1[ZcM. C{ r%SD+Hsq*Rs:"s3pdJN@&Cf helB˫GW(i&\Ǝv Bq'eH\rň2;8I(Xtz_OEKN', [e8֌ cRƼyco˖̔WѵxѺJ בx99Y!igAx irXG*RJZ2D[\ɏ)"#5$ N:刄Tq} ?呺`lbJ؅J@ kYcy(f{zN4.CSoz;,GⳈ5RaFȪ޻!M̈́Tr,[w#{wf(J99%s?7/ޕ̣tJ:%"BIĸ$uJ2vw]sދ{:nMbe K[K2Ч"?{tை< |]ϧ}$2od_s&+?$A:A0rjl ƚmRSіdOYD pDz.Dٴ8 :qp/#4 i Dk7B+o6"3o3} S#7^?CFe)ꈆc ڎZ"6: ݳ7I-8 ыYDy-p5qglΕvNA/$Stc86C^61Ū!a%"יXK&S2zHդc#]T?DTPWd?iQG[ 3cV{6 *y"d{ӣ@%?Ji~?x*:MZQQ ƃH۞ī!}푈Jg'Y9ND11+avV <G鼉{ _ **34 y/DJˀ75"/>glvWGWjK;g#ld^sZ\i q̊Tg29iY$\25$dq]M) i :YwPscw^2=`oh/~Y&w]\k^T]6^ ,v<ƪDy޺]m.5(Q|u^n(Rc;;y93X;x(>bi*CHG=0X6h[c/+TSSNy0O\U`QlU\Rb|mySٓ(5A0Vk^e"t묙:AQb̃Q5M|7WsW,ͤNu0tikNk>;A(~I]t" vG$bYyT`3)*fJ(JqzD'ἒE~ 9\`es6R#׏[S=8 ?^yYy*JѨayh&V<1!NLzպ yBaT`QvVXPU#귳*+fRG5_XE7,EӑIyT`3)OZE -_ntjȅN]tW~@fUK3fRvʪ*J ~tNꢙWKXN6kbkR4j_=jES'/\'`eX)3բZGΪ1vgkMU'e ?{ jAբGD$ ݧ/!*?'xTPVAbK#>Q"YG&0{47W6t5Ih`B~zWDMx4_@dx2IZk^R4rl^[fx3}+S^9/Kv<ᕿ{m{fVBѽ7+:?~yaU'$u "W3饢s!y`M9u/g6ijޓ\VJNT< 8w7$<+E^ YE7˽f)7!=`O`5Xqu^nl=i&NÍ+co- ɞj0H2DZbc%+Tt)Y(SCJzK?mAv 5ʏGb125"y e່|!ט)o#yDOkYʽqj oyv_V"f5VpLуT±;0g~gdVyD:v1ּ`UˣT#8(\NFd0pR1~S n6j}366lkN^2۠JQo m @nx5uK-}]Mr7!5oxb-S;+5R L05*u>0SM*`׃eQ|˚>=az/u܆)*ZL?Jx&ױJr'ǁƚQڣ(ef Z k^ cOa^AHXx榖 WM}Ū((Rhu78TZ O }꼂Ce%.)Ae~ki.a5KK✇8kbFIȰh )GQ㼢~Sc|(i{o}sTvݧy"o#Mz" # 2}""9~8RtIf#ߺ4yKҲ("ŕph8?ϡ\?rzxtDds4]O,D,od.fzeԜy,bd~\DdR|+x)E7[-ɤ 1թ}. Ys?jt|=yUÐt/@ehh8,2L)q^b|D2}?nM9ٝE9QN6l,}B#k=̭"c^>k쟝m̞j؆{| HLQjƚl_>\It#ty@I`o3LЃ8BǓ"{Lt.Rcc= x|Qݘ5vq_&dī?AjXw B tB3!|tR=Y@M@7i>ez#5'\tJP20UH^ GWd IX܂Yuq\JC58l21YiP :n7t\} {%Ud*rM׍4s`u3Ӷ!AF_pa h&=鎾6Jb\b)+1ųn8TIQEQEQEQEQEQh(p{K[:CfڧA.̰q;GR""f=:>hKgyV(#)bކL U cM':7h;:;/ x*Qk(G\8[W5 Yʘ(T^[dBlB$1l[)0āE =5"{8"ݬHӃ&zb XUL: ^ \m?H.@;nDvdD^.oLjQ;禤<H[wW#jkg=98cP8yYgr/R zknO3:,r*[( fk) uv7]]`US_h3 ##RNw wXR,z{'o%I12*[Ȃ,eT fb&RF*J~-1X{dSL9YjZ6*VZY]q.nMA%'*y8jBUPuK@;.(B`*(((((t:h;E:qՒ$"RI,^m<--P23g[ƚmxjB)/AK']~2〯x ׊qaU&YjКXJ7h@m2q,Cbz,ϝU$N(@hm"\cc&&jCK?$_eaMZQ o|-PXFXkJP×VzB[(tr:Kkd31t%3#2It%D0?qv"Ɏ35ܙ#Ǔ k>'&_Yy "vx&pd͍-MqXT93;#^|u`VH}G<4>r,trto&ͧ{yOy.uBr:5LAjn#dSZ *JE1KNlU6_-sʖ7G[RZHl*YFYs9&}Le1T8 iGtf MEY y@'(C%PeH-cAj #c~Ov)BeCb#IL+/ K."Y,\GV(J\"Dt%@b)wc{f#tkt{wNeA22fc\2J+I:ܶU^%Ce3ە$\n[*(Ty7ol]Wup2 PEGZ3 7vD 7n~UKYd#͏F:=h;:=8(\}e(J 6BH+d`ڥu[UbHv qk55`O5ԩI,2cPj UyS6`Dpg`Rt޾ EQjȏ`8,} ;zi"@T"&?ARAVD)tęeb{Dk62؜X;۳0d.(5N%)&7 s^ǒ)0@JDZQJK!?D;WD RkFjCtߛ>G 03K u^R튨ãH[QJBUa]u4#?[p±_mGPIH3W 2$6v;UYON %wn6Zc'kShK%6_1(|"'X `d[H`g`7x%N~bG!_FG{Mp92b1Xxh2@*D1_c4rUD& 'gS{U/ %wzoi؏{%NB5ݫ\bGE5`AۢN5/k6gOT:Bumk@(VcMĂcu*k^e@ҊαA٠7Zm;6mnkKk~UGNȸNw) qؽ-ұwж(Տfk͊P#[r t^~ k1sDv(O[cwyж(C3Vjy/((((((((P&7cS]c {;fFKT^pGж(b cZ %j{X3ךYسckvg#i-JaB uϑ>R sX=%hCd.<:SAFΫu68uӘ`[sNжe{Hc|mQ #o5fy/m kξf'v ڞhZs+JS3?ps g[뀭 =mR\f;[kp j+ldzky7AۣT.!cƾdж(SƎɞ{06E\cMl͞ZT =Cuߚ˪5eeau-3Voh*ʠc\Gk犢((((((JD#E: EQ#c{ƚ-m:x(yE:ΊcmLk-qp(yW-_  r^޼i>R2 n=K5tMJyy]F:f(yYkާ&fggm~N~wEñ/mR>+Z^ s^ cmL9;7GñI)k? r^ƚM@A\1 zqcn-1uܻE&f;8.c|Ia~ǬpPøvm,"h[(E)ܻm5]fD[:4Jq> :h[{Fb{y7.|l6fi 8Npί ?m9ŚcO7N ܏5-X}6*PFW,:ÝpObV]FLQb16c-1vZDQj y-?.Ě{/ ]RK*m  i͙N6*JΫ2cPؓ 8L9vT W)AQ,:pl6"gk>3 yO||p[v:ءX3`%UcM/QmQ:ŎJq313mQJG12o0Quk5E:.{?m5mRZ v^ƞhgƚذh8٠m& C_rۺ!f' };n |9 Ʋ_lOͱ`eC)E-:Gt_dTUDv. 1`'O/Z^_!6U v#Wd(6ۀCU lEp``)w^ڹ@ y3+ԎfYGM-|EQJÏ[S=E@'8uop5RI};2 &o6D4{(u/mi[C(5OQ22x&e_$lҔ| |i  \ԂÀ+ŽL妒OڜHoƚtRTz%\I"5!NjҬ!MQ r߀1EؑTI]kYaZ:D $N4SH1%i~#R+Ԏlcce7 焦 =v v#]x^c7!5zosEڑN!o, >~+hKgp{Aۡ(٘NZ/]bŝWTHbƚΏF1 ǎ 7֬7pȪdV١@4w2(*0} I**]vhKm]#_ ǚq MXXSڀ̃R( gMRcm؏?hQլn͗m 7gM$~6vk^J,^>w\5[.خh8vrvec:g7̴Aۣk5v(p3Ӷ-^fhKg-3-MƜLqd2D)yY&2\bZ.|A;1#JkK쌼-J GñMAۡŚhK牋2Yp}Oe) RG_/s(=0`e1f(J`8vWz /ӛ=u:'Kw:.c(T0* TKS:~IJy8IJF&3+ykiL:g$2߃BPU>y?E!j?D;WK P5#5aS37}`"aL`s8/ڔs!=PţW!j'"MƍޱbRلogk2r8o exot]<gX)j,C*4?Kߊ?  6y(ʐƗ׍+) #yp7y 8tiĊ!ːA@[k,HǁHSQdEiFjy={2ZJ\ i|j lb=ua"LDefv4yb4` }1 HqNGz4p^.z֟y#sf!5ɿ" qI4õH>lIŢʊoSث۶ 4I*E/;Z]t"2l*R q^S}{gkTğZ{7WiCBE:nAf!:2_ޚ1v )*(Zjv@w =q\3F_'sH1:&s~('wK~ 1صp/S*e$q^SX`!ODMB㞉2(8nC,! 5'$88Ů뒶ӕNPvzdI :ΫZY-Z͞R)#:H0A#hȑnC,q{!qIenoE&̟ ,@4RQHqn^Ϋlo7sW}d42)Ԝ^B:#z"kTxǶ"7E_2RA2dHʋYk4槑ZڵCȔyHGR󊇞'm(L H`3қG_ i3|$ [yTHQa>tl$|c`Qb^<4"Чq$+4Qþb^{7s!SuI5jjk2Si8JlBzI?f[f,̇lDTm9{)HiIe*dX/2~&:#BQdd ǐy_+0 䣋TӅJ G`+xp\izi݇ĢfWwn^B[N㝿w<[!!n~R"AeHvsךA،t/)\F&exI HP=Ge8C3q$CS~R:iMV@꼆8/!u^yu^eb^7##oo=ޱRH'(i{2! +MAsKeJLJ~UOmRjg'SnlMDjI24؅8 s([;靖R:J㼬 4'#$Un;KUHLO~̘6l`nِA0m eh2q9B.g:Xk;!sɡLRo\+ɺPlāՁ8KIXsGg 2z&"JW r3 *{!ʩ 2 7 鿼`D4/DVYH; \ĆNw^RFMccZXXn*ּalb$ӀE9RQ =;>Ѫ QvpZXXiVd=$mH.̗zy')m2iҢ^\յێ?2jRvJ[ `ɚ8w~'BI l}v-%t7"'de;I_I[451h%Ys`L{2d(%?5c6c- iob;Pr&鹈YW'm46^ kܮ+J>uֲGJ-4s4qY^,H0"y 9٘,#,5 9%8%Ȗbhl< -pGHtSbBy#W*RS ,TՉ8l D]w5$iO>7AȖ"hj;Z-љ-m])m@z``sd#Y&&xeI`:"vc3흁CӔ)m46.^cxSӢ/md'f+]eVWuMRnmrqܟ~L-_]_>`Oka]L6)J1H_]cugùcT`:.e(pp]9 ]2vذa7c]Aۤ(A{荭+ ڔJeܸK}1vNWemMΫke˟sNжT"rָ÷=4B+MR c\k5owASILr== Np]so^B6)J: uAR)45]4>;nx9hu36[;"h[*IΝ`m|:tk^ &E4TU˜8!`1vNWוmT"QR :q0ljKQң ֬rM6)J%Ϋysqzza- &Et0';n9aÒAۤ(Հ:ij:kCˁm[7.hZX{ӬmGhl#:]YomTe(A7'+6:N舮%IQy9{9pp쐠m/q8N]]RX5cr֚m_Lrcy5kg6)JR MuAR,'_g<k᯿~ݻAۤ(LE;G{]VTvc[6K6mT;3ohYyjжBc}m7WnuzMR T:c-ږ|4i@;{z;Wo &E*wDz/> ڎ|8n;vÆ%IQj#U2'/uyxژ-vuEml6.lq]q)JP#5&weJ DA%Қ*BH$hmQZ %YEm4bFilH0eEY \jAE蜾.Fyw.3s/s8?ኢT*'\B؏2WXΙ!%|^SOD9(;גv<= sؑWaĽ/?rgZ''u[Zgǿb8dx!u{&+ ^^?ml?3ُ>*q.TV133x{#Pk.%rȑ^~KE}tktY?:p{g\BL?y[vTʟTW_55-m* y^OG]!X^WPTҶKv cE)Nbngvb$\i:nn?Uo_h, ث]B([F^ݺ$7'w_g7 [?9?jb2lU"770JEEG6qF!&%pH^B$%pH^B$%pHv̍7hnnFRٸq#j/_re;o]3gM{/Bch`0p5t:ϧ( & .LIǏ=KKKh4b4#==)CBLF^N"00\TчlBrr2UUULYlLLL 6m._r"gBL]F^FjҬINNueeel۶8QWo***HJJ"::[RRR 999Ϯ]$//zJJJ8zr^~ŋsjwtt޽{eΝTTT7: 111$''sΝIg!f3ZZZb…㶭[~, Kjj*ϡCXf MMMdee ϢEؽ{7Aj25(**Bc2&\[ՒŽ;8y$>$77NGvv6 ־8x DGGSSSÇ9<~~~3QKxL&4̈́5 8;;ヿ?CCCpٙ!\]]1dffJgYvo/pY a6ծDղyfVXA\\7o$==}L_UUU,[8d[O]Kׇ(c.%,, Zuۛ}]\\hiiܹs<}O>z9f7顳۷[f"##}h7󣷷wR!le իWBBB<$(.^Hff&...8;;MAAYYYddd|ryV]l``Ϟ=ى^gÆ +11Thmme^ږ*fRiooGV0&&<==Yt)twwrsppǏȼylo={Ɠ'OX`WOO]]]t:|}}m[LbV{x%%(y1[$IK$IK$IK$IKlzn]!O؋Y͖օB!B!B!}iIENDB`Chart-2.4.6/doc/html/ftv2link.png0000644000175000017500000000054612033071320016070 0ustar reinerreinerPNG  IHDR_Tq-0PLTE~tRNS@ftEXtSoftwaregif2png 2.4.2^G&tEXtCommentUlead GIF SmartSaver Ver 2.0 JIDATx} 0Eo3c~SW~nZ:d5d/y!Pf}Qp@ϭtb a;j;hQ$Kh^~m((8LF-Y8\+qygyTi/q+xIENDB`Chart-2.4.6/doc/html/classChart_1_1Split__inherit__graph.png0000644000175000017500000000602011666706743023317 0ustar reinerreinerPNG  IHDRe{mN$bKGD IDATx{PT?wYyC, Z5!2I4R|mR 5$quL')j:mhQHkw,rǹ,,, K.p9<9޽D"H$I2P>%m0u 2><0]_o{!))O/o 2q`'rh,`' Đ1FZDź9N~:oj%ڴ@Ktu Gt~B4YĄXohz!tW;J#Dt'ˀc $bAXmNwFPp1_؀k"eb 1<|?}Ҏ*oK%vcZygD܃AUۿDLG\wHqGwDi#C@ёi@x7}־?E3v{Ew؜"))))yhD~Ǿ`m<=/5/tZ,C54|u}/.R#XGTTn1꭪x}.<sʛ~8_XPVz(QU( *^P̪LXh8#Ӣ< 80AQZ[n7* ADԨ?+Eij"E(̈^Gn}g|VA~5@Qqlz'YQog*Lʃ&eNz>+ &WGzᓢDG e*-o4CQPԌ^tK7|R/A~MM 'EQ?d+ѝהQQOFÎŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ ŀHQ| ڗls?tD?UxիilxNELv'Or Z2x \|̞=SVVƬYzO]#l>SV+lٲ+V*vg~.߼y3k֬!$$$ڵkkضmﲲntb)((@Q/gdd0w\***9;[!ɓwmQݻYv-b+Ǵ4, ,_vV+~*EJMM ,Z)@xx8;ʘ9s&Wdʔ) ڵ Z9tiiideeQ[[Kaa!gΜ`׮]Yiu466b\|5k='~̙3[3}t222س> w^z[\tcIsMMM\xYp!ӦM#11"V\ĉpp88{,#)) C:ݿOʕ+IIIa„ <DEEaZ1,۷t˕+WX|9C%>>nCCO //gϺb Ogggc2fl6f36l !A dfOCC999DDD( LRRR\lM1e*++ٻw/k׮%!!e˖9;bh"L&F"==xb=Э7ߠp9=z4~~~9˚f.]ĦMy&!!!a^ ޢ*2fƌ۷).._gNLttK97mNIJJIp)7GPQQ-[3g;v`ƍX,gy[,H,X[޽{.ujkk (;p g~ee%'N 55555 6d8wv/__|6۷9p\UU>L||sحձ~ƎKo8;;Ƽy>|8[ntRFɝ;w:>j=z[W^%11t}˗l 48XYYɶmذaϟߟvæܿnj*wnm ,,9zC``p1x1n87͝L& ;Eq ]?:C> "&&z(R|dқH1 R"E1 R"E1 R"E1 ާ~6$чcǎy,i`H\NH$D"H0EjOIENDB`Chart-2.4.6/doc/html/closed.png0000644000175000017500000000017612033071320015601 0ustar reinerreinerPNG  IHDR EIDATxA @! Pi/`Є.?,!u zlޖJh1ߘ+vRLx@ (*79H l)IENDB`Chart-2.4.6/doc/html/classChart_1_1Constants.html0000644000175000017500000000535712033071320021142 0ustar reinerreiner Chart::Constants Class Reference

Chart::Constants Class Reference

Constants class defines all necessary constants for Class Chart. More...


Detailed Description

Constants class defines all necessary constants for Class Chart.

Defined are
PI = 3.141...

Usage:

use Chart::Constants;
my $pi = Chart::Constants::PI;

The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/Direction_8pm.html0000644000175000017500000000646112033071320017217 0ustar reinerreiner Chart/Direction.pm File Reference

Chart/Direction.pm File Reference

Implementation of Chart::Direction. More...

Classes

class  Chart::Direction
 Direction class derived class for Chart to implement direction charts. More...
class  Chart::Direction
 Direction class derived class for Chart to implement direction charts. More...

Detailed Description

Implementation of Chart::Direction.

written by

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1Lines__coll__graph.md50000644000175000017500000000004011701115622022436 0ustar reinerreinerb0e6ad8458bb1c324b968aa356c868edChart-2.4.6/doc/html/graph_legend.html0000644000175000017500000001104112033071320017120 0ustar reinerreiner Graph Legend

Graph Legend

This page explains how to interpret the graphs that are generated by doxygen.

Consider the following example:

/*! Invisible class because of truncation */
class Invisible { };

/*! Truncated class, inheritance relation is hidden */
class Truncated : public Invisible { };

/* Class not documented with doxygen comments */
class Undocumented { };

/*! Class that is inherited using public inheritance */
class PublicBase : public Truncated { };

/*! A template class */
template<class T> class Templ { };

/*! Class that is inherited using protected inheritance */
class ProtectedBase { };

/*! Class that is inherited using private inheritance */
class PrivateBase { };

/*! Class that is used by the Inherited class */
class Used { };

/*! Super class that inherits a number of other classes */
class Inherited : public PublicBase,
                  protected ProtectedBase,
                  private PrivateBase,
                  public Undocumented,
                  public Templ<int>
{
  private:
    Used *m_usedClass;
};

This will result in the following graph:

graph_legend.png

The boxes in the above graph have the following meaning:

  • A filled gray box represents the struct or class for which the graph is generated.
  • A box with a black border denotes a documented struct or class.
  • A box with a grey border denotes an undocumented struct or class.
  • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.

The arrows have the following meaning:

  • A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • A dark green arrow is used for protected inheritance.
  • A dark red arrow is used for private inheritance.
  • A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
Chart-2.4.6/doc/html/ftv2mlastnode.png0000644000175000017500000000024012033071320017110 0ustar reinerreinerPNG  IHDRy PLTE<^,tRNS@ftEXtSoftwaregif2png 2.4.2^G#IDATxc`   ` ɨPamiIENDB`Chart-2.4.6/doc/html/classChart_1_1Bars__inherit__graph.png0000644000175000017500000000544311666706742023122 0ustar reinerreinerPNG  IHDRe{mN$bKGD IDATxP?{AS@ᇿ⏨dfL$ŚTc:h`"2LSQL:&6S LqFxHQR:Vxggfx{r BP(E@W~{{ vgxOR>x@(IY(zFI%EB QR$WDlpd?61^'% )# jm` of9^.BOp8c2 h1%;|34xLG Ӎ@#^| Fc;|<(bsB6c;.7:'? F@v0PXoc_s{S̘wl4*h<0 puW;6ǽbx,!?b,0㋴ KjQ#px]3fH#6|8Z6O;UBz6CE!?;'6D"L'kbYp}bHsDQWA#}gD? czop}w^ۍw 'vXx1c$/4!:P@ݕ1F|/ψ";9(GCmNoNÁaP]nJncF}ON#$~öO#zw)荔VE&}aG. 9?##I4֋"ElNQ"!J()H"!J()HIH}`_07.ݿoY@K˽#"Fnj@!n.鄯r8"bаAv=yJϭBGÐ#>>g DC0lvÂS~!/SuܚR4L]7Qh6]'zZOfBZʄ #54踸%V i).5Mq5 BZC&f64 .j3!+e̓5M# Y9]fB{<fcZOٳgIIIiڗ/_ΪU(++cڴ<7Νcٲ<ʯ:%%%l޼ٴ”t:)//_nK^^vmLFFiiiKKKd…<;v z8uK.e͚5SPP 8vvj]Ett46[OP"Yx18 Sz`ذaΝ;x<._Lqq1uuu[%KDaa!oTUUCZZn/Iaa!]M61uTFMxxx[L2@yy9ׯ_Gux"\pIGll,;w暱+\.ବ,V+ ;l6cD Class Members - Variables
 

- _ -

- f -

- n -

- o -

- s -

Chart-2.4.6/doc/html/classChart_1_1Mountain.html0000644000175000017500000001455112033071320020754 0ustar reinerreiner Chart::Mountain Class Reference

Chart::Mountain Class Reference

Mountain class derived class for Chart to implement mountain type of plots. More...

Inheritance diagram for Chart::Mountain:
Collaboration diagram for Chart::Mountain:

List of all members.

Private Functions



private _draw_data
 draw the data
private array _find_y_range ()
 Find minimum and maximum value of y data sets.

Detailed Description

Mountain class derived class for Chart to implement mountain type of plots.

Some Mountain chart details:

The effective y data value for a given x point and dataset is the sum of the actual y data values of that dataset and all datasets "below" it (i.e., with higher dataset indexes).

If the y data value in any dataset is undef or negative for a given x, then all datasets are treated as missing for that x.

The y minimum is always forced to zero.

To avoid a dataset area "cutting into" the area of the dataset below it, the y pixel for each dataset point will never be below the y pixel for the same point in the dataset below the dataset.


Member Function Documentation

private array Chart::Mountain::_find_y_range (  ) 

Find minimum and maximum value of y data sets.

Returns:
( min, max, flag_all_integers )

Reimplemented from Chart::Base.


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1Pareto__coll__graph.map0000644000175000017500000000030011701115623022706 0ustar reinerreiner Chart-2.4.6/doc/html/ftv2folderopen.png0000644000175000017500000000040512033071320017262 0ustar reinerreinerPNG  IHDR_Tq-PLTE2tRNS@ftEXtSoftwaregif2png 2.4.2^G|IDATxڅA0E_-S׍: !o j<*aCipʻ&FL}FTFN*Ε=d squ C )GDIENDB`Chart-2.4.6/doc/html/classChart_1_1Points__inherit__graph.md50000644000175000017500000000004011670177756023376 0ustar reinerreiner4f0b99f494951d1a30dff60845d06bd0Chart-2.4.6/doc/html/classChart_1_1HorizontalBars__coll__graph.md50000644000175000017500000000004011701115622024325 0ustar reinerreinercc096331aaa7898bba231a7a3b8e3408Chart-2.4.6/doc/html/tab_a.png0000644000175000017500000000021412033071320015367 0ustar reinerreinerPNG  IHDR$[SIDATx흻 @wɡ*MIFL :nN N&_ ɭɾ}ն8~Owv-A4Y)}IENDB`Chart-2.4.6/doc/html/classChart_1_1LinesPoints.html0000644000175000017500000001126112033071320021424 0ustar reinerreiner Chart::LinesPoints Class Reference

Chart::LinesPoints Class Reference

LinesPoints class connect the given x-/y-values by straight lines and the x-/y-values are plotted by points. More...

Inheritance diagram for Chart::LinesPoints:
Collaboration diagram for Chart::LinesPoints:

List of all members.

Private Functions



private _draw_data
 draw the data

Detailed Description

LinesPoints class connect the given x-/y-values by straight lines and the x-/y-values are plotted by points.

This class provides all functions which are specific to lines


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1ErrorBars__inherit__graph.map0000644000175000017500000000027411666706743024123 0ustar reinerreiner Chart-2.4.6/doc/html/Split_8pm.html0000644000175000017500000000536212033071320016371 0ustar reinerreiner Chart/Split.pm File Reference

Chart/Split.pm File Reference

Implementation of Chart::Split. More...

Classes

class  Chart::Split
 Split class derived from class Base. More...

Detailed Description

Implementation of Chart::Split.

written and maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1BrushStyles__coll__graph.md50000644000175000017500000000004011701115622023653 0ustar reinerreiner01b96cdb895fcc67afd66e91e91c9abeChart-2.4.6/doc/html/Constants_8pm.html0000644000175000017500000000502212033071320017243 0ustar reinerreiner Chart/Constants.pm File Reference

Chart/Constants.pm File Reference

Constants used in Chart:
PI. More...

Classes

class  Chart::Constants
 Constants class defines all necessary constants for Class Chart. More...

Detailed Description

Constants used in Chart:
PI.

written and maintained by

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/nav_f.png0000644000175000017500000000023712033071320015417 0ustar reinerreinerPNG  IHDR8fIDATxIB1 Q;uۿ@h; a !ЋVC |c3sFFPS{PSsVlNF.F.2_UH mIENDB`Chart-2.4.6/doc/html/classChart_1_1Mountain-members.html0000644000175000017500000004106412033071320022403 0ustar reinerreiner Member List

Chart::Mountain Member List

This is the complete list of members for Chart::Mountain, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Mountain
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Mountain
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Composite.html0000644000175000017500000006741312033071320021131 0ustar reinerreiner Chart::Composite Class Reference

Chart::Composite Class Reference

Composite class derived from class Base. More...

Inheritance diagram for Chart::Composite:
Collaboration diagram for Chart::Composite:

List of all members.

Private Functions



private int _check_data
 Overwrite _check_data of Chart::Base and check the internal data to be displayed.
private _split_data
 split data to the composited classes
private _draw_data
 finally get around to plotting the data for composite chart
private _legend_example_height_values
 init the legend_example_height_values
private int _draw_legend ()
 let the user know what all the pretty colors mean
private int _draw_top_legend ()
 put the legend on the top of the data plot
private int _draw_right_legend ()
 put the legend on the right of the chart
private int _draw_left_legend ()
 draw the legend at the left of the data plot
private int _draw_bottom_legend ()
 put the legend on the bottom of the chart
private int _draw_none_legend ()
 no legend to draw.
private int _draw_ticks ()
 draw the ticks and tick labels
private int _draw_x_ticks ()
 draw the x-ticks and their labels
private int _draw_y_ticks ()
 draw the y-ticks and their labels
private _sub_update ()
 update all the necessary information in the sub-objects
private _boundary_update ()
 copy the current gd_obj boundaries from one object to another
private int _draw_y_grid_lines ()
 draw grid_lines for y
private int _draw_y2_grid_lines ()
 draw grid_lines for y

Public Object Methods



int set (hash opts)
 Set all options.

Public Functions



 imagemap_dump ()
 Overwrite function imagemap_dump of base class.

Protected Functions



protected retval __print_array ()

Detailed Description

Composite class derived from class Base.


This class provides all functions which are specific to composite charts


Member Function Documentation

private Chart::Composite::_boundary_update (  ) 

copy the current gd_obj boundaries from one object to another

Only for Chart::Composite

private int Chart::Composite::_draw_bottom_legend (  ) 

put the legend on the bottom of the chart

Overwrite the base class _draw_bottom_legend

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_left_legend (  ) 

draw the legend at the left of the data plot

Overwrite the base class _draw_left_legend

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_legend (  ) 

let the user know what all the pretty colors mean

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_none_legend (  ) 

no legend to draw.

. just update the color tables for subs

This routine overwrites this function of the Base class

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_right_legend (  ) 

put the legend on the right of the chart

Overwrite the base class _draw_right_legend

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_ticks (  ) 

draw the ticks and tick labels

Overwrites function _draw_ticks() of base class

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_top_legend (  ) 

put the legend on the top of the data plot

Overwrite the base class _draw_top_legend

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_x_ticks (  ) 

draw the x-ticks and their labels

Overwrites function _draw_x_ticks() of base class

Returns:
status

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_y2_grid_lines (  ) 

draw grid_lines for y

Overwrites this function of Base

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_y_grid_lines (  ) 

draw grid_lines for y

Overwrites this function of Base

Reimplemented from Chart::Base.

private int Chart::Composite::_draw_y_ticks (  ) 

draw the y-ticks and their labels

Overwrites function _draw_y_ticks() of base class

Returns:
status

Reimplemented from Chart::Base.

private Chart::Composite::_sub_update (  ) 

update all the necessary information in the sub-objects

Only for Chart::Composite

Chart::Composite::imagemap_dump (  ) 

Overwrite function imagemap_dump of base class.

Get the information to turn the chart into an imagemap had to override it to reassemble the @data array correctly

Returns:
Reference to an array of the image

Reimplemented from Chart::Base.

int Chart::Composite::set ( hash  opts  ) 

Set all options.

Parameters:
[in] %opts Hash of options to the Chart
Returns:
ok or croak

Overwrite the set function of class Base to pass options to the sub-objects later

Reimplemented from Chart::Base.


Member Data Documentation

Overwrite _check_data of Chart::Base and check the internal data to be displayed.

Make sure the data isn't really weird and collect some basic info about it

Returns:
status of check

Reimplemented from Chart::Base.

init the legend_example_height_values

split data to the composited classes

create sub-objects for each type, store the appropriate data sets in each one, and stick the correct values into them (ie. 'gd_obj');


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1ErrorBars__inherit__graph.png0000644000175000017500000000617111666706743024134 0ustar reinerreinerPNG  IHDR}{Yُ8bKGD .IDATx{PT?XD4|]ԨZTpfLtԉbI!bf4FL2Sӎ5Z#j3>[*I1T#UDm:R5݀n8]eW6xgfgs9޽BP( B!/vOgL 4aRgǶIG#AhDѹPK]BD޽% H"?OG@7`S> B2=8, 6G O~ F`cEMpG74p~~ 0e`|p&|"&x_ NJ`g`N:=M|6[b2Om`b.!Sm!5b6tqb  O!#0!Ao9 /W؊82_D5)@^;p_7=~?8MKb!aCynOJ:5!N:>aPDv濫-TK4lv+xC!M 13D5ԭF[y(x{5_~nQD8l$! ! :=Cp#N/CjPjnBnmiqD1'vh<.B;,Ă5PG'F̽-#u!mZo4bG(Cu;'jўK.Py1_[ezyk">C "C}Ѻ GrW #N5i'q%_2GB́ǻlLFvFK>fQ[zpv}"DWxGF.!Jt QK]BD%H+z\NՏc~kk t,^QG_-4t`tppCۮchmWyʨ: A8Hbbb~O ҉S_bSivt҉i!IM`32 m$!艉Y Rn=zV X)D4~i JHx-횊NIll]ԥt3Jt QK]BD%(%D.!Jt QK]BD%(%D.!Jt QK]BD%(%D.!Jt QK]BD%(%D.!Jt QK/r >}۷GB4M#""w_sf2228v111ٓ<֭[njk.;Cee|A6pi̙>)))-?>#Fpob͚5C[fb^yQQQ^ǶO>瓚Jnn.v[XXHzz:<8pjV^MAAgfɒ%TWWùs8p[lqpٳglٳg`ƌ,Z'Od2ѳgO Wx_D^^iii̘1+Wb6=[kՋ>}4+2e ofqE󩪪"333gb47d񔕕Mjj*uuuFnn.}eҥZaÆЯ_?tj6mf>찰0-[FVVɜ>}~>]6k׮a1L j;v۷͛ٻw/+WE2GѭV+ួ,##0`,'N`֬Y(++q|jkk1L׫6(uuua=:m|vTUU1j(t55 sN***ѣco􀶇s:hjf'$$PUUb|K,q ٺu+&L˗1cX`Ӕ^|Ӈ F}}=gΜiVOIII… ٻw/;v 44Qz"=\}4Ûݣ[ng4>ūv-[ÇÇ[+>Μ9sxw~c{qq1Njsl6߿?#G$((cZ=%m>ţnjW_}Ls9Gnqol62p@"""&88$RRRuGqϗlX,/^̀ƍ >۷oIسg+V`0Bll,>GEE{Ő!C(((… ; r۶mN  [bb"#33$.]Ĵi7n\+k:fСlܸp222W_}͘=3ׯ!j^JPPxgZ)++#**AQUUEee%Frʕ+FwU|p _NLL >M(++Ç$&&: Chart::Pareto Class Reference

Chart::Pareto Class Reference

Pareto class derived class for Chart to implement. More...

Inheritance diagram for Chart::Pareto:
Collaboration diagram for Chart::Pareto:

List of all members.

Private Functions



private _find_y_scale
 calculate the range with the sum dataset1.
private _sort_data
 sort the data
private _draw_legend
 let them know what all the pretty colors mean
private _draw_data
 finally get around to plotting the data

Detailed Description

Pareto class derived class for Chart to implement.


Member Data Documentation

calculate the range with the sum dataset1.

all datas has to be positiv


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1Base__coll__graph.png0000644000175000017500000003314111701115623022346 0ustar reinerreinerPNG  IHDR H$#bKGD IDATxy|TwEe33Hk[?{E-bzUŽ^PU[D^h{mU J&aqC!IfK̙|IۡZZ`n1O;|x1d!^ *cLA|`EߖhرOg!^?MP c. &x݆\JH)-@J)hRJyF R3.@}[NUnoˁXnwxrU~ ydH1SJ17 ׁ?ۀH@@p3rF`psSrr 0x(U{l^ vSō70:!Ebp)Bˑb%D7!ܓ_8^L'ӖˁT~;('sN;|xHdҙ734 Wܡi Ez"@z=7]h~ CvE Hs#y|:羳oy_&oT~s_wXvG]2>Vŭψx8;XyHδz l%~o89Et/ ρ;{oM%M7ºbV?7$_^e}PUvYPk˴>-@*'lT@za4T2^,<PT07kE+s#M.݅I6Hc}co-e ^?t5v*ִ}Ƶ5MHyn9%`g@)p7zѶB4k\4L0P5C2RawD{\n|y2%YNXpRc?tP7_yo/k*"k̦ P*!ƚh}c?51M U~u; QFߦv5eooSr&tUzplgc}Ju1v@NnK!J2֜ XVa+@IIӁ^7ek0[.3KSCw9m*Peu)a3|yݖB4``LK)m`4Yzᛙ^R.j@72(+]lNecMJԚ6ºR)RJ)RJ"3(8<{rBO|:2~NU{WO@"?И`/?uyA5?GL; [ ޳PHQSלnF{g?dqp(p Q'c'"Z8cOLl">'p!#G?v ; R`- oBYǁӑqP uyQӒ7Rqg8?ǐ*sʸ*C[g\JOVY` ,t$.$DD=ͻ 0 lyzdRO`.3O$0 )6G88ə> I_HžA!2ͫ_ yUHOd$M P_, Ep?r9#b_C,7)+G![{ݖBVpּ# dS'/uu.v?g4WOA>FCr"Re! 4; !S2ŇȦ^*?7#YUƮS\u7U!#=_FM܉MNje4_ ;tQͶv1l3qN9Ou{J 7"Q[i/sی\(Z5͛_#A^W#)b up>;::urL%Q.{`IJYJp;t٧!=͇OhݭWD9H!~: ( вD~<SJTcY 9E=wt'/HVMHli&cYKɚ:[XVRJe,gAnR*t+klrNRJjyڅ(sXQs7Lc˖eȉp+iR%@pYȀ>k=ڣ*"*@acNzX +)7H;*=eG{%eRP2p e Wd";u;:b'u0pmmQ*e*@֚#bw(pI=8G/w LPznuMO. u19\CEt I}u( s_r`~:Fq_tj"m?dѭV E5@e0H=P&k{UF!,$ ~: @ I' |)R!Wك$v'up4r,A>ǁ}d9%iw]n9ͣ!AHېblq~)fUĠ?dՇzݖBf!X{kuīnwnDND2HAwNjNMU#Vc}۳IHas7Hs "R u_ zn_t۴|ef͏h:ˑ˚i]LX_!HE_"rl03jN\ Q5?m6uZvE6bM \ٔN0{ g}>rZ$Rq7sCvBpnD߀Ĭ~9txf^G$H 7sn9Rk/AsdED69ڦVE}ZlbMs߀gy_Cs8;QtM]~ -#V^2[A_FUcC#cR\R TG W"Ò,#Qtj)ph8:bMɢ[te{TƵǜ9cgN u[ Q{ޒ5Fc}ᾤwJC xW-FۣT.u U ˑJ4#'}'"Z3-@X-QAfۍC݁L7SMtTqPrN:ؖ<#LDI_,**j~yݎBcXTƖ`-@Ix)Ol'Py](LH?}0Qcƶ[t6Xm׷n*^#U@'$$(f"}0QcؔD*F๨eH$GE8|x'!Et-s,3zj^Lɘ!3?2>)rU RW)!ʉ l )+'~bieB%:Ҙ*iJ.YR`֫qJyȇk )&ќ"@6vdz@аH `d)j`&6HDqRޚ]x슚ϙ#, L[|(=HE3hY"[ KsHw-O3)7Q 庴j e4gǐ}=ژ>VGUNTD1~l=dǪ*7W7Sb!EG62Hdky\_[8d8;)Q3ckdq[X_ω0NݻӛXVL؍\}#z51_sz5=.ܪ-@= =ZC;#H6s{ -k5`RGXXZ dsc2Ԧdl?[Ҵ(G\&B!!S(5WX!{7zݖBzti6^d[nCzF8?E)tFf[zXcf%٣Ѧ*g6[B>kѦ*) 7=ӢVRTC%1v:=L6莱zRJ)R%>dU d@XvZҧ*nxq]CgAOZTR> E-Tv]裃7F>1Zؒ^n@R(7#ȿuހ$D$|F6{o#@ }.XdQ=>#2w ۿ*8r;Mu\UР?d'u:*մ*P=7?^?Gt@nunߌ@(gg!ir%y*}йې"f6"g}g u(-n.qLQꄼF8">B#Y \Z1Qw%zfuwEyYLɘiH^n]nHgAl>KA3IXN-veHṚ݇mPzSyvF=^$|P!$!n7 x3*$~%ZH dM%$a3mp'y7P{Fҹ?:>jޮțr֑ܵm7z6&j"=r\m½Rkr'-6w0Y_lg?Zl"j^׍HZO)KRtAz/yfoIXjr5K"#}MɼEh4rəv p3 2Rdn{$N= _iya ]r,':5Ls$hZF.Fo"3qH$ ;Й*)@s$k_ 5GZhooR|\fSXuEv < @ȾQ;܅H/eU}*@SS#nE}lAvBG~ԉ H SѰQ%z{?i-* IDAT5ی5 ,4HyHH~+HDzd4|r|"H:tEF\4aIgVFZ4c׀SCzG.@t%xښ7NjtMT y~HY3\`FӢ_pl2&"d)Kڔk%M\qҵ1@6Mv2t!J6_t`"#}5ёOaћ`֗H97-@6&yl$Z`7:mJBTfi"m͛E&o}Z2ѫ/E6%y!Wވ\u[PrmNsV^F[: XX/<ƍ4'Uhc͋^E5ƚzNJ|]hRE/6ydpf[q>@nnv'dd:ث%H ȰZZ +j*j. CsnR^Kiϙwq |z'un$j!Qilkg5_$cIι =IpJ;UEB8z$)r5o!:,G~ӕrW/$"Me's6Մ2X'ѣQ9O{@7 i8BzG#g -"I9_RDq ˯/9}D:qn#TV |NHi3H!>kAT؃*7$}@1ko Fkfrk4IvB>ѧYtkyV^p(؅F C9d'5`Pe,l!wY7k^ 8 k-*>W Mا;I6kl,}붨\-@SCrJIXҕG~u[T|hr}JjX_xmQ^>>&pl%δO4:Iuj* UTGhζ8" ރ#ƎSyU>])zZ t0j&vfS$,5-_HQzYl !`;Luw]dK4_KɆћY4ihYνRXR@kOᯐɆEzBH򏦹tE"?ʊ@yL U>x$ߓ !Agуƴ[Nh`ms&)z<Ɇ/#;qnwC62*P=vdJ}xi\G")"Ɇ#xCsO/ a7ol:mӎENAcͭ8ۡrLW=u;2( @>|}/~qe3}Kmɺٕ-*=%"3ǚJʯXzLEl+YAnjGhv~6^u,W s91ov5p!䟌껰jD)XQ}Ȕ5z['de(Y@Ggc}{9W->)+hj_^7JfEÌ/mQJuRJ)RJ)R9brR*wy:4_dGR E˛Lҷcly'WybM݇G*P^EÓtٲQkmP'EVu[;<*i,e=y?,k[xvjrQ]lԧǼիvPei(xz]_@/ Ovq ZijW6Zf퍞^C|aTn@8 c)0/+ 瓲^#i.*kfk)ʷnrL*`5饔RJ)RJ)r}CVw J*/L i({Ζ6~9%T^qR)TN*KkNu{*f:; XQ36)U1rXYc65TvY#n#-*mXPE_GJf\+97/1l)kv顏o["qi9*u3lE{W,=n=`ƎirU~m-g?XbMP;}toyڦB7o<bQ*Љ8%K R3ZR gt0yy00|poسg< ~O1=z0zh (M{@.ټy3'O^ݛٳgk-vve]wy'6lHyG}UVyf3o<."VZJ{j/{aСL>c䔖: /7xaÆ~3L/}ҤI1b̝;[nŵv).`,\S+>}oGΤI?~<3gZ9h޼y|[3uuu|ͼ⋜~\r%ql2?_j:bowޔogf„ r)\l޼yߴ>qy%TEJ{@.Xjl5[n%{Oi&L¸q:t(3g?)GfʕL6ڵ+3gd\zx{zti:co,\uaeڵ,_3gk׮_z5/?}?8_={[n .wӧOT]vѭ[jh}M[VVƪU_^z4)>u%4o<~_3w܄3f 555\uUуJ.zƍYn{s 'txhrKcc#Ӟx ǨQsx fϞ|~57 :۷sN,YwZJJV^3<~3 ݺucȑ7ٷW& nݺqgO?t .䭷b yf;0FcŊڕUl}/^6ݻٱc;v`G ?iӦQRRGͩʖ-[,[kR|N믿rUqK&OΝ;)//7r2l0n_xǸ(++0mڴVۗ{wk:_|w}?m[ou%%%s1̘1#?L<>}j*.r ɓ+9YnÇOv%UE@+?ǑG]vrJΦMذaCnuuu| :={վ+Ww^ b?-[Xf ?iW󀊛@,TtR3ZR g)<H)-@J)hRJyF R3:, PRRu3 ZԵU4gRJ)RJ)RJ)RCw`%IENDB`Chart-2.4.6/doc/html/classChart_1_1Base-members.html0000644000175000017500000004050012033071320021455 0ustar reinerreiner Member List

Chart::Base Member List

This is the complete list of members for Chart::Base, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Points__coll__graph.md50000644000175000017500000000004011701115622022640 0ustar reinerreinerefeb39a8ee24ac73aab73f404de60f58Chart-2.4.6/doc/html/classChart_1_1Mountain__coll__graph.map0000644000175000017500000000030011701115623023246 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Composite__inherit__graph.map0000644000175000017500000000027411666706742024163 0ustar reinerreiner Chart-2.4.6/doc/html/tab_l.gif0000644000175000017500000000130211472272372015402 0ustar reinerreinerGIF89a ,薴ŝɯͻ, ,@P`H$!%CqVe2XJ(Ġ+3 2$ kv-u*"}|}|~q(" $f 'l(&&$r & !){rƲεҽͼиP?Bm A%V܈!k/Đ;^$Ɩ#Mf)f͇(WLK҄ I)L:eD Cx*4 Uh %A^NKbeXkx!2t !5t]$%X.i[]YfEkg`:zҞ;}jaaM׸c瞽vۺ8ȋ'?9積G_>yu_ߞ]zw߭Ǿm浏G~თ/>٫|W}v;Chart-2.4.6/doc/html/classChart_1_1Mountain__inherit__graph.md50000644000175000017500000000004011666706742023712 0ustar reinerreiner4cd7612010e997bc412c40950d4bdabeChart-2.4.6/doc/html/files.html0000644000175000017500000001303712033071320015612 0ustar reinerreiner File Index

File List

Here is a list of all documented files with brief descriptions:
Chart/Bars.pmImplementation of Chart::Bars
Chart/Base.pmImplementation of Chart::Base
Chart/BrushStyles.pmChart::BrushStyles
Chart/Composite.pmImplementation of Chart::Composite
Chart/Constants.pmConstants used in Chart:
PI
Chart/Direction.pmImplementation of Chart::Direction
Chart/ErrorBars.pmImplementation of Chart::ErrorBars
Chart/HorizontalBars.pmImplementation of Chart::HorizontalBars
Chart/Lines.pmImplementation of Chart::Lines
Chart/LinesPoints.pmImplementation of Chart::LinesPoints
Chart/Mountain.pmImplementation of Chart::Mountain
Chart/Pareto.pmImplementation of Chart::Pareto
Chart/Pie.pmImplementation of Chart::Pie
Chart/Points.pmImplementation of Chart::Points
Chart/Split.pmImplementation of Chart::Split
Chart/StackedBars.pmImplementation of Chart::StackedBars
Chart-2.4.6/doc/html/classChart_1_1LinesPoints__inherit__graph.md50000644000175000017500000000004011666706742024367 0ustar reinerreiner9161b1723eca9c6b24c0a3335acd4fb1Chart-2.4.6/doc/html/classChart_1_1Pie__inherit__graph.map0000644000175000017500000000027211666706743022735 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Lines__inherit__graph.png0000644000175000017500000000564011666706743023305 0ustar reinerreinerPNG  IHDRe{mN$bKGD UIDATx{P?{r1BjFc,j ͠Dԉbf0 ꔴ6t&1ĖjkF >j}0Z#JԻp;`}fvcqw-H$D"HE*>Judx2Ct.^ DrtOB5RRtC꫻_@+?-T&s\?)@5 84Om_&k1NjyC;)!k|%:<؍ ~J=%H^+rpr`Ц3q@?T;1-cZ|`g6Ӟhm[^o+?D )+t#0i?@YY;N01݋86/4)Q;6m͈ " Fk坵?|VoJm.E[<L^-nNtJsphe͈* p":nm^B(wt=Z^qbHCb-+@,b>qaӁҦlBVSmҋ. D\6j'IM+bx( lD_2ҁ1@+kBxcx]f=g_ݎ 6_~8cO &ΈG,Q!z4ho;J#Dj'_".#DV!-;=YC G;)CsX {J$-wrt3Trh'i]l?BO}?H.t==ʽ1tj&h1:j#am?#"V ߃vD{ڜ"3RRtC")EH):䮑k_05}taEZZn>2b^wcO#n.iRGGrç>um]p=SP1 z>j|.S^7aA1L>i w_S |T?E!CUMQUYYƮ3-e!3EaڏaL@Kق̊yר+&RN27;PBz\\VX?3+eȐE}oC '}X)FtU ]TmD#`(̋ϋˈE@J[3ǹ}G( ө.ðF@Jq:Nh p:Y(0jUq]ה J@)EH):DJ!RRtC")EH):DJ!RRtC")EH):DJ!RRtC")EH):DJ!RRtC")EH)B?G8T58z_M!9c ),,#ϣRRRz; 9EH):DJ!RRt_vxyw(//LiWh;{ʕ+w߸q={CDBff&d21x`JJJXnbx}n#0m4Xr%L<ŋ{ORƍGKK GnWVZZJLL 'Np JJJ(,,$99@ZZ]t_Ƅ x7\yvEQPUl9}41۷o]&0ϟ[oŋ]>|#G2a 'NfySꫯ:L|wܼyӵu&M .BȊ+8tw&77ļyhll؝833ʲeHHHppe^z%ƏիW;GeΝ`4]c{GnnxwYz5cǎ'O2e;ҀkJDD۶mǓIvv6IIIՑٳilld޽dffImm-/W OZPP/8w1cxlŨQhhhę3gHLLdРA݊-r """2d |AMM nbMo5k@m7)I@RH):DJ!RRtC")ExkÆ TTTu, O|QH~ ^ H$D/E ,IENDB`Chart-2.4.6/doc/html/classChart_1_1Base__inherit__graph.png0000644000175000017500000014110511670177756023103 0ustar reinerreinerPNG  IHDR(.bKGD IDATxy|\Uϝ$i6dfARZA}+K٪, U m&(| $mYcGAQ (*"E,LhiJKǹi'CIfKrޯ׼s:ΎA `K׷`fǧ8p{ɔ|9FPN8 8ӥjL}`p[[N`/E])6˝hM)p3[,<_Y;~e0 ~_Lůg5Lު730JJ/Wcq.0?#cG[zxt*Ir`g ^^{ 7&0/^yhϵ`b È[_~,Fz 45ebha3X v&&aU)گmWaDd S#[ĩ\ R>0!COĈtZ,id+L7hN=FI0ݪYGR?׌p'e#IE3gh$;p7["RT]<$ vK1B]#C1cDY30[wSr%! &fb'} _]z _wAMttU)~x)|zOL10wV_IUe 4Ӏ*19, 8/OA@E}aQLeۀrKQ}6eX+PheX;Q2 ywJ2>lk)f@YPn/o'z,H>}Ut{+PC+P"dni(4:)"YU"mm^}f-C+Pr@lyX_ 훥0XyKK ΍ 7Kae)'ח}"zKaʛ>.o Bu|qDmWhXAE3ْ;@YJUUNK@~?]AU+,Ņ|jjꇷ6_"ɤijo i@YrN(T5!n4Zq3{R.%ԗBŪ*HrҞ60X6c#(KNpmT^`WjƟ'FP FU{@W&bK*O]UBZW~9lXx܊.%KԗBkUՋ#v,~M?WA)O,"L#tU98/Z,}uL& S!y@j(S]}xU"`͚ N8M.U;g;{|2.ǀE?"XliObFňI}Nˍ(.-ϧp}^?׾e;&ڿ%Llul`C|HǠ$}BLb|&}w$F "\ YMfQV/OA.Z(̝ړ{a"10 ;Tvlwлӎ_e鉚HF]6G_}} ;Q=61W6qоXƶ0ݷw KiCɓ֮mdŊO %o39 aSU8Lg[, ԐQT#>}vR.u*GX,EEEޓŒ6Te=_m6ȹ"]k2 fkk-KN5 8K+*>B#}=ܭ6mz%OK~ݗRL\_z{פ/=bV_ @wjNOښz 2xxbjq&}VI y۫>:b vЂ)STw着"&Mvd6TșͧU׍R~Xlip[[>[/6$TV 2Gi7;Mp{,Vu+Nlb#ABii鉪8wre4piZV r>v5au#gҨxuiz. t|sݺT*V,9 @Ew4\rڣTg"7^k{uUO4S x3](,5 !*wNU=ǀc-y&)Bӧ;6ߔ ;KWj*6dɓFh}X a_ebjR]"<3˚5ͷS< EWrN,T6{fNK񲄴}2v `"Lr٭7p;5x-٬g:}2 lJl5S@ZgN׭FUy$_l srX8Jdo#A< Dg7-EWU[e='cA `K}Hd=)FP9AgVa&c?Ϧ9" \Hnh[՜rL}`p[~OňX h_xk~==_+Fjh,Q`M:1$ڽz NW6Dts~?ɳ R E6n}ev <ﺑ.#2fawG#e0/3 *1 u#00@^}0?Vj7Uatw=l9.ˋ9hWg<+Iw( S gXySJeA DRGZG(T}*SWh41{y%&&Lzտ=LCa~H-ƷYkyG'0Q5Ƽ ]R>/ڄlnD*0S"4ُDp7?cϜU@ ڻwhߺwUUDfٽ\0EHLL|J9~m+0 EcZc8·0{vTDJ90Ȧ;W#>Oǚ`{L⿝+6UTU? 8L>+Fov9/amurb`iW_a"v37&.eJz=;c@o^<}_X*rL>wD[dٵ|XmrPL2;[Ɩ䚶Lro|{8 8}˔0[ߣ~=ٸxw{ak&Y_ PP7}7=5$\7lG2͠ 3ky-l i"+!?{{տw_nDJtQ70̓9n[`t>ƌlf,\Mg_–a$&+IrKsGuz~8[ FɅo}/N%;7EA[;~]83:~1z9x#_vA1  lt٫c쨎:t%tɉsgf4)SӱKF_^ɷtL8M*.n::ٳ? TQz4`0g69KX9lh[ ][o= "\y f3`ˬ!"z׀q@ V<^~U|X)1㋗P() A}^X Qe<H TXq X T MU^ 775%.^"TyiuNRՃv, A%z.96gWj#pc,rX"ud{]m؏Db%9vb;WdxwE^`noorU7El: 8 捥Ud8w8ȯF;ia6"<5*_eR̋ >1cf~s_`,ňlsvȞ= ƍ%u@զMDZHUP䅊#4@y_j? fmUD$ux/uɤ~ODzX/ÞWޱsljǮebPᅵkvdh+m>4&"GG `X*f@s{?PXl-\dR>|{f\7r> KS8Yϓu'/tv>\[^TU?J$q$"sц ep`py nkzJ\t6#\BdbEQpniD JK8\7!7lTH,CAzG鰴o2靧PY7&FoXH,CAPhnxK>~,_ @7߬/XRQqX'EXWRz5//M]aqMhjkVq3>y0 0=v,\Tj0,²Be墠js:af +Py&((M&jj"":OD)0]y7 KgD8{--VT-HuGE仱XjY +P UrY b䮪n'U[G W۾V.xO8N,s'%_8<*_o+Py;t}a2<1k*M\_&xHU"m' -C+Py@}wiڵk6[ǚ5KEdʕ7}oKoF#|pʅ-˗76Ӌ`0rdRg555OYff{@bv7&W`5k} ,G9!6򂍠zϓq@J.) MMx^cD l IDAT ܜ1H l`_m)[*~ʆe E.#+\OP]^S WBCڇѬ>r &ȄǀUZ d+%|=IF:K>uF~fzA",ZLWM1zO[ZA@8 v6wd]ŀE?"θx8#waoG`'Lwx-&U`4?Smh2LWߘN XUU "-PdF"ɧP(P(zWidx&Z莠_@ [Ubo#00裘^}0?Vz &v?n·w~:`z0[LQw_!=|Ob;+rA$yIOU="_]HU8m/9d ^^{ &7&gb"6\ iFڷ,Fz+>P:NDt7~hfcDYa"~3 xͯQIma|/rMY :sɻ@o|M@9 LDERε_ L&k"N٤#>ګDFJ NpM/RN6@9P!/?U^x WN] +1~_LSH]14?g:9jo=j/ɇPkP$ẑo^?K 1&l i">{#^;/7b8(j视It{ 12LAn2s3eS?7Ry8ޓ$y1͇Bu2mmԬ^Y"klmm&Kh㉹%NٗJ̰|#T]?}+`w#LRx"&x 4`"^1&+1vѶvNl`lN?#6IstSUɵ8 \*VaF2e=8ұ栆GFVvqO:~XN Tq/TDr֝D;Y, TQe٤5>K[[ hUhËe ;CTTxs*7nrlb6""H\rȹɴA62ıTv<[Oz S*/vQKΰT8@ܙH$b+͝0XzƜE5`8";ޮSb%**.+0k䄪sT+V,l^2Fh;@@ʆg<"[,vrwHˊE`"+L ] ~_hkX+PYn'mDx"T. Ѕõ;'m_)Styiimme3VJRUaʳkI (Rry2NJ]Dij1l4KEjjꇷ4&B@Uv[w~˗׷d\SS)ߴIT5+L.E6mj>*o|+uO4؆ z/~6u`pVLDDv,V~g.,jU#Q "` L96nV ߩB6j ꦪ"r(ԧoXpzI}y2Ӯi\wH#EU [ADF[VpWKDt'K.T?𼑇0,Dr3-E1u'z?~yX 2T?Tm2}h^7yr}Uy=u #} b75]gɒslG&L` ."g%‹HvJH -dFUn4pu @֣A챲MB7nVr 5gw\y*ѳ-G>"✨>*$8үӰa%Tq6ڻT9h#29>6gWAK> lzpI'eu#֬Y㰷pp,֐y]K! "!&gf2|cdRʕ*? $y zLnzda>5`n2ɪz8`5ka, 8'v,EYcTyjժ? ^[OTpKxïd]n`d91 yg ] F$zp.) wUUuϦ"Pz8!MM7T*MK)%esPLre%%XMMة r.ggBueb TF1X,FPDA^p`d^ .~:N@UUtU}XlwmbA=J .BHf4>z"HއIɤ>ʲx~&dɟtꁩ'o 6"m|񾪚YisDA$KeX&B% ZB?x3);\ 3'ܘ=?̢=qoчb#^Dx(d'IDyX9RRRz'yH1c[wS }*8`Yw;aL L^eԹLRMfQV~y_GW6tIoY+;gD~]b#.0[AٜљDbn7G0X; d^dt2}Tl'd?rAuAIxPewUUNUǗ;/&R."O㋯˥-%KCDS\wΪhUW\sT;)Æ/[,b#NHIz7Sutw2^<^Ba ˗7|ΊŒm@uB(."{g׼iÒ&?EX=a <@uSjK8mmrZ;9*]4Wv,BcDd_RF*+Auw<,3Uo6L;Y1V>R`/ټTIIbli}6Z{/)Mt z'ڼec* > LJ<xc͚뻿[WhxF(T7UU _\ذX ; Ug_=O@sGݪ&o˫3Ka`Ҥ6lvqw9N`3kcy%g1N1b`[GM$Vo(C>7&@PSS?y)kl(S@erhUNS ȁxn큪+"45]Q/DG#] 0f sU䄇z$s@Ҽ#'9RuvVuW*--;IuؽimήhkU#kx4:HSl`yҰ~(c*+߭E)!}bD"Qv݅rSz!$ReȏV6^h,Ń>Dޝ]QUU1=?u'?zEM0%\"z|z{4:ò+P>UUILݼZ08Lz)悼6fO^OL -".xb#]Tѣ?:햁(iSUJ<-JPUu:}-L2̖TYDJKvȑK\w^7D[ad(UO7;4+tvO2D/BsAsgwm qӁ+T* %@j*{`<]:[~TW{\W\y߳Uo> jWN"zHYV0ȕ)E=uv~IlZr W\`Y%%ASqH~=튢("8eMf" η@r咾)[{yΞoY)[qo]VD?]h,+Pk(ƕ$~-M$Z;RN0dR.aWd+Pn-CTT頝mL?1Lߵ;|@_燓uw^@},V~-' e1z'cmi7WD38 ("fþ r }XoQg. "zjfbK^)OːdZ#ǃ͖{qhFːc6M!ASIU/_^~X y%Ր~ lpf}w9;Bu Kc 9^`N\ ]:My I>gQ^@:Se6ȯ6ܞ'?7b-7Pz`F%b!)Peym9:;*w y 7j+#Qo&M?lT(ht/ [@7dE.`x{l;7|@y7~%?>WhXY?`p&p+c@?7 nZ|2]ue1E)勀Ksm W 9jiqv$H;r*OY4i&DB"B,DWUpg@^A˗76ۇngˁ`SDd |` m= ԧ끩瀓cEŐ(D^ݸy3Ph E/JA4UR F>u84xώW~dG䈛13Яe[`g!X|)6|a"ù2`^CNDt i;L>>@G3? i"\K[rqݺU ~EgaB:NktR#3 l]=Lɻ IDATxH1`|k~==_\{4ivDi'Ƽj іaPLmؼ::)J{RLs/!p\o`Jy1|7q=FwDQ纫+{>nL^.fĐ .&";yCE87Cǩrd>'e-U/̗>0o/؄iobDb0-?6\ AW/?f# }!hYkliO'ٯI&#(W0P?0s>CM:ӁI lOJ;'@ $6'= SZZz8P"ҖqJU^83s?{gWUs'K42&-]iAĂ,VvT6AZ$-VYlAA{)mIN6I.IfLY&ɤI&z+w=繓*`ƙ:WtVWC<`}W1NXl20"uhx8V/ŝݎm '"7E6u_Ƈ 㯙q&7wP7/a$um`l1s0 o~z xfH,kr^ڪv~6O7= ^:6{c(LЮxϣЍmlVl;mK gۡm|o_a4fU: '^Gkm$qz[ {Ygs_G>H]c1aA1~7=`pȴ,\>P["9NiL d ''D.r뺻nLO}IZu 5Hfi~lڣ#u`I@lXC);v^ #*w`?ֲϠnɂlǧoʲif3Hh42r {8NlnvQtݒ LoJ;wI|Vϲo~#P SUiLU;l#U"[q}8n=X,UeY$.nnW0|aysLy+p@M̀ GnorsVX֎3`I]Bb `Y0īiiiwToyjaBѻE[y=/Uve~7^ґ`_L5 SL?9޲Z%-AFreҾh"B ja&a&OQej,龧S 322j>)E?$)"Y4~ۙ&"7yz C@@;gkv/ٱ'5lXzuu㤼@eg_5c=qoA3,+Q,$RWTiiɴ1 ]Y~Nyyqg$ŭ݆H4hl|;%@ T3@$$;:oeveㄾWTv1"p o{n!7Eĺl``v?Hyt\whr0ek̔yWdnSp` Qpdۗ=z<ɽŽio?@ L5>USTY^99p|;/)#{ KnnpϓAOS%]D~gkow]@a276.L=O,Tq˲VEȴ'We<%BΝýn{B08oHSD˒JK+{>'JDh 7ө'D4,/~˱_y$e52Ʋb@L͝jBURQEoq>BKzjcJUg;EdjladX8U9mܼ!5ʡiip1U.'LJ m0вhHAbYRg("\Ѯ8OU)%j}}!0W\̆[gӶ~RZD "uM] U!^Fq T_r$֥oRh9NwyG"ܷiU=mO! "Zt;xUu[܀YWUU=]E]w۞(DJ]DυTUV$2Y&Χ3@UiXcs龪d#"/u֭UHkQW  ?[veWꭌ}E0-vD/򠈞|)-P"xS 6Cϲ ,lZB#S 3*+WeWZj1srO UN٦%vW8|ۖ'5Hik"进?U%7-nYkWYA"]i U9(ezrr.wV"%mP}|'ejܸ55cUwO> p%,ʴmB{},;A8Nժ"po9t)+Pvm_@Z6""K[.78^DNlwᢿtAe۾ z* >u:`׮̏!ʾxD|YX[5v<<vAevMv-$ori$RzO[Habu˖?̬yQ ,kq55iY\әi񼼂d]?O} -vju2U~$Rk}|K [7CUv\55#Pv|3mbk,B˶πk0YNC|z(}EdC DzZs-:#.]Pzط7 4b_|z(sAC@[L8gێ]m)''t -zu$RP~^v)PsE&^E TOSEQy+t/nvk5*d[_\.Wp/CTS `];$tc/ή# S9IJOl)r+7@NXK<l۵+z) |~ )X/&%.}?@@XuxK-b4GKﷆm;7XuDee]40~z2_\8i}|(Uk_KK hh 8ODv$SNN WpAY%8cAnPUwK FCSR@)[V/`XL &Z{< "<'|DEA$2}<ɑ@_ۖ+l<%ʲd_U>?a uWP K[jN,LFkWlR8\t=%Oe>-97joS#1?gX?FCM^yjrxv2fb`ƹ:Ƨt^C(|Veqe?99cTuqh,8cm;/":=.rqMb\|/= ̧'1K:nkfLA}p9 Mo~ fk}{7Ԅq^È}> <¾O}>+7ۑkTLp?-l >+^w]ZZX,;ժ :I} :a*À/b}C- baɷ&X> aL0y'>/PPhU" wUU=iMDUS]͖ʘ앻^<_qDUD jĈaIW<0^yY(^+[UCT% ԈȜHDNuTgT>]dy8hO"zP26E:UT\3 q,T-ZF5v,*60"==zGرg xS@&NQe6kV4955PIARe<^umܹ3}jlXq1҉"L43."<^Uu͛{|^NKu$&OQY#'^4lؑ;?\Q]h6;wZS][Huu_OK]y۷mWԸTF=Lo_ (Ž`TFF,aC^]WՖ< $ X *"\e͝ZӒ@fϚ5k/u6lI CU7n2qbt ̚'C^ϐ!H۶υ@`+ÆU@ 6 _0Y[[>˖-m8s*Pݸk-̢ФӚNNCRՕFX{$Vx_޴#)ßvCzzym[ ٭?@^xRi]#U&tIt)p!8NˡG%J NVYU;DOQP|I)J'HU)=X7(@@=m^D08o nV[QZZ/("S'Ch-Ia|8ex39WՋ Vd<9T|O* TyFQ&ˢNU-I0 ^%n}|z TMM ?O?4`,jT;vp&)n0Yz5 /իW'Ş2a&LXCEOM~X UɕW^4:K4Z#)~SfTU}:U5v=ϚiY:C}|R. TEE*|8gOnc=E1f+>}:<1W_}5-Ezzcn{Xt)۷ogڴi\s5=sfrrr׾f!q{'j`̘4{5]||z9]իW3rHƌ{GuxǪUx衇ؼy3scĉ,\va\P(O]]|d…r`LرchH1ʦMPU6n|…fގ;Zmڵd~\r% 2C9>!CDشiSPL旾.Hjʔ)DQyfΜ{=#Gdƌ^+p=p 70m4,7m.z`ĉ|gl߾w}Us2w\֮]?_ϒ%K4hӧOon[t9`РA|z뭔6W| _`Xٱ̻fxVvNEEw}2dH$ 4i7زe |0>7n8]xᅼ 6I 38پ};?я7nuuuD"ϟԩSl/<瓞NZZms]w (MII cŊz{\uU &OLaaaB/]?Çzj."8;w.&MbӦML6c9&-'>x_pe|Xń vر+W~͛q]šauu5֭cĉ :6v:V\Imm-Ǐ͏e6lQ7n\ڽy~O 1:+P?dHxYX; brr.,*Px3UUui}|_z2f̼ށ"281H̲4*"Jub`SpF3}|zu~=z?e?Vx"cU}X d"޹$Oo^BE]79΂x^ŀ)Tźpxbn%#=/c 0t"9_PqAuu +@W\[yoݾǧo)(_`Z[ޓPVvV[V$Uk&$J-+(Z`eծיLJr>}N-RM)θqY3żE粅@T4#j[o_M8CW&Nk*@/{^:k"UpIW|럜 ً[e˖uwceqTW{췟!;lԆ uD0zt)K o8q~l7 ?KR[@R> 8?)Υ1O0 x5~-:b[G?n%% 丸R"!W%]q;Ǎ+R͛K-ob"x ;$7÷p&f/хV8w $. \|bۖ#)ygKЄ_tU^ ̭ͽ쀖 o9-`BF޳mƅYΧ]1C&.6ہh>p]1z>{JMh~9#1m!0(А 0= xy*`TY{kWmQ{JX,}ME0 UiuKH1ysCM~o&Ć&ӁI?czD \S.ĬM:0ŦmIĞnO Tn<%C1a;UY*/^#~cke"+\htWLZءa÷՘aY[܄6]0abk# 0~wTs#m]+$>-Pg5RyޯQyѩiir:P`vvlÆg%2I[E䆭[:z)̧!1~ڹ>X2v 4ɫ#?M¤97Zqq; OX`qpj{B(fh%ة*˛d ȅ"b3UpGqiiNϓ3@vҢH ":IwExʶCO6a1~嘙Q[ <O.|fm{B^}UVUϠs#_zFUֺmuOmA_q Ǎ ߰y`J@vݢl9Y",rcKvQk4fJ>On&nj3ӳh)h L]U'lgH L0bRO&cfhFTGlkytpSl; H-V0i~Y4Z봑EГ"LOO9hӦM´`pHSGZ|yamݭ7bfJeyߴ-M֣8Ohto`Ca4)&?p|6:)'PR*b]=z HRh/ ?np-"9z ;TV.u}ܶC/:Nh޲ǧreY^)0q FW#Dt*ovaND H)Ȑ-[]]aMKD"/SesګmȬ+TឈY*/pSU9TUVvѣijM T,Vj~Gn I1,G U兵w0a[oqBuSU:})uOSRNo bkM qwJzXLOiEkEdmH6п}޳{&$ @R?OMl\RRڦv Nmk)Xm[Ko xAs]pHOlRRT)#PXݛDG&~&s9isg(-]uKNQhUnۡg'@A\cRiN"J(兵}>=MJ,[y^f i9ٙXoXZZt {ohrQQq[TЛjjW;N~ Oo'%ldU5[fNki-.'2_l7>䎰eygrwڽͦMwWE"EA۶? g=iOJ zFU`˖?ip7Y"ʬUq 뻓-[]-زd ["mvIBHQ`e5?-`(vߨʳxW>Ћ:dRy[ۑ7RZZ떜**%eJ4&Dzxt*& "-`u71Z-+_wUFx*_|z(ϓ @.IPM{vUya^g,-]8C㩅FL>Y&e 1c\ U"l,i5IDtHi pknp y1;ovEi|)+PZ@ ao5]UTՖ6 .;JNᒛUYEnٞ'A-ޱ#q0X"})+Pm*DAT=ҁ/@+=q4ߩ5QԲvI O]h_a-LO87&)+Pqր6Q=2`[(lŝm8^CT zq4p@@ bUF.]0X0I-RZTu4uE;A~-RE8\IUf߱tHiiQe8\\XGzq%E٧gIi,VcvY`+D֋Ъ Nb]!)zID8J]Ң[u'mP'@Zk}}@s+rH[N^# p^Uy0#.9Ʋ8HUSXL?qsr.ݷ*||v'bk˲or=U jjztmU[F~,},,een9-V3,+m]0m )-PCZ JM]` 𞈴)<ωȕ]eڝ;3OJ5TvUY]ysIU4! vhmi}z7)-P-$BP}#F{ux U9&,bWZM$MUKOl3F#?%Ǩ4Y,`0|}K&Tr m]]^^/u%Úť'TmfㅽE$R<."ƪ?m{ۺ`0t]}:F UOͻLsE Aˋ>3As__{##)=!¥`)(}/)/P Dm;Q"0u?]EMy +]ccU m*u}/)/PF4[p0S>;v-""g%s 7''f\V`ݺ5Hc[|+ݪzjlm ~ ˆ|?Xm~D'xoXxoZYpUIv?TVVyee2uK CZZZZ.Yu-f8 KN8hД}ӝ{XSo$|* U~Ja&XϩrH">-!@HdqEZ~b||Z_~4_60s׮ywl"u5`1ffOED8^#*+_yQBvocjH]UU z"R0bļaɶ5.~;S'tgK my^;fzon`0@JffS+GyyD8M9`hǧ//*Y\Qm+/u3P d)0qoÆjJ˺+/w8\7Ng 2ȇ4OI05@hmHO4v6ݧWpg0Xj2 k;l %@6UI?(>[3D&ӋRѣI D"%3',~wӇ~a30YhtlEt,Df[BLfi=Vec/Vo ƌu֋ E(;NA½.ML/1/_NJr[clv{X!`~#Psr?6 XL   @iiQ%XUtnj^S+T)?\!_us}4~E#&WϏ΍AܣWelFc?5;jU@nbbGc~m^s۪G@kmRbAX ćy522I7Hq>A fuw{C0W1ÿ1Ӏ_ ̃}p5Bx͏nN7܇171n{zƣ09Φa호Mm^kUgoj˖?t& oYZOّ(Mf.F[z!W:N~ mSg  c>za@RU`3azSu%1@%_LO&eNTj'س@a^>v6{M~'^&Yka"dj<sݲUyڶ 5)C9fՖ"쏠MޫO3azh]0]ٹ> 65pkg+,TeKFVU-f;6̋"|ܼd2"ư IDATOv~Ӥa۷43,k0~`Me'|cじ!Kh lkoOЯ `|SqpINh%`!9<sݲs'@'>O1C%иf8uy eL/p(Qf<͏ ܋Iy'p,_88㬮/^? O @YoVFF`fxDFU=@+p!'͟I EG?yYœGK:fnkf.L@h4;͏(Ʃ|xnͷgO˵L{;z>El`s_yݶCx]ܶCwҎ8m;q ^3 JzÀcf}Fa"qhv> u$ )g&Ճ60 ČPǀ afNͽlF-@pêy|\Us'KMi%soVPTPPEeȢ( iɤ*_lP)|eXA}ZVY !;iKפ4ǙӐmْ5fri9{[]0ˀ0-5ӕz5C>=F^A؟d̻0K.LAgyެgu*۴ o\ y%Rhi I7/ oʠ+f!=DxPHAӾYUX2AԿR$h>>O8ގ N(=mΥEqx^^Dz3*}O(C1Hkw{q'ߏu# jP,VxbSښxBŃY/*b6AS]T٬j̓^on"z$ѯPHg&F~7؇1yCDz^+؄Ӡ.*oPյe-7#ot;fGCL*UzRߏ^CUvUl))7GaZ52^YI~&Y %R}wn;k8l) PVJ+/AܩJ9w:vv/akt BJ7H*L":> 2fŊ;q'9!Vy^C,+~"3`V8\P85)[ ߏFUx_UrݚVAi196I [Qu"-MH$J֨&*3h7|O@]%9zk[V"NU3n8o0P9!{qnѓ#X,z[($_^Ϯp8g㲆/Ty DtQ$ˏ-5<"Lxf*7_W~$N@{^pxv~lJAMR7&-yUݩ+TPzɞjF6c)+`̘˳Yn>sEtUDBx^͕յU>lJ A|O18"1}=iPYY3qPH&u?vkw˦p8rgd::H8O7*/_~󒮮vE ՍE^ ǣgTWnHrUǣvF~GuXVٯ83 ?Q\[Y,(rhئt7<&a>Tiȕ=3t'Dcy^/x ѓsk~NV 7*@bSD"85q57y[3U5ڏW~ʇ*,)+a.TeZ3rr xY˜3"m xp!M`Y.*x3pru 0 c*J6AuUbA&O7<6kՓX,zpw߫fV纾"V <>ӽZ@p= G]fo<,ncnJH=$cuo< L;^ړOLE&) \SYU9},[vU׉pJWu?i Нw9X} OŒ|883Vc"`2P |}< X,-:IHux&ú}LºR:5Oz\@=0oGX\l>IΪH$g;@<,w1ؼu"}೪\4{%>Ɇ&g@iѤfVGddX>$ueǀÒu0rr;pp?&=PV*NYYw.h<߁rXUEU! #k ?r]_j\zwe×2,Kۗ`Z'ww$І$$|3IS/%Kztӽdu\ |pJYU7m(  ]G,@ffQe;`Um1ui$ 0*uJaWgC8lꇈ2ʪ< OPsU~<qu#_WE` K5323vs}?Wo` ̿ ط٪Q̘TvSEXZw`L^ YFѳ ՞ L(,…p'ւzCpK:fe i܅?,׍<{Ϝ캵n!8,Ek0&cz{Y+h|egfu@D.9(7w} 8p8ӕ*J6A myL7/J? $R+z)ED~%p8|oYawk7iix =.=y<HUfpKeeBUTlP^4 O 2;?=;"(ʏTIU=@U~c 7o.,rlj=t'8z(_*r6AeD9N,UM,޾:}m vv}, `ɒ?.? ؆-Ү;A7Mli?@@iu]oEWU+/^*"zخkn#2WTY*?Hnz t>OiE񮪓,,` [ba& sTYn# @=.-awWEHmUWA[vkDtDY8s,6A'["=&f/*tuu|/{M zW+u#/>pUDX)+uHp7Gr2s; __Sc,`loTNCNUY j s?bBe}C=)cƴ?bέB jYSR  dO쟞wz-+olX-З'8\YTVU:; .^||LPM[T%[[siEM6+V<(t\d[PC&ryg $p"(/bu 3DУZlr+h]l_]]K @f\6+I/b +0+ {kY5DU"r7NA j/)F{{ πu# 5/#7ʷUySU0==o+3V?T_{^I"nF k{X!2`s*UU3*74oT$Ri)5:(k *+u2vL&ee] Ufb?HMDnf{56Ael {dƺYӲUnn {&'8U/M~ KEC1}ݎjp ?%Л@Uxެ:.kx *D&UƩjW/U'g\YVo .tϹnuv({BM|f p$|Dzx^9zvg'ۙqݚ@.&sX1wMmAeѲeUyP(nĉl 7O<^8\{zec Uxp2v5"rqk;YeO$Ə@.?~ګk.w6χUjm]IӮbg^ZVW>Bh˺]X-rQC8\;W~ (t%W/[vi|E ܒGEp58-6eIΪ(-X<ѓ]~!l);:)/DMĉ67ySS GrD:8"Epb{ׁ |?GÑp螾T.()Stt< FDq'޹dI]G]2"+sUFn NMM窞ϫnL| %%rmSSil(^UyLD/$LH$(WubуB!^)ቄ']ĉެAZeTp5tv:<+=tH~ASS}s<;oZՙ3f}|-=q:D+GlʑM7Z`fOsr|OtVE)'9ׯ/wE8A`g&XVz% "G˺FMk?GaX̓ 7iӁoU & `fx^VᙓsYP 4ˁ?bTu28^1 >,VlʡX@\Ur AWW k't=EzٸH\y􅘖7iIٴ&df@`&F0 S:MϷ߾,-[vU+ȑy53sY0V f㱗LjUڶb ߗ#w.Lnx8&YkmynJHLZ ܓoi`=6fLiİ *Lh6裕>߯AT咪Y;庾a@ }OŒ|883Vc"2eDt0?]L$`Qܷ`&!MJkMԔx+v2p5k`T@< B$ubK ;q|9Tkxo=` & t`?v} ݸM0EKӚLH_.{ˀx\czowe2ǀ r7X.oGCUz cyo8i\z"H.{l= 0-8 (I`ZL=7Rr_u80a r.vW+*x'x^|9L,tzZP\Ll, IDAT/`mK۟9EkD:%1MPy "Uյ98]<ODfrm8IT}x̼ [bd/u| sn b&(m[=ЌI˭X~3"9!_5(⺑ 0Wdɉ䱏bRuZYx{T{U|mYaTn WEl翁A"si;HDao@::䳮2[Zf7P6AjUگ,_EsG<mל-klʣm/{$]y?"BD\߲& 7r@.D4X: 7UVL-D qݧLEnMTyq|݂cYeTn{X-x~ E'g"ե傭bb@궗x 6!/߫2js\?JgTp}8SnmQ,~՟4ͮ[Bc6APp-yׁ۠^u% o#=]UfG-t<`TcD~ T꼭]ޟx"캵':k.G5ku?m*۴.QA=:~rM6O=Q07ں豊 q-om]|cF.ۂ*0UY}_gglҲ3X|"zsHQf,U`'~眮µkoݺ;**onׯ[Lkk?=~ԕ +*mںD>mU`~xE xY7h.)8?/k\UNvMqeYbT0 u] 炜ຑ/7 |}B=9l*ާ6wzwh~#ox*:h $^ڽ?˲gThi<43z?J"^98_qe}u>ne5|EnPeߏ1mX>eukN QMM:&kx-"z0vގQM tchkDtgP"rHdiD{Ez;&LDϫ*e*kxۦ0uٱqYËMPEbʋW.T zgb$O X,Z*;t%\yO*td`T1eCu]i"uk{*&xl7N9D5F~]]]Ic$/"[l1sP(5,XϫnnJ ':.*%"g+[.(tlV ȸn͛?|yz^VDbaؤIT~STxSR+2E>S-MB˪ˣןIiϋ'z.iaBTl[PE&m1U>G>V-V~t-n;8)A;;K[5Qq%QضL<޺X!"Xs"oKKk=mqMz%l*::Et@bs^! 2ut|H)tHVUOe[ DhS-ˠ򩩩~G/:l*B#P903D0 i#$& M}&|9$Tô&ti_|vpu?OO ւ\8y&`+]72TE*u4f?ǤmO!)휶>Y/m`x L+Yt&Y_>pӎ{a1IP'ߏ$L.3]@; DYqy`=c+ L'%lvtdHi I@I5rk$e/i?{;g0a&"8]،'`n 8מ"L;=;3<3n-f |r6E|X=233 ByygTknۤ"UԒ#gE˪f`.0BTo 0 3<G:f@|t' {}Pllݼ , _*+y/U0sre̘#ɲ.Df i˿<SL7bb_1'ʞՃ2ya׍=/_+d:*e2c&S@e؇LIm6M1c썹8*շ\K}S 6AYcY}j7 XU.> `Yf07q0WmDK3-+l&z5oyA G[Jp#6A #"2_Cǣ)OG(k j*T0Բu"ZyBxu6A #˖]U-oWU郞FM6A 3 :#6*=q8+ cʲPeeMPLGG^/+V]8rȗWXue6ʴl jYb{hnvp3׭9)[ZPGCEAIUK*7/¯[Ze!Rs Ty&ahʔ1ZDױXY,Z\7DHn--e'J CuE{HQ7pk jǛ< P.UukW`A S?1Ӯ[nQk~j}"hmƵo!VTLlm]t~F:F֝ޭ(=9u.z`ܸi9UTLʦ~\MFQu^ o,^*v=Ylat,DxIg]U^ #`WnvFE++*} .k!bX50~2Sn-n+Do-k(5yެ/3e΢BӓI"nYr<-n^,6o]ݒ j"JPv|,'8бfEO d/P?p-,t|Va5SST (pB_ϋy U6Apx۝"|TR‰e ZZf/o'l)©|U]׭=qij7+tV1Q 9SD d ׭MDʏ֯+; v ʯ1cZ$:X]H"eYÍ^⺵C]Icɂ[p%.p(ѡU6NyD ~@g<`WK?8+MPQI5Q^1s܋~>7+Ek8w3.n|qXVx_rHj)t,C4.ml|aX DM@Uw~pίg!ų #=zfcɳj`p6 ҂Jv_ ߑ#w1IRC1r^Kn=>Y/m]+$9qx cP3՘ę/Y]QHUN۵бI ]'N.{l 0dYcm;bZPq̸Y*1K5 ωpSWXd 1Wl |ӭKўN1tLyKn!;,5JJtz4b}?f0/L+k:._|86m`n7y I8(8D b%庑  fAfrf;2s.MO bZ8[bOc݅I{)y.QL+^fl[O%?1q DQAYXUU䫮 Ȟ%CCe2{aƈ$=c*nj헬#}lfм s<b6AYukGaxl1K%|(eǠF=:Wk0]Q&Qop\4eJݘBc)BQ6AYA|`W`#,DqaYa@YلUY8 eeX^DQ$׍|Xeq~rB҇#1+bn;  :n2 B*l5LiٲZ?òv^Ai-P ^^X)!hLرStxio]Bd.6AY}jk[vEEرںhUgYVv.կcRJ 5zewG뮪+t~KǏk/)tLg5`k.~y[cNg[Bdlge$?G;Y) ݞho/?Z8Ƚ'Y#F.\yj1c窱[EW1cN{uze[PV 8**vCիSXVP˷ZYN9&c<뀿1_R,̴L$] /5}$aC J0-'0co$H`5SC1q d';3VwW-+k2<xcR jrڶ9m{5 xi3 & l<^f_ΦbZbLrZƆcnq5`Ř ^e8&ށi5aMv$bt&2WBk\L"+%$eiRǶbT+x">Ce=|hh!♂鞥tbLv imlWIl<`a#16Ŵޞ`\DH[VQ˴5Ӎn4Hӂ:XIo -e҂:OvSOSN/xP̘ўK%O1cA)ӥiM{ɷM?x~%iob_"3vV`d/m{t}?WcZ 0|zP/`~tl~z!IDATXa<`ƸHuh$cƎ$݀/'o3H&ȧ:$ ~ZOݝ̱ϖU3Z xjiNM%$&܏"u=^JK}3^flc+T0Ig5f>=rӓg%b+!$ o:~)?ϯ:Y8V?'3v*NƌqAf;&o,:&fP~9f Member List

Chart::StackedBars Member List

This is the complete list of members for Chart::StackedBars, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::StackedBars
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::StackedBars
_draw_grid_lines()Chart::Base
_draw_left_legend (defined in Chart::StackedBars)Chart::StackedBars
Chart::Base::_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend (defined in Chart::StackedBars)Chart::StackedBars
Chart::Base::_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range (defined in Chart::StackedBars)Chart::StackedBars
Chart::Base::_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Bars__inherit__graph.map0000644000175000017500000000027211666706742023106 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Bars.html0000644000175000017500000001150712033071320020047 0ustar reinerreiner Chart::Bars Class Reference

Chart::Bars Class Reference

Bars class provides all functions which are specific to vertical bars. More...

Inheritance diagram for Chart::Bars:
Collaboration diagram for Chart::Bars:

List of all members.

Private Object Methods



private _draw_data
 finally get around to plotting the data for (vertical) bars

Detailed Description

Bars class provides all functions which are specific to vertical bars.


Member Data Documentation

finally get around to plotting the data for (vertical) bars


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/functions.html0000644000175000017500000004477012033071320016530 0ustar reinerreiner Class Members
Here is a list of all documented class members with links to the class documentation for each member:

- _ -

- a -

- c -

- f -

- g -

- i -

- j -

- m -

- n -

- o -

- p -

- s -

- t -

Chart-2.4.6/doc/html/classChart_1_1ErrorBars-members.html0000644000175000017500000004147412033071320022517 0ustar reinerreiner Member List

Chart::ErrorBars Member List

This is the complete list of members for Chart::ErrorBars, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::ErrorBars
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::ErrorBars
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::ErrorBars
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brushChart::ErrorBars
Chart::Base::_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Lines__coll__graph.map0000644000175000017500000000030011701115623022526 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Points.html0000644000175000017500000001106012033071320020426 0ustar reinerreiner Chart::Points Class Reference

Chart::Points Class Reference

Points class derived from class Base. More...

Inheritance diagram for Chart::Points:
Collaboration diagram for Chart::Points:

List of all members.

Private Functions



private _draw_data
 finally get around to plotting the data

Detailed Description

Points class derived from class Base.

This class provides all functions which are specific to points


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1BrushStyles-members.html0000644000175000017500000004326612033071320023106 0ustar reinerreiner Member List

Chart::BrushStyles Member List

This is the complete list of members for Chart::BrushStyles, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
FilledCircleChart::BrushStyles
FilledDiamondChart::BrushStyles
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
OpenCircleChart::BrushStyles
OpenDiamondChart::BrushStyles
OpenRectangleChart::BrushStyles
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
StarChart::BrushStyles
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Mountain__inherit__graph.map0000644000175000017500000000027411666706743024014 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Lines.html0000644000175000017500000001352612033071320020235 0ustar reinerreiner Chart::Lines Class Reference

Chart::Lines Class Reference

Lines class derived from class Base. More...

Inheritance diagram for Chart::Lines:
Collaboration diagram for Chart::Lines:

List of all members.

Private Object Methods



private _draw_data
 finally get around to plotting the data for lines

Private Functions



private int _prepare_brush (scalar color)
 set the gdBrush object to trick GD into drawing fat lines

Detailed Description

Lines class derived from class Base.

This class provides all functions which are specific to lines


Member Function Documentation

private int Chart::Lines::_prepare_brush ( scalar  color  ) 

set the gdBrush object to trick GD into drawing fat lines


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1Composite__coll__graph.map0000644000175000017500000000030011701115623023416 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Mountain__coll__graph.md50000644000175000017500000000004011701115622023156 0ustar reinerreinerb90a1d798838b853236243386fc3e882Chart-2.4.6/doc/html/classChart_1_1Mountain__coll__graph.png0000644000175000017500000004527011701115623023274 0ustar reinerreinerPNG  IHDR;7)bKGD IDATxy|TϹvDBEEQQ ҂֥VߺZ`ֺEMpVj낂{&]6AYe C&CfKΝy^y%3=,ys}.(RJ)RJ)RJ)=ϿZ{_I&eZSOl'8r?xL1攜GR~\q`cN :\q'1'G0詧4Ɣg]?RJ&;TYd* ReAR,R\tJun60  WV욃({vp4 ܅~݅+ +}vFRJmw;=0X@ǀS$!omrR x(THX4a =EauV /V?`* /oݐt `)^Gؘ냼?F2Nzm}~[g/[rTG ?FQi`'spyvCw4JOg΍&'V{7cp>^`gNoV$Y5y?Z{Hb]w<9[)d>Gb&'ݻ ؀@*so隬#}A1vDh$#/oY3P &yu#+T~ &8zFven&!|$og_7g/GI'I^O{*_-_ z_D;0#_AxF.Ih`Ǟ>EH$אIZCp=F#{|w(\M^q'.AH>Y![&d4H/i?}Z{ylb?|S{պƧ&sUs]%cL^]jƄkw~iwekh;f<[Wz1V]1)ϱ :dkn1ƞ5bMSzRPt:`852c*E9g7;`cOx~@S706 ŸAGS 2فCԻ!WX2wKoR7g9kB`+qgLjDe]Cm-hضK[cJšvv[mc͠}2RUPnؙ`,أD|0pmƺS*dWSGXPUzYj^RO-DkB&>*If^cT{;y J)5nxv7:/JY$-?v 00V JBd״PPֱdpÑӭT3(mh ciD 9K汴^YU,|*,L3yNk]}]cCL8RWu{NOw8&aq55XgbrZǂq;+_1@- ƾ53~gSe͉`;kƚϰc`^ڪ. s_}ET80@F2]`G`?_ +uÚ-5 m2vqZT`Ox"QRd pN5`z$1[> Ibkw|`w|/a:42Rc= )W4I|mخ)Ñt zvѭFX׉vʖ :yi-2 XB$$d{s{Osoie6G[HۜZ$!ZǑQl)Ho*1r`y O0ގ,ӌ$'!I~gƿL]S \c:RTΑ!s^4aQ?yI"1xHO"Pu&?ny^ľ .Fz+ʼn"{H/q_o7QQbx MǿnwNp>/y[쬱h? i]3sS~#"e 3bG@[/8ൄ>FU$1IvG|zۉ9 gkқVkvxNpnKe!ꄂHvF[nI\dg*2JԂ>wnu}Vd.? I5z}^@CXyC=.pw{0pmsvxNr*[_Ke 1;T\g}yxJ}L۞x/M0:d ȕφ# j.Em$yL{W"suSIË^L C"yG 2VwN(XcMS2ݱ E;zO~#{! ضEƎ#{ mU$A̿% O] xüZdogYBD=H$q%7_!̙ϵH|mSm7)}kECr/ Mv-ܡ?cTgdcpx#d p0' ]׫_wUD٥rڢڵt}'Q /;CraWrdm.*])RJ)RJ)RJ= ht?j֪[< cQ*h7|{ ӬujdASj=ĶTYc\w݀|5);t:OrpABj귮;\.=]FCk|-; k+99b396UDt!F|ANo0&?]e>|ژHͼxG=#RE#Bad]c3"p,R)Vj2r!1[U)ywbCqۙHfӕ LXkRvBIMGL:EL[$ڸvB#HRVw?; ISS"zVB~0RThO?=?U`XA]Hz{7#Iڗf)x#eA~ȵV"{eŗeݹTֳ/ `q/E"E(!b2)NvrȗJrr&\eW7%*c+[kJ5Zu{Ð" =xf7)k>]\zpO`2D˲e[ { :S~nGFGr}bfW W#=JU568[6? 5V|3#A㼿˧D*T\\)+#-{{ɒ1tÁϐRO n!CcPwm ` 2o9pKOL)u3"=1׼"=H"M<y|N ,{Jr?K+U ,{Jr?K+RJ)Tdڦ]\=̩zU);kp ërP[zlC]Oj~ RVc-[t,(qGN\gg(zFNNW\0A .V @c2Xo(rVLl2Xoڗ*WAPʂ*LV`4)NI943nǗYe)߾+pa&Y3 ]}X)|;7"Ush$~̘qnk ɮ'dJt# `3rUdCȹ;#oz%+>}_f=O&]{Ma:}7RzJquGyOv[z8~bwQKX\|0Hǐr*!M"%ԟ$uHҌ7{L2$JÐ{o_i 0 r9RntAڦu{G\$x!$TSu@zq~Uȉ1ÐH`/?vң_.IVZ1*z"YZ$qr 0t 94{>[)(V>7H:X!A-@>OX\t+1kxrgi_ݷbO@ oFiDKxچVRQR?/R =R$bw{ UȄȰlg#|Itv5VV=hOߡ-ދz7";\J{ cd:[~1rȼھROwyx?ŗYO'9ToD"<챞aJ|vl(R|tm*^/Kʷ-K-*|֕A&b}JwE}]cOc͍DCR+ޕA&b}E!9X笅K)k3Eϲe~}8r~852&cˁϑ=&9cͩ~*\Q)4,Xc{`l)T^=1; آ%5U-&;gJdl_Go{PBt(9P Κ]6[/g9f.gZiYekVDᏙoqU\,4`M5[8٥o5rrȹ/dՍSms"mf[8Cۛz}^ oV9ٺJ6 )t2A}9P ,PtvGMB!'W!D$X|2+5I#yMC[j.Q<8'";S*a*ƒ]|"xIQ8UTՓ}t* -$+9Ս+Rl:W8Ul'keU4/]dRU7em~DUSUZΦzr F ^ ɤnGUTSUONͺJololHRW7uUTSUOՋӭTqG76]t|SU7*pJ˩''VENnY=uG)ۜ#0lPScM~W\yiuwii$/63u'z|"ǏiFi7VJ`O` u4#G=4*[5;d؆q ̝5zq)Ea 2?a[ʶa3rTjIkΰm%O|OvUDVY8 R pkZRHw_/" }] ?Ӵ c%}O1 zX>gg]g1ӅʖR:ts3>vp[#If4rC@%?x7~$qA"@vd߭ʆB@5YYo]g1JӎL˛wKvg)*djI8yuVFyʊI5v]˺Vq\khqMW/Z\e̩l5`'ARc X=fJnlk_U;-mtflTJ;(Ƹp`i'>gR:XT ['䄢 f#5 :RJ)R@+-ˮ ͱHa}vwMvG˲B'}1݊L('} D{tRW].GOݑNH4X$@[3UU-^>ҽ^.F*EB~=>h#=@ϣ&ٌ|Md BF4"#}Rau!`: ȳ ~q vie/ÑÑNz|ٝ]wR" ~zmاyۙ C{>)z90 \kX$nMHio#s#A41 jRRC]OKP7ûw*F˲pڦ wzS~#9O;6UUKRGNX%?nW"'Ry;q/i[ҶsX$ٍn"9;W?*Zk{vǚວM/u,{yc11f6 {TIΧ7RT.Bw' =HojIٰntlC#{SGv|m:$ ⧨2]s>O\ n~Cm‘]F}] \T@sG;H>SCV̱dEQ|-qڦ7#ڦY>4_~^;82w$reT2] C;ggl?ӕ:qbX+1qIRвa$l/D/gu'& K!.>Nd2]gd[4ؕmXqw.|ote#/f=OLXàB_nύ};Fvۣn4xѠQJ)RJ)RJ)R9'V)u;R/eWD_ύGmG d^dQ>okqqÚ]H}8rCCmS&G(&.{r}3oE`=ZStdg塏1v~͢wpRb'Ԡ˽e$gw6R $Ͻ/icRro;J[E""%׼H^7$\(hϩ=^XɬF!]qvE@.v*>H$rˁYN9kzR9 )o29=.Hy3n끔_F[Tvv:q睪<{[e\f])K.^Hɤub}uIS#踢&(9 l\Φ]a\]֝#~ɲ lZ i׳}UdeSQEَSٱƎ3K-t:X]XM bj*|E;*|Kv{t0JqݺYA?d(8 e}uٹ0?XjG.ȒJ|Eٹt\Qqo"be^T~ o;(D+֮u*˘k XօZKr^ZTg=$6)e24 ѱ+&? '2/[Bt=t߲Ghsw[;nzţOdZPE+!;Dp>PJ)RJ)RJ)RnŽL :rAųǿrDC8ҥk*U*ukUQ>-ٹ $kGNlmz)W˓K~e|AE[k, d!c-Ǝ/@?`F 3:Hݾ4敠c)g%;cAc瀳m(Gl_, uAu[MV*h-].I.eLGf~tT= 89c#R4k>7#EFmp,mLF~:;nal)kq+!2y=ln$R" 2z3R*x`w kclsN7 `E1K?Ӊ_7GV=i{XwlgPڗӌ s)z&pd'5qZCѿTNGk;5 v63ʾ1O"C}%+ejl\ǯM";bzdn6uc;=aHd89K, O :Udĕ{ϧIHR曀ȼЗ/Q3K^k$i{ ske~AKhJ^*#h?gdCɟ!u CiiAvz\Ŷ퓲R*7"zb΋[v#y9Ddn&lڿ؋}.ټmē2Kvً)!12L9\\,|!e\R%id.޲=l#vzb_1bd}:w921HJ;\WHR.hActrYw,j^CRJ)rhv8rZEUȽ~m_Bv XhqAǢoαfI}B{ԇ#74#_SD7<hht,J].5i;U_<VE쐃LGR)Y5}:0TKv&9k}Ybr qMvĿkPeR.@hh?_y_ب=qK/]c˲ķ*ND lF_J.YYJx).[/HsQ!e@N [HseqܿaM\My|Kvk̞m5~lE^$H_"IH)ojW#'/_Cf~ǻ}r^?H:q, 38T k :v ^CJ CJ+ž(^c%F"5>Gʜݾ*q+TV\(޽%ĹԳ+H̑u!%B[}CzRzR5E3Czh' /\HH^Ȑs/8n|Ut٩DvPė5ju!e͟EˌU~ƻ0xRJ&UYĒÑOOx뽇\dnS{{3nRJEznG,͘8O e/>Z]?t_{MuڞoDkg=JSD??gẅ́Mo Pּt,c%;qkƥ_sV7r㸋csd* |eAǢ:MLw&7 2a5c#AǢ3ٵ gO LC]()bddַ+o˦.JοkPnjXU52`lUP+ifJMwWEizgo(0Pq?pYe}*m4gn&qt,*5ߒ]؍BɊ~52 3R,w[4652^wN8ߒʖ _[Ѳܯ6f̟ ܇5[jCp4m@?F%YRXq!|V)6RsGGbb{RE@w$YNt^))K0#hKvI@32hOC6 P`q}o"='fx n5m 9=j&Fzx#>tmL=RdWz(qH[JŅ+EvZĎ kS{y5/WSdWDT~I ݛÿ@.sP6>2=6l%{:>5/ٲw8^~jk%‘‘奭ڦ7#䣭<+#CTdoG:2[>:Gpd]u:9v؝}nC{SK{]i׽tӾ8W%,K)s2>pIz0{b\ǿ'q .9W֊+CW[7)84"eo-Xt<*7|cKv:n)0˸j^ .:G.!٭-n--2UzmAAǡr+|5ү柩`akE) {vƚ/1GWW VRZq352%RJ)RJ)rWIDEoꠠPim:M t,?eEg*Z_ip\С3yN[,}%x>mh=x}avmөAǣkc`_cQlJu~ccpuAǥ5k+750ӠQKnvm-H@rok&yqrq)UDCUЕAǢdg2왏bJSck~K3k=n :忼$;1:mu/Ŕ3{_5@`ǃEڦj4qE!K~cwkԫ4E!K~,0\"fruC8høZL"dWaRq=Un>,%q'9gƚ/u倖ϏɀUf=7r5KA:/Xmc_U]luq(U,: TwR%WXa `H>UJ໴)nzVyo~p} z*@c@w`: 0o&u"PkZS8hw`0Ln!3(Yy^@7`w$yM"u ?oĵx{ p5h7#? Xx{\//#=Bekp 2y5ڒjpzÐ?'GہGvA̸ bVi։%m &Yޙ؂CX^pi*nYltǿ ٝ SF瑞Z=ދ/7=b3gg>s& edHo}Ij#C+`.  ؅8R(usEdhzX~ bz\j4d*c227ozY$C@\kXԶ{1;l 2WӑaHoYw2'2|ƻ0xt6tf#`Aۜf2][Kv72kZ|y"=Mېz.dovOdX,bW*{wyWC8mG2OHj0!Pid/d݃1ջw]#]MЬ.uH6dHoDkMxW*?oi߃Ny?b?-kcdu.ϊN<9;9 Ȼ u!_'}Opd.Wő݁ڒ;b"ٯ],w.j S GҶ#\`E4‘06:%2BRHو%SvakkW?l`3ưg̠T*WP2T]=<0s;צMn˗g~>r'z*Tpjj.ݐ!!C5FmȐiW;2t fĈkj2dZsMtJ*;7gPUzl zހsrԲe7UU)dgy s[m>AR  `w׭|jm!+V8?蘔 B%M> C.<C +VF1)Kv30.p ?X=ã ]1֭VVOSeq?K12dE`7?,[Un2蘔 ZA&)jab TrTp v#g˖x. :* AA&; Nk :b0lC8enm1)UH RqBqT)d t]`sIJe7>tLJP pum-eftLJƪjj.<(u/Q{&:dW}Z$VrςIB"T]=coe֊KWdWT&` Yk.[낎HbQ{cU{(kI+VנcR͜ݜыt}#]4qZ6bōRtR6, UIDAT$U[^RȷFByc -[vAǤT1*d5Μ5zqCɗ!Cjyu,ݠcRXM{PU٭cɇN0qVY"Q &M^8[4qwFMʹˬ5n[|Kܰ9蘔*vE7ֵF3[m`PMЛe ˗ߠ2T*GtiAǒkۻf#05)[EcpбVWTtg-| :&JM%8%8Xr}**Z^E }6cRb67إKg}tLJٕ'c0jkS_ڳ !Jc˖ fAǤT+COߌ!Ctk`򙳂Hr=k7 \C/<<rB N'jiuOLuE/^G.YrcR}Xw-53_c`aŊ{77Rd66}c!3qbJeuuzc̩`[|f}0q(D`9Evϐ!=1Lc5)UXJ&X |WD:a[܉+VH>WJW2ଅka.㺡!_YHVJed0x:Nū@O>uM1)2w2`'=Ƅ#=oR(կUW]Ekkka(U&'1  ORvP(T2ReAR,hSJMvJd#ݺW\qo&ׯK.aܹ|}\}ոW\]ɞ5k~rJw~m A[կ~իW.os+Wdʔ)y䑌5k_xL6>^uz5\СC93Kg}y֭۶6o>}:[l{\+VP[[ˣ> H˹ 8yfϞ>6?S6mDkk+555}ݬZ)S%\믿-M6%},\ 6ǏշLdi&zѺgq0b6nHee%fb=`Ȑ!TTTqFuFss3]t C޽:vm$ӧ//&Mbz8N[v9>>|+ nƍݻwxIk(hJrq/ֶ,^+W2vXavض,nee%o6 ,]}n֋% e'Mļy2eJVb>|8+Wh1&1kgLgZ[[ s=455| ;ȟ'n6-?!BSS|+Wdܸqٓuֵoիmٲ%=Wzw]~߱dɒm KۆɬZ]vم1c8/fӦM;+$ӻwoƎo[=illvȚ5kxg6ܰao&K.8\=WTuy 2qFN;4FAKK +V /dѬ^|0w}7]tnMg̙\p<ݎ7i$*9햍9O<)S^{;0i$8ޜuY_}7&>T .h{Jhx2pOXv-~!{dbӦMߟvۍ+W|rƎaFO>YǘΊ+Xd 6lh7x{dM\njÆ ۷oΞ˕W^ɓO>gmT"d &;h!TYd* ReAR,hSJMvJN)U4)ʂ&;TYHznW\8ϟtJN;0߁(,n :RJ)RJ)RJ)RJl~IENDB`Chart-2.4.6/doc/html/classChart_1_1Base__coll__graph.md50000644000175000017500000000004011701115622022236 0ustar reinerreinerbb14e330b504cf4f97778c6123bb80aaChart-2.4.6/doc/html/tab_b.gif0000644000175000017500000000004311472272372015371 0ustar reinerreinerGIF89a,D;Chart-2.4.6/doc/html/pages.html0000644000175000017500000000241712033071320015607 0ustar reinerreiner Page Index

Related Pages

Here is a list of all related documentation pages:
Chart-2.4.6/doc/html/classChart_1_1Lines-members.html0000644000175000017500000004141012033071320021656 0ustar reinerreiner Member List

Chart::Lines Member List

This is the complete list of members for Chart::Lines, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Lines
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color)Chart::Lines
Chart::Base::_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/ftv2folderclosed.png0000644000175000017500000000040312033071320017570 0ustar reinerreinerPNG  IHDR_Tq-PLTEB@tRNS@ftEXtSoftwaregif2png 2.4.2^G}IDATxڍ 0C#wB+em3Z@SQB%zvyyIs2_I#` 6f@Kx m‹nPdpP x]%` IENDB`Chart-2.4.6/doc/html/classChart_1_1StackedBars__coll__graph.md50000644000175000017500000000004011701115622023552 0ustar reinerreiner7ddf4c03588ecfe3555c1a3c57b6bd9bChart-2.4.6/doc/html/classChart_1_1LinesPoints-members.html0000644000175000017500000004107212033071320023057 0ustar reinerreiner Member List

Chart::LinesPoints Member List

This is the complete list of members for Chart::LinesPoints, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::LinesPoints
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1BrushStyles__inherit__graph.png0000644000175000017500000000724111670177756024522 0ustar reinerreinerPNG  IHDR{IbKGDVIDATx}PwwÌ"* 1Ƨll0+Cևgy FX1w%1"V5g+hTx9 $CYeFad`xhWUv7CB!Ba)ʏ~ui:ÝE쫿φ쫿D'^D"IhnFwOz TAF{#pj}u .+ 5 zvGw.;։'d$7`!HupNP=q|G`װ+.MVE [{`G <8Nc'lGGhNPlA1-_9η}hj* _;ģ8{B0U80Z.L5$8ѥ:8q)úmTX/4닡)h# `4pkim 0؉Vznv` R?g~ p;D7E{g< AĸvxlKB>>-̞͛7@G}TWkFڵk9qiiiꫯv_vv6.FɪU(--u47w\Μ9Cff&gfő#G\~RRR\ogt+4~~~,\z~ɹ>''\bpw.]nwWrܹ6nݺEUUUUUX,<Ș1cܾ.7o\/m1x{{󩨨ƨ(/TU/$,,)Sرcƶ… (f.~˝fcŊRWWGii)?<&L}gΜG}ƍ1 f3{%99Uy6lӧ|2SNh uV翽7n۷ow[lfܸqZ{7n0qDϟɓ'IJJbСsuo~)//gРA.<7Yo Member List

Chart::Composite Member List

This is the complete list of members for Chart::Composite, including all inherited members.
__print_array() (defined in Chart::Composite)Chart::Composite
_boundary_update()Chart::Composite
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Composite
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Composite
_draw_dataChart::Composite
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Composite
_draw_legend()Chart::Composite
_draw_none_legend()Chart::Composite
_draw_right_legend()Chart::Composite
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Composite
_draw_titleChart::Base
_draw_top_legend()Chart::Composite
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Composite
_draw_y2_grid_lines()Chart::Composite
_draw_y_grid_lines()Chart::Composite
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Composite
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_legend_example_height_valuesChart::Composite
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_split_dataChart::Composite
_sub_update()Chart::Composite
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Composite
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Composite
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Pie__coll__graph.md50000644000175000017500000000004011701115622022101 0ustar reinerreiner32edb5ba2947fbd5026d00f189042871Chart-2.4.6/doc/html/classChart_1_1Pareto__inherit__graph.map0000644000175000017500000000027311666706743023453 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Split-members.html0000644000175000017500000004230612033071320021704 0ustar reinerreiner Member List

Chart::Split Member List

This is the complete list of members for Chart::Split, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Split
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticksChart::Split
Chart::Base::_draw_x_number_ticks()Chart::Base
_draw_x_ticksChart::Split
Chart::Base::_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticksChart::Split
Chart::Base::_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Pie__coll__graph.png0000644000175000017500000006304011701115623022212 0ustar reinerreinerPNG  IHDR1}YfbKGD IDATxyU?zf2!LB @I @ D %AD^ěūWemzQ.%!րdz`ABto5]LwW/y鮮SU{EQEQEQEQEQEQEQJ`2}xߩ-U8:'C  \\DBn퀿'{ [x 0x<PsSbXlӎ= X lm׾.08>9q4! K0!Z^͞-g%C^0L`[aJ!`ҾF;w@> !UHu08xd xyzCPЏQC{wG#OKJx`&w# H9-yy<BM|){ }v^$r_$bWof  Kȱ8% Y)(JKwOy~;b   l 7JĶMxz`ŗ,~\e@c3:1kƘ[]G;lz2D__ߺWo]SSS1-[Ƣl,<`yHQJϵӗ _]s&uEz5R3 E)N-  ڞz#0'f\.Qi_yU[f<@QjkN48zťVihqbюރ0ˤ/`2bӾAؤ( ϲ n3fº1zQ r#0zC7 YcUN~YcTwT܉mƶ Jۤ(ҙKF8uX1@E/pl2~;ԁy,Z`dњt>ӅKDEklwɶa=s'S*ǚlfcV)KDŜX4;XsCW;q402V)Jya lb8z"N용+cg%[k6+5M<2dF l߽ TTĉ57 D[ i]Jbah/eI(wk#͍1|CG︲(e"g=rV/ewb. >sd<hM{^ 294 ָqDmSr`|Yت+p&hViu~cv5XxnoAا(+ҳEe@o_:2ƺc] ک¯mR phGϏww i+R*J] VwEzH^;mv@u,Lp VNDQQ*@30_NiPK_YSi;d;1:ϟ.gVB7*mT:Ecg`Ri`<hHLw)h# &ZwkC̈)N6eTԉ-(d@mqw*i/6BQEQEQEQEQEQEC&0{4W7, rߎ^{0ϠIQ#\|Co/ ](k"@{>^<>'ֈcG#=HnA\uP6`3A+%x'J/Wsz_2P, [Hb:Z_%lX |~;IHd9`qڱy/ Ni1rr r G M)c;SҎz2T </٘{ 8~!p#rH{[su&cGEv e]gyg>:0uV†DV~ |8q.fEtu=6À3`=paJ0 |8qh A.Ky;crڙxf(Q l\8o{ |V~m7[sj{Դ0߷񾖱zub! W||hG 7 $#xX܄ 0eoIz]H$"sp5܇TQio&f˼|6w"tg:o_.R|-9}khx_Ks\' @>w x06e$H[`v1pD&dXcHOo3kG_Jy}v7*\*OS\oj7vJNCIe"1cЛU(H݊Py?kէLAک!dr,V}lE;=)m)I}9 {3zmCqJ6|qNHPrQ'f!lY6xh Ww H5}kRI&ziCƙ܏B>Tvȣ쇀HþFaLWgr ±#mAT!ZǏ&@`D "UB>6{G)%s+U8'Eñ =Nɏ@֝Ʒ=DU8&7R]z0){uNGlR]OQZ^xEQEQEQEQEQf,ҙKFm(KYGǝ;ԚQ=; 3i]"= ڎzlC,.dd#cw`]0EeRrNas h5` Q QJL"#BN(щaMQ!>ddlYbT.Rƪ5d"(Ka./>-qub-hHd6 0}LNR%%5K")_S'lBp#~Xl센9T#Ca 6!CҗՇ7HNNܞ,򓑮= ƚAQωTy)4IliEAN' R<]@ 1D``ˡJ4VQO4RoG[U?UZ?Y+`(bNv@5)"dWmSPS-DiVUi2Nɥv ?%% WPS-DiPUZ'XK4~JPPSSMO4p+h;jTFW-*, Vz͕VQ'S1Οp_jbN`ˡMOi6]A/mUq]8vxw8vHv3j30:nO1f;l~?;|P%^yLgv>YD} ^^ ]y*8Jx_ж+j0ZLC9nՔ>})>{PB%Zh3lڎzH+38q_(tc`ֹ64Z+vV fZS)EGb5lsEnͻ$i6֬ڈzf8mxqy5Rfvb.LW:QV'zM)R|$fUƚf/(Dk6엑:! ǚ6dkυAQϔdp8 CA`=80hCF')).2V nO#+P|s`WdPLD$V+{yۃ8քE pY"EQ#X* RHx%8c{Ӿkfxۤ4bQL ys~S$GO: ӂNGT/~RF&61X̯\VAڞ.@$OA"s-2Q] :~y咰M@ ػ z{XHr'O կ[k"o',I0Gy+?1=/(OZXRp"]=7a|p܈}}&yzɫFa2l*9UyjeE91'2:zgg, ?3D*eOºs^ʛܚ^4eU˺Nv}^G(PlgG9og:?i(|ػ yIXʭy국nc]cARĺ"=c1DN cW[cu%8/^~Y,pXAoYY 疐ȳ246(xkWgfNctEzN3\:7RO:AF;tGD5.VN;XSJ~*Ƶ,k9N:L6 0bRZӶ`播O{twKgs6*Oºd+&䩝P kxaP-sKao^M(;#=MJR9:i\5v֔= شqm\"eʷQ: dHЇNY)an;XNAn e`R(@ܚmhbik%w(BȚ7-D6fEQEQEQE.Tٵ>Qyj%B&?^+[OTZɇ2]ť3 %/TZɇ[9oQQG\SQ{)ǰ1*O,IsJwv>}hO#Qs t웅LیǎʒGt!^pv1KC4+*Y)tEzdžn$N>s U lHO‰]s}`9U-~~mWH{OHl"2Wu6v! Yw`o+Y#u 6 ǞdN4{y!- 0~y%Py*O']sJ7۷231ed3u}+݌8-[3ȕΒ9 qbSQ0NZvJ^q'jr_g!Ocߦћ' {N%!OuID'^_$ǟ*\ԉHq+Ͼ+YrEeӅ2]|ic1SjvdғyߎTK#=i7L%W: AAT{W#NxyOcHPߩ8>inۓP%;"zSuXcr,9]"UT 7d8h^tEm:L&WTGl|$:=y@BO0S_u-{7!;%gbDt{-a|JuN~^MTg!mo=AR芢(((((Tpf%ڐ9R2~8ظeT Er1QKٖFzNz9twsAQ;wr{SA֚-5+U^⧌Md-Ȕ\ԏg~ߺgˉ`}$cv_0s֕*8 *-"ronF"3wr1QȄބ U(_đF89U3m67o\bccq7W22#-H]D4!2'38e^;cRɕn$"(isf:bJۉY +)kE>Q2?evԚ*Wڈz67r'+V43+YfPZIJW'?^gX:z*fSKI39U3[m@#Ӊ-xuW*`G87[Ո2fZ^ZpK s]Gh8ft.MVTʘ?vA,"0FH=^~gOd5΂kRl۔gTm\TDñxʒmJ1tEzϝR@.elʟmoZj+qb姪]gͫ}*CU)*yQ %NUTEQEQEQN_>}V(#@Ҧ5C_-Y|\[(N̚*+k5:|5(P\uw86n ږz׉-(lN&c0Xs7"1ӈ-tc*64ײM0Qub|zm:?+dO6ja=6:`; hIR_ 1E;M,ubMM "fbss]@h@!Aڡ RH_PqŪĺj{?h[61`Z7&pkzLvJK:g#S|&oG&|KeDShs8 }Jsum =V)!юcᘝ?kqӓccLD4f#"7YBy=p22(܃}FD$lIM;)G!BgyA,rUӶ򎛅TÏv L@`r =FEqpg>9lHW_Xtw.\4{0h;"=yAR$# -] |N$W:K~:[i-xD,+\J!G;E&'x8Q9ؕuo#eEK`ww TFX̸=7b;{/3MB;%<ιHMo$HCpiTSy{o^DDOC$ucU$^M̗^ ڎa:XG"Utl~ y-F# ,e-CuB ;9LDȞA]!cscZ9J:lTgTȍZ˕.U Տv*o$:fcCk+gN~ĭ;0i8.h[%]ڎF s4^ɏy?')Jq\Vv4YcV.\ѻsж(JF0hNZ3`WW]$qϸj4T@V'fD>eqWzHbƚ[5'mKPQizXc(|NR#1Z\%gWgms*-\XQX@9oּU%yοaol-2kFm42η#3Z xP5&2Oq9"=2hQphgAv4(tD<kA4gEn"[#_%"D7u2o*{K5vCQ?itY@8%]Bg2}sj nAHLIOZoF8{vG"+xۑHO7]iDTBIODT bq DDy,R5 XVĔtES?%D$J{q`3,@PSMr| )SVp'.k= iKp$rmm, D;z?]kR7]DñU]+I;2K7۞)JEx_9orFnϔYйu^3RTZ+2 :ʚ3;6EZ\m چF"[$BFb =ǵqS܂U,բZ-vT l ڎF!ku:lKpZόmRXcGkrTJAc\G$XmB͉=`}(JX3ckX9҆(JjtQ˽sRXkߠPEQڡ;h8{d#{OEQGإ!k>uY(8:tkZT`ȍz?by6ut}{XAۣ(?C"M{wS뇻d:9cYQOcO=3ĉx(C*oNu~<8E=  ڎFaARMwq&klZ7AR%.`ql95wJdmwBri, 9V@.'n> uQh%۔a^vCc y9wJScXYX(ʔR ִ(edHX{Foj[ei1vd&4C"1Olzb;c.;ވ+Yцʡӎ ̕GyA869h{XךǃQX ƶZ8`^.SZA# 4k~p֜)R64+HTcCXubAۤ(FbE2/#1S~=ҨF~¢mQţ+ҳmAۡ("0[(RYj!R\9Y]Qֶ~S'Śi+R!Q1f]cږFAH4mxg f.:h{kN;maدGO .@@Q'VFX5ͮ5b'CGñ_wc,(Jiq!NîQQij/9_]޼X班Nvpvm 'o0dOS(:o zƛtp 3t}NlavԺs ث=tZP=8e龯3݄KZc׀w|nl/ծvʲZ` @h TcJ:j޶ik&kvqbX;tc`Fñm okؗ,Z;cYʜMCoBB-}mK*uJWguNkN03kÅF NEQr#wO[1QǶ)FbJF;z_š[Ǭ(US2aKXs*`1G .L64Srr'44g!UU!Ni+F}7]CInoj53FE C,>lXW\g_`i6)UʩYv(J*Yl({(Pt.v~9h;LNluubR ntʙ+=:n_VIDbscV &nׅcmO1Y1h;!N`,5婏 ڈ" [vٖ!,Xswvc??kq53P a:Ǜ1y pN,᜿}b'8Y;sVl-`l,!Ul|8?e{l[<;o> nOi`0%$8_ 69(3W4N?}eTSJt`pZsOD~F)//)gaV,dv  \8k~`wad 6[tcGG;z Vtb~NI7qVﻀ#9hATYzۏ"`> }n'6.: ЮA"Q)Bo{#BEJAbGfNɔ.T"Hy$H5tw J$iÎ>$97BO&v~i'"頏LIw` T-"mJl٦|DT#jIЏTN@"g*Wcyزqb'"r604:5H S(eb60 1=g#)L$Rmt>۾)O[wݧ 8lɃI:%6"eo`OɸrFGñGA(AZF^ If'6 qxw{C U3 T=7PX܋8H$J\8V@zgg"iqħ`OX4eUKwGﯢHϜ lPKT$#h/4o{V*?.qH4q~ۤ?n-r)ۅ|q=:.iB߯j׉*\.E&:\*t &!m`$g|ʦ2~lmcŎ^ySR<!-H;'r~UE4sA4WlD;zʝR)%]m5kй}+\nŎb(Htz,9 L*0XXW54ÎS9`Mh8v9+%÷:9/ЏKPVB9۫2AQ }Ud|؟Ҡ d~uܯ<166WdOZSE&EZ(Rx̋u N~zԕcĴoqUuU%XZ}p_N~,Eg@T5a䊢(((T%;"{#O]PmՊɽ! 툂D1TrTdu>Yٙ[e|C.hk$,>E:rb3RJ.!QԱȤi;h 8݈{ GtDf2Bir;I#}1EItbb4 Ñ\^G+ 80r4z0A`q|$On$i+JU׺Xlhʪ2Sm Grn︯7y̷*w\bϓtd!=NPT-[ὦvS$O"һr?~u("mro#^Ȓh޾=;/Brg*=Z.!t0iD ,tj|ʭޕwHkD_JpE#=u}GSCWX xeҋ/uZ #Cv:5;+O]CTZr:Wyo["ս0赖+ɏ!H $#OE3.ԫHOolB0|w;20rV }V yUxdy QUijf"TNqmD"=mv"'y<}w 1MmL; |] (:98Ġ!N`r+8q`#D%}!&$9 i N7k:ʮJ=І Aɇ!#$c=Xx$2uo8HMNuZ#^r7Z/NLB CǼtrTf#CZ>Ir{CW} oCg8ѭrߔ,JDlg2t$|d4+z爳-#48>و mWٶAz^jgWh\(]Ԛ:k*4""ŌkAamF^@~MB յ;zFˑd`~{s NCA"E|$VplU4_AQjM5upe;Bpx!mHQX4U`q`EXh@gr;B_0kY,Q8JzO){{e+"(HU3y61c Ztbc2EAF O刊H2G!j9HDk- \J j 2P*JPs}kv/1eb:2v<܏4|qNE%  G)C;i}q;5M]28vM;dvD7 vGYHHpa;*):iy cl;/N*1'Κ:qމqbr'Co{ \OlҖ4@(5EAXuXgUD.uԁAEFt5zqf#NJdu;rb +7"c.)42Nf̽Hv$b[|]Aib\k:kMJd":kjun62bY Hg)K=AeCWP:dK|Dڄ6HJ~يRu<ոW\k-1eu\Dfo!ȍnFv7[q.2:v$i[DH*b8=ٙ@4d[qbDꬅ z+3fS{# Q'V9jމՃEjOx\2;=.up?< !J4^y*X(eXB-5RK-֎jژ 3f'w7"Ԡ .'QqZ['oV`Ls?qcl7kXsSv8[k_ƻ7`G5 :(dkOuπ`Zku`OQp ю|F+JUM0\g WlAۧ('f`\22wjE>ƍږoK]E k^}L1>J)ʉ9 p6ث(Jٙ0cC5_D1fa(U@QNm>L/=á%h#u?n7b 8c2 KU)Q;Qb{ [4TJG12_(A]a1~ٻ8}Lb,}kOڥ&+UpV;Z5ĂpJ[WSֲޘ!law]nm(ډiA-V W z"ID' djӛlLAVyHDDr 2D؍FBF;u9x㲇Nu]CV07\i۔)މ9rm+&L\zEr:]:zB^~g"ջ]EdAdq\3r>r]C5_|ti΃zY.ۻ({w67B.LRIbQ -rK6 RpQH #H z$JTA[IȆK&$y>OD*DN DȠޜf'E\/<#!毜7j HxmDc9Q\{͖s88.JU[!ޤiyt4,uԵ bq@42Q_ v `@:iޫ,h}9Db@[B|NӮNq\o4<>I{ zlRcwр!N@`9w9뒢X˲lu-'٨g=1`+S  Dvb}s`͖C L~מ#/zc]zlfW vc}b<qnqmX圯x͖K X^ʾNk]!bcʲB[=]>:`;xB,2rqop)h}.71/v]^.h c$/2R/h~M(J*|ٳJQ#es<9&;L 9$mQ/c"(X{ B"`&ąՎ%8]2:>~IHuqH^}0/ܣV5 wA|k!U(vC|ŭ{:Zn6X@D\ha5xMi .ξMM0"" h~6LXnTጫn@I:>Dh7+Yek,gʆȈwuMMC⋙> Dp&Ү bdy:~ 5A4 &iTX q'ꎸ6 r\BdWK{9]^ą FQ~%I锈DR/h\v$#8n-Wqh;"wEbz@d~jse\,[p_slmOFjbzn\EѾЭy`kmܵ.7#M5U{ѾmccJl?I#w&c:>pc!⤝ &ʧo rCN=əA6>F-m8Ry"Ȱ[ȡLj˿ ~EqSmk9rk,yG$N >d}r7Lo"]Ihms'"-7vWU+pE~.֒y1ωq Eݍi J?ުIph=3vgdU qs\Q\YǏ+wjrpoEMpFR*iML⬀3굁 |PB$7")Z`Gl97&k(3I){*N%iM3lcѲ2:G'y 4Ӓy{ݤ{XbϡF:S, Jh$)J#acy-wIc#Lݭ i$˙P.OX1~ud6gsl\0]i0Ij >܆?xs+Y~(ýntQGH$e-cJr3д1\ [Rӻ8xBQf IW!嵥R߄hboA$Rk*{I=;^I̙̪(?1$= 6UQ2W(:%oy("g t(ޝ8w))vU{0DŒ"VVCg.yKWWRI%{le!} !/V)MKa\:Ͷ23 DR◑غ}gnJ-ٓ3U?#&:ěҌ_.;e@! 񻉑)J`mP50k~b1]RHAجp6^J b )˜GS#D#1%`v:"5[yv^UMUTк&$LΝ[A hXL̼XݴuU E hsbk1Ivf;N C50~t@dmQT8.$MN%e~FQ&Ϙs/IAr+UZDќg|5Jdv)J`I E~50'43S]s8G( u ZD+͎N-g@ԽiZ@ڧ(dIv~} OH&Tq>pVUWZ@f6g;g5i]!7ybn]ʾn KH~$IαgO#FA􌮝$(Jh>OP;jb,gN&mJlk]!EQ3e`X_F1E\,VbVZ!LQ^ebѺB:/l#z4d|*clͶZWDHg*gIΠh]G8p^,+dUƕQ#ƥ&TE`}Z}V@Jc c_ݪuMtB%EzI'!~/R}9oL&45UԻ :yKְֵ @ݮ kbEGgg/MEY8su7c?XuB51~=%WL˵dy~ VTw96k"ětYli]QY, /bz3k/i]!ަ&}u-F(qٷ{TTO(*tZa4b}s1U!-7lU%kֵO, 媵imeLO9G]4KR8٨srԺ&Bd9t+t{E[򒋖%ퟧuZ3ۥ=F/51|ƗO.ֵhEQ~"I꧜cPCw&ݚᚘ Z66_ZoKӜw?gXIwg&QZ2>Bzr2f%ݍb>i8ٸj]// xO*/}K 61K.z!Yj]/DEf9RcVn׺&BprR ju-bڥ"I=i#1x#iIBq9vI0,+=uMX R1\7riw',g=9g FEEFHh$K$E lmyy]dB|{1ok]!F}5_EIj(؏P#36lQZ9/dGֺ&B& ؓR;' ԺQ1 (N &8g|:x}}U#+/j]!F}n=I'i|4$r$4RUsҲ|鯜s 2=VٗH7)6AˎM~MXDCw ֞8^^'!y$骪|!Πv v !!׽ނ2xIDATxZbB BۦM6׺C:qDmIIe#>jbC&F14jbC&F14͏NvF]]oߎ#G1<$ xw1eו Ebb" z*1ydFH2H3fG}ł>}`Æ x9GMM x lkln˖-(**Bee%*++q̙3[lTWW#??+BÍrrr0x` `L裏bڴiؽ{7㽶/ǏhѣG㡇j|{aƍ?~<, 6n!UVV "##h"ի|5k`ڵɄx,^ qjbxPM,** .\$:t6l$IBDDDkѣٳgѻwL .\lN-8sL#uuu1bDOHwc&6tP444^۴i1lذ6߽{76l؀K"!!$aرlD+B&1~xX/@zzzWVVbHLL$I8tjjjcǰw6{"%%Ŀoedd`׮]Z!ݕFb몮zcoviKw}7z-dff"88AAAek֬jmHb޼y۰m6|;cObƌx1d9s 5J7h"Dw4w =֙<*:u $aРAnOÈ-܂ lVUU/>9v@)IP)U4 * &ATA$*h?;:J`VnՁv~ҁ\H))X)XRVn;; Ip90<뙈$Tů$%6V`3.8L @ 0Ļm`n[^/R R9)Z`0󁏀mlrzz(N~ j5S$a[쁼?@IN~ Z}ͻ^,wG*˱Q$x{8`OpmzX`2x2=cb;p ݆~t0׻o'j ȇlp7z-'`2J RGٻG:oKЩ?@޴G{Hx9ޏT@za]gjoSw9WMw# +:IpϨ_9&> _@zITD$f%dcIX*N>ʻˀGVestpwd$0px}o#ɭ z􌱎H/@zW ̥(xk71??B~lc sU 9^L즲c`Ǟ>A$'@9Iz#-K:l/z'lD>+E6-{YԄ\L F`%&c3-ԟxgԻ( }~w Ceb~ 7#( =@J;=F)U4 * &ATA$*hRMRl=n{eeU5!t?Ac͛uyowKżfk1ѶyEK偞+̑ϝwHOB'7vk(}/wےv(77u_m=g}%{7m6ݷ.,.Kc396~VܰXwNДJпf~ǓrnNqs+ ?ủXMCR*-fX5ժq%^o3l#N]_s*sK/[9` \oD)m(&|ӼQǚ"8R*=9]%`R'g`E#L8˖69sO)ƞȮ MۻS4y+g)ro}Pd=i9LǥT:9z@ #o3{lI::Z{,k5R 7.S1)N=G߂}gku'> Ι<'`Vma:_HPJ5D)`q B[Y7y3 k uKHPJќsxZ9m |d)=G.a7&VU֠J W 69]]&e: _tƅ^mntHr쌳H xHjdmw-\kRi KDq3^\Lϲ6 6>VNrČuf=r1u>Z>'_iZr`T:7b[5e`{Ͽ lC>8 ㈛Ym+&2) `;)gkp]j0u6R`w+u A$AcMci%MM`LĚ6" 7n[ Jƭq?;|SD1~^рM[]4-TxRJ)RJ)RJ)P4 Ie&?Tp sR*6Jⰱ  6D,s7om fJ<<H:~NJ#t ʒi;!u"$і =wC#e%;y``ȏ`3w^s > K`-!_H!ug{!'>&:_XPn$%7HHܓg{!U<ѯAq֛)kwK~vu0=Qȗ[h;(0DĽ88c<-Sj Ix{mL$aoo`%$ߍ\^S7q =Σ㲏Ho<su$@/oݝ'g~N w({.5ov=diHh]tA̫ ble>I y<'IY',D`p;3zbON2L@3H2r |mOt?'_hخ~Ǒ> :0cmbGK2y$ғ{ 􉸿 +=\6V w"I[H`VlXq9Y&7A4һokvkz cf@X'Akpr8֕[QeϨ{%pWZb6 XuG.5CX I,1dm3𒷞Ew3^}i_69QV'{\kv/q.ȇ<ӆ ,iP,Z2û~2p 0Io d-U4Hr[ Z[և _BJȄS7cSildכ ->Y{9];:Dg'p3p5p27U|#}"[1"[)-F0WzKdn@Fz@ߊXn 2Wy9oG 1kBd y@;]lD y "%7r o:/lf5We0Z3uFgnZ֥Sޥ3r@͋|=]d mx?h&Eߋ~_ ^*xrdk [A00r$bX&r=;Ȝ\\Њ6z32J'XUQ3ºN 5)\m8|YrI?H/H)zBG]刬 3-T9}߾H/1E&2B^||ݕRJ)RJ)RJ)RIrV0tq( \X>+w(kw1^`a1p~gdZ-GC\diq} *E9 `߱䛬=v0+=r:,^.F2]"K$/`JbT*-6 k>HJ yHHaD&\p9RTICH[jJ!: )>dP9CJ#%Ÿo#G#R!\l Ɉ'2J"+`7^4ƍyy)un)v:Ryzcm{"HORHɰN~$i!oӐ"]h>@-Hkў"YaZ3c)=pؚl8\6q:#$?hYb-W4~\Bͱ)As>^2ZY^ZyR=AC |>wmPHC8^X2%D FG|vRY^_ʞc2\玸 c$ BN:9*i>R{(l$y[ƘlI[^9Թ{TUQsԝcG1H9i"TCP8ҧq}#n EQ#O>1e [R*.Gziat|do^vJ Fd. oZL ؀KR*f#[uۣ'҃] |c$xζJ-_:R>%iYaD#%Yb_)RJ)T }cV0tq(MfCWמw(qlNK\u0]UÚ0VA%Ab]ĒX9KBPw*:-2c"klC'; eU 3|o-=e($?rEo?Lb}hY v;|UI4 pMKJ$\5mB_Y.? eIƒk:Cʪ$:`xEp.N Y.?kרR qA@EGI!8I _ gyLB/#%"@鍝 `^Tr[dxZk?De ^@e+0Hę!N~ZdWl 흛eW"se Nd<)wu)VJdm.r>94-WAJ//. ɳ>"rDH23E%ȹqI! Ig+ DJԏLxeKr 0~=%ʘG)臨ĝQ0RUQ3SC`GJ-qs q_8׌ͅ}![4sM[,ֺ@`eak! }QPdM,5vHW5Iд! *UH+B=\RZi5Ick>MfbmmRy)j XXQ$A(swU2 6nV, `]>Ѳ" zt\ge27,ْ搲]7')^g*+8'[[%@&4Ȋ$8xSu,(X)j=xlUT.X5WNH{nCmyqIeD[*X@]ܴ1~?|?fj˥HA㌷!T?j*Q[xmkO|sJ{1KsX* $tֵH1H@P쏔D tF `$h;"ɔ$Sӽئ#zNHe&^s[V)Uq)N e$ڊt+R/:#=;j.)i1;j%V g#eJl:lN4Ֆ{"!v%8UpW-s*qWj˱īD\N+8ǫݖJmTJ/mJTm9xQ9^UxeYTUm9u87+Qs*]CJӉU* ιV˥ՖUNGXUU`oقU ]P]^[C~ =G.EXsԺ?}\uEmS낹z\Ĝ+q`m_P[q߱#74lV8.5mz5=pTbΕ8Yokn$Jߓ Ɩ 4%UF+J%\3Ej nJaLJL&U@k!j!d^Uڽ. 9\U8[A~[I)U!H!=T { eu[g` ;StLJFT 'd8A;4ꏔOf]J9B,}̟"hM=-kkW+UdHB[Iset$xoMb]J "gT9ֻE />AvnT ?oK=Rjw`u+( Zk$oyx./Nx5 }ZrގkK'cU6!i#C'/|MU5Y\l'!dKӰx%S}^{C<.w)Nj/;|/q0IU5UC.dC?NúO/㵫tY2k4Q#*=ME=m{ I ?Gў{ux ILKw,>NKHr S.:ŚSmkmg[KL6>Ir]7#g$rTGx)ĈW:#I RPdcb~TkZ kOH#7XӏEЀ6\JwzzLfZV Ļ$kl){'4{Ӯ$#Z^%͸`kldIpkwHc뱦GI7-UfL3 #z[kڷaĚ-ĿRjodWFjiEIP1c\Meq OnFiUEQ~ǡRJ)R*^&MlsRP4;#&ܢU L`;d}{?Ave)ːuR# 0e)nվDTZ-\\q+;c~Hz?UHxȏ4G=!jiyxp눵^dtRxsNBpZ {L94'ÐtM}"sAN\8mXd=龁|cO@a:n Vc:.ed??N^Dh.IbZ>=g趌 7 ٰT~C [w"cz=h"9Hɹ-.9WADgߞГ5:S ݖxɜ3% Cd D G&Z0bٕbw}0 ƕ+j㡩|}6ikOsx`. C0"fa16 &*EZ^?XsmTRl]’=m{4m9-7Ēr;|K5I lĚx;gD#\[T0pɭS-i#R=zwwJ)RJ)RJ)Rp@VJt7RQ&] ʋ'xwy>.1M3.XC{g{(x{Hu=C$/D*$ƒQU5{4>~P(Iڌu_/`F)|dnbNTckPK%ƚ=gurv/Zc*K' Zc5S>cZcKStIXZ[6c珧ɶ?_Y,ې3R52z'Ec2R#5: ,4KkH.j}m47 |-%  8 R-){?S NnHKF%f7(N<T(Eh\6 F{1'98WcĔU5?;Bp8>AKLO'$~DO&RW>DJmBzvzz`&=I?DzDJ~ޱo P唛/1k!yzIzHOID"M!4$Hd?<<vwÇH_Xn]5 ȗ$pw6l~$-^ydhxp}J[-"mK/!9ºݶ^O!=ɥȰ). [sLݐ9#vכL@*7GtG杶Ҳ9'hd>lC" |;6W<xrN0: ?C"B<llʋm='kTDN >\q HY BI(rMmiJ/HbCrsƵKj/!$ Uwr*rv3)tR(%**Okm/A:-g+9~R9 Jg:TMR-p dXKϝ%UekRJ0+a}hR,x /GTCOUCѶR~+n,:cg;asAu0Quyy^R)_^_ʟcö"G(50vq(Weԕj#IPe gw,JMۏIMև/<9]>93رӎW}Ey|;tOJ]5>"ti\d:=&x1ƾgu+ |~ǡՆ:K7غX[+m`Ra>%_j. .BJWG㈕bcuXT3_s9úNj63x#qJg"W.nA | )W5IDʃK| RH磑7dԡ PWUEM1dn[l F,.5w{R~wnW)[)R/I"=Dsld>)^:9&L;H ϑYZT*2#^izh$Gw*R +3VwC~ZV*jÈyd/4c,;)MѲi/WBNRY'^i#/y-CN 2whiɜD)|4}r냑LX-[Z>KUUL6psq-þ7B}GLeHuEM U6oԛݾ(n(|?RZ>K9ukrMɗ$hfٙ7\e9٥PC6L,2XS5k-~ǢZW)-qk5u~8D^JUYEh,k~ǢZ.2Nia KS paqIiʷEΟzҦWbgV5ƚ͟ᰱ[$[k"m(GUE!P85n.lXSc-`6T0}=e00vzi,px+Ʀtqk᷏\v_Lsߌ̅ίڊeˆ;/Iuns]t4`͋%~lM0r`xR*+D? #E hp=°Cۖ"iR*)q I~Bۑ*〾޲B_F~TIBHhOo`%0irLݼ.b:OuRIɦ +1ChNE&ӁPznEJ+qZT5 Dv.؁&$yx2gwRHp;;;4'\.H.2N` ћb#nRsOWl,9л2f`; ;M H'kiSdH'2$LH`5m~dNx͋{)_dr> :kDe+\ >t5{7 LtNɆ ]idktkfwŒf>w*y 6Yc T, Ng[cVBWN,t"V~˻$=OKx6#_u_OK޸v{i)×p/06'J7ϛ_l뒩 Ghro#?2i2s\;oJ+_=⋌~R!:[ƚk6XT| 46霉e.^L O1AFȮ/Ip_XHOpJ]p%cOD{9XSC/j_WZޱ&sey 8q9 ڊY{cOp3,d `ˆ6UaѺɷ$h=&`͜L7-Tq{ ]RJ)RJ)RJ)ڢY;1ZJKv;5=:lN JRsaoIpVZ~lZW9qt`]3Oh;1,:򪊚~o 8fo?p]=; t0XTyZbht赳Cu~GYb&'`O~c\w,KM5{&Z6N[2rS 8C_z 5c+Yߒ`cNIM_zO{_1cM`δP*X`ʅ:T']c} U<ܦQ~ơ ZXo[1f`=;O gJ)r0:(牗L/-RJ)RJ)m޷*{[@!U5GY;埒ƚg`1uC5 >z%;5w5Zxv;chQrGw_X=zHcRc1 g/;>㸠%ǚzMoTU\wL*3fם | ׹贿w<*}|:uy ߿_~όlq=\p܋Ԍ}Tz[^ۯa͜ sg̘?qjnrJFc,lu~Ǣ/ëfu ;f+{n>e=cZqQj7s& h)*jg;YTuww *dEҩ k^xR#+w%PGUSuy7f7P*dEO:\2O~ǒkfzs-j}K2ˁu/{?OQ[m}3J/}oo{)w$ `Lo?(dhLQlm}QQ= ܛx:Bs\>@z._ Bzː/*joٿSe@Чq݇8`t\C/gv> Mg(V[h#zk! {~ =߰Ca=ݘrh{ yY `;(0-; |B| ?yBb{J` F^6QܑC{y 왠yGƪrH%A-cI.^E3/$*hy|!Cwk#^ڲl* qۋq(tjyڞ:VʻˀG7/#%M,uF,#/  0 j w%|žA\ ɴ7D%tٌLT"n?t4 d.u0udkFdhE6] OnCJVuyw%K5Ȯ(9hNfhK`d"2$zٚw0ͻ~w#Q0"eۢȔw!C:dx ػ]d xqG9̤eo;z|—$ "}%1d.28utNPV16<>zzˍFS%VG.8C_mS!^߱>m2{OB`˺^=7o~{Zr8ʲ$=[Uj <@~TrnNevXXf\`dس.e{ʖ8R)[qyuH=q(J qY7VJL$*hRMRiTJ4MJ :e}iJw'GMFvN~{;Wuw2fwcPVȥwd ]K6>L5mbڞ'`ѶJJK9h{45sc^;N#kTN$wJ pQ֚ d1` UhT9'1E]y ~wTeu,ya I0 ~; ً М4|mRջ|ozuIeSȑ3JJKb- #1hݲsgS): `K&yCT-Y2c\`L^_+\p~~7g 4"든:;Bg3_@N3s_ki2.]j=L}TL\#k96Ǯ\y TJe}OPurki> PMU`yZع4~g 㠻ĨIPE0ۍFիg^V_tkYn[V=[Tn@CگgZ5}^:u-PRH_K8|OgLWر+WμׇJJk8tYeˆ;|RV6@0Om  +Vܲʔ]ةצG>)-+`^V8B*495o88ŀӿm7BNrR[I0֌S7XrV:m~ǤJbMU0~U0t߱Eeeӫʦ70RQoXj lNŞ {Yن'1\9~Ǥr.4Y w,d=Z3a[;&A% o!k~ǒ+JKY\k@75V cR*[\XPZzc@gTYZMYw%%[RʦoD씊)Ocjqii׻Z%WϼfȞ{GqοGg>wLJe;MybР+65|lpcR*@u\WvFk9zoR"'wVUQ1e+qXV\\3R$`UEcͧ%JK Ou4wLJ)TC IDAT~ǑAf3ʦee Fv cL%0}\ vڪU^K+ˋ$kgƚ. է5ʺ>c-Z7Wu1)" dNrWO: p.]vd-|y;&A^$Awt߱ǸDZVy*~OW.?uNN|i[?;&I$ kƚG p0Ok˗wLJ) l/ʦFcȑ3J֯t1t0\ylcR*i#E}KTcr-RN{Y}z+f.;& A^mULBk8MVURIgW`-/ykΦ/}WR$ݕ U^㈥iƸmժ__IBIeQUEq~Ŕ^[0wZkzAuA)U~pu0 pСvں1kիo1)U'5:;~2h{lxq=AR$8-TYk1}ܗ!MMQ~E), i 8x@yi~_ZzX)zL}QQ>C)HSƒ3\Mc(ЖRz(U:\v-*ӦMەW_MwOs3qDnFy:,կrꩧCqFj}YN~s=p |8É'X_Lڵ+F⦛nuێ;0`//G5Of~a6oLnkGQPuxNk׮|+Vu믿kڵkg}5jdoߞtK.e…1mݺuץ-믨`|G$iӦK/׿ӧ1b<֭KjڽeÆ ?"آu$ UJv2e ۶m{C իWse1r; G;#)..5uw0}ݖӧz+^z)p>,o6cǎ:kKkXϞ=J 4)Sp3b>c>`>h֭[ǓO>ɔ)Sݻ7.^xaR:t(vSNeĈ,] &p衇z-_?(UZk <0o޼6lƍ|8ðaÒ`}vѧOo?֬YêUZFoܸe˖1|pzìlٲ=m0z'HEAAA.cd Bb Z &&U,9r$Gwϩz >z]ט)O}qc۶h5ey,˨ϳ.ހsDl\&@j"&@j"&@j"&@j"뉑m< `#pi"ރt6<> IENDB`Chart-2.4.6/doc/html/tab_r.gif0000644000175000017500000000503111472272372015413 0ustar reinerreinerGIF89a,薴ŝɯͻ,,@pH,Ȥrl:ШtJZجv h d@L"F:򑐌$9 (8&Nz (GFB^!˨)WVl)1 w̥.wY0Ib|Hpf:e pJ}Ȧ6nz 80%"8v~ @JЂMBІ:D'ZPKF ּ&16юz HGJRb L5Җ0LgJӚ#(e>Ӟ@ PJԢHMRԦ:PTJժ&5;%Uծz` XJVCjYֶp\Uxͫ^׾i)$Mb:v, ಘͬf7z hGKҚMjWֺ*$SPͭnwm +Mr:E?9Zͮv9" xKbLz^A|ͯ0/LN(; n0'LaJ0{/{ؘG|(SCr. v1wc6@LdHNd/PLeOXp|+s2L_153M5t3_:wsgʹπp?/FFЎt!-JҖ1NӞuA-Pԝ>53UWծ4cYZѶsA׀5,aƶ3=e3~-3Sc6mo2Mq>7ӭn$D~7,y1m}v\/N3#S\gu-mO0C\'_S^|.c.0ל49~s=3d:u)?F;ˮW|;W)vt˽w|=xA;Chart-2.4.6/doc/html/classChart_1_1StackedBars__inherit__graph.png0000644000175000017500000000742411666706744024424 0ustar reinerreinerPNG  IHDR{pbKGDIDATx}PU<"B'$ Ԍ4xC3!05ӄ5 Wtnx;NV| QOǮrfDC]FX<ٰe j̞oo7lB!B!:Pc]{Za4f`A/G0n! ЍIF$t#aWswr' 6-P*{/AW+5=U>Qa<>qn8E NM`6`t\~-0}tOw}d DkQON2`1l1PTX(_+qrhuV_j}ٚk@]rG:Vho'PZ=#,jC ǿNqGP`"j~NڱlVr-%G#ڏA?j}yC90s9{xwn"P/pʓZ=QdW`ЄDV>Ԯe0چ:jEY{i q(_Nu| z2u6 @mhn0،ߠDKz Uy>O'u9dg G3WWBc4u* 0 ,ԩePrԶU>q0}c.ZFׁוѬ+dVGF]h2Ik"j@j<ڦ2;jpk%QCc@&jD]iێpVv~B}*4wsi 3zXm52 A*ON#D]tVwV w˵0Y?XYЎV~ u} u܇}=>2 SGP¾ѥ0CctL.hoΨ# W rJnd$\& ЍIF$t#a0 Hn$L]P_IKo|v{CA}Oa:$w}ݝ|c@QO6h&_ߛ`0JJvgfd5E |$996 |E|+fw-qR OQ0 Ol0udri0\B#V:bk) [Mq 1FVw&+ jZilj#&\_@|v{FAу@dESamSjvqV0P@ S;MMʋw0/:0:Z#MM}:r,蝯i9}4od2ɣ>keee9sn+;;oooٳg(  ׷MX9dӓ;wn:E>L())rO?͛7ӯ_?FEII 1111))):FLΟ?_|A~~>Att4']F[Dbb"za_W^!++=Qf]k6ٲe DEE̾}x>fo3gO<;pA֬YӋSG rrrXt%H^^^^www}~-s!22TE歌 ,X@xx8/TVVzj=JTT111TVVĹsHOOg͖6ZihhMΝ /@RR??̘1%KX!Ea|ǖXPP+9s&-"##R̝;o{89|yW_aa!;wd֬Y̘1x***lenLx{{[]L:7nŋٽ{7,Y3gDjj*6l ,,<∌l6+ 4ŋQ:t(}ٺ?φ 4iO?4ƍ@BBcφ Xn&L`lܸ{ZWm۶qRRR0 ֲf.\G}ILLd2BJJ ׯ',,CƸq,ɡEQ(,,$77TNs"99]v:77.Սh4燿?899F`` FӧuuuZ oooej4]4iR6ڗ'''o-[ڵk ݽ1E?Oii)5̛7R.,,l?u=e"Νk[WW3s)//o߾$%%Y=$''Ntt4=/^dٲeϷzŋAHH,_`=zez '?N(_4)&4TЄДRy# m S)?] Fwaw's7Q~ @ Wd>F HrTJ]Hhf5H`/yF o]Ԙr7@3\G} >kF`P }8wb.0S@7$LBț5(BZq}7jdl,F`Oo_߯x <]Q><7rp~Oǐ{ `0i\"0dB-ۉ$z@Y$ύ}g `OOXN،$JsС+ Qo'zH2-k*_#ߚ,BZvQ=;J/;gI{29oʻJ WBw{O?$~SBۑ޻"Fy#6/" z&ٯRkp9WvtTk 82| ;0ft{o!*4۽02T%,x _ C Qπߦ-S@s1?${-󖿂$H>س#=#k)A} P|PnE(H.=?uP}v?FN=9@Nc p@ dib~@N[T}vJ?S)R*P~^ yL)NU(&4TЄДRyCR*ohBSJ卬HhJ?G;XJ*j* :|yh͛[l?/o¼Y~2<8o޼ڿslOq䫠r~x'zENsԔeXӤ)HdmM4; Q*c݊$zhB3tY*t*j},^;?w柰#(Iح@W\\ltt\{EAǡhfW-tJ)RJ)RJ)O#Ӽ3 ػ po͠R9T4c(h: 'π}FИuMa_e@FNKI]Q{{-к@sc ZYA.%sݜQ˺V]]SYб䣌X1͑??;Ymeݏ2n6 ̋{#k5"ƺ9y>oHi c/uU1 xn/! a9pN̲dgr45 D_@s "]<"/&ȸڱHe`10pz}8 ϻ=>"5n7)(;k5N\ZR|_@? k \"_XѸA6?"caK#UY${#C -3cۻ7!I_l=$WEHWehNƻ9BZHᱝnt rxgg-󱏛-`?  5|u>B(}.u0EH/˶(bdfA39o-:]+r)iQI{ {s`gZgMج/A~F@}JؕH:rF[hMGQ'NCE NB::V;jR)^7#⣓}xR+T`2Q>h`G'Gd"E@MG,7Ȅ%HUjct5G -ːmCJ$\wp#!S!{R*|Rt6d2irkuVkz[E&"5^EjIdкHW#AHOGRU}ZjuX巡u_ti*Ь)GcH±HTJpi F' W.V"W]ҵM3gm&qŚ.Ҋi.ޭc+C.iq2ffZ5)_=If7 ^GWDlmq7];F-S[Q 妯BRu2)[\F/V-Xect3'=^Ըk-)rTT)uzvԱ{{w2r'ZO#cg{#uB)[\])>dgCZv{{"2droܷRigf^WJTR9O0f^WJTRJ)RJ١5wUԏ :ImE'_SuTf ̙4/bf'ֆϥ+AҖ6p2zCQYۃ"-Y)YY:1]AҖЊ$K&zuh}Fz>: 8<#MvD_oz_uB_D m 5vodzNBq $lO2 ]W`Fز~3.O1eMwo:)m [F M0 H{]{LZ!MWuA7/vK P%4rL}VW+]̋#m[V;ߞd庿 ,CUml fRS5]ivv+e |,H"KH٣sI\.c+v"O$Q2s+Z'-܁T)/^0,uJ٣_/]h|q&vOKqR (,V?HkH2U78.AZFbk%dګvr ,CJER |rEK|L~uM#_Xoyˑd2fYO.Yh_!I,M٬盐$u0׀3*'<_5 x֕^{vk"+-Ϡ&¹HV\r?~(n~DNtAOoc;eHE$C3B˕nAK=|vR-zV -T|7 G"?D+[SSp+%ԑs9uW[pZtl?`])ĝ1To\μ|AǓosӚok&C᯹NX92k:w>\pؼYt('=G9)qS:,bl֌OKJeW.A<*>.-q[W)ʐqHkaf?RNd|m52;rqϑ.`mGA)'BcyRڋ AttLR*%Mh_dm:*&.`l]B (P/o/iR5WKNIu($iof2v2cMQ.ʕ g^X3͎ -M|=iwƮcnRbҖp{چ С+B.! fCa3{x]nIqAۡ!1&ka)&TXb]N'#Z,I[\w_d*SW.Rс9 ;PݞLN*~r=Cשl+Q B& }ek%گV*8XHrZMKEWZ5#zt9dek E 1FKL*?[^@ 4@!JD%T~l %o~v %{ʽ$DJT;YB>Igzy_lֿ8&* MM.O#ce'|r=ˮlt"MHKӍGO$ٯV-ՄUϯm2d\i9]eL`5߈$qj*13~PeT'_{ؙV=6{%Kd!iV2Tj x^tοn5{Ξd8(2,9rK~> gZʼn$,Go?ҵ!09~G]OoISLY;iOݚʺt걡5)9ȩJO8o?{g0R ?P ?|MfcM!]ڥc-UOMH-w̓\4̶\'U/ mΤ9E AXXӏX2HY؇aU]KB۲bk"rbfg493h9k5/s)jFsP\P-ۀ~ĢTW -|Ih7rr^#9Tqw`%fUΫxݡPJ)RJ)'X-iHҰ팽Ђ%U6yyga{ϵ|Puˑd;,OWuGH@"R*\nK'p@h o﵋>JZZdh7 H5D?0B~iꁪe~g :+9$];iWmeݍuY ݩ@5J/F-]V ?{_D}n/fC} -E?c}T'y:e݉Hkh&|o!z$dm2n;{]~$Ʈ ?_ ׎]|P9$jnȇPB?O.CckCa1KܝOE[v28:tTAU?7-[Jv1Kd Q৴~ϓgi9uТ\zZpu~~},r&_qh <yЁ״Q{>nkcۀO -{Jddcn7!$-[]lTdHHHmHPؗfB"2nOB܌N3w20cߟHK܌ J峲ǝT9zI «VH D;٥u|ҭ i]uU#z?sQ;K9$#SoI~޲!HR~mHwv>} %l qZMd#H;ua;Z;w؎mK<$yB[ %{#{#=NUN} ݡ:ʺPήZ4в}t i-j+?8%\-mƏ $`RuGZ'{ww7]Ck޳?I74mq]'^Akϟqw{ya圲KxJ{_N|%D'wJoacΣ[Hv۾3ךdLCWQU6ƞZmg]бH宊qVtJ)RJ)RJ)R/2S)nFT% <6>6N496\ 5GQrZs -`;6>uv(;A*U}2$,,TYv2 qօ;ӦEuA( F\-$w G!y_I2vLV?d{?C~DuCޫȅ]O )J.'4:=.sKvu[Y.zH}sh@{*R/l$%z,cH_#'{mD*/<=&Vz"e9j9TPfslsFcsi>gg<^FJB F&I6vemh{ϩTqݽFJ+?>t9`9iy4why:@ؽ:i{EVeѶS!^GTkQܼuX.JTӯY_Y4 |>-\QЁ?Z|r^;1vHCjp&>)rђ$ʢYHaFmЊBcRj-{By85{ITQ" lR/H)ȥOa?}i] gH%qXǴH^g's*(;>_]{Q)0WɜBI >X ժپrNV%<1'/Φ}(RJ)RJ)RJ?QG!Z]?Q* ؒ;6Tt,ʏX_x~KֆoՎ]|ːVXw!',GN X UZMe]/WT|;(K3`~Lc'!ur7P UW[h|3aU)Jv/YHPt̏.8~m6R5 `.:$nY{egI]T# ZGM=2zҧdZ}寃Ae{^з.' E cVo 4[h]SK;lc_7uŖ~ f DKcht>p&ҥ٣niu` WygīD.<$fϑųȩ%wz&du6udWz?$96VZ,w{KANn@ʅt)<++KEO5R"˕W c3m{LTT;[oTϥ(隦PT~m,sP.w2(Vg:MR)zuj/ӷRX_6J)RJavբ)AǡDcHQ䡦ȩ,:|_A)+\hГj@>@e$awUW oYS*LS5:%|a#EN:=mc/] ;?X%H?\!:~nW)?YcOM Wt,Jdc=4.Y6j ʉ*59_:X3cLGʪ4ʄ5M|>\!VϲJ&4cÚCD0VZRB31﹐m&\g%H$iNi=SykBϲKڀ Tms_:ˁA1WR- U\D|+HcDL}HHrŠ_nݐ'ţUJɌpMCq-E!e{ywB1E @j}_^ݾ縕Rj7 q0- -!b# |z)rt} 1Tm#$*a +NDZZ@#F5#%{!EjsJUTE Ė>uː/"l *F+ž0rJD%w7 t cmw;(o[ow{o䨦 =(bvRY6~X7+A;F-S}|\©K*rG2W$RZ: T֕`9ӠcQmRB+k*W@lSsƚkYh2(1ȌDKG9-klOii۾R)2֜3-\cQmRB#7y!6kLwr池PdGB"!xq,ZO-P%HT$3H"L2 1[w"R8zƞHUZh p.#h[bZoo%^L'"մR(*~ .%/MhgnKaJN <k8,bv~$1ׁH!-r-Coђ<z"%8Mhʳ‘bRkgGD/ 邞eTm(|nm(<38T4q[H'$޺_O -v&TҭMu{^xq/D惋0vxA / }U:WWeC=;j[2[>ʧXwa] Gf]|ZUC~vupk/Z:L쳋R<&Zdz1}ڸeVy?y#):k6oLбu9n1Ǐ`ٱ+=mFqI@m&ERy6[s,eQ;E-4kvXc3rW8;~J&ZT͖8r]cXcMuб\NcZ4p#랩}R߶Ջ+^ :1]Nh5s2:@n6}biF/cЌ+o>ēԴpG@2[)_M*:q]Nh|cN95q3zJi᪦cPٽ[P*Z.RJ)RJ)RJ):tJnfNq{{?xTiJYsPQ퓠CQ]kx΢y }79c Aǣr cEc_Zh𭵡~l";Xs۰MHR X|*w:`!W'+ҁ ؋g/\t(IhƮAWLunzk.In{NqcQe Z޴.ٜQ]zav(<{=rюBT/:W+>z|i9kc[{-ptMe99ڊoԆvΤ9E 6~b: /-4l+ jѳǼ~@q(OӚ7q4WcǦ~=>vyq(KB3i#81RJ)RJ)UPj,?oQmu~\q7~^"OcQS gM:ƾP[Ywqб`4ow%?J8bMme:cρz4OK٣_7O W*xTD `pÚ9<; :.v;zt,*|Kh_ hq"w'1+k+:6⮊@.KAL}SMe`:Y}zZՠQ0;>3u&_QфrZMeݡƚZؠcRstҠq任Cƚu{LiBKcƚk+~wբC'>!.<4Xcy ˙^b#%_.Y6jK;{mhI_@bk]86TvЄFk2nEu`GJ"__ "'~Get9Ta0Þ>4ygqp ?8v{eL_V J)v ,^SYwpR5OoKl{2c?0ë~O"= TB3+w({ۅ`o]k5vYeW=wϑ@L:EnrO׃%͙4)OO͘|o]#vȓ m|T*rچpұmjO>5{iJ)զ>]宔ʴd @OQ: h^8:'p.p`eqϝ6O3^>hpTAzw0K X |X DN §}u9|x˻O.Z. ;:uowBՙ' Jlk(Ѫ{C(#WHwo?#_Z v)8HG8Mn:?V'}\~Q[h<w?kc-Ƙۉ^끵u(ҵ,GR|znyN!cC{7#_Ns8&`50(InGĶR18:Cm݀us:pY̾onDT6=ZNNSU޺}ǁ{rؐPm+d lAXKiIhŬW| F _ʏa ]G$)MhNN4&חhI">@眊H/?m|[h! m7, YHL&1EW9n~ V.Q "|QʑB#km= iĖ,~B1s?I=|iQ>ڈ H]U吴%;ފli kp߱_Ήȇ;BP<%tg ^B#y"07nُ1'x|1t_ۿ~B_7/")z)^b11v52/nFOR^D>/CH?FgHߎĘ.nv-;T+/qW"c]txxI\S3rNtGL|ѻ 邞ށؕj_m(xM(p49MLeȇ8joko4rT,zai/z8JUn::B -F[S#@Кi%;}`&[wx'= oyi>$b}%r yd\nch}5 5|ءI*7ڻ72fH=i9-ď;ТDӱVVG~HHK$v= -ǥn}Me9ƚ?Xc{O W `74KH9ȗL1~dvnQNKL7B%Xw[cjʒ8R>KwB{XPdlO$#KEġYZڴpU-SbR*m.RJu&4TЄДRyCR*ohBSJ卌னDZ挋+gfbyjRvԳ稽{:HdӎL7 L :yIhuʭTmZPm΍SLҷ8yD"R)Ih%-l:TRMV!v뛡C; BT/cdbܲBj<6c6׆oX8GTV6gs; %[l5g\9C9/`}T :}1Lmn;`z];v%fk Ys#f\kŷJ_=rS[ʦDr1`1tkg"eUXBkPT\cgg2B6dC#]Lfd-s֬(c*峌c>6_'@On{=̈́ﵵaR*m2zbqX&Y>f-Oi6Wm +մs6lj/k{h- QXk̶}Wj*ԧz5M؍Z{&34=_iiӌ1?4K׬`TᗕQ1Wy ȵ5EK4TЄrb-#WY'^5NV{qY  S)_߰aOFI Obo}6ߴukSq븗{C>6aêwV?jԌf(9mv̒QEYcCUC2:074StlL@|m̨Q3VaJCm?A*@$ɏNXx876l|8쩫Wϼ7蘔 J`G9}kjAŐ bFXHqmhϠcR*H% {»T lذ++b D\׃Iz1!g͙4GO逡Cb,۾:\)hBsy %ӧ_}uÆ>:&E j$(m<`ﲖWy6\Bruߺչ3uf?R(sIQ>ukߍa,YsAǤT҄ņ.ojiO$bJh,UZ:YTdi2S*9MhYhȐ+N;MMݎVR@Z:tŎcpCÀS׭cRJuRMec:jF\U-ʺ5 g`*t+/cذꇍ߆YR(cc~.ZбdJY=7>g9ZgBCL`RU 5:X2aȐE"e`k9v͚䕂 qIDAT[R,1v&ƎjQEбСwđkܶ,蘔uY.;lŮ5yJ6z1vغǯ[7!蘔Ykfb5uAaê/44ڵwn :&EV&;?l`+?3[e1溆Q22M^6jk=t,~(+޳9%pշtLJ#-fÆ]5ZqNlhB1)FMDS 膆YoR,+`q]lln.>a&3LZV̵[|ڵ7 :& v9}VZZ] baz$SуTTZZv+ˬkM)Uhr6-9X╕M؇`-gY3ѠcRڑ:AkȐr];8NdTpr'uK`@. :ïu݅HUn]tLJIhNJ"z:s+&Yk^m'~o> 2ȩv£c{.D CV_myچUg^]-8R˩yk2IEÆ]q1\pzR%5X}ruCZfԾRkSPZZ0qU3Rklt6~LQJyR)P\\̵^Xn909)'?ǧ1`ΝtJ圜;(RфДRyCR*ohBSJ却&Fz)nnV}Y\`ǎ<`0Z=|'ݿyf~8/.TAJ[B[v-SLgaСߟ{GXkٶm{/ihhHy?muVz)_bRJe^JpϜ9#Grua̰:38X`Fm_~z3tP?R*ii] 2mڴ] `\s5g}O=gu&LছnzsΝ˹˗%o nܸkg}SO= .7Kҥկ~k۳a~i&*y9&L7޸s饗r'oՉs'N䤓Nb]/RB{w4h{nˎ;8֯_뺼;<|L:O>#GrM7ӟ#8~j&L@SSo={䦛nb\x\uU|>tm>oŋҥK6l?k׮eԩs!o}[vm\wu :m۶3pw0p@nxOKJ - m۶m+uLBqq1Æ [RRRw@ii)lݺnݺW\A0ЧOuQ;U͜SZZ~֭[Yp!{'N &0|Ǝ @SSz'?T*CҒc>3˖-O?e̘18Àv-[RR»Kmm-V_~,bo͚5|G}ٻ566rG2n8KӧUUU|[jVJGZLss3/& Z2h ƌ,X=s9SOݵ<>IfZ^=z4w؈1k-_|1_|1_~Fmmm+UrPW^~7?u… yW0aBǯ]/| =qXl۶^,Z۷og˖-~:J.]ʇ~H26m/"󟩮:SN9u֥mT)SuVP^^NSSk֬/gԨQ_}\qú;m2k,.2<@}Yz-;0nfF׏[YYSL/栃⣏>COdݺu<L2~7*&վۃ_җι:78p@ mooOihhhqFVXȑ#۷ֲyf֭cʕ <]755osNFj0_=s}8CT5`***:^zQYY^{i }TUUu:(cL `  Chart-2.4.6/doc/html/index.html0000644000175000017500000000103512033071320015612 0ustar reinerreiner Doxygen Documentation <body> <a href="main.html">Frames are disabled. Click here to go to the main page.</a> </body> Chart-2.4.6/doc/html/inherit__graph__1.md50000644000175000017500000000004011666707222017602 0ustar reinerreinerdd92b6a724c4a1dd5ed0f5a4e354c75bChart-2.4.6/doc/html/ftv2vertline.png0000644000175000017500000000034512033071320016760 0ustar reinerreinerPNG  IHDRL10PLTEӠtRNS@ftEXtSoftwaregif2png 2.4.2^G&tEXtCommentUlead GIF SmartSaver Ver 2.0io?IDATxc`0O[!<:IENDB`Chart-2.4.6/doc/html/classChart_1_1Direction__inherit__graph.png0000644000175000017500000000641311666706742024151 0ustar reinerreinerPNG  IHDR{{TbKGD IDATx}pT彀ABML `0)QY/BL:E fh)V2{ŶRiΈMmibRPA$\&4!B|=&|}{swsޏsv7 BP( bdpװrwl~}_w{! (%["lP%BɖƯPl'N "y=ŵs,wѲj`--< Ѐ)֯IX`D`Lzpx!@+0~;`aeo)_ p "y'un: `~͵\W_#.F`| m/L (V{]}?!݈q~ڀ? ,}ltս|xq $}pN_w4>_vz.o\x6>Fm\w;p?'uAZnuu@:B<.^~Tsc'D=<LELH"f#v㑈67}V:͈18H N|B/cvbO|.<~C 7A'BX_$ n#Z<4Pc2@B=vKԾ @\pxqܮÀw#7KBVq &Kߧ}B6]/V߽| O qq۾"z?0sdb:#% [@u8!-z>ӯ##nV%["lP%Bɖ%["lP%BJO "K?es{PPxDHȤB@g qq@366茆lu9T/j#p}m7[2F"jc8k\D@&SRM#Y֥HNid!.M#f3f*F a2gFgW<]!_QÝQ BvW0h9_i /;!g{}Zi8!EW~rܯi}>) mI||aK*@H \7:<ZvbxMc@մ}iE??7Hn OlP%Bɖ%["lP%Bɖ%["lP%Bɖ%["lP%Bɖ%["lP%Bɖ%["lP%Bɖ%["lP%Bɖ%["lP%Bɖ%["lP% cMETnlΝ;6ŐPVVFeeeu^e/ZhQ !^e1["lP%Bɖ%["vJKKE4RSSYd +W{z[rE4M#**9s0~x())aʕCp~if<>CL&QQQݻ[p8l[K/Dccwl6sy***x)++jRRRܼ9T1_Z={HIIahxpsf*++>}?p1/_>m^233]>]vd[~Nm69z(ׯwf˖-DDDEQQOeee^ xba˖-:tly, TWW~^xWXx1&MVmk3g7߰a.]#|撙I~~>uuuz/ //L֬Y'|K(((x^eݹp]]]ֲo>gҥPTTĎ;3g555l޼,9y$q-n: 6m&L`ԨQHIINUU@x111]zW^y/۷c2?~<;v`̞֭=sNy 8y+ϖWV~i6nHFFǎg7$<|3g5vXX.]6 ZXX˗/_ѣ|駮f'2c Nf 8ӧ9~2A/_:mĉ7o^NOO3gθ~z>Lzz:GbPSS?)5k}붬?[}:.\ (..fӦMƪ_͛{p}tt4*7nnСC|W̞=G`޽H.\c=o@^^?8SNٳxb4M###\nVjkkyG gddkɬX|Nӧ{뮻 Member List

Chart::Direction Member List

This is the complete list of members for Chart::Direction, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval() (defined in Chart::Direction)Chart::Direction
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Direction
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Direction
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Direction
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Direction
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Direction
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Direction
_find_y_scale()Chart::Direction
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type)Chart::Direction
Chart::Base::_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Direction
Chart::Base::add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Direction
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Split.html0000644000175000017500000001373712033071320020262 0ustar reinerreiner Chart::Split Class Reference

Chart::Split Class Reference

Split class derived from class Base. More...

Inheritance diagram for Chart::Split:
Collaboration diagram for Chart::Split:

List of all members.

Private Functions



private _draw_x_number_ticks
 draw the ticks
private _draw_x_ticks
 override the function implemented in base
private _draw_y_ticks
 override the function implemented in base
private _draw_data
 plot the data

Detailed Description

Split class derived from class Base.

This class provides all functions which are specific to splitted plots


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1BrushStyles__coll__graph.png0000644000175000017500000003760011701115623023767 0ustar reinerreinerPNG  IHDR dM6bKGD IDATxy|gCPN5 ٠ՊZՊZVj_z$ZTW-*T* IPTT<8;$,lW2x{6gPJ)RJ)RJ)R*ۘ|ƘkڋN9Y^ǡZ`s^&c̬QF]u^ˏ4s~*v1j1Y|S"&QF@6|CPQc^̖ zCyR*wiRJyFR3RLPoS[~M<~50mW!R:W@_֣OÛx|2oz;?oUT'π.g ̔R̍t"a`;i N^u=L YO(r| ۝_pm!Z .WI=p}ž{9 x Om7^N$ BX +$ DAc<ކs_8VgYN,Wǻo*\l9G{\!_w78'^b$h7p'iiu0p6zҙI :y|$*soGeo*3 {;{X!iQgOUh@!SH .vU%@`E Gbρ=76Ep7@ n+J@¦D9 ?grȴIۜ"7Apہ61Tnu~_h3:g;G:񼗁a ~Xꐦt똋pqRD{ ,@:z>V67rxNH!AB"y:7#L%G%H2ZВRY/{ =5ۙ\!VC8T2˰m {M ñHY!W#o" g0rmUFenA!Gz}\x,! e&៛ 9@:c:v}tWΏRFTq95R qob|R|\)M@J)hRJyFR3R \Z:\:'^;WwW[2%s;*;Xkϟ??&ORlsW722-fgugF H=kwR'^2^t]@ ՠd}^ KI39cx%Ui#nӾp78cuL,}@%1EQacP*5#,x]JЌC`W+,h[k3Ú?Q\y!e%f|U_ҡR^8yRQ%I7nIM@كWRT/Y0vǼsqe$?4Uu Bπ &{RKz*-)okH҅NB 5O1e' _ JS=[& &{}#~IM@e3+XM@s{"F {oGƋزYKiZ Hyu!k :'JK;NgK\^g@m*`H23qlyab<0uzO*C$4ϚS-CW Jv+R:!5!^rO.DpƮ:*>`; _H40>` P,'l٫ρ]H+LJ$V@]$6r~LASЁ@9ԭ^AZk!b(=yg;?$g*(M>%݌ˎ*Wl>xZ*LW,++)$ >V RDCͻx  =]{WHR`L`~)lsq3:R!!I* 81 =0;p됖)HFIԗ9<IruFx~Pk{p&{R2--){KJJ [8k%cH2 @,Buߪmbנ]pe8XE}ȇg=p3>*$IV!_GZ!pgG8mX`jC$q+~&{R%z׺ITЪ8 ?/y }wƍoH m0aK: (xwn[VV_`# MW܇|@rEHgg!?"-XF9 杵 }m]oSJl谣 XwEM$ k`$6}-m6HLW꿍J Bm#틀7I@/#+o9 nmM>ScJduBwn7IH?\ t7 ,@NcoZ$$ȡDS@Zi7HЉt[8񾁜LwΣ]o2)XcI}u;nG"ʐAO@%r+r6H_ Lpg}lEL^!mFnB>p5_mH!5.!.o#gz53w g~5ZmzCd%cRi x*EkT3șhp oHT!r&g s 0}Ocݽv1"g'<֛}JKS#[< eJ5I<$ۖp׽c6{]d; >54v'T⢾Ʒn^l|[ƥm:RJ)RJ)_qt^ǡ ^ mr C)iGT|x.S]AaT_I|V`RHtd WL,u,ȵPUG6{׭uk}ȵC!$\sQ:5i\kauB\ ˸FjG}HBK~S-0v bkSZ 0lF3=~aH,k^H#cdnQW:U5ֱRZ20sc¼IA輋XX7Ы?҂_Rv) ~;D$d$dyvG c}'0 m!gK"ƂY3%:AKzEG4,˺)^6)RKy3+먯w1 K - Ky;Vk:xGr43Ǝ 2ܧHaz9Ae iuCNFq0rTܙP/%YsU\iM-7֕ "-_̛ 7,kHIH~YGUgN㻞f۽ڒX`yx~(AJފ*F@ʩ? Rz$!D%fDZ] Ev:Z:u3rLPZR^ؐ],6kg)MH$d, mi> |Af}6r"qDnQTBR:j+X;emJG*`$>_XDrJ*lڬLLKʖ&,R)K-MfYVRJt8RXYckRR*!-fEbQ*@}r.w _o "%]Fq1,HN|0KKO(WҒC%ixlCȽ@ʫnuDJCeT̏T:5^UD.&ߜ^$:ӿBZpmi8$qek_:Xry-F?B}.BZ/k ,rT]-Y B>r> x>5ay˹7^Ǒ4 xU hƒXt9A?R"_IX"ʄoTtBt"7 eVOD.;hT: @jBm[p+"|AT}bMv߂E/Ϧ> t)3 %Vc ~,J>ԫu㣐N蠁ș‘qnS)wg cz#eMXGҩ OCnUu3_oۣq+>ʒ_P;SQfuBO5?1֬w;$jI9U/%wQJ@ݫ:7~r<ɴ9si;S1mW^&Vu,٨Yg=`_^gFT@T%Y Hy=-;v(y@jV@rZfB=^Ǒw!5}rIռkָLjuY}0ފ*[TA˪ 6e :ng;D/ŕ+VxGұ` Sa%&Īx' P|]#UQgxh#UilbesΆJ]ymw8TV)Rh8UQ}0ZEhUë$F[V)bLw"%9 ({R#H-hCF[/h0+H*!GK|U8U5z1""W 숴)+"r(UV1*ZQe M@ŪI*Xg$^}0ZED4&ZQfKC gX#VE1UtV1\"*Zeeŕ{GEu@VDvhUiUc-w8IJ@5`kZVLg:|$>mgk;zCZ ]2L@GIc|Q xKjQsUA{˜.%w\q:9+^!+>з.Ɣ~;6,>^ %&Ľ Й y2 _ hL8[$V}[!C-RLJ)B݈P78[\Xk`3-+vR-}@ 9AZR_;jV5֋OOl){iX'vR!}-!k&# 2`s!r3u*),3 |hX5s3+{^2EY?.u~"/E'hV5VIr?t.wr6F+Ǫ H.5Sgt'!jɺ\5mؼQa۫1XUJ%jkrc\L_d-ruK\5e1,zp8p 9:~*7u|-Yd&k" ҩ R6$+Zd؃}#v_kʎ^~tUs%e{muϑ6K)Bs۝$`9֟:q?V]l^6cQ2ŖҒd"dr<^J&Sj9V`2ȷxK6K[d'iĮ6IHݎp~rK,v0J4KJ$MU;:"-wڿ9*8)Yv>ҚjҒCWVքL_OñQZ5˕|jÏhy׬ϑ/kqw:ӷ# esdg=cJdlXH3q;p:X^BJ7w^91bO%Vțk3AZ5˕+VM/yC^hYyybǛELf[At+Jt"U=OjCu,'=FPB;94Mۇd"(/ahI'UMfBS|q_ ?A}smt @ڰ WBZ.@(OF@*lF&~t^ %Y<,:&d6țZ@㒬Mm7Xw 9u YσH[Rf#jB\Ż{{"?9Yg׮_QAOѼ+A$k++R( E{? qh k~]PwB%w+cdG~w,VxkL\cC '].vB*9y |rQ5@AI +RJ)RJ)R>Ӈ8T: c 4>` dd|tBp(1K@ !"R*Ŧ_8KBZkr[v/ \KvT }w,^k[7XrIB X##! vC>سH5A[KblRang=U^AvDFϢq h˵BXaQ)gX_p )IDAT|=a}ƚDZf`BxH) H)qh*h.@JՙRޠ 4;9O#rmR_S2jjrG7k6]nqN?Zc"U*Ѳ AEylda1vq@Gjx][WeӚrvEa?$4{.r8ƕ"U\SUڧa쐀W)P},i~G ghܪpUMiIyBZJ>Heȇ s-H+c.%R9.+EHXBJuZ^#ďĶ7jCOY|sǗ!Vnłd-U f dp reHberj^tfQڧ6c){ɤN(ij(2RnŊѤœVSJ)RJ)T+-)DqeNTKY]sQa2RJ厄 (mΕlP٧_'+:\p2|6uLuS pG3{6r!cFyEm8XrU 誥#6xR2nmߍr+qHݣ˫;)wB:0|b.RōrѸYV3|xoRp# ' '\R]4wJFTx;wWd`E'.Y3B$aA &Hp6r:!dHBJ7e%+ʽ#DX$Xt;p2l5#c-):)k-es"a9˝uhy(aI^ȾEО sb>:/49>mN_GLj)i5u<$IREqTԹia^=4LW''|xR?(H]Xm{0YdlBHuYa]$Xiqxj2u:G5ubeHs:]2.pkۋdžU{Ӱ"çH͈5郍׼[ql AÑE*cm9KBMdo!Amn"kohZ˿ڇ>HZP.ŔP-^CKSnsAL)ɚNeLS[KP) sT4ձtz Z=nv^'cN,YfPJܡu{ 7R*JKsi kX>{|q(Ѳ X(XŞ Uie ([5Gu)Gr?JZY~Jy{:+E% g k12i10F[?e`%#&edILRZR ayXT_hyQd z& K l돀۝u2] Ȱ4ӦW^Z毘uJy-ZIr]e"%N !O  M@ay]SZS$l#reóP*Y @R)TZR>@Kv< #B [Jj'#f%s;ʆs#!9I^R.W\u*1IM@gUvF29Hʆ"HA}eßDBP'/,r/88qGΘec͝hPi_1_q$Q:T6<uATFה.Œr3/XL^ǢZEHWL]]^5Utl.q2os63H/D촯/@/doeR0]HKvbl&̓@YIXsו~&Qn*+cgC&,=nĤd(@b{*{5WM>)% hRwVzK+#t_qcQJGju J)RJ)RJ4d)I)<):_qtSGzD*!YZY!gyS6;:\UFXSa)-)_cQ$MX1SIc͔كW"yJ*]:ajz|[wW1aX3˓*:Єþ2 ?ȷx 3|E:.8<68*M~U1˽Etݲc7Zxg~gQ/cCߘ0SZR>Hk~ O:QPX{ \r^ǣR#;yˊ+/ayrK}xsb^ǣR'm[@A_1p:fٚY-\u<*Ҿ[iIhcKkF]_u+`)X3uMAtE1)1_QbhoAcIH@W//-]V\y1×fawƞq{J/Y\JhkxrYYq6fNc'U uLJPVR~m–h<1>_Ċ'RJkO5?Pvuek^ǣT.˪Nx.NWa^ǤTʹPFـW@ 5g*:L1}{}kvoEeM@kf/KTM^qxisNlg|z{.|֣2HN'كW*-uuy߻潣Wahi됶T=u-\8緾Un fZ =SUɹNhtR H)M@J)hRJyFR3:]mc3;fu@;&uk T> {+ˁπ}ߐk\:?wi[3DnU=x(#1TJ:W?79ȕֵ.%ptN{UIi (i }3;ia\]|#c$Imnw?pc/':<lC#m%Y~ACCͽZM\H h,*RpPNF:)|w/#50 (pmO~$h?Y0xy^;'| -s)>`ə>tY8"#vjW¶> 0 pꉶc>>񝉴uFw%PJhr&'m~,Ws>N oҞ&, Jzwg?iӦ߭2.bP|k&ZKm^zҞ&_c*;a*ipݻ+1k͹ؗwpYSR9gϛ缎Cx!R3R& g4)< H)M@J)hRJyFR3R& g4)< H)M@J)hRJyFR3R& g4)< H)M@J)hRJyFR3R& g4)< H)M@J)hRJyFR3R& g4)T =\Zqsun: ~jkkC!kI'ĨQCE1o g4)< H)M@J)hRJy&k΂5Guu5s?QG=|>{/ ]tQ5kuuuch߾=#FgϞn'}|wXt){G3:(m޽?%!,--[pW=zЩS'fΜɏc޽'|ҕm׿fÆ q/Ofl¦M7o]vk֬q%X8c x:vȑGɆ +Xneݷ]vO"9z衇8p SL˥^ʢE C3Ϥٳgs]w7re/^̤I'.]pӾ} .`̘1L6 k-㢋.SOo_3<+*^VX?<MԩMncҥ| {Yz53gdرvi|lٲMc]]ڵ^x!gum۟'fϞ٪*&MΝ;Ϻu=z4\rI cūGN֬YC׮]w m| xb֯_?+W2m4FhӦM"/ݻwl2裏ҥK~} +>??s={~zI=[Yr}۵k=>ϧ}oߞ={m޽q\|wgʔ)уݻwGWeL@wm۶q-{WO^(**b׮]裏2`zI~~>vUVTWWsM7ѵkW#9?_^?6§V^W_}?j>sz `ׯ}IZm۶?iqRM#H9SYx1/>  ;_~o߾s1TUUn:ܹs9Ŵxb8Ǝ @qq1cƌa}1U#'_ VZ͛6l>Ν;\5kPVVW_}Eǎ &+͛7_̙3'm9J:ڷoùfFGk-Z)..`ӦM˖-z :ǪUؽ{w_v-˖-8 gvΝ;ٲe ӟ۷o-ߎ;och4 pw;//#8S6OϞ=9#0av۷o稣OW_+sάY:өS'L¯~+z)v͛i׮{o}NÕW^ɵ^ˠAX~=Gur [nmV*3N=SLIUUU||> wݻYz5]t_~l޼ 60lذ&3p@:tp񨫫>3//oV^;}߿>XjjjXv-v[n۷_S6m4tĉ{֭|gt֍"W7o, l (s;YѶm[JJJOtA(tܙÇ7;x5UPPbDD(3tߪxY`ӧOnݺѭ[7WU%'Trlܸg}뮻>}x9R4hO Chart-2.4.6/doc/html/classChart_1_1HorizontalBars__coll__graph.map0000644000175000017500000000030011701115623024415 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Base.html0000644000175000017500000031663512033071320020044 0ustar reinerreiner Chart::Base Class Reference

Chart::Base Class Reference

Base class for Chart; all other classes derived from here. More...

Inheritance diagram for Chart::Base:
Collaboration diagram for Chart::Base:

List of all members.

Public Attributes

Hash named_colors
 RGB values of named colors.

Private Functions



private int _check_data
 Check the internal data to be displayed.
private int _draw
 Plot the chart to the gd object
Calls:
private int _set_colors
 specify my colors
private int _color_role_to_index
 return a (list of) color index(es) corresponding to the (list of) role(s)
private int _brushStyles_of_roles
 return a (list of) brushStyles corresponding to the (list of) role(s)
private int _draw_title
 draw the title for the chart
private int _default_f_tick
 default tick conversion function This function is pointed to be $self->{f_x_tick} resp.
private float _xyRatio
 Get ratio width_x/width_y.
private float _xPixelInReal
 Get witdh of one Pixel in real coordinates in x-direction.
private float _yPixelInReal
 Get witdh of one Pixel in real coordinates in y-direction.
private int _init (scalar x, scalar y)
 Initialize all default options here.
private int _copy_data (scalar extern_ref)
 Copy external data via a reference to internal memory.
private array _color_spec_to_rgb (scalar role, scalar spec)
 Return an array (list of) rgb values for spec.
private int _draw_sub_title ()
 draw the sub-title for the chart
private int _sort_data ()
 sort the data nicely (mostly for the pareto charts and xy-plots)
private int _find_x_scale ()
 For a xy-plot do the same for the x values, as '_find_y_scale' does for the y values!
private int _find_y_scale ()
 find good values for the minimum and maximum y-value on the chart
private _calcTickInterval (scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)
 Calculate the Interval between ticks in y direction.
private int _calcXTickInterval (scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)
 Calculate the Interval between ticks in x direction.
private int _countTicks (scalar min, scalar max, scalar interval)
 Works out how many ticks would be displayed at that interval.
private int _round2Tick (scalar input, scalar interval, scalar roundUP)
 Rounds up or down to the next tick of interval size.
private array _sepFP (scalar num)
 Seperates a number into it's base 10 floating point exponent & mantisa.
private array _find_y_range ()
 Find minimum and maximum value of y data sets.
private array _find_x_range ()
 Find minimum and maximum value of x data sets.
private int _plot ()
 main sub that controls all the plotting of the actual chart
private int _draw_legend ()
 let the user know what all the pretty colors mean.
private int _draw_bottom_legend ()
 put the legend on the bottom of the chart
private int _draw_right_legend ()
 put the legend on the right of the chart
private int _draw_top_legend ()
 put the legend on top of the chart
private int _draw_left_legend ()
 put the legend on the left of the chart
private int _draw_none_legend ()
 no legend to draw.
private int _draw_x_label ()
 draw the label for the x-axis
private int _draw_y_label ()
 draw the label for the y-axis
private int _draw_ticks ()
 draw the ticks and tick labels
private int _draw_x_number_ticks ()
 draw the ticks and tick labels
private int _draw_x_ticks ()
 draw the x-ticks and their labels
private int _draw_y_ticks ()
 draw the y-ticks and their labels
private int _grey_background ()
 put a grey background on the plot of the data itself
private int _draw_grid_lines ()
 draw grid_lines
private int _draw_x_grid_lines ()
 draw grid_lines for x
private int _draw_y_grid_lines ()
 draw grid_lines for y
private int _draw_y2_grid_lines ()
 draw grid_lines for y
private int _prepare_brush (scalar color, scalar type, scalar role)
 prepare brush

Public Class Methods



object new ()
 Standard normal constructor.
Calls.

Public Object Methods



int set (hash opts)
 Set all options.
hash getopts ()
 get all options
int add_pt (list data)
 Graph API
Add one dataset (as a list) to the dataref.
 add_pt (\list data)
 Graph API
Add one dataset (as a reference to a list) to the dataref via.
int add_dataset (list data)
 Graph API
Add many datasets (implemented as a list) to the dataref,.
int add_dataset (\list data)
 Graph API
Add many datasets (implemented as a references to alist) to the dataref,.
int add_datafile (scalar filename, scalar format)
 Graph API
it's also possible to add a complete datafile
Uses.
int clear_data ()
 Clear Graph API (by undefining 'dataref'.
arrayref get_data ()
 Get array of data of the last graph.
int png (scalar file, scalar dataref)
 Produce the graph of options set in png format.
int cgi_png (scalar dataref)
 Produce the graph of options set in png format to be directly written for CGI.
int scalar_png (scalar dataref)
 Produce the graph of options set in PNG format to be directly returned.
int jpeg (scalar file, scalar dataref)
 Produce the graph of options set in JPG format to be directly plotted.
int cgi_jpeg (scalar dataref)
 Produce the graph of options set in JPG format to be directly for CGI.
int scalar_jpeg (scalar dataref)
 Produce the graph of options set in JPG format to be directly returned.
int make_gd (scalar dataref)
 Produce the graph of options set in GD format to be directly.
 imagemap_dump ()
 get the information to turn the chart into an imagemap
 minimum (list array)
 determine minimum of an array of values
 maximum (list array)
 determine maximum of an array of values
 arccos (scalar a)
 Function arccos(a).
 arcsin (scalar a)
 Function arcsin(a).
 true (scalar b)
 determine true value of argument
 false (scalar b)
 determine false value of argument

Detailed Description

Base class for Chart; all other classes derived from here.

Base class from which all other classes are derived. This class provides all functions which are common for all classes


Member Function Documentation

private Chart::Base::_calcTickInterval ( scalar  dataset_min,
scalar  dataset_max,
scalar  flag_fixed_min,
scalar  flag_fixed_max,
scalar  minTicks,
scalar  maxTicks 
)

Calculate the Interval between ticks in y direction.

Calculate the Interval between ticks in y direction and compare the number of ticks to the user's given values min_y_ticks, max_y_ticks.

Parameters:
[in] $dataset_min Minimal value in y direction
[in] $dataset_max Maximal value in y direction
[in] $flag_fixed_min Indicator whether the dataset_min value is fixed
[in] $flag_fixed_max Indicator whether the dataset_max value is fixed
[in] $minTicks Minimal number of ticks wanted
[in] $maxTicks Maximal number of ticks wanted
Returns:
Array of ($tickInterval, $tickCount, $pMin, $pMax)

Reimplemented in Chart::Direction.

private int Chart::Base::_calcXTickInterval ( scalar  min,
scalar  max,
scalar  minF,
scalar  maxF,
scalar  minTicks,
scalar  maxTicks 
)

Calculate the Interval between ticks in x direction.

Calculate the Interval between ticks in x direction and compare the number of ticks to the user's given values minTicks, maxTicks.

Parameters:
[in] $min Minimal value of dataset in x direction
[in] $max Maximal value of dataset in x direction
[in] $minF Inddicator if those min value is fixed
[in] $maxF Inddicator if those max value is fixed
[in] $minTicks Minimal number of tick in x direction
[in] $maxTicks Maximal number of tick in x direction
Returns:
$tickInterval, $tickCount, $pMin, $pMax
private array Chart::Base::_color_spec_to_rgb ( scalar  role,
scalar  spec 
)

Return an array (list of) rgb values for spec.

Parameters:
[in] $role name of a role
[in] $spec [r,g,b] or name
Returns:
array of rgb values as a list (i.e., @rgb)
private int Chart::Base::_copy_data ( scalar  extern_ref  ) 

Copy external data via a reference to internal memory.

Remember the external reference.
Therefore, this function can anly be called once!

Parameters:
$extern_ref Reference to external data space
private int Chart::Base::_countTicks ( scalar  min,
scalar  max,
scalar  interval 
)

Works out how many ticks would be displayed at that interval.

Parameters:
$min Minimal value
$max Maximal value
$interval value
Returns:
($tickCount, $minR, $maxR)

e.g min=2, max=5, interval=1, result is 4 ticks.
written by David Pottage of Tao Group.
$minR = $self->_round2Tick( $min, $interval, -1);
$maxR = $self->_round2Tick( $max, $interval, 1);
$tickCount = ( $maxR/$interval ) - ( $minR/$interval ) +1;

private int Chart::Base::_draw_bottom_legend (  ) 

put the legend on the bottom of the chart

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_grid_lines (  ) 

draw grid_lines

Returns:
status
private int Chart::Base::_draw_left_legend (  ) 

put the legend on the left of the chart

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_legend (  ) 

let the user know what all the pretty colors mean.


The user define the position of the legend by setting option 'legend' to 'top', 'bottom', 'left', 'right' or 'none'. The legend is positioned at the defined place, respectively.

Returns:
status

Reimplemented in Chart::Composite, Chart::Direction, and Chart::ErrorBars.

private int Chart::Base::_draw_none_legend (  ) 

no legend to draw.

Just return in this case. This routine may be overwritten by subclasses.

Returns:
1

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_right_legend (  ) 

put the legend on the right of the chart

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_sub_title (  ) 

draw the sub-title for the chart

See also:
_draw_title
_draw_sub_title() is more or less obsolete as _draw_title() does the same by writing more than one line as the title. Both use decreased width and height of the font by one.
Returns:
status
private int Chart::Base::_draw_ticks (  ) 

draw the ticks and tick labels

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_top_legend (  ) 

put the legend on top of the chart

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_x_grid_lines (  ) 

draw grid_lines for x

Returns:
status
private int Chart::Base::_draw_x_label (  ) 

draw the label for the x-axis

Get font for labels
Get the color of x_label or text
Get size of font
and write x-Label

Returns:
status
private int Chart::Base::_draw_x_number_ticks (  ) 

draw the ticks and tick labels

Returns:
status
private int Chart::Base::_draw_x_ticks (  ) 

draw the x-ticks and their labels

Returns:
status

Reimplemented in Chart::Composite, Chart::Direction, and Chart::HorizontalBars.

private int Chart::Base::_draw_y2_grid_lines (  ) 

draw grid_lines for y

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_y_grid_lines (  ) 

draw grid_lines for y

Returns:
status

Reimplemented in Chart::Composite.

private int Chart::Base::_draw_y_label (  ) 

draw the label for the y-axis

Returns:
status
private int Chart::Base::_draw_y_ticks (  ) 

draw the y-ticks and their labels

Returns:
status

Reimplemented in Chart::Composite, Chart::Direction, and Chart::HorizontalBars.

private array Chart::Base::_find_x_range (  ) 

Find minimum and maximum value of x data sets.

Returns:
( min, max )
private int Chart::Base::_find_x_scale (  ) 

For a xy-plot do the same for the x values, as '_find_y_scale' does for the y values!

See also:
_find_y_scale
Returns:
status
private array Chart::Base::_find_y_range (  ) 

Find minimum and maximum value of y data sets.

Returns:
( min, max, flag_all_integers )

Reimplemented in Chart::Direction, Chart::ErrorBars, and Chart::Mountain.

private int Chart::Base::_find_y_scale (  ) 

find good values for the minimum and maximum y-value on the chart

Returns:
status

New version, re-written by David Pottage of Tao Group.
This code is *AS IS* and comes with *NO WARRANTY*

This Sub calculates correct values for the following class local variables, if they have not been set by the user.

max_val, min_val: The maximum and minimum values for the y axis.
y_ticks: The number of ticks to plot on the y scale, including the end points. e.g. If the scale runs from 0 to 50, with ticks every 10, y_ticks will have the value of 6.
y_tick_labels: An array of strings, each is a label for the y axis.
y_tick_labels_length: The length to allow for B tick labels. (How long is the longest?)

Reimplemented in Chart::Direction, and Chart::HorizontalBars.

private int Chart::Base::_grey_background (  ) 

put a grey background on the plot of the data itself

Returns:
status
private int Chart::Base::_init ( scalar  x,
scalar  y 
)

Initialize all default options here.

Parameters:
[in] $x Width of the final image in pixels (Default: 400)
[in] $y Height of the final image in pixels (Default: 300)
private int Chart::Base::_plot (  ) 

main sub that controls all the plotting of the actual chart

Returns:
status
private int Chart::Base::_prepare_brush ( scalar  color,
scalar  type,
scalar  role 
)

prepare brush

set the gdBrush object to tick GD into drawing fat lines & points of interesting shapes Needed by "Lines", "Points" and "LinesPoints" All hacked up by Richard Dice <rdice@pobox.com> Sunday 16 May 1999

Parameters:
$color 
$type 'line','point'
$role 
Returns:
status
private int Chart::Base::_round2Tick ( scalar  input,
scalar  interval,
scalar  roundUP 
)

Rounds up or down to the next tick of interval size.

$roundUP can be +1 or -1 to indicate if rounding should be up or down.
written by David Pottage of Tao Group.

Parameters:
$input 
$interval 
$roundUP 
Returns:
retN*interval
private array Chart::Base::_sepFP ( scalar  num  ) 

Seperates a number into it's base 10 floating point exponent & mantisa.

written by David Pottage of Tao Group.

Parameters:
$num Floating point number
Returns:
( exponent, mantissa)
private int Chart::Base::_sort_data (  ) 

sort the data nicely (mostly for the pareto charts and xy-plots)

Returns:
status
int Chart::Base::add_datafile ( scalar  filename,
scalar  format 
)

Graph API
it's also possible to add a complete datafile
Uses.

See also:
add_pt
add_dataset
Parameters:
[in] $filename Name of file which contents is to be added
[in] $format 'pt' or 'set' to distiguish between function add_pt() in case of 'pt' or function add_dataset() in case of 'set'
int Chart::Base::add_dataset ( \list  data  ) 

Graph API
Add many datasets (implemented as a references to alist) to the dataref,.

Parameters:
\@data Dataset (reference to a list) to add
int Chart::Base::add_dataset ( list  data  ) 

Graph API
Add many datasets (implemented as a list) to the dataref,.

Parameters:
@data Dataset (list) to add

Reimplemented in Chart::Direction.

Chart::Base::add_pt ( \list  data  ) 

Graph API
Add one dataset (as a reference to a list) to the dataref via.

for ( 0 .. $data )
{
   push $self->{'dataref'}->[$_] }, $data[$_];
}
Parameters:
\@data Dataset to add
int Chart::Base::add_pt ( list  data  ) 

Graph API
Add one dataset (as a list) to the dataref.

Parameters:
@data Dataset to add
Chart::Base::arccos ( scalar  a  ) 

Function arccos(a).

Parameters:
$a Value
Returns:
arccos(a)
Chart::Base::arcsin ( scalar  a  ) 

Function arcsin(a).

Parameters:
$a Value
Returns:
arcsin(a)
int Chart::Base::cgi_jpeg ( scalar  dataref  ) 

Produce the graph of options set in JPG format to be directly for CGI.

called after the options are set, this method invokes all my private methods to actually draw the chart and plot the data

Parameters:
$dataref 
Returns:
Status of the plot
int Chart::Base::cgi_png ( scalar  dataref  ) 

Produce the graph of options set in png format to be directly written for CGI.

called after the options are set, this method invokes all my private methods to actually draw the chart and plot the data

Parameters:
$dataref 
Returns:
Status of the plot
int Chart::Base::clear_data (  ) 

Clear Graph API (by undefining 'dataref'.

Returns:
Status of function
Chart::Base::false ( scalar  b  ) 

determine false value of argument

Parameters:
[in] $b Bool value to check for true
Returns:
1 if argument is equal to false, FALSE, 0, f, F or undefined
arrayref Chart::Base::get_data (  ) 

Get array of data of the last graph.

Returns:
Reference to data set of the last graph
hash Chart::Base::getopts (  ) 

get all options

Returns:
hash of all set options so far
set options as a hash
Chart::Base::imagemap_dump (  ) 

get the information to turn the chart into an imagemap

Returns:
Reference to an array of the image

Reimplemented in Chart::Composite.

int Chart::Base::jpeg ( scalar  file,
scalar  dataref 
)

Produce the graph of options set in JPG format to be directly plotted.


Called after the options are set, this method invokes all my private methods to actually draw the chart and plot the data. The output has the jpeg format in opposite to png format produced by

See also:
png

Uses the following private functions:

See also:
_set_colors
_copy_data
_check_data
_draw
Parameters:
[in] $file Name of file to write graph to
[in] $dataref Reference to external data space
Returns:
Status of the plot
int Chart::Base::make_gd ( scalar  dataref  ) 

Produce the graph of options set in GD format to be directly.

called after the options are set, this method invokes all my private methods to actually draw the chart and plot the data

Parameters:
$dataref 
Returns:
Status of the plot
Chart::Base::maximum ( list  array  ) 

determine maximum of an array of values

Parameters:
@array List of numerical values
Returns:
Maximal value of list of values
Chart::Base::minimum ( list  array  ) 

determine minimum of an array of values

Parameters:
@array List of numerical values
Returns:
Minimal value of list of values
object Chart::Base::new (  ) 

Standard normal constructor.
Calls.

Returns:
A new object.
See also:
_init
int Chart::Base::png ( scalar  file,
scalar  dataref 
)

Produce the graph of options set in png format.

called after the options are set, this method invokes all my private methods to actually draw the chart and plot the data

See also:
_set_colors
_copy_data
_check_data
_draw
Parameters:
[in] $file Name of file to write graph to
[in] $dataref Reference to external data space
Returns:
Status of the plot
int Chart::Base::scalar_jpeg ( scalar  dataref  ) 

Produce the graph of options set in JPG format to be directly returned.

called after the options are set, this method invokes all my private methods to actually draw the chart and return the image to the caller

Parameters:
$dataref 
Returns:
returns the jpeg image as a scalar value, so that the programmer-user can do whatever the heck s/he wants to with it
int Chart::Base::scalar_png ( scalar  dataref  ) 

Produce the graph of options set in PNG format to be directly returned.

called after the options are set, this method invokes all my private methods to actually draw the chart and return the image to the caller

Parameters:
$dataref 
Returns:
returns the png image as a scalar value, so that the programmer-user can do whatever the heck s/he wants to with it
int Chart::Base::set ( hash  opts  ) 

Set all options.

main method for customizing the chart, lets users specify values for different parameters
The options are saved locally to be able to output them via

See also:
getopts()
Parameters:
[in] %opts Hash of options to the Chart
Returns:
ok or croak

Reimplemented in Chart::Composite, and Chart::Direction.

Chart::Base::true ( scalar  b  ) 

determine true value of argument

Parameters:
[in] $b Bool value to check for true
Returns:
1 if argument is equal to TRUE, true, 1, t, T, and defined

Member Data Documentation

return a (list of) brushStyles corresponding to the (list of) role(s)

Parameters:
\@list_of_roles List of roles
Returns:
(list of) brushStyle(s) corresponding to the (list of) role(s) in @_.

Check the internal data to be displayed.

Make sure the data isn't really weird and collect some basic info about it
Not logical data is 'carp'ed.

Returns:
status of check

Reimplemented in Chart::Composite, and Chart::StackedBars.

return a (list of) color index(es) corresponding to the (list of) role(s)

wantarray is a special keyword which returns a flag indicating which context your subroutine has been called in. It will return one of three values.

  • true: If your subroutine has been called in list context
  • false: If your subroutine has been called in scalar context
  • undef: If your subroutine has been called in void context
Returns:
a (list of) color index(es) corresponding to the (list of) role(s) in @_.

default tick conversion function This function is pointed to be $self->{f_x_tick} resp.

$self->{f_y_tick} if the user does not provide another function

Returns:
status
private int Chart::Base::_draw

Plot the chart to the gd object
Calls:

See also:
_draw_title
_draw_sub_title
_sort_data
_plot
Returns:
status

draw the title for the chart

The title was defined by the user in set('title' => ....)
The user may define some title lines by separating them via character '\n';
The used font is taken from 'title_font';
The used color is calculated by function '_color_role_to_index' based on 'title' or 'text'

See also:
_color_role_to_index
Returns:
status

specify my colors

Returns:
status

Get witdh of one Pixel in real coordinates in x-direction.

Returns:
width(interval) of reality in x direction
private float Chart::Base::_xyRatio

Get ratio width_x/width_y.

Returns:
ratio width_x and width_y

Get witdh of one Pixel in real coordinates in y-direction.

Returns:
width(interval) of reality in y direction

The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1Points__inherit__graph.map0000644000175000017500000000027211670177756023475 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Pareto-members.html0000644000175000017500000004231212033071320022040 0ustar reinerreiner Member List

Chart::Pareto Member List

This is the complete list of members for Chart::Pareto, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Pareto
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legendChart::Pareto
Chart::Base::_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scaleChart::Pareto
Chart::Base::_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_dataChart::Pareto
Chart::Base::_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/bc_s.png0000644000175000017500000000124512033071320015234 0ustar reinerreinerPNG  IHDR /9lIDATxKHTmwfg8Ә6-Bڴ]dVZMaD}ghB*bU93Fy< ayt %8VjLlCF@m[ 7jRC0TUYYsv~,i).w w\cT i `owgH05%>\.*O0-c}B+ms˅V5:} *lcVO^aXx)0xrKfxxo5IkWaj;V[ƫ@fnؿR.B_CK|.03TH=7㴙8k_ӑϒ2z:V&fBvN9iVY յ>.Qx{E'|dj6ڝ؇x?sJ@uӑhbIҽ2,F[bӑh e'@;^dxg2FaG^@,)l߅ T-RU*ȕEΩ644l #jD Őo{N IENDB`Chart-2.4.6/doc/html/classChart_1_1Pareto__inherit__graph.png0000644000175000017500000000566611666706743023475 0ustar reinerreinerPNG  IHDRm{~wbKGD kIDATx{PT1 Bb|E듐 ͠h" TEHj$4ZCM;jkm6aZ)&b&FǷ֪0ZڲaZ؅]ٞofg<{=ݽrAP( B& zګ+!]uh|*G3iow3,GI%MB4 Q$ēգ珃7@ y|\\FZ4pׁ5 ~Xx=ohF=@00M^Pm^ʧ'l_h XEk_KQ3KJ]|."VzP@zݟ>1ږ;:`kQvČa﷙".  'x:gg}01u6 !w#<o`:`8"Vr2F lַ\n&p űh[# [| 8 S/>FY8@vF^mh-)1:^Dž9Yr^;{ISׇs|!K q=k;B1Ljܢ H!MZOv.?*Ztq X;G, FL{Oǁ)lVm[x!RҁZ5fABd ="~@D?fg rFOE,8:#?"NwIF\{\BS9_G8G (mB}z98X-:YFL5׫z`HAL#ךwx}o7h޶@W">CHa}؇³HsHkn5x6Z$U 9z?1 VmЍ i k(iI&!J(iI&!~+-*>x[>45ѠY6[U]_O"n~wFZtox~CCC'uoouAF"#7y਩/:'o״ 8oL&ӭ;.!~'{,?pШi[4M#7hFcj;+iF5y )$:~%j H4αr~%n'q3MèiGEQZ^o x0vNo_;Xphw4pdhG ͌|_H*lMCz1-oa:vVF>/i{L"랊>!22᯿HCI%MB4 Q$DI%MB4 Q$DI%MB4 Q$DI%MB4 Q$DI%MB4 Q$DI%MB4 Q$DI%MB4 Q$DI%MB4 Q$DI%Oh~ /q`«\ ^xUXv-MM,R} ***(++kWiI&!J(i'l6ǹs4DfϞ`wy os={pMg9(($;ۍWFl&;;>ĠAغu+Wp`Zٶm7BꫯR]]vݻwsQf3fǏ|rv|WOH۰aqqqiI(#33 9rsz9sc9˻vbǎyu4̡CXtS@XX:Â HMMCڲ22225kO<;wbPXX޽{IKKgbP\\̉'عs'֭sh[Çs-bWVVr%VXAJJ /v~-..nfΜ9dffrx?mpiӦpMv;ΝZrrrHII!..y&Mٳg'55FNeʔV1ږ6m͛ׯ Zʣ儇Ojj*g򪨨`ԨQ0uT&OLyy9vXZxx87npN>Mmm-ƍ`00x`g[s_ٲe ׮]ci_RPPwcPUUSO=llL<>fsCmmmG3=6vX8v<@R"""7n+**غu+$&&b0HKKs='CBBHJJW^ql ˭n߾M=^0w\^{5^?tvN0͌1$ Oj… |g.ފ̉'Krv}ǏPWW'|Brr3Φ,bccill+Wm[Nh4@dd$6m"??]0^urss3f {̙3L0]3<Mvv6˖-#>>*9sfy͟?p3f`ĉVt4,J=ޙb FjrY9r$TWWw8Z,.^H\\ 8Ǟ~:W\aȐ!vWMM W^d2qnk֬MWI^./%DI%MB4 Q$DI%MB4 Q$wŽa}G_c=e2 ~I( BP(dVNLb5IIENDB`Chart-2.4.6/doc/html/classChart_1_1Base__inherit__graph.md50000644000175000017500000000004011670177756022774 0ustar reinerreiner15e433ec4f33be91c2c5791fe3096c14Chart-2.4.6/doc/html/classChart_1_1Bars__coll__graph.md50000644000175000017500000000004011701115622022253 0ustar reinerreiner127dfbf9dbf36c5da61b9542c7f8eaf1Chart-2.4.6/doc/html/classChart_1_1Split__inherit__graph.map0000644000175000017500000000027211666706744023314 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Pie-members.html0000644000175000017500000004404712033071320021332 0ustar reinerreiner Member List

Chart::Pie Member List

This is the complete list of members for Chart::Pie, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legendChart::Pie
Chart::Base::_draw_bottom_legend()Chart::Base
_draw_dataChart::Pie
_draw_grid_lines()Chart::Base
_draw_left_legendChart::Pie
Chart::Base::_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legendChart::Pie
Chart::Base::_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legendChart::Pie
Chart::Base::_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticksChart::Pie
Chart::Base::_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticksChart::Pie
Chart::Base::_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scaleChart::Pie
Chart::Base::_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/classChart_1_1Base__coll__graph.map0000644000175000017500000000003511701115623022333 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Bars__coll__graph.png0000644000175000017500000004451411701115623022371 0ustar reinerreinerPNG  IHDR4JlbKGD IDATxy|TϹI("K\*Zk+ZA_+ V .ݴ-O[\VbV[BE% R YC&C2Krgy^y%3=lO=RJ)RJ)RJ)RJ{?ϋ1LЬz꩏ʜsڠc[W31Z;;T`2Evڸqd A;wn!Xkl,$9*~$3-:[?`3p >`rvu@wk hn^#WF`9pKj p Jc{9 h=`7S-+(0 8l7Mȇf<7{[C5Rû;ٓ(6,EVRWBy" ",`ң=ғlP ldp8ҳ(K)(=w5a{w@ͯ60~ <"D&U((NЮRk뽟 Ot訊׀c)pwod$`4p5-$06^BzwGx{!dAL09X&00$!/*QO$mߐIP[kozdx[:ܖ#Ot )A>,A>'~rnDBCNXi#s19s gN$@.ԳQ}+Ggw5rR1u@Nw>O]_ q[2z 1~ Z.dwT[S)R*P~^&qL)NU(&4TЄДRyCR*ohBSJ卬Hhwz_G+XJj* :|yhsΝvgoҿWkgsDJEc;wtᏻlE_]1#L8mlna5ОZ2Y߼h{~R .96A6>j8:s+fEmT*g;rɀ¢M+fS> l mֱs77r~)J/`,\t<*6F~0Ggbl3` u_y(j*zbm[`Xsڝc_+".سi J#UIhn}i{ nqR9ifE+x(2ƞ;s[TVSYW{ʈišd4(L0MwXpmQӔWOhslYl7ZlG`5|p"c[1嫌&Q`/kPy&bR*7wۮ +oe4YcgiNݎ5_DLJ}>o^5LƓ2j*kƁM;B7+jU*9srY:.Q富$ikcHeQEXUn5⌓&'&# dk+aؽFg~7zP e0B9:+# ͱ12؏MRh,פ94Ҧ |F [k>Ś-kROc[6j,׸@_c-45)xT*W^_6i*X^GQSY7X{Ů ".ҭ"{ߔJ=y< dEpAo T>sjwq䫠rm  ]'9jJ2kVRite{n[͎=xcc&4 DЌlM\g :|DNitn3T8x=m M 0x ZgpPmA7x9i/A?'7sfG{ ~ :uvWоx(j ZYA.%sKVPSYwHб䣌X6?"ʺd2 l\̍y߷5"FX >j:m$*E-Ko{oy{8ǻA@a䵊'=2v32j~{*k+~Vp8g.k'p";2 Fc8 8X"q0`$yq|&r?"I/vײ?y1/Z%L/qW!=Sπ $_m$AG}m{ľnS j+BkTezp&G)6lp, l>[Z# c\=>yK"fgxhCی$@É,:hAz,Dvc'$o[BsHbq~mg~NAa\'ke,>n(ݐ/l'UH gkn `@0+ay!u_in >; S!4+~.Dz|mO)m;*&2NAiE s=# y}^R ?_AƵV5Xs*42گj:IhI[WD|nak_W69EdI.X,`lGʐ]:݉Մ&>09& D_>Gs NmyE^Mۻ j'!ACEt` b/$t<4:$kTRv4Az8 ˩ET>ꑣq"G [)F$y:陜zdlZ <$t_"j!GKt0 $FLs klkTe,Yq>EX-Sx~z G>Cȹ_ѯig:/; 8[ȗ d<,5>1六/n%rZmZ #G# WjZAҨڋ7 haE} km}mm7)㬱sM9]R 5j8vw[qŒѫ}l 8F>d?';~^ERb]Qw4lA: 9*g2^||ݕRJ)RJ)RJ)T3"tެP))fן_SYwFq䣌a~kVp'/._xe"'>Es.W ٔ:R=E(s9{MA?m-o.Na>yW"3 JaykZDLJCJM{hݛ ;hrbcbBxUZ*笨ǮD)3Cs=h7|Gn+OLu2V;)y7##c}8+T`2Q>`''dAME WȄHU jjCzXW#Hz6$1NA,MA&R*|Rt.d2i4LJ8-Mx]H{$Ao#bk߀y!u#%z[ArѢoC2?TYSǴ56+&g"cZaɔ>K슞\dw]d>~V*mҟLi(½ ?vaȅ>#=G- ܁\!嫇!Vk66[-&\sψkO{p\) Rnz,&Z'" eѲm pl^cI5."cdG*TEzO]j@1ve\c JqwD>J[BS 2ubJ@J[B+0w]u3S@391I7\;o2}mtDG|7>GG]YlE僴%49qY ' e{ThD[iQj~Gu\d,˚?PuP1$j@`:R/g! -9%W_C/mweH2ZK+R.HrS6+&$G ēZ_6x֕^i{k<ΖV~Ѳ&H$W\r?~(n>2="=Wd6)-Wjǻ},-e"ZڱHۑMhJT )r$rKY-KȮlZDa+ Wz{?mEN$1x座#cd/!*q dJDL6 EJYHx xCe\rԝʘ.w:SB;HĝQuqi9(P[YwUSBUOcL w>ǬWSYwq~͊CwOIQNka0ͪ}5vP⿍ȑ\Jܹs{[~fEС崦MܲX3.-q(}\x'ʺO'* :=ULsa)SN҆7Xuq#@T%mH!MNV]Z?;'4cVnHQU"^}ަa`O:Z u>|ަaJeܮ_* |?mus۠v5,, :&yX=UqL־)鵶W662g2ʰvej{tbXFKeUJRdd Xڻۮvw#O] 0e'L{Lˀ!Q]ާY ~ŤoOh]b|C/"ӌ~T2mJ)G=zޜc$ 8] |SLJ<E%nGYij-I>N}=LKlLJF/@w{2;^=Z B_'xe۳/2b?HuhK#kkWKp+Gd$9+HI`R=B@v9%De F 1FJL*?[^LC 4Cv}F&x%T:E fbK4"%{ʼe$xۊW;QB>I{yo~6{_DJpkBSisXm,\ϲ3*2Ɉ.c{tg%U |Kh5bl)6@)2]yL@5koXvwʺ댛"ك2|i=kck+랚9f9~Œ% 2k QiV2Tvw,kq/ :|n5dX <$9K~3Gz>#u$,Go?ѹ۵ ݧD)#/_)g货\Q[YGzlEhUME~ǔԊd EF'\}w ƕUj+BVI  Xc {.gZwiEyؖ뤪4%͞0`ttl3Ki9kI|VI$m+탱&,'fvD;sVIX3RǚC_v\cSeϏX6}c븚̗55ٳc!G;nsa#\S:NycUtJ)RJ)k%U69)Tf\Zp& 4l;c﹖ #.t l~L2.QHDJőkӍrQC-5$z{"wR%"s!Os'2y!@=Pl2oYnN{\$;WmemuYk~swpyڊ3GE{{ gm72_43k<]m:)EGj݄$E|.z흃$~3Rrȸ0uy];ofEڊ}}|EϬ6{x\ n/@Dh .`fEڊC{"-;S:*aޟہb-!qBk"$D/lz1DYZF$H%^m 8:n_~;,r>_(O1h <{yÖkJ[}2B!Fo?Ex'ᓑm.݄$Gdo{?ɖˉ$.d;)Nhts^Nv۾9ڊPkMCY&Q Aa^ƞ]mw]б$ItJ)RJ)RJ)R]AdRJ,FtJ*tzSmEڊP٨B/Ȝj+Bk+BmMQiF=";A*U}2$,,TYv2 qօ;[l3o"U"\nBcHO[Hi߯'hy?!#ELtT4x_on{5!qSdu9Ҭ ͸Na1v3`d@g"Wԗ g#EAz:DM@zB)A eWBIHZmwRy91W_@稭UqJʠN'4kl_|e 7K9;YRgr Nh]e4s! + }E{N]NMe]?@ؽkԪZ.㸟n=EpzR;Re,)yN^exUYE# c|Ih5l,l R,ūW٬,FM U}t ] >r~c?vc·ULT}v=rђme,f0zh{1 k=Ft욽$;6)}LRe$N5rp ]Z RI0d.2V֋$zN]Jgzm5* &*3jQ5|񛂎m(s*剁>5h|q6RJ)RJ)RJ)2m{F,t]G0JSԽqKMe!AU1Sd@mE1c{tۏ6n{rbnrT TB+o 0s0^?`ZGy~>vR-w{4ql/Qx&>911,s*)~^ޅ"-DW.9Ǭ+(ru zRm'[,txSv_yk+B;?a/u֔Jf'bͿE _mpAw?'@s~nW)?}C :%|Ih ÏD45p]*'k)ɡXlrbJNΗ9֌y\Y&Yfiϧ9?;YVބfXsha(ՖjB"Jh0}0v9=2Wº_V uT;)2iv*OssYvTB\v+=\g9oԕTH됄3 R%$$Q}) R;Ru6d2jZp2RX+So/~Jn?SI6nnnx,%H9Rl@EzrCÐpy %WzgRJ".%^ d7?B0(!CJ'}]=ȠrLWO╰օ#="HֽEjsJUTA D|;"%_AXZTT}ٻO`*wB-J)VJXǖ>90/Eoȥ@,0Ż}w;(o╰[ow䨦Junz1;i,U[z8+A{F,]Խqsic_p}g)-uj*늰iqбu*Y5q+XEc߀,WDdF߂DSG9w6[bii۾RI2֜7%TcQmTBx!6kLwr橠P<]iدtT"5uY̏HK߅wwGN^ `ͦ @THhHcͫ^qв,|?dkz`c;OVe?ZiC0[cF , ~8˦e.0W ͵!bi }27*=΢e`%0eJ)ծʳ s23Yy 28 /EE^[TPJuADpIdI;?#2m{C̲Xk\55u{>XT:\cG04nz[vP|:P6;)[*fK9{?N\:bwбufM56#fšfV^{ -[*fK9#v:XTj:?]XǏ`ay8awTk)oXEJMcVܧ4Ч[-dMյXcG -N'4#s 7$4%TPLVW+ӂC ٚ7Xc2 ѩj :N'ʏٴɏ6:y%PJ)RJ)RJ)g@T 4.,p/l8=A)k. wu8PT|,꿻 |ICNwJs2 dAǣ:ǗZmEڊ~l+UahkȖ%^[ֆ/:8Ё{Eu_H+W`3AEGp[{%+Eu? Mou;kޚz~k]U g:pOб(2fdZlΨo-xyfEh5]QY\X]_uTǏmukM 5ud*RVjZ['.4_j+BoY_TK:&m+K`odJ`i'M8+޸ooYdJ`#4>m :RJ)RJu).Qmaw~lq<8nn 喠cQ%Zq-;ƾ\[Yweб`4o{p ႇEO8bMmefcOGz4~[Kt3Gu-l729TQ%zhc֌7𥝅͡ʠRa >XcQ[B-Jme]3yQ_ fmEG+TTMζ^9qAǣ˿栻}=cWPo5f-\ LYtN17;9%T57xT\c⦢m3Ma)5C'*t<*= c\iW낎E嘚ʺ![[^Zб(1 %Ɖ͞4ckJu:Z]cK}f`j*Bo`SBUMAǣjɋ6mBc6wkޙY^ɴqssJ3ɗ6ɡkk3ּjȖ+jS=N&݅Sh(%>nq>7%TF(Y:u&^QфrZMeHc| OؠcRstҠ_qYaƚuvD҄ƚs5k+~7jQAǓf S*i9m8ضRJ']SÚ}ҴmjSZN][_-宔ʴd @OQ:h8RV \  XU1 ~@\ߧsgsĢLt$, fIKo+-}VyP9k;}JuJrYo.=|x,𱭎<_!gG<\ \WPkʶڅHb'?dH? [ȗ`(8ϻ],t0I MRl{ˑ/r`xC{qǾosx8m슺u?{#]F`9Е hxFȇvg`,x;ydlh? nn_$'N8(e%c<::m݀Cu }s puT[ېd: x&[4;qXw* YLնʺыGL& f!݁J/0KQ$ dWkw{pk'.H"DH5}x7:\_%ws2x<^ m  $a&KZKZ<AN.dwAD|d0drPz'nTȮaDxd2_5|"_]ėGz#QĘ.[Z z>i_lOgDƺڻ Uw3o$qk{?fi} 90qw' zn +վڊ5Ǔ\ =ѷHb*E> VBv;CE=<Ż}wk#QȮTe&+14}"dz;rjZsc#xqǾ9Lu/8v|"?M'j2uȁq٤O[Tj*BTNa#H+7ʻ}2f~GIh!'Z/+c鉝C cgr r\ZT]dykJj 8 x<%YG.Bdz$BuXg t821κ;KDSġY{c$4lC)峴&)&Z(TZe\N0MhJ M)74)&4TЄ)]SYwcyWWND{yjB*.q@ϞGy?oiTY`dAHBSfSBU%~jtnܘBz8>}RPЇ[_#ޢ*TNHB+cQxgXSEK5Yػo: Q=aTmۛ]w@FڤWOZ[z‰H=zҩ0Wcl7o\r4Mf*d2vƾ5~Q)׼qܖLՕN-r1X`1tkgWeUXBk\P\cw3nW6hԑ]`̞m&3chXYCwM P>sw3{m-ㄿJXk\>6So`e5k~Je5- 2=_y6㠵kkZi: X&]cfch]nQ>\ݷ߀s1?4K֭`TСWQ02׮>uYȵ5i< -O zh-xZǭ];gaڵ3R*:!Ca1g^ۏoƲ>}uo߾AũT޸skAǐ lȐ%%1J@Nۨx؊)!?{3[1:6@=xmȈӺT?0LuA$ON [x8IYYuO?h,ݹI:\)hBsyO?8 AƑKJJN6v|Oo,蘔&+WX򘒒ꟃZnYvePDs2- Ƙ u?tLJe]$Euȁ~{11`n]/RJZ<9IJj+ڣ6TI*c`wAL4eA=<0o55u;iR@Zs : rVPJhBSJ MhJ M)74)FF <ڵ^z{c Guvȟ'.Lc=F8,1ݛc=`R]B{h6l`ҤI< <~qk-;v;衇Xl6l?fΜ9\z,[̗xR>|87|3L;K.3bz79sSz\ȑ#O?w]RJeFZ{h6l`L2eO20`7x#{s7.:,nv7|Μ9\|| __*?87oo^.c?eɒ%<F׏=mժU?O?SaÆNJTl2w_}`ӦM{ǣ>k-Vo`ǎIfy #<ԩS*b5ر={&I(,,dȐ!}v{8C())۷ӭ[7vŵ^˾ :[{we͚5{ݵkVbС)ꫯDϞ=я~2ʰ&}هO>km]NK~zF8ϲȺEEE,[Z֬YC߾}F֋$Z͙3n~:ǎK}}=W]u{vR1#?7xG޽IÇg֭l߾=\y?)w'?)ڗքֳgO=\~_z=/X7x:+7l>9F8,];/|r.\m;wm6mƆ AD޽SjpsgqƤcUJu^Oۘ4i۷o&eee455n:FM} '?̵^KQQpR]] `ƌ\}va ;}{8Mrgy&< &M,[o}[yR)Ju/| |)7yf>CCM`;xw0`|0ׯѣGƊ+>|8}sTojjwe 6ո`2n̙iJ偌L}߿?)?gϞTVVyH5j+ӕRyCR*ohBSJ MhJ M)74)&4TЄДRy#ssayR9-ՄP_z#RJ)RJ)RJ)RJ) AV?IENDB`Chart-2.4.6/doc/html/classChart_1_1BrushStyles.html0000644000175000017500000004302412033071320021446 0ustar reinerreiner Chart::BrushStyles Class Reference

Chart::BrushStyles Class Reference

Define styles for Points and LinesPoints classes. More...

Inheritance diagram for Chart::BrushStyles:
Collaboration diagram for Chart::BrushStyles:

List of all members.

Public Functions



 OpenCircle
 Set the gdBrush object to have nice brushed object representing a circle of the size $radius.
 FilledCircle
 Set the gdBrush object to have nice brushed object representing a point of the size $radius.
 Star
 Set the gdBrush object to have nice brushed object representing a star of the size $radius.
 FilledDiamond
 Set the gdBrush object to have nice brushed object representing a filled diamond of the size $radius.
 OpenDiamond
 Set the gdBrush object to have nice brushed object representing a diamond of the size $radius-1.
 OpenRectangle
 Set the gdBrush object to have nice brushed object representing a rectangle of the height $radius-1 and width of $radius/2.

Detailed Description

Define styles for Points and LinesPoints classes.

This class provides functions which define different brush styles to extend the previous point as the only design for Points.pm or LinesPoints.pm

The different brush styles are:

See also:
OpenCircle
FilledCircle
Star
OpenDiamond
FilledDiamond
OpenRectangle
FilledRectangle

Member Data Documentation

Set the gdBrush object to have nice brushed object representing a point of the size $radius.

Parameters:
[in] *GD::Image $rbrush Reference to GD::Image
[in] int $radius Radius of the point in pixels
[in] int $color Color of the filled point
Returns:
nothing

Called by
use Chart::BrushStyles;
@Chart::Points::ISA = qw(Chart::BrushStyles);
$self->FilledCircle(\$rbrush,$radius, $color);
to plot the GD::Image representing a filled circle as the point

Set the gdBrush object to have nice brushed object representing a filled diamond of the size $radius.

Parameters:
[in] *GD::Image $rbrush Reference to GD::Image
[in] int $radius Radius of the diamond in pixels
[in] int $color Color of the filled diamond
Returns:
nothing

Called by
use Chart::BrushStyles;
@Chart::Points::ISA = qw(Chart::BrushStyles);
$self->FilledDiamond(\$rbrush,$radius, $color);
to get back an GD::Image representing a filled diamond as the point

Set the gdBrush object to have nice brushed object representing a circle of the size $radius.

Parameters:
[in] *GD::Image $rbrush Reference to GD::Image
[in] int $radius Radius of the point in pixels
[in] int $color Color of the not filled point

Called by
use Chart::BrushStyles;
@Chart::Points::ISA = qw(Chart::BrushStyles);
$self->OpenCircle(\$rbrush,$radius, $newcolor);
to plot the GD::Image representing an open circle as the point

Set the gdBrush object to have nice brushed object representing a diamond of the size $radius-1.

Parameters:
[in] *GD::Image $rbrush Reference to GD::Image
[in] int $radius Radius of the diamond in pixels
[in] int $color Color of the diamond
Returns:
nothing

Called by
use Chart::BrushStyles;
@Chart::Points::ISA = qw(Chart::BrushStyles);
$self->OpenDiamond(\$rbrush,$radius, $color);
to get back an GD::Image representing a diamond as the point

Set the gdBrush object to have nice brushed object representing a rectangle of the height $radius-1 and width of $radius/2.

Parameters:
[in] *GD::Image $rbrush Reference to GD::Image
[in] int $radius Radius of the rectangle in pixels
[in] int $color Color of the rectangle
Returns:
nothing

Called by
use Chart::BrushStyles;
@Chart::Points::ISA = qw(Chart::BrushStyles);
$self->OpenDiamond(\$rbrush,$radius, $color);
to get back an GD::Image representing a rectangle as the point

Set the gdBrush object to have nice brushed object representing a star of the size $radius.

Parameters:
[in] *GD::Image $rbrush Reference to GD::Image
[in] int $radius Radius of the star in pixels
[in] int $color Color of the star
Returns:
nothing

Called by
use Chart::BrushStyles;
@Chart::Points::ISA = qw(Chart::BrushStyles);
$self->Star(\$rbrush,$radius, $color);
to get back an GD::Image representing a star as the point


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1HorizontalBars__coll__graph.png0000644000175000017500000004620711701115623024444 0ustar reinerreinerPNG  IHDRKMbKGD IDATxy|TϹvTDBEEQ$b7mkVjҢo*ZUhmڪ(gJQwE=?;d2$$3s~\MH/Hobp.^#t&`{snMHk 4!ļ{h{ 8,nR1cL=V|' oᦌ!Y~c "2 y'WKF0{CݐiL7_mRiOc{?}vB/^E~"16ہ $mC9!Adyܾ?||^FtKѮRk[8;;% =73x?h]$ Fݞc+ݻ =J[Yȁ7X,?CM_BF ܚO#=8^rd\X=:8?@)A> A>ӽUa7+dP;;o!h =}I ؕȇF$9G(վ!~oﳻ9}`2 %/;! $KNm*c>'OM+BݚW>ώW~L)ϱ;\n{<7;.T oBdW~TrrZ8N0~k9m| LpQ0Mu;bU̍X܍]_LJeqC -qϝϘUQ%XctV[SLJ僁ClgLŪeUf70va]y J\r)o Ys跪}(M:|~Oc-(rQsF[79~T̊&YUl؊CuXQ&c{1W5:({hIO GvORC1\pkNwHŬ(ei_ߖ&X=*Ol¤㦷7~2dY[S6?4LTNf*W/~Q2YZ]c l1صfkUe{UX~!dJjk7#E,GC89Ykza_TX=)dFCÀ;I1]?&*S*b,s$Ч%nk>rl4n*R*?쎪Ս3~7PJ)RJ)RJ)Rk(pr\bÀ) B^{fq~oR 8u@ x~AN̝i5ر0y! g4MJ~DmM}!;YV@┿_J-B ަ1-9sh1ּd‘~p` v3IHŌ> ~ I~3xޣ\h蝰6~~(n~@=2[f+H/ *^>#`{>J&#zMygi~ǡ ش}__;o GlmM}>ޟ#hǀ1Hૄ#cǁ۽e* "qgGR y,2wfxzx;Ko2/u$aHuWXO{;8zsMWX(VEѳn2 N|!67isH_htCkHBkOWgrm Pc0Zρi\$U@,3="қKt8^@vǥo[xiDҿ㐤z?ƿ?N\o/\cׂtEtdkYoZTIB1xHO&Ȯ`aLGaLB# x'wۄ$#=@˧q㑞jx3o]MpZNʮHaލi*͙>8sv@lBTI^Ai+%:x'ϐSU$ /{뉿ՉxװMf*Mw&_^V<ՐꀢH6[K Mddk n50 9&[\F/;\O$wh\sH<>w;D;y2fQ7+kT"YcM|кN@u9ׁ]h9  3rTdHL'ב?QXjw 'rvֽЋu/!;\d#|d?i66"dɡmL:0k3kPSޭ+rTv5 Am]t޺Fc{q?$%gM+^2180 |偑U ,9en*:?-ύIٰ#p9r<~RJ)RJ)RJ)ʕ@:tWiSœx-CVtD븏NxMOM5+zw#?u=m|dJK\u[g 56UTYkC@deFC;Nmoz>j I:l䪟Am(rnHT⧱ʙ@,1vg|:8*s#דtEjfC׾;,"Ex @,1v kl|G b!82Z"f#Rz.9hF ^=8Eɸ%M&iRmI$$aMAYJeC*{l[d{(3<Rb됤;TqR,-S`G߄5 T&лv0|b|O)Q\H[$ yKobdNd RacZu~Hi,O+cTg} O[Ʊ">A؎B=Ƥ3Cz"#XFj?Bv|esZ r&ɲ26ǚ]AHbt7 a(C:vW`oҫi%JZ^6bДԝiwR/Y2 R"dodL d:x[ =7+1Ȯwx"7 2F"Q?,G+/.@f*QLD]-:K"PDxwٵ˜%Y\DMntÔR*AbwDoG:һ?{?5Od=kV*}mBg^J^OR[ ZB)RJ)1;vp S&DF~JwW7kSSWO Iƚk-\u5n"_q)&ǭXQ X,9vMIf;c!@0{ OS-gR; ExL2YJRwO D`j$zy舎5pi@rY %t&hR-Xc)&ݏ&"wdӌ9eڳ́`&KkḋXqx Hl9 Ifn?~Ef\+\c9dY[ScuI<5*U1>Y^Ah}a{{wcLha`6&"oO'#7m u:oIY1 \lͱksS/]TB_BL 2CL~Heϓ|Hҍ7{Mi"Il?dO Bƿ:!`*RrdR^ߥ׷2sGuښ#KGawdtRj-d^^dgR(#f ƖזEztbS~*ս';2| K@ y:sNh $OԔLH u& $f`O*E,Jd̔~$nc ԅ#kz1'߱@%K\6P [|G:׆#7a'"oulYr7h2;ƚ}U*Y;]'"FKTIvb.@:dwQK+k*5ZD#G,]g0rR*M9dnTQJmrʁ`%Kk0vaH,3Uӭ5V+H%7$݅ &zWgy٬JnL.c{kO*YCV/ˤ*{ɲP5*QsFQ=dګ ^8|R7%^udKuؙV%O$-׶Wa/TeooYj DۑHB2H@-)[?2)FQ/:" vg^|4R}Dd`^RM)\'XoeR]*ǒe|"yI4ɪ*yJɪC驖U*'ujگ uş+<%Y't*yJTojwp,/U$̫'IL++|*'Yu\T%OV=YD,RWA Y O7=d+92=)U`ne Dz@ҕjlXa@솗5i.[묱rRqnjU'g@SM_g:c홛* lg9di]kQeQ(քrRÚ?x0Y:5Qs9n 5Ttʝ K[3?v^=!Wդr*PwE'?&1&e}߻?rY_jC )v îv9I D]y?kڏI).㝏%VC2)4_[XW`9-1&*c#qHd{ R?2C:J6D{""|T(7lu]dJ8H[BKqD$9nx _ƺRM;^ϲ)bGdpPd8huSF58 dd:M;1$ᖋh765h5#jkϪ G;bW +lkF{Z82ctAb`+ٴE2Y:D5ٖ):T|zPhPN*$p:2l] +ב2Ý ]Ǧhq$Ʀҋ9),襎yPcu3b:Q$)o*x[(!u݈$U6]elyظG~i2>Aw)%vj#a3*=,C@5_a][c,-팓 U2ɦȥ)%><ߨ|qkqFj2g\#NϠ7 sc)v,q3}ac5G 5]rW *Tld{Rx lEozatG͌ V2k=!? gV3;Z]_ [򧗨䄢#;RJ)RJ+#VB#*o`yk,>:*4#S-yp!ӺDH" R32ueuDT Eq!ɪ2#{݅HȐɟߗ"bG7 +鞍rDZ huevr!{T'!{^{ VxDz4ԅ#/׍_KZiVDL G GMx8~< )k%HE(H7khda)6grHˑkd#/aZn=RXP}y=E1nS;H7u5T«  i%JD]8rk]u섇޿buvAĆi!4z!ux"~9#>TYZ.$$;+1KGʚsGIwƚv 9M'etZҰ=ƶwMx[:ߺ4"_rZżdA&$$_狗j9||a?ToN+ctӎV6u'KcZdLrlxRJ)RJ)RJ) ^5J)hw"rR׆׆#Յ#gG8*Ն#u5G)d š]Im8rS]uC:d՟۫n0r_hEkcTG)di]7c z;8&-ris=$ ҃< RD+)T[߁GihR7RA'r]}$2I7XIFʢm;W:,쐍 \l > H3(S/ kW!%sR?"e! n^*7^sw:R- .c -=ζli88VyP=K¸ԋ%g]IK^ޫHɳ)<кuv<)JamW^O*ZM%FC#u™fSYPɲnYS 2V/cJ˔CngeƷl^쒯a˪UN\[ڦcw2;RS}_t5ƚLj8U٪|^+Tl,Э+@6v ,mߥCveAt5n= /rZ_ h=x+Z?-(R:^˥ڦct{ol*ݧBisYPv,W!աAvWF`̍HrmPdt&"vޣu!UwEEcch9jem*)N׍6t]p}=K uiyM;&tMzJNI$"-OO RJ)RJ)RJ){N7=w`OJ6‘NTҥqvNUJP&Kך~$muȱu odk}yT ~okV[I`Ǧ^$k1vtvelLY8 X5oK)+di1Hul pV}b{٘S,"\DvzR>*diz+;=ME{*l7-E2mMYn{OzEj\Q)$k8I"񉺽m8G:!Ք|q}m6UnRmMYuȪlQs Gl]8rh֙AH/H ?sl*5H5#a1r S3$%~i){HT[yT8O A*T"{y1ޘ LL "p`T򢮦Y`M֦N=en*[klb|a2l9C#XjT !dqOKHi)YE)+T 㩛O}cm#p3-%͒m$K^H)9Y5V+}V%ڰ+6fug.!=f*TM!LK ItHt,=v0p KA^CH ŅO@FѪC*Qiu#1H(2 REh2MC`!K?H׳R9Uc7#xeA;BexIch]l7V% $?ȤiJ)XɦeHb0rE9omA6-0w?y{R*MH`3uXGo(@7y[ύ]ƞxfCGm`ɦU7{XqC,e'~:!2)m(ݺܚwE`5R/1|8tc$+* ;9%~ǢVGדdh:Wm(5k;վBNMy9q#FVzJ&Rm`pVr5wZ06b&gW*=?LS;վMzl%Wmk# 'cO52zi嗂M57y~>^窍SϷ.m^@I&>|~`;\&ː7 Al0֔ʮ_v~ i|C"N+d}W5-Ug <5sՆ0Z  k9Eb'kYalpp/Ì=RH)j/$ tE z1RP_o#?@n@$H%uV`,Rres@ΐ:J*狀XChI'Si7ўRYލEzn@7gFwE aAz{~7Z3vQ{J%ɲxaquK[)أӂ^|r'vlwdWӪndR,HwO" ewȤb7+, m_Zs 8^/r=Цf5v<ʎp䩺p伴Up|]8rb>ʳBx89A\[zR,.Y}ؙ]E,wҒ7r)yiҭx>ϻ=/[x6~_\ޭx )׋!wP[9m^*wWB# Gb>qOR{ZYMxMM3ʛm8`JB#\cO0,'/Pw4*ݳ4r_ i;{ȕVj *ukWO)di]kIvq{k~R[SJ5:\A'KY_/mk6U8kn[m0~nuU*d <0{dʅcw c O4<qOZ)3J)RJ)RJ)RJbSXB?uHD~V92w*#jTWr]‘u @Y,1uP7Ttvc~y4t'P^ޥ?/G{fp_59L;,,|5Ԙ؛EeOzN`MW*|g'~~ǡ{WX7b3!2+%9b(Q=Kc׮1أFjcE),75V\vqLn;RJ)RJ)ŝߪ;[A8^;oow?u ?t]nԜE& Eʚߪ5gߡ>nzϭ~xThMeḯMn8xT~h i w,*,/w\ 1! gM^w\*fey43w<*ѳVp[m8RT'DF71'|1#cuԏ;.[eT`ME4t߱ DVkv;T7˹oܰ L߱(Y]uÙu xTAѢ*%=K],y`hQd:Ls/sdԽ߬ GS7jfA dMS[S$(=aNztXc͝ϩ>GS2߳K/1t´ 5;nxfICcgV[S?bZuÔG%nAVW_WSq(JOXnwAuGuØښC .kv;r3-+wŦE5~UBnf@,5C#o\h0_knt]:E~W;Qxw^mM}὿oc)8 Tn7z^oW6'ȼ';"PBхNYsO^*.J缵2_E)UZ,noWV(-P=KMJ)?g%GK75}x= !Gg*2Yf8fVL7;sK_O!YzWgL{20ڋqcJuJ,0/~ G/x8x-mudDdNVP4Jx'{|;$dm7!Ќ"_-7$ G{s;I}؋a)͵AiI_#ag:Z>kŞǖ} p_\w?{w [~1#ᆍ |?z1` [H2G?IWvcf2H`Qe*;#oǞ؎ 3༸oCx&`!0{>Ye{{rd6Wsg824\|-U@8nA?PXȮ;k;GvAԨ4bTW{)% - zӱ>ݞSd$s=/*HB[Sd.M1Kuᇤ7p?ػqHd -]| =_v"d&dlr0 e ^Dzk+➋-*EG]I1MSU' F˗#d*@9fi<`㦇Xz%Ko~$r Fv ?_dn?@oNđD,m#oS>U치K}\ ŌCJ=xIr*PL5}ptj[>X]"9j 2; m~ɻ0 +h$\Z ?=~8#ZtkDvڻ/CL/fhdݻ-?*ؕʿFݣ.օ#|X p?ҳ%A?G`dWEd7_ȑǽ竐_t2T6 5i,L,Azw su9 c Ş p3{7"ح{n G$3}!rPg2:::fQ,m/DLooeGvrjRbHzĞِ y0[;BALh ѭ GI>V6x;! (82K'EixF @ Xs4U%uPPJ@` T# ?~CġR*:3f2cSR*4Y*T4Y*T4Y*T4Y*T4Y*T{e̴oPsOK@CA{P׶|󔞓%Zs4 hr(D΄B}Oz+GLf3jk'DF7OHή ckݳ9Bts7Mr'qWձxUUU]8ӬLkv֚1|8'^PW2[,}1.ԿՏǜm=x٨1v_Rd /"u;R2pyi3TZK1ֱY/[~O*iEqꐕi<* &^꺡/a2JEf 0tLYVQ$Kgg';Lʊ *jn1Dfk͋KLѳTE\oἨ5T\yjlj|͖s1NY{~R*W;* O8 dJd .]:e?)=EѳT~jZ o{W?&OI8Nk`C^t?-%8Lꐪ ~f}|^&dai)~ǩT6*cs/.߰`7^k`k9ooJ)NU0`;`Zb] xM#SJuc^w fȐ]&M0`bcU$PM F<fٲ[;&Rtr2rW(uЀr3ln޴7襤]0󠁝]߱р.1ܻd#Vm1)巢LV6є j3`ěd -YrH﨔*E,,oW[S_w,A0hФnz8%Kn1)UHRzB7qGV )ds] 09xɒ_;& )q:c%SRhwUjUU:ZѨORdY*+'Z<|/IB%rE?Ze.E $IDATO#Jɲ UVα\lM;"h4?Pkq˖1)$%3f9}.zov]q_k=pٲ5Q*I*6ֵJȷ BUc -Yr˫~ǤTLĚO>ߡˀoyuc-e1)T%,TwirenիꄒI"'cz&^jpҥ[[ ~ǤTЕpךcO8jO~Ǔ}BUUo`&-]zNETu+љsZc'KwvϪ[`iT*J*YXcoر5acɖ~.,+2Zq]ҥ7*6%,'DF?kܦP3cɆ(+kz F|7Ib;XeıƘ8MG,^FcRpO]uoO++cN{ҥSjC)H{%s%ʏ^t3ZDTad陌qJ|W$8Aeefen~:+Rd9OkA.麡׌!eYHVJO,}Կ;:N@?}1)w`[n{XcBǑ(Uڽw]>PEk0ʊvرc*Fg; B(T4Y*T4Y*T4Y*T4Y*TV3fca=䠃q6nwN 0ZJGVz7|3Æ +裏椓Nb ><orQGem}kNwq1b.K/4[)U:ݳ\b&L؜(zk.z~;;믿k-?<'x"x s =VK.gSOeժU\uU;N:W^y̙e]@$OouSs͚5\tE̘1N8;뮻uꪫؾޛtӇ}?3.`&MĊ+2zO*6Y.X}vm~\`?C9aÆq}ݗ{'raļy֭_=O碋.b=`K.LP__7ߴaݺu\/;<7|L6]jO>̙3ÇsUR+\g=xwcŊ?."͛y֯_{Ӗ^{?k-}ۜ+}^x1:u*[o5^{-?&MáTt\~=ݻwOkN;22d֭S.0`Xn]t .}-/$ۯU}],Y 6rIСC7'~|;a̙G?je6k׮ 8=cdcϱ^pSSݻw+kUtfm믱ֶ ?>˗/gqjŖ-//gձxbzy<\,QvI'>c aY|yZw},])Sl~,:VL|bR7N=Vc?<]w?xF1chhhsΡgϞ=_򗭆T*5c=hnn޼{!gϞ]wů~+~***6?^"ɖݻzVY=zl_䩧kiKtzoR6l~-֭}rgOpUWi&BJ^e9ꨣӟĢE6?ko;b vaF8̟?ק|[oTFM}}uV\K/DMMM-\o[<;D76l`ڵ]+V׿wܑ={foL8P(nơW_}QJ:tiUQ- 8T "~b0iw`8MѬob$s "X$48 38ۃ̀ioج7OtZ\NPHDdRx pv}WjUպ9^߽T*fYpXjU}}NRjfr8F -U\kٰ,,Y{s=svBP( ,נ<{3. A,"PF}@_e`Xऱ-dD@:PX[.}0c{v@dJ ρeᢃe%u!5%q|hS ҇gWgroxoa 8z}a5K $F mmqYyn p{B d؏kYn~ b 7bYe7\tkbnm%/agmF]bq\F]><.!ngY( $q易o!s 1xf `4uhMBaECKY@bȀ_N&"6D Vv+1R} bs0Ύ8A)^ D?cMwtf?y7Aqwٞ<}XBdC% 1VB5+N N"٨ۏyQ"Vg K01_+z_21~>@=S>52[t,GvcF}__B|ۏ.>brߏ7B)Fƿ=d1z#`Ȉ՟'xHQGEQR$DI%EB QR$DI%EB)/WoZ֭>>fp}c'7t[4b?l𨨨Z*{nԼ4 9JŠ756ƍ]Cp)/p߰Y<y)cF|ӮizO!/E(uqaurK_LHK5SMc3a6!-0jûnY/AHKq(DFӰh#(&d$&4q vL"dX,_:LW.xp# !+BM3HJ QI)kAG=44K_0ar}$> s0i ƸѣW'RJ;7̔;%EB QR$DI%EB QR$DI%EB QR$DI%EB QR$DI%EB QR$DI%EB QR$DI%EB QR$DI%EB QR$DI%EBgeM<>^?~=i̙̝B(//w[dggo<  QR$DI%EB {t:ٿ?OF42227o&6~m WiiiqdD7oR]]O?=A3fQTTć~jeĈܹ 6:7_}U~޽=z͆f>cժUݻV@Zlٲ44,X%K!=} EΑ#G((AsCee%XV*++%Sl6X- ..R۪Yp!TTT/8pBΝO<ݻ픖o>x픗s1vͦM}x1fnܸyuϟgxb8pg7Aɔ3gΐȑ= :k,ZZZp\>}*Y|9999QQQK/9u%%%ljQFl2֮]ˤIq}z k׮QYYIFF º:Xn-b͜8q2Vk@+Ap8ߟ.**l6Ljj*X,nIIIfZ[[ tR\\LBB,Ό3Yضm۷o`ذa~jkk'??)SCKJ||<׮]Cn@}}=L<Dllb̙3ر+W:u(k׮6FSS VbN|EPL4[nQWW<Э&O555ܹr2220L=EH233yWۜNgPcDIAA/_vof1vX2331Lp8ٳgOz-CVVǎҥKb :4-hmmeҥNSS?<>yk.X,fضm%%%=믳f&L}8y$ӦMQXr%'N ̙?9#n… L&ƏԩS1n8ill:vΝ;GZZ~ ]׹y&111mW^ŋ$&&1gϞ PyԯYbcc2eEFF.9S8FO4M& 11Ā ()H"!J()H"!J~ƍ+?}(jBP( ǷdIENDB`Chart-2.4.6/doc/html/classChart_1_1BrushStyles__inherit__graph.map0000644000175000017500000000027411670177756024512 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1ErrorBars__coll__graph.png0000644000175000017500000004715111701115623023403 0ustar reinerreinerPNG  IHDR/8bKGD IDATxwTncHUW,bMnb"4X[IHCh4 j7%1fc#4a‚X,s;;씝3wfy^ڽs=Sy9PEQEQEQEQEQEQESO=u1 kGqĽAۡy٠m9.OtsZ> kܠmPƘqB5qiH̛7/h?iҤϱ(KQD(E:/EQu^%v^oME+ݻxB`\=|;y>3͇z|سuYi8Pq#T: ABkgI#޹ہ1@;\=W}^[׀3|/EɔD]u@+0w*`p:.?^4? T"f2p<>#oT@C޸ӁC>.׳B6MQhG'{,pp0#czˀIrwMAd3`݂D[WtDUs]w_;s !G{dVS)>ݟr0z}v{yU"=zxX$/&Gy8EW<'Hs@ |L( آT-(JWsx}vE#?{DES׎qC_H܋t cțz FGx< GNѮd]\=ˀn`(D@i\`R:^BR ' $j; E7># 74yB~m}6> r>È3z{Hq;qd!!Eɐd?;ː\2~u?D)B!ݶx5ӻ]d@Q-Chf@- "3+EILIbO}Ip=_I1>ɥ_ d?)ʸHT|{ j>W}(Aۊt),۸I_PE~D^!uĥ(+@QD(E:/EQu^%E)Jy)Rw6is\۾zky-_{6):~K&h;Jk޼ysa;w:kZm}by|(Q1̛7orZOGFżsFOd;ey?oz|Цwn\t, D~ޕE?<+Զ4p^=sljbMc]Bƚ?Xc `=|Z٠R?y‚*6Xcw%6` e,!""qeMhOB?>y‚56`Xkj-Jkl%X-@Xsb t yUov_j5]',>&4 LWmWwjw:f:Rc!!>*Hr 5qpZ)vub636cW4ȫj dG^u bǶVe1߯ % BM[MCk2-e] ݨ$oq"9l`4eB)V7} Qk: yq^-]_KYRX׹X X@>e+tj/(JyI0w6nNȹj5HȜ6(EF 5]ubbP s5h7tw?kkM!:l >EX1&۰Lm^c\35@SKyviEPSyB{e\1(J0(E,tڊZLrbRyuPv(((((2sF) 9öZ?鵿u}OR,qHr=10 XĊ0vKQ'?{Xg(0.<156trΫ hF[AW\g0y˰5{vy/[bpE 7p }w}u3|b9XlB+IǕNÁkbxCgĜKeo"&K^k܍VɈmIRo>)gtBMà kŚ U9|7[:G6J8q*'^O 2&s,z0#S N89C xx޻vw^F9ql8{uao"nDwӁKc2_Oԛ{)nEHQy_C # ʡ3X*$ູ: g#WO,`2*b_t=k(U\g_i6 qt~StG@Ư!]xڐ.$O df>2ƍHg]kf tHtx)]w@ƕ{ad-S{vxmeCr1v:~ ɏ$c-t9U:}"b Bk`Od_z4q8 פ 2 qSd,r?H`zK_{6,(_i\i3b:XsY5 m8L|ãޣ2KqN LG9kO@d*5>,/ii[ ,sXx39=:A}Xd&pELDHZĞȘSX.6Ya MerD޷>#Á#_|ȋ!%~;zJuψP^eƖ4Šm)E򪤚g ƞ8t%:.*=#_ EQEQEQEQEQEQT;/9)[ u9=~{m>|u⺙EQ"mq&[g%sZWKe1.Wqp/t9u]ϪZCmO)ӵuhZ>aޏkl?tl=F#ya%M{6R p:ܑ$Uc֤ĢR>d-d^^)t(&⸘kf{A@%M,51ZUbo/'5Ny,'"R7ed9{2Q"7בhCGbHzR X!v^c㾚kltAw@M@tG#ӥC]s?G`t50ɫ3(srmu슾u"vUOE4hqZYz9"s[W# De |gIVt%V:K54,yv O%KryUUo"5o&+XS+A(@vDvF|!d#7i:?%{ F#3u~=mqm1O-Z`kH$K:2бG$G#6a{"t0U4H{npTܵMttcy8;7?bTH0v n{T6sE.(刼q4*H$ǎO s"<õ3xю2W.Dg"U 2!(J %̄H6;d$a|;+J)eB%\@+JQQ2ЅJ62ɹVEQ(u슾(rUYi2.9uEQJ8/k|J\cϲ|=v(J̮ O]|Ov:ɰf4Ʀ弰:'6(J@5vXv:ZM3RdG++ ;vE%0q8RED4ʍDV`yudBF],Sk:֬ ڎRwi݀2Sy#K^ԘHѤ"$,`Fqg"pY/:ߝWujV%~PBJ8Ĺ~lo„ ATj2 xzב/dX""}^q$\"`^\x.V9]TG+f: U6ZvU@cGAۢ BMGG jDٴ 8:qpo"T!cW[ *@Uߋ-A(:7IF|ɈQddH#7^IVQ1{Qua{{mARqۃg@g!):zO!SqfݔI6zK;dz3t);9FSb rSJL)`Cy>{m};h[JW 22ގ9Wjl 6:o(cV~8mm1Ku^ 2KTBy# HneOC9hFEMH7ȬfA 3ntȸf\:~D^O& ro{z{,휊SL2zarxOD죌Afdup[Q gҿs#9)H&\=uc$dyM 4vzO dYhd#$ݱXQA;`o4#3HR]|US=-# zJWXSvw^m;2S |̐ݱX1pacM,;h[J_g5KQJgM0v\m_T"LYdMж|s^sǮĚ_u*J1fN. 9U[wךwSQ Sr8y7Z3 R_uN?KU[T%c^ִO[4~s~*֒ıff̟&JL]R<{XPmDXidɗE! GAnBTMQq"duNc awKU`c]f"e<^C5Qْ7?_}RR$S5 z_@$b&\y5T`)+&+(Jq ;$Ny~C#9܄`%s"QwHWk&posU<UJݎ;\"6!YѥAkHos1.2W$/JcWTb7h[z 꼂c Xx$p<DQҞL,ˉ|xk4mBjTe82!'&EQ%HeHdQ(ץymz6)JFD8 SEɢW萠H0SW2D F P'[͕'(-]8t(D^g#id YuNy CDӻ!jG{盀hz)>q&KQݐn|{q _vἒՕL*:thw8S?n2hu^/d*1.U /hx :ӐR\l}ۙMDhWeʅ)^?~Q%Q8kH/uEke^Wݨ uxJTbi5ڎì5k38bAVVJ V7u%[cdG[fӜEmKO絣ynaHinrx)'ɽ&k%C`P^C$NKÈS@г9)0܊&R;es~~ƺ]ԥ!tFc]8~E(L*:$jG@7օl ^*q7ޑ@wnT!ɇqXS%]~Nދ_"X\|u'OzūfTbAh2ǾdkXVf-uJy=t.ELQñ4jz1 IDATO"hu2ǁ& D޹~:)%D ˈ.}NƑk@6k6[cKц <9$}3$*}~vGzFmt@_5vw\,yįӴnԓ3`qy3+[G& >5 !\D"*v0r xfnf4օ?Pmul܅]dm2Lc]})g`? {xuƏgtU!leݎl"W7gz}ʜO06ܓB! /ߞ.lvw:% ,Qҕ1_IGJFd E*JS3`Fm_HY.Jy10 [M*>V" 8!?A½Hu!&yPCmB* *CyGVzU"t2iSI.r@T$^2䉌q"[5ԥfIX"DwUB4@$f@[[))zҎdȋ;"5R8^ 3TitDd]SIa`YR[RdHF׶OUyX5=y=DA#27!{4BgEtߩе frJ ǚ=еAF˩hE|6blw$`b`$EU,FnC]_oZ L"J7IWP&c%U%!PTLEQEQEQEQEQkX|nv(s(Iq;ocf6CR̮ ]$h;GcH]Z:9c|;kO_2(@yYG;(Sݲ;ƈR d\caM]:D~HL%1VWA$59n:qe? -ʦ~"dt%1n{ ,>لFۯ#n "8É_bꘂecv\2wu^o]ƺ99QdD%ȗ+*8Y|"eCwRی3H)'%i+w;6лn">Q(W C_r l>MOq4pgj6emXG-%}|r] V:y "|K'Y9T/ ]2b~9ce[,#tN~SQmB$s Cc+0 YL\ġ~H1_6-6i+->]=bcv`WRo275t- NNEltۯCF:J5xCCKqґH<5$|7ٹ|7O)i9t_RgIumlq.Ol?Yp2$ew.trrݙ-۝AߣTw)kNu53lJHĚ2c %EQcT+苌|FgI/XSri_6@Ʀbe_F1~dy+iNEk]2qHrz{0$UmU,d'(#6'H;X瑪\Ϋ;_f3,ӉKF 9/~HVBUrdLGdUNQȯtrwID2Jb:8H2]CSwq.{Pz=Im_kpzR]Hů 5TEQBc]̆PSrlEQ# י%14ԅol5~EIp. *L M c!J+ ;m=9`XY"(ѫg{5/m=yaXK kl_鼌} IUҧek͘?)ݕJ)He] yHж-\Xc3,O]R t^eƾ%)) Ϋ@yYs븏l眳h{fuy%&rW^G{xe(<%\,ZL絎=;}qRV!#5uqۘ(c'9\Q쏨^8)zS: ѾꃨY_BD}$7Roյfb5˝+JOf&posQMt*.\TBg4a|"w<g7 rKII2e,!݊ht/t"=fd$+?fd2Yp2AE0'Y>J MDc+(JhU< (1AQHT _T4:p/$SEd2;#O{^G34xo8{EQH&K8xgdKQdBM_q\umܲ$1/ubocimzc]\SD=Tn94օn %96͊XXs[6zRȀtJr2mlՊb|(w[$h[d6#[׭Zu) +l.2WWMWoV$g֌S[JqZ`9 %99/q7|#ЇRT?`ؔe@yن,'9MoYOf)EA|74Rd漌}BtSPVml>+RD?8/ɹ3+:VR!4 u2|p@碒:% jE)QAW>Q"BC=;:{ QPҟ Bcf!D bWv2"0ED%bKD-ylEV$u7h 5@N%8x.l:؀n(%O!)v kp^b@8hOQB%E1QD`5H4?^{(AsyK+nDDy:nE ,Ů2wF%;8~ v|iQ<"u颡QgǼb6^ ?ͥgׅڋ[{9ƚH3;rjwYȾEƣC"](ϻHt|Md8]$b,>ۏ;2ࢠmQ##5-\.:}`l ?n\Xy{b#Dy{eG..\<{dylc͜mQ'~M+cu슾l7 EP(HF/8mQ'Fc7<;me'*"eUU['ё^"jQ8x2MAK摗5yu^,:p ,r=1*@ͧZ$h[ɪh8 |men[)M[^RƼyX 0d[ﶕң!kŚm=2v^ƚ{Oc%+-\눪dEvy)(((((((> EQKkoʫۭ%ohSl]j/"U2'$ղ9? 6j%P;"Y\ZU^t‰wɊ!혪l.YCjWiG0ط= hAۢdFv:|bd1R.x6a\F(Ʈ$ۉ9/x;~q-R\׍ky1Y9/֚MQb͵XsvKmR4c*b`56~@X]NY;Aۢ6wm^=pmQ2'1/cұ`mQ CΘ?=ea`jlc_mz䅩Kx-h§qgF.((((' fׅEQG2’ٵͿgm(#^gGTj쮉zm(c6 4v4|c?2|s.{}֠mSrOCipP!ȫ!tFcm~k?̚u^6]Ji5Ukm -?dmf<u/X\w5ƴU\=Jq$lU=]1fZ^w!X͡׃E#/BM>SP!tQCi@ж(c8AۢGu2 \o6Vo>X+cM7 &>`I=q\u^%DΫ="8iBkkU54օ_n _qˁ}J87W "kNM-@ĺN9/i Mm [7օO >%-NPF(1R؝09k$\Vy!h=ni`mR̮m>UE'=*>t7[K:E1-\MRJ􈵍A)Y}ȱ.uჂKQJrLCi:س}׍5jNf^Q2GW]YcNÚ6 &EQuN[(2cP93:[h]gaP[*ھ578$X lMAۢߜkJSOy>R]MJC0,{֜-Jnhy7{Ғ\](3{def6uG10L/\\-Jn-򲑲W(oǖE^{5q^gP~X1 C˂-neT2h[[uѲ?>1"p`@m̟uk&cZXP~gse[)h;lvoж(Ƿ k^r jg)@0kz- 8"{ >p]g,`?fǪ+Y t,rODɸ!$Jt z] t?duE;v7c@& Zu0pR7lW3#Fg縍>}' <$ fڐw~EOIƍOdW!lfd!1 U<=y)CY䛐5H]&JLV$T8Fde$2~H4 AE#' c7"O`Ddt'I2Y~]1e ҭI4,;h?4*aN@Cnf{uӑٞXnBVz)vT1 ꢍHNDWt|yEQ+z+B#|ɂ"9E 5t$ FFfMRqX8I2Uxht1l~Gr%*JМ׎qCX& \W$R,MNo+xIW!eHd]G9vh,}rӝ$lk#x4آvc%KTOΝ:p\4B" {!Dְ-@kH<8h.3h# xE"ɘ{v<M٣( y6ku=yYr ° qgF"n*mA:o ={~MmR2yYK=~IFfx{tEz6ҹ+HtU}WWY3V(J*=k*ʎ|K?|2>- *$y4[6TO"ꪉ(6uX*1wFVU:bonRePӫ֚5~t7,kx^{\U5j@{G[D$nTgLR8=fĈ]+Ƙ~L2 @Y}蜗(YeyyyΙ?ik>TrСW1&c8Z{1T0U91̖ߪR|%_eem'X_*5c --7v_J v>ƔMj!E6eA}p]v3ޘ ̥WM >r1L chZZfMD+9Bnr$ZzbfcF"ȹRr:/TTcWEn-.|o4KC^>u+5#{bvchDxIDATniySz꼔1o9y싎jiu51 ZlIkf"m+1d}+ooXˌ5k]3\[ήj}n͚Y(o(J?r܏ |+޶mFj1Ƙ׬Q'37Xk6.Xf 0lпjm{ vk# cWʭ]{A} ۺ:( g-SPvtjjܶ?=앫W8]݃1bz뜺vomfPks`߰6RK)64a17Z fr lK?F]G$vYs߃IQ2E=#OD@ׯY3KRԨ*yf6}<̭xڵURRuAPJ rͰç>|aîМ:(1Pmm -W{mIt]y8jv]m)r̰aӯ޻IRrTDc]9͡aKWU9Ukޚ5~n(yǽp(h[Q.WUU 5kf u\J SP낦0vARL v7#gIQrMA9/\:'ͮ ڔBfFç7cﲖ[ZZn/m䃂X3y1AS |1zm䓂 8q-ʰaӿ8勀rqǫRz"y)ɘR6b[˵|ՍJQ`T vcL[Aۤ(AΫ:ʃq]zVs6)Jܘҙ#.1,Rǥ(y(C\ܷr1 eФSEf`l>|嘖YףKQ:QaN}G¯7v ږ\3bo Ԯ];멠mRB(WbMc_mK;vFaWZ洴l{7]R͘WC+ƚGGL ?1ʝ!2Z5kn?h) `Z?5N[=~1bX놭5)KQңh5J`8h[g3lZk<޾իJV)JP4(uԶޗ,:(Fd HcիWtK6)JQT5'HO%u+`u]%u\E缦7;{r|'h[W\YUi[m+Em,FF޷gc[zO`]R3je{D"Cp0_YmEm,&HicZZq)_h1'(>_nwo_mkV)J)gFbd$b-- &E)EJfv8w7aذ+'E"{lp]wڵ7-R̘W{󇀤s̈1cgZ[#RUqnޭv/~ۣOи>k^ϼ϶f٠P?yY'0l}khmMu %/]y]{yERdƼEYR(Q(JQKQD(E/<+cw}9ꨣp[rgTxGO{~uQwD0зo_&L}oKQz:YG^֭'Æ cq|{Z͛;_򗴴]uuzlذ{ϫʺuXv-O>$g}6jNSL֑׬Y3f ^{-H'Ygų>رc62… 9餓uͱq 8o>??̷٠(="u /0mڴAk۷Oc̙X+O>$gy&Gy$r X~=\s ='p{.ׯ'? ˖-37pm"%Kt:^jK,裏欳UVuƀ8]jwq'O裏+`ݺuiߛ:YE^*fvE>c\W^{>`ԩs133g &/3}t;8X|9̜9#GrsUW>.PYYy˗/ζvۍ1cl;鸺/K/#< ̞=^zmg /;#UV|rfΜ ͛Ӿz 4믿?\qټeR2d6oL޽*{yQ^^Έ#aӦMTTTp뭷{2^^^ΦM/b!ҩc+Wv95fNm[#<ѣ?vztA̛7?~;^~e_VVZȑ#u޽{^kE dva>#+V$0,t3H\CS %D[c54j D Z.*3Рw|3|{o=wc,tBL$!`qq稨HN{]>9cn+՚jB dymooczzс`0F\.f܊fEy555Y =ooKKK*PZZ> ~cn _m(++nTU-(ߧ' cssSSSH&TD?QQ`0 333bqppS>EQP]]P(D"yh4üm>㣪ڶq\8::Jq}}]=!=(XYYAmm-FcAAE8x<\^^j7(U UUߏR)qWWWy2!IJJJPYYy|fsssECCNNNYmUٌH@ an6 ===@4F{{{' WE466^/L&">ȹg󺹹A@}}D"p8 ٌ:Ȳ 8Μcn`XPUUUԵ 7J!#LfejvnFH??+^b񢟊 HXHXHXHXHXHXHXHXHrmف( f9}{ո<A4IENDB`Chart-2.4.6/doc/html/classChart_1_1Bars__coll__graph.map0000644000175000017500000000030011701115623022343 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Composite__coll__graph.png0000644000175000017500000005553611701115623023452 0ustar reinerreinerPNG  IHDRd[kbKGD IDATxyS73",c L2XֶVqZu).ڪ_[m2Tloxo[km7\d[Q)npYɄ$dyޯ׼$'<0|=Hަ5>) P3*UZC[cدSqH~ٗkm 6eTJe6INk uWstUO` |G76pJmc.&8*U%֜5YcO3jS -9xrk&n6a`PM9TvהgS7gX >#㭱"kҐrm}'5uc7GS[>)Rbu9W PTdB9:2A&k`qc;?d;n cFT[ WO,jR[C;7` ش'嬵y`ጅuH!;[6@| GSJjYIc\`>U**![ i`m ཱུLFdܧes\cUZbu`fKVU `tcl`l:tʸ;LRΚ7qY3ET**!iY2;rr``(2M$O nl { pm=|W1Ŋ[J1`\ch,J1rs:_#-7Y~a3 k;6t6nDMo&r*H]4oAjiR`_ 5Ծ/˗C;47a6I<߂5>0f_kl](UnM}bq`?7L@FJ[sp0~޴%;aɴr"jn8y)UȪP~Q*vb5k[zkg73S-PJ)TlB~$L<08Q)T*6!x@)ĺ7W)J`J)LȭS\k{7tt*+DZ>"89?ٚ-:*3m6f1^mnXC?k4uפrP1Ӭs-.Ck]k_>sAIy8p`^^Qoɤ7_FmѶp0w$XLȜgS;H˦؞c|phYnj F BF '`dbmWڂeؗ"lܿwf |C`` $9`Xʶ?IjತmGr I$e7iJyNt_|%1>R][dܸӲĨP y0vD]]_: -ؗi5 88IGӁ/ ԃRIdJYT`w$_]0$F8`;xi`0;i_A؆ IcyadO+ \J'$"Rd<؈5B֩ȊI]rr]iFx3iD H~B[mIP'm 'l ߅g-ՄȊP6I&Auww.IJUd\s-DT[ǝ$ߏx2*U{uxM>!Ǻ5'̉bC3vtmUVMGa9T4îCu sK"S^7>MߵI,BF~`12O)N@7E<9Sc5)軭aE':d gW$=y^eoO c8sBINAIKQbBg{x2D/e-{K}o[פMNUCϷ5G.8P YwRKDFo"8GN; |s xXROM>yo^S[02eT;Q=_?sVc)csy9dk% |-$dX]yPs_Ѽ*@77JHC^Ja1])RJ)#ڂ~ǡRT{=ӷMXiaRJUL{* VOPRT.!/1ʒlS2얽uN4ĭ)Z1vHٷV5d}/#1Du'vAxYaB+RߜkN͉Sp%'֚bGUo!%=Hl[F .B UB吧4ƾao۽HD){ױcx*wv{ӷt"%Y˧ }zbk0v[~K{aKTwDZn'd*i4=Q>W:J|nBqJrKB_[=>4!ot4|dG.!Ij99!<_M dEL%)Ǽ8$}-ܤ;~&Z=Fj7G40H(2JD[0h9zq(&!d`R: ;F $H\v~@@ eqruH"Lt)Nא%IoUӑPW!#e@d9VA#sZO+1R)k.*$!)fOh8qт[% 7&d|{/鿷W#x%Nƪ|]Tc&$Kzl0R8UuHN]Κ[#p ߗ&,UlU9z_Mh}x]6#SNAY:U6g2:zO ץ*DG `RWUz_LGrnLaf?q$OE ˃::'ЛAj7ǜ"')ȷȾ*3%MkKy\UqG JD Qi5I{3SZ9v=ґd}OfmVd2w 2y!C>`G@(`Ć'wx=AjAIaiAenÝ/L~{LtbkJc%FqMO%?wF壒3 ,*d<]{y%/e~O]1pst1sڔ,!f!l ΁iKjբzYPirR_cvRd_PNu:꘹ +òK*T,!x9 :f6+'RJGt.>Tf RKA)Jds3WOBր5kJc[*TaUu:eQ+> ٝkU4!0ƮF1iXcQ9 \[};׎'t'QUFr н`8;[=[!$0pWX]IcRpUzsR'rΑ3dbrËv'ɴRJʭ(g+0)Iy]Fѝí[."n*-^0m PUF"!'''de9:u1]DmLQ''zr1jF;i$BĐęDoiȈ4>8cnO]L̿l@Q!lYoTV:ideYܻsu<ɥIOT+_[c4 }зyU3uĭH1sunysk0cArTJJSU%swyPJ]d{/ $I8_ۑrMM&d}xʖ-uA~aswp\MTA,5#\^AFקy|R= ˾ɋ I۔Ǯw?‰q}S *3XS 9,8jP#2n(ƾ-RYo|&7RUr,!F#:*L;cd##ˁOa_n-a۾I!O;jTlPahYN5K[C;K IR7kkvT)tK5Hyѫ,ǽIԉM8qQV߲wUjತ#nuSid{bOR w*xLrq2cYoDjL#SHcILפl"R4Y2"t+!ώ+&F6|MŴ92#HmcD+㒶$))q-NA~cd%.C924;Xneǎ4l%Q1Ȩ2SȠ"HbXcEX|2͗p*B<S&l'ЛANƜǎq8>l2,xLMb?{ F;*֍|<ҏh )TޟEH_LK sϫBN$~I97;'k<ĩF^nk^wUn]!-c Bs99N#}3v8]҇x=ּw*[ ȚsnYh '2vsW׶`/ѻ.:HvMVie~PpYt);V>)zL)Oܱ_8)hIy0I/ RJմL21R@![c'WJsBaFG;UO.VRՆH rsB9@.ׄd%b@Ӳo|6V,C%7rXg-=j< T83W)Ymȡ~QrNƚ1ř͌#Jf9x*(N :M܋\z/r9k6]?7vaT2pR?ߧpA$K)V4 u;snGa:`_פU8>?\Aubp4ܔuw x,.7 XsUrW eH9˛]ǚ4:ܓ[K|DKdzMhB.7XKbD'ݐjpm4єu~xVvPvK{MhB.yKuʹub(T.RXİ87KQbdx!(҈3U]!' oOmzʂ!+։!S^g˲_ڂm-˧G52~T^;?1sӖ ::9ѐ^*+r생M uU)C.v <"ح ݯ1YޗY7.}mE괆#C)U'@|?mĚAJ)W91V[oi?XRsB6񀎐s4{E ysEBz)!r,r~w'1qeY./~=v=\XvSBS|ޚgOUz` ݳP/D{y>wRYU O yNYM]a,X3gV :UBZǎU P*ƶ{mi?PJm2Igj&]{(K'nH3W:Ӑ }dz 'L R5ۦ<;8< ZGoۣ7":'" mJS6Hn$oA_lw4R-TyӐ"nM($"uR9X`HH}Y^CbrzuPڛRmܤnZ@Inv<7MM)(p*ҽ䞔Br0x, x<ײPʣ&ҷ==&y[oT`ALz;=x2=r]q];׉vQ^C#2׃"RuQ8GGm$i$Od.ˆm?d7 W=3yxnq"Rdb:s(̉_CP!`￙r߱QʶGnmn-ܤt<7MxKYi ^÷։3oO.F>ȾR}Q7S (7Cy=^B d4OEc;Zv{pPXrKd'2ɶ]-M+vO=^[G=|T˞&YWPjn DZ~Ǔrj{TX urzU%i F #GXFVRuضR;}JYN W|&ĺӐQ!i30cRrӹuصm=XFNժ|:,C+6;c+R>g88%nUҎì&wuƭFw<>}rnDtф>勀--I^)Ud39X󬅿FRFl >x%G*OZY^|Jp0-98Rd+nВFR5.SBފ5JRJոL bF*Bk~ǠTkք?:JXr!>[5BbL0SwLJU#丱:BV;iOZ`TFfb ÀR,mB`KL &w~p05~qT#-bZ>e1 3q9bBk8TЄruzPV g,.fM[0r I?MȥwRH;/=;ζ;ߏV';G@.Й:q eۚ61kƚ›_wUk}zg*JeIum>Lvs > Āρ>Ow۹}cqG M YU H<<nwLmkY>8ꯟܷބl1`vH q qaDmU;-`dQ8mY~ǣʏE9)Hd/$}^'B1^H daHd o?p;n\yugGCbͱqcw=E9h.v9S:I/pk}w ғ<Pyj Fp#nks"-Kr@]5{(J Qštn4aƚ3c5k¡NX=شrNY^.QL䤚%cw7L]|k2pFdܸ}5*4_6qe<뼵f񸎐cuTѝj~ǠJ)&dDk`3^70@"Cf9=ϵ5Ga~ǤruYPZ8b \}ڑF$Ǭ5ÁbG?s(xvO0l_c1lg棞s!G*!Pi}/.ioKI.ǩrsrdA7n' ZVW4ejj}K1H.DK $>D'~&O" ݼ*끛vIvDgT-[*'lC]~QӁUH3""B EF>neӐnGJrvGb|߁ԀZ+e/k9j$)ɹ3d|jd 2.osyi4"pۧq7)X8OGZG%rBDkK##8gv8i,c,k51%醄n}RD*q 8&NCFy m1N T;'"CyINl:[M)_{:TrZXx Ce2'e[T O /bNY@o;YrIO9w"I!2kɌlR$qTiȉ -{{e\l7^HLFeoDVMd"ГzSE'##O1j596sFv|Od9MfR^ LHe L Ydy=ȧ!)G^]Iĺы<|.cgGC3 S)9*%ZsGk"36$ 0} 7׫0#u7"D>9\vt}ÕOHJtȤ\NhUJ*ۑv:r~/Y{.C,BN(n J)UNY Cҭy}:: Ѽx3Bv29*L+DNz"ԪMj\mEF {}c;LtVsqh䝓;˺qn~Y2Os2Qp!T&q2eQ>qM2N\iA|"K3ܛ~|dp+p3{\"׶R{"'~^T&wҷP&綗6RMEmvRjo##s䏏n A%~9],$ȏC{"7n sc# j=gďrI;\M7~'3\sx?V هm\@n_CS!v|q]+V:1ep0`8]?wis?I,K'7g})S:VUdOnIo#g@ t;'ř}tIH$!oAYt%ޓHrsg j$rAb^HBNc[t4!NE$. XsI]&2/ޙ-,rO%lHy.,7NXA>.il uIl-GFpK[)}6\lB'2q:&2V 5c6i偬!#Ѳ踤#?FYynE 2;IH[69Fqdiř}J}2 <H׉O)n9_AbA\uaȮ_ l}[mb,1w*RgfyEi;blmԈ|l0gř/tysw%NPչ\]TJ]W"dԳY|e[ˢl2Nl"/Os< ssiǐ٥ɳ\Lm+ՔsW^ͽk}].>HGXǞpZ] C.C.7~DF*3%Ufy!V9^. 39Y5{ח,ez)2)ԅ^z᤟e+MȥS s <mP3T)R,rout<0hx}yϡPiUS==oqKٷ)j,# [mE^J *C=r vakO ڗm۶/d|bdSRp.t5p`n=~} oL0km1:{G;VPK JReh=/gL]1e1&emLaMUUAiKRTWWcBkƘIZWo%+[r8~-o)D0J)aL5POO=}6giUN֚5qcXP@|wߑ>wYK7*hFX,¡HsQJ96n|3 XMzmkcǭ_'5 yv$GKnAm޾*D0]`<:q);!5 H\hk%ʣ1c.}蹭ۍw$couc.(Q+* +"bl! (ٻLmiJnK#po_Qcxi<=}wjcnÆ(i7n).%5GZKBڦ k?rk_(n*FѣѣG{Ϙ1D횚 =z=z nNY)'6@^45ѷGn#۶Ř1>f̷o=znߎ5wZ|#s S>+ 6Mrk_KBJAGryƘm0g]y֯| yiӔ/U?*d[0z%{Cww6mTBG4K|ʥT!RU<1ؿBź:3aÆX˝<І!ߊ X,9Y0C~I >BZIOfN_BZ+La<ہ S&',ּ#:;\9kͥ7޴T) $Ip j([xI<ҭcmc[L[Ş}k9q Iکx/˶5l^Q[fwvZ.޸qV/Ī8ӂ4 ƌsr#_`~nM:<)9z ߝiE1_ӂ4?֞d-7'M9TlX3b7Z, <DZUWb" |aWy)* c=/ߕ@c=5߰\aI6h2V+JB>7/=WOF͝6z{rƍ7zMUC67L]6hPƌѣcXemlƍ7^'Tmٛ } *Ҙ1=?66k/lpNM+겷p0r/hHUildpOOBcap#ĪX{5c;FdXaƌX3>7ݥX^TQ.92ZssRA/V ;c-6w\hBV5m̘v6vu,fO\ر~%VЄj҄ ] tZk.ٸqxX+?5f̘\k czz~U9Єjƞ{^zh]]Fk`1&~7w\J%|b~O>RWծK֚G _'T)y~'OyV'QZs 6l~ǥT&%h FYcgmfJ}|U'쌱WXkCOةJP)5[lR_U53z%}wόar [F-*/'ϱfV=0#ɏTu;vTk ֚Ccvsnj\|ݏTuhlxo*<}~`G KGղRNf.-nwXW%5rձN^u#˥J1GP1A p$}sy`/y~nP>)>߭%%^B,.{[.HVZmJߟ7qY9DtN0,dPGֳKK晝KkѺw{PjYDrMvDFfUrTR񒒐RE{`iOߛXgfV\Q ;ўJ=?(^}R:ee9ߙK&71@kb`6+H'\B)"\7hj N'GVvvO .u֚J1O&@M߃iWY\ w ew:ϬQWR)Ƣ z+,;e_\qZX\SrEEY a![ ޠ;ǬG3sHdd^y[kF-%%Kb,:!p TZ&>cvri2*  O4; 2@}J'so2;6QQӢ,⏠Tʘ,nv.!Id܁{s4Xn?5;hZ4 ܒ,ل4]|$_թT@kرefg"Puc -e_yDSdNGjkz`iP&B!/[5Z_8us VY =zd7DkYk߸e%D[#YfaQJ{<~nv.!*)Ȣ""2#voh`J,y\BuREEDb5^HxBބz ٓz>N+1`}1;O{ex\k<`UJ/4 %?MqvoP&NM' ,>5"үbqN&D{f 2Ե򿁁Z{&~ev5٠+[4;Y.+@?{-&e@|G'dq t>fŲ9K?1;I(+!V5DYLm53kR߀~D$MAXϟwt()}RVsZ%%!+6!Ӯ h,yva&Ȯ?S^ڏf'q(3sRߔ2x<9cv0!Rp:3 V>J%%hL r;РКmJfB\^)+&nvreܠZRj$ÇGaǎ)f䢢"޽/} 0Ǒ#GXv-WfΝ8pjy'xRWWW_}E~~>,^fΜI~yvSUTT0w\ƌOzz: ,ԩS׳~~G6lĉYhl޼1cbزe ai&ϟoݻƞ={غu+˗/wpo3g6{MM gfС1c /^Laaa uaEuu5IMKKjr ӧXV֒Axx8J)Z/t;hƥMɖO޽IJJ` 4?#F桇B)b0vX "==J||<)))|ᇔ]o:?<ܨ;w[n$''0`OZtHtnݺߣn4-PXXHYY0 BCC.fQTTDnn.Ok׮N)Ÿ5ӳgFzIYYSN,6 Ҩ\.? ^z1aԩS &11 &4깜RN< Z k!D+1 ~]pj*͛G||ͽAĉA>}|ÇM7DYY%%%z;vXtbJKK)..t^k.֬Y9tvFSWjÇsyzkZs9vzž9sobbb'_5BFb|Qhh2p8w~K.ٜN'N9JBBBڰlR_} ""S !ZsΝ;ev !jܑ%$$\qd,d,B B)B !D,B B)B ZeRRkuɢBVY ƱE@:iv!B!B!B!/%=IENDB`Chart-2.4.6/doc/html/classChart_1_1LinesPoints__inherit__graph.png0000644000175000017500000000652511666706743024505 0ustar reinerreinerPNG  IHDR{DsbKGD IDATxTw"Bq$,fXZ쉽Gh],O5wPS[1q66ͽE[VoeR%ZMӅP #3#g~3~;/>B!BW1`\gBs6`3;|e  &a$,BEhܾu0e`Ar܀ ZPYjQkx `~8_5 \&z|{`x@,'9 o~l~;F Xz~=~ZZ~ | T\~#s? `O4.vW!m+p~~㇢`GĢ0 ͟:E Bsn@1N}`:*( }XW`xԥ?_7 47ʬef`5 hK5@ٞ59TM ,G1) ܊MGp5r%9QhO_>k@jX7Hil2Qowj;ziP#ƟP濓TԄc$Jk4:Uɺ=V:V@jbs޸N[PasC}wrez `#2v ?B1gyרlwPPtTue]"PcoT(-p؏Qxs]*`m+)oɥQC1|7w7$NeD {Qst>5i7>݊秚=2TgO&e#KIX!/<李~$|wX>: @DOo . 8۟d8ytXMD,>bcn ^Cp0~c`3HX<`jvfbcs (O ͢X֐"ar?s 0tfVEC_j5 {NA>.wtȩCȿA}>6Pa1nӣHttqun7aaan.VEmPw 7T}0( KpOMqy@3 $&.7 &lkp~:7.nU #EhmM"IX6 &a$,BEhmM"IX6 &a$,BEhmM"IX6 &a$,BEhmM"IX6 &a$,BEhm@@2TX,?"$$.e].n[˩t]a5kV#˗/wmM"IX6 gr(++ĉAzz:sbΝ;Yx࿶gǎ̞=-x"`lݺA[[9qF(((`ҤI:)))>]q\;v vؾ};o6ѣO3gJKKyꩧظq#5559r}yfvލjw~fN:Eqq1455sϱpBK^^/"|vm~CitbZlORR---yf&N@\\0b\.+W$&&0 4T>c >ۺyG %.. &Bee%cǎe|SL!;;rmֆj矧o[l7 $$4֮]KEEdg9s&ӦM̝;Wqҥkرcoq~!}:GeٲeDDD0uTz!SoAAߜn,11Ymt^eҤIs1nvu%%%0y._QQAQQ6l ==BNNw}WfXV222xW\.av'??/;wzO:=}߲ .0jԨڛztzbZY`:Ν.䣏>]|ddd`XtjI9eԼ>ff&՜9sPAСC{ZRSS7oZ:u*|?L}rlhiiG%))6y'IKK1h̙l߾+W=/oٲUV]}tt4o+V[na|qWGdd$okKHHfOjj*gϞ%==ロFكfc̘1k799EtRRSS9y$g;菉^k<͛zttI3ӧX,L8Q{t:9~8L0:=}9+RRR=zt5zn.^Hdd|׌7$6?ΥKHNN騯ܹsƒtmǣK/A'Ӱ_wa_$ mM"IX6 &a$,BEhm]?_<Oc=h B!Bx[IENDB`Chart-2.4.6/doc/html/ftv2pnode.png0000644000175000017500000000031012033071320016225 0ustar reinerreinerPNG  IHDRL1$PLTEStRNS@ftEXtSoftwaregif2png 2.4.2^G0IDATxc`.Bn&8T >DIIYS;:k/oIENDB`Chart-2.4.6/doc/html/classChart_1_1Pie.html0000644000175000017500000002373112033071320017677 0ustar reinerreiner Chart::Pie Class Reference

Chart::Pie Class Reference

Pie class derived class for Chart to implement pies. More...

Inheritance diagram for Chart::Pie:
Collaboration diagram for Chart::Pie:

List of all members.

Private Functions



private _draw_data
 finally get around to plotting the data
private _draw_right_legend
 Overwrite the legend methods to get the right legend.
private _draw_left_legend
 put the legend on the left of the chart
private _draw_bottom_legend
 put the legend on the bottom of the chart
private _draw_top_legend
 put the legend on top of the chart
private _draw_x_ticks
 Override the ticks methods for the pie charts.
private _draw_y_ticks
 Override the ticks methods for the pie charts.
private _find_y_scale
 Override the find_y_scale methods for the pie charts.

Detailed Description

Pie class derived class for Chart to implement pies.


Member Data Documentation

finally get around to plotting the data

The user may define the kind of labelling the data by setting
'label_values' to 'percent' if she wants to have the percentages
'label_values' to 'values' if she wants to have the absolut values
'label_values' to 'both' if she wants to have absolut values and percentages
'label_values' to 'none' if she wants to have neither absolute values nor percentages
'ring' to a number less then 1 to define a ring as output; if 'ring' is 1 ore greater a full pie is plotted

Override the ticks methods for the pie charts.


Here: do nothing

Override the ticks methods for the pie charts.


Override the find_y_scale methods for the pie charts.


Here: do nothing


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/classChart_1_1Bars-members.html0000644000175000017500000004102012033071320021470 0ustar reinerreiner Member List

Chart::Bars Member List

This is the complete list of members for Chart::Bars, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Bars
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/inherit__graph__0.md50000644000175000017500000000004011670177755017610 0ustar reinerreineree9f3a6e1c3a8c1570788a9cc327ba25Chart-2.4.6/doc/html/Mountain_8pm.html0000644000175000017500000000751612033071320017073 0ustar reinerreiner Chart/Mountain.pm File Reference

Chart/Mountain.pm File Reference

Implementation of Chart::Mountain. More...

Classes

class  Chart::Mountain
 Mountain class derived class for Chart to implement mountain type of plots. More...
class  Chart::Mountain
 Mountain class derived class for Chart to implement mountain type of plots. More...

Detailed Description

Implementation of Chart::Mountain.

written by david bonner dbonner@cs.bu.edu

maintained by

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6

Updated for compatibility with changes to Chart::Base by peter clark ninjaz@webexpress.com

Copyright 1998, 1999 by James F. Miner. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

Chart-2.4.6/doc/html/annotated.html0000644000175000017500000001646712033071320016477 0ustar reinerreiner Class List

Class List

Here are the classes, structs, unions and interfaces with brief descriptions:
Chart::BarsBars class provides all functions which are specific to vertical bars
Chart::BaseBase class for Chart; all other classes derived from here
Chart::BrushStylesDefine styles for Points and LinesPoints classes
Chart::CompositeComposite class derived from class Base
Chart::ConstantsConstants class defines all necessary constants for Class Chart
Chart::DirectionDirection class derived class for Chart to implement direction charts
Chart::ErrorBarsErrorBars class derived from class Base
Chart::HorizontalBarsHorizontalBars class derived from class Base
Chart::LinesLines class derived from class Base
Chart::LinesPointsLinesPoints class connect the given x-/y-values by straight lines and the x-/y-values are plotted by points
Chart::MountainMountain class derived class for Chart to implement mountain type of plots
Chart::ParetoPareto class derived class for Chart to implement
Chart::PiePie class derived class for Chart to implement pies
Chart::PointsPoints class derived from class Base
Chart::SplitSplit class derived from class Base
Chart::StackedBarsStackedBars class derived from class Base
Chart-2.4.6/doc/html/classChart_1_1ErrorBars__coll__graph.map0000644000175000017500000000030011701115623023355 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Composite__inherit__graph.png0000644000175000017500000000672111666706742024175 0ustar reinerreinerPNG  IHDR{ZBCUbKGD IDATxTT?{PA8: )A:Vସgekٜ+Eέl8ۢu_Q슋.*4pb b{32`d!|֚|y޽ϻgAAAk|Sܷw plA炀E-ĠTQ:DCD!݇[Qߟ~Uyrv`pj|Ke7y`7c|d `R4Ǵ:t? @#Xvxg nu>?37CҀ*C ם8 4_ XO>j|'pg-v8v){jkQ$jDmHGE߁@Fԋ|'Ң܁ 4Ds6o]lu/Dr_/8' sZ1Nu`͗G.z9]H11>]\iY@ւ@jf{`4p3jt(.H\cjT)oY_=g8@$j>=b~umP/.\ `R~x nWT!X 5d4f15m 5d9BfG@nEyC{o x+nJt #6ѼztO~PD45Uh}%uTA@fo?' 36Jkۏ*oֈjJ| {1K_PԵ~'#d [\jiӎO{~TSGM.FxEH1\(:kIZ9FÓ@U Ԉ0uӝI?Ӯ®_BS CD!Q:DCD!Q:DQQkF.2?o}N{ nYkơ Pn))piP!!!ÊUz2\ XڰIlP4HN*=v^'A8>{Q( `r8z;n$ע[,R( ,!tkkQ47Sujp,*~-Qu(!rk[QDD<1FQ poEa2]Nw8P*?ut(G8F`Atp/E\EEApd[EGOY  ~) E("ˆ$2rCPH!B!t(" AB!t(" AB!t(" AB!t(" AB!t(" AB!t(" AB!t(" AB!t(" AB!D c2Mp ܏! [~&a/ޮ(9s ?0fQVVB!t(" ABZ~N8($&&2w\ ---رl_oÙK.QZZ?v}rVZݻ¸q(**'p֭[}a_~Z6ijjYvWO"ŦMgݺu(L.]fcڴi0g}FFF|b;,{;ߑ rrr' ,,k+--#557ln.\ȶm]}C=n'??*mK/ѵWߎ=je޼y,]O?/GII {/ݻ_t.\ @UU7oW_{!33MO6HOOg޼yYyꩧ믿fŊ̟?|퍨ߢ!<< &f̘@GG'N[R^^ѣGinnGy?׳ev;mmm|l6 ظq#ƍ#//SpuٵybϞ=Nee%?%%%,[ 6|@VVsYljjb׮] }{9z-:ԣÇw^ ٹs'fw}PsJ\O<ܹs)--gƍTWWhnnl+JHH))),YeuG]]gΜqٙ2sNK[SNu[nťpOxFQQ$&&b0HKKsw?mҤI:uʥŋO\pl=z4f٣ Ann.|رùl&)) 68Z[[u:wNa6W^ٳ : hhh')) @uu5}I>RRRϝ[F>C׹t&?#w&99GW& ,X{LUUOTAP^^ɖjIJeˈ:{1Mٳgoj*L&FH^{5V^͛Yr%7tرczro,Z˗ɓ';z'N7`;wh233 hcڵ Jhh(555wJnn. 9sD.|vXP|:u )S677sq¸cꫯg̘1>󭮮gbXTTToRXXȱc $>>%{ǹ|2qqqpp%Ǝqϟo!""X|~(++rgBCC[Po0.z„ n6RRR|bbx=nwF#III^0LnQ)p?"""+5Dpp0&Mj7|O#?1B\kHt(" AB!t(" A0~<6 C   Sn,IENDB`Chart-2.4.6/doc/html/classChart_1_1BrushStyles__inherit__graph.md50000644000175000017500000000004011670177756024411 0ustar reinerreinerb3ae7d12a0f624c70e3d713227d6f39fChart-2.4.6/doc/html/classChart_1_1StackedBars__inherit__graph.md50000644000175000017500000000004011666706742024306 0ustar reinerreiner67c247d934b1931bfdbf9715c1677dadChart-2.4.6/doc/html/classChart_1_1Points__coll__graph.png0000644000175000017500000004476511701115623022766 0ustar reinerreinerPNG  IHDR4JlbKGD IDATxy|gFQŊ9<*ZڊVj׊BUh/mZ[[Z֣^b'ـX<*Z )|~gfIv7|lg<Rj7?YV`-,'p8x[v70%j;}Ļ-`x?mor<Rg`= |/^E! F9W $JhcnoCHq'6zO@o"o~7=Ve@ADa**>WsGGU3{#xhr$06!/z{!dAt9X&p?0$!.Hq /D$3[{o:d[:ܖ#]G:x "չrУS'!]U1Bcie{C$!ri@)AI`##:lj[J!Q]{$r-oӝbrWB9(Ru\8}>fޏRA݅tGU ܊JR[fJ)r:B)34)r&4TЄДR9CR*gdDB?^AǢT]Z[QU^_q6C?ty}iQ g7U*OH~Ц]WWGB3|<VWM^;/ڣsW]K>_+ ]n)M w>b8:˳feT*kyL U :\ c]v,n&jP1)*M_ X2xrU` mHYX3haFN&8(ЪkzbMͳg9ֱR)c4_ё*g$4Wc޴>WЫIܯTV]KEڜJ6@n" -EvQ-4cl@>۴r|5}#WQm'kRd :\jMfǚ]Nun縋-t*fzxvŢqAǡRJ)RJ)RJ404:YπaW|z?mxxӹn>~L6G3?}A"0rҴ_~NJmNi=͎@tBb}'۫djetwsG.V]^suUýAǒzbm؟6vY5?Ig, "1 i1}Go# j>Ev11r}~̱gǾQ[yn a9p^ԲDe3G^xb_Cl7)[%P]zV,`9p=/ȗa0lyd4`52&x<u峑 hIz] _~󼿣[3]O$7AHHL]vۉ}mnS BkJԧDMJRhٚX@ˏ/B4/DkqO[w`u6 ,Û|\-y m3t7H '|Uti NL2L{م$gsz)0~5vSøNPIK[B3ս}ݨ9Q!_to~D.V"-DFZX"Ya+ayW!ip?iJ.ʨs_xRtOǎFnSPjH_ ּ>H+)m/R Z{Zh-Ě,c4ڮj:Ihv߉x7*k69EdHX,alGJ HRtwb5"ĽG!5? G3D\Oe < j)uj H+rZnT# gv"SۃAkIvxNAwI4֨: }kJy;}]c:p+p p02S|}"GF?d,l)r^"up=2>29;juޕxIjc ',Bj"GKt0%2$FLs klkJ[B:m} tymۂ$,s_99uZ_v0p/xXk|\O"_r5۴쒝"G# g/U4$GeQo"@N8ÊZn:SYcrM9]R 5b8dU>nro#lp, ҒL ^\|U").9bA 6ȞE Dg\3W.J)RJ)RJ)R˙]:kNY(iKkϮ*958rQZN۰p'ezW}~5S.IG<9"ZNqPs. ٔ: R=E(s9x{M^-o Nya>y"3 ykZDLNAJL[hݛ h4:n1a!W<[&͕p2>+uJe\cxT+GLu2wD=R)^ 7!#c}8+T`Q>@`G'dy鞜BMC,wȄ%HUsjt5#-ˑm!%; IS)KS4  D#!2LʻƚhY)ǚ^y qio $2hYmPl o?:D14WZo+hY;ZtmhY&{J/-4kJVf Rp R+,"?FZiȕ!rKE|,Tʤ>8XڅQZ0M{~Š },GZ\Z6VA[%-@WGٍWmlnͶ;Z~[_]MuW掑zW֞|߸ZSt,FZ&e݌8[ H73rsEKȸ2됣J)զ+S+XnM =m%Ws̆Fj?=W\ί L&dorwiٍnҒ$ؓqKwpJњ~)QJe==˜~)QJ)RJ)Mfvtq(IKk/.R5U{l܉s,ځ/[ovY Ccl%pRa䢔%M07Ʈk`P',r&d|)@VeZVz-.W.;SZ;Es7v%rM?H R el"rPȻ= 8{2邞vH2g+5>2A{I(~[AMhJT 91ҥ_\\d՞K?1xTJB淋1ډg -^<^?Oz##cܧR* # o+ˆ"G&FrqO~JT o^NM;)ĝQuq)9(P]^s*M֙AjO3^Uýuήg+t<&5G9 aBSk) )#s٦=qgs`MMA{RsӚb7sc͸ġTpkh==Uؽp\:YV)_遜Rfpҕ6R.2.ه.69YuisT Ќ)Yѕ~6 l]G:HhEOztR{Е`~6 lTzR6\yɭ*9?DsY`P)Vd틑yۑŽVk[nmss&[6S4Cm#^ \uRY7 IIh"tND #݂tms RLqɕ$γ^lH׸_wHߋsR1޺J,k$E_AA n вmuJ -%]ŵ/z>*9+&t2ljvUӄ%^۟'J_6^Tmo]|5#Q׶īpʰƫ=*P[U\#G9-DZ9­ߕaUۍWAZVMR)kǻKk\ǽpjm爃Oߥ}WT]͞c\f<#~gEf C @>@)I?{PESU|MhBߵ)I_(c ='\ttA-^%ΜT=zHqe$~j/ !#@|"[*fK9)hz$eM" BNf?FR5[Iakq5G9صzT]5 m m@ Jhi,%TW`@t߄fi[Шĩf\gomאj5{c<Ą>pyT+2-)zP:yӮZO6/6䅵˩r5O[c{F. w\ֻۮ~ٲO] 0m'=t2ƙɭCnȉO I)к%Hy_AOdRG#Szx{]AldfB78w9O1)r :x :dO7$1@2u,1)O3ǁ5T+qHw)V2oWKpǨ*9θθ)˒=(:c3N{僂 -]$?"ey:->AhTRqdtlr0=>q%D}[]qW!Ղ#CCD{EiD=dQ!v!*贵޾Hr(Rt|Z57UVdNQZm]=CBV1kKs?n_C|xhog!Jo; N12GwRZ$)sHAR6*Z\e $fލĩ~KBt"c?Ƃ>NB ܂Z; NztR8ɇ{nA %YBleϊ{9zI H QPF٩um\ҭi]uVh#z?/"Hw2V 7hNjG!޲Se2[|e IDATy@Ș_ٳV|Ƈ!{Ob'q{T윲;겐]heZ;T~V]^si5[8O{[yیg;Htd뎴4Oa:=ִI>65nq>'^ Fkrsƾe圲xH]N|%-D%v!t:Ϧ :x}wezךd3L܃WQl==[CMб$IڱtJ)RJ)RJ)R]AdRJFtJ*tzSuYP٨ƣd eIe֦\NkylUN]J ^ζ>Lx HW`*L;RiMBb-}Qiw* i.zz!!%=B1H y!#ELtT4x=_on{5ˁqSdu9R ͸Na1v3`<|n+E|/uhOG݁t \wc}]y)[$1"Ih]HgDK^!RV5?G=j#U"Tu:Yc/۔lO#WRt9Q ;!exU8U]\<>rh3RQ[gt=<ǽؘZ5V!U:Dfo!*V$D E); TهI9?.- {02N+[EADEv=.~Kʂ^@JIJ̩Xtk.~혍A V}(u2*刁<5i|q&C)RJ)RJ)RJfƸw\;82?]G0Je[)^c)Pnwt@uY1c{itm> ܬȩ4BKWթVU^SV` gSa~ؿ;؉Hݷe@h :-D0RİQ{%{JPt]]Nu\'yp.[ݖMvm/ )q#3#"" p'R2:DH3^V/Pǚ7EuPUyM겐._۬.},t_kb.Rz+p!R :WJJ4XuX{!E/; _+{8 󈧄xdXoڷ1FSBe!5e^7\;IFQwP;?v T)2Lԩ6p:[ck{ g/"ݯbU:zE۞ Gs_Gmb:2n9#-H>)Skt *s>U5A<)J]z!_1D5%K d+;*ǣ/Z&HSfB A4LbȞW)噉\,w,jHyԒ;J:ڳ!Ij.ɍ i.)!fr#]JRSterALkE%޲l#+َm=&s/A:9Uo+:T;iIe_ˤP=tz#uj/ӷX_&J)RJbvŢqeӂCNu9G/9Cy/[tZR*[XיhГj3@>@yěnw֞P]qϱ }T*̝878kt,JRmÆu> _sJi X%p?T1:%~nW)?YcO6L 'Xzh\lz+'vd} c8]`0+R$#,7Tb_:xgZ?(Ќk : Z?XMhS 4b.XB撶JXV[ d{p_ s' %@9-Nij5J?,Jh >0P[ u{G]YJ5Tq I8 J UbGW2=!z!UgoB&Z_B +~û}2wS*H릆*n3[掛b[)F E)74wRzw{pq+D.aZ5.A!#Dقz)rtC 2]F.WZVG #ck 3!%{ CjsJTT.a}B#%_FXZTT}ɻ/`B-J)RJXǖ7 t cmw;(o╰[ow{rTSulz13i U]z0+A;F.]н~s%)^pGg(-uk fyбu*ؙ5q+Xc3OR W8dF3AZש,kl?Ҕm_$kޛoбu*][?{K5iyRA9XDAq.[S SU^_T"U5 GB҃ k<58_ :6?礰U]NWIhPyv6~X25=0IN'2 kjG `~8f/0) ͵kM'bi{7WeB}S;jkZ3[>ҧXwo. gY|FU~rux/Y:t쳓ĦQe1^ wۃGu/-Эe[V{w![xmZRt`? :y~u9`͡>m].-_OW 28_\["PTЌ݈{'^15\׹8֯h&-&Shpw/ch֚eⲗf^ހ\+*i./:Ӂj˒pX5{r8kAơouNje!;wܼ@( =^]zb: _Zhq7|bx4FAAơ ?]Nk>htW[}{Lyk PJ×oW :0i#W8hW1(RJ)RKd^0ujݥcCq{~G߭7J. n1KEik߫)XTtP-T3\<أ)Z*=m~0)J.B3;5T+`;BBAǥ7|ҿAǢR˷V]ZCgⲿ7FXmzWqԩ*ntҲ AǣR˿fۏz=mWP5fڲS,\ LYxF1Ը7;̞t<*Kh)@acP߶"30*kASB :y1.|ҸUAǢLUy겐.=9XJfO UlꍱڦRκ?bн{PEc(9 kr"7?ۍ5.`ƸY?r JB[pbӔP5k^3dkեJe&_ZC~Ӵ{ԟ6vⲏ/Y\va~;{S}~sM56(%>fq˭>;5TF(]:su&]ɠQфZUyƚR[-AǤ@UyMAUyMusBÍ5jq&3 -5gkVU5baAǓf ꬱgw￸!-B> ۃBu-4ӔG ,.k:Yc'SqJŶR-앢m+TRrڲi-wTf&3T2}@n^@/Jc?w < |@,*dz1AAq2aD1.p|uS88SbG硭c߇9_ۭ슺uX?{#]z`9Е hxDȇv0[w8r|?yG\Gg58 J`Uu{۬" D>K }ޮnB6OĎӀ޺}'b{I7d3Tk G/9l+fd:Rxwʢ+FÑ/'0JNo dL1G{wwIhH[qǾ9'iY{ $Bb5 I҄R9VF^9E|Ce1nA>i.-D_B(%ow"x՞u)ҵ6FZ=ѥ#&;}訟r <i=|iQڌ HﳝUe%wڦ DwsA&<6C$띈#~cg]?t#O^YdLq(TL,A5"׶oOp7Aū2TZ _9nƮC^D㋼ۣ#X,E|ɻ/`8=1V] Dϧ= mlXW[z#]$xϩ 9'~_nDg#vV]z,pA49ILȇ8bҵ7x9*j?Td[tʓX7YCiݍt#]ȩ chM1Y>@ 04z?[h#cxIԶBCҾ:VU,v;v8p2[}Fy!cf~i+x8B# -b%jOܱižC c|=4e֭*9X'kl6V*eH:5R/4 a)6r~!`8Hq,RgNh -D?RddJJ)4M U4<%F)R*r*TiBSJ MhJ M)34)r&4THK kκ|f:&kG#yq7pxk}&긴$4:%۪k$#T+rӣ3>l*VTJZZA; ]ǚ ɪ<Ğt}3x`"Wi C ?+THKBq۪Bo[8GT\<ɝ2c`v[k͹+WdN.cgKXgyNOi S.^fwɬZBkަH*+-y{G7ޚvu a{\f= h0nmrlRiKhM἗z4t;x.] vx8lxeڵ-@|оt:]u>݌^[8!,R&'Os]]]ݪ pk&ci?$@RM:wCLimϗpcv_<ٱ5ZWe5YC#1v14.^LMh9n.[T cOe5Mҵkg=lJCZ:=a5kfq];164 #4娡Cy[5kf|7^^fTWyA7dȴS0ƾ]P0~ժ?~|۶7-ton*Nrƭc_- :\4dHECT6U?r䌶f(9mzYc˦* "du`nؘbC l10)*#gt+*人~&3&=:)l KJJ*oڴ9LY3ޠcR*(t!9xNŢ#! r~vZF8s|]ݬRA ,]\sěw]缠bfC\U ucp'|շtLJ-Ќ8gĹzH; \kݗeΝݏIJ@cCo/G6)*6n MntLJe@ŵ+,T[׉SFyLQQm-7Y3"cR]Ç_}v^cDeڵ3tLJe]$Eu~}y0_]yAǤT҄,ilYw8lJh UT4Аgj2S*1MhhР+O[ݎ_AǤT6Єav'<\W ~-蘔RTU^30b-*򺠃Q*eT jck3W1dHP _]ݬIlQñ c|=Xҥx^vm~Zsz:(ŵ+0)kleбàA~ryd IDATڵ:&YF%4cL7bQiбӎt׮mY1)2.]Rs ]kr6dHc|5MM _ڰaf]1) 2.8ĚskoCT^n-[<蘔5tFWf8EEYƘfNGʈR>Ȅ6i{8XP\A3dH屮lYAǤTW5 [ gs<rv8O.xR"ůcoث<| b{͚AġSV%4I' rp3pU]mW9fJeKhWqV_Zcm9hս`'͜}+'&`իgt}:ctM_GLs&LSNaڴi_SR*>Zh>{7N86n܈뺼{fݺuL2SO=#Fp7:w}JƏOcc#o6| :/ӧs衇u{vܹ;}g<valڴk//˼WbxbXt)C gL2ZOo;Esqw0`nF|AMK[B۱c={Ljɓ'ϐ!C())apwpAPTTD~~>۷o[nڵ+c {&?_1bN.9r$?яXp!Çg{}̟?SO=6 ϧ8۷ӻw1544HϞ=~FSSS/R|Kh{}]Ne˖n:F8ȺTWWzj+Y/:j-"֯_ϰaZ7l0֭kvt5bرreѻwo***ݢ뭔ochz(MMMg?S[[ .{;> w}7ݻw߽ᇞ={Flݺ^zuxZ.RsРKJ1ZϞ=93~ǪUvkoεe| _`ԨQ8òeر#r˗/gѢEmގݧ\lڴ^z/ q!piaÆoO)mL<۷~Yv-W\q#Glqbkc=￟+cTwy'{?`f͚_?;GxΤI2e r˗/O#dڵI?N;4z)&OLyRw{7o棏>q:蠤رw}pn:=ztXb#FO.ӹvZVZ)..m61566[&O8xVIIBSфTtrR*ghBSJ MhJ M)34)r&4TЄДR9CR*g$yק#x  )'ARJ)RJ)RJ)RJ)RM}IENDB`Chart-2.4.6/doc/html/HorizontalBars_8pm.html0000644000175000017500000000556012033071320020237 0ustar reinerreiner Chart/HorizontalBars.pm File Reference

Chart/HorizontalBars.pm File Reference

Implementation of Chart::HorizontalBars. More...

Classes

class  Chart::HorizontalBars
 HorizontalBars class derived from class Base. More...

Detailed Description

Implementation of Chart::HorizontalBars.

maintained and written by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/StackedBars_8pm.html0000644000175000017500000000571512033071320017466 0ustar reinerreiner Chart/StackedBars.pm File Reference

Chart/StackedBars.pm File Reference

Implementation of Chart::StackedBars. More...

Classes

class  Chart::StackedBars
 StackedBars class derived from class Base. More...

Detailed Description

Implementation of Chart::StackedBars.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1ErrorBars__inherit__graph.md50000644000175000017500000000004011666706742024021 0ustar reinerreiner49e11f5f77e427d915ff4c0392b4f3f2Chart-2.4.6/doc/html/doxygen.png0000644000175000017500000000754612033071320016015 0ustar reinerreinerPNG  IHDRh ;-IDATx]{XysZ%ʔNF:FЪքb@;~ӎ"DHZm_4!-2UCe["_3LS|y>_ LZߦajLo}.2$Z);*.d~߳w'0@!ZZeͺwډ?O =\L[gdxr0 RrjJ*.WJN5qM[mޕSb58ļRB5SRus[2< %V'+%$fvĺRK$ C 4+xsQ}f[vZ 6c}!,Lt<ūdxH)/f襧C1v[~ 9%DDKgrN}M9Y3*/i謷%ÓU^#vr'p=]_7ySka-/!Ev902ɖF*, O!1k>QӳdxX:=GD<'fvRKUZjbi`t9cxڪVWsabiw11x%h޶9׉>oծhkG~Nls"^™d2%swW윧Dz W8c>1mBv8܉AZ Turth9kRSf/d1kbA.@+;:j ˫҉|#p4i]V~njxfv$եy| S[;BOKVցa 4x0:DN54>gxpo;Z:ɔbۇ|^T7=$4)L!/u#)9/rq%~a-poE,|gm /9/s|c /u P\a’1,;ueyK\"7-K!3>2amm r7M.(~[2Ʉ]C<b9[)v[~,_@\|8qܴ{}Qޔugr7J]|eڐ`4s5+ҡ\ٕxJ,uds&@yIeD;8nZ={ʘfQU|Xڝ)ض"tV-woJy>6谹 Frf͍ Kb(!@~) F{Ave'3H͍u @A$j"s&&b~twQ J~I J]=;=|S{瑓nʍ9˿˄.{ܴ`b ڞ)j\ΕY_E_.g0u2ݪiDWX'kqVgDO݄E 6 1cZėnNXx(]gL_M!b4+eʤd62[]Am,b@JՄ_,Wrr_g8&(QA4.ajAghSFJhheg;Lcs /RĢ,849:n`,o_~6YIqavʐv>=VEX޾5=uu^/ AeD䆸XjS#^˞3-٣[@vm X W¤v9ѽQ_{3W\؏:pajeI)tܱ8I>xdEd:4kONIq>m1!)[Vb47a@暍̱ p%5P~Z?| 30DN  } Un@ 3'T(,ϗ^.MA8a?UپJ<2S~@=hj3-G|8Y.]XRIT9XA$hIPv!vH}o)Ͷ8rߚ =*^iE«8"< Ht"Бx.ZM!b~ƒ !c bwzqT\ L*a.P7:*(Fp8O@5<917>y1zazs{/Q†9 j}SvYD*n]!rhyakj ʄg͑ d_*ll]^&}hnpȨ[.Y7..OڲX|e%L%L9e tO^ (p 3U%r J v2C z2Sf1]@ȝnp%"nJR2G+Z[?@[PcWKZ=Qi?yE`3+W;ӿfH%x2!%#M?;p)*u;p_z%#M !pWRphϦiE8gF?Kp)_+ǩXP&#j&q=n0Ln>D\J[tsI5)&~J :ÚAB@PKƴdoC)aSteLg.襩?M|ָbٚs+stٛ@`ᰱ*q:htw_Zِ^:cn{ӆݺ`N;כj*K}^4?&=zizkCcPBht'|UE1 ;&5v۵]@kS}pեy &>{f>P~ޞk^IENDB`Chart-2.4.6/doc/html/tab_h.png0000644000175000017500000000030012033071320015372 0ustar reinerreinerPNG  IHDR$[IDATx `FhY 26@cHw!ϗK1^HtOyGD׎ k9?i7zvPaJ})غwV`ai֍ZPC"P=IENDB`Chart-2.4.6/doc/html/classChart_1_1Lines__inherit__graph.md50000644000175000017500000000004011666706742023172 0ustar reinerreiner9f78665bff2da0ef391be0ed3e6f4ebeChart-2.4.6/doc/html/classChart_1_1Pie__inherit__graph.md50000644000175000017500000000004011666706742022635 0ustar reinerreinerf362ec37465f1e74c00b778e10d72222Chart-2.4.6/doc/html/classChart_1_1Direction__coll__graph.map0000644000175000017500000000030011701115623023374 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1ErrorBars__coll__graph.md50000644000175000017500000000004011701115622023265 0ustar reinerreinerb995ce4c9d827e0712eb6b8d4a85203fChart-2.4.6/doc/html/ftv2node.png0000644000175000017500000000035312033071320016054 0ustar reinerreinerPNG  IHDRL10PLTEӠtRNS@ftEXtSoftwaregif2png 2.4.2^G&tEXtCommentUlead GIF SmartSaver Ver 2.0io?IDATxc`0O V.RE:IENDB`Chart-2.4.6/doc/html/tab_b.png0000644000175000017500000000026212033071320015373 0ustar reinerreinerPNG  IHDR$[yIDATx ?|SVӈbB#P8O:əD>m{SI'z(!TBމy#WJDp|Å R] 6q]qD.&0=JD=@**IENDB`Chart-2.4.6/doc/html/classChart_1_1Split__coll__graph.map0000644000175000017500000000030011701115624022550 0ustar reinerreiner Chart-2.4.6/doc/html/inherit__graph__0.map0000644000175000017500000000466111670177756017716 0ustar reinerreiner Chart-2.4.6/doc/html/doxygen.css0000644000175000017500000002312712033071320016012 0ustar reinerreiner/* The standard CSS for doxygen */ body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; } /* @group Heading Levels */ h1 { font-size: 150%; } h2 { font-size: 120%; } h3 { font-size: 100%; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; padding: 2px; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code { color: #4665A2; } a.codeRef { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } .fragment { font-family: monospace, fixed; font-size: 105%; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 10px; margin-right: 10px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #C4CFE5; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memTemplParams { color: #4665A2; white-space: nowrap; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 3px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .memitem { padding: 0; margin-bottom: 10px; } .memname { white-space: nowrap; font-weight: bold; margin-left: 6px; } .memproto { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 8px; -moz-border-radius-topleft: 8px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 8px; -webkit-border-top-left-radius: 8px; background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; } .memdoc { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 2px 5px; background-color: #FBFCFD; border-top-width: 0; /* firefox specific markup */ -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); /* webkit specific markup */ -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } /* @end */ /* @group Directory (tree) */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin: 0px; } /* these are for tree view when used as main index */ .directory { font-size: 9pt; font-weight: bold; margin: 5px; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } /* The following two styles can be used to replace the root node title with an image of your choice. Simply uncomment the next two styles, specify the name of your image and be sure to set 'height' to the proper pixel height of your image. */ /* .directory h3.swap { height: 61px; background-repeat: no-repeat; background-image: url("yourimage.gif"); } .directory h3.swap span { display: none; } */ .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { font-size: 100%; font-weight: bold; } .directory-alt h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory-alt > h3 { margin-top: 0; } .directory-alt p { margin: 0px; white-space: nowrap; } .directory-alt div { display: none; margin: 0px; } .directory-alt img { vertical-align: -30%; } /* @end */ div.dynheader { margin-top: 8px; } address { font-style: normal; color: #2A3D61; } table.doxtable { border-collapse:collapse; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; text-align:left; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right: 15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath a { height:32px; display:block; text-decoration: none; outline: none; } .navpath a:hover { color:#6884BD; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } Chart-2.4.6/doc/html/classChart_1_1LinesPoints__coll__graph.map0000644000175000017500000000030011701115623023723 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1HorizontalBars.html0000644000175000017500000002237312033071320022124 0ustar reinerreiner Chart::HorizontalBars Class Reference

Chart::HorizontalBars Class Reference

HorizontalBars class derived from class Base. More...

Inheritance diagram for Chart::HorizontalBars:
Collaboration diagram for Chart::HorizontalBars:

List of all members.

Private Functions



private _draw_data
 finally get around to plotting the data for (horizontal) bars
private int _draw_y_ticks ()
 draw the y-ticks and their labels Overwrites this function of Chart::Base
private int _find_y_scale ()
 find good values for the minimum and maximum y-value on the chart overwrite the find_y_scale function, only to get the right f_x_ticks !!!!!

Private Object Methods



private int _draw_x_ticks ()
 draw the x-ticks and their labels Overwrites this function of Chart::Base

Detailed Description

HorizontalBars class derived from class Base.

This class provides all functions which are specific to horizontal bars


Member Function Documentation

private int Chart::HorizontalBars::_draw_x_ticks (  ) 

draw the x-ticks and their labels Overwrites this function of Chart::Base

Returns:
status

Reimplemented from Chart::Base.

private int Chart::HorizontalBars::_draw_y_ticks (  ) 

draw the y-ticks and their labels Overwrites this function of Chart::Base

Returns:
status

Reimplemented from Chart::Base.

private int Chart::HorizontalBars::_find_y_scale (  ) 

find good values for the minimum and maximum y-value on the chart overwrite the find_y_scale function, only to get the right f_x_ticks !!!!!

Returns:
status

Reimplemented from Chart::Base.


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/Pie_8pm.html0000644000175000017500000000524612033071320016014 0ustar reinerreiner Chart/Pie.pm File Reference

Chart/Pie.pm File Reference

Implementation of Chart::Pie. More...

Classes

class  Chart::Pie
 Pie class derived class for Chart to implement pies. More...

Detailed Description

Implementation of Chart::Pie.

written and maintained by

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1Split__inherit__graph.md50000644000175000017500000000004011666706742023213 0ustar reinerreiner1a4ff0f8040e53e99d6b2399152ba26fChart-2.4.6/doc/html/tab_s.png0000644000175000017500000000027512033071320015420 0ustar reinerreinerPNG  IHDR$[IDATx P@Kg"%(IE|%I7ilm" ӏCۓ\.dOZ̤Br/(#a6 8qaF-EtA4fl]JjJC%!<#īIENDB`Chart-2.4.6/doc/html/LinesPoints_8pm.html0000644000175000017500000000727312033071320017550 0ustar reinerreiner Chart/LinesPoints.pm File Reference

Chart/LinesPoints.pm File Reference

Implementation of Chart::LinesPoints. More...

Classes

class  Chart::LinesPoints
 LinesPoints class connect the given x-/y-values by straight lines and the x-/y-values are plotted by points. More...
class  Chart::LinesPoints
 LinesPoints class connect the given x-/y-values by straight lines and the x-/y-values are plotted by points. More...

Detailed Description

Implementation of Chart::LinesPoints.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/classChart_1_1Points__coll__graph.map0000644000175000017500000000030011701115624022731 0ustar reinerreiner Chart-2.4.6/doc/html/tabs.css0000644000175000017500000000210712033071320015261 0ustar reinerreiner.tabs, .tabs2, .tabs3 { background-image: url('tab_b.png'); width: 100%; z-index: 101; font-size: 13px; } .tabs2 { font-size: 10px; } .tabs3 { font-size: 9px; } .tablist { margin: 0; padding: 0; display: table; } .tablist li { float: left; display: table-cell; background-image: url('tab_b.png'); line-height: 36px; list-style: none; } .tablist a { display: block; padding: 0 20px; font-weight: bold; background-image:url('tab_s.png'); background-repeat:no-repeat; background-position:right; color: #283A5D; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; outline: none; } .tabs3 .tablist a { padding: 0 10px; } .tablist a:hover { background-image: url('tab_h.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); text-decoration: none; } .tablist li.current a { background-image: url('tab_a.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); } Chart-2.4.6/doc/html/classChart_1_1HorizontalBars__inherit__graph.map0000644000175000017500000000027411666706743025163 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1BrushStyles__coll__graph.map0000644000175000017500000000027711701115623023760 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Direction.html0000644000175000017500000005123212033071320021077 0ustar reinerreiner Chart::Direction Class Reference

Chart::Direction Class Reference

Direction class derived class for Chart to implement direction charts. More...

Inheritance diagram for Chart::Direction:
Collaboration diagram for Chart::Direction:

List of all members.

Private Functions



private _draw_data
 finally get around to plotting the data for direction charts
private int _find_y_scale ()
 we use the find_y_scale methode to determine the labels of the circles and the amount of them
private _calcTickInterval (scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)
 Calculates the ticks for direction in normalised units.
private int _draw_y_ticks ()
 draw the circles and the axes
private int _draw_x_ticks ()
 We don't need x ticks, it's all done in _draw_y_ticks.
private int _prepare_brush (scalar color, scalar type)
 set the gdBrush object to trick GD into drawing fat lines
private int _draw_legend ()
 let them know what all the pretty colors mean
private array _find_y_range ()
 Find minimum and maximum value of y data sets.

Public Object Methods

Todo:
calculate the width of the labels


int set (hash opts)
 Set all options.
int add_dataset (list data)
 Add many datasets to the dataref.

Protected Object Methods



protected retval _calcTickInterval ()

Detailed Description

Direction class derived class for Chart to implement direction charts.


Member Function Documentation

private Chart::Direction::_calcTickInterval ( scalar  dataset_min,
scalar  dataset_max,
scalar  flag_fixed_min,
scalar  flag_fixed_max,
scalar  minTicks,
scalar  maxTicks 
)

Calculates the ticks for direction in normalised units.

Calculate the Interval between ticks in y direction and compare the number of ticks to the user given values min_y_ticks, max_y_ticks

Parameters:
[in] $dataset_min Minimal value in y direction
[in] $dataset_max Maximal value in y direction
[in] $flag_fixed_min Indicator whether the dataset_min value is fixed
[in] $flag_fixed_max Indicator whether the dataset_max value is fixed
[in] $minTicks Minimal number of ticks wanted
[in] $maxTicks Maximal number of ticks wanted
Returns:
$tickInterval, $tickCount, $pMin, $pMax

Reimplemented from Chart::Base.

private int Chart::Direction::_draw_legend (  ) 

let them know what all the pretty colors mean

Returns:
status

Overwrite corresponding function of Base

Reimplemented from Chart::Base.

private int Chart::Direction::_draw_x_ticks (  ) 

We don't need x ticks, it's all done in _draw_y_ticks.

Returns:
status

Overwrites the corresponding function in Base

Reimplemented from Chart::Base.

private int Chart::Direction::_draw_y_ticks (  ) 

draw the circles and the axes

Overwrites _draw_y_ticks() of Base class

Returns:
status

Reimplemented from Chart::Base.

private array Chart::Direction::_find_y_range (  ) 

Find minimum and maximum value of y data sets.

Returns:
( min, max, flag_all_integers )

Overwrites corresponding Base function

Reimplemented from Chart::Base.

private int Chart::Direction::_find_y_scale (  ) 

we use the find_y_scale methode to determine the labels of the circles and the amount of them

Returns:
status

This function is an overwrite to the same function found in the base class Chart::Base

Reimplemented from Chart::Base.

private int Chart::Direction::_prepare_brush ( scalar  color,
scalar  type 
)

set the gdBrush object to trick GD into drawing fat lines

Parameters:
$color 
$type 
Returns:
status
int Chart::Direction::add_dataset ( list  data  ) 

Add many datasets to the dataref.

Graph API
Overwrite Base method

Parameters:
@data Dataset to add

Reimplemented from Chart::Base.

int Chart::Direction::set ( hash  opts  ) 

Set all options.

Parameters:
[in] %opts Hash of options to the Chart
Returns:
ok or croak

main method for customizing the chart, lets users specify values for different parameters
dont check the number of points in the added datasets in a polarplot
overwrite Base method

Reimplemented from Chart::Base.


The documentation for this class was generated from the following file:
Chart-2.4.6/doc/html/inherit__graph__0.png0000644000175000017500000013726011670177756017727 0ustar reinerreinerPNG  IHDR(.bKGD IDATxy|\Uϝ$i6dfARZA}+K٪, U m&(| $mYcGAQ (*"E,LhiJKǹi'CIfKrޯ׼s:ΎA `K׷`fǧ8p{ɔ|9FPN8 8ӥjL}`p[[N`/E])6˝hM)p3[,<_Y;~e0 ~_Lůg5Lު730JJ/Wcq.0?#cG[zxt*Ir`g ^^{ 7&0/^yhϵ`b È[_~,Fz 45ebha3X v&&aU)گmWaDd S#[ĩ\ R>0!COĈtZ,id+L7hN=FI0ݪYGR?׌p'e#IE3gh$;p7["RT]<$ vK1B]#C1cDY30[wSr%! &fb'} _]z _wAMttU)~x)|zOL10wV_IUe 4Ӏ*19, 8/OA@E}aQLeۀrKQ}6eX+PheX;Q2 ywJ2>lk)f@YPn/o'z,H>}Ut{+PC+P"dni(4:)"YU"mm^}f-C+Pr@lyX_ 훥0XyKK ΍ 7Kae)'ח}"zKaʛ>.o Bu|qDmWhXAE3ْ;@YJUUNK@~?]AU+,Ņ|jjꇷ6_"ɤijo i@YrN(T5!n4Zq3{R.%ԗBŪ*HrҞ60X6c#(KNpmT^`WjƟ'FP FU{@W&bK*O]UBZW~9lXx܊.%KԗBkUՋ#v,~M?WA)O,"L#tU98/Z,}uL& S!y@j(S]}xU"`͚ N8M.U;g;{|2.ǀE?"XliObFňI}Nˍ(.-ϧp}^?׾e;&ڿ%Llul`C|HǠ$}BLb|&}w$F "\ YMfQV/OA.Z(̝ړ{a"10 ;Tvlwлӎ_e鉚HF]6G_}} ;Q=61W6qоXƶ0ݷw KiCɓ֮mdŊO %o39 aSU8Lg[, ԐQT#>}vR.u*GX,EEEޓŒ6Te=_m6ȹ"]k2 fkk-KN5 8K+*>B#}=ܭ6mz%OK~ݗRL\_z{פ/=bV_ @wjNOښz 2xxbjq&}VI y۫>:b vЂ)STw着"&Mvd6TșͧU׍R~Xlip[[>[/6$TV 2Gi7;Mp{,Vu+Nlb#ABii鉪8wre4piZV r>v5au#gҨxuiz. t|sݺT*V,9 @Ew4\rڣTg"7^k{uUO4S x3](,5 !*wNU=ǀc-y&)Bӧ;6ߔ ;KWj*6dɓFh}X a_ebjR]"<3˚5ͷS< EWrN,T6{fNK񲄴}2v `"Lr٭7p;5x-٬g:}2 lJl5S@ZgN׭FUy$_l srX8Jdo#A< Dg7-EWU[e='cA `K}Hd=)FP9AgVa&c?Ϧ9" \Hnh[՜rL}`p[~OňX h_xk~==_+Fjh,Q`M:1$ڽz NW6Dts~?ɳ R E6n}ev <ﺑ.#2fawG#e0/3 *1 u#00@^}0?Vj7Uatw=l9.ˋ9hWg<+Iw( S gXySJeA DRGZG(T}*SWh41{y%&&Lzտ=LCa~H-ƷYkyG'0Q5Ƽ ]R>/ڄlnD*0S"4ُDp7?cϜU@ ڻwhߺwUUDfٽ\0EHLL|J9~m+0 EcZc8·0{vTDJ90Ȧ;W#>Oǚ`{L⿝+6UTU? 8L>+Fov9/amurb`iW_a"v37&.eJz=;c@o^<}_X*rL>wD[dٵ|XmrPL2;[Ɩ䚶Lro|{8 8}˔0[ߣ~=ٸxw{ak&Y_ PP7}7=5$\7lG2͠ 3ky-l i"+!?{{տw_nDJtQ70̓9n[`t>ƌlf,\Mg_–a$&+IrKsGuz~8[ FɅo}/N%;7EA[;~]83:~1z9x#_vA1  lt٫c쨎:t%tɉsgf4)SӱKF_^ɷtL8M*.n::ٳ? TQz4`0g69KX9lh[ ][o= "\y f3`ˬ!"z׀q@ V<^~U|X)1㋗P() A}^X Qe<H TXq X T MU^ 775%.^"TyiuNRՃv, A%z.96gWj#pc,rX"ud{]m؏Db%9vb;WdxwE^`noorU7El: 8 捥Ud8w8ȯF;ia6"<5*_eR̋ >1cf~s_`,ňlsvȞ= ƍ%u@զMDZHUP䅊#4@y_j? fmUD$ux/uɤ~ODzX/ÞWޱsljǮebPᅵkvdh+m>4&"GG `X*f@s{?PXl-\dR>|{f\7r> KS8Yϓu'/tv>\[^TU?J$q$"sц ep`py nkzJ\t6#\BdbEQpniD JK8\7!7lTH,CAzG鰴o2靧PY7&FoXH,CAPhnxK>~,_ @7߬/XRQqX'EXWRz5//M]aqMhjkVq3>y0 0=v,\Tj0,²Be墠js:af +Py&((M&jj"":OD)0]y7 KgD8{--VT-HuGE仱XjY +P UrY b䮪n'U[G W۾V.xO8N,s'%_8<*_o+Py;t}a2<1k*M\_&xHU"m' -C+Py@}wiڵk6[ǚ5KEdʕ7}oKoF#|pʅ-˗76Ӌ`0rdRg555OYff{@bv7&W`5k} ,G9!6򂍠zϓq@J.) MMx^cD l IDAT ܜ1H l`_m)[*~ʆe E.#+\OP]^S WBCڇѬ>r &ȄǀUZ d+%|=IF:K>uF~fzA",ZLWM1zO[ZA@8 v6wd]ŀE?"θx8#waoG`'Lwx-&U`4?Smh2LWߘN XUU "-PdF"ɧP(P(zWidx&Z莠_@ [Ubo#00裘^}0?Vz &v?n·w~:`z0[LQw_!=|Ob;+rA$yIOU="_]HU8m/9d ^^{ &7&gb"6\ iFڷ,Fz+>P:NDt7~hfcDYa"~3 xͯQIma|/rMY :sɻ@o|M@9 LDERε_ L&k"N٤#>ګDFJ NpM/RN6@9P!/?U^x WN] +1~_LSH]14?g:9jo=j/ɇPkP$ẑo^?K 1&l i">{#^;/7b8(j视It{ 12LAn2s3eS?7Ry8ޓ$y1͇Bu2mmԬ^Y"klmm&Kh㉹%NٗJ̰|#T]?}+`w#LRx"&x 4`"^1&+1vѶvNl`lN?#6IstSUɵ8 \*VaF2e=8ұ栆GFVvqO:~XN Tq/TDr֝D;Y, TQe٤5>K[[ hUhËe ;CTTxs*7nrlb6""H\rȹɴA62ıTv<[Oz S*/vQKΰT8@ܙH$b+͝0XzƜE5`8";ޮSb%**.+0k䄪sT+V,l^2Fh;@@ʆg<"[,vrwHˊE`"+L ] ~_hkX+PYn'mDx"T. Ѕõ;'m_)Styiimme3VJRUaʳkI (Rry2NJ]Dij1l4KEjjꇷ4&B@Uv[w~˗׷d\SS)ߴIT5+L.E6mj>*o|+uO4؆ z/~6u`pVLDDv,V~g.,jU#Q "` L96nV ߩB6j ꦪ"r(ԧoXpzI}y2Ӯi\wH#EU [ADF[VpWKDt'K.T?𼑇0,Dr3-E1u'z?~yX 2T?Tm2}h^7yr}Uy=u #} b75]gɒslG&L` ."g%‹HvJH -dFUn4pu @֣A챲MB7nVr 5gw\y*ѳ-G>"✨>*$8үӰa%Tq6ڻT9h#29>6gWAK> lzpI'eu#֬Y㰷pp,֐y]K! "!&gf2|cdRʕ*? $y zLnzda>5`n2ɪz8`5ka, 8'v,EYcTyjժ? ^[OTpKxïd]n`d91 yg ] F$zp.) wUUuϦ"Pz8!MM7T*MK)%esPLre%%XMMة r.ggBueb TF1X,FPDA^p`d^ .~:N@UUtU}XlwmbA=J .BHf4>z"HއIɤ>ʲx~&dɟtꁩ'o 6"m|񾪚YisDA$KeX&B% ZB?x3);\ 3'ܘ=?̢=qoчb#^Dx(d'IDyX9RRRz'yH1c[wS }*8`Yw;aL L^eԹLRMfQV~y_GW6tIoY+;gD~]b#.0[AٜљDbn7G0X; d^dt2}Tl'd?rAuAIxPewUUNUǗ;/&R."O㋯˥-%KCDS\wΪhUW\sT;)Æ/[,b#NHIz7Sutw2^<^Ba ˗7|ΊŒm@uB(."{g׼iÒ&?EX=a <@uSjK8mmrZ;9*]4Wv,BcDd_RF*+Auw<,3Uo6L;Y1V>R`/ټTIIbli}6Z{/)Mt z'ڼec* > LJ<xc͚뻿[WhxF(T7UU _\ذX ; Ug_=O@sGݪ&o˫3Ka`Ҥ6lvqw9N`3kcy%g1N1b`[GM$Vo(C>7&@PSS?y)kl(S@erhUNS ȁxn큪+"45]Q/DG#] 0f sU䄇z$s@Ҽ#'9RuvVuW*--;IuؽimήhkU#kx4:HSl`yҰ~(c*+߭E)!}bD"Qv݅rSz!$ReȏV6^h,Ń>Dޝ]QUU1=?u'?zEM0%\"z|z{4:ò+P>UUILݼZ08Lz)悼6fO^OL -".xb#]Tѣ?:햁(iSUJ<-JPUu:}-L2̖TYDJKvȑK\w^7D[ad(UO7;4+tvO2D/BsAsgwm qӁ+T* %@j*{`<]:[~TW{\W\y߳Uo> jWN"zHYV0ȕ)E=uv~IlZr W\`Y%%ASqH~=튢("8eMf" η@r咾)[{yΞoY)[qo]VD?]h,+Pk(ƕ$~-M$Z;RN0dR.aWd+Pn-CTT頝mL?1Lߵ;|@_燓uw^@},V~-' e1z'cmi7WD38 ("fþ r }XoQg. "zjfbK^)OːdZ#ǃ͖{qhFːc6M!ASIU/_^~X y%Ր~ lpf}w9;Bu Kc 9^`N\ ]:My I>gQ^@:Se6ȯ6ܞ'?7b-7Pz`F%b!)Peym9:;*w y 7j+#Qo&M?lT(ht/ [@7dE.`x{l;7|@y7~%?>WhXY?`p&p+c@?7 nZ|2]ue1E)勀Ksm W 9jiqv$H;r*OY4i&DB"B,DWUpg@^A˗76ۇngˁ`SDd |` m= ԧ끩瀓cEŐ(D^ݸy3Ph E/JA4UR F>u84xώW~dG䈛13Яe[`g!X|)6|a"ù2`^CNDt i;L>>@G3? i"\K[rqݺU ~EgaB:NktR#3 l]=Lɻ IDATxH1`|k~==_\{4ivDi'Ƽj іaPLmؼ::)J{RLs/!p\o`Jy1|7q=FwDQ纫+{>nL^.fĐ .&";yCE87Cǩrd>'e-U/̗>0o/؄iobDb0-?6\ AW/?f# }!hYkliO'ٯI&#(W0P?0s>CM:ӁI lOJ;'@ $6'= SZZz8P"ҖqJU^83s?{gWUs'tt'soB-P,R6A@DE@T+Of҂|QЀfBYeZRI$f3i&,d$~;Oy98SU=x%۪^R gxfLoY 2Z 㻚M&N 3?a2R`E{Svg1N0CV:wdr#Lʢ p$_X> \Ezf>(YXzE  U\M{Rs$R9(m&==%NW{ޠ'0=B:K/ts/ٶ|=33oCz:Ϧ;^,>S)g#ha&PNo!JԭY]OV^֟>W>Sƶgw~- 1C]glI'Rt11T|xj]+U qdwž^'uuff;`\URg00BwʰJqbg dG;)~&lwl["rVd[C.2<<39A#IZ01 3Yag`3q [8Nv +sln;lpUyX?y^y E9g 2Ԭe_y,^ wrjle<ʣ[s68 #@T%3,U^2 ,M`7˲̝aY*cr!ǰ KϩDb1MM#tn=SSsC*PR2T$$Բ6 t{Q@@1,*LB[x--@AAA5U+/:ջȆo{hLG"s'~o"76}uoɊaX4-)EdQu9ڲUXnnI~0ƲBJ& h#B ,K0 xq>}0,WG" '2S5s̙>;1Yg#B:3rA!.SeQ?$ ہT^"+Jr!ͭGӦ-ڸ=EzdH$z{BDae?f'S[[)۪px򘖖Ɣ @Xhm3x7ZhYwI=6DXǪK#蹘]gzc c6"!vfԨ=),,a͚ɀAB ԨQM3|DBik}A>iiZXm_lj~VT"Ducx;Pz " &> o|.y/Pɤ*BI([~ x!2b˴{B*\7vyL|vpdߗp> ` {ʌ@=Qۺxޞ"'"_l-}} X ,=̲X[pTgp1T$jkk^k}C!tj󙘄w[^h?y-P"ThEt\^8l#8姩T924k\[]*;V~ :@֥Rpf_\}}yo֮哾aS_x־5).pHLhΠOWqO3q! C-{슋/I?pSDduc_ DNa?W5X@1Xn55:u^TCtx踦&N,~؛iɤ> ɡO8NQLUvGUW.ڀܒ%ǖ*EXY&(77m&Kv, ˶NK0Y  $y+P;Ȫ#ߗ}DH>t\Rm8ϲ7b堧qC+x0A0a pXdgo5."na9p'oiK#AUKXVbe'BO@@y+P"L}sTQ Ұ*Hs_D,[ˤIQ۲[Du}4{8_T՟r_(d_B^ Ԕ)oia, n׭2˗OK& '١p{ NH@gDBy^z7y)P--B!}}U|2ծ;\ oY!uuhva~ z_=/E^ ر>}E c eiY"ruOb>rgFS6rUPe~*'a)Am0d@6H͒%&ַ|V ?% `T2=Sa.׍e}ݶHsEv<>OC<ɡPK˕@6eY*0yeȣ$`5ˈۚ/;rdUEN0B' 38A!/J䥥%ɤn_2؎`j0l^~"L=uG,򑉄/t*"rl1mS<>(`GUDBQT'.8d6@$RM@UN^,L&g"LH^a- *P ",K^ 5T;SflwU7{^}cvD"#DoG; .]j%Cɓ~J/~QфWן2!Jv!5OǏvI1kk'T{=[\0T; G&)(0=(Uv,hr<^S}n:);Pg+dRk%p m5" RPuq!1^K_p$sʹ"rU;g̊7UM^ Ҥ*r/ `c {–R,{]wc]Vܮwn=fq'v 7,џ7'[q#_$ pΏO@ k)ȇ--ֱՒz@o]?VKKwde^ڜIqvDxYD{^ҾYv f=`q'}J֑OORM99LDM['8Noq/R?d[ MQ_ o߷n/ [W0[-簭rP*`ԓ] TURo/\-Д9?jkoz"T .&#mGTer>S(.Z̐/}FڞS@RwLfܽa2Y3;11a7w6D q+Wk&c1{PH2YOD-Ke;XDBcl;kߋѪrm 7naM1|7/׍]Ϸ =E5 `{Ulı lk@? 3yv,]W0bu 8f?1Q]߇-21A'ǝ1|pw=?ňUg0=1aA#,T ia#Ep-lݦ%¬DBN+z6٪AB!kII.$rDn&@曀--I?wr7r*w&]{m<ؚ3gYR#K0~fR;{!#>7Ւ:sFRTySzͩrlֺ!(럪>&N0_ЇUbrz*{v(掳`$.W+orjGs, Zi-%&NMwվtR{NSLe5OczZCn ԐAoJ%ۡʎi^#"&f87QQQ|Uo}{_1na`oPňk60abH CπvsUª2BUDe^ky%|?a/hؘw0_|#̌mR+aFmq*bD l߃1vWO?Gxvfbs%OA݃!.P "OYQ%+ GTՅKd?)bѻE'P+{nՅuu mx<2-5^`/1x?2Nʯ,3h]|py`f^uwCiX]!Rݗ*;JJ=FDu:z/le>+UwKAAbdk%x \NCk|g'cߙcO^ƈMo0gY `"#70y!/PPaE" "YwUU}LDS<ʘ蕍/"6C-"RL~1a¸ke9aP<0ÈAyY~#$eY[':@DUmХc oڱ:Zf OCI8h]ju*p@DjЊGD K$,|DxI$^asڴE7&#]ݓI-Jy|DNU]56?`ӑ@Y6oĉ߄^F6o~kiC..H$-,ټyي߃łQ[}Ɩuں&Մ +[n̶,TXLZۦo$@y\_H-[^mG H` hNnH$64"--wkhe O?y'G>`oXظuZ2+fӶKg(Q+`6C--,U6t=i҄z\̊O#DM3rs}fvhrd%5=sƗٸ0J-]Q`QaV} k@\epԷp(Y]MiTQS":=?~6J);TU*A wzy*-yz!ث@ ""3 t*_Q~A8e7t7 j8w} 9SO xro|&$U8nqQW[-jHa`BϫW0RFbqdg4P,ev&QR=eCc$I[J. &W s L RLS1\ϑ=&5~tڻVX~Dx#cyCPyKGzIϘa\1Sga«V[5&tQ41K;(&Y9/:=̙^޾oͲ,G iŖ{^,DdC)&ϔ; 0 ͘$fpmlIִڇ3v5HV5 ;PV8e_Dv{V@@^S:ӫH_a0cz1C1<ɪ&%"07FqTbOKU_z*m6:e6`reK* `!Pzi$Ƈ[#ov̮#Ȗ\Pz}PaRL2N̮DOxcaej}8sa86ހ>:A톹qݴ_:m=s'2 %c`Xf02boaUf׀~=(0_bK\7#fؚ1o:A5k ]NSjI]:E]Ж^Z1azv3zP=7ds=fR.SutQljSf1=3{n Pة' IDAT=/3z%PS6%{sfALqE3E}TEY^:FDì' [;9*[KDMVIZ&UPՕƋkr@@Q\<3+1bil"jYҢJ`m G9E4۽C\E3!7AfvQn.ZL- `7-ȹ:);,()hv@@^p+cKɓۮ Q*[qTEXYr rmХ D=-W99@ ,[Ńr|?cVZDXằKJΟ3=@wMeSТJDXem7X: XP\\Lob=Y>U`*.pe5Ok:Gk**zf |&Z mj^ZSsc)`x+=ɫY GB]wPe>>E4$V8}^D?$D(0=n#f_ ;Θ]T=@5C#@F~ێlUZ-"K_U}M+ٽtH&9P4nD۴i3p䣏ڗINaÓw:Yر?@$<郕7/[ ,ꪀp}ADY5s[.r+nMWԐ=Tu2di~.˒%55ۿ8π%L!ސ²FQ\<$"!֭INf{in6&OQT֯BLYVjf8q|S_Mx =Ųʕ}m82\W~.`y2Y<Փ \Û>KSDM;8Pk#DDLH B\quJ&?ڰnݽƼ@'z*vsH@rlId2|ڵƻ?#"j*IR_U€/;e3557í 1m{Դ`MO$]CUy] @8Ntjg2]`1zQEET׭|6""z-}n wg{yH0+'O(҅8D8qgcaVqH/YxzLn"$DV'F^T88îXvm0atB[K3D5 BFbR  bƏ~8@v3A{٘pխY\-lBT{5Cu$!}Yb_90_:lS\yLJ1aɚ@/`q'͉Es&kiu&k\zy+y!P G] nSE w~IT=o݋;O.Ⱦ?8Tc맧^ݬskH/Lk#8[ =c|jc1C9e?0=ٴ%}-|d{=O^J&Ft_KՄIFG6+C^@QHVfY8`Vޓ5"N܂jU!IJvIvl7jB =Zi#\{czhۂ􈩭Md\:T/@[W>mٮG`zF0C1)Բ-lW@-zQ25&uYGUez8*I}{ۦPګhܕ.AgGìD.9Gm ^?. ˺x*d700}@/zj\(/Z{TI&bؓ@uDOQfHǰ!KYP 5#u]S{+kVpv0ϫz \'"_߰$c> nZ97Je a|/K{a|@{Ga✀=qq;Y4&ΩbT{/!-P` ugT`,I+m BG׮ `*y޸kkozr˩9Neeuuux"",vхreGv Qk2fJ>n{̺5kGLN3SW #3R}f13]EO'e~}',mG:DޏW$NaQ$>"pӾWڗ/nTD"@\9q؅KT4JYxxlΠZUJ,Em~e( M:KDbį`CE") pt.;y'PR-bV@(TкHTRAU={: U=,6-bS/>`:Ntֶ! `weY~50qJ$|_K/jZꪮ*תrm}V[pݪ՞;CDt*v Qgp" @dubh#pPzxgTY)œj8q쏁r@Y׭:$UPerꀀM T2YPm~K]E*Z1,쪾%K*C!t`˽YWĉfepaJN Tmukd2um9NYnLY]};"2GHw[9^$+Cf߆7l聲) ?;ZDS3yi}.̚5U<-[y7; p׹n?堏v). 5y)PTdSNoCu?n>"9ΜQ7TWUU%ێ.rڶ\|)x| W s{X VVP,hVe#oʱͽ&=7m7_P'/WF"џ)WmGW~AqGQ'LWm)>YxA_ltAVUŵGZWχ'S?m ;Pġ%-˺P__m׭|TkElٝ *|ϋ~„EBST;NbҤVpf}eʶy6)%&Bl]>00kʖ!.'CSSndݦL|vE@/ ?+*{k6aAY^!$q38gEɂ)#Bڵ|y? vV߂^԰qʾ @LtfU⼹ @Uuώf\id.X;>&ײT9qztf[kia@n톷"iO:`蓗>n5 %:JZ" zzOSDz\*;μCra}n]s-Kf.{l;D'AF Y֖.6Vr;Qz6]ʓ@*NrU 龠` T|UC<U}$iYQkoD;@E:mj*:Ctx0R]]?ϫ:1O U*U TJ @uT93VvDzĠ uvonneLPN2B%PB0@J`N@ @@F466t+ @.wHuufϫb{U-T'D@Z+[}@sKMWN^{ހVܮ*wwjx쯮[ueʭɤ~8_SU'ev U z+:öˎ-&;_-K*azKMMuϫ<#)1U=ղ VF"?vٗ Y5f$ IKr 37DKq^Ֆ%K*7o.:Qzc_յ/ kjjVAuuMmE<^uc%ͶSTiް2^߀*免 ͻ"EW|=Wjk+@rPc[>qx`pVv_m;zb>ʀK 25UGgy޸AW~ϾV\ϪU՟ϋyUGNNQSAB"U8y/y/PLضx)꺖 _Ds9c^ ^\r]p`ʅMx"ϋ-;p|۶D/ dpHLXUS?]U2~?5\|`~F"ѝ,JK\#nU7yi=>5jN[VP0Da33 Kn$劼Anj6lY  x`0$@qMg<#sX` ;vKڵw_z=Al 癬C U޴,ld]zێ}(ՓH4DB>׽mS$2eu9GmrU n +\27Jb*{?%0 T?^ڵ|Z)B4 -k UvVuY#9BDM sܫljlDʕ"-!uu l  }M`¤IQ;b`ȑ0sqU_U?&"&>׶ndAOr͹? `(1, K u0ï~_A~aTBJp*s"Ox|ZиjL^mukj`V($98V5Pﯸܮ[g?D0eT IUSs e _϶Bb" rkg^,͑H!HlW/3h`Sg$Ǭ r+?F3y, _U5+?^,L|v9u xյ"\!Dʿ_ !Ja[\ 30"Gm6^)F03Nc-9aTj&ofFXWUyʔsǫg;0wl pQ\7V!Bqʳ)`Vk9 p|:0867mC [{WAa#P$o7Lm=H* dxBPP]]Y,T1.RWz_**p8 k1Csg;hFL.Jx83Uϛs\.c3}3u>#7&` 3콘UaN^GSwU3h)en]K&}aQ yp Py΍ H$zD7pmv88fwp!Wu2 `2Py>~x!Ur }){1Q ^t?ӫkvONx8&ٞa;2eg]H5vWu8F֭cU3yYlYj=rhOV^}k׈0>E=C"<8encgYR+X4cz.- FkӛjIg/Nbzz`=$4uϫ# ԽǍMٙnowMΰ(U}S'_Ƅ^I#2}ݰFMKrdj,Jz^ͷUW҇y J;fY{g{ົԹVeY&¾φ^Qe'_*0/E*JKKris,J5>ne]f#^hq fXWafv 7e|c^!޳d':ot'绢{ +y V^1? K?1= 7;~I6*BnX3A&>0C۠-f8u Rߘ^PG<ǭ4n:.N8[asza%P+UXz.U=@tm쑓ċҟg۵ ra2Ə3s5;G0gSu\\I5M\av2ӹjs1T^lf$U`{  v4nϕoчʼd_!._bѻniu蝶8}N2 c&cQg=/bf}>EGaV^SSqPz- )sՃJ*0+`"xa@EI%%鳥=huk ܭvIۮc-L\f(l#Jo)6vǪT&ts߳%m0(Y _3|(<j~`RII]gY;*eO"7fˢ7D߶m? C׀υb@jkozd7z GoUB'/`ND ?znժX>rB1qݪ@k{s}_ǫ)W*)Fg Vl }u& #^?Uvm>kyUR0`&0(k1J&k]FmuA \e KU㕷 =xI`a+P"UƖdzϋmE4:-M&emGyb66smGBljAEOU0o C<Uyح5mxh}ٗizM/A)צ8[ ^&a+P"@"!i=r&7I8lʄlXH)*ҟHQUїzrU>dYR lÃa+P&#.I~6N֮6 3f* s,ZMMdRTe8_h` H[ y Y3gVf#ȱ}㕿Se˲ܳfMUWGl쪁Gΰ(yUL-KQWaDC@e>69N}+ZUywH铑mWeX [/ٶ%G zPzٵko>G .mzMM-[ye",zxg* k+uVXeW?-( }?^TDxògS͐4`x0 `EnZ^,{X >V5% {wWU>~--m3&`EEEYMK&euKP4",? *% A̤-]ӒmiHL23w5fri9{nm'ŋ+cVW{oeYS9FzBnWxns.?0ub PPH/iM$wWկ8N?]vFi|nywo ՇBɪVؕϷ'w}u#v})+F|dIIyļb?38HԿ/UG8 #rQf,_>ou

ߗ*xeQ;srͯx4v\kr&(ρZolҫ"t؊noO:k\őL^VMFsUf!$xA"rx[\7r@r4 DA,VeŋTu՞ǡM> rǜ"z*pPE"uWG:.k *E'@&"l6:?5X~bqFQ|= KJKuAX#}<ɪ%HD8ro($:UYY{R89_s|_v0v$/B*W.[v뢮evE"Q!+ ϋ峖.UUPVtpH>갬baTDIUu>hcU7{RR"W[n;/=p9Z5-qv45տ 1k _Dx5lՃ9kAL>L<9u^ %FO?`ǣ2}{X X/$W3-haTo}%zHl Sg]CH5:pXoY:Gul?NX ڞKUlڈdyPf;X>G ~T>Y˜K"mx&p1 `Y.*x+pju00cq%6MUb&5<-kE$^YU3s1OktVfl; X Q{@3ǥy#m[꘳[2'omѩc?T}SѰ jx^SU)s͍YVnܝ"~=1yX} LŒ|8 8 3V` P >4}{F$ɩ ɓϩH&;y@8"1u"sgdWky쯀}`ށd}wi4f` cZ4黙e=@"z)UqYֽ/&I]: &T΁xYrYmDitþce9sokL7p]~ɦBL|CY?ƕ)jMP}@f_Y y"I+"zpF\zjLj>f|)m&f>ί|YԿ3_/sU1XZwaL^ |7UFѳ $՞q9p6Ob`pv|ĉkA_Uޡ|A8|3sE Mo|Nq>f,芍 L0cߩD.ﻠ*Q'~e;׍'0mZ(׍n+׍<{Ϛ⺵n8"Ek `z]+hrn8Je%浃< PyyIn{I^))x,-XEu~Z~8^bTJKFrOU]][tLd@#ZZ:_֩yE̲D"q"ɤ>;lYe, C 2r*\9B!v{}eYc%"$?p}A @yan45/O&K^pxAd6A *$XͲe8\)SN0eI&|>pGAd 6A BIIם$()vKKE)))?7!̢Eux+DFϫ;ʳzKk**f|[-]Su7nODw߼,g4\dqYÓmA ܮ恞/`דDb- o碼\Ţ7у׮ =кV` 띠e"tmuuZVnmN^b~rW`JWW׭tֲ j/{Aw}W" wJ$ޞ sczVUSU%#гV2skyTt\`Tbk#w6|$\%UU?4W& _*-p戠>rb~* 0kmdRV*/8WeK,vdEdFn7T-_{]M3@\Y9{F͗9k {&庵'8U/M/o.!L$:N-/\xx]]_j[1踬&[T9_MDk@WekZ١J`ѭ*Д)gKJ:K©G՞vvooH׭9"` 0=yVUl *.<àBɜv&Nd.HTx _T󁟖kϬ \7qĻ-tSԟ_Q5x^dI"|pB!١|ڽ|_gp*7MMeW_!??{/OT 20!| O$B9UZ#I}u#On'IAZeTp-tv:<+= tp~ASS}s"xyKUg*qQmS?qF'6Aɘ1] i~BxßE'O>"_mm守Tʚ<ukg=o~D׍4Ñg=Eh@b+϶H6U9=|ѵ+@Np8rP>FF'e屘'=$W3g@\ *Dx -Lϫ's#/G]@8;}*p\7R ܒQG=^/cvs@.fLiذ *Lh|Ɋ#]_<^eUUww}C׀Q <9=p;w#pf%%d0P`/L1U;3`&!MNKԾ@zJXLBJ;صah *TqRU!R:c3<u!~+xXIWd}7n4f` cZStpH^Jq\ĴNp0lXaT^ ;Ñ= Pvu2Iul %-KctbZDI`iƾtwry G>6%(LiqMڗ~ LdE&ǀ ՊJ-w"I9uXO -͡E~[c2rNj`!&QeN+` yeTcDڼ@)> "sT>M!VcT1Ki31F7q~5&1$]YԿ3_/8f˩cW0eÂMP flgWQc8Vk܃IO83uF_\ID`&^l;U#&Y;-`yEΕ)׭].lʾ)Sv l,V?vr!S0铘D8̛Z晈Oo1WV lO2U͘d ܊ߦNk8P5(溑 K1WɉԱcudeAg&sAS/UU Ye MP2g-fvߏ>v\+B]! C?{$NU@"ѡ s$2gj{E:8jY`TA&SŭʲeѸ7BǑHD|WU k/t_6AP}ɮAw} KB~*"u[BoYaTAhi? T_M,d-5ӃzcT9(iFr [P٪<8r_n ҷtt&@"QsDǢ(>҇rV1Wp% |]D^TDKAdSyXXl* [5 :!*vTQۂ >&?ЛF-DPeKs69 ]WYs #nlz)IDATp_2% -IEobW>WRYY3q nŢy}\eŶZ^b=&E(UNvݚŲl @m/C!@=݃̈=׍2²&#MF7u\=4r[AO~y5[`ϲ2dDl*ɤ>Vwz D Y >_-˞WwgYVl*--,̍%`oϋZRȺ]AUՇ]72zPE"7U<mcǸnz7f⺶BƗ ׭9d.f($45տtLd[PE`I;F5 Љmm+.`hYѝ@Bɤu#!BUDl*}1ļ"zy^慌/[X;]D\UWWlt\bTXUϪgb>}@ X,Z*;t%\ygN:2kh Yݡ.U ﺵ*&Dx|D80]7Af7;H^DNU(zODwXϫSU'|̕L9}\(T:[D'u~бY&"5oz}l*DM,ݽ MqKK7?}CUO$o3xЕ.^I-b8@,p*L:kS˖ExIDf?ҌC`%`Lbۂ*2=E'T".#B[ǣ~lqqlT%RYzòen:ԟbۂ*2Drrw%E=R--o 3KK;?aTљ)}%QUU?4[,6x*xXСX 9<Bxb=UUUWó 55 8^ oxU)SN,Pl*Zr3y9=CՏ2|F6N~(_eޏ&1eT*-m_cn&TS\f|WĪׁ2i57[dqπS1V{/fyɲu#5wd{EnrǛo~|U` b9ǯX\|5iEe:H(>s ʶ*u9GR y XU3sLbX$C`-p# GaXH5x8.Um Mgd}OWw'О~Hj{%p_M1&O ~ ,M$3r݈ﺵ]#jc= ep8|8y5WnT6 X>I')۞c}R)c{5&a}>^tYW'1 Lt|6A)f4b:MIbٲ]ӈ|}? .Œl.c>cQiQ`2lY`AWp6AyM4ꀖin\ _QU5{WlV2 x XieϢ1>{ߛ0H[W ԹSK{MPC@w@yA++/k"U30szse̘c>K0؅?RZ'gY9gt М\Պ.W?UWVL%UnJޞ<imrPeMPCLGG/^7˗[8rȗ/_yu.ʴ\ jY|jshns c׭9%WZ`GAE~IUK˜%*7\ /|ZZOARsσsfm߁`4mZݨ-"X-"L&e7rX@sn'exCum"%IN^q}jV1_-U@ߴ jȒDQYYeߢEu~Z~+|?t<&[V6lbMC!~Wtc#B}dYy`ԐUޢʱa,=׃E|0n"llAAiiixQDRdϫ=/uXVol}[OƍPfM=yqf,VTr>걬5UTL/+׮}3u6\Q1 SQ1b~`7ĕ泞xO j[8R:绮D"zUΪ3eMPÂܢ*ÑiyHcOA}ު.ylG1>i;y^ޅYl&b1Is⺶Db=zV΃F** Qfܰn]ckaj}omƵO+*ft6>W&au**JO homm|p5?7ᒊ_3k5r.ް2Ff|CDjߗ}Tq/:kx j}zi"D"@GNîj 3k6Mpxg1Yo? ]Ecڵ/ "k-aHU : jXs"u,PtLrҲsTrɸq?޼~~GnYC<(&af.--s''Gܲ2WD`0GdXl^N-g j"JPv|&t,lY4EOd+/Rp8rԩ5Ag&azN9[SS}s<-E8#=/rEv :>+6A sڻE?ZZ,ǣ*/UU^qڗ]$±cP#@8\s Y^-+ [Xъ;e֨Qr=Pe Xr$Lmݲj/s$Xr6_ɳrK))5Btth=h^бh4pp{C&7̏~P\ y^~,D܇FeˢqUXgx8Xs[~XluE_ ,-7q&@]ϙl㰬xޙ_rHj :AH^60T @WN&*ځou~ pS?ίrGYŮpt,V |Z0]N>7;r&Łg8x8.Um Rǜ ܒQG -ˀwtW `vJ zò[eet׍h8\cl[PbZ cu&)ǴvL[b@i2z&Av:z` ?d4 =EՂF ׍<캑cMPoqL:AMRltR|gvb|e֏AVago?58@~wƮAR -Kw~9 ,ؗ;crwwǴVBRe=miA%0f?d,9cHԿ$N]бH#b:[=ObZM>LyKm)A;$5BJtz4a}&pf07[BL+k>;ݛ6~!9u'j〓dzp8rF :42v5`J]z) < "TG~ϚU6AYMR X,+&( ŋDϫ% ]cEH?q⹛5|eemŊKW$&~OeYcly^8NC'StLcų%7UO{{+V\*蘬&(k<拪7li$蘬vAI&&1蘬&(+',~ILUõI֠ىVά^ikwTTm*œ孭? OAf Mv ϫ=AUumjAd =gE,V#$k[s ?D+KʳK]wy~g--W'訬&( "^RR\TiqY[fMc> }8nﷶ6ڱ)kl ʵz; GEnj *2=vV+_6:*leʇ)#=&(+_dM)Y$(;eeYE&(˲MPe-,*Z*U,F_xso,P.*7縎sP!@x 8sVbE϶bP ,L~n@#% ,#`u0瀣R,k9?u6`ŕ 0 t$:hcˁv[ݶ_iE ̍xse DR?>9+[Y~j`&p.'a$i'kY{&ŁSۧǥy#m[꘳[2|_|b z(sc ,:W%#@I{;L xEO;+׳ aoZ?m0-ۥY֐m PL 7TaV/̞_[rLk' L|yv|bJi2zL2&AvMVf_N X-(ОŒ34U淁UnFaZNʆ-KR >ڟw0М: mY9/}NPS2=/N۫1_ϧ~V؟mwL0p.f^f12{LLw6rIP0i)WՀI6b.&dz ԓ'L lw&Amz?gp1/fӘ՗fK \R-gá IdfjLٲ{g{։I0i`Z7`36s52 O#^z{ӂ} s!nYE-xL7b݇iYL P` f'JַM 0>wL?M9_1cF{`.?Œ['w;o4K7Ӛ8oBvJ2^ ƿJv 5|_>3>ίƴbZYA쌙3_u`M<㚚z?%O/n;pvz?; fM۞^uIFR 3޵x;36օcu v- d =ղ8=fnӘ =܂z5uΩQ&6USc1m3,x/$Uo4/bz?;u۝` L7T-(xubRj6_uSq~Bv NqNvۧo*ccu L̢rx:ٽ̾BͲ*u޶=.Ug6[Z6_95[ٰ zcǠ,l,heYVѲ ʲeeYE&(˲MPe-,*Z6AYUr+VtVQ:"C}bYYلːXVwo^weYeYeYeYem0}yIENDB`Chart-2.4.6/doc/html/ftv2blank.png0000644000175000017500000000025612033071320016220 0ustar reinerreinerPNG  IHDRGtRNStEXtSoftwaregif2png 2.4.2^G%tEXtCommentUlead GIF SmartSaver Ver 2.0!^SIDATxc80Bx<2r|IENDB`Chart-2.4.6/doc/html/inherit__graph__2.map0000644000175000017500000000022611701657021017670 0ustar reinerreiner Chart-2.4.6/doc/html/ftv2doc.png0000644000175000017500000000037712033071320015702 0ustar reinerreinerPNG  IHDR_Tq-PLTEtRNS@ftEXtSoftwaregif2png 2.4.2^GvIDATxc````c``d'0bq$8`q'30012 pT2Si`q'ʀ\\RKRSiȔRRi 6तhQkqMaNU`'E$pgc 0o#UGIENDB`Chart-2.4.6/doc/html/graph_legend.md50000644000175000017500000000004011663774536016671 0ustar reinerreiner82e19083301e0134981e513e6c9b4ceaChart-2.4.6/doc/html/Composite_8pm.html0000644000175000017500000000714012033071320017234 0ustar reinerreiner Chart/Composite.pm File Reference

Chart/Composite.pm File Reference

Implementation of Chart::Composite. More...

Classes

class  Chart::Composite
 Composite class derived from class Base. More...
class  Chart::Composite
 Composite class derived from class Base. More...

Detailed Description

Implementation of Chart::Composite.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6

--------------------------------------------------------------------- History: ----------

Chart-2.4.6/doc/html/Pareto_8pm.html0000644000175000017500000000527412033071320016532 0ustar reinerreiner Chart/Pareto.pm File Reference

Chart/Pareto.pm File Reference

Implementation of Chart::Pareto. More...

Classes

class  Chart::Pareto
 Pareto class derived class for Chart to implement. More...

Detailed Description

Implementation of Chart::Pareto.

written and maintained by

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/ftv2lastnode.png0000644000175000017500000000035112033071320016736 0ustar reinerreinerPNG  IHDRL10PLTEӠtRNS@ftEXtSoftwaregif2png 2.4.2^G&tEXtCommentUlead GIF SmartSaver Ver 2.0io?IDATxc`0O 3$3=IENDB`Chart-2.4.6/doc/html/classChart_1_1Mountain__inherit__graph.png0000644000175000017500000000610611666706743024023 0ustar reinerreinerPNG  IHDR}{Yُ8bKGD IDATx{PT?YQ1(_J،6HubP2A MM$4HZSmm2Eb)M1TbF+DkID;Pֽ\݅l̝<;޽BP( B!]v&BڀKMlK:]MRb3 1EB.!Jt QK]B\w@0 yx_|]tx_n i`ok`/L[j8x0Mo:;AM\120>y{M+c `x`87WjD8mb59`~G7Fc49ccyM@Gڟ}f/1wX=p1`z$-b6F!DLAz0`.bp;,F|  'he^Q7xq^?×}lZxbHB. SgFz&PnԹ4ec B0Fixmc}\NͶv> '"s1H!Fͣn0x!U)͂w1?Bh6"ME<8:#BVvBRV(Ayf, 8ta-pħݾ4G@ Z`B Go޼鏢(--E%D.!Jt QK]BL^~enJaa!.㮾7)**jUqСne6t>bbb0`{aƍ躎`޽f_*N{uVʬV+۷o@T_0Em۶Ď;HKK#==]vQQQAii&ܜ(ּukTT999DDD XlbwbҘ?><;ԐCaa!-G\N> Cx6| ^4x啔x駟΂ Xr%Ǐ 6xͥZ)**b夦e\.-k׮O٦ty+s͐!CZ͝;Wrj… IJJ"//~3fPYYIMM3gзo_:t(W&;;0l0zncÆ ӧOV+y9r'$33sI{9^{5t]ŋ^m~8N'O&..}aȠlΜ9pkCCNhͩSvUp8lKtBCCcĈv, ;wdnw444Ett4Ahp}̙^6|L82RRR8z(s!$9ЕHjj*f⮻j5"t:y %66#GbۉWu}իW@mAE4h| {wgbZINN&$$˚Z,Ν;ݻr wzMwBII ^6Vk@{{hi3tyN?~ˢd^z%._/++ĉpÙ4i!!!={M7Arr2/siq3M:O>xu5>CLuuuTVVrʕ}4fbZ#FHuu5֭c„ \zﹳfb߾}deeaXsث[ԏW^!331cPXXHEEӦMh$%%͛7ve,] ƎIIIaθqXf F'tm{su_纮~  3$;BYg]√Nk 2u ,$8xtfYHpf AA!(3a=L9e ^^}x-ke6܁ br<ҧ\cI :gFx?o0~5XpV :gV #'QZ0m;=~ Wm kr xa7>ǟ؎ r5x\E\0*/FiّusZ jtvcS8r@ͰZrorg1JBBqBi/obd;2Ǿr˽hnWIrz=YҽDZQV Member List

Chart::HorizontalBars Member List

This is the complete list of members for Chart::HorizontalBars, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::HorizontalBars
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::HorizontalBars
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::HorizontalBars
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::HorizontalBars
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/Lines_8pm.html0000644000175000017500000000561112033071320016345 0ustar reinerreiner Chart/Lines.pm File Reference

Chart/Lines.pm File Reference

Implementation of Chart::Lines. More...

Classes

class  Chart::Lines
 Lines class derived from class Base. More...

Detailed Description

Implementation of Chart::Lines.

written by david bonner dbonner@cs.bu.edu

maintained by the Chart Group at Geodetic Fundamental Station Wettzell Chart@fs.wettzell.de

Author:
Chart Group (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/graph_legend.png0000644000175000017500000004431311663774540016776 0ustar reinerreinerPNG  IHDR_ebKGD IDATxyxT}& $ *U* qVE[ZkPH.孕jPZ77|ULq̹<b2̜\Wr{zs1c1c1c1c1cLФ e cL6>y)LPPk߄1ƘNO/v=yN()mcL&LD'e1c,4c1igI1cI;K:1cLYi1cΒNc1v)wn-p_//1Š1c)to;X%crW@K:젎N:5z(q0? 1Ƙdu:\ݐ:?>~,m2}qw | jc` P>Ѽ%xmY` ot=`3Puf1tf-]Ӂ(8 x]7]cπRmAd&^oG"񯀇CGM>2., \  .%+%^7@;P^% lMd;PVe~y{cLwld"*r/Ij#f1 ،1Ƙ\캸s9wnr6.'U!\j=EaZd '+lIlK ~K0KpNmL|_ of$Rii1Ƙ ɮ8jw@\)cBOXLIsiYi1&C-)jH:;l[9+:c|>4f;A4cLğ1۱Nc1vtc1Ƙc1Ƥ%c1&,4c1igI1cIN: ),,'81]O#~:qT_" 8c1&`&ޚ(ݍ{Vt$&Z UapPbi8p}*¤xA0ө:TMnȯʸ!xzZM:U$20Uy@DF=tLciK%0 X[D?LlN~$B(x12d2.GΊ<'RJƑ7cU=G RĀ#2Ig8U\UÛ 2&c1$:| dRN&DĎ $/&c1& ct4hd*}dZ%CVt=Ydێ=c1dOkׄ:|볳+ɹs˖OOz4V{c.x&ɨr.=CU "2cLzCi 㤌eSIСe;/_qkrc1Y;c X.#ZLJLc1Ƙliq'ˁa hYi1Ƙ V(ph-*Z]U-O?񿮙= ~ n0mc#c1&nxo7Jq6Fse֓۸|FVi1ƘG L!XWZ|K:1Qӎg 0 8w{Pkh.< iYi1Ƙ<880|N%{:`&Vc1A3Zx`\ ecG6z|,f0vGiv%cɤ'ix )6d%ctc1Ƙc1Ƥ%c1&,4c1igI1cI;K:1cLYi1Ƙ{9F(8LYi1ƘLzZF#'iwyvNby?+lUe⢑ΤtLTͬߪ:qv|e˖e8EݤSz:c1&,4c1igI1cI;K:1cLYi1cΒNc1vɺLJ$?Z00f \nL!_;))n jڻݲ  m}-dG6ndrrOvkίҼ |+:8OC(<8(I ej>C+}!UmrL&Ӗm]m϶ػ/}񱕫:ܒkxKޞϦzP<9:r`~=m~LX:nǵsؾmޣmdKںm{ё\3㼥Blo6 &P`icآp y.. VJZ?6zc` P+*k ~6x؂+Ï5l7A_ne+{~ۦOl} :q'@q2/.پpێn4 ,:nnmxW6%S(~cH?@PZ42YpFki{%N>i*p\7wMI|.UZxqm;2v LmC .PS:a]N p"7=q;?Nŭ-_$v@2Ji2j $܅p.ʰӌ@X:1mo` p[spyύ6Ѷf%?vM`g9'J 2}qd{h?d㫭3 {<J~+Lil;v@gG;qoq;pׁL?[iVNcW} Jpu'lb(.CF큻沖[KIi GPZ^_y SO>6^co4ynBڲ/4;p pO%[M j۳=n<ԏ|(@ԶWsߩdIҙ uʶx#cÀuZ;5Ke7\e"'q羴tEF4yobђ4v2ng\+vwtt~!πq xA&B=Էanf>Ml_hdo1Qf K븩W۞-¶md6eBw^g[)j.j8o/m@;U>m(6?me'&ƕ$+ax8m+ \xiv(;~_iO%_=:jc'q%8{%KKkg煸 Ll} SqnkxWh*pgדRY=Sލ^ {OlJvHvlv-HUGm=t&y aNM/n_wp%v$s0\\qs_F{v{ $t>X:7V&\%[7%p0.'[xWoI܅FXޓzӶ=t&• W?7[[ץWm|wAۈ>n{6әB Cz}lch>۳A>.o.n\cpuZ;Z:] 2VoZ^ɾtܹ%%9TR_ɶ͉:.w7$ [x(_2Zƍʶ˛m֎:H[C~MF; Qͼn4i{%`p2w8"._/ZKlٖtP:سkZ6l|mϖJВ b_ȶV{4wL$:nޑe؆K:|ׂPܹ-[Ci<а֮mўsK6'-cD\\؁lY&^om"[Ɏ91XiΒt'-c54sG5$S:c>Ui1EA^7cLOZof8+4c1igI1cI;n1#Wi/xҠnz}4woi5tc1tAt,a!o'\%c1C+OuzMWo>y>&-Yҙ554`=}K^(V%Oy*U<Rv\nw.ci/z*J%GE=73N˒Ό1}.xx_7"*O@;>uݺ@:&҇{,0Lû{3֭{7XLrÇWlhAbZ3>.*H:)+har,:|P(~ҤTAV@UEj͚[l"¶F݄s`s@qO<~/BF͹AvܻtҜ8ׯo~ CN TYL DE$P/yy;'%??B~@SSsOC:j?UX^$:aҪQkvlp EEeU)D`lG|ؙ#@=n^AJJ5_Q×)5c|Bv(:[J/ϻB~|W}Z+tXDrf.^zGy2>})(T5~!??7??2. z* !Իa:UEHtiӲs|4yKׇ& :D]7_tr=wd L"z H(ٴomƍ7 !S&q#p-Rx]"N]_z@\_֯'>BDg&|U :84{j^UׇBAշ6-i3)XP/*gx0A``pxʪ/rg@Iw)+Ko 0XXvnuMTU[,EXۭ{" <q o~6=>ݡ @?./K+.>oU@WWvj/ ͝Wm $/;>6*'D|V^2 v"M5:;<3TV*qxG7t|DQY4ja[t`M{糰t(Gpܔwjrtf񡢢EDuXU~}ڊHdӑcU9  DUjj<  O}y8=xڌօ͎DnTiZu53cW8;BD8hequi<NVF[wAė . *:ʹWm{}^}6U 1PtfGEDλH8\^ : >QUY"_4<@SP \M P%i6U}X@wg2 [_Jw*кpRo*'}6@u*TjA!Q| *}_>euAYE pq\lj8x`geUB!W17E(fW~mI0 T`%Lϙߤ" 4}/Q)ZUz3/y/v.ÇW|Wp*rI'bʢEO ؼh685xX7tCo<0^Nev rc"o<d3FȻWzKjj>XPKd0!,ֈr5v\Hd<mAdEօR*)6^~/{7tb&_gTXxnPޕt7+{aH۱ؼ5T^tšcTfK: |xU=vܮ5u*&BRs\  <,䙴\7dHv<J^Q3 &=UDF]AύhxD$2m\&̊ŪV(Pz1}ԊR~$0X㡻}e3t&Uq W%yyޣk$sd௉ϗ+!@| ѣ3=T uy꛻t;j#uud *D%}Ԋ -w+:6=K:M ( kCCр'?Ds1(Ww^]a}'tDǴN&%Oӽw8P%Rn\ˬY(?dtXdvIɑQ]]C9 S|o_R]m#Eupx_ݺ{銪lhIȅ|?>C@?ẞ=k*K:M ^Q'F$U" ZTE!RʄIf{#܋0t`bjk_=#=1x:"- :\7dȹOlQգwn菧qtTzP<.cDt'zdӂ <>t(wbUiN$rSlF,unxVbeAǓڧ T.B9uu[o/-hw|cN h(Y/`}8K:M 1:7l@U~>ඍF*ȣ\ v|~͝D-͉D+N ߩr֭޸G2hlye.x\_~޺c4Eea=YY:+xL,4"O:Na:`dn݆4rʁ8l0{2вYbvQ4zf䊢ExLDNF>t<ٯ"/3U>p~ۑ+Dvު ſ{K %&w%J/D PysǬ%\QEQz hpx"){q4v\;? U}fޏ'>1DDkћ? :LZP|#zݧ*M~yAggIZ*c#XJU~~Xz5g2_" |r q`#4cv$rppϺm`-b~ , ‹D6&֭nБasxd׉r cぞ"R^U4zӛAR@5p5%C6Vs#  hVEEGRCd! R >='(,NtZn*c OUܐ}^ &38# 2 hp'NU8{:xMIIy|55c'D"?Tg+"X_tʾ,}(XLpPvW%*#o]Vd@2x"<͐;}Zrp&଼Vep8Ы%\vޫAǕNj ]9j $Ďb@-D & < ,@o<̇ٹYi:i#ecq'T1ϣj/]nI0 T`%LAK<\^t<٢pA'ϊhtAǓ /8YwDQxE,vˊJ;xqp}}DcQو?,iclˁJX |pi'fI"iC cT.] uuGUƂ1c&1j/ \<tXAOV߈rQMKAaæv UK/D*W1>ޕ|aQ+ T?<1euA' x >/,<c RaᲿe-Ducdȕ2n)L $0p ۜpz +ul>kۚtnoK"lG}`H3qs?%5{K1+())D 6KpEEL0&,|>9tHAq=fG"_̎DfKF".:F"e&g/8::ڂj]Us湸RKgo0oMz880\=%miznh`p(/.i<WZY VbjtN<XN[/{]V翸PQQ"q1n@.`agԼs8*`GPN^ :L!rCvkAǓyyA7b;z~()6"Y&A>t\eAF:JsV.•턻U \_%-`@^.%N<>5n7HyRZ`0ۗ| | +IL%l l޷ߘ$uYyA`L԰ XD{~ S}t灆\'9f!2Etn`vn}?9͏J1Hdㅪ ٕ΢{{^^E<",C}9r:ѓNE9J]nyvUmFwԣᒵ'kMx ܭn27a\[%6zm+.Wj _,+4yycpX_nݜAIf{#܋0t`6ho3AǓ)ȴo7+%).7@+byINU^z *tO_?& % y0\ NӾηp5zmn߽ŝk4Mv+'q@ CMby$b[IX`!p?J?u^eYiL " CU] xN?RWN"zM4rxm+BɈM^Y@yϳ^(JWp \cŸ=|>&ja>$ %O_kw9tӁ"Q:@cUd#裠K|?uvWzg ʥnccСuթq/ѠKAǁ^kܺ5:ҠA C!%0ޙk~~}ɢ2MAp ɺz V]%ƤIaa"1uQGjjn͒3EwGJ63{[,%)CvU[ xF4z\1HY,}4N$rߏtEUn7ktl;bȕǫ?1ͲӘ +,H"28*zT.F+W:lr."\ _"\G {ar΍ŕz xÆpY߆FD s:jPe@\Dmao:>╒=6v wƤʒNcUl:t*'*DUjj<3 d D8>. 5]X؋P5Adz"Uu*kj*O{ 󻝯3OO>5;xix;EЌ);ee邠2&,4&{H8\^h?"cU%"_5'J"kȡD{ 7Fn*.>W}BDNA^ȅT㫁cʜl\RRޣ_%@wy[n۲!V*h> nksMtJJʇ5*xBP8\Y TSq.pRv'Apb[óDaæv+o*V͉Fo(ؒY8j8!ݴbQ9˘bI19uIXq= RKjj* 6$&Lgɑׯ}-[V#tFuAVHUO/AǓ+ >dY: _[tl;7دzg+eLXiL0yy[qav^v%^Uu$Br y4R1;!'\TS3[~}jI+"?Sˁ,ϯgHXW4rASV|^dL6Ә6|xEƍ!.Uޒdpr5v :,8ۖ-/䓜E ^kCpfCTKĻ&à#Moq' "/C,4󐢢Dq cTϣ's8jX)<.g!VKD"VX,_p{OrZMMe7"M3Axutd JGy7^E::{p+5v%tRTƪʁH꒼<Ѭ)a\Sϗ9#Ӂxk. :^⯁r,6/[{px  =OA`7/'कk˘\eI1]e|mh4D'~^c1(p- ̾1gG"UhVvaUg߰avul7@Uuf,VA#^)s_^бXiLӿ>ݻ{x U]*U}-Y(?dY0xpċ_GX %Y\\v*gTt<ǁ^{I(3׮jr} j Q btEtӅ% :VT 6hPF !0q,`o{fkfG"g <.~>x Z}֍@ޏ* :gUf,vˊL1vVw)1-dtc*Oeփ<~U|j̎^LJkѼ;] <.P\гgkdEOd~;LD"S#'|߻rݺ36A^^8SqSчk#vD#c:K:1 1:8xXF H>5wXߍ w#z;#28D"G/ʴ 2{=`^ g#W.EA}= b1Ӫz=Iq"*OKo]@S@D6|.6ddMLIE:'=_>*$ў JEY4S= O ؼHm ԋ\uM ?+Kw8-z54˒NcLZw%J/D Pys6naS/\QEQ&+ W$L%~8c[@<~p.15|]<@m.U_.ޒ44hPUfTJ"iCT2>PeV,V8S%|9/.2Ƥ%Ƙ2~uu'z"HxUMw{,"xE"= ~nDf L'1cݺwӱ)**tP~;zuEZϏ_*^tƨʫ_RG,4fЊʘDCS*hIDAT7$g;dr\I;( ֭V+i(. U=f^'kM+ %1ȵ#E#W{XTu\|2mmmHD{ ""}#222(**b$&&SPPuHLL$''0kkkٲe lذs̎;(,,$)) v@VVdeeQ]]cbRRRXz5 "2h(t*=ʑ#G(++իx<jjj#77R*++ioogΝZoξ}q\v/ɓ ## &ܹs{s-ټy3OfѢE)"GnTN'<3$**h(//',,dFŋILLEzz:!!!c tX+V|rFڵkGD乴9H?L41 44[544PWWGJJJk.e˖uz驎&::ӧON̂ سgO9˅1gk:tgƷxIED@ll,ܹs 7ngu,YBqq1>n8zzHiSDdL646mٳc\ƞ~ĉe][*ݼyYf1nܸ^Ĝ9ssqqqo""/NNxxxc1݁ 44Ktݱ."t)t)t)t)t)t)t)t)tգ~""ϡ@70\ t""""""""""""""""""""""[k@nIENDB`Chart-2.4.6/doc/html/classChart_1_1Lines__inherit__graph.map0000644000175000017500000000027211666706743023272 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Direction__inherit__graph.map0000644000175000017500000000027411666706742024141 0ustar reinerreiner Chart-2.4.6/doc/html/classChart_1_1Points-members.html0000644000175000017500000004103412033071320022062 0ustar reinerreiner Member List

Chart::Points Member List

This is the complete list of members for Chart::Points, including all inherited members.
_brushStyles_of_rolesChart::Base
_calcTickInterval(scalar dataset_min, scalar dataset_max, scalar flag_fixed_min, scalar flag_fixed_max, scalar minTicks, scalar maxTicks)Chart::Base
_calcXTickInterval(scalar min, scalar max, scalar minF, scalar maxF, scalar minTicks, scalar maxTicks)Chart::Base
_check_dataChart::Base
_color_role_to_indexChart::Base
_color_spec_to_rgb(scalar role, scalar spec)Chart::Base
_copy_data(scalar extern_ref)Chart::Base
_countTicks(scalar min, scalar max, scalar interval)Chart::Base
_default_f_tickChart::Base
_drawChart::Base
_draw_bottom_legend()Chart::Base
_draw_dataChart::Points
_draw_grid_lines()Chart::Base
_draw_left_legend()Chart::Base
_draw_legend()Chart::Base
_draw_none_legend()Chart::Base
_draw_right_legend()Chart::Base
_draw_sub_title()Chart::Base
_draw_ticks()Chart::Base
_draw_titleChart::Base
_draw_top_legend()Chart::Base
_draw_x_grid_lines()Chart::Base
_draw_x_label()Chart::Base
_draw_x_number_ticks()Chart::Base
_draw_x_ticks()Chart::Base
_draw_y2_grid_lines()Chart::Base
_draw_y_grid_lines()Chart::Base
_draw_y_label()Chart::Base
_draw_y_ticks()Chart::Base
_find_x_range()Chart::Base
_find_x_scale()Chart::Base
_find_y_range()Chart::Base
_find_y_scale()Chart::Base
_grey_background()Chart::Base
_init(scalar x, scalar y)Chart::Base
_plot()Chart::Base
_prepare_brush(scalar color, scalar type, scalar role)Chart::Base
_round2Tick(scalar input, scalar interval, scalar roundUP)Chart::Base
_sepFP(scalar num)Chart::Base
_set_colorsChart::Base
_sort_data()Chart::Base
_xPixelInRealChart::Base
_xyRatioChart::Base
_yPixelInRealChart::Base
add_datafile(scalar filename, scalar format)Chart::Base
add_dataset(list data)Chart::Base
add_dataset(\list data)Chart::Base
add_pt(list data)Chart::Base
add_pt(\list data)Chart::Base
arccos(scalar a)Chart::Base
arcsin(scalar a)Chart::Base
cgi_jpeg(scalar dataref)Chart::Base
cgi_png(scalar dataref)Chart::Base
clear_data()Chart::Base
false(scalar b)Chart::Base
get_data()Chart::Base
getopts()Chart::Base
imagemap_dump()Chart::Base
jpeg(scalar file, scalar dataref)Chart::Base
make_gd(scalar dataref)Chart::Base
maximum(list array)Chart::Base
minimum(list array)Chart::Base
named_colorsChart::Base
new()Chart::Base
png(scalar file, scalar dataref)Chart::Base
scalar_jpeg(scalar dataref)Chart::Base
scalar_png(scalar dataref)Chart::Base
set(hash opts)Chart::Base
true(scalar b)Chart::Base
Chart-2.4.6/doc/html/Bars_8pm.html0000644000175000017500000000560312033071320016163 0ustar reinerreiner Chart/Bars.pm File Reference

Chart/Bars.pm File Reference

Implementation of Chart::Bars. More...

Classes

class  Chart::Bars
 Bars class provides all functions which are specific to vertical bars. More...

Detailed Description

Implementation of Chart::Bars.

written by

Author:
david bonner (dbonner@cs.bu.edu)

maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/doc/html/inherit__graph__2.md50000644000175000017500000000004011701657021017572 0ustar reinerreiner2c88450edd97fea81e58d290a36f16c3Chart-2.4.6/doc/html/classChart_1_1Direction__coll__graph.md50000644000175000017500000000004011701115622023304 0ustar reinerreiner759a03c45b9f70f0c873dbe9c4e47411Chart-2.4.6/doc/html/BrushStyles_8pm.html0000644000175000017500000000554212033071320017565 0ustar reinerreiner Chart/BrushStyles.pm File Reference

Chart/BrushStyles.pm File Reference

Chart::BrushStyles. More...

Classes

class  Chart::BrushStyles
 Define styles for Points and LinesPoints classes. More...

Detailed Description

Chart::BrushStyles.

written and maintained by the

Author:
Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de)
Date:
2012-10-03
Version:
2.4.6
Chart-2.4.6/MANIFEST0000644000175000017500000002442312033074620013251 0ustar reinerreinerChart.pod Chart/Bars.pm Chart/Base.pm Chart/BrushStyles.pm Chart/Composite.pm Chart/Constants.pm Chart/Direction.pm Chart/ErrorBars.pm Chart/HorizontalBars.pm Chart/Lines.pm Chart/LinesPoints.pm Chart/Mountain.pm Chart/Pareto.pm Chart/Pie.pm Chart/Points.pm Chart/Split.pm Chart/StackedBars.pm doc/html/annotated.html doc/html/Bars_8pm.html doc/html/Base_8pm.html doc/html/bc_s.png doc/html/BrushStyles_8pm.html doc/html/classChart_1_1Bars-members.html doc/html/classChart_1_1Bars.html doc/html/classChart_1_1Bars__coll__graph.map doc/html/classChart_1_1Bars__coll__graph.md5 doc/html/classChart_1_1Bars__coll__graph.png doc/html/classChart_1_1Bars__inherit__graph.map doc/html/classChart_1_1Bars__inherit__graph.md5 doc/html/classChart_1_1Bars__inherit__graph.png doc/html/classChart_1_1Base-members.html doc/html/classChart_1_1Base.html doc/html/classChart_1_1Base__coll__graph.map doc/html/classChart_1_1Base__coll__graph.md5 doc/html/classChart_1_1Base__coll__graph.png doc/html/classChart_1_1Base__inherit__graph.map doc/html/classChart_1_1Base__inherit__graph.md5 doc/html/classChart_1_1Base__inherit__graph.png doc/html/classChart_1_1BrushStyles-members.html doc/html/classChart_1_1BrushStyles.html doc/html/classChart_1_1BrushStyles__coll__graph.map doc/html/classChart_1_1BrushStyles__coll__graph.md5 doc/html/classChart_1_1BrushStyles__coll__graph.png doc/html/classChart_1_1BrushStyles__inherit__graph.map doc/html/classChart_1_1BrushStyles__inherit__graph.md5 doc/html/classChart_1_1BrushStyles__inherit__graph.png doc/html/classChart_1_1Composite-members.html doc/html/classChart_1_1Composite.html doc/html/classChart_1_1Composite__coll__graph.map doc/html/classChart_1_1Composite__coll__graph.md5 doc/html/classChart_1_1Composite__coll__graph.png doc/html/classChart_1_1Composite__inherit__graph.map doc/html/classChart_1_1Composite__inherit__graph.md5 doc/html/classChart_1_1Composite__inherit__graph.png doc/html/classChart_1_1Constants.html doc/html/classChart_1_1Direction-members.html doc/html/classChart_1_1Direction.html doc/html/classChart_1_1Direction__coll__graph.map doc/html/classChart_1_1Direction__coll__graph.md5 doc/html/classChart_1_1Direction__coll__graph.png doc/html/classChart_1_1Direction__inherit__graph.map doc/html/classChart_1_1Direction__inherit__graph.md5 doc/html/classChart_1_1Direction__inherit__graph.png doc/html/classChart_1_1ErrorBars-members.html doc/html/classChart_1_1ErrorBars.html doc/html/classChart_1_1ErrorBars__coll__graph.map doc/html/classChart_1_1ErrorBars__coll__graph.md5 doc/html/classChart_1_1ErrorBars__coll__graph.png doc/html/classChart_1_1ErrorBars__inherit__graph.map doc/html/classChart_1_1ErrorBars__inherit__graph.md5 doc/html/classChart_1_1ErrorBars__inherit__graph.png doc/html/classChart_1_1HorizontalBars-members.html doc/html/classChart_1_1HorizontalBars.html doc/html/classChart_1_1HorizontalBars__coll__graph.map doc/html/classChart_1_1HorizontalBars__coll__graph.md5 doc/html/classChart_1_1HorizontalBars__coll__graph.png doc/html/classChart_1_1HorizontalBars__inherit__graph.map doc/html/classChart_1_1HorizontalBars__inherit__graph.md5 doc/html/classChart_1_1HorizontalBars__inherit__graph.png doc/html/classChart_1_1Lines-members.html doc/html/classChart_1_1Lines.html doc/html/classChart_1_1Lines__coll__graph.map doc/html/classChart_1_1Lines__coll__graph.md5 doc/html/classChart_1_1Lines__coll__graph.png doc/html/classChart_1_1Lines__inherit__graph.map doc/html/classChart_1_1Lines__inherit__graph.md5 doc/html/classChart_1_1Lines__inherit__graph.png doc/html/classChart_1_1LinesPoints-members.html doc/html/classChart_1_1LinesPoints.html doc/html/classChart_1_1LinesPoints__coll__graph.map doc/html/classChart_1_1LinesPoints__coll__graph.md5 doc/html/classChart_1_1LinesPoints__coll__graph.png doc/html/classChart_1_1LinesPoints__inherit__graph.map doc/html/classChart_1_1LinesPoints__inherit__graph.md5 doc/html/classChart_1_1LinesPoints__inherit__graph.png doc/html/classChart_1_1Mountain-members.html doc/html/classChart_1_1Mountain.html doc/html/classChart_1_1Mountain__coll__graph.map doc/html/classChart_1_1Mountain__coll__graph.md5 doc/html/classChart_1_1Mountain__coll__graph.png doc/html/classChart_1_1Mountain__inherit__graph.map doc/html/classChart_1_1Mountain__inherit__graph.md5 doc/html/classChart_1_1Mountain__inherit__graph.png doc/html/classChart_1_1Pareto-members.html doc/html/classChart_1_1Pareto.html doc/html/classChart_1_1Pareto__coll__graph.map doc/html/classChart_1_1Pareto__coll__graph.md5 doc/html/classChart_1_1Pareto__coll__graph.png doc/html/classChart_1_1Pareto__inherit__graph.map doc/html/classChart_1_1Pareto__inherit__graph.md5 doc/html/classChart_1_1Pareto__inherit__graph.png doc/html/classChart_1_1Pie-members.html doc/html/classChart_1_1Pie.html doc/html/classChart_1_1Pie__coll__graph.map doc/html/classChart_1_1Pie__coll__graph.md5 doc/html/classChart_1_1Pie__coll__graph.png doc/html/classChart_1_1Pie__inherit__graph.map doc/html/classChart_1_1Pie__inherit__graph.md5 doc/html/classChart_1_1Pie__inherit__graph.png doc/html/classChart_1_1Points-members.html doc/html/classChart_1_1Points.html doc/html/classChart_1_1Points__coll__graph.map doc/html/classChart_1_1Points__coll__graph.md5 doc/html/classChart_1_1Points__coll__graph.png doc/html/classChart_1_1Points__inherit__graph.map doc/html/classChart_1_1Points__inherit__graph.md5 doc/html/classChart_1_1Points__inherit__graph.png doc/html/classChart_1_1Split-members.html doc/html/classChart_1_1Split.html doc/html/classChart_1_1Split__coll__graph.map doc/html/classChart_1_1Split__coll__graph.md5 doc/html/classChart_1_1Split__coll__graph.png doc/html/classChart_1_1Split__inherit__graph.map doc/html/classChart_1_1Split__inherit__graph.md5 doc/html/classChart_1_1Split__inherit__graph.png doc/html/classChart_1_1StackedBars-members.html doc/html/classChart_1_1StackedBars.html doc/html/classChart_1_1StackedBars__coll__graph.map doc/html/classChart_1_1StackedBars__coll__graph.md5 doc/html/classChart_1_1StackedBars__coll__graph.png doc/html/classChart_1_1StackedBars__inherit__graph.map doc/html/classChart_1_1StackedBars__inherit__graph.md5 doc/html/classChart_1_1StackedBars__inherit__graph.png doc/html/classes.html doc/html/closed.png doc/html/Composite_8pm.html doc/html/Constants_8pm.html doc/html/Direction_8pm.html doc/html/doxygen.css doc/html/doxygen.png doc/html/ErrorBars_8pm.html doc/html/files.html doc/html/ftv2blank.png doc/html/ftv2doc.png doc/html/ftv2folderclosed.png doc/html/ftv2folderopen.png doc/html/ftv2lastnode.png doc/html/ftv2link.png doc/html/ftv2mlastnode.png doc/html/ftv2mnode.png doc/html/ftv2node.png doc/html/ftv2plastnode.png doc/html/ftv2pnode.png doc/html/ftv2vertline.png doc/html/functions.html doc/html/functions_func.html doc/html/functions_vars.html doc/html/graph_legend.dot doc/html/graph_legend.html doc/html/graph_legend.md5 doc/html/graph_legend.png doc/html/hierarchy.html doc/html/HorizontalBars_8pm.html doc/html/index.html doc/html/inherit__graph__0.map doc/html/inherit__graph__0.md5 doc/html/inherit__graph__0.png doc/html/inherit__graph__1.map doc/html/inherit__graph__1.md5 doc/html/inherit__graph__1.png doc/html/inherit__graph__2.map doc/html/inherit__graph__2.md5 doc/html/inherit__graph__2.png doc/html/inherits.html doc/html/Lines_8pm.html doc/html/LinesPoints_8pm.html doc/html/main.html doc/html/Mountain_8pm.html doc/html/nav_f.png doc/html/nav_h.png doc/html/open.png doc/html/pages.html doc/html/Pareto_8pm.html doc/html/Pie_8pm.html doc/html/Points_8pm.html doc/html/Split_8pm.html doc/html/StackedBars_8pm.html doc/html/tab_a.png doc/html/tab_b.gif doc/html/tab_b.png doc/html/tab_h.png doc/html/tab_l.gif doc/html/tab_r.gif doc/html/tab_s.png doc/html/tabs.css doc/html/todo.html doc/html/tree.html doc/LaTeX/Appendix.tex doc/LaTeX/AppendixRGB.tex doc/LaTeX/Aufbau.png doc/LaTeX/Aufbau1.png doc/LaTeX/Bars.tex doc/LaTeX/bars.tex doc/LaTeX/base.tex doc/LaTeX/Base.tex doc/LaTeX/brushstyles.png doc/LaTeX/composite.png doc/LaTeX/composite.tex doc/LaTeX/Composite.tex doc/LaTeX/composite_f.png doc/LaTeX/d_bars.png doc/LaTeX/d_hbars4.png doc/LaTeX/d_lines2.png doc/LaTeX/d_linesp2.png doc/LaTeX/d_pareto2.png doc/LaTeX/d_pie3.png doc/LaTeX/definitions.tex doc/LaTeX/description.tex doc/LaTeX/direction.png doc/LaTeX/direction.tex doc/LaTeX/Direction.tex doc/LaTeX/Documentation.pdf doc/LaTeX/Documentation.tex doc/LaTeX/Elemente.png doc/LaTeX/error.png doc/LaTeX/error.tex doc/LaTeX/ErrorBars.tex doc/LaTeX/example.tex doc/LaTeX/hbars.tex doc/LaTeX/HorizontalBars.tex doc/LaTeX/Lines.tex doc/LaTeX/lines.tex doc/LaTeX/linespoints.tex doc/LaTeX/LinesPoints.tex doc/LaTeX/mountain-1.png doc/LaTeX/mountain.png doc/LaTeX/mountain.tex doc/LaTeX/Mountain.tex doc/LaTeX/ort.png doc/LaTeX/pareto.tex doc/LaTeX/Pareto.tex doc/LaTeX/Pie.tex doc/LaTeX/pie.tex doc/LaTeX/points.png doc/LaTeX/points.tex doc/LaTeX/Points.tex doc/LaTeX/rgb.dat doc/LaTeX/rgb.tex doc/LaTeX/Split.tex doc/LaTeX/split.tex doc/LaTeX/stacked.tex doc/LaTeX/Stacked.tex doc/LaTeX/stackedbars.png doc/LaTeX/stunde.png Documentation.pdf Makefile.PL MANIFEST This list of files META.yml patterns/PATTERN0.GIF patterns/PATTERN0.PNG patterns/PATTERN1.GIF patterns/PATTERN1.PNG patterns/PATTERN2.GIF patterns/PATTERN2.PNG patterns/PATTERN3.GIF patterns/PATTERN3.PNG patterns/PATTERN4.GIF patterns/PATTERN4.PNG patterns/PATTERN5.GIF patterns/PATTERN5.PNG pm_to_blib README t/bars.t t/bars_10.t t/bars_2.t t/bars_3.t t/bars_4.t t/bars_5.t t/bars_6.t t/bars_7.t t/bars_8.t t/bars_9.t t/composite.t t/composite_1.t t/composite_2.t t/composite_3.t t/composite_4.t t/composite_5.t t/composite_6.t t/composite_7.t t/composite_f.t t/direction_1.t t/direction_2.t t/direction_3.t t/direction_4.t t/error_1.t t/error_2.t t/f_ticks.t t/f_ticks_1.t t/hbars_1.t t/hbars_2.t t/hbars_3.t t/hbars_4.t t/Humidity.t t/lines.t t/lines_1.t t/lines_2.t t/lines_3.t t/lines_4.t t/lines_5.t t/lines_6.t t/lines_7.t t/lines_8.t t/lines_9.t t/linespoints.t t/linespoints_1.t t/linespoints_2.t t/linespoints_3.t t/linespoints_4.t t/linespoints_5.t t/linespoints_6.t t/linespoints_7.t t/mapbars.t t/mapcomp.t t/Math_1_over_x.t t/mountain.t t/mountain_2.t t/mountain_3.t t/mountain_4.t t/pareto_1.t t/pareto_2.t t/pareto_3.t t/pie_1.t t/pie_10.t t/pie_11.t t/pie_2.t t/pie_3.t t/pie_4.t t/pie_5.t t/pie_6.t t/pie_7.t t/pie_8.t t/pie_9.t t/points.t t/points_100.t t/points_2.t t/points_3.t t/points_4.t t/points_5.t t/scalarImage.t t/split_1.t t/split_2.t t/stackedbars.t t/stackedbars_2.t t/stackedbars_3.t t/stackedbars_4.t TODO Chart-2.4.6/pm_to_blib0000644000175000017500000000000012033074611014132 0ustar reinerreinerChart-2.4.6/Chart/0000755000175000017500000000000012033074620013154 5ustar reinerreinerChart-2.4.6/Chart/Base.pm0000644000175000017500000044105412033071313014370 0ustar reinerreiner## @file # Implementation of Chart::Base # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 ## @mainpage Chart::Base # # Basic Class of Chart from which all the other classes are derived. ## @class Chart::Base # @brief Base class for Chart; all other classes derived from here # # Base class from which all other classes are derived. # This class provides all functions which are common for # all classes package Chart::Base; # Uses # GD # Carp # FileHandle use GD; use Carp; use FileHandle; use Chart::Constants; use GD::Image; $Chart::Base::VERSION = '2.4.6'; use vars qw(%named_colors); use strict; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @cmethod object new() # @return A new object. # # @brief # Standard normal constructor.\n # Calls # @see _init sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; bless $self, $class; $self->_init(@_); return $self; } ## @method int set(%opts) # Set all options # # @details # main method for customizing the chart, lets users # specify values for different parameters\n # The options are saved locally to be able to output them # via @see getopts() # # @param[in] %opts Hash of options to the Chart # @return ok or croak # sub set { my $self = shift; my %opts = @_; # basic error checking on the options, just warn 'em unless ( $#_ % 2 ) { carp "Whoops, some option to be set didn't have a value.\n", "You might want to look at that.\n"; } # set the options for ( keys %opts ) { $self->{$_} = $opts{$_}; $self->{saveopts}->{$_} = $opts{$_}; # if someone wants to change the grid_lines color, we should set all # the colors of the grid_lines if ( $_ =~ /^colors$/ ) { my %hash = %{ $opts{$_} }; foreach my $key ( sort keys %hash ) { if ( $key =~ /^grid_lines$/ ) { # ORIG: #$self->{'colors'}{'y_grid_lines'} = $hash{'grid_lines'}, # $self->{'colors'}{'x_grid_lines'} = $hash{'grid_lines'}, # $self->{'colors'}{'y2_grid_lines'} = $hash{'grid_lines'}; # # NEW!!!!!!!!!!!!!!!!!! if ( ref( $hash{'grid_lines'} ) eq 'ARRAY' ) { my @aLocal = ( $hash{'grid_lines'}[0], $hash{'grid_lines'}[1], $hash{'grid_lines'}[2] ); $self->{'colors'}{'y_grid_lines'} = [@aLocal]; $self->{'colors'}{'x_grid_lines'} = [@aLocal]; $self->{'colors'}{'y2_grid_lines'} = [@aLocal]; } elsif ( ref( \$hash{'grid_lines'} ) eq 'SCALAR' ) { my $sLocal = $hash{'grid_lines'}; $self->{'colors'}{'y_grid_lines'} = $sLocal; $self->{'colors'}{'x_grid_lines'} = $sLocal; $self->{'colors'}{'y2_grid_lines'} = $sLocal; } else { carp "colors{'grid_lines'} is not SCALAR and not ARRAY\n"; } } } } } # now return return 1; } ## @method hash getopts() # @return hash of all set options so far # # @brief # get all options # # @details # @return set options as a hash sub getopts { my $self = shift; my %opts = (); foreach ( keys %{ $self->{saveopts} } ) { $opts{$_} = $self->{saveopts}; } return %opts; } ## @method int add_pt(@data) # Graph API\n # Add one dataset (as a list) to the dataref # # @param @data Dataset to add ## @method add_pt(\@data) # Graph API\n # Add one dataset (as a reference to a list) to the dataref # via #
# for ( 0 .. $#data )
# {
#    push @{ $self->{'dataref'}->[$_] }, $data[$_];
# }
# 
# # @param \@data Dataset to add # sub add_pt { my $self = shift; my @data = (); if ( ( ref $_[0] ) =~ /^ARRAY/ ) { my $rdata = shift; @data = @$rdata if defined @$rdata; } elsif ( ( ref \$_[0] ) =~ /^SCALAR/ ) { if ( defined $_[0] ) { @data = @_; } } else { croak "Not an array or reference to array"; } # error check the data (carp, don't croak) if ( $self->{'dataref'} && ( $#{ $self->{'dataref'} } != $#data ) ) { carp "New point to be added has an incorrect number of data sets"; return 0; } # copy it into the dataref for ( 0 .. $#data ) { push @{ $self->{'dataref'}->[$_] }, $data[$_]; } # now return return 1; } ## @method int add_dataset(@data) # Graph API\n # Add many datasets (implemented as a list) # to the dataref, # # @param @data Dataset (list) to add ## @method int add_dataset(\@data) # Graph API\n # Add many datasets (implemented as a references to alist) # to the dataref, # # @param \@data Dataset (reference to a list) to add sub add_dataset { my $self = shift; my @data = (); if ( ( ref $_[0] ) =~ /^ARRAY/ ) { my $rdata = shift; @data = @$rdata if defined @$rdata; } elsif ( ( ref \$_[0] ) =~ /^SCALAR/ ) { if ( defined $_[0] ) { @data = @_; } } else { croak "Not an array or reference to array"; return; } # error check the data (carp, don't croak) if ( $self->{'dataref'} && ( $#{ $self->{'dataref'}->[0] } != $#data ) ) { carp "New data set to be added has an incorrect number of points"; } # copy it into the dataref push @{ $self->{'dataref'} }, [@data]; # now return return 1; } ## @method int add_datafile($filename,$format) # Graph API\n # it's also possible to add a complete datafile\n # Uses # @see add_pt # @see add_dataset # # @param[in] $filename Name of file which contents is to be added # @param[in] $format 'pt' or 'set' to distiguish between function add_pt() in case of 'pt' # or function add_dataset() in case of 'set' sub add_datafile { my $self = shift; my $filename = shift; my $format = shift; my ( $File, @array ); # do some ugly checking to see if they gave me # a filehandle or a file name if ( ( ref \$filename ) eq 'SCALAR' ) { # they gave me a file name open( $File, $filename ) or croak "Can't open the datafile: $filename.\n"; } elsif ( ( ref \$filename ) =~ /^(?:REF|GLOB)$/ ) { # either a FileHandle object or a regular file handle $File = $filename; } else { carp "I'm not sure what kind of datafile you gave me,\n", "but it wasn't a filename or a filehandle.\n"; } #add the data while (<$File>) { @array = split; if ( $#array > -1 ) { if ( $format =~ m/^pt$/i ) { $self->add_pt(@array); } elsif ( $format =~ m/^set$/i ) { $self->add_dataset(@array); } else { carp "Tell me what kind of file you gave me: 'pt' or 'set'\n"; } } } close($File); } ## @method int clear_data() # Clear Graph API (by undefining 'dataref' # @return Status of function sub clear_data { my $self = shift; # undef the internal data reference $self->{'dataref'} = undef; # now return return 1; } ## @method arrayref get_data() # Get array of data of the last graph # @return Reference to data set of the last graph sub get_data { my $self = shift; my $ref = []; my ( $i, $j ); # give them a copy, not a reference into the object for $i ( 0 .. $#{ $self->{'dataref'} } ) { @{ $ref->[$i] } = @{ $self->{'dataref'}->[$i] } ## speedup, compared to... # for $j (0..$#{$self->{'dataref'}->[$i]}) { # $ref->[$i][$j] = $self->{'dataref'}->[$i][$j]; # } } # return it return $ref; } ## @method int png($file, $dataref) # Produce the graph of options set in png format. # # called after the options are set, this method # invokes all my private methods to actually # draw the chart and plot the data # @see _set_colors # @see _copy_data # @see _check_data # @see _draw # @param[in] $file Name of file to write graph to # @param[in] $dataref Reference to external data space # @return Status of the plot sub png { my $self = shift; my $file = shift; my $dataref = shift; my $fh; # do some ugly checking to see if they gave me # a filehandle or a file name if ( ( ref \$file ) eq 'SCALAR' ) { # they gave me a file name # Try to delete an existing file if ( -f $file ) { my $number_deleted_files = unlink $file; if ( $number_deleted_files != 1 ) { croak "Error: File \"$file\" did already exist, but it failed to delete it"; } } $fh = FileHandle->new(">$file"); if ( !defined $fh ) { croak "Error: File \"$file\" could not be created!\n"; } } elsif ( ( ref \$file ) =~ /^(?:REF|GLOB)$/ ) { # either a FileHandle object or a regular file handle $fh = $file; } else { croak "I'm not sure what you gave me to write this png to,\n", "but it wasn't a filename or a filehandle.\n"; } # allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data(); # pass off the real work to the appropriate subs $self->_draw(); # now write it to the file handle, and don't forget # to be nice to the poor ppl using nt binmode $fh; print $fh $self->{'gd_obj'}->png(); # now exit return 1; } ## @method int cgi_png($dataref) # Produce the graph of options set in png format to be directly # written for CGI. # # called after the options are set, this method # invokes all my private methods to actually # draw the chart and plot the data # @param $dataref # @return Status of the plot sub cgi_png { my $self = shift; my $dataref = shift; # allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data(); # pass off the real work to the appropriate subs $self->_draw(); # print the header (ripped the crlf octal from the CGI module) if ( $self->true( $self->{no_cache} ) ) { print "Content-type: image/png\015\012Pragma: no-cache\015\012\015\012"; } else { print "Content-type: image/png\015\012\015\012"; } # now print the png, and binmode it first so Windows-XX likes us binmode STDOUT; print STDOUT $self->{'gd_obj'}->png(); # now exit return 1; } ## @method int scalar_png($dataref) # Produce the graph of options set in PNG format to be directly returned # # called after the options are set, this method # invokes all my private methods to actually # draw the chart and return the image to the caller # # @param $dataref # @return returns the png image as a scalar value, so that # the programmer-user can do whatever the heck # s/he wants to with it sub scalar_png { my $self = shift; my $dataref = shift; #allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data(); # pass off the real work to the appropriate subs $self->_draw(); # returns the png image as a scalar value, so that # the programmer/user can do whatever the she/he wants to with it return $self->{'gd_obj'}->png(); } ## @method int jpeg($file,$dataref) # Produce the graph of options set in JPG format to be directly plotted.\n # # Called after the options are set, this method # invokes all my private methods to actually # draw the chart and plot the data. # The output has the jpeg format in opposite to png format produced by # @see png # # Uses the following private functions:\n # @see _set_colors # @see _copy_data # @see _check_data # @see _draw # # @param[in] $file Name of file to write graph to # @param[in] $dataref Reference to external data space # @return Status of the plot # sub jpeg { my $self = shift; my $file = shift; my $dataref = shift; my $fh; # do some ugly checking to see if they gave me # a filehandle or a file name if ( ( ref \$file ) eq 'SCALAR' ) { # they gave me a file name # Try to delete an existing file if ( -f $file ) { my $number_deleted_files = unlink $file; if ( $number_deleted_files != 1 ) { croak "Error: File \"$file\" did already exist, but it fails to delete it"; } } $fh = FileHandle->new(">$file"); if ( !defined $fh ) { croak "Error: File \"$file\" could not be created!\n"; } } elsif ( ( ref \$file ) =~ /^(?:REF|GLOB)$/ ) { # either a FileHandle object or a regular file handle $fh = $file; } else { croak "I'm not sure what you gave me to write this jpeg to,\n", "but it wasn't a filename or a filehandle.\n"; } # allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data; # pass off the real work to the appropriate subs $self->_draw(); # now write it to the file handle, and don't forget # to be nice to the poor ppl using Windows-XX binmode $fh; print $fh $self->{'gd_obj'}->jpeg( [100] ); # high quality need # now exit return 1; } ## @method int cgi_jpeg($dataref) # Produce the graph of options set in JPG format to be directly # for CGI. # # called after the options are set, this method # invokes all my private methods to actually # draw the chart and plot the data # @param $dataref # @return Status of the plot sub cgi_jpeg { my $self = shift; my $dataref = shift; # allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data(); # pass off the real work to the appropriate subs $self->_draw(); # print the header (ripped the crlf octal from the CGI module) if ( $self->true( $self->{no_cache} ) ) { print "Content-type: image/jpeg\015\012Pragma: no-cache\015\012\015\012"; } else { print "Content-type: image/jpeg\015\012\015\012"; } # now print the jpeg, and binmode it first so Windows-XX likes us binmode STDOUT; print STDOUT $self->{'gd_obj'}->jpeg( [100] ); # now exit return 1; } ## @method int scalar_jpeg($dataref) # Produce the graph of options set in JPG format to be directly returned # # called after the options are set, this method # invokes all my private methods to actually # draw the chart and return the image to the caller # # @param $dataref # @return returns the jpeg image as a scalar value, so that # the programmer-user can do whatever the heck # s/he wants to with it sub scalar_jpeg { my $self = shift; my $dataref = shift; # allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data(); # pass off the real work to the appropriate subs $self->_draw(); # returns the jpeg image as a scalar value, so that # the programmer-user can do whatever the heck # s/he wants to with it $self->{'gd_obj'}->jpeg( [100] ); } ## @method int make_gd($dataref) # Produce the graph of options set in GD format to be directly # # called after the options are set, this method # invokes all my private methods to actually # draw the chart and plot the data # @param $dataref # @return Status of the plot sub make_gd { my $self = shift; my $dataref = shift; # allocate the background color $self->_set_colors(); # make sure the object has its copy of the data $self->_copy_data($dataref); # do a sanity check on the data, and collect some basic facts # about the data $self->_check_data(); # pass off the real work to the appropriate subs $self->_draw(); # return the GD::Image object that we've drawn into return $self->{'gd_obj'}; } ## @method imagemap_dump() # get the information to turn the chart into an imagemap # # @return Reference to an array of the image sub imagemap_dump { my $self = shift; my $ref = []; my ( $i, $j ); # croak if they didn't ask me to remember the data, or if they're asking # for the data before I generate it unless ( ( $self->true( $self->{'imagemap'} ) ) && $self->{'imagemap_data'} ) { croak "You need to set the imagemap option to true, and then call the png method, before you can get the imagemap data"; } # can't just return a ref to my internal structures... for $i ( 0 .. $#{ $self->{'imagemap_data'} } ) { for $j ( 0 .. $#{ $self->{'imagemap_data'}->[$i] } ) { $ref->[$i][$j] = [ @{ $self->{'imagemap_data'}->[$i][$j] } ]; } } # return their copy return $ref; } ## @method minimum(@array) # determine minimum of an array of values # @param @array List of numerical values # @return Minimal value of list of values sub minimum { my $self = shift; my @array = @_; return undef if !@array; my $min = $array[0]; for ( my $iIndex = 0 ; $iIndex < scalar @array ; $iIndex++ ) { $min = $array[$iIndex] if ( $min > $array[$iIndex] ); } $min; } ## @method maximum(@array) # determine maximum of an array of values # @param @array List of numerical values # @return Maximal value of list of values sub maximum { my $self = shift; my @array = @_; return undef if !@array; my $max = $array[0]; for ( my $iIndex = 0 ; $iIndex < scalar @array ; $iIndex++ ) { $max = $array[$iIndex] if ( $max < $array[$iIndex] ); } $max; } ## @method arccos($a) # Function arccos(a) # @param $a Value # @return arccos(a) sub arccos { my $self = shift; my $a = shift; return ( atan2( sqrt( 1 - $a * $a ), $a ) ); } ## @method arcsin($a) # Function arcsin(a) # @param $a Value # @return arcsin(a) sub arcsin { my $self = shift; my $a = shift; return ( atan2( $a, sqrt( 1 - $a * $a ) ) ); } ## @method true($b) # determine true value of argument # @param[in] $b Bool value to check for true # @return 1 if argument is equal to TRUE, true, 1, t, T, and defined sub true { my $pkg = shift; my $arg = shift; if ( !defined($arg) ) { return 0; } if ( $arg eq 'true' || $arg eq 'TRUE' || $arg eq 't' || $arg eq 'T' || $arg eq '1' ) { return 1; } return 0; } ## @method false($b) # determine false value of argument # @param[in] $b Bool value to check for true # @return 1 if argument is equal to false, FALSE, 0, f, F or undefined sub false { my $pkg = shift; my $arg = shift; if ( !defined($arg) ) { return 1; } if ( $arg eq 'false' || $arg eq 'FALSE' || $arg eq 'f' || $arg eq 'F' || $arg eq '0' || $arg eq 'none' ) { return 1; } return 0; } #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private int _init($x,$y) # Initialize all default options here # @param[in] $x Width of the final image in pixels (Default: 400) # @param[in] $y Height of the final image in pixels (Default: 300) # sub _init { my $self = shift; my $x = shift || 400; # give them a 400x300 image my $y = shift || 300; # unless they say otherwise # get the gd object # Reference to new GD::Image $self->{'gd_obj'} = GD::Image->new( $x, $y ); # start keeping track of used space # actual current y min Value $self->{'curr_y_min'} = 0; $self->{'curr_y_max'} = $y; # maximum pixel in y direction (down) $self->{'curr_x_min'} = 0; $self->{'curr_x_max'} = $x; # maximum pixel in x direction (right) # use a 10 pixel border around the whole png $self->{'png_border'} = 10; # leave some space around the text fields $self->{'text_space'} = 2; # and leave some more space around the chart itself $self->{'graph_border'} = 10; # leave a bit of space inside the legend box $self->{'legend_space'} = 4; # set some default fonts $self->{'title_font'} = gdLargeFont, $self->{'sub_title_font'} = gdLargeFont, $self->{'legend_font'} = gdSmallFont, $self->{'label_font'} = gdMediumBoldFont, $self->{'tick_label_font'} = gdSmallFont; # put the legend on the bottom of the chart $self->{'legend'} = 'right'; # default to an empty list of labels $self->{'legend_labels'} = []; # use 20 pixel length example lines in the legend $self->{'legend_example_size'} = 20; # Set the maximum & minimum number of ticks to use. $self->{'y_ticks'} = 6, $self->{'min_y_ticks'} = 6, $self->{'max_y_ticks'} = 100, $self->{'x_number_ticks'} = 1, $self->{'min_x_ticks'} = 6, $self->{'max_x_ticks'} = 100; # make the ticks 4 pixels long $self->{'tick_len'} = 4; # no custom y tick labels $self->{'y_tick_labels'} = undef; # no patterns $self->{'patterns'} = undef; # let the lines in Chart::Lines be 6 pixels wide $self->{'brush_size'} = 6; # let the points in Chart::Points and Chart::LinesPoints be 18 pixels wide $self->{'pt_size'} = 18; # use the old non-spaced bars $self->{'spaced_bars'} = 'true'; # use the new grey background for the plots $self->{'grey_background'} = 'true'; # don't default to transparent $self->{'transparent'} = 'false'; # default to "normal" x_tick drawing $self->{'x_ticks'} = 'normal'; # we're not a component until Chart::Composite says we are $self->{'component'} = 'false'; # don't force the y-axes in a Composite chare to be the same $self->{'same_y_axes'} = 'false'; # plot rectangeles in the legend instead of lines in a composite chart $self->{'legend_example_height'} = 'false'; # don't force integer y-ticks $self->{'integer_ticks_only'} = 'false'; # don't forbid a false zero scale. $self->{'include_zero'} = 'false'; # don't waste time/memory by storing imagemap info unless they ask $self->{'imagemap'} = 'false'; # default for grid_lines is off $self->{grid_lines} = 'false', $self->{x_grid_lines} = 'false', $self->{y_grid_lines} = 'false', $self->{y2_grid_lines} = 'false'; # default for no_cache is false. (it breaks netscape 4.5) $self->{no_cache} = 'false'; # default value for skip_y_ticks for the labels $self->{skip_y_ticks} = 1; # default value for skip_int_ticks only for integer_ticks_only $self->{skip_int_ticks} = 1; # default value for precision $self->{precision} = 3; # default value for legend label values in pie charts $self->{legend_label_values} = 'value'; # default value for the labels in a pie chart $self->{label_values} = 'percent'; # default position for the y-axes $self->{y_axes} = 'left'; # copies of the current values at the x-ticks function $self->{temp_x_min} = 0; $self->{temp_x_max} = 0; $self->{temp_y_min} = 0; $self->{temp_y_max} = 0; # Instance for a sum $self->{sum} = 0; # Don't sort the data unless they ask $self->{'sort'} = 'false'; # The Interval for drawing the x-axes in the split module $self->{'interval'} = undef; # The start value for the split chart $self->{'start'} = undef; # How many ticks do i have to draw at the x-axes in one interval of a split-plot? $self->{'interval_ticks'} = 6; # Draw the Lines in the split-chart normal $self->{'scale'} = 1; # Make a x-y plot $self->{'xy_plot'} = 'false'; # min and max for xy plot $self->{'x_min_val'} = 1; $self->{'x_max_val'} = 1; # use the same error value in ErrorBars $self->{'same_error'} = 'false'; # Set the minimum and maximum number of circles to draw in a direction chart $self->{'min_circles'} = 4, $self->{'max_circles'} = 100; # set the style of a direction diagramm $self->{'point'} = 'true', $self->{'line'} = 'false', $self->{'arrow'} = 'false'; # The number of angel axes in a direction Chart $self->{'angle_interval'} = 30; # dont use different 'x_axes' in a direction Chart $self->{'pairs'} = 'false'; # polarplot for a direction Chart (not yet tested) $self->{'polar'} = 'false'; # guiding lines in a Pie Chart $self->{'legend_lines'} = 'false'; # Ring Chart instead of Pie $self->{'ring'} = 1; # width of ring; i.e. normal pie # stepline for Lines, LinesPoints $self->{'stepline'} = 'false'; $self->{'stepline_mode'} = 'end'; # begin, end # used function to transform x- and y-tick labels to strings $self->{f_x_tick} = \&_default_f_tick, $self->{f_y_tick} = \&_default_f_tick, $self->{f_z_tick} = \&_default_f_tick; # default color specs for various color roles. # Subclasses should extend as needed. my $d = 0; $self->{'colors_default_spec'} = { background => 'white', misc => 'black', text => 'black', y_label => 'black', y_label2 => 'black', grid_lines => 'black', grey_background => 'grey', ( map { 'dataset' . $d++ => $_ } qw (red green blue purple peach orange mauve olive pink light_purple light_blue plum yellow turquoise light_green brown HotPink PaleGreen1 DarkBlue BlueViolet orange2 chocolate1 LightGreen pink light_purple light_blue plum yellow turquoise light_green brown pink PaleGreen2 MediumPurple PeachPuff1 orange3 chocolate2 olive pink light_purple light_blue plum yellow turquoise light_green brown DarkOrange PaleGreen3 SlateBlue BlueViolet PeachPuff2 orange4 chocolate3 LightGreen pink light_purple light_blue plum yellow turquoise light_green brown snow1 honeydew3 SkyBlue1 cyan3 DarkOliveGreen1 IndianRed3 orange1 LightPink3 MediumPurple1 snow3 LavenderBlush1 SkyBlue3 DarkSlateGray1 DarkOliveGreen3 sienna1 orange3 PaleVioletRed1 MediumPurple3 seashell1 LavenderBlush3 LightSkyBlue1 DarkSlateGray3 khaki1 sienna3 DarkOrange1 PaleVioletRed3 thistle1 seashell3 MistyRose1 LightSkyBlue3 aquamarine1 khaki3 burlywood1 DarkOrange3 maroon1 thistle3 AntiqueWhite1 MistyRose3 SlateGray1 aquamarine3 LightGoldenrod1 burlywood3 coral1 maroon3 AntiqueWhite3 azure1 SlateGray3 DarkSeaGreen1 LightGoldenrod3 wheat1 coral3 VioletRed1 bisque1 azure3 LightSteelBlue1 DarkSeaGreen3 LightYellow1 wheat3 tomato1 VioletRed3 bisque3 SlateBlue1 LightSteelBlue3 SeaGreen1 LightYellow3 tan1 tomato3 magenta1 PeachPuff1 SlateBlue3 LightBlue1 SeaGreen3 yellow1 tan3 OrangeRed1 magenta3 PeachPuff3 RoyalBlue1 LightBlue3 PaleGreen1 yellow3 chocolate1 OrangeRed3 orchid1 NavajoWhite1 RoyalBlue3 LightCyan1 PaleGreen3 gold1 chocolate3 red1 orchid3 NavajoWhite3 blue1 LightCyan3 SpringGreen1 gold3 firebrick1 red3 plum1 LemonChiffon1 blue3 PaleTurquoise1 SpringGreen3 goldenrod1 firebrick3 DeepPink1 plum3 LemonChiffon3 DodgerBlue1 PaleTurquoise3 green1 goldenrod3 brown1 DeepPink3 MediumOrchid1 cornsilk1 DodgerBlue3 CadetBlue1 green3 DarkGoldenrod1 brown3 HotPink1 MediumOrchid3 cornsilk3 SteelBlue1 CadetBlue3 chartreuse1 DarkGoldenrod3 salmon1 HotPink3 DarkOrchid1 ivory1 SteelBlue3 turquoise1 chartreuse3 RosyBrown1 salmon3 pink1 DarkOrchid3 ivory3 DeepSkyBlue1 turquoise3 OliveDrab1 RosyBrown3 LightSalmon1 pink3 purple1 honeydew1 DeepSkyBlue3 cyan1 OliveDrab3 IndianRed1 LightSalmon3 LightPink1 purple3 honeydew2 DeepSkyBlue4 cyan2 OliveDrab4 IndianRed2 LightSalmon4 LightPink2 purple4 snow2 honeydew4 SkyBlue2 cyan4 DarkOliveGreen2 IndianRed4 orange2 LightPink4 MediumPurple2 snow4 LavenderBlush2 SkyBlue4 DarkSlateGray2 DarkOliveGreen4 sienna2 orange4 PaleVioletRed2 MediumPurple4 seashell2 LavenderBlush4 LightSkyBlue2 DarkSlateGray4 khaki2 sienna4 DarkOrange2 PaleVioletRed4 thistle2 seashell4 MistyRose2 LightSkyBlue4 aquamarine2 khaki4 burlywood2 DarkOrange4 maroon2 thistle4 AntiqueWhite2 MistyRose4 SlateGray2 aquamarine4 LightGoldenrod2 burlywood4 coral2 maroon4 AntiqueWhite4 azure2 SlateGray4 DarkSeaGreen2 LightGoldenrod4 wheat2 coral4 VioletRed2 bisque2 azure4 LightSteelBlue2 DarkSeaGreen4 LightYellow2 wheat4 tomato2 VioletRed4 bisque4 SlateBlue2 LightSteelBlue4 SeaGreen2 LightYellow4 tan2 tomato4 magenta2 PeachPuff2 SlateBlue4 LightBlue2 SeaGreen4 yellow2 tan4 OrangeRed2 magenta4 PeachPuff4 RoyalBlue2 LightBlue4 PaleGreen2 yellow4 chocolate2 OrangeRed4 orchid2 NavajoWhite2 RoyalBlue4 LightCyan2 PaleGreen4 gold2 chocolate4 red2 orchid4 NavajoWhite4 blue2 LightCyan4 SpringGreen2 gold4 firebrick2 red4 plum2 LemonChiffon2 blue4 PaleTurquoise2 SpringGreen4 goldenrod2 firebrick4 DeepPink2 plum4 LemonChiffon4 DodgerBlue2 PaleTurquoise4 green2 goldenrod4 brown2 DeepPink4 MediumOrchid2 cornsilk2 DodgerBlue4 CadetBlue2 green4 DarkGoldenrod2 brown4 HotPink2 MediumOrchid4 cornsilk4 SteelBlue2 CadetBlue4 chartreuse2 DarkGoldenrod4 salmon2 HotPink4 DarkOrchid2 ivory2 SteelBlue4 turquoise2 chartreuse4 RosyBrown2 salmon4 pink2 DarkOrchid4 ivory4 DeepSkyBlue2 turquoise4 OliveDrab2 RosyBrown4 LightSalmon2 pink4 purple2) ), }; # get default color specs for some color roles from alternate role. # Subclasses should extend as needed. $self->{'colors_default_role'} = { 'x_grid_lines' => 'grid_lines', 'y_grid_lines' => 'grid_lines', 'y2_grid_lines' => 'grid_lines', # should be added by Chart::Composite... }; # Define style to plot dots in Points and Lines $self->{'brushStyle'} = 'FilledCircle'; # and return return 1; } ## @fn private int _copy_data($extern_ref) # Copy external data via a reference to internal memory. # # Remember the external reference.\n # Therefore, this function can anly be called once! # @param $extern_ref Reference to external data space sub _copy_data { my $self = shift; my $extern_ref = shift; my ( $ref, $i ); # look to see if they used the other api if ( $self->{'dataref'} ) { # we've already got a copy, thanks return 1; } else { # get an array reference $ref = []; # loop through and copy the external data to internal memory for $i ( 0 .. $#{$extern_ref} ) { @{ $ref->[$i] } = @{ $extern_ref->[$i] }; ## Speedup compared to: # for $j (0..$#{$extern_ref->[$i]}) { # $ref->[$i][$j] = $extern_ref->[$i][$j]; # } } # put it in the object $self->{'dataref'} = $ref; return 1; } } ## @fn private int _check_data # Check the internal data to be displayed. # # Make sure the data isn't really weird # and collect some basic info about it\n # Not logical data is 'carp'ed.\n # @return status of check sub _check_data { my $self = shift; my $length = 0; # first make sure there's something there unless ( scalar( @{ $self->{'dataref'} } ) >= 2 ) { croak "Call me again when you have some data to chart"; } # make sure we don't end up dividing by zero if they ask for # just one y_tick if ( $self->{'y_ticks'} <= 1 ) { $self->{'y_ticks'} = 2; carp "The number of y_ticks displayed must be at least 2"; } # remember the number of datasets $self->{'num_datasets'} = $#{ $self->{'dataref'} }; # remember the number of points in the largest dataset $self->{'num_datapoints'} = 0; for ( 0 .. $self->{'num_datasets'} ) { if ( scalar( @{ $self->{'dataref'}[$_] } ) > $self->{'num_datapoints'} ) { $self->{'num_datapoints'} = scalar( @{ $self->{'dataref'}[$_] } ); } } # find good min and max y-values for the plot $self->_find_y_scale(); # find the longest x-tick label $length = 0; for ( @{ $self->{'dataref'}->[0] } ) { next if !defined($_); if ( length( $self->{f_x_tick}->($_) ) > $length ) { $length = length( $self->{f_x_tick}->($_) ); } } if ( $length <= 0 ) { $length = 1; } # make sure $length is positive and greater 0 # now store it in the object $self->{'x_tick_label_length'} = $length; # find x-scale, if a x-y plot is wanted # makes only sense for some charts if ( $self->true( $self->{'xy_plot'} ) && ( $self->isa('Chart::Lines') || $self->isa('Chart::Points') || $self->isa('Chart::LinesPoints') || $self->isa('Chart::Split') || $self->isa('Chart::ErrorBars') ) ) { $self->_find_x_scale; } return 1; } ## @fn private int _draw # Plot the chart to the gd object\n # Calls: # @see _draw_title # @see _draw_sub_title # @see _sort_data # @see _plot # # @return status sub _draw { my $self = shift; # leave the appropriate border on the png $self->{'curr_x_max'} -= $self->{'png_border'}; $self->{'curr_x_min'} += $self->{'png_border'}; $self->{'curr_y_max'} -= $self->{'png_border'}; $self->{'curr_y_min'} += $self->{'png_border'}; # draw in the title $self->_draw_title() if $self->{'title'}; # have to leave this here for backwards compatibility $self->_draw_sub_title() if $self->{'sub_title'}; # sort the data if they want to (mainly here to make sure # pareto charts get sorted) $self->_sort_data() if ( $self->true( $self->{'sort'} ) ); # start drawing the data (most methods in this will be # overridden by the derived classes) # include _draw_legend() in this to ensure that the legend # will be flush with the chart $self->_plot(); # and return return 1; } ## @var Hash named_colors RGB values of named colors # # see URL http://en.wikipedia.org/wiki/Web_colors#X11_color_names our %named_colors = ( 'white' => [ 255, 255, 255 ], 'black' => [ 0, 0, 0 ], 'red' => [ 200, 0, 0 ], 'green' => [ 0, 175, 0 ], 'blue' => [ 0, 0, 200 ], 'orange' => [ 250, 125, 0 ], 'orange2' => [ 238, 154, 0 ], 'orange3' => [ 205, 133, 0 ], 'orange4' => [ 139, 90, 0 ], 'yellow' => [ 225, 225, 0 ], 'purple' => [ 200, 0, 200 ], 'light_blue' => [ 0, 125, 250 ], 'light_green' => [ 125, 250, 0 ], 'light_purple' => [ 145, 0, 250 ], 'pink' => [ 250, 0, 125 ], 'peach' => [ 250, 125, 125 ], 'olive' => [ 125, 125, 0 ], 'plum' => [ 125, 0, 125 ], 'turquoise' => [ 0, 125, 125 ], 'mauve' => [ 200, 125, 125 ], 'brown' => [ 160, 80, 0 ], 'grey' => [ 225, 225, 225 ], 'HotPink' => [ 255, 105, 180 ], 'PaleGreen1' => [ 154, 255, 154 ], 'PaleGreen2' => [ 144, 238, 144 ], 'PaleGreen3' => [ 124, 205, 124 ], 'PaleGreen4' => [ 84, 138, 84 ], 'DarkBlue' => [ 0, 0, 139 ], 'BlueViolet' => [ 138, 43, 226 ], 'PeachPuff' => [ 255, 218, 185 ], 'PeachPuff1' => [ 255, 218, 185 ], 'PeachPuff2' => [ 238, 203, 173 ], 'PeachPuff3' => [ 205, 175, 149 ], 'PeachPuff4' => [ 139, 119, 101 ], 'chocolate1' => [ 255, 127, 36 ], 'chocolate2' => [ 238, 118, 33 ], 'chocolate3' => [ 205, 102, 29 ], 'chocolate4' => [ 139, 69, 19 ], 'LightGreen' => [ 144, 238, 144 ], 'lavender' => [ 230, 230, 250 ], 'MediumPurple' => [ 147, 112, 219 ], 'DarkOrange' => [ 255, 127, 0 ], 'DarkOrange2' => [ 238, 118, 0 ], 'DarkOrange3' => [ 205, 102, 0 ], 'DarkOrange4' => [ 139, 69, 0 ], 'SlateBlue' => [ 106, 90, 205 ], 'BlueViolet' => [ 138, 43, 226 ], 'RoyalBlue' => [ 65, 105, 225 ], 'AntiqueWhite' => [ 250, 235, 215 ], 'AntiqueWhite1' => [ 255, 239, 219 ], 'AntiqueWhite2' => [ 238, 223, 204 ], 'AntiqueWhite3' => [ 205, 192, 176 ], 'AntiqueWhite4' => [ 139, 131, 120 ], 'CadetBlue' => [ 95, 158, 160 ], 'CadetBlue1' => [ 152, 245, 255 ], 'CadetBlue2' => [ 142, 229, 238 ], 'CadetBlue3' => [ 122, 197, 205 ], 'CadetBlue4' => [ 83, 134, 139 ], 'DarkGoldenrod' => [ 184, 134, 11 ], 'DarkGoldenrod1' => [ 255, 185, 15 ], 'DarkGoldenrod2' => [ 238, 173, 14 ], 'DarkGoldenrod3' => [ 205, 149, 12 ], 'DarkGoldenrod4' => [ 139, 101, 8 ], 'DarkOliveGreen' => [ 85, 107, 47 ], 'DarkOliveGreen1' => [ 202, 255, 112 ], 'DarkOliveGreen2' => [ 188, 238, 104 ], 'DarkOliveGreen3' => [ 162, 205, 90 ], 'DarkOliveGreen4' => [ 110, 139, 61 ], 'DarkOrange1' => [ 255, 127, 0 ], 'DarkOrchid' => [ 153, 50, 204 ], 'DarkOrchid1' => [ 191, 62, 255 ], 'DarkOrchid2' => [ 178, 58, 238 ], 'DarkOrchid3' => [ 154, 50, 205 ], 'DarkOrchid4' => [ 104, 34, 139 ], 'DarkSeaGreen' => [ 143, 188, 143 ], 'DarkSeaGreen1' => [ 193, 255, 193 ], 'DarkSeaGreen2' => [ 180, 238, 180 ], 'DarkSeaGreen3' => [ 155, 205, 155 ], 'DarkSeaGreen4' => [ 105, 139, 105 ], 'DarkSlateGray' => [ 47, 79, 79 ], 'DarkSlateGray1' => [ 151, 255, 255 ], 'DarkSlateGray2' => [ 141, 238, 238 ], 'DarkSlateGray3' => [ 121, 205, 205 ], 'DarkSlateGray4' => [ 82, 139, 139 ], 'DeepPink' => [ 255, 20, 147 ], 'DeepPink1' => [ 255, 20, 147 ], 'DeepPink2' => [ 238, 18, 137 ], 'DeepPink3' => [ 205, 16, 118 ], 'DeepPink4' => [ 139, 10, 80 ], 'DeepSkyBlue' => [ 0, 191, 255 ], 'DeepSkyBlue1' => [ 0, 191, 255 ], 'DeepSkyBlue2' => [ 0, 178, 238 ], 'DeepSkyBlue3' => [ 0, 154, 205 ], 'DeepSkyBlue4' => [ 0, 104, 139 ], 'DodgerBlue' => [ 30, 144, 255 ], 'DodgerBlue1' => [ 30, 144, 255 ], 'DodgerBlue2' => [ 28, 134, 238 ], 'DodgerBlue3' => [ 24, 116, 205 ], 'DodgerBlue4' => [ 16, 78, 139 ], 'HotPink1' => [ 255, 110, 180 ], 'HotPink2' => [ 238, 106, 167 ], 'HotPink3' => [ 205, 96, 144 ], 'HotPink4' => [ 139, 58, 98 ], 'IndianRed' => [ 205, 92, 92 ], 'IndianRed1' => [ 255, 106, 106 ], 'IndianRed2' => [ 238, 99, 99 ], 'IndianRed3' => [ 205, 85, 85 ], 'IndianRed4' => [ 139, 58, 58 ], 'LavenderBlush' => [ 255, 240, 245 ], 'LavenderBlush1' => [ 255, 240, 245 ], 'LavenderBlush2' => [ 238, 224, 229 ], 'LavenderBlush3' => [ 205, 193, 197 ], 'LavenderBlush4' => [ 139, 131, 134 ], 'LemonChiffon' => [ 255, 250, 205 ], 'LemonChiffon1' => [ 255, 250, 205 ], 'LemonChiffon2' => [ 238, 233, 191 ], 'LemonChiffon3' => [ 205, 201, 165 ], 'LemonChiffon4' => [ 139, 137, 112 ], 'LightBlue' => [ 173, 216, 230 ], 'LightBlue1' => [ 191, 239, 255 ], 'LightBlue2' => [ 178, 223, 238 ], 'LightBlue3' => [ 154, 192, 205 ], 'LightBlue4' => [ 104, 131, 139 ], 'LightCyan' => [ 224, 255, 255 ], 'LightCyan1' => [ 224, 255, 255 ], 'LightCyan2' => [ 209, 238, 238 ], 'LightCyan3' => [ 180, 205, 205 ], 'LightCyan4' => [ 122, 139, 139 ], 'LightGoldenrod' => [ 238, 221, 130 ], 'LightGoldenrod1' => [ 255, 236, 139 ], 'LightGoldenrod2' => [ 238, 220, 130 ], 'LightGoldenrod3' => [ 205, 190, 112 ], 'LightGoldenrod4' => [ 139, 129, 76 ], 'LightPink' => [ 255, 182, 193 ], 'LightPink1' => [ 255, 174, 185 ], 'LightPink2' => [ 238, 162, 173 ], 'LightPink3' => [ 205, 140, 149 ], 'LightPink4' => [ 139, 95, 101 ], 'LightSalmon' => [ 255, 160, 122 ], 'LightSalmon1' => [ 255, 160, 122 ], 'LightSalmon2' => [ 238, 149, 114 ], 'LightSalmon3' => [ 205, 129, 98 ], 'LightSalmon4' => [ 139, 87, 66 ], 'LightSkyBlue' => [ 135, 206, 250 ], 'LightSkyBlue1' => [ 176, 226, 255 ], 'LightSkyBlue2' => [ 164, 211, 238 ], 'LightSkyBlue3' => [ 141, 182, 205 ], 'LightSkyBlue4' => [ 96, 123, 139 ], 'LightSteelBlue' => [ 176, 196, 222 ], 'LightSteelBlue1' => [ 202, 225, 255 ], 'LightSteelBlue2' => [ 188, 210, 238 ], 'LightSteelBlue3' => [ 162, 181, 205 ], 'LightSteelBlue4' => [ 110, 123, 139 ], 'LightYellow' => [ 255, 255, 224 ], 'LightYellow1' => [ 255, 255, 224 ], 'LightYellow2' => [ 238, 238, 209 ], 'LightYellow3' => [ 205, 205, 180 ], 'LightYellow4' => [ 139, 139, 122 ], 'MediumOrchid' => [ 186, 85, 211 ], 'MediumOrchid1' => [ 224, 102, 255 ], 'MediumOrchid2' => [ 209, 95, 238 ], 'MediumOrchid3' => [ 180, 82, 205 ], 'MediumOrchid4' => [ 122, 55, 139 ], 'MediumPurple1' => [ 171, 130, 255 ], 'MediumPurple2' => [ 159, 121, 238 ], 'MediumPurple3' => [ 137, 104, 205 ], 'MediumPurple4' => [ 93, 71, 139 ], 'MistyRose' => [ 255, 228, 225 ], 'MistyRose1' => [ 255, 228, 225 ], 'MistyRose2' => [ 238, 213, 210 ], 'MistyRose3' => [ 205, 183, 181 ], 'MistyRose4' => [ 139, 125, 123 ], 'NavajoWhite' => [ 255, 222, 173 ], 'NavajoWhite1' => [ 255, 222, 173 ], 'NavajoWhite2' => [ 238, 207, 161 ], 'NavajoWhite3' => [ 205, 179, 139 ], 'NavajoWhite4' => [ 139, 121, 94 ], 'OliveDrab' => [ 107, 142, 35 ], 'OliveDrab1' => [ 192, 255, 62 ], 'OliveDrab2' => [ 179, 238, 58 ], 'OliveDrab3' => [ 154, 205, 50 ], 'OliveDrab4' => [ 105, 139, 34 ], 'OrangeRed' => [ 255, 69, 0 ], 'OrangeRed1' => [ 255, 69, 0 ], 'OrangeRed2' => [ 238, 64, 0 ], 'OrangeRed3' => [ 205, 55, 0 ], 'OrangeRed4' => [ 139, 37, 0 ], 'PaleGreen' => [ 152, 251, 152 ], 'PaleTurquoise' => [ 175, 238, 238 ], 'PaleTurquoise1' => [ 187, 255, 255 ], 'PaleTurquoise2' => [ 174, 238, 238 ], 'PaleTurquoise3' => [ 150, 205, 205 ], 'PaleTurquoise4' => [ 102, 139, 139 ], 'PaleVioletRed' => [ 219, 112, 147 ], 'PaleVioletRed1' => [ 255, 130, 171 ], 'PaleVioletRed2' => [ 238, 121, 159 ], 'PaleVioletRed3' => [ 205, 104, 137 ], 'PaleVioletRed4' => [ 139, 71, 93 ], 'RosyBrown' => [ 188, 143, 143 ], 'RosyBrown1' => [ 255, 193, 193 ], 'RosyBrown2' => [ 238, 180, 180 ], 'RosyBrown3' => [ 205, 155, 155 ], 'RosyBrown4' => [ 139, 105, 105 ], 'RoyalBlue1' => [ 72, 118, 255 ], 'RoyalBlue2' => [ 67, 110, 238 ], 'RoyalBlue3' => [ 58, 95, 205 ], 'RoyalBlue4' => [ 39, 64, 139 ], 'SeaGreen' => [ 46, 139, 87 ], 'SeaGreen1' => [ 84, 255, 159 ], 'SeaGreen2' => [ 78, 238, 148 ], 'SeaGreen3' => [ 67, 205, 128 ], 'SeaGreen4' => [ 46, 139, 87 ], 'SkyBlue' => [ 135, 206, 235 ], 'SkyBlue1' => [ 135, 206, 255 ], 'SkyBlue2' => [ 126, 192, 238 ], 'SkyBlue3' => [ 108, 166, 205 ], 'SkyBlue4' => [ 74, 112, 139 ], 'SlateBlue1' => [ 131, 111, 255 ], 'SlateBlue2' => [ 122, 103, 238 ], 'SlateBlue3' => [ 105, 89, 205 ], 'SlateBlue4' => [ 71, 60, 139 ], 'SlateGray' => [ 112, 128, 144 ], 'SlateGray1' => [ 198, 226, 255 ], 'SlateGray2' => [ 185, 211, 238 ], 'SlateGray3' => [ 159, 182, 205 ], 'SlateGray4' => [ 108, 123, 139 ], 'SpringGreen' => [ 0, 255, 127 ], 'SpringGreen1' => [ 0, 255, 127 ], 'SpringGreen2' => [ 0, 238, 118 ], 'SpringGreen3' => [ 0, 205, 102 ], 'SpringGreen4' => [ 0, 139, 69 ], 'SteelBlue' => [ 70, 130, 180 ], 'SteelBlue1' => [ 99, 184, 255 ], 'SteelBlue2' => [ 92, 172, 238 ], 'SteelBlue3' => [ 79, 148, 205 ], 'SteelBlue4' => [ 54, 100, 139 ], 'VioletRed' => [ 208, 32, 144 ], 'VioletRed1' => [ 255, 62, 150 ], 'VioletRed2' => [ 238, 58, 140 ], 'VioletRed3' => [ 205, 50, 120 ], 'VioletRed4' => [ 139, 34, 82 ], 'aquamarine' => [ 127, 255, 212 ], 'aquamarine1' => [ 127, 255, 212 ], 'aquamarine2' => [ 118, 238, 198 ], 'aquamarine3' => [ 102, 205, 170 ], 'aquamarine4' => [ 69, 139, 116 ], 'azure' => [ 240, 255, 255 ], 'azure1' => [ 240, 255, 255 ], 'azure2' => [ 224, 238, 238 ], 'azure3' => [ 193, 205, 205 ], 'azure4' => [ 131, 139, 139 ], 'bisque' => [ 255, 228, 196 ], 'bisque1' => [ 255, 228, 196 ], 'bisque2' => [ 238, 213, 183 ], 'bisque3' => [ 205, 183, 158 ], 'bisque4' => [ 139, 125, 107 ], 'blue1' => [ 0, 0, 255 ], 'blue2' => [ 0, 0, 238 ], 'blue3' => [ 0, 0, 205 ], 'blue4' => [ 0, 0, 139 ], 'brown1' => [ 255, 64, 64 ], 'brown2' => [ 238, 59, 59 ], 'brown3' => [ 205, 51, 51 ], 'brown4' => [ 139, 35, 35 ], 'burlywood' => [ 222, 184, 135 ], 'burlywood1' => [ 255, 211, 155 ], 'burlywood2' => [ 238, 197, 145 ], 'burlywood3' => [ 205, 170, 125 ], 'burlywood4' => [ 139, 115, 85 ], 'chartreuse' => [ 127, 255, 0 ], 'chartreuse1' => [ 127, 255, 0 ], 'chartreuse2' => [ 118, 238, 0 ], 'chartreuse3' => [ 102, 205, 0 ], 'chartreuse4' => [ 69, 139, 0 ], 'chocolate' => [ 210, 105, 30 ], 'coral' => [ 255, 127, 80 ], 'coral1' => [ 255, 114, 86 ], 'coral2' => [ 238, 106, 80 ], 'coral3' => [ 205, 91, 69 ], 'coral4' => [ 139, 62, 47 ], 'cornsilk' => [ 255, 248, 220 ], 'cornsilk1' => [ 255, 248, 220 ], 'cornsilk2' => [ 238, 232, 205 ], 'cornsilk3' => [ 205, 200, 177 ], 'cornsilk4' => [ 139, 136, 120 ], 'cyan' => [ 0, 255, 255 ], 'cyan1' => [ 0, 255, 255 ], 'cyan2' => [ 0, 238, 238 ], 'cyan3' => [ 0, 205, 205 ], 'cyan4' => [ 0, 139, 139 ], 'firebrick' => [ 178, 34, 34 ], 'firebrick1' => [ 255, 48, 48 ], 'firebrick2' => [ 238, 44, 44 ], 'firebrick3' => [ 205, 38, 38 ], 'firebrick4' => [ 139, 26, 26 ], 'gold' => [ 255, 215, 0 ], 'gold1' => [ 255, 215, 0 ], 'gold2' => [ 238, 201, 0 ], 'gold3' => [ 205, 173, 0 ], 'gold4' => [ 139, 117, 0 ], 'goldenrod' => [ 218, 165, 32 ], 'goldenrod1' => [ 255, 193, 37 ], 'goldenrod2' => [ 238, 180, 34 ], 'goldenrod3' => [ 205, 155, 29 ], 'goldenrod4' => [ 139, 105, 20 ], 'gray' => [ 190, 190, 190 ], 'gray1' => [ 3, 3, 3 ], 'gray2' => [ 5, 5, 5 ], 'gray3' => [ 8, 8, 8 ], 'gray4' => [ 10, 10, 10 ], 'green1' => [ 0, 255, 0 ], 'green2' => [ 0, 238, 0 ], 'green3' => [ 0, 205, 0 ], 'green4' => [ 0, 139, 0 ], 'grey1' => [ 3, 3, 3 ], 'grey2' => [ 5, 5, 5 ], 'grey3' => [ 8, 8, 8 ], 'grey4' => [ 10, 10, 10 ], 'honeydew' => [ 240, 255, 240 ], 'honeydew1' => [ 240, 255, 240 ], 'honeydew2' => [ 224, 238, 224 ], 'honeydew3' => [ 193, 205, 193 ], 'honeydew4' => [ 131, 139, 131 ], 'ivory' => [ 255, 255, 240 ], 'ivory1' => [ 255, 255, 240 ], 'ivory2' => [ 238, 238, 224 ], 'ivory3' => [ 205, 205, 193 ], 'ivory4' => [ 139, 139, 131 ], 'khaki' => [ 240, 230, 140 ], 'khaki1' => [ 255, 246, 143 ], 'khaki2' => [ 238, 230, 133 ], 'khaki3' => [ 205, 198, 115 ], 'khaki4' => [ 139, 134, 78 ], 'magenta' => [ 255, 0, 255 ], 'magenta1' => [ 255, 0, 255 ], 'magenta2' => [ 238, 0, 238 ], 'magenta3' => [ 205, 0, 205 ], 'magenta4' => [ 139, 0, 139 ], 'maroon' => [ 176, 48, 96 ], 'maroon1' => [ 255, 52, 179 ], 'maroon2' => [ 238, 48, 167 ], 'maroon3' => [ 205, 41, 144 ], 'maroon4' => [ 139, 28, 98 ], 'orange1' => [ 255, 165, 0 ], 'orchid' => [ 218, 112, 214 ], 'orchid1' => [ 255, 131, 250 ], 'orchid2' => [ 238, 122, 233 ], 'orchid3' => [ 205, 105, 201 ], 'orchid4' => [ 139, 71, 137 ], 'pink1' => [ 255, 181, 197 ], 'pink2' => [ 238, 169, 184 ], 'pink3' => [ 205, 145, 158 ], 'pink4' => [ 139, 99, 108 ], 'plum1' => [ 255, 187, 255 ], 'plum2' => [ 238, 174, 238 ], 'plum3' => [ 205, 150, 205 ], 'plum4' => [ 139, 102, 139 ], 'purple1' => [ 155, 48, 255 ], 'purple2' => [ 145, 44, 238 ], 'purple3' => [ 125, 38, 205 ], 'purple4' => [ 85, 26, 139 ], 'red1' => [ 255, 0, 0 ], 'red2' => [ 238, 0, 0 ], 'red3' => [ 205, 0, 0 ], 'red4' => [ 139, 0, 0 ], 'salmon' => [ 250, 128, 114 ], 'salmon1' => [ 255, 140, 105 ], 'salmon2' => [ 238, 130, 98 ], 'salmon3' => [ 205, 112, 84 ], 'salmon4' => [ 139, 76, 57 ], 'seashell' => [ 255, 245, 238 ], 'seashell1' => [ 255, 245, 238 ], 'seashell2' => [ 238, 229, 222 ], 'seashell3' => [ 205, 197, 191 ], 'seashell4' => [ 139, 134, 130 ], 'sienna' => [ 160, 82, 45 ], 'sienna1' => [ 255, 130, 71 ], 'sienna2' => [ 238, 121, 66 ], 'sienna3' => [ 205, 104, 57 ], 'sienna4' => [ 139, 71, 38 ], 'snow' => [ 255, 250, 250 ], 'snow1' => [ 255, 250, 250 ], 'snow2' => [ 238, 233, 233 ], 'snow3' => [ 205, 201, 201 ], 'snow4' => [ 139, 137, 137 ], 'tan' => [ 210, 180, 140 ], 'tan1' => [ 255, 165, 79 ], 'tan2' => [ 238, 154, 73 ], 'tan3' => [ 205, 133, 63 ], 'tan4' => [ 139, 90, 43 ], 'thistle' => [ 216, 191, 216 ], 'thistle1' => [ 255, 225, 255 ], 'thistle2' => [ 238, 210, 238 ], 'thistle3' => [ 205, 181, 205 ], 'thistle4' => [ 139, 123, 139 ], 'tomato' => [ 255, 99, 71 ], 'tomato1' => [ 255, 99, 71 ], 'tomato2' => [ 238, 92, 66 ], 'tomato3' => [ 205, 79, 57 ], 'tomato4' => [ 139, 54, 38 ], 'turquoise1' => [ 0, 245, 255 ], 'turquoise2' => [ 0, 229, 238 ], 'turquoise3' => [ 0, 197, 205 ], 'turquoise4' => [ 0, 134, 139 ], 'wheat' => [ 245, 222, 179 ], 'wheat1' => [ 255, 231, 186 ], 'wheat2' => [ 238, 216, 174 ], 'wheat3' => [ 205, 186, 150 ], 'wheat4' => [ 139, 126, 102 ], 'yellow1' => [ 255, 255, 0 ], 'yellow2' => [ 238, 238, 0 ], 'yellow3' => [ 205, 205, 0 ], 'yellow4' => [ 139, 139, 0 ], ); ## @fn private int _set_colors # specify my colors # @return status sub _set_colors { my $self = shift; my $index = $self->_color_role_to_index('background'); # allocate GD color if ( $self->true( $self->{'transparent'} ) ) { $self->{'gd_obj'}->transparent($index); } # all other roles are initialized by calling $self->_color_role_to_index(ROLENAME); # and return return 1; } ## @fn private int _color_role_to_index # return a (list of) color index(es) corresponding to the (list of) role(s) # # @details wantarray # is a special keyword which returns a flag indicating # which context your subroutine has been called in. # It will return one of three values. # # @li true: If your subroutine has been called in list context # @li false: If your subroutine has been called in scalar context # @li undef: If your subroutine has been called in void context # # @return a (list of) color index(es) corresponding to the (list of) role(s) in \@_. # sub _color_role_to_index { my $self = shift; # Return a (list of) color index(es) corresponding to the (list of) role(s) in @_. my @result = map { my $role = $_; my $index = $self->{'color_table'}->{$role}; #print STDERR "Role = $_\n"; unless ( defined $index ) { my $spec = $self->{'colors'}->{$role} || $self->{'colors_default_spec'}->{$role} || $self->{'colors_default_spec'}->{ $self->{'colors_default_role'}->{$role} }; my @rgb = $self->_color_spec_to_rgb( $role, $spec ); #print STDERR "spec = $spec\n"; my $string = sprintf " RGB(%d,%d,%d)", map { $_ + 0 } @rgb; $index = $self->{'color_table'}->{$string}; unless ( defined $index ) { $index = $self->{'gd_obj'}->colorAllocate(@rgb); $self->{'color_table'}->{$string} = $index; } $self->{'color_table'}->{$role} = $index; } $index; } @_; #print STDERR "Result= ".$result[0]."\n"; ( wantarray && @_ > 1 ? @result : $result[0] ); } ## @fn private array _color_spec_to_rgb($role,$spec) # Return an array (list of) rgb values for spec # @param[in] $role name of a role # @param[in] $spec [r,g,b] or name # @return array of rgb values as a list (i.e., \@rgb) # sub _color_spec_to_rgb { my $self = shift; my $role = shift; # for error messages my $spec = shift; # [r,g,b] or name my @rgb; # result if ( ref($spec) eq 'ARRAY' ) { @rgb = @{$spec}; croak "Invalid color RGB array (" . join( ',', @rgb ) . ") for $role\n" unless @rgb == 3 && grep( !m/^\d+$/ || $_ > 255, @rgb ) == 0; } elsif ( !ref($spec) ) { croak "Unknown named color ($spec) for $role\n" unless $named_colors{$spec}; @rgb = @{ $named_colors{$spec} }; } else { croak "Unrecognized color for $role\n"; } @rgb; } ## @fn private int _brushStyles_of_roles # return a (list of) brushStyles corresponding to the (list of) role(s) # # @param \@list_of_roles List of roles # @return (list of) brushStyle(s) corresponding to the (list of) role(s) in \@_. # sub _brushStyles_of_roles { my $self = shift; my @roles = @_; my @results = (); foreach my $role (@roles) { my $brushStyle = $self->{'brushStyles'}->{$role}; if ( !defined($brushStyle) ) { $brushStyle = $self->{'brushStyle'}; } push( @results, $brushStyle ); } @results; } ## @fn private int _draw_title # draw the title for the chart # # The title was defined by the user in set('title' => ....)\n # The user may define some title lines by separating them via character '\\n';\n # The used font is taken from 'title_font';\n # The used color is calculated by function '_color_role_to_index' # based on 'title' or 'text'\n # @see _color_role_to_index # @return status sub _draw_title { my $self = shift; my $font = $self->{'title_font'}; my $color; my ( $h, $w, @lines, $x, $y ); #get the right color if ( defined $self->{'colors'}{'title'} ) { $color = $self->_color_role_to_index('title'); } else { $color = $self->_color_role_to_index('text'); } # make sure we're actually using a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The title font you specified isn\'t a GD Font object"; } # get the height and width of the font ( $h, $w ) = ( $font->height, $font->width ); # split the title into lines @lines = split( /\\n/, $self->{'title'} ); # write the first line $x = ( $self->{'curr_x_max'} - $self->{'curr_x_min'} ) / 2 + $self->{'curr_x_min'} - ( length( $lines[0] ) * $w ) / 2; $y = $self->{'curr_y_min'} + $self->{'text_space'}; # Tests for Version 2.5 #my $fontText = new GD::Text(); # ttf are found in /usr/lib/jvm/java-6-sun*/ # /var/share/fonts/truetype #$fontText->set_font('LiberationSans-Regular.ttf'); #$fontText->set_text('Some text',14); #if ( GD::Text->can_do_ttf() ) #{ carp "Can do ttf"; } #else #{ carp "No TTF"; } # ttf is in GD::Text! # #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $self->{'gd_obj'}->string( $font, $x, $y, $lines[0], $color ); # now loop through the rest of them # (the font is decreased in width and height by 1 if ( $w > 1 ) { $w--; } if ( $h > 1 ) { $h--; } for ( 1 .. $#lines ) { $self->{'curr_y_min'} += $self->{'text_space'} + $h; $x = ( $self->{'curr_x_max'} - $self->{'curr_x_min'} ) / 2 + $self->{'curr_x_min'} - ( length( $lines[$_] ) * $w ) / 2; $y = $self->{'curr_y_min'} + $self->{'text_space'}; $self->{'gd_obj'}->string( $font, $x, $y, $lines[$_], $color ); } # mark off that last space $self->{'curr_y_min'} += 2 * $self->{'text_space'} + $h; # and return return 1; } ## @fn private int _draw_sub_title() # draw the sub-title for the chart # @see _draw_title\n # _draw_sub_title() is more or less obsolete as _draw_title() does the same # by writing more than one line as the title. # Both use decreased width and height of the font by one. # @return status sub _draw_sub_title { my $self = shift; my $font = $self->{'sub_title_font'}; my $text = $self->{'sub_title'}; return 1 if length($text) == 0; # nothing to plot #get the right color my $color; if ( defined $self->{'colors'}{'title'} ) { $color = $self->_color_role_to_index('title'); } else { $color = $self->_color_role_to_index('text'); } my ( $h, $w, $x, $y ); # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); if ( $h > 1 && $w > 1 ) { $h--, $w-- } # figure out the placement $x = ( $self->{'curr_x_max'} - $self->{'curr_x_min'} ) / 2 + $self->{'curr_x_min'} - ( length($text) * $w ) / 2; $y = $self->{'curr_y_min'}; # now draw the subtitle $self->{'gd_obj'}->string( $font, $x, $y, $text, $color ); # Adapt curr_y_min $self->{'curr_y_min'} += $self->{'text_space'} + $h; # and return return 1; } ## @fn private int _sort_data() # sort the data nicely (mostly for the pareto charts and xy-plots) # @return status sub _sort_data { my $self = shift; my $data_ref = $self->{'dataref'}; my @data = @{ $self->{'dataref'} }; my @sort_index; #sort the data with slices @sort_index = sort { $data[0][$a] <=> $data[0][$b] } ( 0 .. scalar( @{ $data[1] } ) - 1 ); for ( 1 .. $#data ) { @{ $self->{'dataref'}->[$_] } = @{ $self->{'dataref'}->[$_] }[@sort_index]; } @{ $data_ref->[0] } = sort { $a <=> $b } @{ $data_ref->[0] }; #finally return return 1; } ## @fn private int _find_x_scale() # For a xy-plot do the same for the x values, as '_find_y_scale' does for the y values! # @see _find_y_scale # @return status sub _find_x_scale { my $self = shift; my @data = @{ $self->{'dataref'} }; my ( $i, $j ); my ( $d_min, $d_max ); my ( $p_min, $p_max, $f_min, $f_max ); my ( $tickInterval, $tickCount, $skip ); my @tickLabels; my $maxtickLabelLen = 0; #look, if we have numbers #see also if we only have integers for $i ( 0 .. ( $self->{'num_datasets'} ) ) { for $j ( 0 .. ( $self->{'num_datapoints'} - 1 ) ) { # the following regular Expression matches all possible numbers, including scientific numbers # iff data is defined if ( defined $data[$i][$j] and $data[$i][$j] !~ m/^[\+\-]?((\.\d+)|(\d+\.?\d*))([eE][+-]?\d+)?[fFdD]?$/ ) { croak "<$data[$i][$j]> You should give me numbers for drawing a xy plot!\n"; } } } #find the dataset min and max ( $d_min, $d_max ) = $self->_find_x_range(); # Force the inclusion of zero if the user has requested it. if ( $self->true( $self->{'include_zero'} ) ) { if ( ( $d_min * $d_max ) > 0 ) # If both are non zero and of the same sign. { if ( $d_min > 0 ) # If the whole scale is positive. { $d_min = 0; } else # The scale is entirely negative. { $d_max = 0; } } } # Calculate the width of the dataset. (possibly modified by the user) my $d_width = $d_max - $d_min; # If the width of the range is zero, forcebly widen it # (to avoid division by zero errors elsewhere in the code). if ( 0 == $d_width ) { $d_min--, $d_max++, $d_width = 2; } # Descale the range by converting the dataset width into # a floating point exponent & mantisa pair. my ( $rangeExponent, $rangeMantisa ) = $self->_sepFP($d_width); my $rangeMuliplier = 10**$rangeExponent; # Find what tick # to use & how many ticks to plot, # round the plot min & max to suatable round numbers. ( $tickInterval, $tickCount, $p_min, $p_max ) = $self->_calcXTickInterval( $d_min / $rangeMuliplier, $d_max / $rangeMuliplier, $f_min, $f_max, $self->{'min_x_ticks'}, $self->{'max_x_ticks'} ); # Restore the tickInterval etc to the correct scale $_ *= $rangeMuliplier foreach ( $tickInterval, $p_min, $p_max ); #get the precision for the labels my $precision = $self->{'precision'}; # Now sort out an array of tick labels. for ( my $labelNum = $p_min ; $labelNum < $p_max + $tickInterval / 2 ; $labelNum += $tickInterval ) { my $labelText; if ( defined $self->{f_y_tick} ) { # Is _default_f_tick function used? if ( $self->{f_y_tick} == \&_default_f_tick ) { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } else { $labelText = $self->{f_y_tick}->($labelNum); } } else { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } # Store the calculated data. $self->{'x_min_val'} = $p_min, $self->{'x_max_val'} = $p_max, $self->{'x_tick_labels'} = \@tickLabels, $self->{'x_tick_label_length'} = $maxtickLabelLen, $self->{'x_number_ticks'} = $tickCount; return 1; } ## @fn private int _find_y_scale() # find good values for the minimum and maximum y-value on the chart # @return status # # New version, re-written by David Pottage of Tao Group.\n # This code is *AS IS* and comes with *NO WARRANTY*\n # # This Sub calculates correct values for the following class local variables, # if they have not been set by the user. # # max_val, min_val: The maximum and minimum values for the y axis.\n # y_ticks: The number of ticks to plot on the y scale, including # the end points. e.g. If the scale runs from 0 to 50, # with ticks every 10, y_ticks will have the value of 6.\n # y_tick_labels: An array of strings, each is a label for the y axis.\n # y_tick_labels_length: The length to allow for B tick labels. (How long is # the longest?) sub _find_y_scale { my $self = shift; # Predeclare vars. my ( $d_min, $d_max ); # Dataset min & max. my ( $p_min, $p_max ); # Plot min & max. my ( $tickInterval, $tickCount, $skip ); my @tickLabels; # List of labels for each tick. my $maxtickLabelLen = 0; # The length of the longest tick label. my $prec_test = 0; # Boolean which indicate if precision < |rangeExponent| my $temp_rangeExponent; my $flag_all_integers = 1; # assume true # Find the dataset minimum and maximum. ( $d_min, $d_max, $flag_all_integers ) = $self->_find_y_range(); # Force the inclusion of zero if the user has requested it. if ( $self->true( $self->{'include_zero'} ) ) { #print "include_zero = true\n"; if ( ( $d_min * $d_max ) > 0 ) # If both are non zero and of the same sign. { if ( $d_min > 0 ) # If the whole scale is positive. { $d_min = 0; } else # The scale is entirely negative. { $d_max = 0; } } } if ( $self->true( $self->{'integer_ticks_only'} ) ) { # Allow the dataset range to be overidden by the user. # f_min/f_max are booleans which indicate that the min & max should not be modified. my $f_min = 0; if ( defined $self->{'min_val'} ) { $f_min = 1; } $d_min = $self->{'min_val'} if $f_min; my $f_max = 0; if ( defined $self->{'max_val'} ) { $f_max = 1; } $d_max = $self->{'max_val'} if $f_max; # Assert against defined min and max. if ( !defined $d_min || !defined $d_max ) { croak "No min_val or max_val is defined"; } # Assert against the min is larger than the max. if ( $d_min > $d_max ) { croak "The specified 'min_val' & 'max_val' values are reversed (min > max: $d_min>$d_max)"; } # The user asked for integer ticks, force the limits to integers. # & work out the range directly. #$p_min = $self->_round2Tick($d_min, 1, -1); #$p_max = $self->_round2Tick($d_max, 1, 1); $skip = $self->{skip_int_ticks}; $skip = 1 if $skip < 1; $p_min = $self->_round2Tick( $d_min, 1, -1 ); $p_max = $self->_round2Tick( $d_max, 1, 1 ); if ( ( $p_max - $p_min ) == 0 ) { $p_max++ if ( $f_max != 1 ); # p_max is not defined by the user $p_min-- if ( $f_min != 1 ); # p_min is not defined by the user $p_max++ if ( ( $p_max - $p_min ) == 0 ); } $tickInterval = $skip; $tickCount = ( $p_max - $p_min ) / $skip + 1; # Now sort out an array of tick labels. for ( my $labelNum = $p_min ; $labelNum < $p_max + $tickInterval / 3 ; $labelNum += $tickInterval ) { my $labelText; if ( defined $self->{f_y_tick} ) { # Is _default_f_tick function used? if ( $self->{f_y_tick} == \&_default_f_tick ) { $labelText = sprintf( "%d", $labelNum ); } else { $labelText = $self->{f_y_tick}->($labelNum); } } else { $labelText = sprintf( "%d", $labelNum ); } push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } } else { # Allow the dataset range to be overidden by the user. # f_min/f_max are booleans which indicate that the min & max should not be modified. my $f_min = 0; if ( defined $self->{'min_val'} ) { $f_min = 1; } $d_min = $self->{'min_val'} if $f_min; my $f_max = 0; if ( defined $self->{'max_val'} ) { $f_max = 1; } $d_max = $self->{'max_val'} if $f_max; # print "fmin $f_min fmax $f_max\n"; # print "dmin $d_min dmax $d_max\n"; # Assert against defined min and max. if ( !defined $d_min || !defined $d_max ) { croak "No min_val or max_val is defined"; } # Assert against the min is larger than the max. if ( $d_min > $d_max ) { croak "The the specified 'min_val' & 'max_val' values are reversed (min > max: $d_min>$d_max)"; } # Calculate the width of the dataset. (possibly modified by the user) my $d_width = $d_max - $d_min; # If the width of the range is zero, forcibly widen it # (to avoid division by zero errors elsewhere in the code). if ( $d_width == 0 ) { $d_min--, $d_max++, $d_width = 2; } # Descale the range by converting the dataset width into # a floating point exponent & mantisa pair. my ( $rangeExponent, $rangeMantisa ) = $self->_sepFP($d_width); my $rangeMuliplier = 10**$rangeExponent; # print "fmin $f_min fmax $f_max\n"; # print "dmin $d_min dmax $d_max\n"; # Find what tick # to use & how many ticks to plot, # round the plot min & max to suitable round numbers. ( $tickInterval, $tickCount, $p_min, $p_max ) = $self->_calcTickInterval( $d_min / $rangeMuliplier, $d_max / $rangeMuliplier, $f_min, $f_max, $self->{'min_y_ticks'}, $self->{'max_y_ticks'} ); # Restore the tickInterval etc to the correct scale $_ *= $rangeMuliplier foreach ( $tickInterval, $p_min, $p_max ); # Is precision < |rangeExponent|? if ( $rangeExponent < 0 ) { $temp_rangeExponent = -$rangeExponent; } else { $temp_rangeExponent = $rangeExponent; } # print "pmin $p_min pmax $p_max\n"; # print "range exponent $rangeExponent\n"; #get the precision for the labels my $precision = $self->{'precision'}; if ( $temp_rangeExponent != 0 && $rangeExponent < 0 && $temp_rangeExponent > $precision ) { $prec_test = 1; } # Now sort out an array of tick labels. for ( my $labelNum = $p_min ; $labelNum < $p_max + $tickInterval / 2 ; $labelNum += $tickInterval ) { my $labelText; if ( defined $self->{f_y_tick} ) { # Is _default_f_tick function used? if ( ( $self->{f_y_tick} == \&_default_f_tick ) && ( $prec_test == 0 ) ) { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } # If precision <|rangeExponent| print the labels whith exponents elsif ( ( $self->{f_y_tick} == \&_default_f_tick ) && ( $prec_test == 1 ) ) { $labelText = $self->{f_y_tick}->($labelNum); # print "precision $precision\n"; # print "temp range exponent $temp_rangeExponent\n"; # print "range exponent $rangeExponent\n"; # print "labelText $labelText\n"; } else { $labelText = $self->{f_y_tick}->($labelNum); } } else { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } # end for } # Store the calculated data. #### begin debugging output #if ( defined $self->{'y_ticks'} ) #{ # print "_find_y_scale: self->{'y_ticks'}=".$self->{'y_ticks'}."\n"; #} #else #{ # print "_find_y_scale: self->{'y_ticks'}= NOT DEFINED\n"; #} #if ( defined $self->{'min_val'} ) #{ # print "_find_y_scale: self->{'min_val'}=".$self->{'min_val'}."\n"; #} #else #{ # print "_find_y_scale: self->{'min_val'}=NOT DEFINED\n"; #} #if ( defined $self->{'max_val'} ) #{ # print "_find_y_scale: self->{'max_val'}=".$self->{'max_val'}."\n"; #} #else #{ # print "_find_y_scale: self->{'max_val'}= NOT DEFINED\n"; #} #### end debugging output $self->{'min_val'} = $p_min, $self->{'max_val'} = $p_max, $self->{'y_ticks'} = $tickCount, $self->{'y_tick_labels'} = \@tickLabels, $self->{'y_tick_label_length'} = $maxtickLabelLen; ################## #print statement is for debug only #print "_find_y_scale: min_val = $p_min, max_val=$p_max\n"; ################## # and return. return 1; } ## @fn private _calcTickInterval($dataset_min, $dataset_max, $flag_fixed_min, $flag_fixed_max, $minTicks, $maxTicks) # @brief # Calculate the Interval between ticks in y direction # # @details # Calculate the Interval between ticks in y direction # and compare the number of ticks to # the user's given values min_y_ticks, max_y_ticks. # # @param[in] $dataset_min Minimal value in y direction # @param[in] $dataset_max Maximal value in y direction # @param[in] $flag_fixed_min Indicator whether the dataset_min value is fixed # @param[in] $flag_fixed_max Indicator whether the dataset_max value is fixed # @param[in] $minTicks Minimal number of ticks wanted # @param[in] $maxTicks Maximal number of ticks wanted # @return Array of ($tickInterval, $tickCount, $pMin, $pMax) # sub _calcTickInterval { my $self = shift; my ( $dataset_min, $dataset_max, # The dataset min & max. $flag_fixed_min, $flag_fixed_max, # Indicates if those min/max are fixed. $minTicks, $maxTicks, # The minimum & maximum number of ticks. ) = @_; # print "calcTickInterval dataset_min $dataset_min dataset_max $dataset_max flag_fixed_min $flag_fixed_min flag_mixed_max $flag_fixed_max\n"; # Verify the supplied 'min_y_ticks' & 'max_y_ticks' are sensible. if ( $minTicks < 2 ) { #print STDERR "Chart::Base::_calcTickInterval : Incorrect value for 'min_y_ticks', too small (less than 2).\n"; $minTicks = 2; } if ( $maxTicks < 5 * $minTicks ) { #print STDERR "Chart::Base::_calcTickInterval : Incorrect value for 'max_y_ticks', too small (<5*minTicks).\n"; $maxTicks = 5 * $minTicks; } my $width = $dataset_max - $dataset_min; my @divisorList; for ( my $baseMul = 1 ; ; $baseMul *= 10 ) { TRY: foreach my $tryMul ( 1, 2, 5 ) { # Calc a fresh, smaller tick interval. my $divisor = $baseMul * $tryMul; # Count the number of ticks. my ( $tickCount, $pMin, $pMax ) = $self->_countTicks( $dataset_min, $dataset_max, 1 / $divisor ); # Look a the number of ticks. if ( $maxTicks < $tickCount ) { # If it is to high, Backtrack. $divisor = pop @divisorList; # just for security: if ( !defined($divisor) || $divisor == 0 ) { $divisor = 1; } ( $tickCount, $pMin, $pMax ) = $self->_countTicks( $dataset_min, $dataset_max, 1 / $divisor ); #print STDERR "\nChart::Base : Caution: Tick limit of $maxTicks exceeded. Backing of to an interval of ".1/$divisor." which plots $tickCount ticks\n"; return ( 1 / $divisor, $tickCount, $pMin, $pMax ); } elsif ( $minTicks > $tickCount ) { # If it is too low, try again. next TRY; } else { # Store the divisor for possible later backtracking. push @divisorList, $divisor; # if the min or max is fixed, check they will fit in the interval. next TRY if ( $flag_fixed_min && ( int( $dataset_min * $divisor ) != ( $dataset_min * $divisor ) ) ); next TRY if ( $flag_fixed_max && ( int( $dataset_max * $divisor ) != ( $dataset_max * $divisor ) ) ); # If everything passes the tests, return. return ( 1 / $divisor, $tickCount, $pMin, $pMax ); } } } die "can't happen!"; } ## @fn private int _calcXTickInterval($min,$max,$minF,$maxF,$minTicks,$maxTicks) # @brief # Calculate the Interval between ticks in x direction # # @details # Calculate the Interval between ticks in x direction # and compare the number of ticks to # the user's given values minTicks, maxTicks. # # @param[in] $min Minimal value of dataset in x direction # @param[in] $max Maximal value of dataset in x direction # @param[in] $minF Inddicator if those min value is fixed # @param[in] $maxF Inddicator if those max value is fixed # @param[in] $minTicks Minimal number of tick in x direction # @param[in] $maxTicks Maximal number of tick in x direction # @return $tickInterval, $tickCount, $pMin, $pMax sub _calcXTickInterval { my $self = shift; my ( $min, $max, # The dataset min & max. $minF, $maxF, # Indicates if those min/max are fixed. $minTicks, $maxTicks, # The minimum & maximum number of ticks. ) = @_; # Verify the supplied 'min_y_ticks' & 'max_y_ticks' are sensible. if ( $minTicks < 2 ) { #print STDERR "Chart::Base::_calcXTickInterval : Incorrect value for 'min_y_ticks', too small.\n"; $minTicks = 2; } if ( $maxTicks < 5 * $minTicks ) { #print STDERR "Chart::Base::_calcXTickInterval : Incorrect value for 'max_y_ticks', to small.\n"; $maxTicks = 5 * $minTicks; } my $width = $max - $min; my @divisorList; for ( my $baseMul = 1 ; ; $baseMul *= 10 ) { TRY: foreach my $tryMul ( 1, 2, 5 ) { # Calc a fresh, smaller tick interval. my $divisor = $baseMul * $tryMul; # Count the number of ticks. my ( $tickCount, $pMin, $pMax ) = $self->_countTicks( $min, $max, 1 / $divisor ); #print STDERR "Chart::Base::_calcXTickInterval : tickCount = $tickCount, maxTicks = $maxTicks\n"; # Look a the number of ticks. if ( $maxTicks < $tickCount ) { # If it is to high, Backtrack. $divisor = pop @divisorList; # just for security: if ( !defined($divisor) || $divisor == 0 ) { $divisor = 1; } ( $tickCount, $pMin, $pMax ) = $self->_countTicks( $min, $max, 1 / $divisor ); #print STDERR "\nChart::Base : Caution: Tick limit of $maxTicks exceeded. Backing of to an interval of ".1/$divisor." which plots $tickCount ticks\n"; return ( 1 / $divisor, $tickCount, $pMin, $pMax ); } elsif ( $minTicks > $tickCount ) { # If it is too low, try again. next TRY; } else { # Store the divisor for possible later backtracking. push @divisorList, $divisor; # if the min or max is fixed, check they will fit in the interval. next TRY if ( $minF && ( int( $min * $divisor ) != ( $min * $divisor ) ) ); next TRY if ( $maxF && ( int( $max * $divisor ) != ( $max * $divisor ) ) ); # If everything passes the tests, return. return ( 1 / $divisor, $tickCount, $pMin, $pMax ); } } } croak "can't happen!"; } ## @fn private int _countTicks($min,$max,$interval) # # @brief # Works out how many ticks would be displayed at that interval # # @param $min Minimal value # @param $max Maximal value # @param $interval value # @return ($tickCount, $minR, $maxR) # # @details # # e.g min=2, max=5, interval=1, result is 4 ticks.\n # written by David Pottage of Tao Group.\n # $minR = $self->_round2Tick( $min, $interval, -1);\n # $maxR = $self->_round2Tick( $max, $interval, 1);\n # $tickCount = ( $maxR/$interval ) - ( $minR/$interval ) +1; sub _countTicks { my $self = shift; my ( $min, $max, $interval ) = @_; my $minR = $self->_round2Tick( $min, $interval, -1 ); my $maxR = $self->_round2Tick( $max, $interval, 1 ); my $tickCount = ( $maxR / $interval ) - ( $minR / $interval ) + 1; return ( $tickCount, $minR, $maxR ); } ## @fn private int _round2Tick($input, $interval, $roundUP) # Rounds up or down to the next tick of interval size. # # $roundUP can be +1 or -1 to indicate if rounding should be up or down.\n # written by David Pottage of Tao Group. # # @param $input # @param $interval # @param $roundUP # @return retN*interval sub _round2Tick { my $self = shift; my ( $input, $interval, $roundUP ) = @_; return $input if $interval == 0; die unless 1 == $roundUP * $roundUP; my $intN = int( $input / $interval ); my $fracN = ( $input / $interval ) - $intN; my $retN = ( ( 0 == $fracN ) || ( ( $roundUP * $fracN ) < 0 ) ) ? $intN : $intN + $roundUP; return $retN * $interval; } ## @fn private array _sepFP($num) # @brief # Seperates a number into it's base 10 floating point exponent & mantisa. # @details # written by David Pottage of Tao Group. # # @param $num Floating point number # @return ( exponent, mantissa) sub _sepFP { my $self = shift; my ($num) = @_; return ( 0, 0 ) if $num == 0; my $sign = ( $num > 0 ) ? 1 : -1; $num *= $sign; my $exponent = int( log($num) / log(10) ); my $mantisa = $sign * ( $num / ( 10**$exponent ) ); return ( $exponent, $mantisa ); } ## @fn private array _find_y_range() # Find minimum and maximum value of y data sets. # # @return ( min, max, flag_all_integers ) sub _find_y_range { my $self = shift; my $data = $self->{'dataref'}; my $max = undef; my $min = undef; my $flag_all_integers = 1; # assume true for my $dataset ( @$data[ 1 .. $#$data ] ) { for my $datum (@$dataset) { if ( defined $datum ) { #croak "Missing data (dataset)"; if ($flag_all_integers) { # it's worth looking for integers if ( $datum !~ /^[\-\+]?\d+$/ ) { $flag_all_integers = 0; # No } } if ( $datum =~ /^[\-\+]?\s*[\d\.eE\-\+]+/ ) { if ( defined $max && $max =~ /^[\-\+]{0,}\s*[\d\.eE\-\+]+/ ) { if ( $datum > $max ) { $max = $datum; } elsif ( !defined $min ) { $min = $datum; } elsif ( $datum < $min ) { $min = $datum; } } else { $min = $max = $datum } } } } } # Return: ( $min, $max, $flag_all_integers ); } ## @fn private array _find_x_range() # Find minimum and maximum value of x data sets # @return ( min, max ) sub _find_x_range { my $self = shift; my $data = $self->{'dataref'}; my $max = undef; my $min = undef; for my $datum ( @{ $data->[0] } ) { if ( defined $datum && $datum =~ /^[\-\+]{0,1}\s*[\d\.eE\-\+]+/ ) { if ( defined $max && $max =~ /^[\-\+]{0,1}\s*[\d\.eE\-\+]+/ ) { if ( $datum > $max ) { $max = $datum } elsif ( $datum < $min ) { $min = $datum } } else { $min = $max = $datum } } } return ( $min, $max ); } ## @fn private int _plot() # main sub that controls all the plotting of the actual chart # @return status sub _plot { my $self = shift; # draw the legend first $self->_draw_legend(); # mark off the graph_border space $self->{'curr_x_min'} += $self->{'graph_border'}; $self->{'curr_x_max'} -= $self->{'graph_border'}; $self->{'curr_y_min'} += $self->{'graph_border'}; $self->{'curr_y_max'} -= $self->{'graph_border'}; # draw the x- and y-axis labels $self->_draw_x_label if $self->{'x_label'}; $self->_draw_y_label('left') if $self->{'y_label'}; $self->_draw_y_label('right') if $self->{'y_label2'}; # draw the ticks and tick labels $self->_draw_ticks(); # give the plot a grey background if they want it $self->_grey_background if ( $self->true( $self->{'grey_background'} ) ); #draw the ticks again if grey_background has ruined it in a Direction Chart. if ( $self->true( $self->{'grey_background'} ) && $self->isa("Chart::Direction") ) { $self->_draw_ticks; } $self->_draw_grid_lines if ( $self->true( $self->{'grid_lines'} ) ); $self->_draw_x_grid_lines if ( $self->true( $self->{'x_grid_lines'} ) ); $self->_draw_y_grid_lines if ( $self->true( $self->{'y_grid_lines'} ) ); $self->_draw_y2_grid_lines if ( $self->true( $self->{'y2_grid_lines'} ) ); # plot the data $self->_draw_data(); # and return return 1; } ## @fn private int _draw_legend() # let the user know what all the pretty colors mean.\n # The user define the position of the legend by setting option # 'legend' to 'top', 'bottom', 'left', 'right' or 'none'. # The legend is positioned at the defined place, respectively. # @return status sub _draw_legend { my $self = shift; my $length; # check to see if legend type is none.. if ( $self->{'legend'} =~ /^none$/ || length( $self->{'legend'} ) == 0 ) { return 1; } # check to see if they have as many labels as datasets, # warn them if not if ( ( $#{ $self->{'legend_labels'} } >= 0 ) && ( ( scalar( @{ $self->{'legend_labels'} } ) ) != $self->{'num_datasets'} ) ) { carp "The number of legend labels and datasets doesn\'t match"; } # init a field to store the length of the longest legend label unless ( $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = 0; } # fill in the legend labels, find the longest one for ( 1 .. $self->{'num_datasets'} ) { unless ( $self->{'legend_labels'}[ $_ - 1 ] ) { $self->{'legend_labels'}[ $_ - 1 ] = "Dataset $_"; } $length = length( $self->{'legend_labels'}[ $_ - 1 ] ); if ( $length > $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = $length; } } # different legend types if ( $self->{'legend'} eq 'bottom' ) { $self->_draw_bottom_legend; } elsif ( $self->{'legend'} eq 'right' ) { $self->_draw_right_legend; } elsif ( $self->{'legend'} eq 'left' ) { $self->_draw_left_legend; } elsif ( $self->{'legend'} eq 'top' ) { $self->_draw_top_legend; } elsif ( $self->{'legend'} eq 'none' || length( $self->{'legend'} ) == 0 ) { $self->_draw_none_legend; } else { carp "I can't put a legend there (at " . $self->{'legend'} . ")\n"; } # and return return 1; } ## @fn private int _draw_bottom_legend() # put the legend on the bottom of the chart # @return status sub _draw_bottom_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $y1, $x2, $x3, $y2 ); my ( $empty_width, $max_label_width, $cols, $rows, $color, $brush ); my ( $col_width, $row_height, $r, $c, $index, $x, $y, $w, $h, $axes_space ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # find the base x values $axes_space = ( $self->{'y_tick_label_length'} * $self->{'tick_label_font'}->width ) + $self->{'tick_len'} + ( 3 * $self->{'text_space'} ); $x1 = $self->{'curr_x_min'} + $self->{'graph_border'}; $x2 = $self->{'curr_x_max'} - $self->{'graph_border'}; if ( $self->{'y_axes'} =~ /^right$/i ) { $x2 -= $axes_space; } elsif ( $self->{'y_axes'} =~ /^both$/i ) { $x2 -= $axes_space; $x1 += $axes_space; } if ( $self->{'y_label'} ) { $x1 += $self->{'label_font'}->height + 2 * $self->{'text_space'}; } if ( $self->{'y_label2'} ) { $x2 -= $self->{'label_font'}->height + 2 * $self->{'text_space'}; } # figure out how wide the columns need to be, and how many we # can fit in the space available $empty_width = ( $x2 - $x1 ) - ( 2 * $self->{'legend_space'} ); $max_label_width = $self->{'max_legend_label'} * $w + ( 4 * $self->{'text_space'} ) + $self->{'legend_example_size'}; $cols = int( $empty_width / $max_label_width ); unless ($cols) { $cols = 1; } $col_width = $empty_width / $cols; # figure out how many rows we need, remember how tall they are $rows = int( $self->{'num_datasets'} / $cols ); unless ( ( $self->{'num_datasets'} % $cols ) == 0 ) { $rows++; } unless ($rows) { $rows = 1; } $row_height = $h + $self->{'text_space'}; # box the legend off $y1 = $self->{'curr_y_max'} - $self->{'text_space'} - ( $rows * $row_height ) - ( 2 * $self->{'legend_space'} ); $y2 = $self->{'curr_y_max'}; $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $self->_color_role_to_index('misc') ); $x1 += $self->{'legend_space'} + $self->{'text_space'}; $x2 -= $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; $y2 -= $self->{'legend_space'} + $self->{'text_space'}; # draw in the actual legend for $r ( 0 .. $rows - 1 ) { for $c ( 0 .. $cols - 1 ) { $index = ( $r * $cols ) + $c; # find the index in the label array if ( $labels[$index] ) { # get the color $color = $self->_color_role_to_index( 'dataset' . $index ); # get the x-y coordinate for the start of the example line $x = $x1 + ( $col_width * $c ); $y = $y1 + ( $row_height * $r ) + $h / 2; # now draw the example line $self->{'gd_obj'}->line( $x, $y, $x + $self->{'legend_example_size'}, $y, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', 'dataset' . $index ); $self->{'gd_obj'}->setBrush($brush); # draw the point $x3 = int( $x + $self->{'legend_example_size'} / 2 ); $self->{'gd_obj'}->line( $x3, $y, $x3, $y, gdBrushed ); # adjust the x-y coordinates for the start of the label $x += $self->{'legend_example_size'} + ( 2 * $self->{'text_space'} ); $y = $y1 + ( $row_height * $r ); # now draw the label $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color ); } } } # mark off the space used $self->{'curr_y_max'} -= $rows * $row_height + 2 * $self->{'text_space'} + 2 * $self->{'legend_space'}; # now return return 1; } ## @fn private int _draw_right_legend() # put the legend on the right of the chart # @return status sub _draw_right_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some starting x-y values $x1 = $self->{'curr_x_max'} - $width; $x2 = $self->{'curr_x_max'}; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datasets'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color my $c = $self->{'num_datasets'} - $_ - 1; # color of the datasets in the legend $color = $self->_color_role_to_index( 'dataset' . $_ ); # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # do the line first $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); # reset the brush for points my $offset = 0; ( $brush, $offset ) = $self->_prepare_brush( $color, 'point', 'dataset' . $_ ); $self->{'gd_obj'}->setBrush($brush); # draw the point $self->{'gd_obj'}->line( int( ( $x3 + $x2 ) / 2 ), $y2, int( ( $x3 + $x2 ) / 2 ), $y2, gdBrushed ); # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; # order of the datasets in the legend $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } # mark off the used space $self->{'curr_x_max'} -= $width; # and return return 1; } ## @fn private int _draw_top_legend() # put the legend on top of the chart # @return status sub _draw_top_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $y1, $x2, $x3, $y2, $empty_width, $max_label_width ); my ( $cols, $rows, $color, $brush ); my ( $col_width, $row_height, $r, $c, $index, $x, $y, $w, $h, $axes_space ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # find the base x values $axes_space = ( $self->{'y_tick_label_length'} * $self->{'tick_label_font'}->width ) + $self->{'tick_len'} + ( 3 * $self->{'text_space'} ); $x1 = $self->{'curr_x_min'} + $self->{'graph_border'}; $x2 = $self->{'curr_x_max'} - $self->{'graph_border'}; if ( $self->{'y_axes'} =~ /^right$/i ) { $x2 -= $axes_space; } elsif ( $self->{'y_axes'} =~ /^both$/i ) { $x2 -= $axes_space; $x1 += $axes_space; } # figure out how wide the columns can be, and how many will fit $empty_width = ( $x2 - $x1 ) - ( 2 * $self->{'legend_space'} ); $max_label_width = ( 4 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'}; $cols = int( $empty_width / $max_label_width ); unless ($cols) { $cols = 1; } $col_width = $empty_width / $cols; # figure out how many rows we need and remember how tall they are $rows = int( $self->{'num_datasets'} / $cols ); unless ( ( $self->{'num_datasets'} % $cols ) == 0 ) { $rows++; } unless ($rows) { $rows = 1; } $row_height = $h + $self->{'text_space'}; # box the legend off $y1 = $self->{'curr_y_min'}; $y2 = $self->{'curr_y_min'} + $self->{'text_space'} + ( $rows * $row_height ) + ( 2 * $self->{'legend_space'} ); $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $self->_color_role_to_index('misc') ); # leave some space inside the legend $x1 += $self->{'legend_space'} + $self->{'text_space'}; $x2 -= $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; $y2 -= $self->{'legend_space'} + $self->{'text_space'}; # draw in the actual legend for $r ( 0 .. $rows - 1 ) { for $c ( 0 .. $cols - 1 ) { $index = ( $r * $cols ) + $c; # find the index in the label array if ( $labels[$index] ) { # get the color $color = $self->_color_role_to_index( 'dataset' . $index ); # find the x-y coords $x = $x1 + ( $col_width * $c ); $y = $y1 + ( $row_height * $r ) + $h / 2; # draw the line first $self->{'gd_obj'}->line( $x, $y, $x + $self->{'legend_example_size'}, $y, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', 'dataset' . $index ); $self->{'gd_obj'}->setBrush($brush); # draw the point $x3 = int( $x + $self->{'legend_example_size'} / 2 ); $self->{'gd_obj'}->line( $x3, $y, $x3, $y, gdBrushed ); # now the label $x += $self->{'legend_example_size'} + ( 2 * $self->{'text_space'} ); $y -= $h / 2; $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color ); } } } # mark off the space used $self->{'curr_y_min'} += ( $rows * $row_height ) + $self->{'text_space'} + 2 * $self->{'legend_space'}; # now return return 1; } ## @fn private int _draw_left_legend() # put the legend on the left of the chart # @return status sub _draw_left_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some base x-y coordinates $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} + $width; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datasets'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color my $c = $self->{'num_datasets'} - $_ - 1; # color of the datasets in the legend $color = $self->_color_role_to_index( 'dataset' . $_ ); # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # do the line first $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', 'dataset' . $_ ); $self->{'gd_obj'}->setBrush($brush); # draw the point $self->{'gd_obj'}->line( int( ( $x3 + $x2 ) / 2 ), $y2, int( ( $x3 + $x2 ) / 2 ), $y2, gdBrushed ); # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; # order of the datasets in the legend $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } # mark off the used space $self->{'curr_x_min'} += $width; # and return return 1; } ## @fn private int _draw_none_legend() # no legend to draw.. # Just return in this case. This routine may be overwritten by # subclasses. # @return 1 sub _draw_none_legend { my $self = shift; my $status = 1; return $status; } ## @fn private int _draw_x_label() # draw the label for the x-axis # # Get font for labels\n # Get the color of x_label or text\n # Get size of font\n # and write x-Label # # @return status sub _draw_x_label { my $self = shift; my $label = $self->{'x_label'}; my $font = $self->{'label_font'}; my $color; my ( $h, $w, $x, $y ); #get the right color if ( defined $self->{'colors'}->{'x_label'} ) { $color = $self->_color_role_to_index('x_label'); } else { $color = $self->_color_role_to_index('text'); } # make sure it's a real GD Font object unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The x-axis label font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # make sure it goes in the right place $x = ( $self->{'curr_x_max'} - $self->{'curr_x_min'} ) / 2 + $self->{'curr_x_min'} - ( length($label) * $w ) / 2; $y = $self->{'curr_y_max'} - ( $self->{'text_space'} + $h ); # now write it $self->{'gd_obj'}->string( $font, $x, $y, $label, $color ); # mark the space written to as used $self->{'curr_y_max'} -= $h + 2 * $self->{'text_space'}; # and return return 1; } ## @fn private int _draw_y_label() # draw the label for the y-axis # @return status sub _draw_y_label { my $self = shift; my $side = shift; my $font = $self->{'label_font'}; my ( $label, $h, $w, $x, $y, $color ); # get the label if ( $side eq 'left' ) { $label = $self->{'y_label'}; $color = $self->_color_role_to_index('y_label'); } elsif ( $side eq 'right' ) { $label = $self->{'y_label2'}; $color = $self->_color_role_to_index('y_label2'); } # make sure it's a real GD Font object unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The x-axis label font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # make sure it goes in the right place if ( $side eq 'left' ) { $x = $self->{'curr_x_min'} + $self->{'text_space'}; } elsif ( $side eq 'right' ) { $x = $self->{'curr_x_max'} - $self->{'text_space'} - $h; } $y = ( $self->{'curr_y_max'} - $self->{'curr_y_min'} ) / 2 + $self->{'curr_y_min'} + ( length($label) * $w ) / 2; # write it $self->{'gd_obj'}->stringUp( $font, $x, $y, $label, $color ); # mark the space written to as used if ( $side eq 'left' ) { $self->{'curr_x_min'} += $h + 2 * $self->{'text_space'}; } elsif ( $side eq 'right' ) { $self->{'curr_x_max'} -= $h + 2 * $self->{'text_space'}; } # now return return 1; } ## @fn private int _draw_ticks() # draw the ticks and tick labels # @return status sub _draw_ticks { my $self = shift; #if the user wants an xy_plot, calculate the x-ticks too if ( $self->true( $self->{'xy_plot'} ) && ( $self->isa('Chart::Lines') || $self->isa('Chart::Points') || $self->isa('Chart::LinesPoints') || $self->isa('Chart::Split') || $self->isa('Chart::ErrorBars') ) ) { $self->_draw_x_number_ticks; } else { # draw the x ticks with strings $self->_draw_x_ticks; } # now the y ticks $self->_draw_y_ticks( $self->{'y_axes'} ); # then return return 1; } ## @fn private int _draw_x_number_ticks() # draw the ticks and tick labels # @return status sub _draw_x_number_ticks { my $self = shift; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my ( $h, $w, $x1, $y1, $y2, $x2, $delta, $width, $label ); my @labels = @{ $self->{'x_tick_labels'} }; $self->{'grid_data'}->{'x'} = []; #make sure we have a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn't a GD font object"; } #get height and width of the font ( $h, $w ) = ( $font->height, $font->width ); #store actual borders, for a possible later repair $self->{'temp_x_min'} = $self->{'curr_x_min'}; $self->{'temp_x_max'} = $self->{'curr_x_max'}; $self->{'temp_y_max'} = $self->{'curr_y_max'}; $self->{'temp_y_min'} = $self->{'curr_y_min'}; #get the right x-value and width #The one and only way to get the RIGHT x value and the width if ( $self->{'y_axes'} =~ /^right$/i ) { $x1 = $self->{'curr_x_min'}; $width = $self->{'curr_x_max'} - $x1 - ( $w * $self->{'y_tick_label_length'} ) - 3 * $self->{'text_space'} - $self->{'tick_len'}; } elsif ( $self->{'y_axes'} =~ /^both$/i ) { $x1 = $self->{'curr_x_min'} + ( $w * $self->{'y_tick_label_length'} ) + 3 * $self->{'text_space'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x1 - ( $w * $self->{'y_tick_label_length'} ) - ( 3 * $self->{'text_space'} ) - $self->{'tick_len'}; } else { $x1 = $self->{'curr_x_min'} + ( $w * $self->{'y_tick_label_length'} ) + 3 * $self->{'text_space'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x1; } #get the delta value $delta = $width / ( $self->{'x_number_ticks'} - 1 ); #draw the labels $y2 = $y1; if ( $self->{'x_ticks'} =~ /^normal/i ) { #just normal ticks #get the point for updating later $y1 = $self->{'curr_y_max'} - 2 * $self->{'text_space'} - $h - $self->{'tick_len'}; #get the start point $y2 = $y1 + $self->{'tick_len'} + $self->{'text_space'}; if ( $self->{'xlabels'} ) { unless ( $self->{'xrange'} ) { croak "Base.pm: xrange must be specified with xlabels!\n"; } my $xmin = $self->{'xrange'}[0]; my $xmax = $self->{'xrange'}[1]; my @labels = @{ $self->{'xlabels'}[0] }; my @vals = @{ $self->{'xlabels'}[1] }; my $delta = $width / ( $xmax - $xmin ); for ( 0 .. $#labels ) { my $label = $labels[$_]; my $val = $vals[$_]; $x2 = $x1 + ( $delta * ( $val - $xmin ) ) - ( 0.5 * $w * length($label) ); $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); #print "write x-label '".$label."' at ($x2,$y2)\n"; } } else { my $last_x = 'undefined'; for ( 0 .. $#labels ) { $label = $self->{f_x_tick}->( $self->{'x_tick_labels'}[$_] ); $x2 = $x1 + ( $delta * $_ ) - ( 0.5 * $w * length($label) ); if ( $last_x eq 'undefined' or $last_x < $x2 ) { $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); $last_x = $x2 + ( $w * length($label) ); } #print "last_x = $last_x, write string '".$label."' at ($x2,$y2) to '$_'\n"; } } } elsif ( $self->{'x_ticks'} =~ /^staggered/i ) { #staggered ticks #get the point for updating later $y1 = $self->{'curr_y_max'} - 3 * $self->{'text_space'} - 2 * $h - $self->{'tick_len'}; if ( $self->{'xlabels'} ) { unless ( $self->{'xrange'} ) { croak "Base.pm: xrange must be specified with xlabels!\n"; } my $xmin = $self->{'xrange'}[0]; my $xmax = $self->{'xrange'}[1]; my @labels = @{ $self->{'xlabels'}[0] }; my @vals = @{ $self->{'xlabels'}[1] }; my $delta = $width / ( $xmax - $xmin ); for ( 0 .. $#labels ) { my $label = $labels[$_]; my $val = $vals[$_]; $x2 = $x1 + ( $delta * ( $val - $xmin ) ) - ( 0.5 * $w * length($label) ); unless ( $_ % 2 ) { $y2 = $y1 + $self->{'text_space'} + $self->{'tick_len'}; } else { $y2 = $y1 + $h + 2 * $self->{'text_space'} + $self->{'tick_len'}; } $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); #print "write x-label '".$label."' at ($x2,$y2)\n"; } } else { for ( 0 .. $#labels ) { $label = $self->{f_x_tick}->( $self->{'x_tick_labels'}[$_] ); $x2 = $x1 + ( $delta * $_ ) - ( 0.5 * $w * length($label) ); unless ( $_ % 2 ) { $y2 = $y1 + $self->{'text_space'} + $self->{'tick_len'}; } else { $y2 = $y1 + $h + 2 * $self->{'text_space'} + $self->{'tick_len'}; } $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); } } } elsif ( $self->{'x_ticks'} =~ /^vertical/i ) { #vertical ticks #get the point for updating later $y1 = $self->{'curr_y_max'} - 2 * $self->{'text_space'} - $w * $self->{'x_tick_label_length'} - $self->{'tick_len'}; if ( $self->{'xlabels'} ) { unless ( $self->{'xrange'} ) { croak "Base.pm: xrange must be specified with xlabels!\n"; } my $xmin = $self->{'xrange'}[0]; my $xmax = $self->{'xrange'}[1]; my @labels = @{ $self->{'xlabels'}[0] }; my @vals = @{ $self->{'xlabels'}[1] }; my $delta = $width / ( $xmax - $xmin ); for ( 0 .. $#labels ) { my $label = $labels[$_]; my $val = $vals[$_]; $y2 = $y1 + $self->{'tick_len'} + $w * length($label) + $self->{'text_space'}; $x2 = $x1 + ( $delta * ( $val - $xmin ) ) - ( $h / 2 ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $label, $textcolor ); #print "write x-label '".$label."' at ($x2,$y2)\n"; } } else { for ( 0 .. $#labels ) { $label = $self->{f_x_tick}->( $self->{'x_tick_labels'}[$_] ); #get the start point $y2 = $y1 + $self->{'tick_len'} + $w * length($label) + $self->{'text_space'}; $x2 = $x1 + ( $delta * $_ ) - ( $h / 2 ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $label, $textcolor ); } } } else { croak "I don't understand the type of x-ticks you specified\n" . "x-ticks must be one of 'normal', 'staggered' or 'vertical' but not of '" . $self->{'x_ticks'} . "'."; } #update the curr y max value $self->{'curr_y_max'} = $y1; #draw the ticks $y1 = $self->{'curr_y_max'}; $y2 = $self->{'curr_y_max'} + $self->{'tick_len'}; #draw grid lines if ( $self->{'xlabels'} ) { unless ( $self->{'xrange'} ) { croak "Base.pm: xrange must be specified with xlabels!\n"; } my $xmin = $self->{'xrange'}[0]; my $xmax = $self->{'xrange'}[1]; my @vals = @{ $self->{'xlabels'}[1] }; my $delta = $width / ( $xmax - $xmin ); for ( 0 .. $#vals ) { my $val = $vals[$_]; $x2 = ($x1) + ( $delta * ( $val - $xmin ) ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } else { for ( 0 .. $#labels ) { $x2 = $x1 + ( $delta * $_ ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( ( $self->true( $self->{'grid_lines'} ) ) or ( $self->true( $self->{'x_grid_lines'} ) ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } return 1; } ## @fn private int _draw_x_ticks() # draw the x-ticks and their labels # @return status sub _draw_x_ticks { my $self = shift; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my $label; my ( $h, $w ); my ( $x1, $x2, $y1, $y2 ); my ( $width, $delta ); my ($stag); $self->{'grid_data'}->{'x'} = []; # make sure we got a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn\'t a GD Font object"; } # get the height and width of the font ( $h, $w ) = ( $font->height, $font->width ); # maybe, we need the actual x and y values later for drawing the x-ticks again # in the draw function in the lines modul. So copy them. $self->{'temp_x_min'} = $self->{'curr_x_min'}; $self->{'temp_x_max'} = $self->{'curr_x_max'}; $self->{'temp_y_min'} = $self->{'curr_y_min'}; $self->{'temp_y_max'} = $self->{'curr_y_max'}; # allow for the amount of space the y-ticks will push the # axes over to the right ## _draw_y_ticks allows 3 * text_space, not 1 * ; this caused mismatch between ## the ticks (and grid lines) and the data. # $x1 = $self->{'curr_x_min'} + ($w * $self->{'y_tick_label_length'}) # + $self->{'text_space'} + $self->{'tick_len'}; ## And, what about the right-tick space?? Only affects Composite, I guess.... #The one and only way to get the RIGHT x value and the width if ( $self->{'y_axes'} =~ /^right$/i ) { $x1 = $self->{'curr_x_min'}; $width = $self->{'curr_x_max'} - $x1 - ( $w * $self->{'y_tick_label_length'} ) - 3 * $self->{'text_space'} - $self->{'tick_len'}; } elsif ( $self->{'y_axes'} =~ /^both$/i ) { $x1 = $self->{'curr_x_min'} + ( $w * $self->{'y_tick_label_length'} ) + 3 * $self->{'text_space'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x1 - ( $w * $self->{'y_tick_label_length'} ) - 3 * $self->{'text_space'} - $self->{'tick_len'}; } else { $x1 = $self->{'curr_x_min'} + ( $w * $self->{'y_tick_label_length'} ) + 3 * $self->{'text_space'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x1; } #the same for the y value, but not so tricky $y1 = $self->{'curr_y_max'} - $h - $self->{'text_space'}; # get the delta value, figure out how to draw the labels $delta = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); if ( !defined( $self->{'skip_x_ticks'} ) ) { $self->{'skip_x_ticks'} = 1; } elsif ( $self->{'skip_x_ticks'} == 0 ) { $self->{'skip_x_ticks'} = 1; } if ( $delta <= ( $self->{'x_tick_label_length'} * $w ) / $self->{'skip_x_ticks'} ) { if ( $self->{'x_ticks'} =~ /^normal$/i ) { $self->{'x_ticks'} = 'staggered'; } } # now draw the labels if ( $self->{'x_ticks'} =~ /^normal$/i ) { # normal ticks if ( $self->{'skip_x_ticks'} > 1 ) { # draw only every nth tick and label for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { if ( defined( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) { $label = $self->{f_x_tick}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ); $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ) - ( $w * length($label) ) / 2; $self->{'gd_obj'}->string( $font, $x2, $y1, $label, $textcolor ); } } } elsif ( $self->{'custom_x_ticks'} ) { # draw only the ticks they wanted for ( @{ $self->{'custom_x_ticks'} } ) { if ( defined($_) ) { $label = $self->{f_x_tick}->( $data->[0][$_] ); $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length($label) ) / 2; $self->{'gd_obj'}->string( $font, $x2, $y1, $label, $textcolor ); } } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { if ( defined($_) ) { $label = $self->{f_x_tick}->( $data->[0][$_] ); $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length($label) ) / 2; $self->{'gd_obj'}->string( $font, $x2, $y1, $label, $textcolor ); } } } } elsif ( $self->{'x_ticks'} =~ /^staggered$/i ) { # staggered ticks if ( $self->{'skip_x_ticks'} > 1 ) { $stag = 0; for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { if ( defined( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ) - ( $w * length( $self->{f_x_tick}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) ) / 2; if ( ( $stag % 2 ) == 1 ) { $y1 -= $self->{'text_space'} + $h; } $self->{'gd_obj'} ->string( $font, $x2, $y1, $self->{f_x_tick}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ), $textcolor ); if ( ( $stag % 2 ) == 1 ) { $y1 += $self->{'text_space'} + $h; } $stag++; } } } elsif ( $self->{'custom_x_ticks'} ) { $stag = 0; for ( sort ( @{ $self->{'custom_x_ticks'} } ) ) { # sort to make it look good if ( defined($_) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length( $self->{f_x_tick}->( $data->[0][$_] ) ) ) / 2; if ( ( $stag % 2 ) == 1 ) { $y1 -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x2, $y1, $self->{f_x_tick}->( $data->[0][$_] ), $textcolor ); if ( ( $stag % 2 ) == 1 ) { $y1 += $self->{'text_space'} + $h; } $stag++; } } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { if ( defined( $self->{f_x_tick}->( $data->[0][$_] ) ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length( $self->{f_x_tick}->( $data->[0][$_] ) ) ) / 2; if ( ( $_ % 2 ) == 1 ) { $y1 -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x2, $y1, $self->{f_x_tick}->( $data->[0][$_] ), $textcolor ); if ( ( $_ % 2 ) == 1 ) { $y1 += $self->{'text_space'} + $h; } } } } } elsif ( $self->{'x_ticks'} =~ /^vertical$/i ) { # vertical ticks $y1 = $self->{'curr_y_max'} - $self->{'text_space'}; if ( $self->{'skip_x_ticks'} > 1 ) { for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { if ( defined($_) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ) - $h / 2; $y2 = $y1 - ( ( $self->{'x_tick_label_length'} - length( $self->{f_x_tick}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) ) * $w ); $self->{'gd_obj'} ->stringUp( $font, $x2, $y2, $self->{f_x_tick}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ), $textcolor ); } } } elsif ( $self->{'custom_x_ticks'} ) { for ( @{ $self->{'custom_x_ticks'} } ) { if ( defined($_) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - $h / 2; $y2 = $y1 - ( ( $self->{'x_tick_label_length'} - length( $self->{f_x_tick}->( $data->[0][$_] ) ) ) * $w ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $self->{f_x_tick}->( $data->[0][$_] ), $textcolor ); } } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { if ( defined($_) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - $h / 2; $y2 = $y1 - ( ( $self->{'x_tick_label_length'} - length( $self->{f_x_tick}->( $data->[0][$_] ) ) ) * $w ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $self->{f_x_tick}->( $data->[0][$_] ), $textcolor ); } } } } else { # error time carp "I don't understand the type of x-ticks you specified"; } # update the current y-max value if ( $self->{'x_ticks'} =~ /^normal$/i ) { $self->{'curr_y_max'} -= $h + ( 2 * $self->{'text_space'} ); } elsif ( $self->{'x_ticks'} =~ /^staggered$/i ) { $self->{'curr_y_max'} -= ( 2 * $h ) + ( 3 * $self->{'text_space'} ); } elsif ( $self->{'x_ticks'} =~ /^vertical$/i ) { $self->{'curr_y_max'} -= ( $w * $self->{'x_tick_label_length'} ) + ( 2 * $self->{'text_space'} ); } # now plot the ticks $y1 = $self->{'curr_y_max'}; $y2 = $self->{'curr_y_max'} - $self->{'tick_len'}; if ( $self->{'skip_x_ticks'} > 1 ) { for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } elsif ( $self->{'custom_x_ticks'} ) { for ( @{ $self->{'custom_x_ticks'} } ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } # update the current y-max value $self->{'curr_y_max'} -= $self->{'tick_len'}; } ## @fn private int _draw_y_ticks() # draw the y-ticks and their labels # @return status sub _draw_y_ticks { my $self = shift; my $side = shift || 'left'; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my @labels = @{ $self->{'y_tick_labels'} }; my ( $w, $h ); my ( $x1, $x2, $y1, $y2 ); my ( $height, $delta, $label ); my ( $s, $f ); $self->{grid_data}->{'y'} = []; $self->{grid_data}->{'y2'} = []; # make sure we got a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn\'t a GD Font object"; } # find out how big the font is ( $w, $h ) = ( $font->width, $font->height ); # figure out which ticks not to draw if ( $self->{'min_val'} >= 0 ) { $s = 1; $f = $#labels; } elsif ( $self->{'max_val'} <= 0 ) { $s = 0; $f = $#labels; # -1 entfernt } else { $s = 0; $f = $#labels; } # now draw them if ( $side eq 'right' ) { # put 'em on the right side of the chart # get the base x-y values, and the delta value $x1 = $self->{'curr_x_max'} - $self->{'tick_len'} - ( 3 * $self->{'text_space'} ) - ( $w * $self->{'y_tick_label_length'} ); $y1 = $self->{'curr_y_max'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $self->{'y_ticks'} = 2 if $self->{'y_ticks'} < 2; $delta = $height / ( $self->{'y_ticks'} - 1 ); # update the curr_x_max value $self->{'curr_x_max'} = $x1; # now draw the ticks $x2 = $x1 + $self->{'tick_len'}; for ( $s .. $f ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'y2_grid_lines'} ) ) { $self->{'grid_data'}->{'y2'}->[$_] = $y2; } } # update the current x-min value $x1 += $self->{'tick_len'} + ( 2 * $self->{'text_space'} ); $y1 -= $h / 2; # now draw the labels for ( 0 .. $#labels ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->string( $font, $x1, $y2, $self->{'y_tick_labels'}[$_], $textcolor ); } } elsif ( $side eq 'both' ) { # put the ticks on the both sides ## left side first # get the base x-y values $x1 = $self->{'curr_x_min'} + $self->{'text_space'}; $y1 = $self->{'curr_y_max'} - $h / 2; # now draw the labels $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = $height / ( $self->{'y_ticks'} - 1 ); for ( 0 .. $#labels ) { $label = $self->{'y_tick_labels'}[$_]; $y2 = $y1 - ( $delta * $_ ); $x2 = $x1 + ( $w * $self->{'y_tick_label_length'} ) - ( $w * length($label) ); $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); } # and update the current x-min value $self->{'curr_x_min'} += ( 3 * $self->{'text_space'} ) + ( $w * $self->{'y_tick_label_length'} ); # now draw the ticks (skipping the one at zero); $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} + $self->{'tick_len'}; $y1 += $h / 2; for ( $s .. $f ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{grid_lines} ) or $self->true( $self->{'y_grid_lines'} ) ) { $self->{'grid_data'}->{'y'}->[$_] = $y2; } } # update the current x-min value $self->{'curr_x_min'} += $self->{'tick_len'}; ## now the right side # get the base x-y values, and the delta value $x1 = $self->{'curr_x_max'} - $self->{'tick_len'} - ( 3 * $self->{'text_space'} ) - ( $w * $self->{'y_tick_label_length'} ); $y1 = $self->{'curr_y_max'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = $height / ( $self->{'y_ticks'} - 1 ); # update the curr_x_max value $self->{'curr_x_max'} = $x1; # now draw the ticks (skipping the one at zero); $x2 = $x1 + $self->{'tick_len'}; for ( $s .. $f ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); # draw tick_line if ( $self->true( $self->{grid_lines} ) or $self->true( $self->{'y2_grid_lines'} ) ) { $self->{'grid_data'}->{'y2'}->[$_] = $y2; } } # update the current x-min value $x1 += $self->{'tick_len'} + ( 2 * $self->{'text_space'} ); $y1 -= $h / 2; # now draw the labels for ( 0 .. $#labels ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->string( $font, $x1, $y2, $self->{'y_tick_labels'}[$_], $textcolor ); } } else { # just the left side # get the base x-y values $x1 = $self->{'curr_x_min'} + $self->{'text_space'}; $y1 = $self->{'curr_y_max'} - $h / 2; # now draw the labels $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $self->{'y_ticks'} = 2 if $self->{'y_ticks'} < 2; $delta = $height / ( $self->{'y_ticks'} - 1 ); for ( 0 .. $#labels ) { $label = $self->{'y_tick_labels'}[$_]; $y2 = $y1 - ( $delta * $_ ); $x2 = $x1 + ( $w * $self->{'y_tick_label_length'} ) - ( $w * length($label) ); $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); } # and update the current x-min value $self->{'curr_x_min'} += ( 3 * $self->{'text_space'} ) + ( $w * $self->{'y_tick_label_length'} ); # now draw the ticks $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} + $self->{'tick_len'}; $y1 += $h / 2; for ( $s .. $f ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'y_grid_lines'} ) ) { $self->{'grid_data'}->{'y'}->[$_] = $y2; } } # update the current x-min value $self->{'curr_x_min'} += $self->{'tick_len'}; } # and return return 1; } ## @fn private int _grey_background() # put a grey background on the plot of the data itself # @return status sub _grey_background { my $self = shift; # draw it $self->{'gd_obj'} ->filledRectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $self->_color_role_to_index('grey_background') ); # now return return 1; } ## @fn private int _draw_grid_lines() # draw grid_lines # @return status sub _draw_grid_lines { my $self = shift; $self->_draw_x_grid_lines(); $self->_draw_y_grid_lines(); $self->_draw_y2_grid_lines(); return 1; } ## @fn private int _draw_x_grid_lines() # draw grid_lines for x # @return status sub _draw_x_grid_lines { my $self = shift; my $grid_role = shift || 'x_grid_lines'; my $gridcolor = $self->_color_role_to_index($grid_role); my ( $x, $y, $i ); foreach $x ( @{ $self->{grid_data}->{'x'} } ) { if ( defined $x ) { $self->{gd_obj}->line( ( $x, $self->{'curr_y_min'} + 1 ), $x, ( $self->{'curr_y_max'} - 1 ), $gridcolor ); } } return 1; } ## @fn private int _draw_y_grid_lines() # draw grid_lines for y # @return status sub _draw_y_grid_lines { my $self = shift; my $grid_role = shift || 'y_grid_lines'; my $gridcolor = $self->_color_role_to_index($grid_role); my ( $x, $y, $i ); #Look if I'm an HorizontalBars object if ( $self->isa('Chart::HorizontalBars') ) { for ( $i = 0 ; $i < ( $#{ $self->{grid_data}->{'y'} } ) + 1 ; $i++ ) { $y = $self->{grid_data}->{'y'}->[$i]; $self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor ); } } else { # loop for y values is a little different. This is to discard the first # and last values we were given - the top/bottom of the chart area. for ( $i = 1 ; $i < ( $#{ $self->{grid_data}->{'y'} } ) + 1 ; $i++ ) { ### $y = $self->{grid_data}->{'y'}->[$i]; $self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor ); } } return 1; } ## @fn private int _draw_y2_grid_lines() # draw grid_lines for y # @return status sub _draw_y2_grid_lines { my $self = shift; my $grid_role = shift || 'y2_grid_lines'; my $gridcolor = $self->_color_role_to_index($grid_role); my ( $x, $y, $i ); #Look if I'm an HorizontalBars object if ( $self->isa('Chart::HorizontalBars') ) { for ( $i = 0 ; $i < ( $#{ $self->{grid_data}->{'y'} } ) + 1 ; $i++ ) { $y = $self->{grid_data}->{'y'}->[$i]; $self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor ); } } else { # loop for y2 values is a little different. This is to discard the first # and last values we were given - the top/bottom of the chart area. for ( $i = 1 ; $i < $#{ $self->{grid_data}->{'y2'} } ; $i++ ) { $y = $self->{grid_data}->{'y2'}->[$i]; $self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor ); } } return 1; } ## @fn private int _prepare_brush($color,$type,$role) # prepare brush # # @details # set the gdBrush object to tick GD into drawing fat lines & points # of interesting shapes # Needed by "Lines", "Points" and "LinesPoints" # All hacked up by Richard Dice Sunday 16 May 1999 # # @param $color # @param $type 'line','point' # @param $role # # @return status sub _prepare_brush { my $self = shift; my $color = shift; my $type = shift; my $role = shift || 'default'; my $brushStyle = $self->{'brushStyle'}; if ( defined $role ) { my (@brushStyles) = $self->_brushStyles_of_roles($role); $brushStyle = $brushStyles[0]; } #print STDERR "role=$role\n"; # decide what $type should be in the event that a param isn't # passed -- this is necessary to preserve backward compatibility # with apps that use this module prior to putting _prepare_brush # in with Base.pm if ( !defined($type) ) { $type = 'point'; } if ( ( !length($type) ) || ( !grep { $type eq $_ } ( 'line', 'point' ) ) ) { $brushStyle = $self->{'brushStyle'}; $type = 'line' if ref $self eq 'Chart::Lines'; $type = 'point' if ref $self eq 'Chart::Points'; } my ( $radius, @rgb, $brush, $white, $newcolor ); # get the rgb values for the desired color @rgb = $self->{'gd_obj'}->rgb($color); # get the appropriate brush size if ( $type eq 'line' ) { $radius = $self->{'brush_size'} / 2; } elsif ( $type eq 'point' ) { $radius = $self->{'pt_size'} / 2; } # create the new image $brush = GD::Image->new( $radius * 2, $radius * 2 ); # get the colors, make the background transparent $white = $brush->colorAllocate( 255, 255, 255 ); $newcolor = $brush->colorAllocate(@rgb); $brush->transparent($white); # draw the circle if ( $type eq 'line' ) { $brush->arc( $radius - 1, $radius - 1, $radius, $radius, 0, 360, $newcolor ); $brush->fill( $radius - 1, $radius - 1, $newcolor ); # RLD # # Does $brush->fill really have to be here? Dunno... this # seems to be a relic from earlier code # # Note that 'line's don't benefit from a $brushStyle... yet. # It shouldn't be too tough to hack this in by taking advantage # of GD's gdStyled facility } if ( $type eq 'point' ) { $brushStyle = $self->{'brushStyle'} unless grep { $brushStyle eq $_ } ( 'FilledCircle', 'circle', 'donut', 'OpenCircle', 'triangle', 'upsidedownTriangle', 'square', 'hollowSquare', 'OpenRectangle', 'fatPlus', 'Star', 'OpenStar', 'FilledDiamond', 'OpenDiamond' ); my ( $xc, $yc ) = ( $radius, $radius ); if ( grep { $brushStyle eq $_ } ( 'default', 'circle', 'donut', 'OpenCircle', 'FilledCircle' ) ) { $brush->arc( $xc, $yc, $radius, $radius, 0, 360, $newcolor ); $brush->fill( $xc, $yc, $newcolor ); # draw a white (and therefore transparent) circle in the middle # of the existing circle to make the "donut", if appropriate if ( $brushStyle eq 'donut' || $brushStyle eq 'OpenCircle' ) { $brush->arc( $xc, $yc, int( $radius / 2 ), int( $radius / 2 ), 0, 360, $white ); $brush->fill( $xc, $yc, $white ); } } if ( grep { $brushStyle eq $_ } ( 'triangle', 'upsidedownTriangle' ) ) { my $poly = new GD::Polygon; my $sign = ( $brushStyle eq 'triangle' ) ? 1 : (-1); my $z = int( 0.8 * $radius ); # scaling factor # co-ords are chosen to make an equilateral triangle $poly->addPt( $xc, $yc - ( $z * $sign ) ); $poly->addPt( $xc + int( ( sqrt(3) * $z ) / 2 ), $yc + ( int( $z / 2 ) * $sign ) ); $poly->addPt( $xc - int( ( sqrt(3) * $z ) / 2 ), $yc + ( int( $z / 2 ) * $sign ) ); $brush->filledPolygon( $poly, $newcolor ); } if ( $brushStyle eq 'fatPlus' ) { my $poly = new GD::Polygon; my $z = int( 0.3 * $radius ); $poly->addPt( $xc + $z, $yc + $z ); $poly->addPt( $xc + 2 * $z, $yc + $z ); $poly->addPt( $xc + 2 * $z, $yc - $z ); $poly->addPt( $xc + $z, $yc - $z ); $poly->addPt( $xc + $z, $yc - 2 * $z ); $poly->addPt( $xc - $z, $yc - 2 * $z ); $poly->addPt( $xc - $z, $yc - $z ); $poly->addPt( $xc - 2 * $z, $yc - $z ); $poly->addPt( $xc - 2 * $z, $yc + $z ); $poly->addPt( $xc - $z, $yc + $z ); $poly->addPt( $xc - $z, $yc + 2 * $z ); $poly->addPt( $xc + $z, $yc + 2 * $z ); $brush->filledPolygon( $poly, $newcolor ); } if ( $brushStyle eq 'Star' || $brushStyle eq 'OpenStar' ) { my $poly = new GD::Polygon; my $z = int($radius); my $sz = int( $z / 3 * 1.75 ); # small z my $x1 = int( $xc + $z ); my $y1 = int($yc); my ( $x2, $y2 ); my $xyRatio = $self->_xyRatio(); $poly->addPt( $x1, $y1 ); $x2 = $xc + int( $sz * 0.5 ); $y2 = $yc - int( $sz * 0.5 ); $poly->addPt( $x2, $y2 ); $x2 = $xc; $y2 = $yc - $z; $poly->addPt( $x2, $y2 ); $x2 = $xc - int( $sz * 0.5 ); $y2 = $yc - int( $sz * 0.5 ); $poly->addPt( $x2, $y2 ); $x2 = $xc - $z; $y2 = $yc; $poly->addPt( $x2, $y2 ); $x2 = $xc - int( $sz * 0.5 ); $y2 = $yc + int( $sz * 0.5 ); $poly->addPt( $x2, $y2 ); $x2 = $xc; $y2 = $yc + $z; $poly->addPt( $x2, $y2 ); $x2 = $xc + int( $sz * 0.5 ); $y2 = $yc + int( $sz * 0.5 ); $poly->addPt( $x2, $y2 ); if ( $brushStyle eq 'OpenStar' ) { $brush->polygon( $poly, $newcolor ); } else { $brush->filledPolygon( $poly, $newcolor ); } } if ( grep { $brushStyle eq $_ } ( 'square', 'hollowSquare', 'OpenRectangle' ) ) { my $z = int( 0.5 * $radius ); $brush->filledRectangle( $xc - $z, $yc - $z, $xc + $z, $yc + $z, $newcolor ); if ( $brushStyle eq 'hollowSquare' || $brushStyle eq 'OpenRectangle' ) { $z = int( $z / 2 ); $brush->filledRectangle( $xc - $z, $yc - $z, $xc + $z, $yc + $z, $white ); } } if ( grep { $brushStyle eq $_ } ( 'FilledDiamond', 'OpenDiamond' ) ) { my $z = int( 0.75 * $radius ); $brush->line( $xc + $z, $yc, $xc, $yc + $z, $newcolor ); $brush->line( $xc, $yc + $z, $xc - $z, $yc, $newcolor ); $brush->line( $xc - $z, $yc, $xc, $yc - $z, $newcolor ); $brush->line( $xc, $yc - $z, $xc + $z, $yc, $newcolor ); if ( $brushStyle eq 'FilledDiamond' ) { # and fill it $brush->fill( $radius - 1, $radius - 1, $newcolor ); } } } # set the new image as the main object's brush return $brush; } ## @fn private int _default_f_tick # default tick conversion function # This function is pointed to be $self->{f_x_tick} resp. $self->{f_y_tick} # if the user does not provide another function # # @return status sub _default_f_tick { my $label = shift; return $label; } ## @fn private float _xyRatio # Get ratio width_x/width_y # # @return ratio width_x and width_y sub _xyRatio { my $self = shift; my $width_x = $self->{'curr_x_max'} - $self->{'curr_x_min'} + 1; my $width_y = $self->{'curr_y_max'} - $self->{'curr_y_min'} + 1; my $ratio = $width_x / $width_y; return $ratio; } ## @fn private float _xPixelInReal # Get witdh of one Pixel in real coordinates in x-direction # # # @return width(interval) of reality in x direction # sub _xPixelInReal { my $self = shift; my $width_x = $self->{'curr_x_max'} - $self->{'curr_x_min'} + 1; my ( $min, $max ) = $self->_find_x_range(); my $xRealWidth = $max - $min; my $ratio = $xRealWidth / $width_x; return $ratio; } ## @fn private float _yPixelInReal # Get witdh of one Pixel in real coordinates in y-direction # # # @return width(interval) of reality in y direction # sub _yPixelInReal { my $self = shift; my $width_y = $self->{'curr_y_max'} - $self->{'curr_y_min'} + 1; my ( $min, $max, $flag_all_integers ) = $self->_find_y_range(); my $yRealWidth = $max - $min; my $ratio = $yRealWidth / $width_y; return $ratio; } ## be a good module and return positive 1; Chart-2.4.6/Chart/Direction.pm0000644000175000017500000010103212033071313015423 0ustar reinerreiner## @file # Implementation of Chart::Direction # # written by # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # # @section Chart::Direction # Implements a circular oriented chart like rotating vectors # ## @class Chart::Direction # @brief Direction class derived class for Chart to implement direction # charts package Chart::Direction; use Chart::Base '2.4.6'; use GD; use Carp; use strict; use POSIX; @Chart::Direction::ISA = qw(Chart::Base); $Chart::Direction::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @method int set(%opts) # @param[in] %opts Hash of options to the Chart # @return ok or croak # # @brief # Set all options # # @details # main method for customizing the chart, lets users # specify values for different parameters\n # dont check the number of points in the added datasets in a polarplot\n # overwrite Base method # sub set { my $self = shift; my %opts = @_; # basic error checking on the options, just warn 'em unless ( $#_ % 2 ) { carp "Whoops, some option to be set didn't have a value.\n", "You might want to look at that.\n"; } # set the options for ( keys %opts ) { $self->{$_} = $opts{$_}; # if someone wants to change the grid_lines color, we should set all # the colors of the grid_lines if ( $_ =~ /^colors$/ ) { my %hash = %{ $opts{$_} }; foreach my $key ( sort keys %hash ) { if ( $key =~ /^grid_lines$/ ) { $self->{'colors'}{'y_grid_lines'} = $hash{'grid_lines'}; $self->{'colors'}{'x_grid_lines'} = $hash{'grid_lines'}; $self->{'colors'}{'y2_grid_lines'} = $hash{'grid_lines'}; } } } } if ( $self->false( $self->{'polar'} ) && ( defined $self->{'croak'} ) ) { carp "New data set to be added has an incorrect number of points"; } # now return return 1; } ## @method int add_dataset(@data) # Add many datasets to the dataref # # Graph API\n # Overwrite Base method # # @param @data Dataset to add # sub add_dataset { my $self = shift; my @data = @_; # error check the data (carp, don't croak) if ( $self->{'dataref'} && ( $#{ $self->{'dataref'}->[0] } != $#data ) ) { # carp "New data set to be added has an incorrect number of points"; $self->{'croak'} = 'true'; } # copy it into the dataref push @{ $self->{'dataref'} }, [@data]; # now return return 1; } #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private int _find_y_scale() # we use the find_y_scale methode to determine the labels of the circles # and the amount of them # @return status # # This function is an overwrite to the same function found in the base class # Chart::Base # sub _find_y_scale { my $self = shift; # Predeclare vars. my ( $d_min, $d_max ); # Dataset min & max. my ( $p_min, $p_max ); # Plot min & max. my ( $tickInterval, $tickCount, $skip ); my @tickLabels; # List of labels for each tick. my $maxtickLabelLen = 0; # The length of the longest tick label. # Find the datatset minimum and maximum. ( $d_min, $d_max ) = $self->_find_y_range(); # Force the inclusion of zero if the user has requested it. if ( $self->true( $self->{'include_zero'} ) ) { if ( ( $d_min * $d_max ) > 0 ) # If both are non zero and of the same sign. { if ( $d_min > 0 ) # If the whole scale is positive. { $d_min = 0; } else # The scale is entirely negative. { $d_max = 0; } } } # Allow the dataset range to be overidden by the user. # f_min/max are booleans which indicate that the min & max should not be modified. my $f_min = defined $self->{'min_val'}; $d_min = $self->{'min_val'} if $f_min; my $f_max = defined $self->{'max_val'}; $d_max = $self->{'max_val'} if $f_max; # Assert against the min is larger than the max. if ( $d_min > $d_max ) { croak "The the specified 'min_val' & 'max_val' values are reversed (min > max: $d_min>$d_max)"; } # Calculate the width of the dataset. (posibly modified by the user) my $d_width = $d_max - $d_min; # If the width of the range is zero, forcibly widen it # (to avoid division by zero errors elsewhere in the code). if ( 0 == $d_width ) { $d_min--; $d_max++; $d_width = 2; } # Descale the range by converting the dataset width into # a floating point exponent & mantisa pair. my ( $rangeExponent, $rangeMantisa ) = $self->_sepFP($d_width); my $rangeMuliplier = 10**$rangeExponent; # Find what tick # to use & how many ticks to plot, # round the plot min & max to suatable round numbers. ( $tickInterval, $tickCount, $p_min, $p_max ) = $self->_calcTickInterval( $d_min / $rangeMuliplier, $d_max / $rangeMuliplier, $f_min, $f_max, $self->{'min_circles'} + 1, $self->{'max_circles'} + 1 ); # Restore the tickInterval etc to the correct scale $_ *= $rangeMuliplier foreach ( $tickInterval, $p_min, $p_max ); #get the precision for the labels my $precision = $self->{'precision'}; # Now sort out an array of tick labels. if ( $self->false( $self->{'polar'} ) ) { for ( my $labelNum = $p_min ; $labelNum <= $p_max ; $labelNum += $tickInterval ) { my $labelText; if ( defined $self->{f_y_tick} ) { # Is _default_f_tick function used? if ( $self->{f_y_tick} == \&Chart::Base::_default_f_tick ) { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } else { # print \&_default_f_tick; $labelText = $self->{f_y_tick}->($labelNum); } } else { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } } else { # polar == true for ( my $labelNum = $p_max ; $labelNum >= $p_min ; $labelNum -= $tickInterval ) { my $labelText; if ( defined $self->{f_y_tick} ) { # Is _default_f_tick function used? if ( $self->{f_y_tick} == \&Chart::Base::_default_f_tick ) { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } else { # print \&_default_f_tick; $labelText = $self->{f_y_tick}->($labelNum); } } else { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } } # Store the calculated data. $self->{'min_val'} = $p_min, $self->{'max_val'} = $p_max, $self->{'y_ticks'} = $tickCount, $self->{'y_tick_labels'} = \@tickLabels, $self->{'y_tick_label_length'} = $maxtickLabelLen; # and return. return 1; } ## @fn private _calcTickInterval($dataset_min, $dataset_max, $flag_fixed_min, $flag_fixed_max, $minTicks, $maxTicks) # @brief # Calculates the ticks for direction in normalised units. # # @details # Calculate the Interval between ticks in y direction # and compare the number of ticks to # the user given values min_y_ticks, max_y_ticks # # @param[in] $dataset_min Minimal value in y direction # @param[in] $dataset_max Maximal value in y direction # @param[in] $flag_fixed_min Indicator whether the dataset_min value is fixed # @param[in] $flag_fixed_max Indicator whether the dataset_max value is fixed # @param[in] $minTicks Minimal number of ticks wanted # @param[in] $maxTicks Maximal number of ticks wanted # @return $tickInterval, $tickCount, $pMin, $pMax # sub _calcTickInterval { my $self = shift; my ( $min, $max, # The dataset min & max. $minF, $maxF, # Indicates if those min/max are fixed. $minTicks, $maxTicks, # The minimum & maximum number of ticks. ) = @_; # Verify the supplied 'min_y_ticks' & 'max_y_ticks' are sensible. if ( $minTicks < 2 ) { carp "Chart::Direction : Incorrect value for 'min_circles', too small.\n"; $minTicks = 2; } if ( $maxTicks < 5 * $minTicks ) { carp "Chart::Direction : Incorrect value for 'max_circles', too small.\n"; $maxTicks = 5 * $minTicks; } my $width = $max - $min; my @divisorList; for ( my $baseMul = 1 ; ; $baseMul *= 10 ) { TRY: foreach my $tryMul ( 1, 2, 5 ) { # Calc a fresh, smaller tick interval. my $divisor = $baseMul * $tryMul; # Count the number of ticks. my ( $tickCount, $pMin, $pMax ) = $self->_countTicks( $min, $max, 1 / $divisor ); # Look a the number of ticks. if ( $maxTicks < $tickCount ) { # If it is too high, Backtrack. $divisor = pop @divisorList; # just for security: if ( !defined($divisor) || $divisor == 0 ) { $divisor = 1; } ( $tickCount, $pMin, $pMax ) = $self->_countTicks( $min, $max, 1 / $divisor ); carp "Chart::Direction : Caution: Tick limit of $maxTicks exceeded. Backing of to an interval of " . 1 / $divisor . " which plots $tickCount ticks\n"; return ( 1 / $divisor, $tickCount, $pMin, $pMax ); } elsif ( $minTicks > $tickCount ) { # If it is too low, try again. next TRY; } else { # Store the divisor for possible later backtracking. push @divisorList, $divisor; # if the min or max is fixed, check they will fit in the interval. next TRY if ( $minF && ( int( $min * $divisor ) != ( $min * $divisor ) ) ); next TRY if ( $maxF && ( int( $max * $divisor ) != ( $max * $divisor ) ) ); # If everything passes the tests, return. return ( 1 / $divisor, $tickCount, $pMin, $pMax ); } } } die "can't happen!"; } ## @fn private int _draw_y_ticks() # draw the circles and the axes # # Overwrites _draw_y_ticks() of Base class # # @return status sub _draw_y_ticks { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my $textcolor = $self->_color_role_to_index('text'); my $background = $self->_color_role_to_index('background'); my @labels = @{ $self->{'y_tick_labels'} }; my ( $width, $height, $centerX, $centerY, $diameter ); my ( $pi, $font, $fontW, $fontH, $labelX, $labelY, $label_offset ); my ( $dia_delta, $dia, $x, $y, @label_degrees, $arc, $angle_interval ); # set up initial constant values $pi = 3.14159265358979323846, $font = $self->{'legend_font'}, $fontW = $self->{'legend_font'}->width, $fontH = $self->{'legend_font'}->height, $angle_interval = $self->{'angle_interval'}; if ( $self->true( $self->{'grey_background'} ) ) { $background = $self->_color_role_to_index('grey_background'); } # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find width and height $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; # find center point, from which the pie will be drawn around $centerX = int( $width / 2 + $self->{'curr_x_min'} ); $centerY = int( $height / 2 + $self->{'curr_y_min'} ); # always draw a circle, which means the diameter will be the smaller # of the width and height. let enough space for the labels. ## @todo calculate the width of the labels if ( $width < $height ) { $diameter = $width - 110; } else { $diameter = $height - 80; } #the difference between the diameter of two following circles; $dia_delta = ceil( $diameter / ( $self->{'y_ticks'} - 1 ) ); #store the calculated data $self->{'centerX'} = $centerX; $self->{'centerY'} = $centerY; $self->{'diameter'} = $diameter; #draw the axes and its labels # set up an array of labels for the axes if ( $angle_interval == 0 ) { @label_degrees = (); } elsif ( $angle_interval <= 5 && $angle_interval > 0 ) { @label_degrees = qw(180 175 170 165 160 155 150 145 140 135 130 125 120 115 110 105 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25 20 15 10 5 0 355 350 345 340 335 330 325 320 315 310 305 300 295 290 285 280 275 270 265 260 255 250 245 240 235 230 225 220 215 210 205 200 195 190 185); $angle_interval = 5; } elsif ( $angle_interval <= 10 && $angle_interval > 5 ) { @label_degrees = qw(180 170 160 150 140 130 120 110 100 90 80 70 60 50 40 30 20 10 0 350 340 330 320 310 300 290 280 270 260 250 240 230 220 210 200 190); $angle_interval = 10; } elsif ( $angle_interval <= 15 && $angle_interval > 10 ) { @label_degrees = qw(180 165 150 135 120 105 90 75 60 45 30 15 0 345 330 315 300 285 270 255 240 225 210 195); $angle_interval = 15; } elsif ( $angle_interval <= 20 && $angle_interval > 15 ) { @label_degrees = qw(180 160 140 120 100 80 60 40 20 0 340 320 300 280 260 240 220 200); $angle_interval = 20; } elsif ( $angle_interval <= 30 && $angle_interval > 20 ) { @label_degrees = qw(180 150 120 90 60 30 0 330 300 270 240 210); $angle_interval = 30; } elsif ( $angle_interval <= 45 && $angle_interval > 30 ) { @label_degrees = qw(180 135 90 45 0 315 270 225); $angle_interval = 45; } elsif ( $angle_interval <= 90 && $angle_interval > 45 ) { @label_degrees = qw(180 90 0 270); $angle_interval = 90; } else { carp "The angle_interval must be between 0 and 90!\nCorrected value: 30"; @label_degrees = qw(180 150 120 90 60 30 0 330 300 270 240 210); $angle_interval = 30; } $arc = 0; foreach (@label_degrees) { #calculated the coordinates of the end point of the line $x = sin($arc) * ( $diameter / 2 + 10 ) + $centerX; $y = cos($arc) * ( $diameter / 2 + 10 ) + $centerY; #some ugly correcture if ( $_ == '270' ) { $y++; } #draw the line $self->{'gd_obj'}->line( $centerX, $centerY, $x, $y, $misccolor ); #calculate the string point $x = sin($arc) * ( $diameter / 2 + 30 ) + $centerX - 8; $y = cos($arc) * ( $diameter / 2 + 28 ) + $centerY - 6; #draw the labels $self->{'gd_obj'}->string( $font, $x, $y, $_ . '', $textcolor ); $arc += ( ($angle_interval) / 360 ) * 2 * $pi; } #draw the circles $dia = 0; foreach (@labels) { $self->{'gd_obj'}->arc( $centerX, $centerY, $dia, $dia, 0, 360, $misccolor ); $dia += $dia_delta; } $self->{'gd_obj'}->filledRectangle( $centerX - length( $labels[0] ) / 2 * $fontW - 2, $centerY + 2, $centerX + 2 + $diameter / 2, $centerY + $fontH + 2, $background ); #draw the labels of the circles $dia = 0; foreach (@labels) { $self->{'gd_obj'}->string( $font, $centerX + $dia / 2 - length($_) / 2 * $fontW, $centerY + 2, $_, $textcolor ); $dia += $dia_delta; } return 1; } ## @fn private int _draw_x_ticks() # We don't need x ticks, it's all done in _draw_y_ticks # @return status # # Overwrites the corresponding function in Base # sub _draw_x_ticks { my $self = shift; return 1; } ## @fn private _draw_data # finally get around to plotting the data for direction charts sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my $textcolor = $self->_color_role_to_index('text'); my $background = $self->_color_role_to_index('background'); my ( $width, $height, $centerX, $centerY, $diameter ); my ( $mod, $map, $i, $j, $brush, $color, $x, $y, $winkel, $first_x, $first_y ); my ( $arrow_x, $arrow_y, $m ); $color = 1; my $pi = 3.14159265358979323846; my $len = 10; my $alpha = 1; my $last_x = undef; my $last_y = undef; my $diff; my $n = 0; if ( $self->true( $self->{'pairs'} ) ) { my $a = $self->{'num_datasets'} / 2; my $b = ceil($a); my $c = $b - $a; if ( $c == 0 ) { croak "Wrong number of datasets for 'pairs'"; } } # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find width and height $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; # get the base values if ( $self->false( $self->{'polar'} ) ) { $mod = $self->{'min_val'}; } else { $mod = $self->{'max_val'}; } $centerX = $self->{'centerX'}; $centerY = $self->{'centerY'}; $diameter = $self->{'diameter'}; $diff = $self->{'max_val'} - $self->{'min_val'}; $diff = 1 if $diff < 1; $map = $diameter / 2 / $diff; $brush = $self->_prepare_brush( $color, 'point' ); $self->{'gd_obj'}->setBrush($brush); # draw every line for this dataset if ( $self->false( $self->{'pairs'} ) ) { for $j ( 1 .. $self->{'num_datasets'} ) { $color = $self->_color_role_to_index( 'dataset' . ( $j - 1 ) ); for $i ( 0 .. $self->{'num_datapoints'} - 1 ) { # don't try to draw anything if there's no data if ( defined( $data->[$j][$i] ) && $data->[$j][$i] <= $self->{'max_val'} && $data->[$j][$i] >= $self->{'min_val'} ) { #calculate the point $winkel = ( 180 - ( $data->[0][$i] % 360 ) ) / 360 * 2 * $pi; if ( $self->false( $self->{'polar'} ) ) { $x = ceil( $centerX + sin($winkel) * ( $data->[$j][$i] - $mod ) * $map ); $y = ceil( $centerY + cos($winkel) * ( $data->[$j][$i] - $mod ) * $map ); } else { $x = ceil( $centerX + sin($winkel) * ( $mod - $data->[$j][$i] ) * $map ); $y = ceil( $centerY + cos($winkel) * ( $mod - $data->[$j][$i] ) * $map ); } # set the x and y values back if ( $i == 0 ) { $first_x = $x; $first_y = $y; $last_x = $x; $last_y = $y; } if ( $self->true( $self->{'point'} ) ) { $brush = $self->_prepare_brush( $color, 'point' ); $self->{'gd_obj'}->setBrush($brush); #draw the point $self->{'gd_obj'}->line( $x + 1, $y, $x, $y, gdBrushed ); } if ( $self->true( $self->{'line'} ) ) { $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #draw the line if ( defined $last_x ) { $self->{'gd_obj'}->line( $x, $y, $last_x, $last_y, gdBrushed ); } } if ( $self->true( $self->{'arrow'} ) ) { $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #draw the arrow if ( $data->[$j][$i] > $self->{'min_val'} ) { $self->{'gd_obj'}->line( $x, $y, $centerX, $centerY, gdBrushed ); $arrow_x = $x - cos( $winkel - $alpha ) * $len; $arrow_y = $y + sin( $winkel - $alpha ) * $len; $self->{'gd_obj'}->line( $x, $y, $arrow_x, $arrow_y, gdBrushed ); $arrow_x = $x + sin( $pi / 2 - $winkel - $alpha ) * $len; $arrow_y = $y - cos( $pi / 2 - $winkel - $alpha ) * $len; $self->{'gd_obj'}->line( $x, $y, $arrow_x, $arrow_y, gdBrushed ); } } $last_x = $x; $last_y = $y; # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$j][$i] = [ $x, $y ]; } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$j][$i] = [ undef(), undef() ]; } } } # end for # draw the last line to the first point if ( $self->true( $self->{'line'} ) ) { $self->{'gd_obj'}->line( $x, $y, $first_x, $first_y, gdBrushed ); } } # end for $j } if ( $self->true( $self->{'pairs'} ) ) { for ( $j = 1 ; $j <= $self->{'num_datasets'} ; $j += 2 ) { if ( $j == 1 ) { $color = $self->_color_role_to_index( 'dataset' . ( $j - 1 ) ); } else { $color = $self->_color_role_to_index( 'dataset' . ( $j / 2 - 0.5 ) ); } ##### $color = $self->_color_role_to_index('dataset'.(1)); ##################### for $i ( 0 .. $self->{'num_datapoints'} - 1 ) { # don't try to draw anything if there's no data if ( defined( $data->[$j][$i] ) && $data->[$j][$i] <= $self->{'max_val'} && $data->[$j][$i] >= $self->{'min_val'} ) { # calculate the point $winkel = ( 180 - ( $data->[$n][$i] % 360 ) ) / 360 * 2 * $pi; if ( $self->false( $self->{'polar'} ) ) { $x = ceil( $centerX + sin($winkel) * ( $data->[$j][$i] - $mod ) * $map ); $y = ceil( $centerY + cos($winkel) * ( $data->[$j][$i] - $mod ) * $map ); } else { $x = ceil( $centerX + sin($winkel) * ( $mod - $data->[$j][$i] ) * $map ); $y = ceil( $centerY + cos($winkel) * ( $mod - $data->[$j][$i] ) * $map ); } # set the x and y values back if ( $i == 0 ) { $first_x = $x; $first_y = $y; $last_x = $x; $last_y = $y; } if ( $self->true( $self->{'point'} ) ) { $brush = $self->_prepare_brush( $color, 'point' ); $self->{'gd_obj'}->setBrush($brush); #draw the point $self->{'gd_obj'}->line( $x + 1, $y, $x, $y, gdBrushed ); } if ( $self->true( $self->{'line'} ) ) { $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #draw the line if ( defined $last_x ) { $self->{'gd_obj'}->line( $x, $y, $last_x, $last_y, gdBrushed ); } else { } } if ( $self->true( $self->{'arrow'} ) ) { $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #draw the arrow if ( $data->[$j][$i] > $self->{'min_val'} ) { $self->{'gd_obj'}->line( $x, $y, $centerX, $centerY, gdBrushed ); $arrow_x = $x - cos( $winkel - $alpha ) * $len; $arrow_y = $y + sin( $winkel - $alpha ) * $len; $self->{'gd_obj'}->line( $x, $y, $arrow_x, $arrow_y, gdBrushed ); $arrow_x = $x + sin( $pi / 2 - $winkel - $alpha ) * $len; $arrow_y = $y - cos( $pi / 2 - $winkel - $alpha ) * $len; $self->{'gd_obj'}->line( $x, $y, $arrow_x, $arrow_y, gdBrushed ); } } $last_x = $x; $last_y = $y; # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$j][$i] = [ $x, $y ]; } } # end if ( defined ... else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$j][$i] = [ undef(), undef() ]; } } } #end for $i # draw the last line to the first point if ( $self->true( $self->{'line'} ) ) { $self->{'gd_obj'}->line( $x, $y, $first_x, $first_y, gdBrushed ); } $n += 2; } # end for $j } # end if pairs # now outline it $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## @fn private int _prepare_brush($color,$type) # set the gdBrush object to trick GD into drawing fat lines # # # @param $color # @param $type # @return status sub _prepare_brush { my $self = shift; my $color = shift; my $type = shift; my ( $radius, @rgb, $brush, $white, $newcolor ); @rgb = $self->{'gd_obj'}->rgb($color); # get the appropriate brush size if ( $type eq 'line' ) { $radius = $self->{'brush_size'} / 2; } elsif ( $type eq 'point' ) { $radius = $self->{'pt_size'} / 2; } # create the new image $brush = GD::Image->new( $radius * 2, $radius * 2 ); # get the colors, make the background transparent $white = $brush->colorAllocate( 255, 255, 255 ); $newcolor = $brush->colorAllocate(@rgb); $brush->transparent($white); # draw the circle $brush->arc( $radius - 1, $radius - 1, $radius, $radius, 0, 360, $newcolor ); # fill it if we're using lines $brush->fill( $radius - 1, $radius - 1, $newcolor ); # set the new image as the main object's brush return $brush; } ## @fn private int _draw_legend() # let them know what all the pretty colors mean # @return status # # Overwrite corresponding function of Base # sub _draw_legend { my $self = shift; my $length; # check to see if legend type is none.. if ( $self->{'legend'} =~ /^none$/ ) { return 1; } # check to see if they have as many labels as datasets, # warn them if not if ( ( $#{ $self->{'legend_labels'} } >= 0 ) && ( ( scalar( @{ $self->{'legend_labels'} } ) ) != $self->{'num_datasets'} ) ) { carp "The number of legend labels and datasets doesn\'t match"; } # init a field to store the length of the longest legend label unless ( $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = 0; } # fill in the legend labels, find the longest one if ( $self->false( $self->{'pairs'} ) ) { for ( 1 .. $self->{'num_datasets'} ) { unless ( $self->{'legend_labels'}[ $_ - 1 ] ) { $self->{'legend_labels'}[ $_ - 1 ] = "Dataset $_"; } $length = length( $self->{'legend_labels'}[ $_ - 1 ] ); if ( $length > $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = $length; } } #end for } if ( $self->true( $self->{'pairs'} ) ) { for ( 1 .. ceil( $self->{'num_datasets'} / 2 ) ) { unless ( $self->{'legend_labels'}[ $_ - 1 ] ) { $self->{'legend_labels'}[ $_ - 1 ] = "Dataset $_"; } $length = length( $self->{'legend_labels'}[ $_ - 1 ] ); if ( $length > $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = $length; } } } # different legend types if ( $self->{'legend'} eq 'bottom' ) { $self->_draw_bottom_legend; } elsif ( $self->{'legend'} eq 'right' ) { $self->_draw_right_legend; } elsif ( $self->{'legend'} eq 'left' ) { $self->_draw_left_legend; } elsif ( $self->{'legend'} eq 'top' ) { $self->_draw_top_legend; } else { carp "I can't put a legend there (at " . $self->{'legend'} . ")\n"; } # and return return 1; } ## @fn private array _find_y_range() # Find minimum and maximum value of y data sets. # # @return ( min, max, flag_all_integers ) # # Overwrites corresponding Base function # sub _find_y_range { my $self = shift; my $data = $self->{'dataref'}; my $max = undef; my $min = undef; my $k = 1; my $dataset = 1; my $datum; if ( $self->false( $self->{'pairs'} ) ) { for $dataset ( @$data[ 1 .. $#$data ] ) { # print "dataset @$dataset\n"; for $datum (@$dataset) { if ( defined $datum ) { # Prettier, but probably slower: # $max = $datum unless defined $max && $max >= $datum; # $min = $datum unless defined $min && $min <= $datum; if ( defined $max ) { if ( $datum > $max ) { $max = $datum; } elsif ( $datum < $min ) { $min = $datum; } } else { $min = $max = $datum; } } #endif defined } # end for } } if ( $self->true( $self->{'pairs'} ) ) { # only every second dataset must be checked for $dataset ( @$data[$k] ) { for $datum (@$dataset) { if ( defined $datum ) { # Prettier, but probably slower: # $max = $datum unless defined $max && $max >= $datum; # $min = $datum unless defined $min && $min <= $datum; if ( defined $max ) { if ( $datum > $max ) { $max = $datum; } elsif ( $datum < $min ) { $min = $datum; } } else { $min = $max = $datum; } } } $k += 2; } } ( $min, $max ); } ## be a good module and return 1 1; Chart-2.4.6/Chart/Composite.pm0000644000175000017500000013607212033071313015461 0ustar reinerreiner## @file # Implementation of Chart::Composite # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # #--------------------------------------------------------------------- # History: #---------- ## @class Chart::Composite # Composite class derived from class Base.\n # This class provides all functions which are specific to # composite charts package Chart::Composite; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Composite::ISA = qw(Chart::Base); $Chart::Composite::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @method int set(%opts) # @param[in] %opts Hash of options to the Chart # @return ok or croak # # @brief # Set all options # # @details # Overwrite the set function of class Base to pass # options to the sub-objects later sub set { my $self = shift; my %opts = @_; # basic error checking on the options, just warn 'em unless ( $#_ % 2 ) { carp "Whoops, some option to be set didn't have a value.\n", "You might want to look at that.\n"; } # store the options they gave us unless ( $self->{'opts'} ) { $self->{'opts'} = {}; } # now set 'em for ( keys %opts ) { $self->{$_} = $opts{$_}; $self->{'opts'}{$_} = $opts{$_}; } # now return return; } ## @fn imagemap_dump() # @brief # Overwrite function imagemap_dump of base class # # @details # Get the information to turn the chart into an imagemap # had to override it to reassemble the \@data array correctly # # @return Reference to an array of the image sub imagemap_dump { my $self = shift; my ( $i, $j ); my @map; my $dataset_count = 0; # croak if they didn't ask me to remember the data, or if they're asking # for the data before I generate it unless ( ( $self->true( $self->{'imagemap'} ) ) && $self->{'imagemap_data'} ) { croak "You need to set the imagemap option to true, and then call the png method, before you can get the imagemap data"; } #make a copy of the imagemap data #this is the data of the first component for $i ( 1 .. $#{ $self->{'sub_0'}->{'imagemap_data'} } ) { for $j ( 0 .. $#{ $self->{'sub_0'}->{'imagemap_data'}->[$i] } ) { $map[$i][$j] = \@{ $self->{'sub_0'}->{'imagemap_data'}->[$i][$j] }; } $dataset_count++; } #and add the data of the second component for $i ( 1 .. $#{ $self->{'sub_1'}->{'imagemap_data'} } ) { for $j ( 0 .. $#{ $self->{'sub_1'}->{'imagemap_data'}->[$i] } ) { $map[ $i + $dataset_count ][$j] = \@{ $self->{'sub_1'}->{'imagemap_data'}->[$i][$j] }; } } # return their copy return \@map; } # private routine sub __print_array { my @a = @_; my $i; my $li = $#a; $li++; print STDERR "Anzahl der Elemente = $li\n"; $li--; for ( $i = 0 ; $i <= $li ; $i++ ) { print STDERR "\t$i\t$a[$i]\n"; } } #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private int _check_data # Overwrite _check_data of Chart::Base and check the internal data to be displayed. # # Make sure the data isn't really weird # and collect some basic info about it\n # @return status of check sub _check_data { my $self = shift; my $length = 0; # first things first, make sure we got the composite_info unless ( ( $self->{'composite_info'} ) && ( $#{ $self->{'composite_info'} } == 1 ) ) { croak "Chart::Composite needs to be told what kind of components to use"; } # make sure we don't end up dividing by zero if they ask for # just one y_tick if ( $self->{'y_ticks'} == 1 ) { $self->{'y_ticks'} = 2; carp "The number of y_ticks displayed must be at least 2"; } # remember the number of datasets $self->{'num_datasets'} = $#{ $self->{'dataref'} }; # remember the number of points in the largest dataset $self->{'num_datapoints'} = 0; for ( 0 .. $self->{'num_datasets'} ) { if ( scalar( @{ $self->{'dataref'}[$_] } ) > $self->{'num_datapoints'} ) { $self->{'num_datapoints'} = scalar( @{ $self->{'dataref'}[$_] } ); } } # find the longest x-tick label, and remember how long it is for ( @{ $self->{'dataref'}[0] } ) { if ( length($_) > $length ) { $length = length($_); } } $self->{'x_tick_label_length'} = $length; # now split the data into sub-objects $self->_split_data; return; } ## @fn private _split_data # split data to the composited classes # # create sub-objects for each type, store the appropriate # data sets in each one, and stick the correct values into # them (ie. 'gd_obj'); sub _split_data { my $self = shift; my @types = ( $self->{'composite_info'}[0][0], $self->{'composite_info'}[1][0] ); my ( $ref, $i, $j ); # Already checked for number of components in _check_data, above. # we can only do two at a time # if ($self->{'composite_info'}[2]) { # croak "Sorry, Chart::Composite can only do two chart types at a time"; # } # load the individual modules require "Chart/" . $types[0] . ".pm"; require "Chart/" . $types[1] . ".pm"; # create the sub-objects $self->{'sub_0'} = ( "Chart::" . $types[0] )->new(); $self->{'sub_1'} = ( "Chart::" . $types[1] )->new(); # set the options (set the min_val, max_val, brush_size, y_ticks, # # options intelligently so that the sub-objects don't get # confused) $self->{'sub_0'}->set( %{ $self->{'opts'} } ); $self->{'sub_1'}->set( %{ $self->{'opts'} } ); if ( defined( $self->{'opts'}{'min_val1'} ) ) { $self->{'sub_0'}->set( 'min_val' => $self->{'opts'}{'min_val1'} ); } if ( defined( $self->{'opts'}{'max_val1'} ) ) { $self->{'sub_0'}->set( 'max_val' => $self->{'opts'}{'max_val1'} ); } if ( defined( $self->{'opts'}{'min_val2'} ) ) { $self->{'sub_1'}->set( 'min_val' => $self->{'opts'}{'min_val2'} ); } if ( defined( $self->{'opts'}{'max_val2'} ) ) { $self->{'sub_1'}->set( 'max_val' => $self->{'opts'}{'max_val2'} ); } if ( $self->{'opts'}{'y_ticks1'} ) { $self->{'sub_0'}->set( 'y_ticks' => $self->{'opts'}{'y_ticks1'} ); } if ( $self->{'opts'}{'y_ticks2'} ) { $self->{'sub_1'}->set( 'y_ticks' => $self->{'opts'}{'y_ticks2'} ); } if ( $self->{'opts'}{'brush_size1'} ) { $self->{'sub_0'}->set( 'brush_size' => $self->{'opts'}{'brush_size1'} ); } if ( $self->{'opts'}{'brush_size2'} ) { $self->{'sub_1'}->set( 'brush_size' => $self->{'opts'}{'brush_size2'} ); } if ( $self->{'opts'}{'brushStyle1'} ) { $self->{'sub_0'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle1'} ); } if ( $self->{'opts'}{'brushStyle2'} ) { $self->{'sub_1'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle2'} ); } # f_y_tick for left and right axis if ( defined( $self->{'opts'}{'f_y_tick1'} ) ) { $self->{'sub_0'}->set( 'f_y_tick' => $self->{'opts'}{'f_y_tick1'} ); } if ( defined( $self->{'opts'}{'f_y_tick2'} ) ) { $self->{'sub_1'}->set( 'f_y_tick' => $self->{'opts'}{'f_y_tick2'} ); } # replace the gd_obj fields $self->{'sub_0'}->{'gd_obj'} = $self->{'gd_obj'}; $self->{'sub_1'}->{'gd_obj'} = $self->{'gd_obj'}; # let the sub-objects know they're sub-objects $self->{'sub_0'}->{'component'} = 'true'; $self->{'sub_1'}->{'component'} = 'true'; # give each sub-object its data $self->{'component_datasets'} = []; for $i ( 0 .. 1 ) { $ref = []; $self->{'component_datasets'}[$i] = $self->{'composite_info'}[$i][1]; push @{$ref}, $self->{'dataref'}[0]; for $j ( @{ $self->{'composite_info'}[$i][1] } ) { $self->_color_role_to_index( 'dataset' . ( $j - 1 ) ); # allocate color index push @{$ref}, $self->{'dataref'}[$j]; } $self->{ 'sub_' . $i }->_copy_data($ref); } # and let them check it $self->{'sub_0'}->_check_data; $self->{'sub_1'}->_check_data; # realign the y-axes if they want if ( $self->true( $self->{'same_y_axes'} ) ) { if ( $self->{'sub_0'}{'min_val'} < $self->{'sub_1'}{'min_val'} ) { $self->{'sub_1'}{'min_val'} = $self->{'sub_0'}{'min_val'}; } else { $self->{'sub_0'}{'min_val'} = $self->{'sub_1'}{'min_val'}; } if ( $self->{'sub_0'}{'max_val'} > $self->{'sub_1'}{'max_val'} ) { $self->{'sub_1'}{'max_val'} = $self->{'sub_0'}{'max_val'}; } else { $self->{'sub_0'}{'max_val'} = $self->{'sub_1'}{'max_val'}; } $self->{'sub_0'}->_check_data; $self->{'sub_1'}->_check_data; } # find out how big the y-tick labels will be from sub_0 and sub_1 $self->{'y_tick_label_length1'} = $self->{'sub_0'}->{'y_tick_label_length'}; $self->{'y_tick_label_length2'} = $self->{'sub_1'}->{'y_tick_label_length'}; # now return return; } ## @fn private int _draw_legend() # let the user know what all the pretty colors mean # @return status # sub _draw_legend { my $self = shift; my ($length); # check to see if they have as many labels as datasets, # warn them if not if ( ( $#{ $self->{'legend_labels'} } >= 0 ) && ( ( scalar( @{ $self->{'legend_labels'} } ) ) != $self->{'num_datasets'} ) ) { carp "The number of legend labels and datasets doesn\'t match"; } # init a field to store the length of the longest legend label unless ( $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = 0; } # fill in the legend labels, find the longest one for ( 1 .. $self->{'num_datasets'} ) { unless ( $self->{'legend_labels'}[ $_ - 1 ] ) { $self->{'legend_labels'}[ $_ - 1 ] = "Dataset $_"; } $length = length( $self->{'legend_labels'}[ $_ - 1 ] ); if ( $length > $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = $length; } } # different legend types if ( $self->{'legend'} eq 'bottom' ) { $self->_draw_bottom_legend; } elsif ( $self->{'legend'} eq 'right' ) { $self->_draw_right_legend; } elsif ( $self->{'legend'} eq 'left' ) { $self->_draw_left_legend; } elsif ( $self->{'legend'} eq 'top' ) { $self->_draw_top_legend; } elsif ( $self->{'legend'} eq 'none' ) { $self->_draw_none_legend; } else { carp "I can't put a legend there\n"; } # and return return 1; } ## @fn private int _draw_top_legend() # put the legend on the top of the data plot # # Overwrite the base class _draw_top_legend # # @return status sub _draw_top_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $y1, $x2, $y2, $empty_width, $max_label_width ); my ( $cols, $rows, $color ); my ( $col_width, $row_height, $i, $j, $r, $c, $index, $x, $y, $sub, $w, $h ); my ( $yh, $yi ); # for boxing legends my $font = $self->{'legend_font'}; my ( %colors, @datasets ); my $max_legend_example = 0; $yh = 0; # copy the current boundaries into the sub-objects $self->_sub_update; # init the legend_example_height $self->_legend_example_height_init; ## Make datasetI numbers match indexes of @{ $self->{'dataref'} }[1.....]. # # modify the dataset color table entries to avoid duplicating # # dataset colors (this limits the number of possible data sets # # for each component to 8) # for (0..7) { # $self->{'sub_1'}{'color_table'}{'dataset'.$_} # = $self->{'color_table'}{'dataset'.($_+8)}; # } # modify the dataset color table entries to avoid duplicating # dataset colors. my ( $n0, $n1 ) = map { scalar @{ $self->{'composite_info'}[$_][1] } } 0 .. 1; for ( 0 .. $n1 - 1 ) { $self->{'sub_1'}{'color_table'}{ 'dataset' . $_ } = $self->{'color_table'}{ 'dataset' . ( $_ + $n0 ) }; } # make sure we use the right colors for the legend @datasets = @{ $self->{'composite_info'}[0][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ($i) }; $i++; } @datasets = @{ $self->{'composite_info'}[1][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ( $i + $n0 ) }; $i++; } # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get some base x coordinates $x1 = $self->{'curr_x_min'} + $self->{'graph_border'} + $self->{'y_tick_label_length1'} * $self->{'tick_label_font'}->width + $self->{'tick_len'} + ( 3 * $self->{'text_space'} ); $x2 = $self->{'curr_x_max'} - $self->{'graph_border'} - $self->{'y_tick_label_length2'} * $self->{'tick_label_font'}->width - $self->{'tick_len'} - ( 3 * $self->{'text_space'} ); if ( $self->{'y_label'} ) { $x1 += $self->{'label_font'}->height + 2 * $self->{'text_space'}; } if ( $self->{'y_label2'} ) { $x2 -= $self->{'label_font'}->height + 2 * $self->{'text_space'}; } # figure out how wide the widest label is, then figure out how many # columns we can fit into the allotted space $empty_width = $x2 - $x1 - ( 2 * $self->{'legend_space'} ); $max_label_width = $self->{'max_legend_label'} * $self->{'legend_font'}->width + 4 * $self->{'text_space'} + $self->{'legend_example_size'}; $cols = int( $empty_width / $max_label_width ); unless ($cols) { $cols = 1; } $col_width = $empty_width / $cols; # figure out how many rows we need and how tall they are $rows = int( $self->{'num_datasets'} / $cols ); unless ( ( $self->{'num_datasets'} % $cols ) == 0 ) { $rows++; } unless ($rows) { $rows = 1; } $row_height = $h + $self->{'text_space'}; # box the legend off $y1 = $self->{'curr_y_min'}; $y2 = $self->{'curr_y_min'} + $self->{'text_space'} + ( $rows * $row_height ) + ( 2 * $self->{'legend_space'} ); $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $self->_color_role_to_index('misc') ); $max_legend_example = $y2 - $y1; # leave some space inside the legend $x1 += $self->{'legend_space'} + $self->{'text_space'}; $x2 -= $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; $y2 -= $self->{'legend_space'} + $self->{'text_space'}; # draw in the actual legend $r = 0; # current row $c = 0; # current column $yi = 0; # current dataset for $i ( 0 .. 1 ) { for $j ( 0 .. $#{ $self->{'component_datasets'}[$i] } ) { # get the color $color = $self->{ 'sub_' . $i }->{'color_table'}{ 'dataset' . $j }; $index = $self->{'component_datasets'}[$i][$j] - 1; # index in label list # find the x-y coordinates for the beginning of the example line $x = $x1 + ( $col_width * $c ); $y = $y1 + ( $row_height * $r ) + $h / 2; # draw the example line if legend_example_height==1 or ==0 if ( $rows == 1 ) { if ( $self->{ 'legend_example_height' . $yi } < $max_legend_example ) { $yh = $self->{ 'legend_example_height' . $yi }; } else { $yh = $max_legend_example; } } else { if ( $self->{ 'legend_example_height' . $yi } < $row_height ) { $yh = $self->{ 'legend_example_height' . $yi }; } else { $yh = $row_height; } } $yi++; if ( $yh <= 1 ) { $self->{'gd_obj'}->line( $x, $y, $x + $self->{'legend_example_size'}, $y, $color ); } else { # draw the example bar if legend_example_height > 1 $yh = int( $yh / 2 ); $self->{'gd_obj'}->filledRectangle( $x, $y - $yh, $x + $self->{'legend_example_size'}, $y + $yh, $color ); } # find the x-y coordinates for the beginning of the label $x += $self->{'legend_example_size'} + 2 * $self->{'text_space'}; $y -= $h / 2; # now draw the label $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color ); # keep track of which row/column we're using $r = ( $r + 1 ) % $rows; if ( $r == 0 ) { $c++; } } } # mark of the space used $self->{'curr_y_min'} += $rows * $row_height + $self->{'text_space'} + 2 * $self->{'legend_space'}; return; } ## @fn private int _draw_right_legend() # put the legend on the right of the chart # # Overwrite the base class _draw_right_legend # # @return status sub _draw_right_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h ); my ($yh) = 0; # for boxing legend my $font = $self->{'legend_font'}; my ( %colors, @datasets, $i ); my $max_legend_example = 0; # copy the current boundaries and colors into the sub-objects $self->_sub_update; # init the legend exapmle height $self->_legend_example_height_init; # # modify the dataset color table entries to avoid duplicating # # dataset colors (this limits the number of possible data sets # # for each component to 8) # for (0..7) { # $self->{'sub_1'}{'color_table'}{'dataset'.$_} # = $self->{'color_table'}{'dataset'.($_+8)}; # } # modify the dataset color table entries to avoid duplicating # dataset colors. my ( $n0, $n1 ) = map { scalar @{ $self->{'composite_info'}[$_][1] } } 0 .. 1; for ( 0 .. $n1 - 1 ) { $self->{'sub_1'}{'color_table'}{ 'dataset' . $_ } = $self->{'color_table'}{ 'dataset' . ( $_ + $n0 ) }; } # make sure we use the right colors for the legend @datasets = @{ $self->{'composite_info'}[0][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ($_) }; $i++; } @datasets = @{ $self->{'composite_info'}[1][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ( $i + $n0 ) }; $i++; } # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # box the thing off $x1 = $self->{'curr_x_max'} - $width; $x2 = $self->{'curr_x_max'}; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datasets'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color $color = $colors{$_}; # find the max_legend_example $max_legend_example = $self->{'legend_space'} + $h; # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # draw the example line if legend_example_height==1 or ==0 if ( $self->{ 'legend_example_height' . $_ } < $max_legend_example ) { $yh = $self->{ 'legend_example_height' . $_ }; } else { $yh = $max_legend_example; } if ( $yh <= 1 ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); } else { $yh = int( $yh / 2 ); $self->{'gd_obj'}->filledRectangle( $x2, $y2 - $yh, $x3, $y2 + $yh, $color ); } # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } # mark off the used space $self->{'curr_x_max'} -= $width; # and return return; } ## @fn private int _draw_left_legend() # draw the legend at the left of the data plot # # Overwrite the base class _draw_left_legend # # @return status sub _draw_left_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h ); my $yh; # for boxing legend my $font = $self->{'legend_font'}; my ( %colors, @datasets, $i ); my $max_legend_example = 0; # copy the current boundaries and colors into the sub-objects $self->_sub_update; # init the legend_example height $self->_legend_example_height_init; # # modify the dataset color table entries to avoid duplicating # # dataset colors (this limits the number of possible data sets # # for each component to 8) # for (0..7) { # $self->{'sub_1'}{'color_table'}{'dataset'.$_} # = $self->{'color_table'}{'dataset'.($_+8)}; # } # modify the dataset color table entries to avoid duplicating # dataset colors. my ( $n0, $n1 ) = map { scalar @{ $self->{'composite_info'}[$_][1] } } 0 .. 1; for ( 0 .. $n1 - 1 ) { $self->{'sub_1'}{'color_table'}{ 'dataset' . $_ } = $self->{'color_table'}{ 'dataset' . ( $_ + $n0 ) }; } # make sure we use the right colors for the legend @datasets = @{ $self->{'composite_info'}[0][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ($i) }; $i++; } @datasets = @{ $self->{'composite_info'}[1][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ( $i + $n0 ) }; $i++; } # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some base x-y coordinates $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} + $width; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datasets'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color $color = $colors{$_}; # find the max_legend_example $max_legend_example = $self->{'legend_space'} + $h; # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # draw the example line if legend_example_height==1 or ==0 if ( $self->{ 'legend_example_height' . $_ } < $max_legend_example ) { $yh = $self->{ 'legend_example_height' . $_ }; } else { $yh = $max_legend_example; } if ( $yh <= 1 ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); } else { # draw the example bar if legend_example_height > 1 $yh = int( $yh / 2 ); $self->{'gd_obj'}->filledRectangle( $x2, $y2 - $yh, $x3, $y2 + $yh, $color ); } # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } # mark off the used space $self->{'curr_x_min'} += $width; # and return return 1; } ## @fn private int _draw_bottom_legend() # put the legend on the bottom of the chart # # Overwrite the base class _draw_bottom_legend # # @return status sub _draw_bottom_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $y1, $x2, $y2, $empty_width, $max_label_width, $cols, $rows, $color ); my ( $col_width, $row_height, $i, $j, $r, $c, $index, $x, $y, $sub, $w, $h ); my ( $yh, $yi ); # for boxing legend my $font = $self->{'legend_font'}; my ( %colors, @datasets ); my $max_legend_example = 0; $yh = 0; # copy the current boundaries and colors into the sub-objects $self->_sub_update; # init the legend example height $self->_legend_example_height_init; # # modify the dataset color table entries to avoid duplicating # # dataset colors (this limits the number of possible data sets # # for each component to 8) # for (0..7) { # $self->{'sub_1'}{'color_table'}{'dataset'.$_} # = $self->{'color_table'}{'dataset'.($_+8)}; # } # modify the dataset color table entries to avoid duplicating # dataset colors. my ( $n0, $n1 ) = map { scalar @{ $self->{'composite_info'}[$_][1] } } 0 .. 1; for ( 0 .. $n1 - 1 ) { $self->{'sub_1'}{'color_table'}{ 'dataset' . $_ } = $self->{'color_table'}{ 'dataset' . ( $_ + $n0 ) }; } @datasets = @{ $self->{'composite_info'}[0][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ($i) }; $i++; } @datasets = @{ $self->{'composite_info'}[1][1] }; $i = 0; for ( 0 .. $#datasets ) { $colors{ $datasets[$_] - 1 } = $self->{'color_table'}{ 'dataset' . ( $i + $n0 ) }; $i++; } # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # figure out how many columns we can fit $x1 = $self->{'curr_x_min'} + $self->{'graph_border'} + $self->{'y_tick_label_length1'} * $self->{'tick_label_font'}->width + $self->{'tick_len'} + ( 3 * $self->{'text_space'} ); $x2 = $self->{'curr_x_max'} - $self->{'graph_border'} - $self->{'y_tick_label_length2'} * $self->{'tick_label_font'}->width - $self->{'tick_len'} - ( 3 * $self->{'text_space'} ); if ( $self->{'y_label'} ) { $x1 += $self->{'label_font'}->height + 2 * $self->{'text_space'}; } if ( $self->{'y_label2'} ) { $x2 -= $self->{'label_font'}->height + 2 * $self->{'text_space'}; } $empty_width = $x2 - $x1 - ( 2 * $self->{'legend_space'} ); $max_label_width = $self->{'max_legend_label'} * $self->{'legend_font'}->width + 4 * $self->{'text_space'} + $self->{'legend_example_size'}; $cols = int( $empty_width / $max_label_width ); unless ($cols) { $cols = 1; } $col_width = $empty_width / $cols; # figure out how many rows we need $rows = int( $self->{'num_datasets'} / $cols ); unless ( ( $self->{'num_datasets'} % $cols ) == 0 ) { $rows++; } unless ($rows) { $rows = 1; } $row_height = $h + $self->{'text_space'}; # box it off $y1 = $self->{'curr_y_max'} - $self->{'text_space'} - ( $rows * $row_height ) - ( 2 * $self->{'legend_space'} ); $y2 = $self->{'curr_y_max'}; $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $self->_color_role_to_index('misc') ); # get the max_legend_example_height $max_legend_example = $y2 - $y1; $x1 += $self->{'legend_space'} + $self->{'text_space'}; $x2 -= $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; $y2 -= $self->{'legend_space'} + $self->{'text_space'}; # draw in the actual legend $r = 0; $c = 0; $yi = 0; # current dataset for $i ( 0 .. 1 ) { for $j ( 0 .. $#{ $self->{'component_datasets'}[$i] } ) { $color = $self->{ 'sub_' . $i }->{'color_table'}{ 'dataset' . $j }; $index = $self->{'component_datasets'}[$i][$j] - 1; $x = $x1 + ( $col_width * $c ); $y = $y1 + ( $row_height * $r ) + $h / 2; # draw the example line if legend_example_height==1 or ==0 if ( $rows == 1 ) { if ( $self->{ 'legend_example_height' . $yi } < $max_legend_example ) { $yh = $self->{ 'legend_example_height' . $yi }; } else { $yh = $max_legend_example; } } else { if ( $self->{ 'legend_example_height' . $yi } < $row_height ) { $yh = $self->{ 'legend_example_height' . $yi }; } else { $yh = $row_height; } } $yi++; if ( $yh <= 1 ) { $self->{'gd_obj'}->line( $x, $y, $x + $self->{'legend_example_size'}, $y, $color ); } else { # draw the example bar if legend_example_height > 1 $yh = int( $yh / 2 ); $self->{'gd_obj'}->filledRectangle( $x, $y - $yh, $x + $self->{'legend_example_size'}, $y + $yh, $color ); } $x += $self->{'legend_example_size'} + 2 * $self->{'text_space'}; $y -= $h / 2; $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color ); # keep track of which row/column we're using $r = ( $r + 1 ) % $rows; if ( $r == 0 ) { $c++; } } } # mark of the space used $self->{'curr_y_max'} -= ( $rows * $row_height ) + 2 * $self->{'text_space'} + 2 * $self->{'legend_space'}; return; } ## @fn private int _draw_none_legend() # no legend to draw.. just update the color tables for subs # # This routine overwrites this function of the Base class # # @return status sub _draw_none_legend { my $self = shift; my $status = 1; $self->_sub_update(); # for (0..7) { # $self->{'sub_1'}{'color_table'}{'dataset'.$_} # = $self->{'color_table'}{'dataset'.($_+8)}; # } # modify the dataset color table entries to avoid duplicating # dataset colors. my ( $n0, $n1 ) = map { scalar @{ $self->{'composite_info'}[$_][1] } } 0 .. 1; for ( 0 .. $n1 - 1 ) { $self->{'sub_1'}{'color_table'}{ 'dataset' . $_ } = $self->{'color_table'}{ 'dataset' . ( $_ + $n0 ) }; } return $status; } ## @fn private int _draw_ticks() # draw the ticks and tick labels # # Overwrites function _draw_ticks() of base class # # @return status sub _draw_ticks { my $self = shift; #draw the x ticks again if ( $self->true( $self->{'xy_plot'} ) ) { $self->_draw_x_number_ticks; } else { $self->_draw_x_ticks; } # update the boundaries in the sub-objects $self->_boundary_update( $self, $self->{'sub_0'} ); $self->_boundary_update( $self, $self->{'sub_1'} ); # now the y ticks $self->_draw_y_ticks; # then return return; } ## @fn private int _draw_x_ticks() # draw the x-ticks and their labels # # Overwrites function _draw_x_ticks() of base class # # @return status sub _draw_x_ticks { my $self = shift; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my ( $h, $w ); my ( $x1, $x2, $y1, $y2 ); my ( $width, $delta ); my ($stag); $self->{'grid_data'}->{'x'} = []; # make sure we got a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn\'t a GD Font object"; } # get the height and width of the font ( $h, $w ) = ( $font->height, $font->width ); # allow for the amount of space the y-ticks will push the # axes over to the right and to the left ## _draw_y_ticks allows 3 * text_space, not 2 * ; this caused mismatch between ## the ticks (and grid lines) and the data. # $x1 = $self->{'curr_x_min'} + ($w * $self->{'y_tick_label_length1'}) # + (2 * $self->{'text_space'}) + $self->{'tick_len'}; # $x2 = $self->{'curr_x_max'} - ($w * $self->{'y_tick_label_length2'}) # - (2 * $self->{'text_space'}) - $self->{'tick_len'}; $x1 = $self->{'curr_x_min'} + ( $w * $self->{'y_tick_label_length1'} ) + ( 3 * $self->{'text_space'} ) + $self->{'tick_len'}; $x2 = $self->{'curr_x_max'} - ( $w * $self->{'y_tick_label_length2'} ) - ( 3 * $self->{'text_space'} ) - $self->{'tick_len'}; $y1 = $self->{'curr_y_max'} - $h - $self->{'text_space'}; # get the delta value, figure out how to draw the labels $width = $x2 - $x1; $delta = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); if ( $delta <= ( $self->{'x_tick_label_length'} * $w ) ) { unless ( $self->{'x_ticks'} =~ /^vertical$/i ) { $self->{'x_ticks'} = 'staggered'; } } # now draw the labels if ( $self->{'x_ticks'} =~ /^normal$/i ) { # normal ticks if ( $self->{'skip_x_ticks'} ) { for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ) - ( $w * length( $self->{'f_x_tick'}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) ) / 2; $self->{'gd_obj'} ->string( $font, $x2, $y1, $self->{'f_x_tick'}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ), $textcolor ); } } elsif ( $self->{'custom_x_ticks'} ) { for ( @{ $self->{'custom_x_ticks'} } ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length( $self->{'f_x_tick'}->( $data->[0][$_] ) ) ) / 2; $self->{'gd_obj'}->string( $font, $x2, $y1, $self->{'f_x_tick'}->( $data->[0][$_] ), $textcolor ); } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length( $self->{'f_x_tick'}->( $data->[0][$_] ) ) ) / 2; $self->{'gd_obj'}->string( $font, $x2, $y1, $self->{'f_x_tick'}->( $data->[0][$_] ), $textcolor ); } } } elsif ( $self->{'x_ticks'} =~ /^staggered$/i ) { # staggered ticks if ( $self->{'skip_x_ticks'} ) { $stag = 0; for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ) - ( $w * length( $self->{'f_x_tick'}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) ) / 2; if ( ( $stag % 2 ) == 1 ) { $y1 -= $self->{'text_space'} + $h; } $self->{'gd_obj'} ->string( $font, $x2, $y1, $self->{'f_x_tick'}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ), $textcolor ); if ( ( $stag % 2 ) == 1 ) { $y1 += $self->{'text_space'} + $h; } $stag++; } } elsif ( $self->{'custom_x_ticks'} ) { $stag = 0; for ( sort ( @{ $self->{'custom_x_ticks'} } ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length( $self->{'f_x_tick'}->( $data->[0][$_] ) ) ) / 2; if ( ( $stag % 2 ) == 1 ) { $y1 -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x2, $y1, $self->{'f_x_tick'}->( $data->[0][$_] ), $textcolor ); if ( ( $stag % 2 ) == 1 ) { $y1 += $self->{'text_space'} + $h; } $stag++; } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - ( $w * length( $self->{'f_x_tick'}->( $data->[0][$_] ) ) ) / 2; if ( ( $_ % 2 ) == 1 ) { $y1 -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x2, $y1, $self->{'f_x_tick'}->( $data->[0][$_] ), $textcolor ); if ( ( $_ % 2 ) == 1 ) { $y1 += $self->{'text_space'} + $h; } } } } elsif ( $self->{'x_ticks'} =~ /^vertical$/i ) { # vertical ticks $y1 = $self->{'curr_y_max'} - $self->{'text_space'}; if ( defined( $self->{'skip_x_ticks'} ) && $self->{'skip_x_ticks'} > 1 ) { for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ) - $h / 2; $y2 = $y1 - ( ( $self->{'x_tick_label_length'} - length( $self->{'f_x_tick'}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ) ) ) * $w ); $self->{'gd_obj'} ->stringUp( $font, $x2, $y2, $self->{'f_x_tick'}->( $data->[0][ $_ * $self->{'skip_x_ticks'} ] ), $textcolor ); } } elsif ( $self->{'custom_x_ticks'} ) { for ( @{ $self->{'custom_x_ticks'} } ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - $h / 2; $y2 = $y1 - ( ( $self->{'x_tick_label_length'} - length( $self->{'f_x_tick'}->( $data->[0][$_] ) ) ) * $w ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $self->{'f_x_tick'}->( $data->[0][$_] ), $textcolor ); } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ) - $h / 2; $y2 = $y1 - ( ( $self->{'x_tick_label_length'} - length( $self->{'f_x_tick'}->( $data->[0][$_] ) ) ) * $w ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $self->{'f_x_tick'}->( $data->[0][$_] ), $textcolor ); } } } else { # error time carp "I don't understand the type of x-ticks you specified"; } # update the current y-max value if ( $self->{'x_ticks'} =~ /^normal$/i ) { $self->{'curr_y_max'} -= $h + ( 2 * $self->{'text_space'} ); } elsif ( $self->{'x_ticks'} =~ /^staggered$/i ) { $self->{'curr_y_max'} -= ( 2 * $h ) + ( 3 * $self->{'text_space'} ); } elsif ( $self->{'x_ticks'} =~ /^vertical$/i ) { $self->{'curr_y_max'} -= ( $w * $self->{'x_tick_label_length'} ) + ( 2 * $self->{'text_space'} ); } # now plot the ticks $y1 = $self->{'curr_y_max'}; $y2 = $self->{'curr_y_max'} - $self->{'tick_len'}; if ( $self->{'skip_x_ticks'} ) { for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_x_ticks'} ) ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * ( $_ * $self->{'skip_x_ticks'} ) ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } elsif ( $self->{'custom_x_ticks'} ) { for ( @{ $self->{'custom_x_ticks'} } ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } else { for ( 0 .. $self->{'num_datapoints'} - 1 ) { $x2 = $x1 + ( $delta / 2 ) + ( $delta * $_ ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } } # update the current y-max value $self->{'curr_y_max'} -= $self->{'tick_len'}; # and return return; } ## @fn private int _draw_y_ticks() # draw the y-ticks and their labels # # Overwrites function _draw_y_ticks() of base class # # @return status sub _draw_y_ticks { my $self = shift; # let the first guy do his $self->{'sub_0'}->_draw_y_ticks('left'); # and update the other two objects $self->_boundary_update( $self->{'sub_0'}, $self ); $self->_boundary_update( $self->{'sub_0'}, $self->{'sub_1'} ); # now draw the other ones $self->{'sub_1'}->_draw_y_ticks('right'); # and update the other two objects $self->_boundary_update( $self->{'sub_1'}, $self ); $self->_boundary_update( $self->{'sub_1'}, $self->{'sub_0'} ); # then return return; } ## @fn private _draw_data # finally get around to plotting the data for composite chart sub _draw_data { my $self = shift; # do a grey background if they want it if ( $self->true( $self->{'grey_background'} ) ) { $self->_grey_background; $self->{'sub_0'}->{'grey_background'} = 'false'; $self->{'sub_1'}->{'grey_background'} = 'false'; } # draw grid again if necessary (if grey background ruined it..) unless ( !$self->true( $self->{grey_background} ) ) { $self->_draw_grid_lines if ( $self->true( $self->{grid_lines} ) ); $self->_draw_x_grid_lines if ( $self->true( $self->{x_grid_lines} ) ); $self->_draw_y_grid_lines if ( $self->true( $self->{y_grid_lines} ) ); $self->_draw_y2_grid_lines if ( $self->true( $self->{y2_grid_lines} ) ); } # do a final bounds update $self->_boundary_update( $self, $self->{'sub_0'} ); $self->_boundary_update( $self, $self->{'sub_1'} ); # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # now let the component modules go to work $self->{'sub_0'}->_draw_data; $self->{'sub_1'}->_draw_data; return; } ## @fn private _sub_update() # update all the necessary information in the sub-objects # # Only for Chart::Composite sub _sub_update { my $self = shift; my $sub0 = $self->{'sub_0'}; my $sub1 = $self->{'sub_1'}; # update the boundaries $self->_boundary_update( $self, $sub0 ); $self->_boundary_update( $self, $sub1 ); # copy the color tables $sub0->{'color_table'} = { %{ $self->{'color_table'} } }; $sub1->{'color_table'} = { %{ $self->{'color_table'} } }; # now return return; } ## @fn private _boundary_update() # copy the current gd_obj boundaries from one object to another # # Only for Chart::Composite sub _boundary_update { my $self = shift; my $from = shift; my $to = shift; $to->{'curr_x_min'} = $from->{'curr_x_min'}; $to->{'curr_x_max'} = $from->{'curr_x_max'}; $to->{'curr_y_min'} = $from->{'curr_y_min'}; $to->{'curr_y_max'} = $from->{'curr_y_max'}; return; } ## @fn private int _draw_y_grid_lines() # draw grid_lines for y # # Overwrites this function of Base sub _draw_y_grid_lines { my ($self) = shift; $self->{'sub_0'}->_draw_y_grid_lines(); return; } ## @fn private int _draw_y2_grid_lines() # draw grid_lines for y # # Overwrites this function of Base sub _draw_y2_grid_lines { my ($self) = shift; $self->{'sub_1'}->_draw_y2_grid_lines(); return; } ## @fn private _legend_example_height_values # init the legend_example_height_values # sub _legend_example_height_init { my $self = shift; my $a = $self->{'num_datasets'}; my ( $b, $e ) = ( 0, 0 ); my $bis = '..'; if ( $self->false( $self->{'legend_example_height'} ) ) { for my $i ( 0 .. $a ) { $self->{ 'legend_example_height' . $i } = 1; } } if ( $self->true( $self->{'legend_example_height'} ) ) { for my $i ( 0 .. $a ) { if ( defined( $self->{ 'legend_example_height' . $i } ) ) { } else { ( $self->{ 'legend_example_height' . $i } ) = 1; } } for $b ( 0 .. $a ) { for $e ( 0 .. $a ) { my $anh = sprintf( $b . $bis . $e ); if ( defined( $self->{ 'legend_example_height' . $anh } ) ) { if ( $b > $e ) { croak "Please reverse the datasetnumber in legend_example_height\n"; } for ( my $n = $b ; $n <= $e ; $n++ ) { $self->{ 'legend_example_height' . $n } = $self->{ 'legend_example_height' . $anh }; } } } } } } ## be a good module and return 1 1; Chart-2.4.6/Chart/ErrorBars.pm0000644000175000017500000003645112033071313015420 0ustar reinerreiner## @file # Implementation of Chart::ErrorBars # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # package Chart::ErrorBars; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::ErrorBars::ISA = qw(Chart::Base); $Chart::ErrorBars::VERSION = '2.4.6'; ## @class Chart::ErrorBars # ErrorBars class derived from class Base. # # This class provides all functions which are specific to # pointes having carrying vertical bars which represent # errors or standard deviations # #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _draw_data # finally get around to plotting the data # # Overwrites Base function # sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3, $mod, $y_error_up, $y_error_down ); my ( $width, $height, $delta, $map, $delta_num, $zero_offset, $flag ); my ( $i, $j, $color, $brush ); my $dataset = 0; my $diff; # init the imagemap data field if they want it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find the delta value between data points, as well # as the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $diff = $self->{'max_val'} - $self->{'min_val'}; $diff = 1 if $diff == 0; $map = $height / $diff; # for a xy-plot, use this delta and maybe an offset for the zero-axes if ( $self->true( $self->{'xy_plot'} ) ) { $diff = $self->{'x_max_val'} - $self->{'x_min_val'}; $diff = 1 if $diff == 0; $delta_num = $width / $diff; if ( $self->{'x_min_val'} <= 0 && $self->{'x_max_val'} >= 0 ) { $zero_offset = abs( $self->{'x_min_val'} ) * abs($delta_num); } elsif ( $self->{'x_min_val'} > 0 || $self->{'x_max_val'} < 0 ) { $zero_offset = -$self->{'x_min_val'} * $delta_num; } else { $zero_offset = 0; } } # get the base x-y values if ( $self->false( $self->{'xy_plot'} ) ) { $x1 = $self->{'curr_x_min'} + ( $delta / 2 ); } else { $x1 = $self->{'curr_x_min'}; } if ( $self->{'min_val'} >= 0 ) { $y1 = $self->{'curr_y_max'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $y1 = $self->{'curr_y_min'}; $mod = $self->{'max_val'}; } else { $y1 = $self->{'curr_y_min'} + ( $map * $self->{'max_val'} ); $mod = 0; $self->{'gd_obj'}->line( $self->{'curr_x_min'}, $y1, $self->{'curr_x_max'}, $y1, $misccolor ); } # first of all box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); # draw the points for $i ( 1 .. $self->{'num_datasets'} ) { if ( $self->false( $self->{'same_error'} ) ) { # get the color for this dataset, and set the brush $color = $self->_color_role_to_index( 'dataset' . ($dataset) ); # draw every point for this dataset $dataset++ if ( ( $i - 1 ) % 3 == 0 ); for $j ( 0 .. $self->{'num_datapoints'} ) { #get the brush for points $brush = $self->_prepare_brush( $color, 'point' ); $self->{'gd_obj'}->setBrush($brush); # only draw if the current set is really a dataset and no errorset if ( ( $i - 1 ) % 3 == 0 ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) ) { if ( $self->true( $self->{'xy_plot'} ) ) { $x2 = $x1 + $delta_num * $data->[0][$j] + $zero_offset + 1; $x3 = $x2; } else { $x2 = $x1 + ( $delta * $j ) + 1; $x3 = $x2; } $y2 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); $y3 = $y2; $y_error_up = $y2 - abs( $data->[ $i + 1 ][$j] ) * $map; $y_error_down = $y2 + abs( $data->[ $i + 2 ][$j] ) * $map; # draw the point only if it is within the chart borders if ( $data->[$i][$j] <= $self->{'max_val'} && $data->[$i][$j] >= $self->{'min_val'} ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y3, gdBrushed ); $flag = 'true'; } #reset the brush for lines $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #draw the error bars if ( $self->true($flag) ) { # the upper lines $self->{'gd_obj'}->line( $x2, $y2, $x3, $y_error_up, gdBrushed ); $self->{'gd_obj'}->line( $x2 - 3, $y_error_up, $x3 + 3, $y_error_up, gdBrushed ); # the down lines $self->{'gd_obj'}->line( $x2, $y2, $x3, $y_error_down, gdBrushed ); $self->{'gd_obj'}->line( $x2 - 3, $y_error_down, $x3 + 3, $y_error_down, gdBrushed ); $flag = 'false'; } # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y2 ]; } } } } } else { # get the color for this dataset, and set the brush $color = $self->_color_role_to_index( 'dataset' . ($dataset) ); # draw every point for this dataset $dataset++ if ( ( $i - 1 ) % 2 == 0 ); for $j ( 0 .. $self->{'num_datapoints'} ) { #get the brush for points $brush = $self->_prepare_brush( $color, 'point' ); $self->{'gd_obj'}->setBrush($brush); # only draw if the current set is really a dataset and no errorset if ( ( $i - 1 ) % 2 == 0 ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) ) { if ( $self->true( $self->{'xy_plot'} ) ) { $x2 = $x1 + $delta_num * $data->[0][$j] + $zero_offset; $x3 = $x2; } else { $x2 = $x1 + ( $delta * $j ); $x3 = $x2; } $y2 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); $y3 = $y2; $y_error_up = $y2 - abs( $data->[ $i + 1 ][$j] ) * $map; $y_error_down = $y2 + abs( $data->[ $i + 1 ][$j] ) * $map; # draw the point only if it is within the chart borders if ( $data->[$i][$j] <= $self->{'max_val'} && $data->[$i][$j] >= $self->{'min_val'} ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y3, gdBrushed ); $flag = 'true'; } #reset the brush for lines $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #draw the error bars if ( $self->true($flag) ) { # the upper lines $self->{'gd_obj'}->line( $x2, $y2, $x3, $y_error_up, gdBrushed ); $self->{'gd_obj'}->line( $x2 - 3, $y_error_up, $x3 + 3, $y_error_up, gdBrushed ); # the down lines $self->{'gd_obj'}->line( $x2, $y2, $x3, $y_error_down, gdBrushed ); $self->{'gd_obj'}->line( $x2 - 3, $y_error_down, $x3 + 3, $y_error_down, gdBrushed ); $flag = 'false'; } # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y2 ]; } } } #end for } } } return 1; } ## @fn private _prepare_brush # set the gdBrush object to trick GD into drawing fat lines # # Overwrite Base function # sub _prepare_brush { my $self = shift; my $color = shift; my $type = shift; my ( $radius, @rgb, $brush, $white, $newcolor ); # get the rgb values for the desired color @rgb = $self->{'gd_obj'}->rgb($color); # get the appropriate brush size if ( $type eq 'line' ) { $radius = $self->{'brush_size'} / 2; } elsif ( $type eq 'point' ) { $radius = $self->{'pt_size'} / 2; } # create the new image $brush = GD::Image->new( $radius * 2, $radius * 2 ); # get the colors, make the background transparent $white = $brush->colorAllocate( 255, 255, 255 ); $newcolor = $brush->colorAllocate(@rgb); $brush->transparent($white); # draw the circle $brush->arc( $radius - 1, $radius - 1, $radius, $radius, 0, 360, $newcolor ); # fill it if we're using lines $brush->fill( $radius - 1, $radius - 1, $newcolor ); # set the new image as the main object's brush return $brush; } ## @fn private int _draw_legend() # let them know what all the pretty colors mean # @return status ## let them know what all the pretty colors mean sub _draw_legend { my $self = shift; my ( $length, $step, $temp, $post_length ); my $j = 0; # check to see if legend type is none.. if ( $self->{'legend'} =~ /^none$/ ) { return 1; } #just for later checking and warning if ( $#{ $self->{'legend_labels'} } >= 0 ) { $post_length = scalar( @{ $self->{'legend_labels'} } ); } #look if every second or eyery third dataset is a set for data if ( $self->false( $self->{'same_error'} ) ) { $step = 3; } else { $step = 2; } # init a field to store the length of the longest legend label unless ( $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = 0; } # fill in the legend labels, find the longest one for ( my $i = 1 ; $i < $self->{'num_datasets'} ; $i += $step ) { my $label = $j + 1; unless ( $self->{'legend_labels'}[$j] ) { $self->{'legend_labels'}[$j] = "Dataset $label"; } $length = length( $self->{'legend_labels'}[$j] ); if ( $length > $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = $length; } $j++; } #we just have to label the datasets in the legend #we'll reset it, to draw the sets $temp = $self->{'num_datasets'}; $self->{'num_datasets'} = $j; # check to see if they have as many labels as datasets, # warn them if not if ( ( $post_length > 0 ) && ( $post_length != $j ) ) { carp "The number of legend labels and datasets doesn\'t match"; } # different legend types if ( $self->{'legend'} eq 'bottom' ) { $self->_draw_bottom_legend; } elsif ( $self->{'legend'} eq 'right' ) { $self->_draw_right_legend; } elsif ( $self->{'legend'} eq 'left' ) { $self->_draw_left_legend; } elsif ( $self->{'legend'} eq 'top' ) { $self->_draw_top_legend; } else { carp "I can't put a legend there (at " . $self->{'legend'} . ")\n"; } #reset the number of dataset to make sure that everything goes right $self->{'num_datasets'} = $temp; # and return return 1; } #find the range of the x scale, don't forget the errors! sub _find_y_range { my $self = shift; my $data = $self->{'dataref'}; my $max = undef; my $min = undef; if ( $self->false( $self->{'same_error'} ) ) { for my $i ( 1 .. $self->{'num_datasets'} ) { if ( ( $i - 1 ) % 3 == 0 ) { for my $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined( $data->[$i][$j] ) && defined( $data->[ $i + 1 ][$j] ) && defined( $data->[ $i + 2 ][$j] ) ) { if ( defined $max ) { if ( ( $data->[$i][$j] + abs( $data->[ $i + 1 ][$j] ) ) > $max ) { $max = $data->[$i][$j] + abs( $data->[ $i + 1 ][$j] ); } if ( ( $data->[$i][$j] - abs( $data->[ $i + 2 ][$j] ) ) < $min ) { $min = $data->[$i][$j] - abs( $data->[ $i + 2 ][$j] ); } } else { $min = $max = $data->[$i][$j]; } } } } } return ( $min, $max ); } else { for my $i ( 1 .. $self->{'num_datasets'} ) { if ( ( $i - 1 ) % 2 == 0 ) { for my $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined( $data->[$i][$j] ) && defined( $data->[ $i + 1 ][$j] ) ) { if ( defined $max ) { if ( ( $data->[$i][$j] + $data->[ $i + 1 ][$j] ) > $max ) { $max = $data->[$i][$j] + $data->[ $i + 1 ][$j]; } if ( ( $data->[$i][$j] - $data->[ $i + 1 ][$j] ) < $min ) { $min = $data->[$i][$j] - $data->[ $i + 1 ][$j]; } } else { $min = $max = $data->[$i][$j]; } } } } } return ( $min, $max ); } } ## be a good module and return 1 1; Chart-2.4.6/Chart/Pareto.pm0000644000175000017500000002334312033071313014745 0ustar reinerreiner## @file # Implementation of Chart::Pareto # # written and maintained by # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::Pareto # @brief Pareto class derived class for Chart to implement # package Chart::Pareto; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Pareto::ISA = qw(Chart::Base); $Chart::Pareto::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _find_y_scale #calculate the range with the sum dataset1. all datas has to be positiv sub _find_y_range { my $self = shift; my $data = $self->{'dataref'}; my $sum = 0; for ( my $i = 0 ; $i < $self->{'num_datapoints'} ; $i++ ) { if ( $data->[1][$i] >= 0 ) { $sum += $data->[1][$i]; } else { carp "We need positiv data, if we want to draw a pareto graph!!"; return 0; } } #store the sum $self->{'sum'} = $sum; #return the range ( 0, $sum ); } ## @fn private _sort_data # sort the data sub _sort_data { my $self = shift; my $data = $self->{'dataref'}; my @labels = @{ $data->[0] }; my @values = @{ $data->[1] }; # sort the values and their labels @labels = @labels[ sort { $values[$b] <=> $values[$a] } 0 .. $#labels ]; @values = sort { $b <=> $a } @values; #save the sorted values and their labels @{ $data->[0] } = @labels; @{ $data->[1] } = @values; #finally return return 1; } ## @fn private _draw_legend # let them know what all the pretty colors mean sub _draw_legend { my $self = shift; my ($length); my $num_dataset; # check to see if legend type is none.. if ( $self->{'legend'} =~ /^none$/ ) { return 1; } # check to see if they have as many labels as datasets, # warn them if not if ( ( $#{ $self->{'legend_labels'} } >= 0 ) && ( ( scalar( @{ $self->{'legend_labels'} } ) ) != 2 ) ) { carp "I need two legend labels. One for the data and one for the sum."; } # init a field to store the length of the longest legend label unless ( $self->{'max_legend_label'} ) { $self->{'max_legend_label'} = 0; } # fill in the legend labels, find the longest one unless ( $self->{'legend_labels'}[0] ) { $self->{'legend_labels'}[0] = "Dataset"; } unless ( $self->{'legend_labels'}[1] ) { $self->{'legend_labels'}[1] = "Running sum"; } if ( length( $self->{'legend_labels'}[0] ) > length( $self->{'legend_labels'}[1] ) ) { $self->{'max_legend_label'} = length( $self->{'legend_labels'}[0] ); } else { $self->{'max_legend_label'} = length( $self->{'legend_labels'}[1] ); } #set the number of datasets to 2, and store it $num_dataset = $self->{'num_datasets'}; $self->{'num_datasets'} = 2; # different legend types if ( $self->{'legend'} eq 'bottom' ) { $self->_draw_bottom_legend; } elsif ( $self->{'legend'} eq 'right' ) { $self->_draw_right_legend; } elsif ( $self->{'legend'} eq 'left' ) { $self->_draw_left_legend; } elsif ( $self->{'legend'} eq 'top' ) { $self->_draw_top_legend; } else { carp "I can't put a legend there (at " . $self->{'legend'} . ")\n"; } #reload the number of datasets $self->{'num_datasets'} = $num_dataset; # and return return 1; } ## @fn private _draw_data # finally get around to plotting the data sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3, $y1_line, $y2_line, $x1_line, $x2_line, $h, $w ); my ( $width, $height, $delta1, $delta2, $map, $mod, $cut ); my ( $i, $j, $color, $line_color, $percent, $per_label, $per_label_len ); my $sum = $self->{'sum'}; my $curr_sum = 0; my $font = $self->{'legend_font'}; my $pink = $self->{'gd_obj'}->colorAllocate( 255, 0, 255 ); my $diff; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find both delta values ($delta1 for stepping between different # datapoint names, $delta2 for setpping between datasets for that # point) and the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta1 = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $diff = ( $self->{'max_val'} - $self->{'min_val'} ); $diff = 1 if $diff == 0; $map = $height / $diff; if ( $self->true( $self->{'spaced_bars'} ) ) { $delta2 = $delta1 / 3; } else { $delta2 = $delta1; } # get the base x-y values $x1 = $self->{'curr_x_min'}; $y1 = $self->{'curr_y_max'}; $y1_line = $y1; $mod = $self->{'min_val'}; $x1_line = $self->{'curr_x_min'}; # draw the bars and the lines $color = $self->_color_role_to_index('dataset0'); $line_color = $self->_color_role_to_index('dataset1'); # draw every bar for this dataset for $j ( 0 .. $self->{'num_datapoints'} ) { # don't try to draw anything if there's no data if ( defined( $data->[1][$j] ) ) { #calculate the percent value for this data and the actual sum; $curr_sum += $data->[1][$j]; $percent = int( $curr_sum / ( $sum || 1 ) * 100 ); # find the bounds of the rectangle if ( $self->true( $self->{'spaced_bars'} ) ) { $x2 = $x1 + ( $j * $delta1 ) + $delta2; } else { $x2 = $x1 + ( $j * $delta1 ); } $y2 = $y1; $x3 = $x2 + $delta2; $y3 = $y1 - ( ( $data->[1][$j] - $mod ) * $map ); #cut the bars off, if needed if ( $data->[1][$j] > $self->{'max_val'} ) { $y3 = $y1 - ( ( $self->{'max_val'} - $mod ) * $map ); $cut = 1; } elsif ( $data->[1][$j] < $self->{'min_val'} ) { $y3 = $y1 - ( ( $self->{'min_val'} - $mod ) * $map ); $cut = 1; } else { $cut = 0; } # draw the bar ## y2 and y3 are reversed in some cases because GD's fill ## algorithm is lame $self->{'gd_obj'}->filledRectangle( $x2, $y3, $x3, $y2, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[1][$j] = [ $x2, $y3, $x3, $y2 ]; } # now outline it. outline red if the bar had been cut off unless ($cut) { $self->{'gd_obj'}->rectangle( $x2, $y3, $x3, $y2, $misccolor ); } else { $self->{'gd_obj'}->rectangle( $x2, $y3, $x3, $y2, $pink ); } $x2_line = $x3; if ( $self->{'max_val'} >= $curr_sum ) { #get the y value $y2_line = $y1 - ( ( $curr_sum - $mod ) * $map ); #draw the line $self->{'gd_obj'}->line( $x1_line, $y1_line, $x2_line, $y2_line, $line_color ); #draw a little rectangle at the end of the line $self->{'gd_obj'}->filledRectangle( $x2_line - 2, $y2_line - 2, $x2_line + 2, $y2_line + 2, $line_color ); #draw the label for the percent value $per_label = $percent . '%'; $per_label_len = length($per_label) * $w; $self->{'gd_obj'}->string( $font, $x2_line - $per_label_len - 1, $y2_line - $h - 1, $per_label, $line_color ); #update the values for next the line $y1_line = $y2_line; $x1_line = $x2_line; } else { #get the y value $y2_line = $y1 - ( ( $self->{'max_val'} - $mod ) * $map ); #draw the line $self->{'gd_obj'}->line( $x1_line, $y1_line, $x2_line, $y2_line, $pink ); #draw a little rectangle at the end of the line $self->{'gd_obj'}->filledRectangle( $x2_line - 2, $y2_line - 2, $x2_line + 2, $y2_line + 2, $pink ); #draw the label for the percent value $per_label = $percent . '%'; $per_label_len = length($per_label) * $w; $self->{'gd_obj'}->string( $font, $x2_line - $per_label_len - 1, $y2_line - $h - 1, $per_label, $pink ); #update the values for the next line $y1_line = $y2_line; $x1_line = $x2_line; } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[1][$j] = [ undef(), undef(), undef(), undef() ]; } } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## be a good module and return 1 1; Chart-2.4.6/Chart/BrushStyles.pm0000644000175000017500000001643612033071313016007 0ustar reinerreiner## @file # Chart::BrushStyles # # written and maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::BrushStyles # Define styles for Points and LinesPoints classes # # This class provides functions which define different # brush styles to extend the previous point as the only design # for Points.pm or LinesPoints.pm\n\n # The different brush styles are:\n # \see OpenCircle\n # \see FilledCircle\n # \see Star\n # \see OpenDiamond\n # \see FilledDiamond\n # \see OpenRectangle\n # \see FilledRectangle\n package Chart::BrushStyles; use Chart::Base '2.4.6'; use GD; use Carp; use strict; use Chart::Constants; @Chart::BrushStyles::ISA = qw(Chart::Base); $Chart::BrushStyles::VERSION = '2.4.6'; ## @fn OpenCircle # @param[in] *GD::Image $rbrush Reference to GD::Image # @param[in] int $radius Radius of the point in pixels # @param[in] int $color Color of the not filled point # # @brief Set the gdBrush object to have nice brushed object # representing a circle of the size \$radius. # # @details # Called by\n # use Chart::BrushStyles;\n # \@Chart::Points::ISA = qw(Chart::BrushStyles);\n # \$self->OpenCircle(\\\$rbrush,\$radius, \$newcolor);\n # to plot the GD::Image representing an open circle as the point # sub OpenCircle { my $self = shift; my $rbrush = shift; # reference to GD::Image my $radius = shift; my $color = shift; # draw a filled circle if ( $radius < 2 ) { $radius = 2; } $$rbrush->arc( $radius, $radius, $radius, $radius, 0, 360, $color ); } ## @fn FilledCircle # @param[in] *GD::Image $rbrush Reference to GD::Image # @param[in] int $radius Radius of the point in pixels # @param[in] int $color Color of the filled point # @return nothing # # @brief Set the gdBrush object to have nice brushed object # representing a point of the size \$radius. # # @details # Called by\n # use Chart::BrushStyles;\n # \@Chart::Points::ISA = qw(Chart::BrushStyles);\n # \$self->FilledCircle(\\\$rbrush,\$radius, \$color);\n # to plot the GD::Image representing a filled circle as the point # sub FilledCircle { my $self = shift; my $rbrush = shift; # reference to GD::Image my $radius = shift; my $color = shift; # draw a filled circle if ( $radius < 2 ) { $radius = 2; } $$rbrush->arc( $radius, $radius, $radius, $radius, 0, 360, $color ); # and fill it $$rbrush->fill( $radius, $radius, $color ); } ## @fn Star # @param[in] *GD::Image $rbrush Reference to GD::Image # @param[in] int $radius Radius of the star in pixels # @param[in] int $color Color of the star # @return nothing # # @brief Set the gdBrush object to have nice brushed object # representing a star of the size \$radius. # # @details # Called by\n # use Chart::BrushStyles;\n # \@Chart::Points::ISA = qw(Chart::BrushStyles);\n # \$self->Star(\\\$rbrush,\$radius, \$color);\n # to get back an GD::Image representing a star as the point # sub Star { my $self = shift; my $rbrush = shift; # reference to GD::Image my $radius = shift; my $color = shift; my $R = $self->maximum( 2, int( $radius + 0.5 ) ); my $r = $self->maximum( 1, int( $R / 3 + 0.5 ) ); my $lRadius = $R; my $x1 = $lRadius + $R; # =$R*cos(0) + $R; my $y1 = $R; # =$R*sin(0) + $R my ( $x2, $y2 ); for ( my $iAngleCounter = 1 ; $iAngleCounter < 16 ; $iAngleCounter++ ) { my $phi = $iAngleCounter * Chart::Constants::PI / 8; $lRadius = ( ( $iAngleCounter & 1 ) == 0 ) ? $R : $r; $x2 = $lRadius * cos($phi); $y2 = $lRadius * sin($phi); $x2 += $R; $y2 += $R; #printf("$iAngleCounter: %4f, %4f %4f,%4f\n", $x1,$y1,$x2,$y2); $$rbrush->line( $x1, $y1, $x2, $y2, $color ); $x1 = $x2; $y1 = $y2; } # draw to the first point $x2 = $R + $R; $y2 = $R; $$rbrush->line( $x1, $y1, $x2, $y2, $color ); } ## @fn FilledDiamond # @param[in] *GD::Image $rbrush Reference to GD::Image # @param[in] int $radius Radius of the diamond in pixels # @param[in] int $color Color of the filled diamond # @return nothing # # @brief Set the gdBrush object to have nice brushed object # representing a filled diamond of the size \$radius. # # @details # Called by\n # use Chart::BrushStyles;\n # \@Chart::Points::ISA = qw(Chart::BrushStyles);\n # \$self->FilledDiamond(\\\$rbrush,\$radius, \$color);\n # to get back an GD::Image representing a filled diamond as the point # sub FilledDiamond { my $self = shift; my $rbrush = shift; # reference to GD::Image my $radius = shift; my $color = shift; my $R = $self->maximum( 2, int( $radius + 0.5 ) ); my $R2 = $R * 2; $$rbrush->line( $R, 1, $R2 - 1, $R, $color ); $$rbrush->line( $R2, $R, $R, $R2 - 1, $color ); $$rbrush->line( $R, $R2 - 1, 1, $R, $color ); $$rbrush->line( 1, $R, $R, 1, $color ); # and fill it $$rbrush->fill( $radius - 1, $radius - 1, $color ); } ## @fn OpenDiamond # @param[in] *GD::Image $rbrush Reference to GD::Image # @param[in] int $radius Radius of the diamond in pixels # @param[in] int $color Color of the diamond # @return nothing # # @brief Set the gdBrush object to have nice brushed object # representing a diamond of the size \$radius-1. # # @details # Called by\n # use Chart::BrushStyles;\n # \@Chart::Points::ISA = qw(Chart::BrushStyles);\n # \$self->OpenDiamond(\\\$rbrush,\$radius, \$color);\n # to get back an GD::Image representing a diamond as the point # sub OpenDiamond { my $self = shift; my $rbrush = shift; # reference to GD::Image my $radius = shift; my $color = shift; my $R = $self->maximum( 2, int( $radius + 0.5 ) ); my $R2 = $R * 2; $$rbrush->line( $R, 1, $R2 - 1, $R, $color ); $$rbrush->line( $R2, $R, $R, $R2 - 1, $color ); $$rbrush->line( $R, $R2 - 1, 1, $R, $color ); $$rbrush->line( 1, $R, $R, 1, $color ); } ## @fn OpenRectangle # @param[in] *GD::Image $rbrush Reference to GD::Image # @param[in] int $radius Radius of the rectangle in pixels # @param[in] int $color Color of the rectangle # @return nothing # # @brief Set the gdBrush object to have nice brushed object # representing a rectangle of the height \$radius-1 and width of $radius/2. # # @details # Called by\n # use Chart::BrushStyles;\n # \@Chart::Points::ISA = qw(Chart::BrushStyles);\n # \$self->OpenDiamond(\\\$rbrush,\$radius, \$color);\n # to get back an GD::Image representing a rectangle as the point # sub OpenRectangle { my $self = shift; my $rbrush = shift; # reference to GD::Image my $radius = shift; my $color = shift; # draw a filled circle if ( $radius < 2 ) { $radius = 2; } my $height = $radius; my $width = $radius / 2; if ( $width < 1 ) { $width = 1; } $$rbrush->line( -$width, -$height, $width, -$height, $color ); #$$rbrush->line( $width, -$height, $width, $height, $color ); #$$rbrush->line( $width, $height, -$width, $height, $color ); #$$rbrush->line( -$width, $height, -$width ,-$height,$color ); } ################################################################# 1; Chart-2.4.6/Chart/Mountain.pm0000644000175000017500000002215112033071313015301 0ustar reinerreiner## @file # Implementation of Chart::Mountain # # written by david bonner # dbonner@cs.bu.edu # # maintained by # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # # Updated for # compatibility with # changes to Chart::Base # by peter clark # ninjaz@webexpress.com # # Copyright 1998, 1999 by James F. Miner. # All rights reserved. # This program is free software; you can redistribute it # and/or modify it under the same terms as Perl itself. # ## @class Chart::Mountain # @brief Mountain class derived class for Chart to implement mountain type of plots # # Some Mountain chart details: # # The effective y data value for a given x point and dataset # is the sum of the actual y data values of that dataset and # all datasets "below" it (i.e., with higher dataset indexes). # # If the y data value in any dataset is undef or negative for # a given x, then all datasets are treated as missing for that x. # # The y minimum is always forced to zero. # # To avoid a dataset area "cutting into" the area of the dataset below # it, the y pixel for each dataset point will never be below the y pixel for # the same point in the dataset below the dataset. # This probably should have a custom legend method, because each # dataset is identified by the fill color (and optional pattern) # of its area, not just a line color. So the legend shou a square # of the color and pattern for each dataset. package Chart::Mountain; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Mountain::ISA = qw ( Chart::Base ); $Chart::Mountain::VERSION = '2.4.6'; #===================# # private methods # #===================# ## @fn private array _find_y_range() # Find minimum and maximum value of y data sets. # # @return ( min, max, flag_all_integers ) sub _find_y_range { my $self = shift; # This finds the maximum point-sum over all x points, # where the point-sum is the sum of the dataset values at that point. # If the y value in any dataset is undef for a given x, then all datasets # are treated as missing for that x. my $data = $self->{'dataref'}; my $max = undef; for my $i ( 0 .. $#{ $data->[0] } ) { my $y_sum = $data->[1]->[$i]; if ( defined $y_sum && $y_sum >= 0 ) { for my $dataset ( @$data[ 2 .. $#$data ] ) { # order not important my $datum = $dataset->[$i]; if ( defined $datum && $datum >= 0 ) { $y_sum += $datum; } else { # undef or negative, treat all at same x as missing. $y_sum = undef; last; } } } if ( defined $y_sum ) { $max = $y_sum unless defined $max && $y_sum <= $max; } } ( 0, $max ); } ## @fn private _draw_data # draw the data sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my @patterns = @{ $self->{'patterns'} || [] }; # Calculate array of x pixel positions (@x). my $x_step = ( $self->{'curr_x_max'} - $self->{'curr_x_min'} ) / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); my $x_min = $self->{'curr_x_min'} + $x_step / 2; my $x_max = $self->{'curr_x_max'} - $x_step / 2; my @x = map { $_ * $x_step + $x_min } 0 .. $self->{'num_datapoints'} - 1; my ( $t_x_min, $t_x_max, $t_y_min, $t_y_max, $abs_x_max, $abs_y_max ); my $repair_top_flag = 0; # Calculate array of y pixel positions for upper boundary each dataset (@y). my $map = ( $self->{'max_val'} ) ? ( $self->{'curr_y_max'} - $self->{'curr_y_min'} ) / $self->{'max_val'} : ( $self->{'curr_y_max'} - $self->{'curr_y_min'} ) / 10; my $y_max = $self->{'curr_y_max'}; # max pixel point (lower y values) my @y; for my $j ( 0 .. $#{ $data->[0] } ) { my $sum = 0; for my $i ( reverse 1 .. $#{$data} ) { # bottom to top of chart my $datum = $data->[$i][$j]; #set the repair flag, if the datum is out of the borders of the chart if ( defined $datum && $datum > $self->{'max_val'} ) { $repair_top_flag = 1; } if ( defined $datum && $datum >= 0 ) { $sum += $datum; $y[ $i - 1 ][$j] = $y_max - $map * $sum; } else { # missing value, force all to undefined foreach my $k ( 1 .. $#{$data} ) { $y[ $k - 1 ][$j] = undef } last; } } } # Find first and last x where y is defined in the bottom dataset. my $x_begin = 0; my $x_end = $self->{'num_datapoints'} - 1; while ( $x_begin <= $x_end && !defined $y[-1]->[$x_begin] ) { $x_begin++ } while ( $x_begin <= $x_end && !defined $y[-1]->[$x_end] ) { $x_end-- } if ( $x_begin > $x_end ) { croak "Internal error: x_begin > x_end ($x_begin > $x_end)"; } # For each dataset, generate a polygon for the dataset's area of the chart, # and fill the polygon with the dataset's color/pattern. my $poly = GD::Polygon->new; $poly->addPt( $x[$x_end], $y_max ); # right end of x axis $poly->addPt( $x[$x_begin], $y_max ); # left end of x axis (right-to-left) for my $dataset ( reverse 0 .. @y - 1 ) { my $y_ref = $y[$dataset]; # Append points for this dataset to polygon, direction depends on $dataset % 2. my $last_vertex_count = $poly->length; if ( ( @y - 1 - $dataset ) % 2 ) { # right-to-left for ( reverse $x_begin .. $x_end ) { $poly->addPt( $x[$_], $y_ref->[$_] ) if defined $y_ref->[$_]; } } else { # left-to-right for ( $x_begin .. $x_end ) { $poly->addPt( $x[$_], $y_ref->[$_] ) if defined $y_ref->[$_]; } } # draw the polygon my $color = $self->_color_role_to_index( 'dataset' . $dataset ); if ( $patterns[$dataset] ) { $self->{'gd_obj'}->filledPolygon( $poly, $color ) if $patterns[$dataset]->transparent >= 0; $self->{'gd_obj'}->setTile( $patterns[$dataset] ); $self->{'gd_obj'}->filledPolygon( $poly, gdTiled ); } else { $self->{'gd_obj'}->filledPolygon( $poly, $color ); } # delete previous dataset's points from the polygon, update $last_vertex_count. unless ( $dataset == 0 ) { # don't bother do delete points after last area while ($last_vertex_count) { $poly->deletePt(0); $last_vertex_count-- } } } # Enclose the plots $self->{'gd_obj'}->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $self->_color_role_to_index('misc') ); #get the width and the heigth of the complete picture ( $abs_x_max, $abs_y_max ) = $self->{'gd_obj'}->getBounds(); #repair the chart, if the lines are out of the borders of the chart if ($repair_top_flag) { #overwrite the ugly mistakes $self->{'gd_obj'}->filledRectangle( $self->{'curr_x_min'}, 0, $self->{'curr_x_max'}, $self->{'curr_y_min'} - 1, $self->_color_role_to_index('background') ); #save the actual x and y values $t_x_min = $self->{'curr_x_min'}; $t_x_max = $self->{'curr_x_max'}; $t_y_min = $self->{'curr_y_min'}; $t_y_max = $self->{'curr_y_max'}; #get back to the point, where everything began $self->{'curr_x_min'} = 0; $self->{'curr_y_min'} = 0; $self->{'curr_x_max'} = $abs_x_max; $self->{'curr_y_max'} = $abs_y_max; #draw the title again if ( $self->{'title'} ) { $self->_draw_title(); } #draw the sub title again if ( $self->{'sub_title'} ) { $self->_draw_sub_title(); } #draw the top legend again if ( $self->{'legend'} =~ /^top$/i ) { $self->_draw_top_legend(); } #reset the actual values $self->{'curr_x_min'} = $t_x_min; $self->{'curr_x_max'} = $t_x_max; $self->{'curr_y_min'} = $t_y_min; $self->{'curr_y_max'} = $t_y_max; } } ############################################################### ### Fix a bug in GD::Polygon. ### A patch has been submitted to Lincoln Stein. require GD; unless ( defined &GD::Polygon::deletePt ) { *GD::Polygon::deletePt = sub { my ( $self, $index ) = @_; unless ( ( $index >= 0 ) && ( $index < @{ $self->{'points'} } ) ) { warn "Attempt to set an undefined polygon vertex"; return undef; } my ($vertex) = splice( @{ $self->{'points'} }, $index, 1 ); $self->{'length'}--; return @$vertex; } } ############################################################### 1; Chart-2.4.6/Chart/Constants.pm0000644000175000017500000000106012033071313015457 0ustar reinerreiner## @file # Constants used in Chart:\n # PI # # written and maintained by # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::Constants # @brief Constants class defines all necessary constants for Class Chart # # Defined are \n # PI = 3.141...\n # \n # Usage:\n # @code # use Chart::Constants; # my $pi = Chart::Constants::PI; # @endcode package Chart::Constants; use strict; # set up initial constant values use constant PI => 4 * atan2( 1, 1 ); # be a good module 1; Chart-2.4.6/Chart/StackedBars.pm0000644000175000017500000004304312033071313015700 0ustar reinerreiner## @file # Implementation of Chart::StackedBars # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::StackedBars # StackedBars class derived from class Base. # # This class provides all functions which are specific to # stacked bars package Chart::StackedBars; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::StackedBars::ISA = qw(Chart::Base); $Chart::StackedBars::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _check_data # override check_data to make sure we don't get datasets with positive # and negative values mixed sub _check_data { my $self = shift; my $data = $self->{'dataref'}; my $length = 0; my ( $i, $j, $posneg ); my $composite; # remember the number of datasets if ( defined $self->{'composite_info'} ) { if ( $self->{'composite_info'}[0][0] =~ /^StackedBars$/i ) { $composite = 0; } if ( $self->{'composite_info'}[1][0] =~ /^StackedBars$/i ) { $composite = 1; } # $self->{'num_datasets'} = $#{$data}; ### $self->{'num_datasets'} = ( $#{ $self->{'composite_info'}[$composite][1] } ) + 1; } else { $self->{'num_datasets'} = $#{$data}; } # remember the number of points in the largest dataset $self->{'num_datapoints'} = 0; for ( 0 .. $self->{'num_datasets'} ) { if ( scalar( @{ $data->[$_] } ) > $self->{'num_datapoints'} ) { $self->{'num_datapoints'} = scalar( @{ $data->[$_] } ); } } # make sure the datasets don't mix pos and neg values for $i ( 0 .. $self->{'num_datapoints'} - 1 ) { $posneg = ''; for $j ( 1 .. $self->{'num_datasets'} ) { if ( $data->[$j][$i] > 0 ) { if ( $posneg eq 'neg' ) { croak "The values for a Chart::StackedBars data point must either be all positive or all negative"; } else { $posneg = 'pos'; } } elsif ( $data->[$j][$i] < 0 ) { if ( $posneg eq 'pos' ) { croak "The values for a Chart::StackedBars data point must either be all positive or all negative"; } else { $posneg = 'neg'; } } } } # find good min and max y-values for the plot $self->_find_y_scale; # find the longest x-tick label for ( @{ $data->[0] } ) { if ( length($_) > $length ) { $length = length($_); } } # now store it in the object $self->{'x_tick_label_length'} = $length; return; } ## @fn private _find_y_range sub _find_y_range { my $self = shift; # This finds the minimum and maximum point-sum over all x points, # where the point-sum is the sum of the dataset values for that point. # If the y value in any dataset is undef for a given x, it simply # adds nothing to the sum. my $data = $self->{'dataref'}; my $max = undef; my $min = undef; for my $i ( 0 .. $#{ $data->[0] } ) { # data point my $sum = $data->[1]->[$i] || 0; for my $dataset ( @$data[ 2 .. $#$data ] ) { # order not important my $datum = $dataset->[$i]; $sum += $datum if defined $datum; } if ( defined $max ) { if ( $sum > $max ) { $max = $sum } elsif ( $sum < $min ) { $min = $sum } } else { $min = $max = $sum } } # make sure all-positive or all-negative charts get anchored at # zero so that we don't cut out some parts of the bars if ( ( $max > 0 ) && ( $min > 0 ) ) { $min = 0; } if ( ( $min < 0 ) && ( $max < 0 ) ) { $max = 0; } ( $min, $max ); } # ## override _find_y_scale to account for stacked bars # sub _find_y_scale { # my $self = shift; # my $raw = $self->{'dataref'}; # my $data = [@{$raw->[1]}]; # my ($i, $j, $max, $min); # my ($order, $mult, $tmp); # my ($range, $delta, @dec, $y_ticks); # my $labels = []; # my $length = 0; # # # use realy weird max and min values # $max = -999999999999; # $min = 999999999999; # # # go through and stack them # for $i (0..$self->{'num_datapoints'}-1) { # for $j (2..$self->{'num_datasets'}) { # $data->[$i] += $raw->[$j][$i]; # } # } # # # get max and min values # for $i (0..$self->{'num_datapoints'}-1) { # if ($data->[$i] > $max) { # $max = $data->[$i]; # } # if ($data->[$i] < $min) { # $min = $data->[$i]; # } # } # # # make sure all-positive or all-negative charts get anchored at # # zero so that we don't cut out some parts of the bars # if (($max > 0) && ($min > 0)) { # $min = 0; # } # if (($min < 0) && ($max < 0)) { # $max = 0; # } # # # calculate good max value # if ($max < -10) { # $tmp = -$max; # $order = int((log $tmp) / (log 10)); # $mult = int ($tmp / (10 ** $order)); # $tmp = ($mult - 1) * (10 ** $order); # $max = -$tmp; # } # elsif ($max < 0) { # $max = 0; # } # elsif ($max > 10) { # $order = int((log $max) / (log 10)); # $mult = int ($max / (10 ** $order)); # $max = ($mult + 1) * (10 ** $order); # } # elsif ($max >= 0) { # $max = 10; # } # # # now go for a good min # if ($min < -10) { # $tmp = -$min; # $order = int((log $tmp) / (log 10)); # $mult = int ($tmp / (10 ** $order)); # $tmp = ($mult + 1) * (10 ** $order); # $min = -$tmp; # } # elsif ($min < 0) { # $min = -10; # } # elsif ($min > 10) { # $order = int ((log $min) / (log 10)); # $mult = int ($min / (10 ** $order)); # $min = $mult * (10 ** $order); # } # elsif ($min >= 0) { # $min = 0; # } # # # put the appropriate min and max values into the object if necessary # unless (defined ($self->{'max_val'})) { # $self->{'max_val'} = $max; # } # unless (defined ($self->{'min_val'})) { # $self->{'min_val'} = $min; # } # # # generate the y_tick labels, store them in the object # # figure out which one is going to be the longest # $range = $self->{'max_val'} - $self->{'min_val'}; # $y_ticks = $self->{'y_ticks'} - 1; # ## Don't adjust y_ticks if the user specified custom labels # if ($self->{'integer_ticks_only'} =~ /^true$/i && ! $self->{'y_tick_labels'}) { # unless (($range % $y_ticks) == 0) { # while (($range % $y_ticks) != 0) { # $y_ticks++; # } # $self->{'y_ticks'} = $y_ticks + 1; # } # } # # $delta = $range / $y_ticks; # for (0..$y_ticks) { # $tmp = $self->{'min_val'} + ($delta * $_); # @dec = split /\./, $tmp; # if ($dec[1] && (length($dec[1]) > 3)) { # $tmp = sprintf("%.3f", $tmp); # } # $labels->[$_] = $tmp; # if (length($tmp) > $length) { # $length = length($tmp); # } # } # # # store it in the object # $self->{'y_tick_labels'} = $labels; # $self->{'y_tick_label_length'} = $length; # # # and return # return; # } ## @fn private _draw_data # finally get around to plotting the data sub _draw_data { my $self = shift; my $raw = $self->{'dataref'}; my $data = []; my $misccolor = $self->_color_role_to_index('misc'); my ( $width, $height, $delta, $map, $mod ); my ( $x1, $y1, $x2, $y2, $x3, $y3, $i, $j, $color, $cut ); my $pink = $self->{'gd_obj'}->colorAllocate( 255, 0, 255 ); # init the imagemap data field if they want it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # width and height of remaining area, delta for width of bars, mapping value $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; if ( $self->true( $self->{'spaced_bars'} ) ) { $delta = ( $width / ( $self->{'num_datapoints'} * 2 ) ); } else { $delta = $width / $self->{'num_datapoints'}; } $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $map = $height / ( $self->{'max_val'} - $self->{'min_val'} ); # get the base x and y values $x1 = $self->{'curr_x_min'}; if ( $self->{'min_val'} >= 0 ) { $y1 = $self->{'curr_y_max'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $y1 = $self->{'curr_y_min'}; $mod = $self->{'max_val'}; } else { $y1 = $self->{'curr_y_min'} + ( $map * $self->{'max_val'} ); $mod = 0; $self->{'gd_obj'}->line( $self->{'curr_x_min'}, $y1, $self->{'curr_x_max'}, $y1, $misccolor ); } # create another copy of the data, but stacked $data->[1] = [ @{ $raw->[1] } ]; for $i ( 0 .. $self->{'num_datapoints'} - 1 ) { for $j ( 2 .. $self->{'num_datasets'} ) { $data->[$j][$i] = $data->[ $j - 1 ][$i] + $raw->[$j][$i]; } } # draw the damn bars for $i ( 0 .. $self->{'num_datapoints'} - 1 ) { # init the y values for this datapoint $y2 = $y1; for $j ( 1 .. $self->{'num_datasets'} ) { # get the color $color = $self->_color_role_to_index( 'dataset' . ( $j - 1 ) ); # set up the geometry for the bar if ( $self->true( $self->{'spaced_bars'} ) ) { $x2 = $x1 + ( 2 * $i * $delta ) + ( $delta / 2 ); $x3 = $x2 + $delta; } else { $x2 = $x1 + ( $i * $delta ); $x3 = $x2 + $delta; } $y3 = $y1 - ( ( $data->[$j][$i] - $mod ) * $map ); #cut the bars off, if needed if ( $data->[$j][$i] > $self->{'max_val'} ) { $y3 = $y1 - ( ( $self->{'max_val'} - $mod ) * $map ); $cut = 1; } elsif ( $data->[$j][$i] < $self->{'min_val'} ) { $y3 = $y1 - ( ( $self->{'min_val'} - $mod ) * $map ); $cut = 1; } else { $cut = 0; } # draw the bar ## y2 and y3 are reversed in some cases because GD's fill ## algorithm is lame if ( $data->[$j][$i] > 0 ) { $self->{'gd_obj'}->filledRectangle( $x2, $y3, $x3, $y2, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$j][$i] = [ $x2, $y3, $x3, $y2 ]; } } else { $self->{'gd_obj'}->filledRectangle( $x2, $y2, $x3, $y3, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$j][$i] = [ $x2, $y2, $x3, $y3 ]; } } # now outline it. outline red if the bar had been cut off unless ($cut) { $self->{'gd_obj'}->rectangle( $x2, $y2, $x3, $y3, $misccolor ); } else { $self->{'gd_obj'}->rectangle( $x2, $y2, $x3, $y3, $misccolor ); $self->{'gd_obj'}->rectangle( $x2, $y1, $x3, $y3, $pink ); } # now bootstrap the y values $y2 = $y3; } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## @fn private _draw_left_legend sub _draw_left_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some base x-y coordinates $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} + $width; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datasets'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color my $c = $self->{'num_datasets'} - $_ - 1; # color of the datasets in the legend if ( $self->{'dataref'}[1][0] < 0 ) { $color = $self->_color_role_to_index( 'dataset' . $_ ); } else { $color = $self->_color_role_to_index( 'dataset' . $c ); } # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # do the line first $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', $self->{ 'pointStyle' . $_ } ); $self->{'gd_obj'}->setBrush($brush); # draw the point $self->{'gd_obj'}->line( int( ( $x3 + $x2 ) / 2 ), $y2, int( ( $x3 + $x2 ) / 2 ), $y2, gdBrushed ); # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; # order of the datasets in the legend if ( $self->{'dataref'}[1][0] < 0 ) { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } else { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$c], $color ); } } # mark off the used space $self->{'curr_x_min'} += $width; # and return return 1; } ## @fn private _draw_right_legend sub _draw_right_legend { my $self = shift; my @labels = @{ $self->{'legend_labels'} }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The subtitle font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $self->{'max_legend_label'} * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some starting x-y values $x1 = $self->{'curr_x_max'} - $width; $x2 = $self->{'curr_x_max'}; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datasets'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color my $c = $self->{'num_datasets'} - $_ - 1; # color of the datasets in the legend if ( $self->{'dataref'}[1][0] < 0 ) { $color = $self->_color_role_to_index( 'dataset' . $_ ); } else { $color = $self->_color_role_to_index( 'dataset' . $c ); } # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # do the line first $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', $self->{ 'pointStyle' . $_ } ); $self->{'gd_obj'}->setBrush($brush); # draw the point $self->{'gd_obj'}->line( int( ( $x3 + $x2 ) / 2 ), $y2, int( ( $x3 + $x2 ) / 2 ), $y2, gdBrushed ); # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; # order of the datasets in the legend if ( $self->{'dataref'}[1][0] < 0 ) { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } else { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$c], $color ); } } # mark off the used space $self->{'curr_x_max'} -= $width; # and return return 1; } ## be a good module and return 1 1; Chart-2.4.6/Chart/Bars.pm0000644000175000017500000001354412033071313014404 0ustar reinerreiner## @file # Implementation of Chart::Bars # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 ## @class Chart::Bars # Bars class provides all functions which are specific to # vertical bars package Chart::Bars; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Bars::ISA = qw(Chart::Base); $Chart::Bars::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @method private _draw_data # finally get around to plotting the data for (vertical) bars # sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3 ); my ( $width, $height, $delta1, $delta2, $map, $mod, $cut, $pink ); my ( $i, $j, $color ); my $temp = 0; # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find both delta values ($delta1 for stepping between different # datapoint names, $delta2 for stepping between datasets for that # point) and the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta1 = ( $self->{'num_datapoints'} > 0 ) ? $width / ( $self->{'num_datapoints'} * 1 ) : $width; $map = ( ( $self->{'max_val'} - $self->{'min_val'} ) > 0 ) ? $height / ( $self->{'max_val'} - $self->{'min_val'} ) : $height; if ( $self->true( $self->{'spaced_bars'} ) ) { #OLD: $delta2 = $delta1 / ($self->{'num_datasets'} + 2); $delta2 = ( ( $self->{'num_datasets'} + 2 ) > 0 ) ? $delta1 / ( $self->{'num_datasets'} + 2 ) : $delta1; } else { $delta2 = ( $self->{'num_datasets'} > 0 ) ? $delta1 / $self->{'num_datasets'} : $delta1; } # get the base x-y values $x1 = $self->{'curr_x_min'}; if ( $self->{'min_val'} >= 0 ) { $y1 = $self->{'curr_y_max'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $y1 = $self->{'curr_y_min'}; $mod = $self->{'max_val'}; } else { $y1 = $self->{'curr_y_min'} + ( $map * $self->{'max_val'} ); $mod = 0; $self->{'gd_obj'}->line( $self->{'curr_x_min'}, $y1, $self->{'curr_x_max'}, $y1, $misccolor ); } # draw the bars for $i ( 1 .. $self->{'num_datasets'} ) { # get the color for this dataset $color = $self->_color_role_to_index( 'dataset' . ( $i - 1 ) ); # draw every bar for this dataset for $j ( 0 .. $self->{'num_datapoints'} ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) && $data->[$i][$j] =~ /^[\-\+]{0,1}\s*[\d\.eE\-\+]+/ ) { # find the bounds of the rectangle if ( $self->true( $self->{'spaced_bars'} ) ) { $x2 = ( $x1 + ( $j * $delta1 ) + ( $i * $delta2 ) ); } else { $x2 = $x1 + ( $j * $delta1 ) + ( ( $i - 1 ) * $delta2 ); } $y2 = $y1; $x3 = $x2 + $delta2; $y3 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); # cut the bars off, if needed if ( $data->[$i][$j] > $self->{'max_val'} ) { $y3 = $y1 - ( ( $self->{'max_val'} - $mod ) * $map ); $cut = 1; } elsif ( $data->[$i][$j] < $self->{'min_val'} ) { $y3 = $y1 - ( ( $self->{'min_val'} - $mod ) * $map ); $cut = 1; } else { $cut = 0; } # draw the bar ## y2 and y3 are reversed in some cases because GD's fill ## algorithm is lame if ( $data->[$i][$j] > 0 ) { $self->{'gd_obj'}->filledRectangle( $x2, $y3, $x3, $y2, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y3, $x3, $y2 ]; } } else { $self->{'gd_obj'}->filledRectangle( $x2, $y2, $x3, $y3, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y2, $x3, $y3 ]; } } # now outline it. outline red if the bar had been cut off unless ($cut) { $self->{'gd_obj'}->rectangle( $x2, $y3, $x3, $y2, $misccolor ); } else { $pink = $self->{'gd_obj'}->colorAllocate( 255, 0, 255 ); $self->{'gd_obj'}->rectangle( $x2, $y3, $x3, $y2, $pink ); } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ undef(), undef(), undef(), undef() ]; } } } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## be a good module and return 1 1; Chart-2.4.6/Chart/Lines.pm0000644000175000017500000002525212033071313014566 0ustar reinerreiner## @file # Implementation of Chart::Lines # # written by david bonner # dbonner@cs.bu.edu # # maintained by the Chart Group at Geodetic Fundamental Station Wettzell # Chart@fs.wettzell.de # @author Chart Group (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 ## @class Chart::Lines # Lines class derived from class Base. # # This class provides all functions which are specific to # lines # package Chart::Lines; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Lines::ISA = qw(Chart::Base); $Chart::Lines::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @method private _draw_data # finally get around to plotting the data for lines sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3, $mod, $abs_x_max, $abs_y_max, $tan_alpha ); my ( $width, $height, $delta, $delta_num, $map, $t_x_min, $t_x_max, $t_y_min, $t_y_max ); my ( $i, $j, $color, $brush, $zero_offset ); my $repair_top_flag = 0; my $repair_bottom_flag = 0; # init the imagemap data field if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find the delta value between data points, as well # as the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $map = $height / ( $self->{'max_val'} - $self->{'min_val'} ); #for a xy-plot, use this delta and maybe an offset for the zero-axes if ( $self->true( $self->{'xy_plot'} ) ) { $delta_num = $width / ( $self->{'x_max_val'} - $self->{'x_min_val'} ); if ( $self->{'x_min_val'} <= 0 && $self->{'x_max_val'} >= 0 ) { $zero_offset = abs( $self->{'x_min_val'} ) * abs($delta_num); } elsif ( $self->{'x_min_val'} > 0 || $self->{'x_max_val'} < 0 ) { $zero_offset = -$self->{'x_min_val'} * $delta_num; } else { $zero_offset = 0; } } # get the base x-y values if ( $self->true( $self->{'xy_plot'} ) ) { $x1 = $self->{'curr_x_min'}; } else { $x1 = $self->{'curr_x_min'} + ( $delta / 2 ); } if ( $self->{'min_val'} >= 0 ) { $y1 = $self->{'curr_y_max'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $y1 = $self->{'curr_y_min'}; $mod = $self->{'max_val'}; } else { $y1 = $self->{'curr_y_min'} + ( $map * $self->{'max_val'} ); $mod = 0; $self->{'gd_obj'}->line( $self->{'curr_x_min'}, $y1, $self->{'curr_x_max'}, $y1, $misccolor ); } # draw the lines for $i ( 1 .. $self->{'num_datasets'} ) { # get the color for this dataset, and set the brush $color = $self->_color_role_to_index( 'dataset' . ( $i - 1 ) ); $brush = $self->_prepare_brush($color); $self->{'gd_obj'}->setBrush($brush); # draw every line for this dataset for $j ( 1 .. $self->{'num_datapoints'} - 1 ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) and defined( $data->[$i][ $j - 1 ] ) ) { if ( $self->true( $self->{'xy_plot'} ) ) { $x2 = $x1 + $delta_num * $data->[0][ $j - 1 ] + $zero_offset; $x3 = $x1 + $delta_num * $data->[0][$j] + $zero_offset; } else { $x2 = $x1 + ( $delta * ( $j - 1 ) ); $x3 = $x1 + ( $delta * $j ); } $y2 = $y1 - ( ( $data->[$i][ $j - 1 ] - $mod ) * $map ); $y3 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); # now draw the line # ---------------- # stepline option added by G.ST. 2005/02 #---------------- if ( $self->true( $self->{'stepline'} ) ) { if ( $self->{'stepline_mode'} =~ /^begin$/i ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, gdBrushed ); $self->{'gd_obj'}->line( $x3, $y2, $x3, $y3, gdBrushed ); } else { $self->{'gd_obj'}->line( $x2, $y2, $x2, $y3, gdBrushed ); $self->{'gd_obj'}->line( $x2, $y3, $x3, $y3, gdBrushed ); } } # ----------------------------------- # end stepline option #------------------------------------ else { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y3, gdBrushed ); } # set the flags, if the lines are out of the borders of the chart if ( ( $data->[$i][$j] > $self->{'max_val'} ) || ( $data->[$i][ $j - 1 ] > $self->{'max_val'} ) ) { $repair_top_flag = 1; } if ( ( $self->{'max_val'} <= 0 ) && ( ( $data->[$i][$j] > $self->{'max_val'} ) || ( $data->[$i][ $j - 1 ] > $self->{'max_val'} ) ) ) { $repair_top_flag = 1; } if ( ( $data->[$i][$j] < $self->{'min_val'} ) || ( $data->[$i][ $j - 1 ] < $self->{'min_val'} ) ) { $repair_bottom_flag = 1; } # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][ $j - 1 ] = [ $x2, $y2 ]; $self->{'imagemap_data'}->[$i][$j] = [ $x3, $y3 ]; } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][ $j - 1 ] = [ undef(), undef() ]; $self->{'imagemap_data'}->[$i][$j] = [ undef(), undef() ]; } } } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); #get the width and the heigth of the complete picture ( $abs_x_max, $abs_y_max ) = $self->{'gd_obj'}->getBounds(); #repair the chart, if the lines are out of the borders of the chart if ($repair_top_flag) { #overwrite the ugly mistakes $self->{'gd_obj'}->filledRectangle( $self->{'curr_x_min'} - ( $self->{'brush_size'} / 2 ), 0, $self->{'curr_x_max'}, $self->{'curr_y_min'} - 1, $self->_color_role_to_index('background') ); #save the actual x and y values $t_x_min = $self->{'curr_x_min'}; $t_x_max = $self->{'curr_x_max'}; $t_y_min = $self->{'curr_y_min'}; $t_y_max = $self->{'curr_y_max'}; #get back to the point, where everything began $self->{'curr_x_min'} = 0; $self->{'curr_y_min'} = 0; $self->{'curr_x_max'} = $abs_x_max; $self->{'curr_y_max'} = $abs_y_max; #draw the title again if ( $self->{'title'} ) { $self->_draw_title; } #draw the sub title again if ( $self->{'sub_title'} ) { $self->_draw_sub_title; } #draw the top legend again if ( $self->{'legend'} =~ /^top$/i ) { $self->_draw_top_legend; } #reset the actual values $self->{'curr_x_min'} = $t_x_min; $self->{'curr_x_max'} = $t_x_max; $self->{'curr_y_min'} = $t_y_min; $self->{'curr_y_max'} = $t_y_max; } if ($repair_bottom_flag) { #overwrite the ugly mistakes $self->{'gd_obj'}->filledRectangle( $self->{'curr_x_min'} - ( $self->{'brush_size'} / 2 ), $self->{'curr_y_max'} + 1, $self->{'curr_x_max'}, $abs_y_max, $self->_color_role_to_index('background') ); #save the actual x and y values $t_x_min = $self->{'curr_x_min'}; $t_x_max = $self->{'curr_x_max'}; $t_y_min = $self->{'curr_y_min'}; $t_y_max = $self->{'curr_y_max'}; #get back to the point, where everything began $self->{'curr_x_min'} = 0; $self->{'curr_y_min'} = 0; $self->{'curr_x_max'} = $abs_x_max; $self->{'curr_y_max'} = $abs_y_max - 1; # mark off the graph_border space $self->{'curr_y_max'} -= 2 * $self->{'graph_border'}; #draw the bottom legend again if ( $self->{'legend'} =~ /^bottom$/i ) { $self->_draw_bottom_legend; } #draw the x label again if ( $self->{'x_label'} ) { $self->_draw_x_label; } #get back to the start point for the ticks $self->{'curr_x_min'} = $self->{'temp_x_min'}; $self->{'curr_y_min'} = $self->{'temp_y_min'}; $self->{'curr_x_max'} = $self->{'temp_x_max'}; $self->{'curr_y_max'} = $self->{'temp_y_max'}; #draw the x ticks again if ( $self->true( $self->{'xy_plot'} ) ) { $self->_draw_x_number_ticks; } else { $self->_draw_x_ticks; } #reset the actual values $self->{'curr_x_min'} = $t_x_min; $self->{'curr_x_max'} = $t_x_max; $self->{'curr_y_min'} = $t_y_min; $self->{'curr_y_max'} = $t_y_max; } return; } ## @fn private int _prepare_brush($color) # set the gdBrush object to trick GD into drawing fat lines # sub _prepare_brush { my $self = shift; my $color = shift; my $radius = $self->{'brush_size'} / 2; my ( @rgb, $brush, $white, $newcolor ); # get the rgb values for the desired color @rgb = $self->{'gd_obj'}->rgb($color); # create the new image $brush = GD::Image->new( $radius * 2, $radius * 2 ); # get the colors, make the background transparent $white = $brush->colorAllocate( 255, 255, 255 ); $newcolor = $brush->colorAllocate(@rgb); $brush->transparent($white); # draw the circle $brush->arc( $radius - 1, $radius - 1, $radius, $radius, 0, 360, $newcolor ); # set the new image as the main object's brush return $brush; } ## be a good module and return 1 1; Chart-2.4.6/Chart/Split.pm0000644000175000017500000006272412033071313014614 0ustar reinerreiner## @file # Implementation of Chart::Split # # written and maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::Split #Split class derived from class Base. # # This class provides all functions which are specific to # splitted plots # package Chart::Split; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Split::ISA = qw(Chart::Base); $Chart::Split::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _draw_x_number_ticks #draw the ticks sub _draw_x_number_ticks { my $self = shift; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my $num_points = $self->{'num_datapoints'}; my ( $h, $w, $width, $step, $start, $interval, $label, $stag, @labels ); my ( $x_start, $y_start, $y, $x, $lines, $delta, $ticks ); my $x_label_len = 1; my $y_label_len = 1; my $x_max = -0x80000000; $self->{'grid_data'}->{'x'} = []; # find the width $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $width = 1 if $width == 0; # make sure we got a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn\'t a GD Font object"; } # find out how big the font is ( $w, $h ) = ( $font->width, $font->height ); unless ( defined $self->{'start'} && defined $self->{'interval'} ) { croak "I need two values from you to draw a split chart: start and interval!"; } else { $interval = $self->{'interval'}; $start = $self->{'start'}; $ticks = $self->{'interval_ticks'} - 1; $label = $start; } #look after devision by zero! if ( $ticks == 0 ) { $ticks = 1; } #calculate the step between the ticks $step = $interval / $ticks; for ( 0 .. $ticks ) { push @labels, $self->{f_x_tick}->( sprintf( "%." . $self->{'precision'} . "f", $label ) ); $label += $step; } #find the biggest x value foreach ( @{ $data->[0] } ) { if ( $_ > $x_max ) { $x_max = $_; } } #find the length of the x and y labels foreach (@labels) { if ( length($_) > $x_label_len ) { $x_label_len = length($_); } } #find the amount of lines $lines = int( ( ( $x_max - $start ) / $interval ) + 0.99999999999 ); $lines = 1 if $lines == 0; #find the length, of the label. $y_label_len = length($lines); #get the starting point and the width if ( $lines > 1 ) { #if there are y-ticks if ( $self->{'y_axes'} =~ /^right$/i ) { $x_start = $self->{'curr_x_min'}; $width = $self->{'curr_x_max'} - $x_start - $self->{'text_space'} * 2 - $y_label_len * $w - $self->{'tick_len'}; } elsif ( $self->{'y_axes'} =~ /^both$/i ) { $x_start = $self->{'curr_x_min'} + ( $w * $y_label_len ) + 2 * $self->{'text_space'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x_start - ( $w * $y_label_len ) - 2 * $self->{'text_space'} - $self->{'tick_len'}; } else { $x_start = $self->{'curr_x_min'} + ( $w * $y_label_len ) + 3 * $self->{'text_space'}; $width = $self->{'curr_x_max'} - $x_start; } } else { #if there are no y-axes $x_start = $self->{'curr_x_min'}; $width = $self->{'curr_x_max'} - $x_start; } #and the y_start value $y_start = $self->{'curr_y_max'} - $h - $self->{'text_space'}; #get the delta value $delta = $width / ($ticks); if ( !defined( $self->{'skip_x_ticks'} ) ) { $self->{'skip_x_ticks'} = 1; } #draw the labels if ( $self->{'x_ticks'} =~ /^normal$/i ) { if ( $self->{'skip_x_ticks'} > 1 ) { #draw a normal tick every nth label for ( 0 .. $#labels - 1 ) { if ( defined( $labels[ $_ * $self->{'skip_x_ticks'} ] ) ) { $x = $x_start + $delta * ( $_ * $self->{'skip_x_ticks'} ) - ( $w * length( $labels[ $_ * $self->{'skip_x_ticks'} ] ) ) / 2; $self->{'gd_obj'}->string( $font, $x, $y_start, $labels[ $_ * $self->{'skip_x_ticks'} ], $textcolor ); } } } elsif ( $self->{'custom_x_ticks'} ) { #draw only the normal ticks they wanted foreach ( @{ $self->{'custom_x_ticks'} } ) { if ( defined $labels[$_] ) { $x = $x_start + $delta * $_ - ( $w * length( $labels[$_] ) ) / 2; $self->{'gd_obj'}->string( $font, $x, $y_start, $labels[$_], $textcolor ); } } } else { for ( 0 .. $#labels ) { #draw all ticks normal if ( defined $labels[$_] ) { $x = $x_start + $delta * ($_) - ( $w * length( $labels[$_] ) ) / 2; $self->{'gd_obj'}->string( $font, $x, $y_start, $labels[$_], $textcolor ); } } } } elsif ( $self->{'x_ticks'} =~ /^staggered$/i ) { $stag = 0; if ( $self->{'skip_x_ticks'} > 1 ) { #draw a staggered tick every nth label for ( 0 .. $#labels - 1 ) { if ( defined( $labels[ $_ * $self->{'skip_x_ticks'} ] ) ) { $x = $x_start + $delta * ( $_ * $self->{'skip_x_ticks'} ) - ( $w * length( $labels[ $_ * $self->{'skip_x_ticks'} ] ) ) / 2; if ( $stag % 2 == 0 ) { $y_start -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x, $y_start, $labels[ $_ * $self->{'skip_x_ticks'} ], $textcolor ); if ( $stag % 2 == 0 ) { $y_start += $self->{'text_space'} + $h; } $stag++; } } } elsif ( $self->{'custom_x_ticks'} ) { # draw only the wanted ticks staggered foreach ( sort ( @{ $self->{'custom_x_ticks'} } ) ) { if ( defined $labels[$_] ) { $x = $x_start + $delta * $_ - ( $w * ( length( $labels[$_] ) ) ) / 2; if ( $stag % 2 == 0 ) { $y_start -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x, $y_start, $labels[$_], $textcolor ); if ( $stag % 2 == 0 ) { $y_start += $self->{'text_space'} + $h; } $stag++; } } } else { # draw all ticks staggered for ( 0 .. $#labels ) { if ( defined $labels[$_] ) { $x = $x_start + $delta * $_ - ( $w * ( length( $labels[$_] ) ) ) / 2; if ( $stag % 2 == 0 ) { $y_start -= $self->{'text_space'} + $h; } $self->{'gd_obj'}->string( $font, $x, $y_start, $labels[$_], $textcolor ); if ( $stag % 2 == 0 ) { $y_start += $self->{'text_space'} + $h; } $stag++; } } } } elsif ( $self->{'x_ticks'} =~ /^vertical$/i ) { $y_start = $self->{'curr_y_max'} - $self->{'text_space'}; if ( $self->{'skip_x_ticks'} > 1 ) { #draw every nth tick vertical for ( 0 .. $#labels ) { if ( defined $_ ) { $x = $x_start + $delta * ( $_ * $self->{'skip_x_ticks'} ) - $h / 2; $y = $y_start - ( $x_label_len - length( $labels[ $_ * $self->{'skip_x_ticks'} ] ) ) * $w; $self->{'gd_obj'}->stringUp( $font, $x, $y, $labels[ $_ * $self->{'skip_x_ticks'} ], $textcolor ); } } } elsif ( $self->{'custom_x_ticks'} ) { foreach ( @{ $self->{'custom_x_ticks'} } ) { #draw the ticks they want vertical if ( defined $labels[$_] ) { $x = $x_start + $delta * $_ - $h / 2; $y = $y_start - ( $x_label_len - length( $labels[$_] ) ) * $w; $self->{'gd_obj'}->stringUp( $font, $x, $y, $labels[$_], $textcolor ); } } } else { # draw all ticks vertical for ( 0 .. $#labels ) { if ( defined $labels[$_] ) { $x = $x_start + $delta * $_ - $h / 2; $y = $y_start - ( $x_label_len - length( $labels[$_] ) ) * $w; $self->{'gd_obj'}->stringUp( $font, $x, $y, $labels[$_], $textcolor ); } } } } #update the borders if ( $self->{'interval_ticks'} > 0 ) { if ( $self->{'x_ticks'} =~ /^normal$/i ) { $self->{'curr_y_max'} -= $h + $self->{'text_space'} * 2; } elsif ( $self->{'x_ticks'} =~ /^staggered$/i ) { $self->{'curr_y_max'} -= 2 * $h + 3 * $self->{'text_space'}; } elsif ( $self->{'x_ticks'} =~ /^vertical$/i ) { $self->{'curr_y_max'} -= $w * $x_label_len + $self->{'text_space'} * 2; } } #draw the ticks $y_start = $self->{'curr_y_max'}; $y = $y_start - $self->{'tick_len'}; if ( $self->{'skip_x_ticks'} > 1 ) { for ( 0 .. int( ($#labels) / $self->{'skip_x_ticks'} ) ) { $x = $x_start + $delta * ( $_ * $self->{'skip_x_ticks'} ); $self->{'gd_obj'}->line( $x, $y_start, $x, $y, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x; } } } elsif ( $self->{'custom_x_ticks'} ) { foreach ( @{ $self->{'custom_x_ticks'} } ) { if ( $_ <= $ticks ) { $x = $x_start + $delta * $_; $self->{'gd_obj'}->line( $x, $y_start, $x, $y, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x; } } } } else { for ( 0 .. $#labels ) { $x = $x_start + $_ * $delta; $self->{'gd_obj'}->line( $x, $y_start, $x, $y, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x; } } } #another update of the borders $self->{'curr_y_max'} -= $self->{'tick_len'} if $self->{'interval_ticks'} > 0; #finally return return; } ## @fn private _draw_x_ticks # override the function implemented in base sub _draw_x_ticks { my $self = shift; #Use always the _draw_x_tick funktion because we always do a xy_plot!!! $self->_draw_x_number_ticks(); #and return return 1; } ## @fn private _draw_y_ticks # override the function implemented in base sub _draw_y_ticks { my $self = shift; my $side = shift || 'left'; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my @labels = @{ $self->{'y_tick_labels'} }; my $num_points = $self->{'num_datapoints'}; my ( $w, $h ); my ( $x_start, $x, $y_start, $y, $start, $interval ); my ( $height, $delta, $label, $lines, $label_len ); my ( $s, $f ); my $x_max = -0x80000000; $self->{grid_data}->{'y'} = []; $self->{grid_data}->{'y2'} = []; # find the height $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; # make sure we got a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn\'t a GD Font object"; } # find out how big the font is ( $w, $h ) = ( $font->width, $font->height ); #get the base variables $interval = $self->{'interval'}; $start = $self->{'start'}; #find the biggest x value foreach ( @{ $data->[0] } ) { if ( $_ > $x_max ) { $x_max = $_; } } #calculate the number of lines and the length $lines = int( ( ( $x_max - $start ) / $interval ) + 0.99999999999 ); $lines = 1 if $lines == 0; $label_len = length($lines); #get the space between two lines $delta = $height / $lines; #now draw them if ( $lines > 1 ) { if ( $side =~ /^right$/i ) { #get the starting point $x_start = $self->{'curr_x_max'}; $y_start = $self->{'curr_y_min'}; #draw the labels for $label ( 0 .. $lines - 1 ) { $x = $x_start - $self->{'text_space'} - $label_len * $w; $y = $y_start + $label * $delta + $delta / 2 - $h / 2; $self->{'gd_obj'}->string( $font, $x, $y, $label, $textcolor ); } #draw the ticks for $label ( 0 .. $lines ) { $x = $x_start - $self->{'text_space'} * 2 - $label_len * $w - $self->{'tick_len'}; $y = $y_start + $label * $delta; $self->{'gd_obj'}->line( $x_start - $self->{'text_space'}, $y, $x, $y, $misccolor ); #add data for grid_lines push @{ $self->{grid_data}->{'y'} }, $y; } #update the borders $self->{'curr_x_max'} = $x_start - $self->{'text_space'} * 2 - $label_len * $w - $self->{'tick_len'}; } elsif ( $side =~ /^both$/i ) { #get the starting point $x_start = $self->{'curr_x_min'}; $y_start = $self->{'curr_y_min'}; #first the left side #draw the labels for $label ( 0 .. $lines - 1 ) { $x = $self->{'curr_x_min'} + $self->{'text_space'} * 2; $y = $y_start + $label * $delta + $delta / 2 - $h / 2; $self->{'gd_obj'}->string( $font, $x, $y, $self->{'f_y_tick'}->($label), $textcolor ); } #draw the ticks for $label ( 0 .. $lines ) { $x = $x_start + $self->{'text_space'} * 2 + $label_len * $w + $self->{'tick_len'}; $y = $y_start + $label * $delta; $self->{'gd_obj'}->line( $x_start + $self->{'text_space'}, $y, $x, $y, $misccolor ); } #then the right side #get the starting point $x_start = $self->{'curr_x_max'}; $y_start = $self->{'curr_y_min'}; #draw the labels for $label ( 0 .. $lines - 1 ) { $x = $x_start - $self->{'text_space'} - $label_len * $w; $y = $y_start + $label * $delta + $delta / 2 - $h / 2; $self->{'gd_obj'}->string( $font, $x, $y, $self->{'f_y_tick'}->($label), $textcolor ); } #draw the ticks for $label ( 0 .. $lines ) { $x = $x_start - $self->{'text_space'} * 2 - $label_len * $w - $self->{'tick_len'}; $y = $y_start + $label * $delta; $self->{'gd_obj'}->line( $x_start - $self->{'text_space'}, $y, $x, $y, $misccolor ); #add data for grid_lines push @{ $self->{grid_data}->{'y'} }, $y; } #update the borders $self->{'curr_x_min'} += $self->{'text_space'} * 2 + $label_len * $w + $self->{'tick_len'}; $self->{'curr_x_max'} = $x_start - $self->{'text_space'} * 2 - $label_len * $w - $self->{'tick_len'}; } else { #get the starting point $x_start = $self->{'curr_x_min'}; $y_start = $self->{'curr_y_min'}; #draw the labels for $label ( 0 .. $lines - 1 ) { $x = $self->{'curr_x_min'} + $self->{'text_space'} * 2; $y = $y_start + $label * $delta + $delta / 2 - $h / 2; $self->{'gd_obj'}->string( $font, $x, $y, $self->{'f_y_tick'}->($label), $textcolor ); } #draw the ticks for $label ( 0 .. $lines ) { $x = $x_start + $label_len * $w + $self->{'tick_len'} + $self->{'text_space'} * 3; $y = $y_start + $label * $delta; $self->{'gd_obj'}->line( $x_start + $self->{'text_space'}, $y, $x, $y, $misccolor ); #this is also where we have to draw the grid_lines push @{ $self->{grid_data}->{'y'} }, $y; } #update the borders $self->{'curr_x_min'} = $x_start + $self->{'text_space'} * 3 + $label_len * $w; } } #finally return return 1; } ## @fn private _draw_data # plot the data sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my $num_points = $self->{'num_datapoints'}; $num_points = 1 if $num_points == 0; my $num_sets = $self->{'num_datasets'}; $num_sets = 1 if $num_sets == 0; my ( $lines, $split, $width, $height, $delta_lines, $delta_sets, $map, $last_line ); my ( $akt_line, $akt_set, $akt_point, $color, $x_start, $y_start, $x, $y ); my ( $x_last, $y_last, $delta_point, $brush, $mod, $x_interval, $start ); my $i = 0; my $interval = ( $self->{'max_val'} - $self->{'min_val'} ); $interval = 1 if $interval == 0; my $x_max = -0x80000000; # find the height and the width $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $width = 1 if $width == 0; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $height = 1 if $height == 0; # init the imagemap data field if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } #get the base values $x_interval = $self->{'interval'}; $x_interval = 1 if $x_interval == 0; $start = $self->{'start'}; #find the biggest x value foreach ( @{ $data->[0] } ) { if ( $_ > $x_max ) { $x_max = $_; } } #calculate the number of lines $lines = int( ( ( $x_max - $start ) / $x_interval ) + 0.99999999999 ); $lines = 1 if $lines == 0; #find delta_lines for the space between the lines #and delta_sets for the space of the datasets of one line #and the delta_point for the space between the datapoints $delta_lines = $height / $lines; $delta_sets = $delta_lines / $num_sets; $delta_point = $width / ($x_interval); #find $map, for the y values $map = $delta_sets / $interval; #find the mod and the y_start value #correct the start value, if scale is set! Otherwise the plot is to high or to low! #The corecction, isn't perfect, but it does a good job in most cases. if ( $self->{'min_val'} >= 0 ) { $mod = $self->{'min_val'}; if ( $self->{'scale'} > 1 ) { $y_start = $self->{'curr_y_min'} + ( $interval * $map / 2 ) * ( $self->{'scale'} - 1 ); } else { $y_start = $self->{'curr_y_min'}; } } elsif ( $self->{'max_val'} <= 0 ) { $mod = $self->{'min_val'}; if ( $self->{'scale'} > 1 ) { $y_start = $self->{'curr_y_min'} + ( $interval * $map / 2 ) * ( $self->{'scale'} - 1 ); } else { $y_start = $self->{'curr_y_min'}; } } else { $y_start = $self->{'curr_y_min'} + ( $map * $self->{'min_val'} ); $mod = 0; } #The upper right corner is the point, where we start $x_start = $self->{'curr_x_min'}; #draw the lines for $akt_set ( 0 .. $num_sets - 1 ) { for $akt_point ( 0 .. $self->{'num_datapoints'} - 1 ) { #get the color for this dataset $color = $self->_color_role_to_index( 'dataset' . $akt_set ); $brush = $self->_prepare_brush( $color, 'line' ); $self->{'gd_obj'}->setBrush($brush); #start with the first point at line number zero $last_line = 0; for $akt_line ( $last_line .. $lines - 1 ) { #update the last line. That makes it a little bit faster. $last_line = $akt_line; #Don't try to draw, if there is no data if ( defined $data->[0][$akt_point] ) { if ( $data->[0][$akt_point] <= ( ( $akt_line + 1 ) * $x_interval + $start ) && $data->[0][$akt_point] >= $akt_line * $x_interval + $start ) { #the current point $x = $x_start + ( $data->[0][$akt_point] - ( $akt_line * $x_interval ) - ($start) ) * $delta_point; $y = $y_start + $akt_line * $delta_lines + $akt_set * $delta_sets + $delta_sets - ( $data->[ 1 + $akt_set ][$akt_point] - $mod ) * $map * $self->{'scale'}; #draw the line $self->{'gd_obj'}->line( $x_last, $y_last, $x, $y, gdBrushed ) if $akt_point != 0; #calculate the start point for the next line #first if the next point is in the same line if ( defined( $data->[0][ $akt_point + 1 ] ) && $data->[0][ $akt_point + 1 ] <= ( ( $akt_line + 1 ) * $x_interval + $start ) && $data->[0][ $akt_point + 1 ] > $akt_line * $x_interval + $start ) { $x_last = $x; $y_last = $y; } #second, if the next point is not in the same line else { $x_last = $self->{'curr_x_min'}; $y_last = $y_start + ( $akt_line + 1 ) * $delta_lines + $akt_set * $delta_sets + $delta_sets - ( $data->[ 1 + $akt_set ][$akt_point] - $mod ) * $map * $self->{'scale'}; } # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$akt_set][ $akt_point - 1 ] = [ $x_last, $y_last ]; $self->{'imagemap_data'}->[$akt_set][$akt_point] = [ $x, $y ]; } } else { #Go to the next line. Maybe the current point is in that line! next; } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$akt_set][ $akt_point - 1 ] = [ undef(), undef() ]; $self->{'imagemap_data'}->[$akt_set][$akt_point] = [ undef(), undef() ]; } } } } } $y_start = $self->{'curr_y_min'}; #draw some nice little lines for $akt_set ( 0 .. $num_sets - 1 ) { for $akt_line ( 0 .. $lines - 1 ) { #draw a line between the sets at the left side of the chart $self->{'gd_obj'}->line( $x_start, $y_start + $akt_line * $delta_lines + $akt_set * $delta_sets, $x_start + $self->{'tick_len'}, $y_start + $akt_line * $delta_lines + $akt_set * $delta_sets, $misccolor ); #draw a line between the sets at the right side of the chart $self->{'gd_obj'}->line( $self->{'curr_x_max'}, $y_start + $akt_line * $delta_lines + $akt_set * $delta_sets, $self->{'curr_x_max'} - $self->{'tick_len'}, $y_start + $akt_line * $delta_lines + $akt_set * $delta_sets, $misccolor ); } } #Box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); #finally retrun return; } #be a good modul and return 1 1; Chart-2.4.6/Chart/Points.pm0000644000175000017500000001125412033071313014765 0ustar reinerreiner## @file # Implementation of Chart::Points # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::Points # Points class derived from class Base. # # This class provides all functions which are specific to # points # package Chart::Points; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::Points::ISA = qw(Chart::Base); $Chart::Points::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _draw_data # finally get around to plotting the data sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3, $mod ); my ( $width, $height, $delta, $map, $delta_num, $zero_offset ); my ( $i, $j, $color, $brush ); my $diff; # init the imagemap data field if they want it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find the delta value between data points, as well # as the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $diff = ( $self->{'max_val'} - $self->{'min_val'} ); $diff = 1 if $diff == 0; $map = $height / $diff; #for a xy-plot, use this delta and maybe an offset for the zero-axes if ( $self->true( $self->{'xy_plot'} ) ) { $diff = ( $self->{'x_max_val'} - $self->{'x_min_val'} ); $diff = 1 if $diff == 0; $delta_num = $width / $diff; if ( $self->{'x_min_val'} <= 0 && $self->{'x_max_val'} >= 0 ) { $zero_offset = abs( $self->{'x_min_val'} ) * abs($delta_num); } elsif ( $self->{'x_min_val'} > 0 || $self->{'x_max_val'} < 0 ) { $zero_offset = -$self->{'x_min_val'} * $delta_num; } else { $zero_offset = 0; } } # get the base x-y values if ( $self->false( $self->{'xy_plot'} ) ) { $x1 = $self->{'curr_x_min'} + ( $delta / 2 ); } else { $x1 = $self->{'curr_x_min'}; } if ( $self->{'min_val'} >= 0 ) { $y1 = $self->{'curr_y_max'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $y1 = $self->{'curr_y_min'}; $mod = $self->{'max_val'}; } else { $y1 = $self->{'curr_y_min'} + ( $map * $self->{'max_val'} ); $mod = 0; $self->{'gd_obj'}->line( $self->{'curr_x_min'}, $y1, $self->{'curr_x_max'}, $y1, $misccolor ); } # draw the points for $i ( 1 .. $self->{'num_datasets'} ) { # get the color for this dataset, and set the brush $color = $self->_color_role_to_index( 'dataset' . ( $i - 1 ) ); my $offset = 0; ( $brush, $offset ) = $self->_prepare_brush( $color, 'point', 'dataset' . ( $i - 1 ) ); $self->{'gd_obj'}->setBrush($brush); # draw every point for this dataset for $j ( 0 .. $self->{'num_datapoints'} ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) ) { if ( $self->true( $self->{'xy_plot'} ) ) { $x2 = $x1 + $delta_num * $data->[0][$j] + $zero_offset; $x3 = $x2; } else { $x2 = $x1 + ( $delta * $j ); $x3 = $x2; } $y2 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); $y3 = $y2; # draw the point only if it is within the chart borders if ( $data->[$i][$j] <= $self->{'max_val'} && $data->[$i][$j] >= $self->{'min_val'} ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y3, gdBrushed ); } # store the imagemap data if they asked for it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y2 ]; } } } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## be a good module and return 1 1; Chart-2.4.6/Chart/HorizontalBars.pm0000644000175000017500000005675412033071313016470 0ustar reinerreiner## @file # Implementation of Chart::HorizontalBars # # maintained and written by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 ## @class Chart::HorizontalBars # HorizontalBars class derived from class Base. # # This class provides all functions which are specific to # horizontal bars # package Chart::HorizontalBars; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::HorizontalBars::ISA = qw(Chart::Base); $Chart::HorizontalBars::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @method private int _draw_x_ticks() # draw the x-ticks and their labels # Overwrites this function of Chart::Base # @return status # sub _draw_x_ticks { my $self = shift; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my ( $h, $w, $x1, $y1, $y2, $x2, $delta, $width, $label ); my @labels = @{ $self->{'y_tick_labels'} }; $self->{'grid_data'}->{'x'} = []; #make sure we have a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font you specified isn't a GD font object"; } #get height and width of the font ( $h, $w ) = ( $font->height, $font->width ); #get the right x-value and width if ( $self->{'y_axes'} =~ /^right$/i ) { $x1 = $self->{'curr_x_min'}; $width = $self->{'curr_x_max'} - $x1 - $self->{'tick_len'} - $self->{'text_space'} - $w * $self->{'x_tick_label_length'}; } elsif ( $self->{'y_axes'} =~ /^both$/i ) { $x1 = $self->{'curr_x_min'} + $self->{'text_space'} + $w * $self->{'x_tick_label_length'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x1 - $self->{'tick_len'} - $self->{'text_space'} - $w * $self->{'x_tick_label_length'}; } else { $x1 = $self->{'curr_x_min'} + $self->{'text_space'} + $w * $self->{'x_tick_label_length'} + $self->{'tick_len'}; $width = $self->{'curr_x_max'} - $x1; } #get the delta value $delta = $width / ( $self->{'y_ticks'} - 1 ); #draw the labels $y2 = $y1; if ( $self->{'x_ticks'} =~ /^normal/i ) { #just normal ticks #get the point for updating later $y1 = $self->{'curr_y_max'} - 2 * $self->{'text_space'} - $h - $self->{'tick_len'}; #get the start point $y2 = $y1 + $self->{'tick_len'} + $self->{'text_space'}; for ( 0 .. $#labels ) { $label = $self->{'y_tick_labels'}[$_]; $x2 = $x1 + ( $delta * $_ ) - ( $w * length($label) / 2 ); $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); } } elsif ( $self->{'x_ticks'} =~ /^staggered/i ) { #staggered ticks #get the point for updating later $y1 = $self->{'curr_y_max'} - 3 * $self->{'text_space'} - 2 * $h - $self->{'tick_len'}; for ( 0 .. $#labels ) { $label = $self->{'y_tick_labels'}[$_]; $x2 = $x1 + ( $delta * $_ ) - ( $w * length($label) / 2 ); unless ( $_ % 2 ) { $y2 = $y1 + $self->{'text_space'} + $self->{'tick_len'}; $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); } else { $y2 = $y1 + $h + 2 * $self->{'text_space'} + $self->{'tick_len'}; $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $textcolor ); } } } elsif ( $self->{'x_ticks'} =~ /^vertical/i ) { #vertical ticks #get the point for updating later $y1 = $self->{'curr_y_max'} - 2 * $self->{'text_space'} - $w * $self->{'y_tick_label_length'} - $self->{'tick_len'}; for ( 0 .. $#labels ) { $label = $self->{'y_tick_labels'}[$_]; #get the start point $y2 = $y1 + $self->{'tick_len'} + $w * length($label) + $self->{'text_space'}; $x2 = $x1 + ( $delta * $_ ) - ( $h / 2 ); $self->{'gd_obj'}->stringUp( $font, $x2, $y2, $label, $textcolor ); } } else { carp "I don't understand the type of x-ticks you specified"; } #update the curr x and y max value $self->{'curr_y_max'} = $y1; $self->{'curr_x_max'} = $x1 + $width; #draw the ticks $y1 = $self->{'curr_y_max'}; $y2 = $self->{'curr_y_max'} + $self->{'tick_len'}; for ( 0 .. $#labels ) { $x2 = $x1 + ( $delta * $_ ); $self->{'gd_obj'}->line( $x2, $y1, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'x'}->[$_] = $x2; } } return 1; } ## @fn private int _draw_y_ticks() # draw the y-ticks and their labels # Overwrites this function of Chart::Base # @return status sub _draw_y_ticks { my $self = shift; my $side = shift || 'left'; my $data = $self->{'dataref'}; my $font = $self->{'tick_label_font'}; my $textcolor = $self->_color_role_to_index('text'); my $misccolor = $self->_color_role_to_index('misc'); my ( $h, $w, $x1, $x2, $y1, $y2 ); my ( $width, $height, $delta ); $self->{'grid_data'}->{'y'} = []; #make sure that is a real font unless ( ( ref $font ) eq 'GD::Font' ) { croak "The tick label font isn't a GD Font object!"; } #get the size of the font ( $h, $w ) = ( $font->height, $font->width ); #figure out, where to draw if ( $side =~ /^right$/i ) { #get the right startposition $x1 = $self->{'curr_x_max'}; $y1 = $self->{'curr_y_max'} - $h / 2; #get the delta values $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = ($height) / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $y1 -= ( $delta / 2 ); #look if skipping is desired if ( !defined( $self->{'skip_y_ticks'} ) ) { $self->{'skip_y_ticks'} = 1; } #draw the labels for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ($delta) * ( $_ * $self->{'skip_y_ticks'} ); $x2 = $x1 + $self->{'tick_len'} + $self->{'text_space'}; $self->{'gd_obj'} ->string( $font, $x2, $y2, $self->{f_y_tick}->( $data->[0][ $_ * $self->{'skip_y_ticks'} ] ), $textcolor ); } #draw the ticks $x1 = $self->{'curr_x_max'}; $x2 = $self->{'curr_x_max'} + $self->{'tick_len'}; $y1 += $h / 2; for ( 0 .. ( $self->{'num_datapoints'} - 1 / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'y'}->[$_] = $y2; } } } elsif ( $side =~ /^both$/i ) { #get the right startposition $x1 = $self->{'curr_x_max'}; $y1 = $self->{'curr_y_max'} - $h / 2; #get the delta values $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = ($height) / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $y1 -= ( $delta / 2 ); #look if skipping is desired if ( !defined( $self->{'skip_y_ticks'} ) ) { $self->{'skip_y_ticks'} = 1; } #first draw the right labels for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ($delta) * ( $_ * $self->{'skip_y_ticks'} ); $x2 = $x1 + $self->{'tick_len'} + $self->{'text_space'}; $self->{'gd_obj'} ->string( $font, $x2, $y2, $self->{f_y_tick}->( $data->[0][ $_ * $self->{'skip_y_ticks'} ] ), $textcolor ); } #then draw the right ticks $x1 = $self->{'curr_x_max'}; $x2 = $self->{'curr_x_max'} + $self->{'tick_len'}; $y1 += $h / 2; for ( 0 .. ( $self->{'num_datapoints'} - 1 / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'y'}->[$_] = $y2; } } #get the right startposition $x1 = $self->{'curr_x_min'}; $y1 = $self->{'curr_y_max'} - $h / 2; #get the delta values for positioning $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = ($height) / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $y1 -= ( $delta / 2 ); #then draw the left labels for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ($delta) * ( $_ * $self->{'skip_y_ticks'} ); $x2 = $x1 - $w * length( $self->{f_y_tick}->( $data->[0][ $_ * $self->{'skip_y_ticks'} ] ) ) #print the Labels right-sided + $w * $self->{'x_tick_label_length'}; $self->{'gd_obj'} ->string( $font, $x2, $y2, $self->{f_y_tick}->( $data->[0][ $_ * $self->{'skip_y_ticks'} ] ), $textcolor ); } #update the curr_x_min val $self->{'curr_x_min'} = $x1 + $self->{'text_space'} + $w * $self->{'x_tick_label_length'} + $self->{'tick_len'}; #finally draw the left ticks $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} - $self->{'tick_len'}; $y1 += $h / 2; for ( 0 .. ( $self->{'num_datapoints'} - 1 / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'y'}->[$_] = $y2; } } } else { #get the right startposition $x1 = $self->{'curr_x_min'}; $y1 = $self->{'curr_y_max'} - $h / 2; #get the delta values for positioning $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = ($height) / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $y1 -= ( $delta / 2 ); if ( !defined( $self->{'skip_y_ticks'} ) ) { $self->{'skip_y_ticks'} = 1; } #draw the labels for ( 0 .. int( ( $self->{'num_datapoints'} - 1 ) / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ($delta) * ( $_ * $self->{'skip_y_ticks'} ); $x2 = $x1 - $w * length( $self->{f_y_tick}->( $data->[0][ $_ * $self->{'skip_y_ticks'} ] ) ) #print the Labels right-sided + $w * $self->{'x_tick_label_length'}; $self->{'gd_obj'} ->string( $font, $x2, $y2, $self->{f_y_tick}->( $data->[0][ $_ * $self->{'skip_y_ticks'} ] ), $textcolor ); } #update the curr_x_min val $self->{'curr_x_min'} = $x1 + $self->{'text_space'} + $w * $self->{'x_tick_label_length'} + $self->{'tick_len'}; #draw the ticks $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} - $self->{'tick_len'}; $y1 += $h / 2; for ( 0 .. ( $self->{'num_datapoints'} - 1 / $self->{'skip_y_ticks'} ) ) { $y2 = $y1 - ( $delta * $_ ); $self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); if ( $self->true( $self->{'grid_lines'} ) or $self->true( $self->{'x_grid_lines'} ) ) { $self->{'grid_data'}->{'y'}->[$_] = $y2; } } } #now return return 1; } ## @fn private int _find_y_scale() # find good values for the minimum and maximum y-value on the chart # overwrite the find_y_scale function, only to get the right f_x_ticks !!!!! # @return status sub _find_y_scale { my $self = shift; # Predeclare vars. my ( $d_min, $d_max ); # Dataset min & max. my ( $p_min, $p_max ); # Plot min & max. my ( $tickInterval, $tickCount ); my @tickLabels; # List of labels for each tick. my $maxtickLabelLen = 0; # The length of the longest tick label. # Find the datatset minimum and maximum. ( $d_min, $d_max ) = $self->_find_y_range(); # Force the inclusion of zero if the user has requested it. if ( $self->true( $self->{'include_zero'} ) ) { if ( ( $d_min * $d_max ) > 0 ) # If both are non zero and of the same sign. { if ( $d_min > 0 ) # If the whole scale is positive. { $d_min = 0; } else # The scale is entirely negative. { $d_max = 0; } } } if ( $self->{'integer_ticks_only'} =~ /^\d$/ ) { if ( $self->{'integer_ticks_only'} == 1 ) { $self->{'integer_ticks_only'} = 'true'; } else { $self->{'integer_ticks_only'} = 'false'; } } if ( $self->true( $self->{'integer_ticks_only'} ) ) { # Allow the dataset range to be overidden by the user. # f_min/max are booleans which indicate that the min & max should not be modified. my $f_min = defined $self->{'min_val'}; $d_min = $self->{'min_val'} if $f_min; my $f_max = defined $self->{'max_val'}; $d_max = $self->{'max_val'} if $f_max; # Assert against the min is larger than the max. if ( $d_min > $d_max ) { croak "The the specified 'min_val' & 'max_val' values are reversed (min > max: $d_min>$d_max)"; } # The user asked for integer ticks, force the limits to integers. # & work out the range directly. $p_min = $self->_round2Tick( $d_min, 1, -1 ); $p_max = $self->_round2Tick( $d_max, 1, 1 ); my $skip = $self->{skip_int_ticks}; $tickInterval = $skip; $tickCount = ( $p_max - $p_min ) / $skip + 1; # Now sort out an array of tick labels. for ( my $labelNum = $p_min ; $labelNum <= $p_max ; $labelNum += $tickInterval ) { my $labelText; if ( defined $self->{f_x_tick} ) { # Is _default_f_tick function used? if ( $self->{f_x_tick} == \&_default_f_tick ) { $labelText = sprintf( "%d", $labelNum ); } else { $labelText = $self->{f_x_tick}->($labelNum); } } else { $labelText = sprintf( "%d", $labelNum ); } #print "labelText = $labelText\n"; push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } } else { # Allow the dataset range to be overidden by the user. # f_min/max are booleans which indicate that the min & max should not be modified. my $f_min = defined $self->{'min_val'}; $d_min = $self->{'min_val'} if $f_min; my $f_max = defined $self->{'max_val'}; $d_max = $self->{'max_val'} if $f_max; # Assert against the min is larger than the max. if ( $d_min > $d_max ) { croak "The the specified 'min_val' & 'max_val' values are reversed (min > max: $d_min>$d_max)"; } # Calculate the width of the dataset. (posibly modified by the user) my $d_width = $d_max - $d_min; # If the width of the range is zero, forcibly widen it # (to avoid division by zero errors elsewhere in the code). if ( 0 == $d_width ) { $d_min--; $d_max++; $d_width = 2; } # Descale the range by converting the dataset width into # a floating point exponent & mantisa pair. my ( $rangeExponent, $rangeMantisa ) = $self->_sepFP($d_width); my $rangeMuliplier = 10**$rangeExponent; # Find what tick # to use & how many ticks to plot, # round the plot min & max to suatable round numbers. ( $tickInterval, $tickCount, $p_min, $p_max ) = $self->_calcTickInterval( $d_min / $rangeMuliplier, $d_max / $rangeMuliplier, $f_min, $f_max, $self->{'min_y_ticks'}, $self->{'max_y_ticks'} ); # Restore the tickInterval etc to the correct scale $_ *= $rangeMuliplier foreach ( $tickInterval, $p_min, $p_max ); #get teh precision for the labels my $precision = $self->{'precision'}; # Now sort out an array of tick labels. for ( my $labelNum = $p_min ; $labelNum <= $p_max ; $labelNum += $tickInterval ) { my $labelText; if ( defined $self->{f_x_tick} ) { # Is _default_f_tick function used? if ( $self->{f_x_tick} == \&_default_f_tick ) { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } else { $labelText = $self->{f_x_tick}->($labelNum); } } else { $labelText = sprintf( "%." . $precision . "f", $labelNum ); } #print "labelText = $labelText\n"; push @tickLabels, $labelText; $maxtickLabelLen = length $labelText if $maxtickLabelLen < length $labelText; } } # Store the calculated data. $self->{'min_val'} = $p_min; $self->{'max_val'} = $p_max; $self->{'y_ticks'} = $tickCount; $self->{'y_tick_labels'} = \@tickLabels; $self->{'y_tick_label_length'} = $maxtickLabelLen; # and return. return 1; } ## @fn private _draw_data # finally get around to plotting the data for (horizontal) bars sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3 ); my $cut = 0; my ( $width, $height, $delta1, $delta2, $map, $mod, $pink ); my ( $i, $j, $color ); # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find both delta values ($delta1 for stepping between different # datapoint names, $delta2 for setpping between datasets for that # point) and the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta1 = $height / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $map = $width / ( $self->{'max_val'} - $self->{'min_val'} ); if ( $self->true( $self->{'spaced_bars'} ) ) { $delta2 = $delta1 / ( $self->{'num_datasets'} + 2 ); } else { $delta2 = $delta1 / $self->{'num_datasets'}; } # get the base x-y values $y1 = $self->{'curr_y_max'} - $delta2; if ( $self->{'min_val'} >= 0 ) { $x1 = $self->{'curr_x_min'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $x1 = $self->{'curr_x_max'}; $mod = $self->{'max_val'}; } else { $x1 = $self->{'curr_x_min'} + abs( $map * $self->{'min_val'} ); $mod = 0; $self->{'gd_obj'}->line( $x1, $self->{'curr_y_min'}, $x1, $self->{'curr_y_max'}, $misccolor ); } # draw the bars for $i ( 1 .. $self->{'num_datasets'} ) { # get the color for this dataset $color = $self->_color_role_to_index( 'dataset' . ( $i - 1 ) ); # draw every bar for this dataset for $j ( 0 .. $self->{'num_datapoints'} ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) ) { # find the bounds of the rectangle if ( $self->true( $self->{'spaced_bars'} ) ) { $y2 = $y1 - ( $j * $delta1 ) - ( $self->{'num_datasets'} * $delta2 ) + ( ( $i - 1 ) * $delta2 ); } else { $y2 = $y1 - ( $j * $delta1 ) - ( $self->{'num_datasets'} * $delta2 ) + ( ($i) * $delta2 ); } $x2 = $x1; $y3 = $y2 + $delta2; #cut the bars off, if needed if ( $data->[$i][$j] > $self->{'max_val'} ) { $x3 = $x1 + ( ( $self->{'max_val'} - $mod ) * $map ) - 1; $cut = 1; } elsif ( $data->[$i][$j] < $self->{'min_val'} ) { $x3 = $x1 + ( ( $self->{'min_val'} - $mod ) * $map ) + 1; $cut = 1; } else { $x3 = $x1 + ( ( $data->[$i][$j] - $mod ) * $map ); $cut = 0; } # draw the bar ## y2 and y3 are reversed in some cases because GD's fill ## algorithm is lame if ( $data->[$i][$j] < 0 ) { $self->{'gd_obj'}->filledRectangle( $x3, $y2, $x2, $y3, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x3, $y2, $x2, $y3 ]; } $self->{'gd_obj'}->filledRectangle( $x3, $y2, $x2, $y3, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x3, $y2, $x2, $y3 ]; } } else { $self->{'gd_obj'}->filledRectangle( $x2, $y2, $x3, $y3, $color ); if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y2, $x3, $y3 ]; } } # now outline it. outline red if the bar had been cut off unless ($cut) { $self->{'gd_obj'}->rectangle( $x2, $y3, $x3, $y2, $misccolor ); } else { $pink = $self->{'gd_obj'}->colorAllocate( 255, 0, 255 ); $self->{'gd_obj'}->rectangle( $x2, $y3, $x3, $y2, $pink ); } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ undef(), undef(), undef(), undef() ]; } } } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## be a good module and return 1 1; Chart-2.4.6/Chart/LinesPoints.pm0000644000175000017500000002564212033071313015766 0ustar reinerreiner## @file # Implementation of Chart::LinesPoints # # written by # @author david bonner (dbonner@cs.bu.edu) # # maintained by the # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::LinesPoints # LinesPoints class connect the given x-/y-values by straight lines and the x-/y-values are plotted by points. # # This class provides all functions which are specific to # lines # package Chart::LinesPoints; use Chart::Base '2.4.6'; use GD; use Carp; use strict; @Chart::LinesPoints::ISA = qw(Chart::Base); $Chart::LinesPoints::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _draw_data # draw the data sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my ( $x1, $x2, $x3, $y1, $y2, $y3, $mod, $abs_x_max, $abs_y_max ); my ( $width, $height, $delta, $map, $t_x_min, $t_x_max, $t_y_min, $t_y_max ); my ( $i, $j, $color, $brush, $zero_offset, $delta_num ); my $repair_top_flag = 0; my $repair_bottom_flag = 0; my $diff; # init the imagemap data field if they want it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find the delta value between data points, as well # as the mapping constant $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; $delta = $width / ( $self->{'num_datapoints'} > 0 ? $self->{'num_datapoints'} : 1 ); $diff = ( $self->{'max_val'} - $self->{'min_val'} ); $diff = 1 if $diff == 0; $map = $height / $diff; # get the base x-y values if ( $self->true( $self->{'xy_plot'} ) ) { $x1 = $self->{'curr_x_min'}; } else { $x1 = $self->{'curr_x_min'} + ( $delta / 2 ); } if ( $self->{'min_val'} >= 0 ) { $y1 = $self->{'curr_y_max'}; $mod = $self->{'min_val'}; } elsif ( $self->{'max_val'} <= 0 ) { $y1 = $self->{'curr_y_min'}; $mod = $self->{'max_val'}; } else { $y1 = $self->{'curr_y_min'} + ( $map * $self->{'max_val'} ); $mod = 0; $self->{'gd_obj'}->line( $self->{'curr_x_min'}, $y1, $self->{'curr_x_max'}, $y1, $misccolor ); } #for a xy-plot, use this delta and maybe an offset for the zero-axes if ( $self->true( $self->{'xy_plot'} ) ) { my ( $xmin, $xmax ) = ( $self->{'x_min_val'}, $self->{'x_max_val'} ); if ( $self->{'xlabels'} ) { ( $xmin, $xmax ) = @{ $self->{'xrange'} }; } $diff = $xmax - $xmin; $diff = 1 if $diff == 0; $delta_num = $width / $diff; if ( $xmin <= 0 && $xmax >= 0 ) { $zero_offset = abs($xmin) * abs($delta_num); } elsif ( $xmin > 0 || $xmax < 0 ) { $zero_offset = -$xmin * $delta_num; } else { $zero_offset = 0; } } # draw the lines for $i ( 1 .. $self->{'num_datasets'} ) { # get the color for this dataset, and set the brush $color = $self->_color_role_to_index( 'dataset' . ( $i - 1 ) ); $brush = $self->_prepare_brush( $color, 'line', 'dataset' . ( $i - 1 ) ); $self->{'gd_obj'}->setBrush($brush); # draw every line for this dataset for $j ( 1 .. $self->{'num_datapoints'} ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) and defined( $data->[$i][ $j - 1 ] ) ) { if ( $self->true( $self->{'xy_plot'} ) ) { $x2 = $x1 + $delta_num * $data->[0][ $j - 1 ] + $zero_offset; $x3 = $x1 + $delta_num * $data->[0][$j] + $zero_offset; } else { $x2 = $x1 + ( $delta * ( $j - 1 ) ); $x3 = $x1 + ( $delta * $j ); } $y2 = $y1 - ( ( $data->[$i][ $j - 1 ] - $mod ) * $map ); $y3 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); #set the flags, if the lines are out of the borders of the chart if ( ( $data->[$i][$j] > $self->{'max_val'} ) || ( $data->[$i][ $j - 1 ] > $self->{'max_val'} ) ) { $repair_top_flag = 1; } if ( ( $self->{'max_val'} <= 0 ) && ( ( $data->[$i][$j] > $self->{'max_val'} ) || ( $data->[$i][ $j - 1 ] > $self->{'max_val'} ) ) ) { $repair_top_flag = 1; } if ( ( $data->[$i][$j] < $self->{'min_val'} ) || ( $data->[$i][ $j - 1 ] < $self->{'min_val'} ) ) { $repair_bottom_flag = 1; } # draw the line # ---------------- # stepline option added by G.ST. 2005/02 #---------------- if ( $self->true( $self->{'stepline'} ) ) { if ( $self->{'stepline_mode'} =~ /^begin$/i ) { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, gdBrushed ); $self->{'gd_obj'}->line( $x3, $y2, $x3, $y3, gdBrushed ); } else { $self->{'gd_obj'}->line( $x2, $y2, $x2, $y3, gdBrushed ); $self->{'gd_obj'}->line( $x2, $y3, $x3, $y3, gdBrushed ); } } # ----------------------------------- # end stepline option #------------------------------------ else { $self->{'gd_obj'}->line( $x2, $y2, $x3, $y3, gdBrushed ); } } } # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', 'dataset' . ( $i - 1 ) ); $self->{'gd_obj'}->setBrush($brush); # draw every point for this dataset for $j ( 0 .. $self->{'num_datapoints'} ) { # don't try to draw anything if there's no data if ( defined( $data->[$i][$j] ) ) { if ( $self->true( $self->{'xy_plot'} ) ) { $x2 = $x1 + $delta_num * $data->[0][$j] + $zero_offset; $x3 = $x2; } else { $x2 = $x1 + ( $delta * $j ); $x3 = $x2; } $y2 = $y1 - ( ( $data->[$i][$j] - $mod ) * $map ); $y3 = $y2; # draw the point $self->{'gd_obj'}->line( $x2, $y2, $x3, $y3, gdBrushed ); # remember the imagemap data if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ $x2, $y2 ]; } } else { if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'}->[$i][$j] = [ undef(), undef() ]; } } } } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); #get the width and the heigth of the complete picture ( $abs_x_max, $abs_y_max ) = $self->{'gd_obj'}->getBounds(); #repair the chart, if the lines are out of the borders of the chart if ($repair_top_flag) { #overwrite the ugly mistakes # $self->{'gd_obj'}->filledRectangle ($self->{'curr_x_min'}, 0, $self->{'gd_obj'}->filledRectangle( $self->{'curr_x_min'} - ( $self->{'brush_size'} / 2 ), 0, $self->{'curr_x_max'}, $self->{'curr_y_min'} - 2, $self->_color_role_to_index('background') ); #save the actual x and y values $t_x_min = $self->{'curr_x_min'}; $t_x_max = $self->{'curr_x_max'}; $t_y_min = $self->{'curr_y_min'}; $t_y_max = $self->{'curr_y_max'}; #get back to the point, where everything began $self->{'curr_x_min'} = 0; $self->{'curr_y_min'} = 0; $self->{'curr_x_max'} = $abs_x_max; $self->{'curr_y_max'} = $abs_y_max; #draw the title again if ( $self->{'title'} ) { $self->_draw_title; } #draw the sub title again if ( $self->{'sub_title'} ) { $self->_draw_sub_title; } #draw the top legend again if ( $self->{'legend'} =~ /^top$/i ) { $self->_draw_top_legend; } #reset the actual values $self->{'curr_x_min'} = $t_x_min; $self->{'curr_x_max'} = $t_x_max; $self->{'curr_y_min'} = $t_y_min; $self->{'curr_y_max'} = $t_y_max; } if ($repair_bottom_flag) { #overwrite the ugly mistakes # $self->{'gd_obj'}->filledRectangle ($self->{'curr_x_min'}, $self->{'curr_y_max'}+1, $self->{'gd_obj'}->filledRectangle( $self->{'curr_x_min'} - ( $self->{'brush_size'} / 2 ), $self->{'curr_y_max'} + 1, $self->{'curr_x_max'}, $abs_y_max, $self->_color_role_to_index('background') ); #save the actual x and y values $t_x_min = $self->{'curr_x_min'}; $t_x_max = $self->{'curr_x_max'}; $t_y_min = $self->{'curr_y_min'}; $t_y_max = $self->{'curr_y_max'}; #get back to the point, where everything began $self->{'curr_x_min'} = 0; $self->{'curr_y_min'} = 0; $self->{'curr_x_max'} = $abs_x_max; $self->{'curr_y_max'} = $abs_y_max - 1; # mark off the graph_border space $self->{'curr_y_max'} -= 2 * $self->{'graph_border'}; #draw the bottom legend again if ( $self->{'legend'} =~ /^bottom$/i ) { $self->_draw_bottom_legend; } #draw the x label again if ( $self->{'x_label'} ) { $self->_draw_x_label; } #get back to the start point for the ticks $self->{'curr_x_min'} = $self->{'temp_x_min'}; $self->{'curr_y_min'} = $self->{'temp_y_min'}; $self->{'curr_x_max'} = $self->{'temp_x_max'}; $self->{'curr_y_max'} = $self->{'temp_y_max'}; #draw the x ticks again $self->_draw_x_ticks; #reset the actual values $self->{'curr_x_min'} = $t_x_min; $self->{'curr_x_max'} = $t_x_max; $self->{'curr_y_min'} = $t_y_min; $self->{'curr_y_max'} = $t_y_max; } return; } ## be a good module and return 1 1; Chart-2.4.6/Chart/Pie.pm0000644000175000017500000012044012033071313014224 0ustar reinerreiner## @file # Implementation of Chart::Pie # # written and maintained by # @author Chart Group at Geodetic Fundamental Station Wettzell (Chart@fs.wettzell.de) # @date 2012-10-03 # @version 2.4.6 # ## @class Chart::Pie # @brief Pie class derived class for Chart to implement pies # package Chart::Pie; use Chart::Base '2.4.6'; use GD; use Carp; use Chart::Constants; use strict; @Chart::Pie::ISA = qw(Chart::Base); $Chart::Pie::VERSION = '2.4.6'; #>>>>>>>>>>>>>>>>>>>>>>>>>># # public methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<# #>>>>>>>>>>>>>>>>>>>>>>>>>>># # private methods go here # #<<<<<<<<<<<<<<<<<<<<<<<<<<<# ## @fn private _draw_data # @brief # finally get around to plotting the data # # @details # The user may define the kind of labelling the data by setting\n # 'label_values' to 'percent' if she wants to have the percentages\n # 'label_values' to 'values' if she wants to have the absolut values\n # 'label_values' to 'both' if she wants to have absolut values and percentages\n # 'label_values' to 'none' if she wants to have neither absolute values nor percentages\n # 'ring' to a number less then 1 to define a ring as output; # if 'ring' is 1 ore greater a full pie is plotted\n # sub _draw_data { my $self = shift; my $data = $self->{'dataref'}; my $misccolor = $self->_color_role_to_index('misc'); my $textcolor = $self->_color_role_to_index('text'); my $background = $self->_color_role_to_index('background'); my ( $width, $height, $centerX, $centerY, $diameter, $diameter_previous, $text_diameter ); my $dataset_sum; my ( $start_degrees, $end_degrees, $label_degrees, $label_old_degrees, $labelY_repeat_count ); my ( $pi, $rd2dg, $dg2rd ); my ( $font, $fontW, $fontH, $labelX, $labelY ); my $label; my ( $i, $j, $color ); my $label_length; my $degrees = 0; my $insidecolor; my $forbidden_degrees = 0; # last occupied degree my %labelinfo; my $max_val_len = 0; my $max_label_len = 0; # set up initial constant values $pi = Chart::Constants::PI; $dg2rd = $pi / 180; # Degree to Radians $rd2dg = 180 / $pi; # Radian to Degree $start_degrees = 0; $end_degrees = 0; $font = $self->{'legend_font'}; $fontW = $self->{'legend_font'}->width; $fontH = $self->{'legend_font'}->height; $label_degrees = $labelY_repeat_count = 0; # init the imagemap data field if they wanted it if ( $self->true( $self->{'imagemap'} ) ) { $self->{'imagemap_data'} = []; } # find width and height of the plotting area $width = $self->{'curr_x_max'} - $self->{'curr_x_min'}; $height = $self->{'curr_y_max'} - $self->{'curr_y_min'}; # okay, add up all the numbers of all the datasets, to get the # sum total. This will be used to determine the percentage # of each dataset. Obviously, negative numbers might be bad :) $dataset_sum = 0; for $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined $data->[1][$j] ) { #add to sum $dataset_sum += $data->[1][$j]; #don't allow negativ values if ( $data->[1][$j] < 0 ) { croak "We need positiv data for a pie chart (which is not true for data[$j])!"; } } } # find the longest label # first we need the length of the values $max_label_len = 1; for $j ( 0 .. ( $self->{'num_datapoints'} - 1 ) ) { # don't try to draw anything if there's no data $labelinfo{$j}{data} = 'undefined'; if ( defined( $data->[1][$j] ) ) { $labelinfo{$j}{data} = $data->[1][$j]; $label = $data->[0][$j]; $labelinfo{$j}{labeldata} = $label; if ( defined $self->{'label_values'} ) { if ( $self->{'label_values'} =~ /^percent$/i ) { $label = sprintf( "%s %4.2f%%", $label, $data->[1][$j] / ( $dataset_sum || 1 ) * 100 ); } elsif ( $self->{'label_values'} =~ /^value$/i ) { if ( $data->[1][$j] =~ /\./ ) { $label = sprintf( "%s %.2f", $label, $data->[1][$j] ); } else { $label = sprintf( "%s %d", $label, $data->[1][$j] ); } } elsif ( $self->{'label_values'} =~ /^both$/i ) { if ( $data->[1][$j] =~ /\./ ) { $label = sprintf( "%s %4.2f%% %.2f", $label, $data->[1][$j] / ( $dataset_sum || 1 ) * 100, $data->[1][$j] ); } else { $label = sprintf( "%s %4.2f%% %d", $label, $data->[1][$j] / ( $dataset_sum || 1 ) * 100, $data->[1][$j] ); } } elsif ( $self->{'label_values'} =~ /^none$/i ) { $label = sprintf( "%s", $label ); } } $label_length = length($label); $labelinfo{$j}{labelstring} = $label, $labelinfo{$j}{labellength} = $label_length; } $max_label_len = $label_length if ( $max_label_len < $label_length ); } $max_label_len *= $fontW; # find center point, from which the pie will be drawn around $centerX = int( $width / 2 ) + $self->{'curr_x_min'}; $centerY = int( $height / 2 ) + $self->{'curr_y_min'}; # @details # always draw a circle, which means the diameter will be the smaller # of the width and height. let enough space for the labels.\n # Calculate the space needed for the labels by taking # into account the angles where the labels will be plotted my $labeldistance = 2 * $self->maximum( $fontW, $fontH ); $start_degrees = 0; $end_degrees = 0; my $max_radius = $self->minimum( $width, $height ) / 2; my $radius = $max_radius; for $j ( 0 .. ( $self->{'num_datapoints'} - 1 ) ) { # So, get the degree offset for this dataset $end_degrees = $start_degrees + ( $data->[1][$j] / ( $dataset_sum || 1 ) * 360 ); $degrees = $start_degrees + ( $end_degrees - $start_degrees ) / 2; # stick the label in the middle of the slice $label_degrees = ( $start_degrees + $end_degrees ) / 2; $label = $labelinfo{$j}{labelstring}; $label_length = $labelinfo{$j}{labellength}; if ( ( $label_degrees >= 270 && $label_degrees <= 360 ) || ( $label_degrees >= 0 && $label_degrees <= 90 ) ) { # right side of the circle # as 0 degrees means east if ( abs($label_degrees) < 0.1 ) { # too small angle $radius = $self->{'curr_x_max'} - $label_length * $fontW; } else { # $x value in respect of label arc my $x = $radius * sin( $dg2rd * $label_degrees ); my $y = $radius * cos( $dg2rd * $label_degrees ); # i.e. the startpoint is at $centerX+$x, $centerY-$y #test #$self->{'gd_obj'}->rectangle( $centerX, $centerY, $centerX+$x, $centerY-$y, $misccolor ); # theoretical right value in respect to radius and length of label my $right_pos = $centerX + $x + $label_length * $fontW; if ( $right_pos > $self->{'curr_x_max'} ) { # too far right, correct x $right_pos = $self->{'curr_x_max'}; $x = $right_pos - $centerX - $label_length * $fontW; } # theoretical top position in respect to radius and height of label # (Remark: direction to the top of the picture counts backwards!) my $top_pos = $centerY - $y - $fontH; if ( $top_pos < $self->{'curr_y_min'} ) { # too far up, correct $y $top_pos = $self->{'curr_y_min'}; $y = $centerY - $top_pos - $fontH; } my $down_pos = $centerY + $y + $fontH; if ( $down_pos > $self->{'curr_y_max'} ) { $down_pos = $self->{'curr_y_max'}; $y = $down_pos - $centerY - $fontH; } #test #$self->{'gd_obj'}->rectangle( $centerX+$x, $centerY-$y, $right_pos, $top_pos, $textcolor ); #$self->{'gd_obj'} # ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); #return; $radius = $self->minimum( $radius, $x / sin( $dg2rd * $label_degrees ), abs( $y / cos( $dg2rd * $label_degrees ) ) ); $radius = int( $radius + 0.5 ); #test #$self->{'gd_obj'}->line( $centerX, $centerY, $centerX+$radius, $centerY, gdBrushed ); } if ( $radius <= 0 ) { croak "radius < 0!"; } } else { # left side of the circle # as 0 degrees means east if ( abs($label_degrees) < 0.1 ) { # too small angle $radius = $self->{'curr_x_max'} - $label_length * $fontW; } else { # $x value in respect of label arc my $x = $radius * sin( $dg2rd * $label_degrees ); my $y = $radius * cos( $dg2rd * $label_degrees ); # i.e. the startpoint is at $centerX-$x, $centerY+$y #test #$self->{'gd_obj'}->rectangle( $centerX, $centerY, $centerX-$x, $centerY+$y, $misccolor ); # theoretical right value in respect to radius and length of label my $left_pos = $centerX - $x - $label_length * $fontW; if ( $left_pos < $self->{'curr_x_min'} ) { # too far right, correct x $left_pos = $self->{'curr_x_min'}; $x = $centerX - $left_pos - $label_length * $fontW; } # theoretical top position in respect to radius and height of label # (Remark: direction to the top of the picture counts backwards!) my $top_pos = $centerY + $y - $fontH; if ( $top_pos < $self->{'curr_y_min'} ) { # too far up, correct $y $top_pos = $self->{'curr_y_min'}; $y = $centerY - $top_pos - $fontH; } my $down_pos = $centerY - $y + $fontH; if ( $down_pos > $self->{'curr_y_max'} ) { $down_pos = $self->{'curr_y_max'}; $y = $centerY + $fontH - $down_pos; } #test #$self->{'gd_obj'}->rectangle( $centerX-$x, $centerY+$y, $left_pos, $top_pos, $textcolor ); #$self->{'gd_obj'} # ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); #return; $radius = $self->minimum( $radius, $x / sin( $dg2rd * $label_degrees ), abs( $y / cos( $dg2rd * $label_degrees ) ) ); $radius = int( $radius + 0.5 ); #test #$self->{'gd_obj'}->line( $centerX, $centerY, $centerX+$radius, $centerY, gdBrushed ); } if ( $radius <= 0 ) { croak "radius < 0!"; } } # reset starting point for next dataset and continue. $start_degrees = $end_degrees; } $diameter = $radius * 2 - 2 * $labeldistance; $text_diameter = $diameter + $labeldistance; $self->{'gd_obj'}->arc( $centerX, $centerY, $diameter, $diameter, 0, 360, $misccolor ); # for DEBUG!! #$self->{'gd_obj'}->arc($centerX, $centerY, $text_diameter, $text_diameter, # 0, 360, $misccolor); # @details # Plot the pies $start_degrees = 0; $end_degrees = 0; for $j ( 0 .. ( $self->{'num_datapoints'} - 1 ) ) { #next if $labelinfo{$j}{data} eq 'undefined'; # get the color for this datapoint, take the color of the datasets $color = $self->_color_role_to_index( 'dataset' . $j ); $label = $labelinfo{$j}{labelstring}; $label_length = $labelinfo{$j}{labellength}; # The first value starts at 0 degrees, each additional dataset # stops where the previous left off, and since I've already # calculated the sum_total for the whole graph, I know that # the final pie slice will end at 360 degrees. # So, get the degree offset for this dataset $end_degrees = $start_degrees + ( $data->[1][$j] / ( $dataset_sum || 1 ) * 360 ); $degrees = ( $start_degrees + $end_degrees ) / 2; # stick the label in the middle of the slice $label_degrees = $degrees; if ( $start_degrees != $end_degrees ) { # draw filled Arc $self->{'gd_obj'}->filledArc( $centerX, $centerY, $diameter, $diameter, $start_degrees, $end_degrees, $color ); } # Figure out where to place the label # $forbidden_degrees = angle of the center, representing the height of the label if ( $j == 0 ) { $forbidden_degrees = $rd2dg * atan2( $fontH, 0.5 * $text_diameter ); $label_old_degrees = 0; } else { my $winkel; my $h; if ( ( $label_old_degrees <= 90.0 && $label_degrees > 90.0 ) || ( $label_old_degrees <= 270.0 && $label_degrees > 270.0 ) ) { # at 90 degrees there the reference point to the text changes # from the beginning to the back $forbidden_degrees = 0; } $label_degrees = $self->maximum( $label_degrees, $forbidden_degrees ); $label_old_degrees = $label_degrees; # remember old label_degrees $winkel = cos( $label_degrees * $dg2rd ); $winkel = abs($winkel); if ( abs($winkel) < 0.01 ) { $h = 0; } else { $h = $fontH / $winkel; } my $atan = atan2( $h, 0.5 * $text_diameter ); # -pi ... +pi $forbidden_degrees = $label_degrees + $rd2dg * $atan; # for debugging #printf("Index=%2d winkel=%6.2f, H=%3d atan=%5.2f label=%6.2f forbidden=%6.2f\n", # $j, $winkel*$dg2rd,$h, $atan*$rd2dg, $label_degrees,$forbidden_degrees); # end for debugging } $labelX = $centerX + $text_diameter * 0.5 * cos( $label_degrees * $dg2rd ); $labelY = $centerY + $text_diameter * 0.5 * sin( $label_degrees * $dg2rd ); # # For debugging # # Draw Point # # reset the brush for points # my $brush = $self->_prepare_brush($color, 'point', # $self->{'pointStyle' . '0'}); # $self->{'gd_obj'}->setBrush($brush); # # # draw the point # $self->{'gd_obj'}->line($labelX, $labelY, $labelX, $labelY, gdBrushed); # # end for debugging # Okay, if a bunch of very small datasets are close together, they can # overwrite each other. The following if statement is to help keep # labels of neighbor datasets from being overlapped. It ain't perfect, # but it does a pretty good job. if ( ( $label_degrees >= 270 && $label_degrees <= 360 ) || ( $label_degrees >= 0 && $label_degrees <= 90 ) ) { # right side of the circle # as 0 degrees means east # $textcolor marks everything black $self->{'gd_obj'}->string( $font, $labelX, $labelY - $fontH * 0.5, $label, $textcolor ); } else { # $textcolor marks everything black $self->{'gd_obj'}->string( $font, $labelX - length($label) * $fontW, $labelY - $fontH * 0.5, $label, $textcolor ); } if ( $self->true( $self->{'legend_lines'} ) ) { $self->{'gd_obj'}->line( $centerX + 0.5 * $diameter * cos( $degrees * $dg2rd ), $centerY + 0.5 * $diameter * sin( $degrees * $dg2rd ), $labelX, $labelY, $color ); } # reset starting point for next dataset and continue. $start_degrees = $end_degrees; } # end for $j # print "Center $centerX, $centerY\n"; # print "Durchmesser $diameter\n"; # print "Hintergrund $background\n"; if ( defined( $self->{'ring'} ) && abs( $self->{'ring'} ) < 1 ) { # print "bground $bground\n"; my $hole = ( 1 - abs( $self->{'ring'} ) ); if ( $self->true( $self->{'grey_background'} ) ) { $insidecolor = $self->_color_role_to_index('grey_background'); } else { $insidecolor = $background; } $self->{'gd_obj'}->filledArc( $centerX, $centerY, $hole * $diameter, $hole * $diameter, 0, 360, $insidecolor ); $self->{'gd_obj'}->arc( $centerX, $centerY, $hole * $diameter, $hole * $diameter, 0, 360, $misccolor ); } # and finaly box it off $self->{'gd_obj'} ->rectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'}, $misccolor ); return; } ## @fn private _draw_right_legend # Overwrite the legend methods to get the right legend sub _draw_right_legend { my $self = shift; my $data = $self->{'dataref'}; my @labels = @{ $data->[0] }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush ); my $font = $self->{'legend_font'}; my $l1 = 0; my $l2 = 0; my ( $i, $j, $label, $dataset_sum ); my $max_label_len = 1; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); #find out what the sum of all datapoits is, needed for the Labels with percent $dataset_sum = 0; for my $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined $data->[1][$j] ) { $dataset_sum += $data->[1][$j]; } } # find out how who wide the largest label text is foreach (@labels) { if ( length($_) > $l1 ) { $l1 = length($_); } } for ( my $i = 0 ; $i < ( $self->{'num_datapoints'} ) ; $i++ ) { if ( length( $data->[1][$i] ) > $l2 ) { $l2 = length( $data->[1][$i] ); } } if ( $self->{'legend_label_values'} =~ /^value$/i ) { $max_label_len = $l1 + $l2 + 1; } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $max_label_len = $l1 + 7; } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { $max_label_len = $l1 + $l2 + 9; } else { $max_label_len = $l1; } # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) #+ ($self->{'max_legend_label'} * $w) + $max_label_len * $w + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some starting x-y values $x1 = $self->{'curr_x_max'} - $width; $x2 = $self->{'curr_x_max'}; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datapoints'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color $color = $self->_color_role_to_index( 'dataset' . $_ ); # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # do the line first $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', $self->{ 'pointStyle' . $_ } ); $self->{'gd_obj'}->setBrush($brush); # draw the point $self->{'gd_obj'}->line( int( ( $x3 + $x2 ) / 2 ), $y2, int( ( $x3 + $x2 ) / 2 ), $y2, gdBrushed ); # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; if ( defined $data->[1][$_] ) { if ( $self->{'legend_label_values'} =~ /^value$/i ) { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_] . ' ' . $data->[1][$_], $color ); } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $label = sprintf( "%s %4.2f%%", $labels[$_], $data->[1][$_] / ( $dataset_sum || 1 ) * 100 ); $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $color ); } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { if ( $data->[1][$_] =~ /\./ ) { $label = sprintf( "%s %4.2f%% %.2f", $labels[$_], $data->[1][$_] / ( $dataset_sum || 1 ) * 100, $data->[1][$_] ); } else { $label = sprintf( "%s %4.2f%% %d", $labels[$_], $data->[1][$_] / ( $dataset_sum || 1 ) * 100, $data->[1][$_] ); } $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $color ); } else { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } } } # mark off the used space $self->{'curr_x_max'} -= $width; # and return return 1; } ## @fn private _draw_left_legend # put the legend on the left of the chart sub _draw_left_legend { my $self = shift; my $data = $self->{'dataref'}; my @labels = @{ $data->[0] }; my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush ); my $font = $self->{'legend_font'}; my $max_label_len = 1; my $l1 = 0; my $l2 = 0; my ( $dataset_sum, $label ); # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # get the miscellaneous color $misccolor = $self->_color_role_to_index('misc'); #find out what the sum of all datapoits is, needed for the Labels with percent $dataset_sum = 0; for my $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined $data->[1][$j] ) { $dataset_sum += $data->[1][$j]; } } # find out how who wide the largest label text is foreach (@labels) { if ( length($_) > $l1 ) { $l1 = length($_); } } for ( my $i = 0 ; $i < ( $self->{'num_datapoints'} ) ; $i++ ) { if ( length( $data->[1][$i] ) > $l2 ) { $l2 = length( $data->[1][$i] ); } } if ( $self->{'legend_label_values'} =~ /^value$/i ) { $max_label_len = $l1 + $l2 + 1; } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $max_label_len = $l1 + 7; } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { $max_label_len = $l1 + $l2 + 9; } else { $max_label_len = $l1; } # find out how wide the largest label is $width = ( 2 * $self->{'text_space'} ) + ( $max_label_len * $w ) + $self->{'legend_example_size'} + ( 2 * $self->{'legend_space'} ); # get some base x-y coordinates $x1 = $self->{'curr_x_min'}; $x2 = $self->{'curr_x_min'} + $width; $y1 = $self->{'curr_y_min'} + $self->{'graph_border'}; $y2 = $self->{'curr_y_min'} + $self->{'graph_border'} + $self->{'text_space'} + ( $self->{'num_datapoints'} * ( $h + $self->{'text_space'} ) ) + ( 2 * $self->{'legend_space'} ); # box the legend off $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $misccolor ); # leave that nice space inside the legend box $x1 += $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; # now draw the actual legend for ( 0 .. $#labels ) { # get the color $color = $self->_color_role_to_index( 'dataset' . $_ ); # find the x-y coords $x2 = $x1; $x3 = $x2 + $self->{'legend_example_size'}; $y2 = $y1 + ( $_ * ( $self->{'text_space'} + $h ) ) + $h / 2; # do the line first $self->{'gd_obj'}->line( $x2, $y2, $x3, $y2, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', $self->{ 'pointStyle' . $_ } ); $self->{'gd_obj'}->setBrush($brush); # draw the point $self->{'gd_obj'}->line( int( ( $x3 + $x2 ) / 2 ), $y2, int( ( $x3 + $x2 ) / 2 ), $y2, gdBrushed ); # now the label $x2 = $x3 + ( 2 * $self->{'text_space'} ); $y2 -= $h / 2; if ( $self->{'legend_label_values'} =~ /^value$/i ) { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_] . ' ' . $data->[1][$_], $color ); } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $label = sprintf( "%s %4.2f%%", $labels[$_], $data->[1][$_] / ( $dataset_sum || 1 ) * 100 ); $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $color ); } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { if ( $data->[1][$_] =~ /\./ ) { $label = sprintf( "%s %4.2f%% %.2f", $labels[$_], $data->[1][$_] / ( $dataset_sum || 1 ) * 100, $data->[1][$_] ); } else { $label = sprintf( "%s %4.2f%% %d", $labels[$_], $data->[1][$_] / ( $dataset_sum || 1 ) * 100, $data->[1][$_] ); } $self->{'gd_obj'}->string( $font, $x2, $y2, $label, $color ); } else { $self->{'gd_obj'}->string( $font, $x2, $y2, $labels[$_], $color ); } } # mark off the used space $self->{'curr_x_min'} += $width; # and return return 1; } ## @fn private _draw_bottom_legend # put the legend on the bottom of the chart sub _draw_bottom_legend { my $self = shift; my $data = $self->{'dataref'}; my @labels = @{ $data->[0] }; my ( $x1, $y1, $x2, $x3, $y2, $empty_width, $max_label_width, $cols, $rows, $color, $brush ); my ( $col_width, $row_height, $r, $c, $index, $x, $y, $w, $h ); my $font = $self->{'legend_font'}; my $max_label_len; my $l1 = 0; my $l2 = 0; my ( $dataset_sum, $j ); my $label; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); # find the base x values $x1 = $self->{'curr_x_min'} + $self->{'graph_border'}; # + ($self->{'y_tick_label_length'} * $self->{'tick_label_font'}->width) # + $self->{'tick_len'} + (3 * $self->{'text_space'}); $x2 = $self->{'curr_x_max'} - $self->{'graph_border'}; if ( $self->{'y_label'} ) { $x1 += $self->{'label_font'}->height + 2 * $self->{'text_space'}; } if ( $self->{'y_label2'} ) { $x2 -= $self->{'label_font'}->height + 2 * $self->{'text_space'}; } #find out what the sum of all datapoits is, needed for the Labels with percent $dataset_sum = 0; for $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined $data->[1][$j] ) { $dataset_sum += $data->[1][$j]; } } # find out how who wide the largest label text is, especially look what kind of # label is needed foreach (@labels) { if ( length($_) > $l1 ) { $l1 = length($_); } } for ( my $i = 0 ; $i < ( $self->{'num_datapoints'} ) ; $i++ ) { if ( length( $data->[1][$i] ) > $l2 ) { $l2 = length( $data->[1][$i] ); } } if ( $self->{'legend_label_values'} =~ /^value$/i ) { $max_label_len = $l1 + $l2 + 1; } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $max_label_len = $l1 + 7; } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { $max_label_len = $l1 + $l2 + 9; } else { $max_label_len = $l1; } # figure out how wide the columns need to be, and how many we # can fit in the space available $empty_width = ( $x2 - $x1 ) - ( 2 * $self->{'legend_space'} ); $max_label_width = $max_label_len * $w #$self->{'max_legend_label'} * $w + ( 4 * $self->{'text_space'} ) + $self->{'legend_example_size'}; $cols = int( $empty_width / $max_label_width ); unless ($cols) { $cols = 1; } $col_width = $empty_width / $cols; # figure out how many rows we need, remember how tall they are $rows = int( $self->{'num_datapoints'} / $cols ); unless ( ( $self->{'num_datapoints'} % $cols ) == 0 ) { $rows++; } unless ($rows) { $rows = 1; } $row_height = $h + $self->{'text_space'}; # box the legend off $y1 = $self->{'curr_y_max'} - $self->{'text_space'} - ( $rows * $row_height ) - ( 2 * $self->{'legend_space'} ); $y2 = $self->{'curr_y_max'}; $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $self->_color_role_to_index('misc') ); $x1 += $self->{'legend_space'} + $self->{'text_space'}; $x2 -= $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; $y2 -= $self->{'legend_space'} + $self->{'text_space'}; # draw in the actual legend for $r ( 0 .. $rows - 1 ) { for $c ( 0 .. $cols - 1 ) { $index = ( $r * $cols ) + $c; # find the index in the label array if ( $labels[$index] ) { # get the color $color = $self->_color_role_to_index( 'dataset' . $index ); # get the x-y coordinate for the start of the example line $x = $x1 + ( $col_width * $c ); $y = $y1 + ( $row_height * $r ) + $h / 2; # now draw the example line $self->{'gd_obj'}->line( $x, $y, $x + $self->{'legend_example_size'}, $y, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', $self->{ 'pointStyle' . $index } ); $self->{'gd_obj'}->setBrush($brush); # draw the point $x3 = int( $x + $self->{'legend_example_size'} / 2 ); $self->{'gd_obj'}->line( $x3, $y, $x3, $y, gdBrushed ); # adjust the x-y coordinates for the start of the label $x += $self->{'legend_example_size'} + ( 2 * $self->{'text_space'} ); $y = $y1 + ( $row_height * $r ); # now draw the label if ( $self->{'legend_label_values'} =~ /^value$/i ) { $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index] . ' ' . $data->[1][$index], $color ); #$self->{'gd_obj'}->stringTTF($color, FONT, 10, 0, $x, $y+10, $labels[$index].' '.$data->[1][$index]); ############ } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $label = sprintf( "%s %4.2f%%", $labels[$index], $data->[1][$index] / ( $dataset_sum || 1 ) * 100 ); $self->{'gd_obj'}->string( $font, $x, $y, $label, $color ); } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { if ( $data->[1][$index] =~ /\./ ) { $label = sprintf( "%s %4.2f%% %.2f", $labels[$index], $data->[1][$index] / ( $dataset_sum || 1 ) * 100, $data->[1][$index] ); } else { $label = sprintf( "%s %4.2f%% %d", $labels[$index], $data->[1][$index] / ( $dataset_sum || 1 ) * 100, $data->[1][$index] ); } $self->{'gd_obj'}->string( $font, $x, $y, $label, $color ); ### # $self->{'gd_obj'}->stringTTF($color, FONT, 10, 0, $x, $y, $label); } else { $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color ); } } } } # mark off the space used $self->{'curr_y_max'} -= ( $rows * $row_height ) + $self->{'text_space'} + ( 2 * $self->{'legend_space'} ); # now return return 1; } ## @fn private _draw_top_legend # put the legend on top of the chart sub _draw_top_legend { my $self = shift; my $data = $self->{'dataref'}; my ($max_label_len); my $l1 = 0; my $l2 = 0; my @labels = @{ $data->[0] }; my ( $x1, $y1, $x2, $x3, $y2, $empty_width, $max_label_width, $cols, $rows, $color, $brush ); my ( $col_width, $row_height, $r, $c, $index, $x, $y, $w, $h, $dataset_sum, $label ); my $font = $self->{'legend_font'}; # make sure we're using a real font unless ( ( ref($font) ) eq 'GD::Font' ) { croak "The font you specified isn\'t a GD Font object"; } # get the size of the font ( $h, $w ) = ( $font->height, $font->width ); #find out what the sum of all datapoits is, needed for the Labels with percent $dataset_sum = 0; for my $j ( 0 .. $self->{'num_datapoints'} ) { if ( defined $data->[1][$j] ) { $dataset_sum += $data->[1][$j]; } } # get some base x coordinates $x1 = $self->{'curr_x_min'} + $self->{'graph_border'}; # + $self->{'y_tick_label_length'} * $self->{'tick_label_font'}->width # + $self->{'tick_len'} + (3 * $self->{'text_space'}); $x2 = $self->{'curr_x_max'} - $self->{'graph_border'}; if ( $self->{'y_label'} ) { $x1 += $self->{'label_font'}->height + 2 * $self->{'text_space'}; } if ( $self->{'y_label2'} ) { $x2 -= $self->{'label_font'}->height + 2 * $self->{'text_space'}; } # find out how who wide the largest label text is foreach (@labels) { if ( length($_) > $l1 ) { $l1 = length($_); } } for ( my $i = 0 ; $i < ( $self->{'num_datapoints'} ) ; $i++ ) { if ( length( $data->[1][$i] ) > $l2 ) { $l2 = length( $data->[1][$i] ); } } if ( $self->{'legend_label_values'} =~ /^value$/i ) { $max_label_len = $l1 + $l2 + 1; } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $max_label_len = $l1 + 7; } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { $max_label_len = $l1 + $l2 + 9; } else { $max_label_len = $l1; } # figure out how wide the columns can be, and how many will fit $empty_width = ( $x2 - $x1 ) - ( 2 * $self->{'legend_space'} ); $max_label_width = ( 4 * $self->{'text_space'} ) + $max_label_len * $w + $self->{'legend_example_size'}; $cols = int( $empty_width / $max_label_width ); unless ($cols) { $cols = 1; } $col_width = $empty_width / $cols; # figure out how many rows we need and remember how tall they are $rows = int( $self->{'num_datapoints'} / $cols ); unless ( ( $self->{'num_datapoints'} % $cols ) == 0 ) { $rows++; } unless ($rows) { $rows = 1; } $row_height = $h + $self->{'text_space'}; # box the legend off $y1 = $self->{'curr_y_min'}; $y2 = $self->{'curr_y_min'} + $self->{'text_space'} + ( $rows * $row_height ) + ( 2 * $self->{'legend_space'} ); $self->{'gd_obj'}->rectangle( $x1, $y1, $x2, $y2, $self->_color_role_to_index('misc') ); # leave some space inside the legend $x1 += $self->{'legend_space'} + $self->{'text_space'}; $x2 -= $self->{'legend_space'}; $y1 += $self->{'legend_space'} + $self->{'text_space'}; $y2 -= $self->{'legend_space'} + $self->{'text_space'}; # draw in the actual legend for $r ( 0 .. $rows - 1 ) { for $c ( 0 .. $cols - 1 ) { $index = ( $r * $cols ) + $c; # find the index in the label array if ( $labels[$index] ) { # get the color $color = $self->_color_role_to_index( 'dataset' . $index ); # find the x-y coords $x = $x1 + ( $col_width * $c ); $y = $y1 + ( $row_height * $r ) + $h / 2; # draw the line first $self->{'gd_obj'}->line( $x, $y, $x + $self->{'legend_example_size'}, $y, $color ); # reset the brush for points $brush = $self->_prepare_brush( $color, 'point', $self->{ 'pointStyle' . $index } ); $self->{'gd_obj'}->setBrush($brush); # draw the point $x3 = int( $x + $self->{'legend_example_size'} / 2 ); $self->{'gd_obj'}->line( $x3, $y, $x3, $y, gdBrushed ); # now the label $x += $self->{'legend_example_size'} + ( 2 * $self->{'text_space'} ); $y -= $h / 2; if ( $self->{'legend_label_values'} =~ /^value$/i ) { $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index] . ' ' . $data->[1][$index], $color ); } elsif ( $self->{'legend_label_values'} =~ /^percent$/i ) { $label = sprintf( "%s %4.2f%%", $labels[$index], $data->[1][$index] / ( $dataset_sum || 1 ) * 100 ); $self->{'gd_obj'}->string( $font, $x, $y, $label, $color ); } elsif ( $self->{'legend_label_values'} =~ /^both$/i ) { if ( $data->[1][$index] =~ /\./ ) { $label = sprintf( "%s %4.2f%% %.2f", $labels[$index], $data->[1][$index] / ( $dataset_sum || 1 ) * 100, $data->[1][$index] ); } else { $label = sprintf( "%s %4.2f%% %d", $labels[$index], $data->[1][$index] / ( $dataset_sum || 1 ) * 100, $data->[1][$index] ); } $self->{'gd_obj'}->string( $font, $x, $y, $label, $color ); } else { $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color ); } } } } # mark off the space used $self->{'curr_y_min'} += ( $rows * $row_height ) + $self->{'text_space'} + 2 * $self->{'legend_space'}; # now return return 1; } ## @fn private _draw_x_ticks # Override the ticks methods for the pie charts.\n # Here: do nothing sub _draw_x_ticks { my $self = shift; return; } ## @fn private _draw_y_ticks # Override the ticks methods for the pie charts.\n sub _draw_y_ticks { my $self = shift; return; } ## @fn private _find_y_scale # Override the find_y_scale methods for the pie charts.\n # Here: do nothing sub _find_y_scale { my $self = shift; return; } ## be a good module and return 1 1; Chart-2.4.6/Documentation.pdf0000644000175000017500000151115512033072734015434 0ustar reinerreiner%PDF-1.4 % 3 0 obj << /Length 491 /Filter /FlateDecode >> stream xuQn0+x$cE9nMXR@-KKy;3;+ɖHZfqq,QЪlVԆ4-JƵ! /SgHM7C*OUӰ4l#ּGNffw€"\+4?3Qp,VPN ЪF+l]B4 MKR _KY( œտsp CO9]q0Ri$=&VXiY pf/6#A(.,.r-}p`Q4- _G)z v],(*3E4]|øRZUqvq,M>~c*g8 [%2uœq~ezsا.1ݔ8,' fR-.qBsWeLf?gu4<Sg[n' endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 1 0 obj << /Font << /F16 4 0 R /F17 5 0 R /F18 6 0 R /F20 7 0 R /F7 8 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 13 0 obj << /Length 403 /Filter /FlateDecode >> stream xmn ,= IUJ]5Cd<®T Y|s Fu0PTYRkeE;;[ |2nﻯ:uAkP܂qHƏ.SH;4HtWꀋ|}+KSM.R*U*m$a S6:MNGqkF +9d \;^hpBY.E--oJH@5nCXL3.,!FAI׬aZP=!aR UX}+Uˏ6oG*2Մ@^ÔDC$ǟ֣J;N2,ҟOOOBs7;طi-Hր֭3j0mnp endstream endobj 12 0 obj << /Type /Page /Contents 13 0 R /Resources 11 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 11 0 obj << /Font << /F17 5 0 R /F29 14 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 17 0 obj << /Length 658 /Filter /FlateDecode >> stream x՗o0+|LIv0iIVX %AgaZ`%&xl&wc)@\ 1b&:ZaPP^%0Fu]|yQu9^ч$|pZplXfMTmZXc~}8b0"u d"z [2>4DZЋ`a^K"IC@7By[RI H✛ Cu5tt!1T n(c7Xit0zRO+_j,}AF/2׫psv8"`O`R;GosjdžɎ̳=5@u rݕu1Jb.#`hMM endstream endobj 16 0 obj << /Type /Page /Contents 17 0 R /Resources 15 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 15 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 21 0 obj << /Length 700 /Filter /FlateDecode >> stream xڝV]O0}WDSԘ8`|jm*8GG~ءH{}cDZVc]9f;<# z` ]kZE`4[C" }N3AYX&XDz]ɤ[,iBSV&y! i"'=ɼ_"t*9PNp| #K y7,,XN髊Tp7('ڙqx }8R MIÞ35WVH4*2sT q3%@Ul#LL?h}';>j+s74x'TZND"`.o㜨G:dq\zj ~-4mn5ٱ{;a eZ5iѶ|g;6cYPfu~{ AJ|֘ ܐwSRPa{5qKv5R&KW!I/UK^AQTNJ]W7۳ٻ]wJ?N`SJo?ݏb4ō RԚ` k"-_ XWJ|="+xEoDpJ++xe雷[vWUWt7-9 f^$k4/'B^P{K: endstream endobj 20 0 obj << /Type /Page /Contents 21 0 R /Resources 19 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 19 0 obj << /Font << /F17 5 0 R /F34 22 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 27 0 obj << /Length 1852 /Filter /FlateDecode >> stream xڕɒ_#U5 er3Y*J}I>Et . HM~)RIڥ/JvOdD֏w?;URNe:.Rˍ)w??\hpFmkT_?Rť㻓ŏȤGuRO, Se9@l"5JyUL4=y\׋.2OX G18/JJcU|K<O@ 7 c Cdhmi] iޤ*iAE4[٩*zl Ӟ`8 bV:J&i ,*Q PqGݤ 4!GFۑϓT40'||c!S:h@[zTο"ף; MU} r[fq߹L!{&N~/^ :n'g{z}!ЏƏ`Mڮi+8ZR2Ve>ABG4Ov Fnf9&qՌrhccaK%<0Q2*qO"ec[FLk䍶uqE ;~{f*wҙ47SeSeIrU'oxD?K0Wܩ""eI ]:VBBMk_.>L7W.I:\]ZhH$C3rW|[oi3>H &6IƟ{_\0Yw.Ȼk5h|D|nmw1%㵣X#/Q ^ #$e''-R auTs#C0&Q",3-'(vEwmxωQ.9yJ 'H`IYgvE$ԟ1囹 5RYu㉥9~ͺ,zfjqn[ρd qFZPǴR('N7KX__y@HW!IPa0;$2ЭEⅵWLˣ`'8PE=KH;y 9x,BT Zķru xApmo]Y2nV)a8Jvv?OQdj3u#0f'(س/K|jD}g1tV>tF&17{-ťpO 4U|VC%>0jyQG |kBH5VQ&#P+NB~ ![S %BQJS'l :.Hhqe3X1$Q72I$O* UՄ) %ߌ9DuD;z^7c?8Mwp/Qpi+nB3˲նX(#rN߳dK0l)=k 8Hj%D>W"Z vId9&05gЀΫ$hBv5L5kR] mf7.3?$*{@O F크h3TsFb׸s-Mt;|׸'d- rhF9khcCxu;#?PVCxlp%kV?n<E#tA[ "r{(K< MUskx'\Cv#Z'A+{2PdA/P3xM-HJs !${ji/xz-!iСhO(`K endstream endobj 26 0 obj << /Type /Page /Contents 27 0 R /Resources 25 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 23 0 obj << /Type /XObject /Subtype /Image /Width 521 /Height 271 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 6037 /Filter/FlateDecode /DecodeParms<> >> stream xb?(`Qi4F(`F(`F(`F(`F(`F(`b Q0Q@<Ѻa( FǔF(`F(`F(`F(`F(`]4 fty(4Z70k`1Z=Q@E@cJ`Q0 @FpȃNȝ R:%pep5X1Q0@ `8Th5DZƬ9Fcg Q@u(=4@dqLjK=he0 Ѻa =@p.`;`F0U (5hcL@Fp9'G(X@ `8XDj!F| htLi B3WbeRπQ0 =evki8 YF( (`t@u(`t@u(P( FQ0 F( FQ0 F( FQ0 F( FQ0 F( FQ0 F( FE0z8(hn0k1Q0rGQ0 pF(`F4`G(p@u(`t@u(Ѯ(@ `Q0 @ `DwF``4Z7Q0 F(@4m :Q0 F~(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@u(`t@,T1q4(Gv u @,߉pz>\F#S`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Qhn`Q FFFb "R֑` @{G(N X1V@FJcxw&Fwᑌq%TH@d @u(Ԇb@)Q0 FFPeHh{pQ0 hhH hsxnU F+Q0 FI*!eQ+i5A7ZQ0ȫJ%zu}G`R Q0 z\(G(C 4uLUï$N(ɘs4Z7 Q0g@1 @SmfoZ(`$s4Fh$za1AdA-F{-Q0xZ94Z 4:0 F -}=2oa&-1@ }ì53ףa; m ޷aж9FhmFQ0JF ãQ@<9Ѩ@uUaț}bsX .tƵ{0^92U5ĐNQPa~ ^ \8PMZ$'zr?*B&@P1>wd Ti@2CieH!ѡ) @Cr AA>[G(CАoO"rEa00 F@ uJ溷,>FHɅT9>q -@kXI.4iTt`1J.FQ@Ϋ1[ôȭBދF{ Q0 ^!a=2֥i >k΁:O= !]Ș҈*+GNO*@P=?=;o[T t[lF }خnD\`cX| k ;ZrQjz;J!^BȠ[OZ6=#d H=w#p1MBȠCdbwl$dA[4s! Z0cþ=-a7;S-.V4EGd{vT>_E u4w h̎!݄u?}@ *M{: )  IE ad50?C-@,?&0~qV.H^%4 t_a9Hs7e-[ @Cn: v4}phsvZõ,b]d :oM,_i5h"ǔ׈=]~QGc}~BH%꣍Zgщ^L?{`@EY @,#Qx a*@ XM`Q@aoj5G 9@T8ko@nXst_4]Z Gw1 eșI'ːK) rQZR;G>c"kÂ>e @=Z?W1;5y8ke<@P+Vk5cJ4jh {H(+p\(;t=@ D@垴>q0\zNc,#m1s} XF(Qj@6 -kj B@,`ewaDu:[[kzǦC Xb"Eޖ0@W΍Q0t3@ g< XbGsԐWK]=B2@ ТQ@,C:JA~GԀD +߆ @Ep=%$I9f:i6F݂5 Xb"s@ӧToc$A#ahhoFªoAptwty-ːo`4_ ̀.3ZߏEtp5O~'*û;846eHG<=0m5VV\J@ ň/PFnNh?i$'.0=FXF) F[d.$6Αp5F yJ_iGT c$ih" wHa  FǔF{#D!:, d,݆\oyN(bc@7>\( F놑;0zh= F.@d.vy{و9G( Z 4Liݰ첌wp V\(-A{`PhtazQ0<8Toh0 FQ0<8TO4:= Fp&:0= F( FǔFrn9 F FQ0nFhH@u(^ЎQ0sT FzQ0 Acfh0 F((`FnQ0 Fs FQ`4hhtaQ0 F:ѺaQ0 F:1Q0:= F(@4Z7j`QhtLiQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F:ѺaQ0 F: z0-nQ0 Fa@.֍;D+ZԳ48z(`4@ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @ `Q0 @y endstream endobj 25 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F35 28 0 R /F36 29 0 R >> /XObject << /Im1 23 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 32 0 obj << /Length 674 /Filter /FlateDecode >> stream xڍTKo0 W6Im aC}vp%ؙ-7ؿeE H9NnWR?'H.Y&syRQzLEF-|Hn/U ׉%s|cZDpVBrKH䂨,aBKRn7zcw`8I*/X)MH'MɌ-e兢T`}^bA)Pƹ^.0x|μ4Bۮ]^ sZm?R-*օP[a{k)YC|$VqHV6 igUvLhK ; a|T9IW853,3Ӳ#zoYfG =GZʶգI Lk *_\w킧V=tEtP/6.Cձ~حZ-%=SC˵ ot!qlr0no` %%4uW[;zbzu87əp !0F`M=m6?Z!ryVʊ$;oPOi;P.Ej1#y/XV8qzen C|^3r$ vtRzLݸ.WiQ endstream endobj 31 0 obj << /Type /Page /Contents 32 0 R /Resources 30 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 24 0 obj << /Type /XObject /Subtype /Image /Width 512 /Height 384 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 6518 /Filter/FlateDecode /DecodeParms<> >> stream xb?(`i4F(`dF(`F(`F(`bA022(` c XȍQ0 F(N@C@`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`G+Q@-@(>|Qh? F-@V`Q0B@V`5}d.  Q0 4ZA c>hѱ BJ00ZQ@ `Q0 F( C6G(h0 0=pJ@Ѯ(#h0 Fi)Ѯ(d p6VA!Q0 (4` h` h` h` h` h` }膚Q0 F(! +*.}@` EFK @C@`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q0B@V`Q@`ddfh0 F(#h0 F(#h0 F($Fd@T WK;@F(`Z.L4`jx)ObS h`Q0 P]%@V`Q@f>[`jvp5aW F{`Q@r^pA4YLͤ `Q0 -IehthQ0 d/.@=Q0 F(Nўh`C4:4 F(#h0 F(#h0 F(S.KS@(`V_Ij-2 ; F+Q0 F( F+Q0 F( |? c;)N@V`Q@Y@Ge4ZQ0 FcF(`F(`F(`H @(`P @y@7 F(kxUY F{`Q@50n(` %+E4ZQ0 Fuٲ"!Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( uxL`tz(9kބl;@ ||zh`9w=qF(؆ AF{` :`6<@ D6 F(t6@ eFQC>Q0 Fh=B@V`Q0B@ `#9~ EWl7 F@( Th68 !&(`4. &9v-Jс!\\VBd"@hm@~raFahmb߲7 (GkTl4Dg@,imf>IQ0 va C@򇼀dAD)T,>C=P7GG HQz!W5!; V-у (Q0F} уh h,PF?0@ã U#,-D$8N]@"T4V  R3<Ѣ!Ѭ>r`t u@ hF(C6ZQnb9G` ~@h@k@,DFZwQ0h[luM@: F(-aDl@Sp&e `d.ٟF 9x Q0 OmGS@C@`DdLgU3 F(DTv0FchA bLhQ0 (o1A@s`۷m p51 Fy> XȈͣQ0PDIďQ0 Fx7hC#@LA0 F(lm)hF ]}Q0 F( ș`C@ht(`ͧmP"4(>=@ bO0 F((`Ёѝ4ZQ0 #iw(`,F@ t`ahthQ0OZDQ0 FhBO@ŒQ0 F4:4 F(`t FO` t)@V`Q0B@V`Q0B@V`AF7$(` s44` h0 F(t`t)}@V`AFx` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` h` 322thF3D A< F(i'!Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q0 F( F+Q@o0{AhG($ F+Q0 F( F+Q@@5u i` h0 @D:~]XQ0 hT!P( @,A0 HKjf>]X{(hH9/ъlu.\ \ F(4:4 _OP]( F+Q@Bu-Yσܐǯ e? FDWa d`h`Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( `Q0 F( =eQ0 Fh)1h@W[G(U4:4 F(#h0 F(#h0 F(#h0 F(#h0 F(#h0 W_ 9 F 4ZQ0 F4ZQ0 F4Zyd( zwĨ`'?KlL{Q@@=Q@$Q0 F`4Dumv\%蚟Q0  `(\-z݅Q0 F@*W4R< F(:( gڨpZ׋`+0 FBգ2F(C2 H +` h` h` h` h` h` }ޜQ0 Fy P*ѵ`Q0r@Q0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F4ZQ0 F} endstream endobj 30 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im2 24 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 35 0 obj << /Length 10455 /Filter /FlateDecode >> stream xڭKI+b~1rQ@R*!*_?{%]=wS*T1g$gnNۻwݿ~ovj~Y<ڻ~ۚ?{ka[AuNSOw~}3]ۻٖQ#~S sM_kvww?4?~o_~ϟհ<.oa}hml~o!:3r>&ǣc6L9Wg=<[ʹu]iޮr|ʧqn (^/y} d"ROlԏYkť1CC"j@ho60!uJ$ `1BTq/IQ#O8FqZŝ@r#Q((4?AF2ldov49JᴦǦuz,59Jez"j=oH7+K&^vtͲN9dcqSKH"%G Q"ҢD?A;t *TU۲Vk*e )hWiѳG{P z.1j-R"BџHDi/""P`m0"B*H@#Ҵb놘뛶n,1 ^b}A',X1ZG%FDHĈ!%O#"PbDJ%FDH (1D.ن-Ėi(|ٗx]aՊ?Bkkp'GhM/\ؕʅ̹U*m-Z'rZ[ȟ-9צ]A Ǡj-"" CDz@#W"^fۺ^vzvtvCj !O^!"+D?A{@ !B$WW햐^,Ǿ}~z>xXmM}?cZ?< d+,$'.C3IuH#.r5iѶ4pi&13L FjyiZ<2˂F̃}*8v dDhk}qI?CF ^ DݐH0Ǐ>WLxƟ75[9VSbzV7*&"ЭJ"BH@#ˆi鸺Y>W_?Iz5꘻^St6fBclcwMxI*"$*D׮"xdZ @*@j7HD\ED~W@UE@0$",$qa Ռ Gh%RD*+me>:3*93 b4yfDk>$|&,F_Msm#P\MjӝktGG6 ZvhbvR`]/_;n>AT_.{yR)2Rk-,PKh Z V$ ԅ (Jb~Y.X@5 %'th W, AeqA14K+PuahU,dw-G~[ӫo&CΩ_^lᆵ]+ @By&RYHH/ ȋ""> >)@^g/ B@M0yQIFE @B&$O#TFv0NP㑊)m t jUؚyd6j:R # 0Հ<2@€H y`6` @ $  " @T֑j@ h ŀD5A" 7~SS>X?|TOJrUG4Rud!UG<:2YG4Rud!#Ĭ#:#): TĬ# YHYDO dTYH'BGQuty%k`,Ow)_;m3)= Ke[Kj̀~OipGd #P\]zԝ{=rG"`ZDVDAk#X֘O$tsү6/C\=;}FDZiDT?A+@Ri4"FDZi[[+|gU*4*6.>&LwX,x{6췦۬d|J5 JrmـG겁DY l` \y.XH)" 7e @ʲE7@]60$ ,$eUl` UmU|⣁T#h/;1ۥ6{!޻n[7vٳ}`Q"ZG?AMDD@-DŸOD1|M?h-h"BH@#СݾammuC9Xǘ-ڡ&8f\?CR/ ,4eWK yi"! ";R>)W"^FD$ )@B<QAĕz)a!/b Z"O#D.;&ݖFu7pExZߤrGd#`wB6?Bv' Gh"ԫsR݃@Zak1d[n_ Xˤ%g]BDKclk]="CDH{t2GhR&De,ͼ֥72ˮ*?6mٟ7o_>U'DgĈεï(1#" ZbDJ@#Ĉ)1"%%Vo)YmbJ:Ek^k<&RKGjI֑$i$5M$J'ʺE%L#i"ye]$i 5-bvuMrnU9dG >~]`ڟ :{B#" (?hƟ ""B ޟMD4?B#`m~MU04XzMbb* 8ZLKpm#uo!ёH:RKG$BJ17ZĀ%<#KV*4 Ѝ7 Ý2p'ܽ ZRoBnFwMҫޥm-/ݶV Cg3U\Qku]-/"EDH}GhaDJ-֦im~ڦǘ+j(8ͰK-7.0>hKqW*1CI|{꿿UL 8T_ ؏B~P@B|hz<ҳEyb<<.(bEvO\@Bthܺ4m޺:O/˭oA$?dix*H&.@M {D4?D$\'hyM;fm/g?}|(o۾z\!|~yRi-he\+dID'@tbH1IRYwVjAbU:wjr'Oބ;20Sq2yG7Yr'`$o@ɝ[t"oBqȝ 7Ao4CԌl򥯓ă[`+e ޳b[ތqyA;ޓw.b[p9ʤ>^+0%5prS{v7fH2|5ӄtќoDޠHonr_&HedVQyH10=4?b1pXJ?khY㬡f!KPD¥ s㬡=#L׹قL.п&DDZOD?A@9-"5BDGZ$ Mi3fT?"wɒK\lj7Ѿ<|zzP듓>Gh#r#'' Ыr \Dԕ4Gh]#;B'u洄9of Cec?65VNjw@#>V+Z ,T4i>"#"T?" qM.ogMa{}d? ܝ1]v/_j_`8V,JL.HGb!Z}99hdnxy< oG" y$V -.L.1Dc!$ԥ ELUL˘'G\ Mԏ߿|F#~?j׻O5 تi By$h i BB<4Y4Rh!U_~9{O맯ؒ=ɨ?"2(*om)h]?r}uѳögsgmGEmX;ǝw'5]S }gg£Ous<7?"7;#7^*~ޥ iߏ~׬l?]lKj]3Jꧧge mYFnY-[Zǝ[wnYcܹehYܲD,-˟ܲ-,--|&<]jۭ"֓W?PqkB%|zT\R6^K9?Dd0sOV.e~ZָQY O0, bٚnYIJ4: ^%F,|lZ8hn47HMhV -R Z84LYgΤǂfPTBuf!Y%k@dy05Y<3K-LC )P2R6Y'GR~힘 S>noq{syg#WXzYST;֙Y<3`Huc3 1 3H'f1ً֑LT-0EV @,Eh0:@28%Dc״x6L!N,t?53BU<4тFC-(T;̬GhAՏPbB<2 `fC@ՐT"-:24Y<4K҂’LTMirߌ;HkӶ-LЮ1,|?,]#,h U42bd $H,EY(@i B,auH# ʐF &f֑Y,РibAT C*pi%2Sz߮|T&=pY L`W#>}ֲ#=T U;p?#u(۟ ٟ+֝Qt?CK[͝{m0>1M LsHL#>5^+k^#2kkD^G^#2׈ 5F5"FDh3r-]A^rkՖ *Bɯ"Т RTW h1,(/ 37% T5*yM`ꪂղb]b`@Mxh^[OSW,,;:7Ƥ{|{|1?> endobj 33 0 obj << /Font << /F21 36 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 2044 /Filter /FlateDecode >> stream xYo6B2fŇHjwɷnʖhז4;ádK;AS`!Cpq&J 7WL*-눋F:L6*bXrŋo\|,KSw7x[h|[s6 ˒18F.%,U6+#Y۞lڲ;C=aBs:RJ۝*ۻ.<ޔᓣm뫦vOfƯdʌLH&sm$ЂI[,q[$_u}{Zub v;m=1gL$%J̘r.8pyRԐ*fK7]Շ7[}Di b r0]m7?Ӕ^~o>ߜy,Ls^m|_eк)piS4US}쩮CTuXyuhfϰ2q P!քb2aVer'|J))>/w >#yV!Zp㢬,jpn7й | v@(n< oaaIܺY[*gj߰xC;Y9 hP &[m#rN kT27)wrY9J;\m6[8Gjd)\~[]a#s@1ጄ4jIICMO]0"KڑI2D:@$*);FB6&r sC_q(k 64ɑag@ie{_ո(/ꠕ+#:P<?P!&9b/BQ(2#$/i.^_]|@wEhhe^s(vFw6LB`]^~9zԞA%IPybCHhgoR/5@sc_5i!Ŧ>\ාEHyk^.yE1óc>T/9X@<+!3L|BAiߍRɤG\2>M82 'Z)V;{-(HAe:ޖuÞt(j@p}U cDՁ|qGlwǼc]TL9ڼۡ3ЊS>p_#,侭@c4RLnj ~4h ŁKc}klO3cWCk0AIGvd/#@ Gp͌̀)" ?{NгKg :J.r[_"=3S/=_C?TqzơqA}+CŻwJTמNRQ2pݺ (5xfQ)=kF` -QqkڒXY3 n G@8STj؊ EЯ ߸Ŝ |=c81>5 #]hMƶi=nm %Y|l A,p?dL endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 38 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R /F37 41 0 R /F32 42 0 R /F36 29 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 2296 /Filter /FlateDecode >> stream xYm6BW ;^bk7loC$./6IQCp3"ˊ짫"7.:3cLf4gBvW .:,vq#ﷻL^ښƖH϶k?,S|u!l^p. 8mŻ_~x#tsB [􀓮^^ gJHWfwEdea>LI]唰L=qWw݄a~g/r*iiJͪj0l]F+R^3`f rR24gᙴpה K FпQRV'̭{©ŤO:a gs~+twgf-kݫiCJ& ;vƭna%nم{+"_3]}Wو$S~o+/-4F,̦5p+MTyYϢ2Ȳ_* '>:e{";7 fC0D"o]}*S-UmI|z^@~F}ZDӑj^C/S y*J:D)9ɶ5r GhbM N. 8v\ t=EacUa$Х!l6a==CF9yqžRp(xK}(0luZFŘ᣶: e r<|t.\X.+`1{AZ܉l-q%@ݐ({?"&X{y4E41@3S{y z&Xgk!Ƕ!dž/G_jz[N *`ojzw) ,1`Zm(Q >K6 Ә4 !2<%L0ei?KaX.䪯1X}7$ EliE Kg, onL[{Be},T/hxE5 n ՈXB/DBB,5I"gxbF y}CgC%Y x#=!x4M{JЦl"us .xгpNA(L8-g%=)oYsDS)r)Pp9?.H$v!^ȩtNu3Ú2E W8ImlRLɶ~5u2T^|P{xk rf!zH]_/|'Y<x`12&e K+v@%M8'q&Vo%k0EܵS VƩtĒ5X-]e1$%sB2)s60$wqEώR2QWR .*PB 󈻻}_=T퓟fm.%B8/ qy EB2? `wڔV endstream endobj 45 0 obj << /Type /Page /Contents 46 0 R /Resources 44 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 44 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F31 43 0 R /F32 42 0 R /F36 29 0 R /F30 18 0 R /F37 41 0 R /F38 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 50 0 obj << /Length 1929 /Filter /FlateDecode >> stream xYmo6 _ 7ZM7 v0`Xa7qܸGJrb6>)")|d^|LȄQь%W ㊘&Z1•M.ɋI}y={y0!38Q2G,d;yzq :MX¬%ܢRd~s%M0SB}M"FUɯQ2NcyE?斧O| J KΙ Jf^ŪlgBg{vnnUιMaMqSπ~.*?J.Hʑsɫ|%,bҢXWx\W4K+|gK\Nt v\(bv-:t~`e]הw]Y9M unhH4p, ʒ[ӵJΫغ\B,AEv\gsUJ97\JiƘ ^f5F|2OK51b/tOۼ:hUNWg]Ɍ5AynuWеfw' &d(zϯU1Db`XXLʶcN:;I-sps/[eX.l|EK`Ig^&36P6e&1b_(; d|q%QtԒ zB_M~?^'9 VMQxZH@ h(یϢp|}[obBo6 8~Q~g3ߘ~@&qcMp0ts _ń{w,@_2r_#XCՋaApCp<}51+(A|WkP9RӚi~⼱&z,#e(a=0 Sf$6w%͸8Q~DH"c"־۱9l9 RDQm"m0,;aAf .H1HNT=_r_f{/)Ɏ endstream endobj 49 0 obj << /Type /Page /Contents 50 0 R /Resources 48 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 48 0 obj << /Font << /F34 22 0 R /F32 42 0 R /F8 9 0 R /F36 29 0 R /F20 7 0 R /F23 51 0 R /F35 28 0 R /F30 18 0 R /F31 43 0 R /F38 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 54 0 obj << /Length 2793 /Filter /FlateDecode >> stream xYݏ۸߿=%jIs(ٷ$)2m"[D|烒,/Y\"g3!v,^_%۫B$qbqYLY-2-bvx*2?|g`M_mk4_90goݮ^I{SytW7 SǮ>\È㦃=sWvlv.&cJ r8ӋPN i14LΖkYڠ2X['XVG>L[Š:Y,zf{7d]e<]Բڂ":@]=(zd2.u5+%L=RB@Q9n߄DMbGQD'hZ"ˣm :PRčKXYXtvpn#kԠzLֆ̊|n/C8-d温&9<R \M8$ʨ8k{)Sh=&'%_o}L% I `Qy _}Hky]/T*Yc|K`9-diD@i`d4 3E+x;q6IZB -RiYw|ﱾ'T[?Z6m/a +~ ܌ 0,?p =S3"C}"K< @D=>c)Fp @`޺Kv3J3Q`H l.Й%pJ+|zs$`& J6io,@vMymEn=T79M/C+ޙWd}pM1EM2bГCx 5Us%g`ɉ~d77?0YYr kbD`տ3vڃ+'(8 {`z:LssO$eGmA'JTLH>Ĝ7H>şZ@C`=~!kTzT܇tNyMk++9/Uy ;n7vBa$]U qqhT_}2 >яHNDބPb~%s.B&G31PO%d+ c ū:Čq1cDʲ \ L>գ?~Q=A W)3 @T{$D#H0=,T@B&X \'W7ERʅ s\9GcS-,pO s 6RGspb ЀbPЧ>Pd|| Hb`x,ʕ2r-j;>)QEO>>{xxeؕ>zX( Дv˻֒sī<)=IwLTTɔȗ @ w ,;%‰M\1ųbO<>^Ajm:[p9 ]kN -QRPJUoQm 7qZUU(4JI&Ӑ',9$H{\]@(0P5jx؆^دGZEb1'gX1'ܜ!x.}/}@V6tVjsOiTޢ ":]ĚGMTt=rM:^5!Mj"ba.@C*)0Yɣֹv[ O@=ʐ!7(X|:9'`k,{cQI~Z U{zgюNzp/J"얌:P pXUۭC5 ,(g0MrYQuyq/ Jo<@2`9nWiq%j Do6MT~h$q0'T<ސ=q!o\Z{qOϯHTDVc1,QbpWz_>m=pFԪw;@ y\HbmBHIY<ym6[Lhqr`9!w2&$1˴)+xmXgb:ʢw{ T$zfL|ޝ8@νx?!iR YpgϏU'~ǗVofwr,Vx*j\]N刊Uۧ WєN,ܠkLH z_)̦@?LwQ endstream endobj 53 0 obj << /Type /Page /Contents 54 0 R /Resources 52 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 52 0 obj << /Font << /F8 9 0 R /F35 28 0 R /F32 42 0 R /F34 22 0 R /F30 18 0 R /F36 29 0 R /F31 43 0 R /F23 51 0 R /F17 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj << /Length 2200 /Filter /FlateDecode >> stream xڵYIsFWfl7}$RTRQfI$J `$0dKvr{|okū*^}s~޼yJNn+iZ%V e~[{,yM>!b{|h#x^oT]WTG^D.ykmﱍXodDG:|ppWteևn M$Sq7R_mM;u*.^&*Ձ+A UwEM[/9HV,2`wRzԡ׭U `Tf+kDNӱ^1Sk.oys[_:OE  vKH=܌Z`PP51c?G]MF:­p#)S*S?eL$:) >$̕Ds&KXs1ɧc1[RՈ@W7p}bA%LT# AAԾF|eA++ IUwU_47IA7kGGD'O`&};}!L*HeP0;{l9 !'Zdnf .à+ Zqzu)xז0W*aK)r5F<ς6l@ ED\O}hN"^HR%BgTD& q|rڽ8v ADQzиTU<*!T 3j<-Ǽ'1gvc8]TA𢯱4ӫve݂4s<嶫"mz'vʒ` Pz]Bޠ}{K*~hʓg@@|]}:]-ʢ:R,եE( Olc zi= HAӓbz̢:FhYtl =Pqʏ>vu]8\rtd<r ŘåŖs_\8@z˓3IGH3ok44 y?ޓL@|ͺg805\{.Bš`&8i h%"{KɬlûtH2loriKk(AL΁οL_"ZWR&*×Ѣ2"/ 4R7 ˣd@If)/9GT{\j:YǢ>?Tzã#{vǑQN9 "Gd hX/ |AHgZ֚9_aYSM% endstream endobj 56 0 obj << /Type /Page /Contents 57 0 R /Resources 55 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 55 0 obj << /Font << /F32 42 0 R /F8 9 0 R /F34 22 0 R /F29 14 0 R /F30 18 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 2636 /Filter /FlateDecode >> stream xڭZ]o}_CX(-/E1.[vԱTV&\%N<_"qyR͌yw?ݭgf-nv͝ʪv?~R| i/e]NƖ|t_&\7+*٬]mi06mC-6Z. U}jV~}6Xl5VB1a5911cP%?'6sСZi.9WCmcSw՛{2Zl׫P.my?ס=g:[6k"kG]K]kKUJe|!4QuC7ެ5 03sMM6_Ė_|XֿqWX6*N<{b=V^&GwX ' ֫/sxȧ`V w8y K*:܆P0+tY&93ʌXhÉ +ۇ`(ql1S.1ʙ2%|m[0t69۹xM}oj uuS.X0eGM99|B)#g?`$WlfZf-w~Vhyƙ*we;!DM'F3-+Xab;%AwKfOtE% &~B9>2mE|eٗ{?\!С9)OWZ<5M "O e}%8#1نݦtbq-uk~n:Tv7)zSS.&3_`Ѥ'.P:C)9zS' b#⧹C+d<Y^82$ar>rG̓%Op5#F4lKeMہo>'.Gx7jg:͙TUs >q*J(SV8'9W 8120xUUv@ZP9G/P=V> ''9Q"SCTrhb­U)U!3(#-Ag)?zV|Qd Pb$+l06KQ}5m+wh}_n6YCn@QgD +nj}5e:imUh}+BB 5׏~BC# ?xO%=E[O6]UE[ ]~%U|~%7~M ޒ$u<(^dh,+UH .3]w7:z|sL{`r9a_"uP!c0Nh"(`r ^R֚E(^储ل,CGE5OhܯBdO5it44idZbs&2( \8$_78S1ciAYD&}}r>NciZ[cWHMdYj(x.rHM GGys62 =GBoOUJH 㲓wOE@[r;aI܆g4iyy+Sj5/{E!91GKPYǔW١rt TޮcUU(15U!EW2"#nK;3#^ 1wDlFOqa}>u@ ^@BȲ!ǠgHf dWH3ad>ݩr* ά˯Vi,[V2gT9'փ 2L HXy5g%U挚h2{E(+nsx##rˎk$$oxW) rgϻ/\MLc0?< V#):Y`]c!$Rߴ[AX-3g* #;6p!?KP`qzp)ŨCfU>> endobj 58 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F31 43 0 R /F29 14 0 R /F34 22 0 R /F32 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 3100 /Filter /FlateDecode >> stream xڭZ[s~[ !ykҤ=yLxifH9Ա.@J Y"ˇog|~r33{>qÙ1ff4gBrKv.\V.\\j[x*]˦8|*o$)qga$%#g\G]Δ:&xf;tt;W^eELJEWmn0ۺb1@9bݖnj4}a\rì9L+j$euIN/FaBgu8W|l֕elI6[&v==e|P5J<懞ɱ۹y! _BgXONz@BI:cM^C%.Ѩu$^!', *v/~uqO ՐLp˦U<[Pݧ07!=p߇ qXAHaz7?|gY9io0_~L*f z_nMP &b[)NJQl9sjyju'K:G[g'Nz8*qv ΙL;WMQp s$KsXoJ1Xw]0lg}1vMi31y!퀾 Rʬm0ѐk@SZlψP߅+X"nLVb;e}ҶXQc[Ij R(Uq Cx.ǪxAƴ)֡2f`0s`q_r Fzn < ~4ESERe7tOt▂<2?NfZ%۔tvBs0!kGJfJ8Bu,WRUed ۂ[*. rҺPL$o&L9+9dye@ivk X_r}:ZhKH@_M<^+V0G4 oG @y)VwЈZ!-ZR}uCGŮE= k͉S:lqۛ.-jsxl<.Ŕ!pӥ=mCb"G:3ٰMMSY "&c ErnAql&Cfqcγ=;ेCe=d.Cc9`y#,!L( aX 9TÃ=<#<[]Aa 6B> "Bfx* ӽI) ar;P^ Gsؖq0mmHZ?IZO@Z}IR?FY7Ogmc9S!SpC\<轧wa3rػ g"~Q4wu 2K }@M]͹t60bǐS;N4YCZriN`QO(y \LڳܪuY9ᗓd^^Ʈ]1?@laaWZ*kەPd mWϮ>Y'(G +_eV=WCO𕯡eC#Vrpɛ>=2([% .%G4 P=X.-g u4E(̖D Q St`F:G[ ѽꉰZn9@73뙰_r>.1ˣ;`%&^२|>&ЛbO$ρmcVJnc8CrP$F K7Mr"޳#~X@ceF%E coxvD'=R u^(K֥0,$1*NA{A/zz -?wݥ=#j?rR9 j/N"uiص]I.9Y$ՌKq> s<崦#ﴤ$^6χ\t+_E~ ϫIt :kv*aQ)l:ƵzS>|a.e8 9y(b7h)SNF j` endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 62 0 obj << /Font << /F8 9 0 R /F31 43 0 R /F34 22 0 R /F29 14 0 R /F23 51 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 67 0 obj << /Length 2497 /Filter /FlateDecode >> stream xZmo_Fb)n{]hA T[,|t|gHJvl?욒3 dg4pyOY(Բ&au#\e:JgiX ")Y,??˜inb)O˛_ۙVЦ59}}7;x< K-N*vgWi$%]"FUιJ4zѩ%TF6j;ٗxE["+e|u.^ N\(b2,p 4DA$"C2E Ҷ5eD ,'0\""lKnuTe<&8~2 f"Z8Ɍ,ڈ@5TV]Y.*?ܖuu1aIBĔWU^!Ҿ * pX埶Nyۿ{*YCELvyXύm>~\x#uL 3󷲈 @i$FKA5dq*3D_LH 7QfO@l_LT4#vD`={EFZ4O[mQ   U_6icV]!DҐKpKAK|^hīMQ/}̼{GBʺkc,#L.LѳI W0m$ൟ|iZ\؃źBỆ!{>8kҵsI8ەmmwǻ!'*!{uVI 7xOW {KKw宬v%BEb1C̕Yq gaq(Kk4x$:sSo н7X)m`}LJh"L6g`9WM%4IJ&֦]lVEIn36vX: ]!|s߹ЎۅDhi|޽+&_6ﶠ0Sڳ&>µqgJ;{7n>t|֣ȺGbƤT7}t#iz yvyT8~]y/_³HuWGFG70 ̴`߼_MuT7.+u}|R踄ML"j6֢,0h92#:Wq>4Q.n}a$usA6l.q2;__#A\;g}jWmh-@ &%wYd]?ytS|$$eO0Ytg:P] ʕx We|H ^f;I%VbRE-aס1ci+Y:f!bg9p3VN)*P1;`{$!94{iK b@3h#&ǻP'e$Ҭ>v(7߶N]uulA $ۂLfZ&Ǝ-42A'KS=\EuD?1{*;c~?0ʡ |9,L0p~S><ܰdQIi-wy=gZ d8엾]&FD d)M#> 2L~do*ߖ7mmao;+"(`EUEwr6.ľXms]xTmO :gc Iq+Sask}Ё&`s\}30x$h!a^@ hj}5$SxD~mP}ӱ< ]?s%\mǯ(,]oH$Ïf_У%NyHHhWP3jHrK$C`R_4 {}KHɞC5/L? ^wEOl1.s=ZĎ0ϽTx:yM+oW?ۺ[ZT]ε_ˍs1=9kPpXu8?W ,#Xg09yCa endstream endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 65 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 65 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F23 51 0 R /F31 43 0 R /F30 18 0 R /F38 47 0 R /F36 29 0 R /F32 42 0 R /F34 22 0 R /F35 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 70 0 obj << /Length 2233 /Filter /FlateDecode >> stream xYK6ОF ItfE- ŖmmW3>U,9r{=bU} ͓]“7D1g5oC:e+d.nATg:;==>xiؖ@+]'[r$E5lmP5Ѧs<"si` |; Fسc8GǻPڸR^?DvK~]YU[ %I0!%QֻˬPeڈ@K0)"%(!V{A84`^"D GCiӀ'XSZUw}PfHXdY:#YÌb#J|0'V)c2@ǰ6vf3:'ry} j5a)D[ЬJd'+]3 i g0 M*"E1`XE#-qZSCpGlK<`~eȩy+_R@J3Zhh& ϜPB)F5}ZY,T hmKcO4s _#u{⌦UKc)r}mf @ -ɶϋT;ŽO cz  \L/xwﺥ(T+5hBs\.Moүd72J\WQ1Ӌ? 7ܳ=x%[Ky@~̣OCpmkLmv14"$6]-j|hienR9Z/y̠ywV "Ldԯg4CZN.K߈UL[(!_Yֻ: S!=DyZ@(VLșyЕY-\BDžތH]A]PEMwV`Y\&z^ A]nfOϠٷA/މ oCSk5W>)=-5^k:^sNo@o6Feà rP5>HHK@{HRwq{H؝ GHRK@2X &ӛ!pNFB98z_#m#v.j 'ZCe _FXZ`9@cn Fӑ@pAupt Wé XkSs|G]V47482)vz8 @=гi&ű!zgW蜛ͷփ}#4ǿQy?7ЩY(ҸP1\B%49Mi(UDn@p>d+S&TmW9hiﮒ4$Ǒܰ=v=ix/M{ðee M ۓe(iO"N0jYuڔ,Љ>B3#I 0\4I~>Nm7L1i SǑM.z67.)Gj##֣R6wdϧMe3 ^S"ߟ\. endstream endobj 69 0 obj << /Type /Page /Contents 70 0 R /Resources 68 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 68 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F29 14 0 R /F32 42 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 73 0 obj << /Length 543 /Filter /FlateDecode >> stream xڭTˎ0Hpw4հTʫ(m ɢsNOϛl!H# 4LLB L$9M?$zrAJG$Nr|%I8MКH y_*4rD4󥠅EmbpC@"e<@iCTO]`H6}c; %1\\~gb+Ē03Ȧ=0?7g8C1Ґ@p[1eP}묾l2;m=[m:|<'L kR?|,ߕbq>0Pg",_(}DZ$kݵpn"fD IGiy.v5ga= hZeɯ ~,R18 "|܇it*\X | a}v-В]yXn]+qBvw$9Ve3[edlR~X sSǝUg‰u L/فZ\ 1 endstream endobj 72 0 obj << /Type /Page /Contents 73 0 R /Resources 71 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 71 0 obj << /Font << /F29 14 0 R /F8 9 0 R /F34 22 0 R /F35 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 77 0 obj << /Length 675 /Filter /FlateDecode >> stream xڥTn0+x(` &Ihٺ-(IX#m?H&8 =Y8]#ގp9Qp`\R4B PFRBie,/ܘv=L?,RQTgIӈ`(qIW"" A99V~fBao7uk=$= X_Ĵxվ3jnh=ݬWz-ف2&@K(^ l67]L-QXrOv@(PLYkvXmLulV.mgfN.}v)uHK?*Y\w$&\U}\gSC tuv4v֞Հ;cUlGOl:r>Z1,Dft;GHD7 .G_ݗq ԍ #$޴6Msc8}!7;㨄R⛁Q5ciLڦm=^{~21(I|ߛGvi:p)rKM#SU?+v_{ضz1>/ŲwEYԳ]Chd*Kl`li65M Di-92#{jtX Pֱ؂ endstream endobj 76 0 obj << /Type /Page /Contents 77 0 R /Resources 75 0 R /MediaBox [0 0 612 792] /Parent 61 0 R >> endobj 74 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 500 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 13 78 0 R] /Length 4355 /Filter/FlateDecode /DecodeParms<> >> stream x흽n:i3s{\  ?[l6*`tMl"ﲤHDJoLBh5eY6E` Ŵ`Ro6[ziZmkYXSJC4ѥ2LY@]w&,sL8)9SvAa-6 ]XšE`J^42fZv 6"^J3W=.Ilio`-T!   W=S *cOtDJU!+YZM[4̪NdE{.G' cIGj)KX*}@-e +͞;`X C`1X Cy¢5`2,a4` ,X(*}@r,4L)UQZV=w b ,!b,zVXg1B=3Mc4X*5Fs,J ǒ:u,ob,ob,ob,ob*p`;cg+hBk+fc;V#a\\:aӮo.//)D]E_ mdӮMᴛ1+ U 7`1|7`1|7`1|7`l"%t|XDmVf6uly+\1Pd:xY +uK+7`1|7`1|7`1|7`1|V&v`u:D>D ocQcUwP^]C#&+e4,W,J X ߀ X ߀ X ߀ X ߀)v=&`:K'EW!J;nYV4XrXd4^ G*kXߟ!+`un}|X}ȱ#gPW*$,.HXa%DVX$+y,,c,ob,ob,ob,ob~8)M 4&`wY՘..Gon%tdᗓ±fOYÃd|$ BZ6 VH/ss`%X!{ B*c2,¾+©Cg:7ҍVHMoBjHVmX]ULuNK=:He-ޔ'{`1֬fsr+YHld#Oἴ6֠?rڀѼyÓPϚ:u@Ph`T# 9oK5,þP.p1`հtY' K=yR,l9Ԧ` D?#aݱ6;VSl²oU6fX]wy#=UX;U& u1aE}VWs~=kf1`<`U\9Օx30X5-)aSlEY,< ;~^M"OOM+0K!$b,ob&Tz9,/gNV X]1߀Մy=kWpPGjZ.X mdNv,kg)XƜ4#V=VDfV7`uϵ^|߀Q>:VrRE8uM6a4$X]y'}!Ұ ͒+$/ .\=K+Y!XGB:Xb:ǠO$ B> |VG `-G X! Y^t`zY%%.cֳN gXayiHn :`VҡK4II Rڌ_<ԴYjRC^ҿ7ي,uA9Ȓv&7{p`#2NHkX>+cXVX"JVE.t`kH>+cX_+!}#:gIŋTMq&C>('zlzփg Jg2I5)Ӵ?:('[*L`#.8G^jXɰ^ZϚֳ& 녿4-X8O?5)Xd`ZR2M[jY8LsZgհ0Գheޏyeԑe8z#XL >^  XXXX5}|n8XDz2qt`! ^x}֏OY8Z,Գ°^g=kih&Y8݉,=,9SXSaY````NJv}|9,czTJ=+V5kzKNj,3#+8W;ғ٦ xoX *+V:,Y-X~=5z=+8}^5JdxǑ]dVƩge pz~=]XzLJ˙/Bp0~:a5,b0, a5rM]D>"`:#'v,۳zO )@+o.MP~HpPt֊ "bTm壞)uG+{$SBTEB>Q:f|T)a^j[j"@=cOOv0VIg=FIeaQݭJ4?(~2UXiH;*8V5tgJ)dX>I2 |u6/1 |,xЮ     !gp"K R+M 6 kn2X CjHպuټrS@!tǞAAAAt:UĄŵJ4}VlhdD#g%>+YFJ {cLkI՜%51G7riwp8m,%-JClM(abS~Sğ"PI5I;zwEYFJ4}VlhdDz >{ܱ{|s~apstCLvssslTQ:bjt{{=OFí~qlhnYxFk>`e-GsʅuKr{'5e:yA$7M> }NPɪ'ӧOrlܩY^Y^Gz4a6IjnRaeTm߫dd'6{TXUL^5sd[i`ɛVGiI}KY{wj%I=Zi|7SddWV_GհշȻnJT PVgr^ ۰+_He^ rϳ?T uOQսLowMˠQi rγ4+Yvzvzzuaez}??==ջ> vlSW*ރȅd䡂K?>~~2 mXuW.հ)ankjjz rϳj:6{XVziWxe,}l],̙A4}VlhdD#g%>+YFJ4}Vlio;   hD|4 endstream endobj 78 0 obj << /Length 41 /Filter /FlateDecode >> stream x 0X'N0U[D-0b"qg endstream endobj 75 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im3 74 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 81 0 obj << /Length 1116 /Filter /FlateDecode >> stream xڽUo6~_6ߢ2@5C{h޺ %V+KD5Ɋ#EʖX^b;`37wg7196@(g`&4yz-tJ-k "<_1ȟԟgF zָZ!bStp9G,:Lt݉຤:X2:Eܢ:ab~zt~s us ?ykYN B.[40"Z=u}/J,[N%**"5VAx f+ZӶYNUk%_uYOTt?sQ:O3&O3&FUܞMm\cݔZ 81%ʢ{L]T!AQ eMKyxu_eLe ޺ ob&o1)]53սVp貕&P~󊞪U.Z!g3a1r}Ȋ7p:Ѓ|p3SP 2/zߏo%J'kʟ!lYO?OoÈ ZQ%IdǚgPz>z*ژǫ efk,jùiҪ`w^܈AC6 n a\yC [|QvE[}@1Ɠf/ϱXTjg3Q9l8ZxgIVxIzO)o0Mdh,˖ۉ.96G~hkcKB/g2X@GHGH;?MeN>dxW*q_!KM&0_N!Χyv{= Nz%^aAm'sEq>,@VM_m`+.s[V Btm s'UJ7U1 ?zξִ=ocFTOB<TA Px=e 0LG6(ittZ#iK)ňىZ!dka,pv,,ҙnXLoѥ+Zd#(Vjle95q1_8rاQgsf.|SRUgf .&I!k`Ne-lK ۻXQ endstream endobj 80 0 obj << /Type /Page /Contents 81 0 R /Resources 79 0 R /MediaBox [0 0 612 792] /Parent 82 0 R >> endobj 79 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /ProcSet [ /PDF /Text ] >> endobj 85 0 obj << /Length 827 /Filter /FlateDecode >> stream xڥVKo6W3SdnMbEQt2m -W;P ۤX7#dC qQjq1jd&+ZZCb+CVɾ`YO aeѨ K&h[P";S}tڦB-*\Fe{I'nw i&\h*L~]WW.I9$ (P.Tdp C.M{5:#?E'tn&^#0d,_6`30K]qU.!dL9ԩwm!_Yۤvbu_? &wBuP7 jnuػ;  aӂRE@ CF-ԑO-m+NyH5\/) | Q/P^Jj_ُAjDbdFŪx Sf~a;xwk4aqiLq>ԓQOa.ux3IɊSz aC"[)%VZ{{]u%9B'btKqx%&ŒP~Kn<_З> endobj 83 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 1085 /Filter /FlateDecode >> stream xڝVo6_=SRl4݊h7}`l&GL̀"yzFDht&]"aȓ&MɧT/Wҫ Wm[H۾VPxB{W Y bV3SVĂ̿oauW`R}SV/r31v6r-)ep&31 gȘR@uCwͶ_~ӕlJkʰ<C1#}n*dZs-mYa,!c߻\٨|O-RmC#y9"X@08p@(! ȴXu' ?64ݒx-߻ :Zp[H; rs~Qg%霧mlJ5xkc j{55<]z񸀺?H"1J\dS/>}8S Z'LU%/>ҰZ2)I];SSA`NoJێzWaa)힎6D($-c*|gU0[\E6).u=QИDTe{M[T=nvr͆ܫX8C)`P([6 eN=v7^f zy-dDH@`e]V:yr?yulT{-UL Sn67F%(44>@XQx.&M9Vcyڱ<lvxG8q? xbw5N"*{z(=6DEV`3Xc)F\!5 >OY@zCk)WaAH$8ex\SJT\Z'-Gx5"Πc ßL+;~=;OmڌI \:hO"JOnXPTQg뱃%<4EIyկ?|ÿx=Y<9|߬,|/5D endstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 612 792] /Parent 82 0 R /Group 87 0 R >> endobj 86 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 91 0 R /Length 3335 /Filter /FlateDecode >> stream xaQ3FocVT2U]. t^㸡u"@ $I$I$I$I$I$I$I$I$I<߶{-) :_^Iy5$gtsJqWV-=i|(ss^o~%=[Q[_]v(s/╔ܫ*#zW %^Q*Nj)^Io^iW!q dw_F[ ARx%I$ĨIIɨ-/5dȖQcKF:o̟l^gx+ʖoUV'kUVEg?)嗵?xQWU3^E0U\Un^?W"s(W_/+O_= OOهmگrUd~IM\$?,IMYlIȱWUYϖ 3:36WWR:}uS#>3Y\Wq"¬LD^EEYYA?lGEYY&^Wהݫ=0Lh5eZZm^v^ _9޻WN [ _9|٫K=ʯW72֋WdȖ[^QcKFlyɨ%ƨ%F{[^J$I$I>l]X-W17xI12~)~_[U#ݚEcd&n)id#8\x08W9y-Iu=ī#]|~c@i:xuWsVǘJ{ʫѫZyڝY+x%^Jx+Wx+^I+^W|xū)BxūBx+^WUsx+^*?Sx5 Sx5Txx+^MwW2xJWJWU6LxūD^|hN]Cxs?ϫ^WgVg$KJ YUO>EIշxū>O>s2Śsd+{uLrIP=}m{q3>~S:oxū^g }f 3,.l1a=\kdx5x ^%_/:׍xū/dW>WUg=,^?߾z{Fz y5:ͯ+dWzW!W)x^!Wx+^ Yx+^JzYnՍxe+^W+^WBx%^WŐ?cWO&WUAyyu3xūn3̫Lxū ^UMxXxū^n;[ Ͻx+^]W'oO+^ JU\>믶YUj>(&^]7q:UwO6 xūyWU^5yxūՏ)^jP5Wj"jxū)t5W0+^Dd}<7r)^WKֈ#Lx5W*ikYU?~ C&Wg-OK^:ՍfVz^jO@!x$LjW~ Vz *+fb_l&W6x+^buGx+^&Tx+^*(x+^QިzWLY:WDW .z|{=r{qWqjxzWx٫U+^WIyūf Ձ;ΫlOՐW_WI4W֋Wx+^Wx+^WxūR^WjU=ϋWЙUSW(>>6^~y+󫴃"W?+^Wo/=+^ Y[^e[+^Jx%^Wx+^Wx+^Jx+^Wx+^Wx+^WUBRy+^jy=xū^AW1Vo+^WcWf_:+^W\\9+^*W3Wx+^*!/ ^WIkoe"^Wy6xx0nڙ/Wݓ<>Wvv^*I|S{9n]8U^E>g;A^*6=ߙWګgq^}mժSW96HWEg_kxUu}w>yvWv j*zA+W5(xeWx%^ʮ ^5A+^Wkx+W ^J]+^x+W^ʠ+^5A+W2(x+Wv xePʮ ^J]ëxMʮUivhO5*~T2T2`*πN?9'6TJ &e>*ۄ\W>FBN'x%P2oBI$O5!qJ$I$I$I$I$I$I$I$I$I$I$I$I$I$M׿ endstream endobj 91 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 257 /Filter /FlateDecode >> stream x O 4( endstream endobj 87 0 obj <> endobj 88 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R >> /XObject << /Im4 86 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 94 0 obj << /Length 1524 /Filter /FlateDecode >> stream xڽWmo6_,1wQ6֡ÆmXAXBd/Q@ a'cm8GwB*(uAF9*11:-ItL'%t+o RF2R V'3͚²L5eצ#}A: ô0dxm}ex"nؕ̂Mw{()=ſ"i)!'~ d}l!&&aS3p=&G͚muH#{*Y;f)JAl^9Ԋ]~)řM> endobj 92 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 2159 /Filter /FlateDecode >> stream xYKo W(@ˀޒA|X[V$ҫ-8'\Z*fLLpuOy(dM;%˓ur^mbeK]}<08g<՚ͱaX,=ZuWGm˦k]*ކ`s-Z}w –_Zu>-Sw'7L2 E2/-96>>g 2Q^,O\nDTr?S"O>1Bg.RBVNi"|XwАUr2\?M{~Nq. Կ>Tq0x7 +eP\HcfDz*_ə╕ B04?𞺼bڧ9h}B [zP#`A!) 1E$0m(쑳ĆEfMK1!2B .%xZWa9@Gc(RoI}ߘ"! jhp*Qk1"xA_'9deK kO5 .HՏTUZ~EC|dmȝ섧FGK42-t>A:9G)Y5'.=1,eKח rPMJ^To'A??U07bsX96k=-dPF-/ro~JVʧmM5twnd)rIoqivI5G*PDxu =Ts /5Wcm]QKU?#g w%rKR21)q-H0qiuǸ[@Ԗz+Ua8!D.z\S\ }> nOYABm_O}}tum[7?p Tk/8u1c'rղyٽ(% Zx{ɼw/sX4y˚8VK|\ {)W/˫R޼ gP9o++*Œk%c/5U8>ewa R3͡jZh#?%t{fN͆o$`sS>a䯯9Ru=lhrv \=:/+SGef3h Qtd׮yy={p»b%i endstream endobj 96 0 obj << /Type /Page /Contents 97 0 R /Resources 95 0 R /MediaBox [0 0 612 792] /Parent 82 0 R >> endobj 95 0 obj << /Font << /F8 9 0 R /F32 42 0 R /F30 18 0 R /F31 43 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 100 0 obj << /Length 1573 /Filter /FlateDecode >> stream xXKoFWHS@.[ФhO-[PKR3zPf^ݝٙἾxv .^ȮVYk3kgW]>Ls~6WB튞5peZWMeCGgs {es҅YV_L۲f^l6翆UVWs*> x =_UR2#, /I\Sb厥`& LA\]s!g"3_ T!-o G>L1,(x'RHeBfBERǚסYSԆywory)01 Q&Wy>e~nΠyc>>?hFj3>KP/3wͻ4Scz2~3'wOCOpc.ǭj]!^Xwl[DŰN 8<]n&U՜bC"s%BĻZ'*ZB@[d:Re} NOLm<SUy}E0BB*Ϭ: S$_)$]56f r-C u~. ) )Wm88pW`hH ҇!qS@(Øc)zݴݦ/ԱeWΤtaOZbrrBWcpJ$-P^輤mX0Xh ˤ,(ѯa3gQ "+*f [.3^c?dbp0Rpsa4}vE]*u:lfX,q0o} rZC? LQnUS ҅M9١C qwx0a\fu qV6V+ x> PS &tZ΢?1ҏ1ܨ}ω[`/VPs .o5mI#SP!]6Z+7}0bӴؔ&-0%%u=Z|&9b0 x=Vv_;~]y۞8ѺnSƫo0{XVANUHXYGx7kUxl!h`6z^[fSCV ~(a+`CYiB^$ &wy<8K>16M{yWC!k"`Kd{Gc֓- ;"M"9&p`YYcN\RA^H> endobj 98 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F32 42 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 104 0 obj << /Length 1562 /Filter /FlateDecode >> stream xڕXKo6e f-}u\nelH$op(:Mc͐4mg|+o_QؙL\ή73! e1ˍ`,6w_~_jv/$@/ϖ(B^]1Hf5Ñ`j|e`[ cckq~iXq}~]/Q!U~Sbju6$}&6u&Drr恶jSvDBY^NFdt6)iד g^JYTFm4>PV#+K@Ix9 x-5^ay6`R,&Ed Ë47>gvT^AEn- P0%+8 }zL`#0 ZrӞf?V40\RH0UoQ,P+CMyVaq2,4(t~F$׭4@F+@$k(Hn黮}U@#qy5ע@+dD#m!#Wh}zD uMҔd*|jv= v$%;aؔ18PnG\y>bPr2!Gpd*UPKT_ys ˲J>j{7f>=ZbX쐿.xPY 2ѶO6u[ T~Ob;nfCǺ3Od rPCzϘJdRDrߦA_! DtTn' x[d@5'yAAY.!KiQLC/OHR'HF7)챘'{&Q7()i`ӏMcV!|>%A"pR[3%bsxh@)^/%E{(/`2Y8΁"ܒܩM&;5rNgU=0z> endobj 102 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F36 29 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 108 0 obj << /Length 865 /Filter /FlateDecode >> stream xڽU[o0~PSiq}]$7BYm2T~=DZ6]& T;~;8|Ῥq@ 8sяF\0!Z}{)p{t+No"xW>AyN\]s4$X*`Z#` >jeqy*]~ϪriWɦ6V1"}_ 5@IcrחYt]uR CYe#tNbBP @ >) WRyc+'qXA20 s+ç |gWlvE #(|R!@и2Ic>oYxIDBNWJq$ULJ'Q~ `d= -u`ݽg[nl_BQ(>6D&͠)>pzWO:` )G$FPy T&`i{rnwRe)lW5Q{0=ٸ]e]UxV I.ȷI֨۵bG1T!`4 )Qbp9?:{79쮱_ΠxϚ愤3">R9)|jiBÖ%(ՐL(bkM>^&CS:RCZ FIԾ¾ֻe -!m$KSťDgɅzj_aQz\z= endstream endobj 107 0 obj << /Type /Page /Contents 108 0 R /Resources 106 0 R /MediaBox [0 0 612 792] /Parent 105 0 R /Group 87 0 R >> endobj 101 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 500 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 109 0 R /Length 9162 /Filter /FlateDecode >> stream x (@Q3ܕ=}6ӕHs!wtcn}0/:ۛDp{Km3@ZgpDӋɻ߿}t_n?_|/=Y]& 7mٟ_p } _?G=x~tn0SLيۉzn0o$>X'= }{2~hlBPI/nnvvnnvv HvnLvnЃwr;1͈wI nvLv۹p; S۹ vs;p;s;p;v22Hd,d#F n22HX#F 퀑p;,]e,1y> @{7XM9c Hr%yp;5ظ-%=331zۀۡ8>cI"8cI܎^1RVv^d,tF d.HۍȬKn.&Xv#+w72HZX Lk`),u5RXHŐn)Üu=v2VJX#6R Hn 1ix?ǧ?-.ad,2Rtʈ{c9+|$q{#FSP6и}~J9_G3r{D:x~G[t{kAO9`q3V}1g]n;=Ҕ{%NXz>ۯv۹#|;Sʡ3'뇋r&اw{Eg۹]/D|Ï1.BFFM.\Uq"Y>9#gC}!d>nj\Cl|]]nnv_ַ7q;p;֌j%c4ngn)4&a\69ۧiVDn&L'n53E2Z}]O;q )Evdo:}:Y(6=ڼѸ:5s|vn_n ~u:r}5}݇۫z~Z+%E̷sjݔ)KI~p}FMO?)+|ɲW'xW;`s8^*g[ՙi_+w{'v],a;q p E:nxC}~I- ʹ/}>-;uʛa /`6wp=rKܾr/9p"q~Hz_˺}/kɄ鋗WnFJآj BtDA)n)B(w퓅" vS_#:*xF+KE^$Y7z 纹#.J'n_' q&.qlǡr=;J/?hmWaȟ-rxuwq#pN~+KW>jb=1ۅ}g XΛ0GQk c0ղnof#? 4^KFC`3bԍ?}%N;v{Ywpxq__E?2jF'^ɣm_ʺoofyjh/u٧5t{)WH/Qsvp(u{t{n?/^N!^䖿fwU ^laL2'\2^@ۯȜe.ν/=tAܾ7syE nnsv;6n{1P=L./cfEXG0|=~ɇ'-Ewcg{-xvx -Mn/!Hwn؎אV1ۛҌPn0OmU5=!*m&vKPz|Ep=~*Fm,K oD?*# "n.z,96۹]<_S]R@q{ܨ&֐" ?s*zznre3jhxWs{4Kizv? AHvɏ?6cs.ޱ Fɾwԥe[=koҾ< b#fN~7y\&$!p$~|/W$0k8vbf&zȪn%1+)iPSb(C|C} 8SD zӸl\.zŧ}BۣNjCD'WՏNDoٯ4G ^i%tq7uNpɜEPBew[e]A[  '=qkvgԭ{0GL;GqAE @nO^}B=;~_v+݉e/"b}8Z&[5k)[>qWs/7JwnWGJzo k*+FVOtvE{j|.~;ɐ>T.jKFvnRz{fnpo?tTS[בۉ=rErIauu_U;sMuWo}O'a @n'7[yV{Gu6UcCzvn3n?dnP/wV۹}k~tF//&0[2!#jIݖunƭϮJwNCtrfDbxǽֹ=| z|nOϓE. LFc[JzZ?zW?ioV7`B&@Yz; |xۻRe}EʚZeK_ӲDxfM~TvEd{2b=`~AIr("!3LnFzwa7u Unm]TbdU|ޫ.~{y5jnr;g=c&oL'۷=ժSs; NǼXZSp?RkunlEWs- m ׂ7c,&bEl3`}Ȥ@o _sluXgbc:GEW5c$<&ъ9#>{s;sA#2vp Xr?xoGnO8y|9>?>;}"d):f?_?xXk/(2㸝GV"' 5>*)z/ibK"Օ7>ʃڒ{`Gz_<GLRlG۷ {œ9;9H~<+n'kwb-Ut3|'L+ lV/.p;7o-ճ}/B^Pfn/͓𘘔Jپ(+" ß߬ӫtn11V#ncͽgq/cb2w8k/ܽP~#[ŌI Kvn[{sW)oyLLhs^Yʕ=W/#7^dֶj> k=b? ;p;q"5\i_{+Rzt{>f2̽Ӌn8ͽ9n ?F?/3oޙunvn\*k{zў^?x`nvn._.I9H8|Ke/ew}7}bn2Vv[ Tm[ڄ/youˊq*nn٬ˇ/~[_OE[ g=7E~6!s_E[ڪP?pB/ӷiD[zodžtE[T& VKUYz;hʆk7 ZɚNSߊ~=5oΟEʔ|+/M*RFv~ܮDu6Sk]ZGIǏ7' ?5V_RjE{{{m=2|s ԂUk|_='gO߻=vs&mSMOgn Va_l JcJq nP].b/Rz/u30<կÙ7[|[I4#>em:IoP.2nV\4ÓR>quzmn9G)WU~S}Ri룉zm]?c6n*Dxz}7ǿ;8m5|v\{ ?ݾOA%QDURt{>΁^PyzJ>p;kkh_jxLߒO$[J&nW-ĮMz>Nw]p;߮~B;+EF׿۹oG.={Yc$\Vג;m-q;MU3$߸_j~͹}nݞʳg~miPjp;su {B=៵/Y4V}xLL|勹oqpS۾U* +yLLt{w?<L9;kK}Ds~cJ^ʃI8Knvʥ{ۻ}c]E3Ovn.٘ г8ROnuH=ǃTn7O2Ѡ߲ȭ[67~\l#|8wBgw}R$d;};U_.w,wD7~I*n$&,kϊId:?4.?2g~F}LptݿʭGk z%'H> $ Zw?]^*>zq7! ٳF cF~;hO<7{_nq+Wgnͣ+fvjb!A.8RT㷽϶ }a/F+˖uMn2킣t/$}Og`v+d]ps^ ~V\>nv /@nk-KpŊۉ%OX'<^gB&Tn6\?.D }hۉOL3|gb"vv)XEbB&f՚bv2ծYVٳ1/;^EI|Gޝȼpkq$ZRՉg.W{dǰKqM9#oeyT5_v2Mٕ=Q36H2%Pz'O)/HO-㼻h,.J͚ n7 q e({/ӓ:ߋ}JuTZn/Rwh+J"bEnxjbctk7Mgp⭿??`Ec JtHVk=g?6۷ =T)߯/m7~lgȹ&w{$Fvӻāع]Eb?no6[2-ZgXVŃ_c^]t?ع]վGp^hߋNYQ6[(n6pO3*_Nh*_˲be/4b<۱y%ϋ@e%t}žMlS-Z%tG{ֲ3b'Ct^7OԷ;p*v=uEkk[b6_vvw%bovqwPu6]/Vd,ûәۉ۹]/w"nNƀ%Gʚxt.K^:1mW2}RF;/n*4DrUo-vnӏH"Hr^yBf)[ˆ퍖.=}P, [Ƅ۫E\,@ZU}.co -)s[%BѾ;Nۅ5{p{rjE{-:vn3V<7- E; lk'i#26bvr b{Meelw .nb"n{1W{w T3^'k|˕|},yHcکe9c޺S]_ƓZq+tSq{S; r"Gj);;s{{^a&/b6ɉŹeu]3z>~b{6x}q.pz[<({b}/)#+u#\ncx2RdYq`q u;ۈ 7qGg81E{m7V:b[.{0$z)15Yv|~Y*8 ۅO)n&]>he!~V|d]6gT=?E6\Oa]{g cHŌN p߸nQƖF]V?39OST]q^}_lρy%B}t(5;czUBh}'a_qݤF Hwv]ƶR:brW ^in;{JD26]KȔ˂}_{˩h+u )- iwAľ'6dC4sܛuDxq/`/i]4 QͱsNN >qD;Hqm=}rְ{[ŕPOG7̂% 8op9tKcN>qO ? qG.1g^f9nDq t}Ƶq>zrD52vSzgvI0.q]3$XX{كW7dL+udZya3#^8uc<SВbٖѰ]*G{lRClA{L>խ~ ZxօǴb_LNn8Gvf߳$Ck>ϫy/lv*ډ= pyhe)<9@G }Oc.h`%ts 2}߸(qXݑO/rBA7 =n[Ad >иH'F%F s;"P_ gJgndd.#E|* =aA1R Ok"abv2V4`x+%dYJkF*0]aXF @Ʋ5RZp 4F 0kN|_5RVv#2]P:)tn7R@/3e,s)cYۍt@i0֥:D4GR:Q'rh`rp;H~tp;V|{5n| l 4ve[nGDp;lR72A vnp;`X k22HX#F XX#F p;np;p;s;p;c& n|2. n>DnS n|2.>dpQEzpnCnP vnnp;۹۹t;>O endstream endobj 109 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 500 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 508 /Filter /FlateDecode >> stream x O3D| ފe endstream endobj 106 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F17 5 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /XObject << /Im5 101 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 112 0 obj << /Length 2182 /Filter /FlateDecode >> stream xڭn6_#^}ډ`do+njɑ~VHZ#;>bu;KvItۋ?rpά"O"5gBm}}4R{\݅$~qպfT-3.]ㅻ k͸m,RpYRIT$Hfr4&0.Xa*pMdv#E:&W𚞃l| } fB^`ˠ(ZiVbom_?10ӡ}|'$t(ۍ0E˦n]`lwm/6#bh RǖN( w6@|p#K׆C#@`@vݗ&v$*x*3?aEHiplʸ/GZu]$N]WA BP#4B.ă/ 3Wn;эk̖>fI~_⁈z # ~z:3 Dq""Dƅҗ! S: L BBvf܇W;@h8DOP0Vv y̘Bʾ0<$H͊8sik@+zLX@E$C +d1]M 7:e2j{kG\Fyc&X%ff52QY{TP uZR1L(f/Pr=ݡ{-`W71zqOXUM{Oñ Yk7%6dp,|]s 6k[\*jce ˳\0&ojTZ!7.)j t5D&+eJ3?WL0͠~_=$xWn[m~۸%/j*Sʸ1FmCiW,=}OA=ε/G0"NWb7%ȉ&+D,2VxC@;X#ij _, n>w)5]9tmy"O9~Tn@;)u]{wGAc M aTv‹+f!ubUD*pS\E,Aǻ l_X'rk,t(o#,/@3Y[de6/}ń1 ( ̷y!Y`e0L)LoC } 7 ـg>)Ӕ7 ;ͳ, ,${]]YaR?@ec5X]wEe JL ]xuހ%q\ā)q|OOS@`Cލ;p5.3lƱ@x3/hP$0;G//ʺXe݆K6 p B7`_ <_*qQZG?l*15fT (">='~'E-- N]Klʧ~dPZl\mo 򵚅hoCA8i15v|]eElD&㤂~Pu_=YI< OF2V6y. "yal ݱ]%N4]MW8隡%a s^%Se}RLw^W21o$OZ8!gKY #PKhN8~#Ck@23|#$sBη 18.yW7j+b2ԶuY.g4=(Oaݻ IENm|7t/LsM4XWU ]zƟd6>9%{KQ'c 0TJH#/%ϥ+Gn Eg:; * endstream endobj 111 0 obj << /Type /Page /Contents 112 0 R /Resources 110 0 R /MediaBox [0 0 612 792] /Parent 105 0 R >> endobj 110 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 115 0 obj << /Length 390 /Filter /FlateDecode >> stream xڕRn W+.dx ۦ&ݎImŤ_l< XHcM@Y" R)BҀxnrtW 4S:,. VnFݚOێ(9wXgVS0% eDZaRR0$ ~p{^x2 S*T"'a;tcX6u\ĺ4[tZ%anlDmRtk?&~)+Y9~)cH3i61ne1']BĺkIŢm]3/gVXwI\;-)]uV7KLFyMfqY!y =P"^A` *6W endstream endobj 114 0 obj << /Type /Page /Contents 115 0 R /Resources 113 0 R /MediaBox [0 0 612 792] /Parent 105 0 R >> endobj 113 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Length 1663 /Filter /FlateDecode >> stream xڵXYo6~Y(hMR[ ]m$mlp(J4Ea㛃CS“_x/.~|-l"4S:u"aIf&O.4[,,/n;?4usQ4[b 33YȌ+9N6R)i0_cKv6EhDDl=>g*p|=!3(bJy (}C-vMyR %X& ^]U&ч@5eX`bF;qyS.Ҫt)ڀS:c57f!/hC2 ë,%2ÐuC]iD>o6,B-G2XDlrw$\u~F5_ƤPS(t/u4U4~T2y^ӮCyYqS;3&ehJV۳yŷo 2o&iI bVdAp}حkwU;lGY)F::?8ANWFU黺C$hD<&шK>qaWSm_!*zzsjWi ñ>*2|^7)hj(Ɉqs1EW iKa@ѓj!-CU~T0&{ĒL3ӆ(kCˉaQ1>P4h:TLhW]SrB9Qp:\((o0}чbSx9*'{T>)8M܄ЎiF)o53 q.WVVtrtznDѵ#Xxڱ^;Sypь%'qp@cY>U 1+T93D&Oz| z7P!S8ʹV)>YDk2{*Is 7eGJ} 0oDm۔!k~U}h|jM&Q4Ŧ}/׶~i){i$)͜mf" hdjTnqWfIT#s&m},ʸMUmPM "Nx`,VXg|eA% U1rtʇ 69BxvdbP_=.}׭|O2S\a$ل%x|uWl98D:jE f\myC,2P]`F⎆/C#w$qrQً7CJFJEJGD*2z;,X@ TF2 QB!嬨O sBLO,RǨ7?F;@)&h$A Gx4Gs=8<#8@ O8x6'!2R5_Nf엧2NyAT9דt,?p%> endobj 117 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R /F31 43 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Length 826 /Filter /FlateDecode >> stream xڽUmo0_a&IH14!K4S sI`Pؽ=wKAf''AQ%1e 0 ʶ3u?[ Vz~qϯgg $1`)Ta-AF_"Y9Z.b!d6-XmV-_#dzK.b N؄RukF$YĒh桬|3JH]'wvgK!P?XMQW`HmoH "MS2n(Vf[xހM&7ڣ򼪫>c W҃s:~-vag!,*kMX#P&LÙPL'ƇdoxvI5TJ 1%BPW Đ.Qkr|_=BG-${ ({UeiEw!Nh Bx2e J dXk9$;tίG+Ok<bkb(pH7A y endstream endobj 121 0 obj << /Type /Page /Contents 122 0 R /Resources 120 0 R /MediaBox [0 0 612 792] /Parent 105 0 R >> endobj 116 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 4 123 0 R] /Length 1517 /Filter/FlateDecode /DecodeParms<> >> stream x 9&'wD6Z$h潪I2tc(((NYb6k}Qk]@j?fdF`q Lf.;6qv+s1-wѴG@iAi \' tE8!ZEQEQG))-)5 ף=;CN7";wR Qih,tA\(hDMD" q~&#A& "H~Ԅ Aɏ0$ QF$?jH GM D +.An]79MFGdw̓k1ìn=ii2sLϞt0zo$uKE% EQ $HQT. R KE% EQ $HQT\nimzEFl5D7fD *[T - 䆎RR@NMY.yjH^g7/ydxB$ȶ:2~%ADwI](*At)Je+ 򩿦Asɏ3AV\d 3#AYqyr TRJ1ߖմj[&L!o_ )#vvs0ZUg $L zoEI$HQT. R KE% EQ $HQԭ.;u v* [E@RAnAN<՛+XPY bHS,x2CBw7]fAdeAeb3Q4Sdf8D){ddRoqAgA"DԺK`}G?蔆G7@KiQt&T>>e:u y2 jT."MJ5" ̀ꏟD#k4|n>D\'t@`ae$mψ'>"҄6H5 M-K$4jX75qLl\%Z  A/R^6|8GA'^[ a3[qb+nZaA7P/X;i&he~ОhìAw:#R;dς$G~Zp(Mը­$Dw= YAj-*At)J%ADwI](*At)Je *KAiq5|hUZ6l2tqAe dWwiQ(J\g{=0'0x| Yi(%'nbEAqcy \ϣg1ʳtڥu#$ HGEhMzPs][D<k}{ur&d1꼔\-@1rXnME:[@6nٗq̒x'.wGO;Q5 JϏ=g(m.)((((-Rp endstream endobj 123 0 obj << /Length 22 /Filter /FlateDecode >> stream x?ÇO E  endstream endobj 120 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F17 5 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /XObject << /Im6 116 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 126 0 obj << /Length 2071 /Filter /FlateDecode >> stream xڭXߏ۸~߿BVb?$JC694(ZZYr%Pps^l"3|3Oxۛm"8+x!m"`ZD&7Ur]6W+}E̘ jѲ`YiUV1QRpsnȒZ3z\UAI{7e8˱uWͻ-M e~uJn&mqk3iLYAUJUC_@a׀IVdɍ6D#⡁#m+l':P6uEk$VUxRC,Ri,rpsɬ(qH- Lf:8Ʊ^0]bt2!>G'\ӑX >8 ,mC` X+'`-SVU W~&]HA[Cd-+9P"kPv=͏z8sZ_?&\ 3 PIDn $$˥L6;TC!l/'$IL<LRRѹ^X~A[B\G)wӳAV!wG ,ӿmyl`H& 58s91#*v l.?%eu8\- ٗU}$dҮE(9xoNQC:{ N,If\PgQ%fL,YY3LNDu@0׹qW >H$̈&va@G7гq .YE6bVz?E0Ὧ_ݱ14H)N; -T0ka1BƂg!s7;ג+<7)s 8R78r+)]l8+0pswN $9:B5 m&ZeZ3c%a<Ȯ_{~AU%r")kW3x @hHh874wݱH6EbИ< O RZu{8gvE]Y[=`&uƤT}lJ0^I'0c_[z=|eԩru {$bbILNX+ Ky*dZ\u,LA! ˏ̌~s! ,G7L_ KИq}%?lBBm> endobj 124 0 obj << /Font << /F8 9 0 R /F36 29 0 R /F30 18 0 R /F17 5 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 130 0 obj << /Length 319 /Filter /FlateDecode >> stream xڍRn0aK#-T9ꥪ[ AJ>cDػE:r.lec"hV ܠ\+p떼Oninq˦9".7v.7W ڿR./48I?HaJ&|tIK:Kٷ@E6öH fBa5cp~W Zi#1#dUc9s/R⇰ǺkiJ ~)DѠCL^GnXrd endstream endobj 129 0 obj << /Type /Page /Contents 130 0 R /Resources 128 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 128 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F31 43 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 134 0 obj << /Length 746 /Filter /FlateDecode >> stream xڥUn0+xHa'\EErH=h[[jeّdח)JA!F3o7c戠 tprE#$4AdCtU3߬Ϫq58U=>(RHabI/%HIJn^=)Pvb )Rl9xPl"i' MV;`!vMd<M&L|S_N5acyc,m_^i db90v3-i~Tv[!>+7"-.LgmːVG4%V3|  y8w-`%P[w ]/zet!&o 3`DgAT`/hg,]ݜbȇ*n4R'Цo 4PGsH9y endstream endobj 133 0 obj << /Type /Page /Contents 134 0 R /Resources 132 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 131 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 4 135 0 R] /Length 1368 /Filter/FlateDecode /DecodeParms<> >> stream x:.T-Ogt' &̸7$0   /7tJނXa_r}^Bኄ [ Ϸ } EwsYH8UƺP!Ӳ}%v j$Iv3k1|9|XSB)!>-ZԪA\ )rٲk }ܵ$>71qx!0˽]V   H ;_`] 1 ˏ+cw@HwH7 ׀ p3 Jo;  e B .]w4@nEn];}kՂkuU.o\ZS+PtT}]ix dTlBi|bMe^A X q<#x _4Wc= bolm3>t-gB~@@AթBȞ @yݐO=!̈Q ."S9Wi@dr޶^@@@#]@}*u@F =ϲwN%5 왓!GQ.|ol=Ci]o( &ScI'ob&yϾ4?Cx$gM-@B6 qf=Sf RLjJHUEbstBϒ@i"D%=.y|Z !6L>#IV "@.d@3[GwӇ|=|x|kT~S! @DD󚽀Njm[ @@@@Ȯ!#T  vFݐuLJ > }L:i2v͐ #y H{+\,o+ z䧏Ttd8Rz)\Z֯#YVgϥtᯱZ|h 뤳g#AܱH>\.mEƈxR2;F9e5 Sث> ij\7>6ˋMq?xy MI=,AJ4SCAAAAd++t endstream endobj 135 0 obj << /Length 22 /Filter /FlateDecode >> stream x? ^C9 endstream endobj 132 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im7 131 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 138 0 obj << /Length 1645 /Filter /FlateDecode >> stream xڽXn6}WA k,ͻ( 4M/hQ[.XI9vbqyrΜ9&&?}yrpZȄQӜ%'g 3,ъLrLޤV`?WЏޝ VL%掕7wTaaY/Ҿl'vc}_.λ[}- UX6W$t[waA?]͟wYuѭ <#4ߙxY'Ӣz2N?zͲ1+n5'h[M{즏Gn"FQ_Tis ]Ce=ci7FQ/,7gx2A'Ta]dbM?7U~n꾨^b68gEQp0aEk.We~m1p5b S8*#zmm\4\"ghw>?ל!{ڜ~L hmP|Dh>ᛘK،82،?R'݉Wb5tij%H Sֶ\)G;7 EG9: (%8cޔ#yQUv,o63wѮ6vywϠSbU6j$DK=AyQrsD򈧆H3C!o񲼶UGfs ԊH'#xM<]Uõz`N͙c+3#z;#LK$aQA EL jӆpqA-'qqJAX7niLӌps9q[ GtGιwݿ.䜳mq24 '@0kS ftإOR8=\h"re'p4 G/fG߷馷} Pt$cё4hu#0epЄhp0f \g 5nS,;X(xhOJYSU ?֫Nmo)5RUu?@{K_9xr>0i trqqM0e#$W~E"H䯃?0nȔ+9ro  @C_eO-tOgC9^M Ēb]qZgvƦbeMTcWZ,kYc¾媤0EIF4   LbP8[Z^GT(XU&\LDV9CݽZnIy#f2}eϊMw87X,'PwY,2pa >A١[m)ʧbbHoK%JS01i׸&G^PPdXX[-N\j%;-uGWal 6bWS> endobj 136 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 142 0 obj << /Length 882 /Filter /FlateDecode >> stream xڝV[o6~CI@*Q6Ma(o]0ck%WGr,Gɐ!@xxx\ItX-oX0ILy W$u*FE:ND7,kߗ \)A<'Z|w_(5 endstream endobj 141 0 obj << /Type /Page /Contents 142 0 R /Resources 140 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 139 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 143 0 R] /Length 3661 /Filter/FlateDecode /DecodeParms<> >> stream xK(òV7|L_}M_k&f4WGG_HH`Q-n*>%#"E)RH"EKm줬 ocJ.߾/H+ <6f[֢VհF$^iBW hAmCDnY؈,³K)DdV"E)RȫR]ۊIZ o%)$d˺ϖWmsu/Ou6is@ukH;Ob kMf"<5U$ш}Ϻ4rwP\aZqɪ=rq3Dx7 إ]ҵDdFwFtjdn;]˨- a ~l7% i o219 #bk@p8."vl@ TAk"8 ,҈7D 2#7<`IDA k$>-҂#J]aPPӔ$[ @Dz)W,VA U1r>Xs-%|BY x2jx@Pf-c$߮sڽ Ȗ6tLh=F꺾AK[j8 򚾎,iyUSx \# 8=DJkiL(C3u2Ȁ  N YaEi{Q\SjjDz< u·A k"`n Vaןrba[^iATMԋڷq@Lf (ejWw"A y  r¼Ǩ`"i52VLZM^:pA Iuo6) ww.- `JO䤀n6;֭Qix?9`(p{BLvMPxA#' )A0/ т 20É=A )ݸ \+6|4D *+ٮ Jpa|lL xY׃K$ @NS b?1=m{mR!|m= = snM.QRDJziI A-O;l,L|h@ 6? bl*<#^#w_lun 4G#MTyB>{j7@4[ uAKgE9 "=0| }fyPZ,y b$A/OX^Dw4Ha*j@ {e m=k~)ܱ&8Zi'g k ,hB:9a˚D?5tA1v7}hk?t"oA {!@qH\AݛAeقAJv1 L4{JV 9hMr @0 D-]EAY.=k}gAmqi3zHh ҽ0/8/B׋:RO{5_Dmq(laaF,j3JfDH{5Y`tV:،@%aiH$7sV, 墲_l%,~=-a@^ ~?~A^1g_ qSv7BH 4$ adN| kn^AŖacAd)L6x& #7k A=fx-nm qOԌ.yKI 閖2a񊃨' û90뀌e[^G^eEY2H5"n:Hغ3|\y+/d Fb@<4^0.:Z/ "(j$ҽ@dPI S[;g٩y+ol;^AHDބ7H5o" f] `JX[Br-}hAHmZ( Dl ׽Z &c-/*sF IGq.ȳGqLkS3 D>'dZwoqq UY )3q~3wo`f-,#<H}虣1 91[DAE,#xAN]fo 0tA\@ԍ2 7dE%H>!sb8bz#ճJҌ/'Bmpļ(o2iE\Nͅ21Υ46B Mxc5qvҋYQvG+'ю_ӁH׈6`_;[)f]'uŇp@H//4)?[/xj jr-n/5>N,Dsh_ljvŁm-S"W )TRVH nV쨔SEf rmB(s mk쒘\elyMըŒ+y=|r >"LMc HY+; Adm`c%ާD;Y>{t,ʦ nD2C&KDyQRz0Z[d / (o 26 /˼BK) P[/ dAhU@ Z ѳ1fl tFO$ՀŲ+(-<;lyQċb([<[ H V>cz) 36GAt}|‹AI4+tnC]At+>LX]v QT*VDžDQwmi^AxjI ݭd-qA\M15A*QVi:-3/>co HSɨFXR<; :]`i_)RH"E)RH"E> endstream endobj 143 0 obj << /Length 33 /Filter /FlateDecode >> stream x{!É; ?2h*  endstream endobj 140 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im8 139 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 146 0 obj << /Length 1397 /Filter /FlateDecode >> stream xڽWmo6_,12@-Æ Ð|kLh[,yܴw'R0AehPR4 6 ~Q7_(`$4a:`qLD$%RY>fclXB7lqs3d(iܚn_&̭VHS:UUTu3gޚ-, Ww8qD"M)wM]PO7Ҧγ"/yoMRPd7^{EQщ$=?˧5CMr)o:$1_>Pɾۑ$`cBz|VA~MQ:A}ܗ|e׫Ac$#Qɔ*>ڪ@MF(:pv =Wم J-qpt =E%-3/a|$Տs0GFhfCaZ9{I'6ߵ.ЙGhI4ym2K1Ρl1bH(⻹݃]^i yfͅeCP0^cݭ[?ujyjgh 7P z$?n_vuU4CE!q&ð6+=wϪLmڎ iZwRe? (_*zu3dWp=EֲDw,9:FXOp/+l!ruZxx6UDtf?tF)bAt,G M\@ endstream endobj 145 0 obj << /Type /Page /Contents 146 0 R /Resources 144 0 R /MediaBox [0 0 612 792] /Parent 127 0 R >> endobj 144 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 149 0 obj << /Length 1524 /Filter /FlateDecode >> stream xڥWKo6WP 4sI!q.v7K6@r*MphR]bS̓"OD˅O7y"wdMZX#yjdInتv=,iU#bц]$#ux{u_훫"oiw|v^Jōvd٦jAbbux\iVmi/ZsN9$(.i#%f8NZԼLp#QY59*;SXRwγLMsS$ bTCŇD<˳Ħ+V$؄pr13aU'\NY e%M BlynƷ݁(o/ֈ{\z!Y?x״fE rĩ"Hiư&'aD /YxH |{|KFZ2ʪJ f)M}U{R]PKkdeњ,3d4D|n|E92H˾/i.xevT$(=gffWid@C`--ϋ0JYKYZo֞@N;O!hb?/r f-Mjc$a}mCp,(Q,uyFΡT#$GgF# FNkCO4 YE}%lʸ (e$x5faT8lYN΂+0#; rPt@Pj:@9ʪc&^?; gHlXVkLyChx+zCSFC]f6R(ŴMYc8|-\IuB_Q᳣r)} rW;t'ЋAŋay-|EX2#'E#Ua3Kk=L3DSaS$Gp&5CP\~,+"\^a[^]0xq&6Ha 0@żŜ\;ݺ gidݻhT.ҢYj'ŕnrHL}]v<3*3j-߰beAV 0~p7.$׋vcQbTES ]2$Pۿ}k_Ne'1Y)A9;M&dP̞gMxxE{(/}c /x}hᬈZiVH'㼇o ۆx|_Z HVg^FE:qo:xfޯ|HL Lel:CGL  endstream endobj 148 0 obj << /Type /Page /Contents 149 0 R /Resources 147 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 147 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F29 14 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 154 0 obj << /Length 967 /Filter /FlateDecode >> stream xڝVK6Wd&E"$MQm[w]-$!-C|,{Xq|\mʈlq-]f4Bl˂p8߭}7\oB򼭷-B(NK#HA~\-YɃU48Vԍp y7$^RećL 3^nsݑq{Qa$n "?Ņnt~jRwUջnȱ£`&5uZ\WLS%;-a1W4qUʎWU<&`$)d u%j~ے"PrWNCMRx>¢ޮ½/jTq+ȤˢwwAatb12>=K>RfSp3;ʎ9 '=H` H4=&届\ATT3QԚrnSXi<'ȟ4<>ec6Rw?h0Hl"l;< dXdp޶hS{3WS|$t-gv 0dC,)fre)t sh,~wBպG]{,~Q> BT8>M0EPN3 p!hY&. Wl=>Z86&2* *!o>m]{$NCI i'iFH-Wi|lvΡG-(Xf޵OSԢ}廹?CW? GaI6/hf7qQ9n_o׾_7ONt G|8n B( ¡(Qpd '$x $bR;q=%$"$AI3KTHFą\Hk 8tjPRRᥞ\o_u endstream endobj 153 0 obj << /Type /Page /Contents 154 0 R /Resources 152 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 151 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 6 155 0 R] /Length 5643 /Filter/FlateDecode /DecodeParms<> >> stream xM{: 3u幽Np&3C'\JR1N:GFH/UȒ%K,Ydɒ%K,Yd2AY.+/=IYw|XƤԿelWXZE=u`Mb.?H{ vau)f|`- ^+f 0Ak`Mgz1/mR!*Dsk[,= J!%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ ޒ|䎒/Rr^tO"&gL>n6lM'{W%Lk%q4\[z<O 5Uχet#^]\Z,' ȓ|<,6X *X#TYF)jdw3%yk ',(ʉ``=<ğʀ2n] :V$YO~nh "VAmafpR7j_Xr Ӄ`=FjDXZ1@bJc횙r 86`#!GZ"iL`.quˊx`٘OcWU`x6O㦹ΛKY*’+˘!P^Ϛ$w1/{~]:QF=i4cϺ!,=<قϨlH(,e>OdI\,=|j \#@XL. K6ݬ'W6Co=3l`"zJd}Շ`jxLүsU=?ճa,}Ғ-fąŢqXPf8jhV6 d墮"4}kP6uZom13$,2õJxCmEl§zCK@X,&bA-/  U5Kek Ćo?L l| ,M}C ~6^yLA)/CN*//T-Vz;uVtbp X<5oZV.aTʿuqX8k~@Շj݀F[kbP% (8,2ǁikɎ# ^)X QHfr!`|DDqc`Yw_VKe>+?/T2H.5O^fdGɰa:!1;nKOKMXMN8`;²V{,lJ\tU\,Lnsf^ >,V̰KM3]4ZhE@2HA,lH$>VR.90,a`ްh4,@'],OÊya[a2, lowr<`׋‚!CW-@ۥ(hlKcVK"26#wv4Gy>YgJvj1L !T+ZF- ;kF;Fe>//iyVviY"EkL)c_ravX՟{y6H^erg|EaA[p,~ޜb񒆫aaˊ&^hmWN|Ƒ2`gjo>ߡ(%NoN| Ca,~ܷ/Xw+;tQjCUX٤̀tjn1w2WPAuWD kKfقdxI\& &e34^}oPKtJÚXb, V ' A{r!)̇E:U +hR0C7 3È:᫺/zٌ!,hekr/Ig"34Cgq:RLӝ2  jEY,/ųsJkLCaNiWLtˍ ͂> 34 mVyi}" K^ to5sX+LJZ ?zCf ?ay ͂Z۷˄j$.9MoX遚yg]P Jioꊻh>UQ7qn~:XVz ``ݠjl T _`Zljr- :hVcSW/XZjV0˄P4 PKJxJ쾹,ZJRȮ+G]bf|jnK ƿ}KrΰDX6X{{ΞDz+hvU}f榮NJ KQֹ}gx.zòH8LŠqbÊmN;g5b[C_-qXpV}b~^k^AXxq}&_WU ! ,i;MLW_s`7VË;x`77ύ:Xa.old5&:&-֔ܐ(v |@}E[``U|ܐ U5,߬Ӱ\o9`쏹ZsZ fC~.ț9,?",?v#=;6FY;c"] "",[* @Xٚ`GFm ]``ͩ7   \eGTxX)N;X!-2,UF:PX}IGZḲ,ڨQ1X{&`e3lE~9ƿvt+y` a=[*^"gw XۈK97 ݲ/ w$^ X8NA/Y>V>`- : d)XoVpz=Va sA/q3X&a Sq;w[ !l(ƿUƱl ݱ'9f%pԖ-Y/6!cAV8 Z7ae'Qa"xB0gAցL:\,u{`>xڃ28a=(Ԫ;XVK$zpX&V&"; Ed/XVnVdp\OX`!&#&6$Xu,`fx6H*‚ qmֹbct彰 %"7=~r08[/ K/˟^_ ؃ɰ,[%gW;[#,Ik]=X\)yyh$엯#cI$|UX֡qʑiB'[Xܑ6i?.+ ,ID^We:ahXa^\K[po0, ck^Ӱİ߽ O ~VpvI7X`f_MX8X]a`-"{ezJc*d+| V0H6c.d,/L(,Jlɺ 53luH" >ȖX|+]") X`+7,v7/߰Ӄs`yVoXIaWaV䰱hd,S+bOa%6>` ;,2IН9(8',aE!,Nḡ`-`Xc*_O V3R &X¿a àה`]an ? SELPz vM :9Ӻ*U[wP[<)X};|I|riҙf Wȟj 5Tӂť3,/<gRAf`>k굊o2V h24,>gD)2NpWSATV jr2$a)RVß'aV 'bPM5v6R+RzW{5dHJaOӖ?]˨갲dɒ+ kRRz]3(U^Pf zK)ߒr+6. K'c. -6'YpObir]< ^m_0],]Dd3[~,ݻ̧cp9AWJ2+bR̐, q.]ĭ%X"MQ7e+,i7_T33XKij hլ?`Yj*\.eXb7z@4CVȜC<( Ęk5tۏ}ReuO^V,Ydɒ%Kw[YPDʰߚM Y:I ra,Q7JnQ"7w/ jE.-(,v/e Y^ۈk%^r7u)ci̒%K,Ydɒ%K,Ydɒ%K,Yd2# endstream endobj 155 0 obj << /Length 26 /Filter /FlateDecode >> stream x? ^O0x!a p endstream endobj 152 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im9 151 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 158 0 obj << /Length 981 /Filter /FlateDecode >> stream xڽV[o6~ϯPvHE e˶b 0A˴NtP=Ry=!ܕ$~! '/U;VDJJW%0$b)BlV&+c`k^g5v%e@>"tALg^)%WUYfteL . Ga4 ;SB\ۄmeɪkiwDnVhHfe 3~hڙu#/ﻃ$8QQ_Fe endstream endobj 157 0 obj << /Type /Page /Contents 158 0 R /Resources 156 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 156 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /ProcSet [ /PDF /Text ] >> endobj 161 0 obj << /Length 1310 /Filter /FlateDecode >> stream xڽW[o6~À@KXehⷦdٰCʱ\5H2$)\?ih넆7ɫ,b4g:b #IDb,ݫs!(HK(1$Ь't&X/%o*tS[.e͔g5ǰilWximݴ=w]նk qD3)H"hQ26%H㙊7kÎ48Hs"×O3"3H%n6d:8"RH*>NI[;hg[ny>ua\$Dr7#+N2,' C梓Sڶ6omeHƾEG2٠X{ʐ͇| T<{$00$RѠ,+gqA%wu &=KfnC L6[ܷ~@@}v/"%b*%*UbP㸈O4*]D!~Ɠ#AES]L4ŹDt;F<|Ո:xjl`;/U| z$2|兝 nLY\P4Wx]pF/PCWxXY1}W^TN-bX8F)}(. aQ˼`1U^6ˎavy,}FW;V5u}^fAڌA.'YF>EMv5wݜg|f8EOnkRXś4T?G\xv5]xXS/ua?ԝyv.lѾ~/ YU7M-( C{c[O 5;g tƿn}'OĖ(l%.U*p {Ly#MS-۾`7 C͢3]w ˓ç+:rLu- 1(zOhtxx2x@| uX[;2.rרJ߬*9a`άznX`($G1 f?DZ endstream endobj 160 0 obj << /Type /Page /Contents 161 0 R /Resources 159 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 159 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F32 42 0 R /F36 29 0 R /F30 18 0 R /F17 5 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 164 0 obj << /Length 1860 /Filter /FlateDecode >> stream xڵXYoF~CS@ٛdE@-b1PJZYK?ߙ%-ʔ}cœ'?.^H.Ykk&O.UٵdJەÁN}qq(. gfV͛jelQyl4$#/?BϿ_NO;9"gGa9p˳?pቀ,c,B%5O dȓ@NˬQ|>jIQ^xרL/yn^Z ="v *E~U*T"q_jXY4t/hbC.YD1p w~ =ڱã! fcaᡨSac|Ha6=YƗIQR3*t/ (׽ ?&!X!{.,ʭw]}"kmz&!2,7 9f%OG\8lp߸>%',K~9<(2&uZV'K UCFWbd" i֯_e! :}/<25hZ.z4x%w ^=^ p484JHP\ۧCP"%u P@`e6Ϻ-ۗIP&"nV%;^0}9aLe&\pܙ^*uwY endstream endobj 163 0 obj << /Type /Page /Contents 164 0 R /Resources 162 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 162 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 168 0 obj << /Length 789 /Filter /FlateDecode >> stream xڕUKo@Ww $@m-;쫉CBU:3{PE I(jsUd1dC4255U0\_LWZFp<"h4q>*ؘ`m]t\u\xwLx])`J9y c 襪k/^?6REfz>J K NX;ڛfda=|00ktlr9FI,Ms. d\OIj\;CG&ka2MX"Ho;eB@1"Y'OmNȱY(<&8n'_/bG,"g;hGu6f _ö !x68^\w}1j׃[1HXqeF̓}{${ה/߱#cЪA,!9g'9۱b*> endobj 165 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 5 169 0 R] /Length 2171 /Filter/FlateDecode /DecodeParms<> >> stream xYF` 8@~'DWq-ВgVz2ͨՈnǟZ54u\\\\\\\\\\\j }[Uj6n?i*N峿ێzL}? XCԺzJA2Ga 4Wrt_H7rh@k!چ3D Ǩ;V(}BG)ÕZdAyLgtqe+@a 5K?*Cx1%< 8S2S Ul юHZLHKDd̆\Z|u%A.XuDȯwfEVq_Yr!,rU.f6܉!#" ʻI~ƮnEZ bDDeTW˻v@֒梆O*\$D-5h(!vGp$]rzivn4߉ vFx$-tFRhH!yQ ׊xI|pF\ > C$|>Yc֯O$6`HH$=@k6V`$ Dv[rɗ\tRH ϥ}~A8(2ֲO>Pq2DtTh-@Hvvۼe $_ۼe OD@C!d9 C) sRB( t0! aqk :5p.eN炈r:d~m&z"e!2?R^Agt%Ⱥ ?h3@bC>{SPZVIai!rHZXP{5 3P8%B}{5 36!Am{ hAHc^AbP:f :D񐨶7!=a$1T55TD@ N+ ta@6 )*C5!X-UBQBFq00! !Ǽ֩ "= .__vu*u.~ ZBzso;ک#G{6VΐB.٬nVC[ԛތZŒTNn{ :]T D"VY7bFl\"QDm$ws@a95$it띐Q'֝]uo֛灺Kl;#~oa lZ܎r endstream endobj 169 0 obj << /Length 23 /Filter /FlateDecode >> stream x? ^>|J endstream endobj 166 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im10 165 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 172 0 obj << /Length 1264 /Filter /FlateDecode >> stream xڽV]o6}ЊDfX[(a^bS,V!KD~.EJRH^bSs%v~Y`ff<")HF ) *d.]#xiJS*aDWDP/7e>,/VֿF\ IdWrז_UYnNyiSmʦ3OF$;!&o띅"xqX&m\^,")!ePPIMݙ1M{edrJ(@'qsDYo(v^o_:< "S_>_Qj Bj"(r8=g{w8޴:7p+=MS'd"K x3UqcZl,,t{}vy^67&|L寔.%H? oLgSY@|h(ٿYb^ R1;4n+i*b ex|٭ ~UY۱Uxs4y;tYl:( \eNVڗbY<;C۔_?0^ID&aD\a;NWIv"eO$,S"H{_*`Jt?[ADy=岧< 4&Ek"9@ î.'H2ҬJA ".mqVG)+b&#j-R,{fV1U&Ɵu Vbx:'mBweG^u(㒡K*^CFU&~zv.[;_Vp* lî¦[N{ȷ.[`$J4 L`K|w:]Px% )9Q{aL[.5;bB'kr8SrYo=/vbGo%Bg"xILj&/S9mj\9͖ znӏzP֖Z;oe7g'? kthB9,>|Qo=D7R*c{!Ͻ d1+elw:* !O{m9Ʀ * S{/Ff'9{Wڎ)i @>!G96NA#9`鞽oN4AkZIm;tZ{a 'n`q)8Oz+96Pgg>6$K`l b ?Ww endstream endobj 171 0 obj << /Type /Page /Contents 172 0 R /Resources 170 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 170 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 177 0 obj << /Length 1250 /Filter /FlateDecode >> stream xڝWKo6We fIQ*Ϣ(Ea-16YrEIZwl+h/P>P?[|3%l0caLL̒0U15`ldɦ,j F8*lJā{uΉ$ciDPb;yڗd$4sO|Fzg]J(uny%!fp;ib9>B˪(տDP&oue=9/\1đOj>K8ӜQQJ>Lٹ0vv*^gg@j0dn F(SW8ukA ')'N? 'WbL/ͤP ]q$NDt+]#6Zﻠ] >FC7L&2}jN&= T@jg?glCGX7Cfƃڶط=[ϖ7[w ROHΘۈR)ʽ.eQPb̙i'NXVy3a+㋃LbElh唫Wb/d~x/=$9~t:Emq;M\1| s$ sU@ĖQ8ba5*x<3az*#l{:RfDW*b#?i endstream endobj 176 0 obj << /Type /Page /Contents 177 0 R /Resources 175 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 175 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F36 29 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 180 0 obj << /Length 765 /Filter /FlateDecode >> stream xڽUM0WDڸ $X(ZN if&K_8Nd=Jk͛ #aӌcgFDN9$$~a떈G\ȇzO=Ghj6_&,. HMcjM˲86y !EI/!7Am62;ߦMX}+R;pNDCJ)"zXߙbWo+Íu;_"4( m#b]CnϠ+5Xj]KaTg[(uZeyqp&((˸M-'MX8Y! -fz=Dy5yks*ۭm,)L4.D8HO~WɦR |vcƹݨ`x}Lsqí` L~ 3=jG$A=a5k/IyTdŶJ($|8713͚H]i6`*B N!QcAiSyek=\gNYVYcS>*&*}Z"2Vw7`̧8 {"5Ts:];|wK1 ?E* _h |ZohÓj=(ԔHa,i(\f* endstream endobj 179 0 obj << /Type /Page /Contents 180 0 R /Resources 178 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 174 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 400 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 5 181 0 R] /Length 3339 /Filter/FlateDecode /DecodeParms<> >> stream xY1zw Cw#7PV)&?.X 1Uy_LV;'Fuat;v,-I+"ZkW597%NF8M~Tl[$I2cܷJ]>ҥ\jJ_L.Ǘv7EwOUEgbEg~^w6G_ < ѱ[ӅjY^էY}נk[խSjYN#0s;RHe7*h,.v nZ;h~֯C缼ոӞFOscq=utQTA ðv n5sEόMт|׋[[#;*tSC7Fo8z odaŭfA\X= {eoNCI誻$\}N7rKttӉ=5 ZWѯ|7ӹQ _,Zj-n1t褑[ӒZi?Sd]×5rsNbu褑[-I#J9贑[7 ui|7Fo=4z3[!FoftZ/~6UQ5zѫqӦ%kcKFK-k a#NtQm:ѵշ^7dZta`F.nQWsܺD&/yv a>F/u԰- C2* }ލrF^>yN>GWSpakn) JƼ|n~>eɉ++-sP?Гv䴽/LF *tHi幑b tStp<dzZ*{aR#EmxƼ SBGDjSNIl'W]m1=jyZ{9 =AcºkC6~c>1D@S,of}=eVmlM8ɕУ^m*21j)؋oCŮDpLb䲍 \=#; Wp#>˽c'nL@r1Đ^hVԋ>ԇx&Kt}W]Wm%\rxJ.nn"Y0У^amz'5_xQO@o" ^7k`KУ? ?NҜxfo9pꌬ'IˈAe`/SLO'xJmYOl8&05^[}lGjI AjA$'|K6dH5h%LJE@+t='pB3*&oУ&^uyH/G~ uq[c>' ñ,z/ Gӛ;(-c#= ɂ-g5؁E)W A$ܪLk쵱3A$LFO\y OM~%z]}ɝ|*yZ2sA$hϼHo' '(U @_zsf/v~kMD,#>&EӖ,GKD#|n`?+Hxm-ΝDS|n)K _FEg'f^.t[!MD|svУR "?w JV:# j݅ O%m7dKaF'ޗs+VFziF?V *>N@6TO͕gtJ3h<5r+g 4IuDSVUjV |SF',,i}t2NY- {2C&zFG߿%OF[ v|nnR 6qb~xVktpZ,,蔛=>dSnbh-C c@En~@ձN6ExsX Yul%1e"}nǀ!×nZ, QBiQI?E׺>z>vйP3/ A$ZK][!Z@_mR迄 4,n=oBL'$T=(+F7 R?ՏޡR?#WguA}X3W7y]AG:V,Gm=z[7;5*G_ |sj悑hjF7w:= CO$(WYrh*iħJc='h6 cl$`0Ah? k"${ ` Q#_2IW;ya':> bj+u.|O9'ZCV?>r:C ) endstream endobj 181 0 obj << /Length 25 /Filter /FlateDecode >> stream xZ Dm-C/cT endstream endobj 178 0 obj << /Font << /F8 9 0 R /F34 22 0 R /F17 5 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R >> /XObject << /Im11 174 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 184 0 obj << /Length 973 /Filter /FlateDecode >> stream xڥVK6WVXsŧȽ5mS4hk(ע-JT6;|hc ^LRofяLSQuT9Dxw21a'I4'U3ŊIG9$Ɣ0RaʋpFg_OګᄼFzZ;y`0 s>~jSw?4yJwMyk 5CJg.>ɗϜ֖Qh, j/`=tbό2TS<8w" ;ۖu]_>n}\uIS׿R,G@M~\ ~; }nlʨ!TSxw'1Rb KWU[eEݛqI&b|Dk\gNMӟ.fBPFa endstream endobj 183 0 obj << /Type /Page /Contents 184 0 R /Resources 182 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 182 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F29 14 0 R /F34 22 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 188 0 obj << /Length 784 /Filter /FlateDecode >> stream xڍTYO@~ϯC+^ By+Z%Xr`;?͵3[yػ`w^,&$G[JaV,rfϡYnUt^P^ #̋:. rE4a/P(J.t?2!ɿ-7iZL`*s cRHyiQl(96*քzz~=yр,QT(UF%bmFBĸ{jxz&<Ƈ[sA-t!Xuʚ+ 2=4:y~zi[.R߷|t;y6'?6|1vh-b+: TewK^jb@W|[oQL]ѕ7g.U /^-Ժn0atMao,9A_/JU9X U])xmi‚M3.aG?F endstream endobj 187 0 obj << /Type /Page /Contents 188 0 R /Resources 186 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 185 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 9 189 0 R] /Length 2825 /Filter/FlateDecode /DecodeParms<> >> stream xIr8E8tz]}N]>7ʷmI 0I@.|,B,Ju]SSSSSSSSSSSL=bJg+{Juf[!"( 3(gvqZ7phg",N_yQBuەr T\*F!ֺ튀PJOD,Sқ 2 |t B– }bAQ5fg1Q3+ FE^oSSSSSSSS_3 I 25@jS} |=\VXwψt2[ a9o ^.V#C9˃t;St2Je7/JC}~B婚:]Pj|峱{{LJ~wدd6]ׯNY-$'Ho^C=mnOAV맭+2Q~*^[V902!19dcVna٧+Nd*Hߙp~K᠏zS|k8+ ´JŲx V\~Y>&Ovze7f@xx}@?sedkx2?>" _$;-9 $ k? % 2p|}z dpqx@>Qd9APgaT~LO0AA,xLGA| kH-\x Wt%h `A8@+.,!a?8A޿Q,A r@`1…6$@0…1$90,A`X3$(9,i b d!d $jHc% QC Ɛl nIQ@E{7 AgsL,{*yY[6 C| 3C&K Ԭ r81X">]͞x>Mzu>œy5BՆALϕ@YbS9Bݓ8"q C KC%*Z#K}QD&l+vI8pAUlɩq}Ym{kÐm)@8@\lӐr dA6d;Y1[.ǐ-ElgK6x ))R%& 9?Y@w5pCIF!E.I@[(jHQ@W 2'HFp$F2 ) )lHqpɏ`CʃIF!@^K$N[ ɪK2 7ypC*7p,nH,nHE YO Z7$YpC*YL^c!K~L0:AkLHV Sɏ bJ~L0J](c!H1ZAD^cBa$ABk!BIq~u! /O9_I rr%XR)净Hl r*-v! /ALR,fq-ߵx{!@d:$@flm1dsZhd9l!T}E:]KW% Aյ[_,9U#iZad<dY pK@箮==`^ѲkkiC ̒Zq@Uc[R@`❶<,H  bIgxg^ HnD8*V$XqK}&-XqK*p* Vv $jIE G\ @A`,<h*VCz,`HB1sMT,I ՗-$̼AK FzX !Y &zReJNN HR ˙ $:iz!@|dZup!@82鬌MTD|% ~q'1/;Ⱥu頢!_c3TXڶVmI ΏdSSSSSSS~=VZd ~" k6Sj$ϰ6ӓZK=l I\@ JQGN0bb-yv e*Z^JgX Sja!JL~.9Ȕx~X'lGo)-yU< QF) Z\II@aN_bojjjjjjjjK?4Q endstream endobj 189 0 obj << /Length 38 /Filter /FlateDecode >> stream x10 0cS~$8X61 endstream endobj 186 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im12 185 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 192 0 obj << /Length 1488 /Filter /FlateDecode >> stream xڽW[D~_V8R3;w,R -*DmUx6qvv[3{'@d~;g&8ZE8%HcMuD$Qy'ؾkL3"t:T?f!ؖwL}Gc N냆+𰬊nFe].L_)o1"iC161#q޿'PBǁZ#j~n7ntvϋy1`?}ٮVߊ_fO!C_V >AZ ?/_$6եyoiݲ++ݏzR &jO'qE,["i4󵋆D+:ROq \!^|zԼemd6on+Ei&bXZ-ȨB)0G~xc ¥Ŭ|q `2c:ALGlv/r фr$=3\'!K]u4}G30" ^$ `ڋ!ˆj[W;`ozۘvJcM7Eviwum~0$4tIWOMۭM0?ш)y@@ q%2 uGS4h:OM)ghp~ uH]k!?{1B6@Q0Fሣj+2 $U9 Us;j5}> M$yf<q;v&; D3 gUk'E=~0uK8kn:n3fbJɾTӋU B/HL úTԞZ̙k-3pgBҢqʭ t-MlQSZT3^|I(_m~$z1B*}B[S/M &vh1я])?k\ThpC4 }JeUۅߚYq : , J:֬;G* |Pw 7A=}FZKD$>1(F 0N[3@k endstream endobj 191 0 obj << /Type /Page /Contents 192 0 R /Resources 190 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 190 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 708 /Filter /FlateDecode >> stream xڕTn W+2q}RW:&Tb33(<#8ut~mo  `D$RD ]4ueo׷ ?AsDTF解Ψmsݚ_8OQٖ>ZWEǵٖq&ݱ% Ѥw-]F`Ul-aH" !ިP&S|AWSgӖ+r\WQuFB&b>HVBЇ?`|) *:/-86o'9lzTW ,r=lH"[Dhհe=?#& P6wT \F 0 tL@$:3?"-CFwAMlLu| 1="})բEa aLjE7\.P z endstream endobj 194 0 obj << /Type /Page /Contents 195 0 R /Resources 193 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 193 0 obj << /Font << /F8 9 0 R /F30 18 0 R /F34 22 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 200 0 obj << /Length 950 /Filter /FlateDecode >> stream xڝUmo6_!,WQРhӦ-ambl!Jr\bЇ;qpt^Y-^'2"1hu*,(QG2;&,I o./H۪I>gTaap 9N_syD0*pA1ɑY$w' 4 Ro׍>Oé'S|,"Z@sf`RMer.NƮ\}.cIeH]Л6zlejȼLlW3UL!\NL`L|@-g endstream endobj 199 0 obj << /Type /Page /Contents 200 0 R /Resources 198 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 197 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 4 201 0 R] /Length 1246 /Filter/FlateDecode /DecodeParms<> >> stream x n EA+Q*T;(JNL!B!7P@)S}8]Od}))sPJ>xؒZEؼ̒| hLRv+WqEE*"橏z1d,NwRsB!d3efvƙVL4zOur3n2"ӄ#aۚ $bk(V{_#1"Dn]9l[DOKko1#\N$A4(EРA"hP A4(EuHFl׈U)mۘESӊlzJQm+0>b5kD蹚]LI:jeX=.2&s !taߨY_< 4>A4(EРEK로HK1yC^ X#{yQ{ #QDѵEXS[1)D2zXխi @OuQ>Á A4(EРA"hP"q]RN$2P^ E{~(\ZymY-1iF؞? bнI%F"V5RKJ534mM, G6BP A4(EРA"hP A4<ʕV9.RrKHӾmzG*n0ߖȎȎBA4Hݶ ׈Y\i-)C"V-KG+#G]o88EA"hP A4(EРA"hP @$@Y^i̼3{F׽nVHxX[dG|$ H$"G|@@˒G]> stream x?ÇO E  endstream endobj 198 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F36 29 0 R /F34 22 0 R >> /XObject << /Im13 197 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 204 0 obj << /Length 1396 /Filter /FlateDecode >> stream xڽXmo6_,Wʰbm0tC-Ţmvr(RE`${kw;`xd!(Z`NeSpy5WoNrӋPKY"VРW? OA`-Tmwq]{?RRʇ[»,W*:UwۺU}ISD xOhRkuga1J%J(5JF}Λm`@n0 _B4%T t9L'c;]Bj(gYHW[7.*G$QqiX>mIKH F+DEH *Knn wwnԙ3أў1R߮*jUokmbckH [/~a"@#&K1pPkϪ29F32@4 LpZ#v{: ]߈ J%D ŴqT*'E]O T(;=a2C9>E#K0Oݐ>EX >XX(ѭ*(VzxJbok~2ȚQ&' ,:A2FTM;TfK:7?1&Pj2QCl%JRg;ejmjo:xm @SXc> endobj 202 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 529 /Filter /FlateDecode >> stream xڽT_k0ϧ 2TdIݱ>.c{Ym݃ˎSa+}gI q(2sw;1yNt2[qFpGF*Bsibf'g< ~_E< ,Xwӭ: BxDj0ƿoT~Lìz]ϘuY8ȡoE;kZLv[MSglpD$TJX& "XoՓgK&  Yvw.[;SeКL3}>2?ܣ.l :!ћP}>PWF83^Ե?>8aיzģn1e0 7P=SyAp*ѿ gW66N͙^}C1ug_,zO? CP(P erV8[d SPξlD;d嵏x#ETvLH0ߦt;9*u;Q{O=oZ?^ a;ך-T0HJ(:ՠ` endstream endobj 207 0 obj << /Type /Page /Contents 208 0 R /Resources 206 0 R /MediaBox [0 0 612 792] /Parent 196 0 R /Group 87 0 R >> endobj 205 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 209 0 R /Length 5104 /Filter /FlateDecode >> stream xa' 6Mpǀ jY,Ģ~0.e IɣB!B!B!B!B!B!B!B!Bط*=JRRl7[~<_;?ݫTx[qq[s,_uCg"FRBwwuN3CQ$o帥^oge?ru~nɔݰ+uzʎˋԋUQwKJ*{>-{UtǝUۥW+g߷v]=իjO{zYӽz/l@x㿏xU1ի^GAֽhqbո΋ji F7O?ץ*躋^zZƃoB!B!B\|R-BZ>`mP4+%j MQ-^TKHX.enK=7%ĈU7_.MQ-!=0owVuMk>j iZWW^[E,ՃXdݿA^e޷![ֹ&TJ|.>~G^EN2TWxUiSE:Q[j8MoTWxW$^j  `[~ V۬Vjx+UrWEkFpխxUﱆTUlicnxXWغZ'^E.vRYu)ʜ A=j[WkJ7/:jf+{exWxuUW+sjQS^e;+Vpv^)=:Wu##e\/ѯgtbs;i xW\ѴWnk) ^/Z^jxZʫR^mWV-dUlxUym*ņ^U7(sY^ wtM_>?(g+E'#*aW!RWΩ޿JVƸՆ3Y9e^ T{{(Ε+,MT`h17 fz T|{0gUWηקENW\WWʜUSͷ3#d蒨W>g۶>鯑+jC^\1lxWzykVmxW 5y=y^Y.׋nZ9i#^5|+5Um>,«Y^}J.^Y9 ;~,eW- j «""UjA9Gj:U,+ՠ"@ fy4(P`jItRkgWr8nvՠ @㼢W_ҿ"xWK_ 8?Hj9i^W[m/~oǫuz5m# xW/ǃm*HV/ܢ'-^I.,`q4WxEv𪴯"9~*uG;9xe?_mRmWѡ{%]*ZG0gs+Zū+:}+8Ѯ*])sk?@N,]W!7n|x\ݏ>v @֍,ʕzJRG/e*9DuUv.=N;Wd[Hd|dTǒl~."xei vRc&1uxe&vCQlw~sYS#46Wd)㸬3^]sD{zU1g\f]S$ؿ,^ݘvW~5 ǃxExe!kڿz P0 J F̷S-^W%jj njy>-0+Z)^i9VK=U{xE8kOV˻Wջlҷ-U6pzjyxA^Z+g𩶋Wٯc# ^*ڬ<_tDxWxDZ«ͽ } hT;+Wѭ5~ Hȫ,PF@Wr+i^lSBPEhJ- Jqk%?N zGWTxձM-hm ^}*U)ZƱ\+gKxWăWqxu#TQ[hu<8«hT?"xu3c.6W'ᶅR󃣽R%N%xWxW^Yy]*eޞv«{'Z[ W7^+Z"xxWxWxucy$+Z"x\pW]LNX++Wޫdw vK:Q7~,dz5e,WW-da+iE:%z~,sY7~WRuPj.rO>r^M>!zeYsYxEjұ^Ve~~^߮Er=3߾W?*վ|\/Ro08rӊ%xiMO^ 3Y>۟啼;j0Ww6(P7r^e1^Fw8^Yjzu/Wz͠N Վ*dΡEjU^/m;?l%SwTIQm^^ nޖ^1;FhjX)dEG.vREJ ru䮢CZ'T[Ѩ]1D>ςHRU1nū^UUp,E0ݫ~^y{ZWWs+r3Zh<ڪ+ƃxEzJoW淋3sV'ʭWfhxUњmj{yxWArvπWx%gvW:j, @}bYxܫ?>;-T;«3SW__I ZW)d}V>Z>Nx7fۂl?^qEn_YڬuzJAI* gJmWzu:"㯊bccʏWd_I1Y7Wc^^җط<+"zU}~tū^+ƃxE]{}~[]OMfƙ|+WG쩺-s)^9?J R?{fb>WշEvJR 9Tݫ/VxWjGmPnZ« ^TsTWx5^=ftrՎ Mꌕ+2-7^:DžWTWQjv9s> FYd!Iyz=W4p(]%zLE<5jYuBSW0("d|{vJRWxE@'WxWdWI@*+Bzyx>!^^}DZ«>^O&ī4ͫ+ʫhrI ֭Wg <{4(P;q~~6п(Yz^UHҙg`M+r~~T> stream x O 4( endstream endobj 206 0 obj << /Font << /F32 42 0 R /F8 9 0 R /F34 22 0 R >> /XObject << /Im14 205 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 212 0 obj << /Length 1490 /Filter /FlateDecode >> stream xڭWYo6~ϯCKFFNzbr}Mq(5ߙdL Ty@fi@ ФNL@Q ͭ>({ {3 a+m^ m. b) = VTzO=6-ey<,&,yu.l\^)o.o[No'Qa894)(A:X8w.oG PǑvzLȻՏǸ%amn.0I34[gZ>>yZ]~4P&( BI[lR<>D+ T\_2;06TeInh,Qܼ_?y_Բ؄λ!~.ڏQlGS;8u.'iAպ?o/GcPogπIpJ +#.H 0 endstream endobj 211 0 obj << /Type /Page /Contents 212 0 R /Resources 210 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 210 0 obj << /Font << /F29 14 0 R /F8 9 0 R /F34 22 0 R /F31 43 0 R /F30 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 216 0 obj << /Length 1490 /Filter /FlateDecode >> stream xڕWo6_e"FRHk5؆am֡P-&&K1Qeblr?aXx};'\ƉLn…uf&Pfr[L8|ny۽xqUHǙR^Mf(/R#_g&8i#DK|J,̸Sл:^Wu,&z LٞsgOgIDxBF7y g/y]T)7Qu\ueS{OԀ$V2dvabѼ92}IitM R*Τ;rW5&^ Lg`)o+3cz##nɔ9 czTZL5Ym9&|Lrt]$i;t >U'pԘDiyTAWAosG-l6yT&OL1 v'%=~YCz ӴzmlPRǙ3n'N%=2 Ǯ:) @),N̆|ͳs  _}-+yƜ^]t(nFPx1ljtHk0> :z:o){p  u:ٖ-zncW4vs%<6anϢTQCS(ƕ]I=1֙@:ue_nv"KiqӾ0סּcUlJu^v21ͱ3fǣ:gP\jg (z|^UMw#T0&᫮}Wg]5To SpO(8AEBy{% endstream endobj 215 0 obj << /Type /Page /Contents 216 0 R /Resources 214 0 R /MediaBox [0 0 612 792] /Parent 196 0 R >> endobj 214 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F31 43 0 R /F29 14 0 R /F34 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 219 0 obj << /Length 1774 /Filter /FlateDecode >> stream xڽXo6~_u5CRDuXnk yۊB[,y4wǣdad{(x<~''xx~yv6UH.!5 dZ0MrY%,Y/_ 5jK-5_|G힃ϰRL⮪u\6-r=iҘ; >zi Z\ٻȌ3W~|ޮZAcS^YDPI~Mme{YA$l,֫0Wn۵k4ـ`l!XD¡ vp~%O\o1_SLfnYtW`l\,lX9aţxk2+8i^d֦ʯYJxvW@rG*fab(rtR2;!fIfxc'FɌI>" @AV "[7.`Q I2fLgYMRi8Fw{1Geom0'9یauШQڠ%e\c럘~irc@^d|;(w L3G)X1Ɉ'CZC o𧣉h#Z ׳yѹ)PɔtL dQ;cck $ D1ە= AeKB$"XP-R<_,9NjkO4]3'9_6uE2[ R#o;8O2XzpߗA )!`RH;&pu砽y4:J(!A"`; N082S^0OYf9d)F^AB!8kړrhӑXɅj}kDamjYNkb5>zKG0Tr"¨뫺U+Ef8L- {m}+G_džRonR@6-ѕ[` Eɡў?>!#V) ø.i?V`9l5Y<%}Q{> od0,[kt9SBy*#  brL$Zz,AAGsQJ.H̓N9UZW~@0 8k,%]BVz?b0F3lQrhOQp JV۳?>op-rg/MRgx&yq9tf2 r M4< KsG%vz.!VB*4DRCٰe KYf^:D{HrY(yjmP'Ii"XQ(=--i"}|hkI%[ VRA(;o񦅭8`%@҇``P:hlN<+E `l. q-(QHwr >O83fgxuW/QE v/f<_&|z? U6cŸZ΄  B endstream endobj 218 0 obj << /Type /Page /Contents 219 0 R /Resources 217 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 217 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 223 0 obj << /Length 625 /Filter /FlateDecode >> stream xڍSn0+x "s#z+l(іYJe*/ )\D.tDؐ~on4b(U+3ѾDY}ȷ\5g:9_׾cO>ݩn]YJ'Rl==6Jw;@vig{K9l<"c 3spJC ]ci}C{zBaиY‰=?#]_#a 5h|p1Q }?8ZXNIpvU74%ԾϷYq"[96,@q> kN]2B#46U+f6S3Ŗ8^ǟ}=Aр IqA)z8mn*eF1BaנgٔrSc-I/Aqks",&LN,|l]ﯯwD+I8rAL̚ӬV{NU üSו>SB9jwDcOT!&iuiuq۸_AҜ*\b&|f>V}m[˒T>[!<)HМAzi V B8* XEVp? endstream endobj 222 0 obj << /Type /Page /Contents 223 0 R /Resources 221 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 221 0 obj << /Font << /F8 9 0 R /F29 14 0 R /F34 22 0 R /F30 18 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 226 0 obj << /Length 183 /Filter /FlateDecode >> stream xڅOA @ +rl(Zћ7 UkKKA@̄?NZ0a@Q"B ~J'ɪfMmvHFc$wE)#좼*)N14Nh{Vvд> 6EuA e2HY @ endstream endobj 225 0 obj << /Type /Page /Contents 226 0 R /Resources 224 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 213 0 obj << /Type /XObject /Subtype /Image /Width 650 /Height 900 /BitsPerComponent 2 /ColorSpace [/Indexed /DeviceRGB 3 227 0 R] /Length 4082 /Filter/FlateDecode /DecodeParms<> >> stream xn:E%@Qy H{BG р=}))JRN%b߽R%JZ%ىwέ*FLUOS4_ms=窭q燿xEi?nhl߱vܽlѱ966=t}U=~?n#J~ނj["Q8G(e p2Q8G(KqXӿmLxayy[xILZkXj^v0ŨL棳Ƽ),]4 ЦQyRZ=ds>~}z(AnL *`HM&h2ΪHϞ[s;S699әJ;wvx6tOD[g'$9]3y䬡^29Ir Gi/t_;R1DtL8֧N1GⱣȱgZjؑNăQxrꠕ?|?LG}#Ig̡>5819^߀go.uH\꒣1<:'f?7}̎컎G@z9lG:-ixGQ;r|x{k3߷p?>|FGz9ЭQmѿ9/w38ˎ*;9뺄E{ 8Kx-,|,±.{O<KxX5S½+ p<;hX \k{>ZKyu \ϹVϹd(ϹWq F~֫قԘ~똲{::a+uqZG[~Hr}[4ަT`8K 4yE=5 %pfx| C90ۼJ\>Ęk=mmL;0C[Gf_gkn7u?q7cp=kg2u %uE{ Y>.]K8p>TXXXXĽk pa<ߛ}+u[Kp|x,qL!G82Q8G(e p2Q"/Wͅo *g]}lP)Rˉ[shV0C[M3.:wi:Ir7oQGP"W-򸉔-45ajeC :NՃR7s@eԑӼR~<𔎧q)5Rü۱xǺkk(UQ8G(e p2Q8G(e(qB#G(e p2Q8G(e pƑkTrWWVYǽXTC]oRv5(ssXJ0M¢/rY;VCsJզ#uur7%T'lt /).{.gXw4~ьo2[G:WK-q,8qEUp82Q8G(e p2Q8G(C㮣ı:(e p2Q8G(e pH匣la|KF9|lAc|ھcUq,C k p2Q8G(e p2Q8GǕı:(e p2Q8G(e p28վS얃~ &" R1[kuZ:Zo;o pOpnZwyO{^6FhOITG_GEh7.Q\a85-wR81o6f'J sy`^ĥui2E}ƱMo㷺Xq e:5R n3O;V 8G(e p2Q8G(e PXqp2Q8G(e p2Q8Gq=VSAޘJjǩT>z㪑 g\iVs Zf[Fy͈:4o#4iq4#GhUnuW=6FoSfX௥ VqS:8?;d~/z`iGS:prSiŜJr) 2g yZje(p\e p2Q8G(e p2Qsfx[ / >liOq ӮmsS//{e{޿~j˟Fźnt]7i}[Uv;_޴7Ͳ]-Uqu]{اN-{"oռ=HZ_y/qGr' i>Vìs᪝~r^vdGstlɦyc̼]-?/_,ۓbjrt5wt yjk?Vv3_YNG:zfqk0Tv;[^ U{|~S͗7~<;^_vtfgP;ì{N\\|?k/u endstream endobj 227 0 obj << /Length 21 /Filter /FlateDecode >> stream x?ÇO000ri endstream endobj 224 0 obj << /Font << /F8 9 0 R >> /XObject << /Im15 213 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 231 0 obj << /Length 801 /Filter /FlateDecode >> stream xڥUn0+x(`.HHPoMQ0^HtPCvb j8f1@ycG ϨrAF EuaH8ʐф|Kn˩mWgɓ+'Ol>"R#9} ^Lgԟ8:C]K€%KG̤ ͥDjLceCf)l1*rж R&﮺C\fxv9BvT+WΓm#}T0$UYMKX26dZ]LS%`|b| -)+[4ies ; .WH{mW4_Kz>4 ]5A*N|i%FygMI&Yde`myƐNkoz;]Eڹz7> 4$6I{yW(Ö9+W衺 .nQjјE'ڵNX'~XUn<=8 R15̂aa]Ugs (7"a E!wבv̌u,"U OiNw2 RnB]y~Mxz> h.:fa9,! O WثBV Ϗirs߇0"?0~^ӸkDs lS;N fr3A+ڑxx J:-A (}Wyهf//P*oØ׮l-O ג*Ƅ) endstream endobj 230 0 obj << /Type /Page /Contents 231 0 R /Resources 229 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 228 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 300 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 6 232 0 R] /Length 1622 /Filter/FlateDecode /DecodeParms<> >> stream x](dݾ:r鵜@??FQ!gXEqLJAAA?PR2'B?|29=XU2}ᱫ݊ Æmv.k+#Qcbc[1 ]U)~CQ)Ǹ~[9 JzH9l JqbSL@tLذ YjIOv=6oqmLAA97m )jخ^Z DBɌՃȲv }B 3[/TR5|ms?*)HXmNG d@IH& d@B%*O>PŎ)E<\R](ܧ۷{[@lEWEoXmNG d@IH& dRr6Wiʳ(r6҂PlQiA[TfMN4Je(=)$L@2 ɤ_1VȟLl@2))ȕIA,MAgFr׹oVDeOZ KT1-:@ @Z/ $R.[H$e R@TEEk]gjg<Ѳ\6>(M{lk@ HFԕ68im,sux_1HldB/˺L[Q"[;{2I>Yy3W@vp;4c=`#Gwc%] ; qolG~ 9C$~Jsn]ߘJ^AA-t_:rY&@J@JOivA;xv]pqvS߱ݠ?fe7h=پ{'@%H; Od!>b/1qmnB?T MG~ibv<|U;WnnqӇ9WnqȻan=Ojw Ț @١F/k2 @ o}q{Y/kd}*1 Q P&2J 7Bk ehR뵆24- se^`gi_XQ+;M{ň\&Mt~ @J@J@Jӏ:UW >-t endstream endobj 232 0 obj << /Length 26 /Filter /FlateDecode >> stream x? ^>|?e endstream endobj 229 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F30 18 0 R /F34 22 0 R >> /XObject << /Im16 228 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 235 0 obj << /Length 1492 /Filter /FlateDecode >> stream xڽWmo6_"#ʰ6 C}iN[,y4Q*mbx|:Z\*1KW7% Lh\:zֺMwߕEڳeyF߳ٻ3_/^GD\2ҏnK)NU鑊]FO.[i=7]I9Kx%!t|[W-G4K{KW*WH8nw& PU+oOqk(2g- M`bO*X WLgոs9ixWt6G5b"Sx' 3xn 2# SLJ9u'}*iH J_]3!E\+t/h&Ȋc";:|NDjٸbfUb;#af5Ǜry$}h!ap/Kd7~ÎgzuOמÜ âP.K57QoFil04wm9$) M-SV2 wW .4LIH89K:1e u4q "n5;+G$C̪ Α>s{",0)|l.7[ =yj$#갌zzRP=3k'=\]ʄ9AIp@y{9cIM~NWm2 o,%[ RyY :Gk>*pi/WeֶsX iL /͘|<$¦LpD%uMq\{+ <(.A"&`pdi[ ` _cD&\Q1YhعpR܄nW7uYjޤˑXxܽ 74mi~v\_-ZpT]520mE.^;%TQo;=#LKk_?F'g{ᥡm# ?KHXh\ʋ"g߆ MU-i\gX aH׽"B!ط{$ xO.ckh7И4$~ h%6xV*CdoQk0,'}S Apu|_뾙uSw~i#& s7پLv^,_SG38~&$Xfԅ?Q%K ߖV,$TXyS>hڕWXOa&UŒRC e:P]KA@p8j gS9= ި^y<|u|97|Cv#GJ!ZR! 1hi _b$$D B>H endstream endobj 234 0 obj << /Type /Page /Contents 235 0 R /Resources 233 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 233 0 obj << /Font << /F34 22 0 R /F17 5 0 R /F8 9 0 R /F30 18 0 R /F32 42 0 R /F36 29 0 R /F29 14 0 R /F31 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 238 0 obj << /Length 1585 /Filter /FlateDecode >> stream xڭXs6 ~_U~&(wwk-ۮ[&ݮ+YJeY(v}2 H9Q]ٷ?@%Re"@,(ӐG׫] l_<<YU>\,hNDƆ9d.hF%4Du`зy[ݖ%uz}W*v&j vǣ~)rnjx&L񮺙 YU`9#jmWT3WM%.dՂ-f *ov]9MNlaКfBe YB&"LgqQmA(YH⢳1KJדF̍LM{ܽOu'xfk i0.pDfj=[77W}4>]Y6Aw*Muȕ;w ϒ4_@$ %s &u lP-aUЯNuڽ{3zޒۮhXty9(&<컹jta;"p} Fx[E fsCP-gn",o#qTGWgsO KfГIJD|P ,l޿4׈!4x1{P5v݇厱>L ްwm#6wnU zэeҰ)yOA8E]^P`̈O?_ܫ csŪqD2Uup^"W$9;ȊՋ^M;:A>7pCq_Nkkt&8G=̱RPs J1X9'+NjI|nU E!P@ 28h>=HzG-sw|PkFm9[8˓tYP|=EᴢvL!TctyQye0!Q3A\" -CƻVx$V4o+(cu0$B=w(_O\3*茣 uuinݶ|xLmKCjVAeېk&UdL؇1@=% .]sj V-Nx #ƒClĝuJW)h _'ⲕKLpsl;;yZoLl8#vUO bWtWېбuP<$&`aN+K8%=A_pAZ۸}8i(Wk+8'Q&>Q+" ؤJ`,8b-M0ܿuqT. x  y3=pZYgGv[ `" 3EIs)ta#vٲ endstream endobj 237 0 obj << /Type /Page /Contents 238 0 R /Resources 236 0 R /MediaBox [0 0 612 792] /Parent 220 0 R >> endobj 236 0 obj << /Font << /F17 5 0 R /F8 9 0 R /F35 28 0 R /F34 22 0 R /F32 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 241 0 obj << /Length 1353 /Filter /FlateDecode >> stream x}XK6W_LUIj29$9hZ,8>jAeI8_WC?|S|zQl}Ez>̞AfW/j-ڄj18գ^;&ޗ2,\Yy ඐ{7M"צJzB$l"Ja7 ѫ6I&rO-cqјяmL%s0_]=EnGV5qvN25=ڼ*KFr+F"VCsv1d>_&Lc# $c]sPvPRhpHdm?8wWf#]ߓj<=J"1YGXPNs,o~nFZ6votX1W>Ap0Eo{:+mdԽDs:ԹvHgz3A!09zw+P}(9`MϟR6s3\hab**S{n1XL$^f( PUa @ Ծu7A (ɊqKH0GbpxFEZF(YHcwQ# v(PHt__NVk7MrNZ]-^:fܑ"ErWPݾ5!{c~}ljĚDFVSqS4ӡqU.tmX;cp^kDS||HMcfhN3nW]^H>;Ί7-<Uf%TT3 endstream endobj 240 0 obj << /Type /Page /Contents 241 0 R /Resources 239 0 R /MediaBox [0 0 612 792] /Parent 242 0 R >> endobj 239 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 245 0 obj << /Length 2354 /Filter /FlateDecode >> stream xڭMs7s6X|\S:ڃ7QAYri]!C "y^ W7^QUjPډm7o! }=~u#M~?7_qPR$p{X׏OooΛoē7%d};c ?wvzw޼]Q mu.%dLEWAnqFBjJ v ߞv"^h*ĩlpKjS%.yd KQ8K9೴WW5]xnz`ċ.ti.Z"tZ^O%vNW?na'kD L`&u;C{p7pwv;wƌy="(wǝpwAk!ĽApwFBZaLwZcg$tQ*a'kDk/v1mOzؓ%"*x*_̛<[Cމy|}S9OUK9?Oz%.۔ׁ4yN7pqlO<<%{~LوZ.äVq=wmu}^^]8iHDP.5"~^7PVo}cY6K8qp9in{ACWuvyLE0}#kD t`.IN6r\:qqu#.*̡jEPǁ>Ǒ5"sQaKőv^],סUcr^+:Nֈ@NXUkSL؁qtؠϐgkSeK3%}\< ָnNYUIe%~>nhdY Fq5T>GP'}&'3LحJ뱓^ŪC@_ (}=rO:@Kw_GP d6Ps1@bZz;N>c ʭїCNi} kD Sȳc`n7Xd7 JH3Y:ya":E 8!LgNJU wGwkDG-y:G2SWN+֡S%G؝<Ԟ#󢶏9U"'yF%sk6v{:XN7[3:w*hjܞ"(wǝ*Y.aW=}ٵ{_= g*Ϧ3}.(x5jW" @r X-TY U4&~,2 jj>>5"6)=6Zڠ1cQlPX5"6PNT$n֠!ؠ|ezU !YW=\) d [<^ /U2 jaJRۀ ~c9haJHY*Hy4;5"&!PN 54*eqxbQ *<A=<@ֈxʳTLwyUi"P| ]W`gF- 5$9K]:ޟO>5 endstream endobj 244 0 obj << /Type /Page /Contents 245 0 R /Resources 243 0 R /MediaBox [0 0 612 792] /Parent 242 0 R >> endobj 243 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 248 0 obj << /Length 2401 /Filter /FlateDecode >> stream xڭMo#7}.?dw&#9 `XgcxȿOQMlu[E2JQ/"%g9Ii'BQx_>޼{/{xI /֏F8懛no8))Lj^V"?yE0z޽:޽xxzۛvZKagA k/1_l bN_s #&L!NOȏFYe<~ BZ7=_3gG 'bIBE3_?~Æ }"ȯ/?K C.äȯp>鍝7wO-kHO_K^ǾsU|W|22q/,K_'3"Gy\y!Oޔ~l>^< `L /CS׺d ExpƟ o. ϑ*^mK}t*me'"J_G3"GgлhYio7gȮp\fIE{ uС~/Cғ}&0I&Dϑ[kUxKOƂ;kwEUz}$yydF8 Oxv 6@fb}'ѱJ_W# Ȍ \>ȳ `]F9pxܰD@Q/І} "tGnYP# Ȍdg ')% l 1hSA V^3N[ uaGp!. y%lԄ=E[MavsV}wAaqqAԂiuEl &\@Tv'h [@SjEu@%r1OBt0-%l =D5ETW~EDy/".W?ب8JpoN5J<$=j怶^hzɃ0@=@;Nѱ"_'3"CFt @-[㟁'H HNб/ɿ XDp!('dbPl-zjPD5gX il" ̈@*xggk%[?A3@OЦQ?Xa-ώ\6T#pH_?dX; [ǚ}\ة|w2Fp dFD~ȳGUfNWO}; P_Dp dFD #Nr wfFǑo_? 4Vj!Ɍ3OO Gߨ87sίbGRON//"yH:c(柗IIL^O'N(=( endstream endobj 247 0 obj << /Type /Page /Contents 248 0 R /Resources 246 0 R /MediaBox [0 0 612 792] /Parent 242 0 R >> endobj 246 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 251 0 obj << /Length 2257 /Filter /FlateDecode >> stream xڭIs7srCbe[N4@ QC}!UMxl,_HB{9Ii'BQx_?^\m~$wՏl>L/~㤤H2!;-t}ׇÝ}wWMұ:h}iT}1d/I_Û-Z(5HaOoʫ>Q*s3?0OAH $b/& 8߇7t1ov&<BwJoUw9 8@%>ձD]Z8΁ O. s|r9`U]c. C".A4 2L;&x:C@P<`L,0qT,XYn N*d `':U~P~9z`U=c C"A䁠5*ooU'C"Pa2zǀP<dAȐ!m~QǀPaOK d*9dUw 9 uIJhóNu@'r V8TyOVP!! |mBI%ϗK"!ҩ`kV91!x+J=ʎU3_/  =0iODw#ϴ8+[I9:W=Yy NkJW~Äor3$UBIR3.~ys O<:+\x@S (:yfF򽍞u֛>WvTp"鄯TpxLy2$Lye,0hݫmGzUSz_z2UCǤ'Cng_ 3;)y۔wUU2^n\}`R`ϵs;9wܯzor^*vd(t&-7W*xLx*#OB|u08w{'17},,fi{TFDw-d__?8W<Tm<釤1ɐTkv0Qy q0pMűtۖюX\ŧMTp#ȐrKtAƎz:y\N1'!'(AJBzY:لAq~D$sA'& `sqTqQN`qB/2T' ۋ)_ y0_ChbN1'!NP1xw*QBjNZ(Fh9Utpl@gDl @_, _>~wHe>ugp$U@g<2$q6 99ZZ5h` %Ϲr*s`AP-l9o2W> endobj 249 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 254 0 obj << /Length 2290 /Filter /FlateDecode >> stream xڭMo7{%9&h=/C8cA \-Iq#Kd##$WN'9+&1L\|uZNoӓ/') =AXWn~5LJ(nޥMjAO7o'}~|xRヹ~}ꗛ@tdY6F& (OL?5^o@:0%֤N* Pq't`4vr7{%¥_C"J1Qـ?\:g8~{Z rd,)R'sˣ\c'C"JXy_u`Ey(HX+K 贙YU # @DAHd}=~~ vOJ w?uʸmFXoc}8}@i5uiӱ`/>῭/CC"9j FĀ U L++e<5=侃 .@F $W€?C@ːHϕsG:V\ @Fs 8`A <Xr8@'r@T Z5(AF H`H`L :aJB d4HJ-K;U #I@D$Nxmy$~9Ћ Ձ !*Y-W\x2#b@z^ycB32!C5a(h]#a$DB2U HVp1Ȍ[LicJo<^$Ճ䶎unxm;7Ha* ]DXUp2 tHĄ<&(2kB'rV(5 `.X 'T<Qka52.*t2"JUEAFIXe pQuF<Q=ϊqMWNT@*(rCy!+\aY<\Up2 dHDc70& mׄNdd zM]E%2z$*d+xL*#bAja<T?>|uh*5ad8fR۟ODTtH{ lv X݇mJ # @DF`dxD^$dH\@ЙHX*yL2VJh 1 t @` A{yHʱo9& *@A}gBz48J\l`,Jra2m,xdH<P~!s%fWG{)H*g|X& +y2$b'uF8 IՀ S ̈F4tR BEئ@S׍5U&olK7 #)@DАY.t.V r B-6y}NUBags7 @D 1ʳJʤaPzAALY\#l`(݉@:TI}evm\ <&r+Xw6 %,"TJ7!:Vja1h<*yH:$@ЂJPjg $Ab R|'!*%8;6 WTB<&鿋Bڃkw BPNR.DHʳ~Cc2"hSqP hFmV.CH'mJW #)@D0Zȳ w9ʥ!;]7 ѩqo+ C" C:tI׻,QǁbTI`NO/{QTp 2dHDeLaPEY zqZRI] :agfeGy[-c! J,p2 (-EnT X禹dd1 Ȑ[ T"F Ilca 9 -D2wuy.S U.\UP2tFDo1> endobj 252 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 257 0 obj << /Length 2365 /Filter /FlateDecode >> stream xڭMo7} kM8.ZQ S=MR2{ˌ̑>CVl$g2?vYNjRډmWrz/>0ҟo0Φ~⇋o/wI&5]OiL7{Jˏ?]Esyzu_ VVgYP(7W_c.t+s\x2R ڗwIg~Vfg~AGaM79 ?GrD\0N(IBEuv\`@.(eRv|mZ@¹)?ظj]c.!'wzc=Ywo:0 hmuqP>;pW5k8X d1Ȑ"5J n(uhʌm. 8 RyBh[p2Tƭ.Yaa0(p0A`P2:k wxHyX !萈4()~ƁNaPhD DPG? б|^Je"h[p2dHR&G ՁW Lwuz)Zp2dHg`2<_lN%)VP йTS Zp2dHD #PB*@+B( ?궭V-yL2$""h# {EC5 ꥀd,9l<y,}2#>I_6нWEP𢟧L<x,{26{ P'{iq.zs_?m7u/ :Ͼӹ;|rg!萈 xI e5"@(2טy2$b@ip t?j@ pSKb2u5xsu, j,U n@f3 HgCz1SrTZnй>>,-y2$buXMS2_on ~TNwK Fʈȳ`9? w{ J5EA &?_U5[p2 dH]&}z!KeR\2d1Ȑ <Sц *вlD UjyMțJ- yL2VІH0 b_NRdXl ƐFtRfhՂPdC"2ϖlS_NRW,HXwUjŰh܂\ C".x+=0> ن?oͿ/-e_@cAǍyXټܶgɐH#qVx)97S9>Nc+uZɌH:3L[%THe/%tt<KA]Β-xyL2$"ExW 2TZz|nn.pt,(i[p2dHD@Q Jiz @Q`(XSyXd1Ȑ[tD#_^:wp-KެGU&_NgHQ @=).LcޱܩH> yIr{fc2OZ3XTF$vϖgo@e?ɽSqt^o;,ի3'CbN7ɯZ3XdH$z]p!y8Sqt^o;,p~dRƵU } D]zkϵK'}ZzyS:WKq{+-yL2$"rB&*O%DO}z"umzιMa2\<&A*xg[0>uD Մ56K1D:-~,Z&d1Ȑ[ )(*Bbrt!!yH:#ABNA RkY>":2Kض"d1Ȑ ~>γ  kjB Rׂ˜q2u OPfY n[p2 dHK唰ʬMcwQJ2UOzpІ} \Ǽo\>Pj%c! gBe?'AJ䀨U?1HkN-?܂> endobj 255 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 260 0 obj << /Length 2298 /Filter /FlateDecode >> stream xڭM +8J}\ $؃\>v:8X߇f$$ylvmvKzey0T*y>? li?/m}SewOk^VE< J).1X],Ϗ{c?~rž_:$\L7r=Z߮Gc-fBD*E&t ]^a=ҹI4kf|\>,}/9W~B#Q.(cjtvj׀VZ:оրKkKWNj`5jkTE=;5k@@VekG ϕwHu(vUy}Y*`*2`,|_׵ }goϭxW|,_q~Q{KxPF}(YKfDJ_quץ>E(U~Fhe*o%7}Kuml]hNFH(y?[#?¾KBQ%/ @͟ ^4%gk$I O"0~F7l]hVߛ%gk${^E};x Zt dk ق%6[YxQ%dJA۫+.@@BN@L_pتjzV},MD?l7)W\zK@zR[E앳K[w?[%~7$_;Hhh{ XJ+s `*N2 |bC_яD}Ȍ} ?V{̷|U9Wp;D(UwF{*XOQFO"umCj=YG<[ltuS/ <*#HY$3сp?߷z>u5:`#|!ɣ9lyV3*ރFO sg>toU8 5BbGsع ,g)wAHZ|Z<[\Gs R:!@cH\zC6 xI_^|\ڱs%U#<.lЍI%ϑgk$G`]!2e$o$2W[?ds-ctǗ.~=FwC5z)3wUqpKn|yF˂כsI~S<-  :sFJ[oly.`|<>GH(y=[#:P)3w6f_zn\8- pC#$zT<@ ;C 䮓!wmu٪ ;t>BGs/2#{փȿ]݃/}zܛUn"$~<99BoWCJ63a˂3H'7D(U|D},멈H3yLߤ1Dv d>d?CO+޶y|Qyхԑ> endobj 258 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 264 0 obj << /Length 2243 /Filter /FlateDecode >> stream xڭKo7{Lq-譩ы8iAA;+qV\혫"ov9;㤧_t}zeYOf26T}V1竛7zz/6i~TeɓѪbQ))s/\vu@D[ ~܋T^W!7[,:`!*dxzz8n{[r-g~f|>LwӇ7✍*4IwA#$eK|6x<׺7gciepW1lHB5*"#>3:m}q/jbZF6U8ù\ 5N`(W1lHBSS2W.kw=h \lAy>? 2<+&67Xac%gSK~5B?"g3uz 3rO 8obzmQޤ =6XZFhG1lƭz_6ɨsjO"Rѫuk7 |>| cgW!|H>|adŭm:Dz̯۹>X3x}ߎޑy; VST{ȓ۸_ij! !dZ>:N'ŷqQ Ƃ ;(Yt!AAnͼ0Rh#<& I.e޽YeZN 2o?<k|e3φܚw(dfxW%;Dj~xVkCc.68BG!|H|J*fKkSIDFmB-^vh|Zǥy?NJ-+y6$a>zeLŬLYx|xJ _ouZW1lH|wt]~{ߝ%Zͮmj{7ѹlܬFhG1lFB`NH7hs2ޛ6S/NO=9gCέS>tMp^'i] .:o> 5:6; I8R3oN{@\tކ}%>Rk5ysΆ:%LSy6>|yiwtn|7|*S.:BClе}3 FMؤ G=Pmkc⹌X9mrʅp3 ^ z7޹P^jwW'&xe$x2y |x&3K_̷v|*J:Bcِ{o)2y#Lj؜|]u$}YVҸKwA&Oئ ߎЙP2 IdBYL( -vƘ{A*N]#t*TT`CMU(ЫP0ZM=hJZ X35%!ЩPR I6L;0uBD@ThI+;t:m>OU"ЩPR M*E&`RKHgBf --v`͘Ouڊ osBO!ȃ2m 9÷:z$aй-k >U{ Fhx?}'2K&zUwC %Z%j0*X!p2&卣SJ, tnλ Tx:*X!pe:%#ZP`Is jo[%~{%3W u??8 endstream endobj 263 0 obj << /Type /Page /Contents 264 0 R /Resources 262 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 262 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 267 0 obj << /Length 2244 /Filter /FlateDecode >> stream xڭKo$}6 6[6{PveLj m.r[ŭK^~Z_ ,J^*Ƽ||7XrN_w_ˋѪbmRK V%gOl=w~COP2&XMiOݷιXYm?{|8BTTvLo ?osPYx!$}X.Oˏ9?C] B]QN^˻oߟ aV=f5<T+Rn9sr I5*"ý/vM{jj sl*^pgV/FhH< IhYi+cXs講۬q֍u.*o-sC'#"=tt.pr㛯u>иUmR{%·$g2{^{wuڋ{Px׹jgCanZMn֎sِ`t2CR9o??w ^"4̖}n}F֞Ol,\z m}#zDSφ$u:2WΕAa'c{6֤{Dsφ$ۨ 2ܫw.gSa1W̶ʻ:B߈ij IQFI?$BW]Cy?7|gSa92VZF<'xKQ&Pnu7?(DbW}Cg\3= KpK]WGh<IQ$qں}

K.gCi,vo#y3φ$ E@{{2ž̈́ys ,gnwABݼ_x=NPVυN|#x6$a@H'dZClKyA#O jy-O?φնq7BG9lH¿p)Ӹ:T ݼ > ;wl[/ s <&+FY'-LA'P`ph:Iҫ#dTC Y2B&@h #{?/PX䙰n:B'%Hd.fԀ-zC=ݩÇbpk:x.ؐD2]}X@漋z|g[wpϾ}1B+x猳 9!@jA'9~t6ԤtΆ$[|i;`j7N n=>PXͥmߍx: `tu7룢N n=u&7[gCa sg}7B[G9lȣu[rY߬*9z֤ZCacg}7B[G)|HzJVcϗK6N ~{߾^^{j Vn_s (+s r?(uR{wA \&-s ^L8s:REAw|Zәߍx?HLlHT = =޻8}ǧU > I$BO*L% h Kijw1H<lH"LPRWo;4w◶9gc,!n?BG9lHB6LYu٫U}--ѽOnj öu#u6ѺI"c}J>>($BW}ht^:˟n η!#r>#<92}{ ;y>=}@k%_~sِEQۛUvo}PIĮg.v]oaJ]Ou>Ƚ>&#x6$!')Ӻ7@[[{V\:^޿ísِtUg\R9G@&sl~/ݿ*q!~_+cSj endstream endobj 266 0 obj << /Type /Page /Contents 267 0 R /Resources 265 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 265 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 270 0 obj << /Length 2190 /Filter /FlateDecode >> stream xڭME+H+ qel`@Uw^~_z㢗4ug^/f16T}V1Ow<Ӣ==t/˯w?}wy1Z]r;u;GmCbߨ1XL"t"wَY.7gu!g Yi+C.nkY81p!>rs]Wow(^dDxUp{%t Ngx>wTr9+]v8dyChex^\!tr ]r.uZ~EclS@/3ҧ稳MvǤ\@t~zx Fo= jپ_9d٣9lX'>y~D ~پ&9l^+ |~ ՉhZ[Ouzgy^):U||UA{'!M+i5gH~W?[#!ețߓ= i"_Iyg Ԏɳmi^Ќ&~W?[#ؒh yT\KK_|~E }M'=שU=OQ$߯P?z"H'پ9lɪ`e>E?{"D'.O=/Lu9l!d>:0➈8ѯʼnSy .*}y>d/ʗp$}%2ض(_8 |dy=c<`Yf]? KZm{Kg:5v.>w<ǝm^9!? (IZ z>no8ٳ}Q[!nARGs&;W)L*T< a"_ wB޶ پ(ҝVCVyɖ+FY'] ʖ\<a$n)9PEInP><V^it1{)l4Ĺ4z٣9l>YfW149OBW_iyybN7hӠ= yB_79ocn8Ma;GzW<٣9l)e&r?zVo_߰٦._?u zTGs&;uO5GqO@Mڻ1|w/3]gl[",3wzx7(KZا=mJeeVMN'Nk&mt iP=ѣ9\߆&6YODMf_lg.J>Z6DlH AړǎSoҞ:>o 1UU||BWpè (Z&sj)ګJ;:6nE(ꙢLظnx7@/!WrvP757پb?U}}X7 5ʗP'z7,~/\ꧯd\-~9l-~*E?xR.Q_DM7v[7\hO?1UاJ>Zba 단Z}IV1}/~]Ta*}y?dEfoW%k/[zӶs|-v]Wi*}hy>dO )37gG~x8"kݶ |<tZTGs&;{(xSQ%n|uoQ=ρןvgG 3c: '8P>a endstream endobj 269 0 obj << /Type /Page /Contents 270 0 R /Resources 268 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 268 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 273 0 obj << /Length 2213 /Filter /FlateDecode >> stream xڭMolJޢ*ƼzT_n՗ǝ luǻo7UlחJ)n1X?mgwwxluSQ:'}oι{}M'F_6F7ʵBh/u?{ݦ4q_Y9ۗdN'eY0I`wA#ea9`{]n\ u}Jm Ի M Qg$[B,2{F̈́..8sz8jgٮvyVvIJ[VFN "VГ8jgйvyv9Ի  1zOFy(Yo'm]Dwc[᨝@&^iP!%|\w9C"VwhFۇv ~~X5lKBؓQ%_&]DN77vz6oL9  qg$u2CR9(#V{;,Lj{W5lwM^eK}%{-rwm>nB޻  qg$ۨ 2]]tg]BcO[aoolK}n7ms*45lIQIӧY_P-A2nU; 7,qs[}5qKQ&ک"VvX8*4ppDo IXA|Edx';L|z5lj$XݧBqIEH3q#XwĻ Mܮg$\wLơ~ s af:ᣑk f,3lW٭wIˬϽ/uZMBlg4)خ iF8uGz%L]=lPy<^rq2|S0=sBck& J:!_-,'[=٦`x'6a׸MܵW)ˤ^g}j&: ee:aK̄t oIf v+FY']mǯ?>=?9wihqywݼyI|J*fKO~2؉h#VgZDгMW$.fe+NDѷtg-oRK+s v"zdǬ.t)~;tIzE&7ѫ}2҉"Vv F6l`p*4t0mS M0w@ s"sc٦'t^}  Ag$;We:'o'c,uSlOx#]~*4sƜok܁vzU>Qǘ/v] endstream endobj 272 0 obj << /Type /Page /Contents 273 0 R /Resources 271 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 271 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 276 0 obj << /Length 1390 /Filter /FlateDecode >> stream xڭKo6+x%9|^ rkC8ā_J;\SeW|jFCI׃FYe]Щd}1fި;e4SGG/]Lc=muJQtn?_<>\߾;zgI;\@;{'_boN%K\FP?z:_y++'g:UןxP^i 0IRE výDO܇ 7ؾ{6L+tTݟEh< IwVXdߌ݆{}[ssgsUL;5~#{6$dmz봩7^=lyVͧ;`si' yLa*>hVz>$~Y!׋/%׫2ЗޓΆ¢ܕ#v6$=& IH{Cotx"{ygC zG1lH{ڄj3{ݝHf'^5wšHLJF޲صv-B{G1lH»px^CoyhD2>Km }L}\uv-B{G1lH»: jоI$F]U[13O{gs}.~g#xdφ$ۚ;W;[DfOL̝o6^9y<0oNYfPM٧Vg';s'gs}i0M3<2gCCULR Nvyzݨ"~sW>j.X߻y>$?ZdF//B{uǣ/mx? 3-/B{UoGgCaϦx?j2S|^@DP]\n̈́~~1}oxL>k}4NV7 |}ڗu,h endstream endobj 275 0 obj << /Type /Page /Contents 276 0 R /Resources 274 0 R /MediaBox [0 0 612 792] /Parent 261 0 R >> endobj 274 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 279 0 obj << /Length 2082 /Filter /FlateDecode >> stream xڭZKs6Wh4։oh9ѫ]EP -8ɓ@}bW4[e4>x B)c\mM@d̾]wtdK-sߢ=gD;wUr,r3 RX]Z70C31:SM![ln}KF MkכDX[T4jm 6_vw\@!Zi{v;?ã4crx]ITauԢm_ECr C7JWP"pi8<ж* <TK}=:x[ݭ%Jkn^69bߡ/1$VD&)Ʃ4no5Fע>HvKF̗q3ALXY ƍd(1BK^ g5˅CkWR&񐔧:aFYBcv竒>$I5XBD)j|x:'gX!/CI3(M@'B|`))@QB]GJ%~C` BF@e$JH_g_Ȫ#5Od:ϬyVZ5zlJN,6‡- !1jX]fhucސv/ۥPжn {UU.c(%ahj҇Q<AUڬmqD2AW&߇'@]_H4~*=bwj_EumCo6J 5bj@*4LXu3|SA9uQBջ f |TC14p"gVG<0i w7 m5{I`9v MCA~H$(Qm6Thד)PSJ1hLukvW̵-]k  sLVPsQEScJvC ;v{O&y"qŹQgĻ;F$Q/NG`ݜ5 uݎWLPjHaP>bE,zSԃDQRfKqxxlr~_-~;QBJY-ny//4&"-FitO4P}y5:A!Q%# S2J S{*&h4(OS0.] O>CR{9B-(Zg*߄*a:ólK `l H|fNFҕ{0_MhZ&E t4c|Cwy 65f,c]oB_Ȍ嬫th 0r"J Wр.܊k8ߥN Ҍ')IK8i=~1 <8rK9NJ֢8m- sIY1M~5۪ vMSXl%^9\oTŢs\^n(CGlF"J|`*Sp)yX"=<(1/u4,բ4Sd6ƚ̧(ִ6@xt^.Y;_twFʐD }cJUt7o$PICZR`]Օ 9!S_$DU}( uO%Z<&txH )Ǽ#9}oRjvn,MDp]n`-c,BZ^#OKʼn`;xjmR ]Rupx\qMboJֆ/&; ?` v0.H#'fC'-:kU߈^&VAHpC"; WѫR(ź"Ѝ_` Ӕ16L-(#/7z7R{N̓*c3DwUr|4!v?(!mY9 endstream endobj 278 0 obj << /Type /Page /Contents 279 0 R /Resources 277 0 R /MediaBox [0 0 612 792] /Parent 280 0 R >> endobj 277 0 obj << /Font << /F17 5 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 283 0 obj << /Length 1316 /Filter /FlateDecode >> stream xڭWKs6W((#8i:}Kr`,a+DOwI IӔ"Ň}`erL_]Rx!+M*%Oogog΀ +ZQMVdo)лkJP(,-ٟc{`LͲ(//q\-90.$+fZ񈂴oFI+;Id ʰe-U`kA<8e0(T⍔<`3pf/̘qA"(kGk=6Zۉ7e6M1)clZ]ωNLw4}:7^u@˵{jh@0v>*grU?v#D1}jqݮHE.N< qjC=fy6jq߮3{埛 4]+\46}DWfסOf'v .@'}\76 q0!ŏLnޕۇVgq+/`DaF0S78L= G0.zA'D:Ԡ版ɛWGIrU g̚{9NsSfDVB/qd L7BS{]1!1 CH̪SwxĞsOt=y8 ORsq4Nx} euMy؊}>FP /s'5F/XCM4m䪕ggPFd~enG( +֊ܟ8Uk(8c$ᢦz!scF$14{fEF5ƌ턶wW}J7#<`xVفis̀gӽ]q[=.<(nkGMCx~XZAP- `\XpZ"Ҵ8~9?Uhe^ I=x)4V}um_v endstream endobj 282 0 obj << /Type /Page /Contents 283 0 R /Resources 281 0 R /MediaBox [0 0 612 792] /Parent 280 0 R >> endobj 281 0 obj << /Font << /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 284 0 obj [546.7 492.9 510.4 505.6 612.3 361.7 429.7 553.2 317.1 939.8 644.7 513.5 534.8 474.4 479.5 491.3 383.7] endobj 285 0 obj [500] endobj 286 0 obj [600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3] endobj 287 0 obj [777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500] endobj 288 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 289 0 obj [611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 351.8 351.8 351.8 935.2 578.7 578.7 935.2 896.3 850.9 870.4 915.7 818.5 786.1 941.7 896.3 442.6 624.1 928.7 753.7 1090.7 896.3 935.2 818.5 935.2 883.3 675.9 870.4 896.3 896.3 1220.4 896.3 896.3 740.7 351.8 611.1 351.8 611.1 351.8 351.8 611.1 675.9 546.3 675.9 546.3 384.3 611.1 675.9 351.8 384.3 643.5 351.8 1000 675.9 611.1 675.9 643.5 481.5 488 481.5 675.9 643.5 870.4 643.5 643.5 546.3] endobj 290 0 obj [562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6 408.9] endobj 291 0 obj [580 591.1 624.4 557.8 535.6 641.1 613.3 302.2 424.4 635.6 513.3 746.7 613.3 635.6 557.8 635.6 602.2 457.8 591.1 613.3] endobj 292 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 293 0 obj [277.8 277.8 319.4 777.8 472.2 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.4 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1 516.7 461.1 683.3 461.1 461.1 434.7] endobj 294 0 obj [575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.5 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1] endobj 295 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500] endobj 296 0 obj [569.5] endobj 297 0 obj [531.3] endobj 298 0 obj [326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544] endobj 299 0 obj [562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8 500] endobj 300 0 obj [706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9] endobj 301 0 obj << /Length1 2062 /Length2 15938 /Length3 0 /Length 17183 /Filter /FlateDecode >> stream xڌsT  gnɶlζmTmd]Sۍ}kjljk QT67J۹330DE4LL LL,p.6(ԁNΖv<u|Č\> 26fV33'?N<1#7KS<@ G!jdin?*j377'ݟa[@hbob tT|..< F NtwK 24A`d @/!49ڙ*r@23G K?LLm<-f6@g 9:F6FnF6FnV}03fq;SQ{[[3Y:M>p,Lafg C`gbb@ ?z:T2!`04~v6r\\V/cfZvpDw0}3鏟>}l?QQAUJToU{9,Lff6ǃoO+=/7ﳡo}Y]&v&_OGIGodki>|܆Dž_S _-bocu.F"lgn6Z:KXzM-]L,ZL#P>n1?Uߔv&܍<>FGj s v..r3{'?&`C08 .?(_`}D}D/bX+Q忈俈CgboѴH 3GE1(_]ab/`zm??n&v!ۇ?Ju(_e3O? to>zO>. |Tn/]? ~dW2Ta WzW'O?K'4[Y7 |w?⟧8Ƞ^qr}AN :ڇ'Nu/J:=YϫAA tOABXzUC7G@k6o\HO kaJ5sj1%?(pH\ ahЮ<?̣N&I=e-f{^ڨTeq%!G9N^.-_ጌY HZU%Sq ) A'u7rQ7VP~"n(4K&-5&~##TI5N{vC{4eK۝ Xa4+)jIknR%W\y9[gwC#UO&/c󷢞QZ{nwf:ill- [g50S3AAr5 3srT,|C$}5?Jb/rFh0-vL}rssT&}%{M^>Aj+J]%:Id=‹=ˠ,@}FN`jq]Mv% )wǧ$-wm mTB[LY:jԥAǫG;27G,1# .,J*giENA6Yڨ;/A ;| s  X! M>ԏIC.̈́ <;A 0 XJ#ٲZgS)Dq'VcĹ@US"Fۅ(A:qFifкǩL'DFT_^尭PIl7Y::Ɲv}ϪA$xWh~adLuGo_Q|b95_ot5́T,13$K!8 3;~Gy޼8OǝGSQGb)UIԮ Wװ^O):$iw׎ɘ;V'ji9mxPk|3*zr{'/O%Ŕ3!W,PQ=Tw_ qĶGRF3Pj\ OD_qvtN Ɠ1a~P"Qaɸ-9#!f s;.l{}CrJFɄ}Tw:I)OYوچ梽 B׉߇=U!l6f*U,.C̊6%lggh6SߣxŖЪ b0ܨt8 ,PpЍịG few-b_pz QhB*1?qV]4'f8>ºXeg^Devg GmO6>Aٺ]zsWo끰 $i,1^[  =1IGL*X eٚs }_e:(I`烈G.V0^!t;W-B/"3?."%t-3!QrACeB\^@ F*H)pyud[z DqQen @滜T2?_~ޤ*4̒Ve ɴ?~O^Yd u DEL#|eQD` sKXg|b:/ɍ#0lmDs Esb^eM']n.E[QS'(RrbQmIg>2R. j1b|as41$AYMRe>EgK̓V2Rgr )ʖBA7)ͳn@zK. J@s`qO|$%y~/Ҝc06)_VS\f M=tYo |Rh>^Syl:^RjNevΦ;"K: @'k\>PGqaDx&[5"NZb;{VY}߭:yN 35^\\%(ۤ((pb-uD B5 xWDg}KRPF`?Xѫ$]$N:7+`ڕJYXD%vȯcVaƪ5HcO6~5c3&; Y>EL;4:r# Wok=іAȉwNіqc<{F3xέ RJE8ga˘#d nP3j*#2tzCsVsmc"GJQM,3V~Kr3:V9HTߓC1p.;@n ЍRF$<=D Yt;PBqcS/y&>u]NJ uAU9\a7~!6QòӨp.=Do68[%ReRwi/ 7 Z ۓfz/,oa4׃)D= ӌq:r(([Tna$"S;QrrM)ɘgR\\u&'~  o&8}Y9hXCWEDMq8>E8xu [4]P`\gE']xhi=`^6}z/wC~.f,ݗ: {+y~-D}`0JY* {chc-pIw1zO|K 7: S ARHccXuQ\`QNT3!fTdTMw1 AkA2Z(vpb./Ttb1'@wmA@Р6pcN^Y QMGY6=@vYgEL*3zQQJ&I~?dm}wZDޜtڠۼBԙEN6;y!Gfcjaj& :3h}{EZ[ 64I_d 3&h_h sp>ڊs&`Q-V[%7Vz=pE~n)`ڻP?[Y/[lUI歉_&_^  TPnN+r/Q`rr {܏?㆝^'A;kؔX/f5&aɈ a'\w/H0{*g[YGۨbcIP\0g0} Jz|?&fͲv` TThu/ȊΙ|<:Na>&:iCdŠ -W|JJ%'Wm5Q۩ TUʡ&n~7]h%yWf,ϥt w_|]z!VU^~pdѕNi_9+$2by,@ c`QыFgylО™}TY ;vDFJh3xyq%݈6.YZf>f GEfE۫d‡3K_?:sAoͨ?EMW|Q-8sJ@r#M6z]+gLdT&Zqje5%AC,5KRo[cKh er<֠Ɛ#ID dRpc_:I#uX47p{;/in%aռrBSz<@~2La0ҥ) Uyg~oXXpW猉%˜˓Ɯ1rtTgc5b2&[;V塩9D&m _*c3JBEH?v0*ق =q֣LYj}{ާ(wyin4wh[qble}ݓpoS3]E L6[ad. /_i1 DʧZ.!OO%c)Ӛ^9'+Kw$Uή3I +N8u6k2 ?~>wXlȶRbB,E6ٴ8_׾{n48/@H4/.{;M,ao!"N_daA($:CsPīMmf(MˎMf+XWI]eK[;k;MME;ܡ46#e?6v8#xXQO$_岺Hrenc)4^rLsɫV' & IO\2qmqkyB-^]t7ZzƻU9 T%*5,AA#~uUwO㵪-~_ Ybwf"|!geLҕ L6׾zf޴<؋MˈCJ{) *ֿ,,Fy }xIwӉe,}iӆ)[?N N1 !-wDү3^Z{}?sz<[iAQTH] it]HFL 朜E F SBAGtcl&*P@h'M* [dxF12C2WzD@L0!f^ȯ3 _m謽f0w<+{}`wd·w+۸l""erG<& *qtY$7vOx1\'Ȭi\btCݔO:w;P.[Ux.~5#b艉չ2mA ,*{)Ȋ9&YI #%ILT;!HLyUޱ>28T32sVhaAuCAuX;p"ШCӯ wա)]7)_6Y\Z*DLcRhP(. }fGxgyjF~(8{zo,sؤv0{{2\oo,w=:&(1ðfm h;=Uҫh#cL_{#v?)/7IಮPqzxk&؈2|tm,S1SFtMRoO Bf{ɻv{ &q qr?HHcVǗFHcj=~L[uPn1F$~֯wXᗉn'H=.NXeS TaNuJrʇ3d*+^%JR@v= ҿVqlUQZock E*C-V>v2gspABK£g]A >bg.Ԃg^)jIw*tA]Hn-XC EQ2O '$OK2Ũ͛LO߾ ̰PA%gw VOV]FN$3꽒$S49w'hpGOxJѶS[ })6NBbnUkN񟭶"=k- h{%VJzk$UvqW Hdr8h]mVi~G-.2s+: e"4(x0>e65K|4*Ow! _=Cxf|[)C,)gЩ*,j!ѸX{gK{?۱ W suMcݩr f)1͎y/"-\w('pϛ}SH. (cW.QXTEu%.80/9qV"&CYZ W$Bby߼8Ψ9LaXsƂE>qFlS}v|Qw_Q@ z6^OlթFTtRi^,֖eod1'-( +© MSW+(9:S_[h$F -pivK^Iq-"RLѲ6!ə ݇|z*(1i 1<"NBAQB'D֏WH$KJpeGƻ h<) R[ g4y.M?ȢbgQqqk(M~we;uz5{hMRI,Eܟ2Ȅh+;s+X,y)KV ;76n{dA Qu0Ŕt Z6IԖIN?T lt(ϠIFWs;X'(O&tYCY%{_43_s6jδ*)hxbkGRAD̹[3X8ks?:A5Dkܕ|^?D(["!vu$4d}^ )xZn@qM"98Y˪Ce<{'~zZeYlB]VMۧ"ȻcW K+oу[+~VJsiM_ePfxX/밄%NI[T-NbeـcW1x= ۯ5Jx`8Y1z(ڷb-ӟi| ;S8}k i5](a e}j[kxzס H9/1Vf.=b]ϞKͲɖ!318h2)}C$#dq֦ܹm+*$@a~V _ l5pXfC3,Гsr>A?L~A)]&{"_یn#6sB+u;cZSl-RmBX vX'|+v=hv 1ZMNޖ/s 60cnY6j =×f7ů]1 @ےQu!Nv;VV -VN,mZNy݊tA8͈o7u9҃hષ="E ;-е5R-+EP+{ 5cWzÝoVu6Ȫju ~"x@z㬇~H'l+rYا=yC [V~hjMUM(6&&'yl]lT^@vu%iʗqvQG Bׅt[Nxf0|0ܤS*kĦmUH/䵧#v[E!6XtRS"|\jBkn7Kf3Ľ8bmmJEp&=}wThs5iBћ?Me)ݽؚ ݠ~Pɺ-^4QW"C*;\q c4el5^JM򕱝dvvӄҞ  [dHiُљI_4C| gJ+:5^J_~Xza645W4-igj&eżA'NXn(߼jT~]aFqmMO!gJ`k̾PtM \o U'G3ڳFWC%0 Jx[פk7/k0TE/H(%7Ũ,0>Rh9-C&`e( $ iu+Ŀ{<zV)xcءle7{>M+I Di< {ŋHE6iN'r&mq,3V&P=QgxK({@z:VxPx::ږ=skm\#`̌WO,HS321D,k*A^_Rhם~j[ˬsVa[$eHsVv}vHKS@b(t2̧SnB?r#aQts9{+W$^64*ˢ>9\@A~DN1{!T)Xi):{c+hu4čKZJ|iXQg9UP !|v zoR ld GʤJO OpVX&^ؿk M'b+ϛa t2ЙB(Xf=)^#ɥPHOnZHSUk&k_Jj!m?Vt}z}Wz LPe4أp)~ljMvg[`wfqDBgB [)Ѵ6i6m͹rt`m0 -%p z禖 05vGF$F`z:{:<FLWu;Y5)T1umN(=rűr,ոPuXzm!wlPIO"v+5[v}8̻*n`sf2J!ߩ&+T 8S2j^L9NIZ'&π]ٖӑ@K ʥ$díVd3E'Mb)UGJHD@PSbO{f3_" R̩t4Nw}I-)2W{J!AXD)¼&"x{SPdksА*eהB{T%.5qZ *RQ% e}&4:뮵b^_]%l_ZήuG5`z#in y-G AE&QS/_\j#\Y:3r(B5q#<膣$oTvL}*LkG5!㜞|eP5~<~~Ẍ́(1kr磭"IB;1N%X2}Lua!q1 IRJ8V@T/Y`iu ߪ jD$zGD^:$kSA1".Y3CGTg,R+%W:WzA'hZ>\TLfPfvR<"@'C" KNLj ὑAV6ȟa`]ޖh88޸*) 6@_MPKEm\g&t;!!.}u5R>-_ +XqOb7mr!$A!KAªk iz5s>.E%s\=k0g>[][bx#Jm)k4;,ģ?2eӊ- '& F.q+ l7MܦM<3xr>pm3{"ei?I 6Y5 li<7]ʨ N.ϐP!ݱY GUZ}Pߧv_qF}TsH^1Q1aZX7M->xXq|TSɂK|/ ǒ9ўh/QxRNGC-Tm6y Y jԾo4S1"\v.a={?243,"lLԇD[45g)Upxj #d㌭1]Mm~HL*E1sӇgL8tD._pߵ#N͒e*y`jP'z H;eR  PB>s글눊FW~/As/qDt>ٞ(P ?HNYNct ƂF27*&JO(QMmlwl1GU~-g@ n},-\L̥3f ># G.}4;xx',^ӟO_is7;%17ONіRQ&r07,>F4VevVG%vf2`@謃.UC)7Sz5L&%RTLUɧ;;5au]8|"%cSjl54ᬺ=D͂Sy2'K &_" G)a%_V$z͊T"T"l|mŀ?Ao܈ Yi i~k[D:y2=Mj^WviRa 8fj mEI73!/2k1M+и#Q;.5.Q18z'`S+v>$!ìE;(7M/8*6@P!7m&lLSã _ n$T鷂Y8,> f6[2h`j9Jf3+sQI3dJW51-V;`n'9DάE+Y-\:3v *x/χku"IЩ0Ncn T_;8EՋ8xg{C18~P̷7%2o hFFWaK, sh*mug~XMciu~bYDIfT{.RX[HFomf!9wSJO HoV/H-31_iEaA> endobj 303 0 obj << /Length1 2135 /Length2 14557 /Length3 0 /Length 15827 /Filter /FlateDecode >> stream xڍT%z gkqɶݮvmLdۓo߆_SMпZ]"lgn6Z:KXzL,]L,D{pK;_oQq~*IoJq;{ӿntrz"0/+HMA6N`fD99L8L"I0A<&".f `L{?=AzϠ_AzϠgP/y cA1M8u&6 0@kb3Kxwuû? ;}T|'c ǻC:^?X'_Gwsgޫq:*{34a`rput\d}{|g'{@N ?c~[@ y{!mk vf(w5Si]Q`i36{Vwĩo?-x7Æ$)><&L",NbL 2}yqlqtFQ'Q_26W)\6X:E-r"]R'UdFd0C^Kڹ_625{h(Z3gM)2|h݁SUS"qn7Ą75SAI0arO l>oCUoւ1SV2^(o ߎM >!Al.8,邦bӭxeFd"YUjtg Vȃه|. R">7+ONF<41M.< 2p,ZU>";g*gL`a\%OUÓ>!k q¥ƫPL!CǪ"o.UսrṞ"Wޖh!ƴ޹aN{OYa+C4R0ef%[ƛzx\bk\i\-Jc炦Ɨr[f }q4@wu"b(R[!fۑ*t U慘m%Ac2eR :=_?s1Cve6|d{.38MvER$B5I8ri.\ n[s>rC&ON }Hxm|pmX]ڗSHv#?3h~ K|+2@Z2շ4ݙLpD:IFzSҹ-\ק;jLJm`d/¤X!P]6,PtԘz_x1x\ǂPAH̠b/އ>\쇥h)Ӑ1cgG81>i6SD-M6坴4Oz}ge4T%w͛`qco$}Ad3ԌPPNRzq/#1v= G'{ g_^ʯʠ|\] Nd6al8Wm{Y,`Nɥ'7:gBcJ:0 1Ϝ- _x,Ļ <~RrkAr`] ifԈŖw@[mI!x^m%&l`$tKnky\6(W7hsp[jR00'Dh_EQat$+KV54n#s@{:m_"O' C[19M-g)Ѱט):h~vpƩP[䈮\>+ c|q0z` jE-=OVMA4 +¤pX4kHH*]}lk uQ ǘ5/JwOtNUB/<@F^G^(8\*@^$K &Qe8 eјh{PZPir2,6xO&Yr ՞ǖZh@XgלV)DMD0xh¤9ه[ w]ޤ,M$0)f*j:ZpXJƷ a~RJ{3#w&씍A#Q2F) 3} <đ[5SdE] P+֫W3ԃڝ\Tʛ=լm[>n~:AZ bBZJiSozɫD9< ./t8s^f(y,h39k3Yb!|/h㣆1ҜUm#[ v /*LiN%)s` C W:]JcC ENBCJaq &XʢV$} ?/uBMah XX._-,:LR خㆵJ/Jyc: տR$x"jp~Z0{/P2TD5,ju\D}L-uy+`U Z=M,հUvR=Y1pUf<쏐A3zU&6j<&J{}ʀȽMBFOv{ȯ=]*<5jHyT#7oqoV]%H'8!o˟%~nʀTFQodE猬k }m\=Üؚ>x$'M Y!]Eg V#)7NP(,罔}&҂nr|w_<?ɚ{&; =5å WH D/Ć޵rIN$C>8W8Z' D3tXb֤tϫI![T>M[6O{A􌜇Q:Ѓ=Dѧ=_FݽMazHfw צ}!2iz#-wpTߨ,AVFWteh=g QjȺCo=+1fsR4z=脠P08tWgZc ic`pY{ fSx ~ hhu"~*\Z>HǢ1~IVm3xasƷ8YD@OK˩Qf+ 6gs(%TݶјY6#\Q2@Ȩըiq21⇚cG©C}:c8":۲zurP%GĹ3j1o-mF,+K @Rmv,z[n nhoqǩ%{*5L)i@ GT3NCMoűaQ:USp/)ȹ_[V8%u~^rގz`*4Q^ 2rkV &5LMM@ c=*1C(aQ lSuoCwдkqX@*LRư@oϻ sqJ%`^7(ܼt[m+c.u4ǀJ\y^^R{_+D$96!5o}B<߱߰7FE,Q$VFIS%KW BZ֏  yqAκ˛_i.qJ}`ؖ])mUz.&&w$ɪZQ:K# -4@U!m <GJVL|ɟhX@"$uJ,ԃ bڭwPL: c.)F1C )_΁lzW]^O;zi$~Fyrd'? F$g+a/C:S CӤ)n04'ZȿG4\…PMS[ĿiR.Y;Bw7Tϊ]!ccH)v3wpYMQP>QV:u+|([X#>VC$ io' VutIx/ce `| 9&qtTc)UsF‰sw]uwaardvQߦWgR˒22Tƣ]^s%L٥˻jg" #wmXwe%o32ƹ.PS8kt'&[h{3{VQmLߣQ5GΏ$l#F\q~Zt{*䒿5\#M;Ii]7Wn;iO}Wn3Wעر99Zk;K`3=^inF$hnt/)2t,L?M5%9{cjCJ~';gcpFCK`'CN^B'I"cY)w7n;&}dM9@U|SM-J~΀~q[iZSN#gll5cg}*7'-xC_ ͶhmlَtD%7!i 74O)QP4r66XMc_P$0}L{+Z86;Ld"UЈ_U\ 4mU CȚ<r9T/`SGF\D#%,XFf.T|P |H.]I1C`u*)İ)ot4 W rI(r(Sq+iTbC ]Zq-"CO|վ4.(1" cO:y@^n?txS^Ⅱ9|%BChh3b;ft8WZ=ګQ-ov֬|"܁7hOq2h5p8%R EK}kN<r~eg B4ZX> g0H<4߇فUvֵ)ybݣoIBQ{GA\F&z>>2@sEl_HC5.i;YZ[ dLx”g9ӆ ^]J&+mDn_f>ɡ}/4M8 94g([(33=0r<ӗ 7~BlO(]NrZVkl|a: 比08@Ov{ |ބ֊Q^5$0ƐdT\o^+WQyZ8ͣOM {f܎bcʶK{k O)dC9oko.Z1'ĸ#)3~3Zfⶍo't8GxCB 0]u^j'9.DMc̉XCiF%"GCDJI͛0 TB},zM"ZY hpts3Y}DSIH*lSi'ľ8Okk#ÿ 5<~:oGg &D=e\!Wsз[C܃U:z2I Mԙ\C1}gMv91Ժ_)/? g+L0Lh;άf7Myl3x(5/o߈?s'Sln/1Gv<Kh;T=}ғ.~^ɶCi) Ck% ӥ|6/^q&^L aq9,ZH)VTpC&&5;oǦƂ^ʪh\Z8LbNwX[1<z4J~mf dϊiht5տr?%YkJe4ŮevH8ARVV厬 cw5+[ЦҞg2ۙWa_dUr0<|:WsUռQdf3=>F"<_nB)މ&&p<$RyI$]Jvw!ЙJkrO^j&)}Ħ .;MC($3w/s0I قnqa~~m<|a8ӢB,ѾF3tm9}d4R^v>.8ܯQ,Ձ7^92ԩϾ2=2`[?F$Йj40PbGӝx[`v'L=zG[{DZ=nD- S$%h02xJGfZ8T+lw؇߆׫a!M sHH\O}Dye6-B+3PdT%ppB)V8'q*Őб+Ɇf )./KYCGA \(3l6'YNL  2Eg]+#$dp{eUN~MZ. 5+";bd7̤ܩXe'H5bϯX38eT𲻈oc:ٙ!/?7~𥥷'lHI$1:/ޞY(vf$f ' eqPP5? ;:-šN/m ۦޫ[-߲n"BG&g+eԾ82HCZ"myҳT^@q6ߠ:lg4WHQs󃯺f(' q8'҈DS `ڛZT/x pqճjbJykMJ ˬ_uvzWpy-11=:d?\c'̹s_K$̹~imJZGF0˩)8JYO0Ǐ>}kA,Nd(Vss$D"F%l#^xa% A..jju:ZsbFGov%?/^zvM3*kkS8xLa/h yE:F7s(3MəiU$/9 sq9OkC}=ȭlEK~d`=ya%dGzx&!oDExP^jB؂A4].HZ(\\(q-ú#dž09kaοA( EW]ʑ^UgԛHbW0-Qoxڬ"(F.l&s0-/E 70_~3!q3JN|M*+1R+ssÐ];xvxݸnTO 8v= ܤzk:YzL r+ O2Ho=8ሥM7 b.?dr϶,%{T=Zu.S֛-N=,9@&B+0࿦ dTt~ݒ?1,rĠlb.׬kܙӜD*ڱ|7;֑vݘj T#H֮ ^dL#6R.$T? #ᴿyMW3"Ȩg*QŲPk|x.^E|TTN:Uޖ^IMJ #(Agh' !AhmL#4wߤ;a'u=*oLNYhm!4Dol9O/ˑ{ZDUY큕S b 6%LGr|~?PۍHR pFLsr US);N .,:Z|3:?F=R`dݍ=? 7_W g̨t'(Kb8~h͑Ǝ iTnK]B'/ A.We+#LqZ,QUśSdiN׬⤆W v9e8*K_u1J-+ ոmS!"Q::7QovG@TEL8,"R+GZRPGs=ak&o#{A*9Pu>Taj I5G+zTrE]*Vu&C%u,.w߬s+*p8~J qoܧItUC mBnYL!%DZciݤ̗½FvroD'/.2ܗٹگ_p7-hnUrPuV@Qӎ;b{D-pV܃bo (rXawd(f{SWt8/^ SjaqEiC3߸Sĉnf`#bj/؍kÙT7kan (`rΰ;7IPdϔ!S=OcS 85Tv4AL/M2< |Umt^jAu]I研w/Ut5+6PP,cޓBNPRN]T &Ub=v%fv?萗LG@*iTF}+V=U=J%׋COq88ISͽo\h2&'iFofUwr{N\ ;Ti\Q]4)y*PWΞ10v.,'cAnvE(.yw9:EtG I|ǹӷhb8R9Wl&zMNEYL4Q^:sI{x0u iM#*M# IwȲ:)!Ƙ&Kx)SSeR9j I(&E9% )G]~WyÜt=;M9?ňsIDUZ29i x FQ{a}šfw ( NCjh.f-3['_W34.Iu*<< kG({^U]^_q#7("a$IE9nhKw[ 9#Q$GlDW f< }Z5r`>bY ѵ!$eRNw<\DR6S,atҜ{wjmB= u,Hc_֎*Ec{>(GvNjWyB;9g""Gwێ&kjdۖ }`*'M#}uU[0Lbpe'Dod<(gR$,Td"G1ˬ`{8.,d66pS#:|F Ztd1U(RE3ZQ7~:*|OIy]]H2rݲa=6NQ%=D)%j>71|b}ci^άJt-0ߓ{[y 2k{L M #'&7hQrEDUi_]BvcZO󉜄\Yl4ە "0u?7e*P#Ev$מf5JtmPTʘh$ E.#?bjMӛ& Ts0\YL5oI6*c^ЏvZvPVb h'c0.s'r ; &P,`N= kL- ƙc,9Hp ◦wc%_VֆT49 3{|`xYٴR:L:?gvo j#ZBDcU`G7[fABb/[z [[fjRx(% 9K'&$ar(D<'zA|N΅E/V9ƺÄ\D{h /^bq{Щ6,<2 .+{{L %=khc@sO=F;~.+FŠdx9]sΨ=.&xoEM4zoܕLRc2bMdwZZ^dg7ˑ#E u3!TH=&1pW&2h³Yg=@nOfqwf0= ܯdy}U/&B.Q6N+FWhllmt82'}I^2"~!^jQim&Ѹ zjO4NR݀EW_-a|R!B8s-cϻz|_BS2Pդ!iV@5XN;yT~wd0$XTV8EW)ܮC*=X}D S2Fv6qc=<1׾89\vԡd;>/4;Nc,|1^uRғutIƶkM^vC66yigvhUɘ.< |e`[W{u\A9XcMMyl<4 gUFX ˵KSU5xU/#Y^ng~gcYwXa3(z.48*mgVʴ.c=֖;]%rB͠|Ģ;>BLQ} oWz(,NHtrFXECЈR`~M&GFrU3di [7OIs*+Hp[- YOX$3lj>;Ld}?$Z+`9qYDd+Vb٘Vr/Ҟycb_$yƓdkfp5YukS=rD0.TST +'tA2Fݒ.x'ZG~At 3es낔'=y lcVc;b@# endstream endobj 304 0 obj << /Type /FontDescriptor /FontName /XBYENY+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/E/F/H/I/L/M/N/O/P/R/S/a/b/c/colon/d/e/eight/f/five/four/g/h/i/k/l/m/n/nine/o/one/p/q/r/s/seven/six/slash/t/three/two/u/x/y/z/zero) /FontFile 303 0 R >> endobj 305 0 obj << /Length1 1656 /Length2 9126 /Length3 0 /Length 10181 /Filter /FlateDecode >> stream xڍT6Lw H ) 3C%%tHHH#ݍH# ~{[y~vSkhK- P7vn.,7^fWAvq8BEȺn29#S PqpDE<\\]Dr@P8BN^.k@LnaaAi l-mGK\0ٸ9przxxp\9]%7ƁAбvr{%h]ʪN`_dտlֿAN@j ؃/T9<@(hh!@G܁iMĿ tt8rBc YG0W~rc8_;_h~rwԅBrEY\B|\<3ii+ ?'G'c!`?\~>*aps@K7G1/8.O1r~}=>j[VP~B8z|<\n.AAہ-BP+Gxl?W!g ` psY>~q?/ooߌ8n &Zk50Ze7HC%U i@,mѽ= ptzx\\{\=KR]M䡖_+/0?ut{4<rtuBN_0_+?N 8|N? ?p:>!'t>u>u>u 8ꢥcc_90l4h)j[~U+̃}k\ (ʀ}%[D K} /m;erWN}6Q5x]S)ZSYM$}W*C)RAׅ. צe]L` z ֮U6[\X`]˭bPg)c޺C\FIdz&skD}A*cp7|yAr9>υ8wyL EB}P9/ EoVĤO9L> %})8B}* }*&a%hhQ!:tc^!N5Wpy/%{h@}dl:6+x\T7K(+o̱cz=Tr&CG[t4vEkD,څwjITs`BxR9+0{Cbd5!-Z NO7w fa* !sA ۳mIS0@Sm[ߣTEI`.keVBc0 !TH׬|wR6k&s,6l阚?LuJ:={k_PJKie⫹&䥖|^7ngh2itC|KZFVcg/lUF,W>;JGA.IG &n>V:Rz%wi8l;Z%l2xjⵎKx-C-3~F #d4I$;iGQ|A&D{@vԏg3Q#=mEgI0 gP$u/#%2%I+QIU"{ q~z/g#v.S˭g.ay߮o.PC#XOzV̔jI؎FDȣ_fEZyAL`ƒǴ=- Ϛ+ӃgVw!/{+AT@5Vf.u ܸS {**~cy-Z}5ڌm*VitLz95֙AnP[G_M/J v/F0IϪ[M܆}P!xW;B?srFH=MgK}uǾvwϺPYf>̟G`]PuC𲪂q~X-"Hr3~y;o G4{cj鄋m>pى|D<岑e>t[5=-׵\-9sنT] ]_{IK ;\RxQ,B!#fVw'jD[S,T}st)1 G̖i7#`! ˚4>GI(O ?Y "v O;gQٵ*\ -Olu}SQ%ߎ, V<0huΩlrb#TNWEžUJEΠ 9{*h:&`PGh[Xڃ72^ф5Sf ]^<]Ѝ+G (6ܷ" Us!!Eh 'dxoT!WW̟2"*gX Z4 w'3cZz l }60{@ )ٻn߸kT5~~f_E>371ۏPH=JL9KQ^1!{sAͼX[S%pd`BXck1.&I ~5k}ߣ9T/J<{! ce7k&Jjӻc YPjk{JekҶ|\DR{+yt}iYjpqvnQ1%yex\_r >aM/ WDH)XSg`x'ҫ-vVO(9HXz䖗Ph 6f:ͽ`{8)}=]]ƎK\dḰu#nBu?ȱ,N5o~>Gɭc㝢\ְz:nu)g-ϳ&I(7+ ח9!R.A_6,^Տ~xTw `! CjH'wC-QC*>9krf}{;.OJ_7_*_(YkO_ [1L@B~Zo _cEtpPLRVyuNU]HS}n l&+xQӾ)UZ"b-PVNVֽ_]S..3EEB>Kj;)5.u'IB.Ԓ\䤌Uw; !B>`Duzص@BXkt8T;c88&~Zȱ6^ES=DGOY$0AC؎lI;ԥt&yv>uMryY|} lX<5t?V/rKGyoi^r;MHEKS ^\ Z*F V1,k{i1Lk BNORאkYcEN.č9=%}Ũ &%-:pARDHfGyoE|P̏09)}Žpإ:8Xt~_6jeMr.Q'/~]ChbKU9fm"Ǔ)GX+qW,?O 9XfaTCxXQ|y$^'xqqGaAxᬬsD ,XxiNHP|#kr^1*d%Pd50LVԚ!&e]|Zƃa|SNqy\A^.+̼NwPL4m4M+c0nArϱڶ#^V렵T"fs.((J 1>UQ-ŻtUY8h*ZFWwfsG<t;Ҙ! X":#>a Wu(uJý!~, 4`W7W }/+2u( wtٴ¯1Xw{JF6~݇/D lBV~1-E\㝅uuoldn]d0f| w2cYb*1Iqʌ]aug-*?O!6ɴ WNq<&%M"4( lgh#D(I vr㐙 1^:^1y24DsϚ"-Ȍ4&V _ f< SW-LqkN"r4q ܒ@LZA)LѣMkУTSw7|r-!d»M!qK~IlT;\qj'aħ2 }^H%hC\좱9VgpH04 L8a3R1JU{m𵏌^$Yؓt@gEsӼьŬGֲ1c{|ênroWKC2oyb N $QN% #_Vx']3_:Ѩ@~lk/.MP]g߾](ZAMyyJ❭zbI5I)f͏ϒTLLN_(4ظ;I؈>2/0ƿ40c_%Dpz݁a&[D?EIǦ$=b[X[!el_GY$&ca%I @wb׉UܔI Q;yQ+&K~ zKN%l*js )ixLxϞ6KWNFŽ~?WJ9u.KieA+~7RgC rh8(9oJN4 㯉I,xғxra K:C[Qo."..C?8ᤅkXg (d9J4nl۳gcϙ Qn $ Ap6=_6@|KW`ճ٢X9XFsyOzc,k:L?|E .=-se6l}Kt#Xw-3stA;z%].rSAhٌ\%r;'[s,"r3 Zayĩ2Iq6P 0TŊ2%9VfC4X$9 O2Pp@nN|(}u2'i]eZ7Qj>W:#hqF[TO0[2ʀKsxw-ɐf`v%'l*OvCةfK<>%3j;$/KLarg+I|f7Aԛy3NW",| Z)]ýNPN t1YA %5Y J}N9W: 'joX뱃[>&aTW,I'xed.:ndVD* $2d'N$o_rz`RsԿ}FER5~gȦ:Cdqj~jzNYͦ+5,*1%̦LNPfԟ2e71`·( B_834?/t%իEVI{keQC2D4gW7y9j :RDR=FVO85%kE0/|է&!]Fۛs=8tBQw 6݇pj3"IGk@Hz«Zu}6 ֫6(ADk *|.S^g,Kٺ3u.ee/e$5ÍbGx=jr mJ*9YϓҌbOnyZ`WdY?Ŕ~!~(2wU%B2kXu~&@S' 9419>/anHMk9Nۯ ybX|N꽱q,3jlpkib$k);ֲiEq&_UX7-O^ѺxQL~ҿ'q (-RHVO]Oѫ  -{Ai1(Y˅ݠƊGBBۓd>\Y;^MsVE+;7xۊO@_05kYa))PK״ *LpA6Ο^#^$ uZ89; 6H_~V_Ib8hYq3YCRkUssVN<77]1U?q/zgH9)+Du:8:Uj*׷LptIgU{F% ]<}q@YIo5m-FS{wGjDfAyڼkݶE{07$OYm6J éZtSios< S]V,濉p. VvfCu{# ̙b<CX"YW<=˓GWzL玥 RU)crI9po6U۬61I|3|١䲋NR15mnD(W88@VZ :v{VY#3(*) 5Sc3_/ݔ7kǢkv^FHQ)1#A`Gqlj)/@] )LHueVWMaṒ DAC6lb$NJ;9Lţdh8} oHԞL#PS;5!6b#~ÎB^]z HΡQiц4(QN,J*嫦a9K k.Ž<}y.*JzG"$ |[vt&';6+hGN;]ۑ6[6:"z/8{f| MUQ'~o5@r'Rޘ^]BB*mχv+m/{t|%,L<:n[$NfryDc`cƻc&)l4 y<][$8i|Dz)~n!&Ջϸ% w66?\ZO\俭i& j[@uGWVl5'O6&Eܼ<<?V[yOSYPɶZpTi݋OP{dRʁ@M숹A]hD'١6TXGulK,LC9']Go$+ LJXP^CaziA['l9Zqbhn5 AZkʦڶ*+O_۳R[Hw/7Փ1&lAbUi|6mהuE5{e2Rhݺ;mFӏ1ek"W*ңH Kͥ.bP 򌰙ƫ9?1"oCeZ笣Mr= ҧO荌Yk\W;IJk0VE)$mSs*kw[sm q| S駋mhy"2.td3_B2pZV]T &v9BrVLGRWFC ?x>(Xڔ[/cO7+T</ 1/.'{-,nl2-Jd ,Q6\vJ NKNq%2 `\W.m^M~\ٵnX[t^UiH<{.! _t\ofMl4'XlAZܳp΍^cބ-dž O3ځߛ |#G[s"~jۋH;^ɺLF?y m<8ْesUn{LnBT[U5"lN6_\2C=+ӣT<@YKgcD=Ɵ4zn.X3\[\ endstream endobj 306 0 obj << /Type /FontDescriptor /FontName /AFIOOE+CMCSC10 /Flags 4 /FontBBox [14 -250 1077 750] /Ascent 514 /CapHeight 683 /Descent 0 /ItalicAngle 0 /StemV 72 /XHeight 431 /CharSet (/b/c/d/e/g/h/i/j/l/m/n/o/p/r/s/t/u) /FontFile 305 0 R >> endobj 307 0 obj << /Length1 1463 /Length2 2105 /Length3 0 /Length 3034 /Filter /FlateDecode >> stream xڍT 8T}Ŗh9k3ь"ٲ d)3qΘDHH)Y˛5J޲T^"-*%!ky~マK)9Ņx}OĨ@\&=Qs)?A ,h\IE`6 B0'6B l`V8碍_ &@ tf i0@q #:r)ޟeQp aha r@v(fhAn8qE_n  A g{:{BU9 ИC-bAPJpQyPT$7QSA{ԆKCebT% 'Kem- :!hӃ&P j׶0ähHhl6-GyF44D f)`芑/:@e5kP?Lcd=g_F٨ngɃ;o~$@1]86Jl230[I&C`Bpu JםȶpxPE(Y&7q2q›*;Pc4+MR8yf$OƼřBko8)i[]qdbwGMR{1+c>JFj?ncP:>tًFH\q/!upȴ_JfZ7Qy`JԕQ%o=w< 157,boU[e'NF=,ɩBPPddoζi Ӝ +Jbҕ}佷2o,NV31ڎIЍi-Otqэ%"Vn2If퇳j}_Mpf4$,ξڤ6O}jE8rM(+":\\Y{ mC_y<+>5ud-oZAƵ:IHn뮵+ӑQ]IX6mE0^M>Eub8V.mIڢYZ|iTsZ;tv_*vʢ1Yz45K{)q¶٫Mmz'Ut}։\؄goWLf/:U8w||er^/O]-@#Ұwר X-Etd*.Uҕ,y蝊C~?WMnZN6堬-eˮnMsrQq睓T yݪ2&MhX9dt4[N>;O0r5( }+{Ep/\Du/i8UbT^afueEOe>+I!eo rid EXQŗ+SK:y dƧo݊)UV *t0d(J.^_+&$+{Ğv RIk,> ]$?)ϳ]j8PI-kbxcZ~0*L#WxU#۳'T-a3pzQI=mS _*n!GE.о]g@poʮN+4.%S٥JʚKqNo"İP3Ʌ\٨RQ1N{=<g3U&.oBNG¯pQF n/[[[P9}C9Yn%nO/RfQS{^w/Y=]c.{މ|4|&mÛVJ>5]]n궥 D)^h$ڞ{IR vYػq–+" ;w<>ު^:Pη(PC7(*P5UuSLTbI19s/WG.hqmpw mGaݡhp\#- UiQ0ogB pG05?>8:{(\0(/#Dp0`p;X#) - gǩavep)G?'slg1HSEGCG@o^~ / Ep/ȨCw|#qC ?{ g -$0 ǿo -#,+#Gο;GGXrh"q+oWcքU -Gt^ XQ{luXd{pLxpQ`pgㄻ\06A1EO[AI~!a zpIB@onyma8!X\hD~:S[lj!B _?d7q q37Muh5. n@! p ZaxTjɁEn[s<H4Un~9's~lZkT {tR7M,//3̝\m1ǼIԐf|ю N,`۶ivzY>*sV\IҍͺjÊ />Vm1֏9_mۘ<<Juo c'zKYBO',΂^FkvFle-Or\1QlIoZ|9Ory,ӿ{ 4@B-oQN @(Ff\_ߏBf*fFyH}T=1e67P:x혮>%[Z^8.y=Gdd5:m/a+oPxsRHgčF)WDWRz]w)sX /CbNCd`$;=eujr>esa5'O[ ]xL7}j^!"7x򔷵V;/#YbE'[s2 r?!GaLmh4e5 f 0ԃ{";yʕDΪPQB}Iw(%31uI A-lמf{Kŀr*+ CleP~vjX]g{` 5m!A] H0w71NOz +WY[ޞ n58,dA"fM3bg ?j4Q]VsX5E`Clf^hm Rیi/%ta\Y;EWXwF}v6*GF6]ЭMi$HX>&WcmhI4DCz0)M9Orp;Q?w ˍ 5Ԍ_hm;<:fjTWr(Sw$b2dPdq>"i?g{Qv-HkR``_iM[Ÿչ[ 2id"-^jZZUy WB00R5c:}%/Omzђ3a%\>zзw Qn!^ wr ϻ?563zT=_&;뵲Zjs{X°DnBTdN4+ܿgͽ /W1x6|eX=jҒ0{UUX̔(.,_za]$Uҷ?ybS|~QL=X${Cæ +9fҋxe<ι;De9ex3+BW!ޗN~ò_7\P(uT ';X9P %A}0j˱rQ`uVv]b]~'3'{1Ik0( N63zR ѯ>7 |{Tr_hAA|{?VQi70tD1*tl׉8/hO.c\s#MRrXqj<J,hX/l6gN;1d!­KpjmTQrc_̿5_Ao(+u7i&5H1Ò}^CCP^aK/3BKgۤK{ tο3g~6ZQlI淘Gp0JVtgj$*?~|b^sAn c͎<4RY&`ZA)ً7ޔ8oE:XY_927rY ܪtM^U WzմxA#s2= 8ڸ"Wo3綾PyU#^WcCEtSxwFy y Dꍳ MJ>w:-{ '"3ro?}CPT"5vQh -/S!wIGYD%=~Sw!ḏXWW0#sDyB+OP52=#]Vx.b9-cy)1?z7hX3O72$Vnw\RH fe!K 1H*K'P_ {MeNc]].d>7Hx4 vyZ=F>O1e;ZAI78< 4޲x?C[r00b۔*0oܳP/i FRA_.=4اXѫn5uoWO:\9?mӪ,%NcY낌l D%i׎f6kipTbUqL?g'JEEoUEX/ ܕzB±()QXx27|̏bk;UIxi?vM:(2BA>w!jJj;lCZo>ӞR_M2~)AAYĤܠMa,>s)tN^˽6c'e5 @ m|11|VDTυo>?#+O0Fr0+8;["tw%C+'|^}R72b)[NB)geS+P%tuJE6lZ,A0ߔC I*z$ߦu3kM⮄=}3u&9B:}vJH(nE̕r]뭽uKel^{tkYΊ=aҽ'xYd{fT<#n2[I/Ǘ}]SK:1݀uUM`3 /]ZSΒ#e%LCO~kHԩ J,i}|C$!u=P^"h{h k;E(;T,50=/LidװapmLsɕ9R5-DQS?YtK]&sTh-<3#[#aԐӎg$aS2!2_^1>TLlb\doLqPY B}=W| PdW<.4_Ix&I,xqoIgnW[%㩌'q>CvBd>U6{u9[^~}'t"c*;r䣫"ץH DJEŲ;'e\ic\<ǘKe.j)l4=Hܸ]U#iW I<|T6h's1c/PP_tim~NO=G5du3SV E\aŒօd(qv k`m0]Oۃ#+ŏ'GhsEU,w&{^EAƭ;)국g_c\ S; &]iqEaW3˞ mk>˧˞phPfsiLϚmt 蟺*)|}׏3T;P;н-+f~i Y|Sl>5lֵ|W/Ckt[PCvУV:V?6q]=LI( ҜD3pYɼS,>1>hda75 kܴ-+hTڠ4x6w4vE/vxc0{tGy[T5kXŐgdVdy!ۜƙ37k,}$wK(B8RAi34=zYj0:oxp|kDU舶r1 1fc%Ԛk膂7>r7Jx/F^(V$L~O3lG}խX6e:Grp eUQ ^<ʭp8 <2 `/f\;s嫈?blPvkp9C` ŵ6 k/:bk}:Ix+_im:hy;xǑ0ZlSыټ9͔|HYiwً]p1 iA5kLҪn屷Ghm8dGY޼Qfy_lWÐN(]n( ੟3 TCN50>t['8!o\r.)r rD\ci%tcwԷF$;k$\7W1;keJ\~ C?mZ oeoL-Ij>ZQ.Rȋc|1?+~wy_EdQ5soJ$Iw ShкeK7)9g3 c[FN2^T^l%EIjD^TITEƝr"=D3d),; Y'(r|4d9TGgw/\/%i68; X;gmJ[_0^;X%MK5蒰%Jr^y dnpLl . uQ)8g+l8CIţ%#V@_!Z%XҸ>np[M؛l`682F?sZG:(#DJ۩`R$4󋄞cF\=eO[޶,tӞHWICV^]R$:҈G+?w endstream endobj 310 0 obj << /Type /FontDescriptor /FontName /MGPLPB+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/n/x/y) /FontFile 309 0 R >> endobj 311 0 obj << /Length1 1468 /Length2 6963 /Length3 0 /Length 7956 /Filter /FlateDecode >> stream xڍX}6 (RJH8cKrt ݡ4H4HJt 4M}y?;v+1kV%4 K44T` ,@#$ C+FIW+0,.O9 DT ']%P;Q H労a .9!\0@C8N9H_-8Xg ~~>j+@b  Є9! #퐘?~= Hk pC=u3'YO௻@ iWFHb5Bl6HG@KIP_0G Ws!aVߓJr:_0֮Hg,tW-+ h'' !5銰]:( $ n ͙tqC@JH"a @xZjr868? G⃁#XW7m@ 8 B"Q$tǹ6l]` qQ^/"ˣ=>B^a0 Wk8?UP6ho_K3Ƒf`a5V?;; Ü^%BSS#ݜ7!q"Gb6kmIw#Fc>9*0b8Y;>+`FT9Qh/9 `0/!p0-~>+0lЮ$k~/_~"~o_3YM%ۿ'šdzm-j*ZރwnB blr}qJͽZ/C{J'.%1L7Jg(qf!o.jJ`]$֨R]N n}kխ*=w)!d9,*M3EMG‡Y֘ UoX EnQl/>VT z̺$ owi΁DYQvI$_hd١NBrX"l}RsJMo'#zGh zWo 5pd}힗اWZ!&;(<7*CҤ!Q!6SSؿяLangtZLitE,$)'cF>oor%G5'ò70;Alb x?W:|KDA,3'V4mFY"CP1xyy껙J+鍍NM7Nkۓіv&U _UW.ˋ:s}en14(7onfIC7 ?whBx*g 6yK!xZy4FŊk7DxKƠy4hd'ZVAv%:+R]!)>D({L["J6 ~L|0k3XCsIKzWU"뛠+_!FXۘ3beXدXm BD$dVu ]~S|o{kw^S p",7F)Q\[eF<[`JEܯ!: aAL0]'*c끌"@ya6Ù*?Vo-4,= 72WA:@UgQ`Iʫ\>V~慉uiK(XYuGF 3,t}m_c^P>_jX_o_h}9I1`0eI: :nBKHU(%zU"{\l+uIՕj_XіB]ٗ|~WbE Bzjv#5_{bAnMe_@rp6u#nfNO>er[epmޜB'v:}][3`*dGOO?TZK?>|f8 ϒry7ɶpk1ɄYL߉N.< Z|m7 NͥTO)lld* bF#1a.]}^ݤ|ݙ,5;̛jg/$c{-։n}eds\*ל4]8V%>GBXM<&4qwrvo)dC?6@HWZak \qcT}}3)t,V?FE+@(6M͆<@෣s6 `VVau5E IU쏉Hs\{7Ggn BZS2y=:ʍ rE.z:zNNrjMHɅQ77*hn&@yJ䒘ShyA=Ex*l҂3y1g⺨uX{:-*3Ј[b_Xwd19A~6v r6 Y }ЛM1YTIϤ} z |c1PfUH+!m'Ӆ$>iNUZ!߁a)Iή`OwL]1RaJl*ڈPv.K PqB @Vs?AێZgln>[Lc{PSI`GeZ}mcYl.:c kJ.C$$:dy >"<3LzQG=z 3^Q>՛A*Y^[hȷu-Q{(:1gSlY}_խ;SμWV#6d"Bޏ{v4a+)鉓StmPR'Tx1~Pev\ݑwgu ( \`xG)CNzy&X.?C&R4to5F\vŧff<S=qx~_ٷʕqe3&z5(MصT ăOV3^`Dgj8~pk .}KحD57Ah!c4Q _AiBVT٭b5W ͞<#0cn=(l9z,F\ ]ǡ|jxTmQiSO`Hw~ߞxޝZnJ Opܫ{U#O/q^!Ku5l0A5巪s9-Gqk7 o,pcѩʪ-I-ߦ[3E6lg5^x2г=Cgt tKN wNꐬ{ӇVg4zbӑP ("]ӌUZ36[1%|:h2;ɜAPc\RXe3vQa}Ci330 GCMgykSω}F qlNgi$x/Jmj5.^HƲZ!G LP.W-0%L*5⪧r&7^%kJpTOW, ٵcie %=ĺ'ES԰ްqīy}zdig`B3uWH#*٠ Pn傂55Ov1^_L7lq-aT=S ~ě 2գ_Pçb`ʦ='qΙ]n=Lzf͚!kL]9?{-(Z<,ī1 Nj385VY}@؃|$?CbBs(j/s9aC'+A@h%y_$נrP5)~@GCBTȹ _+8rsznʠd@P@LtI;? ,컳|91ᡘ:ɫ=ke>-=gnj0h(L/6شNLgY^~uy̝9*,|}}B[4EVғXRž{ <+F2T1G%C)cK3b$3)6Ļf.UXvR>%WXŴk8Wa)7Dvz-ݣLx.‚ir aTytl < FX' HغwټtcV#g x:s6IbSF&Buxx8*D_<7\kãd5rȈ ;!b͌vϝJ(Fo}VujHZxSJX3i/Ig w~Rܴw_=n ጧک޻5zk(wLȍ"?f-&m9UiG8iFΐ•UG7Ln"^{~l<1:vܹ} Cw+rkѤ!~:Py~9W⭨.Xz9V7Sq"CZv"ŲM3 :.Jy(|~ֻI$wtOx-|.pfnSd|\wbܼ6I]?Od93+GDtL98"`C>~}Xc;Tz^ZmLFJkmEZhށYUi`n*o%:J @NG')wSc0)}|3!orbQRp`}Ri]Zڀ~iI`^[>­@PWڷ&0B6FKjMl=cʂ,63󛅺䀻A\;٥31f6JA)#kۖN yr]D7~koŖ"u2U6b'I&%n)j[\qbhAqל]He7mCjdX?, z2o,NIp݄Ks?(cs籙aYʲ%@+I{-@fN]͞ Kq\#[`zh7?׽%9(IQ7pcx;M.scX,Kzg/,̩4B召Xб{:Á{Nң՛ӹ/LUaIΏJ+#w. uKkW k\y51n:n76.^ǃ+P{w¥.Zk"GhK(m=nQ}sL6jzZt5Oz?ebCMGtAw]qp0 &7oИxΐvp鍟ڻgB7>Z h\%8M:H"QදMf/ m6xs$ d2E91pbV2-كw2 R oe@U;>o]81CLa@wx2o_f_8ݖx+'>Pz"?ޣxMfWy*iA2Oxe܌z>*T))~jeG ϺޅQde*;n^/Xs_'!3 {pQlw-+O0}M)'.)=%|p ߱yN鸷ugɿ7=*pktR)w3F=(O}ٓdӚ(4mxzk2tR} e4xM/  J#䄙Bw}eLmnu4n|[Z4 GbZ?;o8mBe,VB*ܞ-K DYyK$$@KwHo/5? o~QE$xL^u_dl.։l+y#h7è%v!^)j۔KF]p%<2$]Pus/ 2)^ضԐ9|Ȟ)mӞ"+k^d~ׁa[&G xΪI B<afس"|CVH!{leJg$!=&};w'T}jݬd".G ЇOn FE%M9AC.J~w;3FaG;9uje^wqՑsR?BY3PSV'5Sv~!WnQ= _tZ_7xvLF(ALʕS^#oSbCȽ-^D/jXM+ h~ߜ՝CE;.֪/44 U:C_TnkI=ﻄ0:!j~F1Nt߹*[EL> Vy^VE,Rdlfb/y@nWu#x/dɼo̻f%QnWu{x@9WD;hѕܕҴpgVMA$ј w endstream endobj 312 0 obj << /Type /FontDescriptor /FontName /QSQKOE+CMMI8 /Flags 4 /FontBBox [-24 -250 1110 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 78 /XHeight 431 /CharSet (/d/h/n/r/t) /FontFile 311 0 R >> endobj 313 0 obj << /Length1 2647 /Length2 22810 /Length3 0 /Length 24311 /Filter /FlateDecode >> stream xڌPX-;ww$$C33$WuoQ}>$UVc5w0J:ػ22TYY,,L,,l֮@gk{? ĝ& [W=@`ccau P;8z9[[Z#ƌ;@lmfbP0qځ2̬^ A#`dbl)Dv]@s&v;cB[Y-Wsp0q@[k3  %mg6V&+_&ffv&^ k[ @IRӕ`boonbmkb 2r ?9[;0XjWД%.{k 4݋}ga7Մ#P?& o%:fV̿«{9R:qtpXY[A|\L܁Wg7ϟ"VV+him;:H +Ͽ @2wm2k+J:11O# dܠ~ _Re#@_Ђ柕7@op~^\W7߂$lmRQYzc+h-@aMje\M@!joi]$=֮fVs okmTvpuAt3{P\@g ڧ7s0xl\gg/у'@Ͽ `fwp@,~('Yo`o `q%#Vo`2Y7"j@(FZ#P-J"P-ʿ(oʮF(oʮxA:s4qjclbz,bWe2q9؂? /8l3:]@lmM dO)l"A3q 4]Ki;$/;/o/s?KXA:.+/G+ Ԅ4w@4mQ h#s\A{Lnv.B?*55b:k$ՠ7?d`G_*pqݗ :& pH4?f j7A8AN.@; s^?aU;-`vr4\=pp=^@и t;.Q37gм]z@_ h0?`jSzUq{Lpr[+g޹6*#xF4q miSZd簹÷xG'XՉqD";NA R8(ayHy.V٩C|*dֈ*5KHGq:}}3D6(GwOru6< <]\"k *$7>ŅK}s$ KhL{lU֪#[9Pj>̭F,#g2%HLjw@v N dW4a`ScPowC~ZE½„tVzK|DХZ@,4D'h0s|֍]nO~gk賶!!\ߓ %3Kt~]L_)e>[az[E"9wOQ!#ս=[9esϛtYÙBu8W4 {cqSV&fyV.6i];4cj`vRh$ė͟bvQ6G;E=M~ΨTHX*UA Ѻ>9l; ؑ4:cEu&>f;Ss`~ ֵ@X~8[p'IO\2-*ʙ, y67zYiWQapf{p`?j>'b*K䒆2USȢV1AԈˎɺQuppU#iwwI\2"9kA&ə\-·5AE`lw,qؿA .Ue~.cel%'tb?tA[JVHywv_:zD~-[2dO{0N;ɍ_gδmT`#Ug(9,_ʹ@!6 m/ G :٣fH T%@Asf*Y }0 kKa+,ڰ5ND09L$݋p@ۙ#7\ҫ&xF_GtXJ1>+:Y.Pam BAƨTbRZfh)!9~f-/&B& 'ykۮɖֲ3st"ziga{7_GeNME#8wy.Qc;`+w f峼 >:#F敆+mT楐~$X YRB@~Py@铨(I<;:10< 9 v5i~8Otlvp/ eWVQL$GLzjsl fגE >ۑe^TRb2~znGO< )eNѥxl l$@bQ$F̉V%7K7yK!3 JO`< -VI'{ɫzOML2ro"GNL7sLb)t+Yz\KEoy)~ 3şq0o$@8xm<i5BKnf/f(f)K^zayVkm=*cm=!1md쭷ʼG.7+ \ID`,B2 è8<0Jlw(ٴN1k^3p$>otNwX#:Y(S0NTMS 8~hBDmO{`Ij*v!Y7M}zC6I>);pwے:"^jab3$I,{ H˫'%&zwʞa9ؾZOuR3Xh:dbWO;wdSez0wIcfwBlܲ-bϗ.̐' 4W%* (Bzg.{YehX"~}%4ˁ >zH{rdS[dD@7rSi8]+Ā+6AW Gth^Ea縓<С&#E0.n[舶2U>& [q(7پl W._h_YdL@nx~ǜ-qT6tN1MF'ƍұC\G}jLD59/'D_cC:I1w˽F _]#"n|+Xɮp:ꛣ7R3 8.R/kM%NuP7VQޡoK\Eoi{ s"B6ZV[ Bycͷ?}}F(wxӧ> :h A6*w3E>ӈ"y|k8Iȟ { x,6`IDmxU6Yh(W$Ys% k3LivgAm=$C;n$?"U15uI~J̅8I:߱Ȝ]WDX5ejr56fɷVj!h ՠ'=u$nuU]7g쭓 s//:ƟH{vF@jdFRkA՘AA'I ]z4zNg^g]c|mK2rd ZyxV"&5I03bio܆j ; ֩0Y$AR&Y҇moX_~:5̈B@ҟvE]짟gzbgjd3jq+/p̎pQ}a]mX'Ew_"+;&*_FdݻH|/~$jd <-htjB/, PU+,q ."ɨSo]24-ꅃYDybGDob):Wtx z/j.#N`h@yȐ cě]*TV-YzxS;>9"q67.XgKkFrCB!v m@F69JΆ:׀~~/D`$p>~\jF8A**zEJZJ\L}"{ov+)]FfZw蛴:0sȇHƤMXH%?B)&OJbw\m;[ofWF bABo}y׹|$`$ _' (6:ɐm#J 9;;92q: D)bThḷF=1B>% wF&W!k7XDž:٪~bC&+y<6 9Y~@rnPVdǀ),>|뛙77&:)uʁh፳Ⱥ>MlɃcK{ w&(v$L05 $ɪָv)%)" "ljwpY(z= ܱi/H[2?m{J4th||j~ۥ6I!0K$4y3r,`7C`t{ .(x |vaOev$F//>o11! ֺO;T=h!_3:~| IrN;<#D1[0W:g@; Hr?DK& Տ^U"\E˟[ກf& =VfV])1<L8"pH:(FÇ1א:HsJJ80G̺pGȆuG>iT<3Ge,/VwDNqlЩY(,eiD9qݟ;_t;a&*6 &558B?65!%0T>_(ouXse-E;-XιJޯ|/{U;ڬ[xI[m!Xn{ifd[[-fw6A/RݕMu6e'9/5mA+?q`ԅr鄥џ ``ltMYPv=l~xvGL ~ uN:RAeET ueE++%vTϓw %3o;=Z;5VS7bۨEhzcrzt ;'/RC~ Fx rֈr kUQ  nC 4ra1XZmsW :vϊs*lڻ%pg$ NĻt0>fG^)^\PIV'} gl ~ 7w';2O[אd*+Uj57&3&o 'xM9duӂYES+xM|/r^ay3XB,Lv?. Y7gy͢?{#(ǸGoVk cLXQ[|z k]X'C9yKfvjX; $#wiK,- YOg zp7iii'@ͳM@BWrVXݹêDzl荒O a˕.abO3C#)Cܝ n.fomN 3V Qܷ[vwyooPAOSQ>(kq+ãBMalmE8D>>Ǭ7a[ o09 nWGgF]Zbvm~;b29BM~NvXJv4`41yA}KSEp@L$IU#^֔"5NuM]8Y̫~?|cU6{t$T{hJ@Kk2t刅3UzvxkOj? H{'[*<>Yr-&I2#2Mxx:RlB.Td/W#"I(Ay@ݭ;fHmKS1f/I`=\cع0"NX9n@%gch.g!ѹB*3^WX~ę'D'l0~)Ӷ+'=%MHUw>L\L=]BIfZ-qQh*eqp0|ߎdB0ƠwM6:-vG)߳Sq/S(=,E.̼`ÓXR,̤ifGa O(0jYXtm)5|rwzqhK6fዣ_<Ȩxt ɰ^ SSHidHo R'L26vĺmg9zUw`u{TKE?DHaԝQ_k^TN3wQC|/_-b!y^XKI ^f7b(.K4w2:>BTtg; 5橒{#4ZN("VvđͲ#؃'XY 4[K2©+C/CU\K<+eWC339H-Yk)+[gm{:cPmwO5v qa԰t`|r@?%?*,hT]δM4摒l]?|'R,H餷6_ЈZӶΕ`^cnnE}cwh9r޽m )ܤ+edP Q!usMO:s;\nO*ϛI,wg)2y{4[4{S8٨ѳA\4'V~7†|u[q^l"v7>Z\f^VìȎ˻J78[W_ԤZ+_cYm:T񅽐ŹϞ__arCK6(zld'qzw0H!+Tzs !ӏӓˮb `6ѿ(ɵbEdvKiRLבܠJ   $=H+ %}m9`&3<.v6duU*9 +1<ϰ*#?oҼ;J."GB4.R(jaMg3dhL#&$#1C8׹~[j!Ayv|sR:Z=,_O Vb?> 0iO1{:˷ڮQO7J~!pv!d)Gƽ_Q{`8 ʕe V9=ۗɩBnL`ƒk_(yi/Lƃsl(y+y,Rřv[QG˄: &ݔ.rꝡji׷e{=Zy7W]HnWs e]IIE6keU56♋*w,+dRMFΉyO;I8I1ޣdMo\q\rT|Nt[tՁ^,mpR|&JMf=4ݒڒڼZl3p&%1W%r6קxc)w;Ye!IN5*iD̝e?ȺB1xE-] sgtX}>y<7]BVQqWi<^fb]Tа ެ]^5k0i§iÞEbB%p9(| I2 @Eǎ^CR90N.GR;L @jJSh p^e@}>h`"[[8)%[)ra%fB֊NAX\=_KajJ}\J:nЊY[۝eoX,\s {x{1|޽|Qc6Swa-/Ma̪W/Ao.W]7 BI6?IvIdkרgPj)<+?.&%abEv COL9+@ \ա&% 9w%*>6eEgqt; I bqٻfR2zL>8_ݯ=7 ؒTN)WzKVxԆG=sbL| /O^[9+rhKr_evL4Y+3SC xT4:w~:C>vÞ.}k~.UT;=-3M1QRR%Rփ&dluӹc/A4.*X^f}p@kYǒ50 @\޳9aQVMZ*YO֟#Ōxfu}p~p̩O6[ibսf@nrmQdzf])dfNm?ߺe|L<{9Mj07ՃRR_n0 Cu8K,A<_1&sZ Yno5pNv9 A`r, )(C3!DX1|ltMMq9y|q_zNz0ݥnBÿrb^Kk*&?P~&4wќyMA#2[QeKH51f~r$6A<%I^- w`]cUW!m*4Y Z̊0{Y8&!wz'׷|+oǞ,KXW:|"ؘK.h'n!_Ct~G<NNJAQ|73wXq1{ȍPy7`Aɜ_b#bN <@q*[$0њG9m"Ў&},,UbAl%|hzq~rPF~tpa6y;tg>uK0l9ڔQL;ϴ>F=nÔk\"c7 iaK#<83S:V $QfNf\w"ʀDYplT-Q/$(֔#^ LH~_ue^hmuH < c-ytZuiU&Ô"A@)&SP}83Baep'0)_] {ٽ*RҖ){01Yߚ[1{sO?xA|!tQlScAzU$62 L‚/b7xHTBRjoYK-Z^M.X{H6:EtFB0(LqJ YU*QLMIf-*!yB^xK.We+|ukHSTRyq{]!C9.XCt%w1X1M>h&M-E^3, ~((0zFOfpr閽Cm"֐遘( TsDGr"NR%< \_Wm|EqL<~ pbcN-b:AS5EE5^0b( ë@IZ3},t"t|f:z)FF=L|?  S D[«i3ΧrcyېPo+[CʻPd|~^{:~Ͻ#4<3:E|3%xqo25]JZ<غYv =պ"xT?M?V)lqѷڽ$6YUMJD[UuO/O#P[CIƇ 8HD7/>9V#&aRw 8)uЎY-@|=嘼q3q[["[$' q-+F|l6m6Jr:2*~/cO^)+Zl@J^%"q^3nxp-‰` s: L۲ NxJm0_lъi2 64Vkl\0WvzBT~p 8JqF<_M;_ A;W a<_ #E̺xE|riTŘVh1odBk޼tE+v"@yC(1N5TdA~:n\EbeNq D/֦s^ڷ.{5rOG]?W;{3R Д?IA Ax5Ȗ$s.~* CƗ'xsr%d,1;j~ G1G[w-:dϤ} |muenQn=Ik(l-VffYLjZ'\")) yȁF`FFcO3V?mMz @n 齭J3-̺Iy.v?2ҐOh'kg{X0sxFMYat^nkZT U"~á3w AzL6TފҷA)hT Xmg:lOÄ\G'l=^Q<1a(os4aa^ꚣ{f .x=ʞ53j5ʣ;p5g45ex7N%Y/Ejphpq^ GiWAHdWb;ND{SE;#Quz`eB1_pY2ly]&3G,KA>)rN/&Q)}aѮ4+/VAg~h,G8aʦSZW -TG'vSԻ4lBpSIA3n :[m#섏u2j\WW)=?fwpƢ?DKS mϳHcӌaLiiG)<[o\-P x}<^fkkʗe?..{AVqkZc/bE?I#M-{L,t/4@ʢ(?D܇)l\pU z;U;J>\ 82:M'D((` fX<߽~T~c`@5?{;C"YRod].jQRNfEsTtZ_jHfYeJD6 Avnd{Qo@ν$䧯qOU| {{ңqG]wV!L 17S6CUo:"r.t '&ȵeU&XA 9dRmtXw( '68=+!)2au|EY?J ī%=)4lg+Dlr0f{m2xzı9wxw`kkY'Ū2nQ^ htȱQ$M +fbu²Ɇ=RHwXYJjbI?Wr5H)(eu.,v NTVZ݂dD+kJ˖ jMRټK JҸr]Q9WQsV%hg^y\%#}lTGO# INC8,/^8iȦ$~4dq M2oƌFhPGYôA;;-3* %Ś׼iGL^j=`wCaAK`bRY\hO\uOn4Nfyt0c*rTꞄ -=_*hdc>=ʽVƯNJ8/0|[O*$t=C=}x>h'v[V#c_ \юa*E)Txx8_16AN|@tIwU!^d}AlSO_+"@SFe%3A#*~iuE4+&1DtN8N9#!>36nK8&ڕGB!@\k-[Epy^sQ0苿G#/7 &wS(ْDe+^+hx] LJW<ۏh[X1?w]Jo3a~@&ބL'-1\{{ @;LDP nZM,|5`&y\X3 Fȥ,i%Sna-7~JD\lLgq)xNYnenkkrc2bO;oEF!Z;\{K#p`+ߖ iϝqՍU8i}6q^UH~ +}t+vWC8mw]Dr_P$;Rg<~dY+MyJ>:0`CC;F5T"ј `v$W&,4{gCJ3Ob8Q08Z@,oen-T|I[͊{n|36%&y2)[~vS7Z?~6<.TOW78`+XXL+!Tq?A?s3&=rD]ߔk| 5Z< ^DB\ufmMGuQ X&jswDpr{qC?I^*N ͺ @WP]_b8AGQO:a\k' OAOǨbsJ `mͰ՘f@?hF3"H.w8*%/8?`B0i38ğ68~9u`bq>㶽,u֑'{eo. Jcy&R,:T#5n=z gZExm[mT;|OKkmx۫VvӥH 8߄ KXU$,BIlj@=ݑ ėuoT027.z68˭Z i(Y d=u"#a]O25OD&*s7e礼 ڱf^Tx!m\$}X;QĨ*8Bl\IE}9 9aCE$P:^^ %[;WY{QKP?f }*wbɜ9xJ#*Ú-*-]s3_`vFmr&YU8JѺԳq6')*~=tXٔ${P6=GtGO ~>K@ւlp!&W0syBՆ)M+r]BORSE7Ŀ4Pɦ_MVnk,.!Yd8dGhsg5{̐n 0,ِd}~r3jıvZĘePH%S~ @bbfyE*mēSf H.1dD6SLԙ\8ζXI3x% tw!*2R @q%}ߪ+tIF}ٴfHT遁B:ةR{_}vzFNG?=<}9D!`כ2X2hIJnhڴ6$} ly\^v2M>sHx"xc3K.L6_}H^*MV^-ly*S?Ynꦫ:?ս\p3d̯vHѰUF͏OAے% yU,G_Ks?>; OMeOqYsפӵ,;a3i"~΢쀙g9_ eO\ξאĽlqR^. LBZXASs;bϹM%ljCD{Q9^CqaC!2 3~?UM0!W>àuhjx/42:Xm\GM\rޑR ul`,`rxjBh")p֡-ݾ% sW_q ib$,yU^8*V5U~1gYsf# rČvޣp)IAT`횐s/Jvdp*f )N̵7$}.<2R{fj 8 &Q|Wew`@iom=WIæ)zIC Ft.t*>8MU *SirbqChARWiq V2Kk!үK4@BÁWL= zt>i[kk񃜱p$% n/ʅ/`D(ef|Hґ%Dީږ 6^Wo88mkHǐp֌@ nJ>uCcHPKd`?I9&ܶƈ͚ik.\ڎt} >(DLA7l8g\Ź饍bIoq~|NACijm6qҴGV{SÞ}hNX@[Czo8,a qH_Ftp-;Y.ӷHȗWD򇵐lŴk,q;?ZE۾bAǽ ~3L,0:kp`@3΢O a@iX_%+h!LgmƳ]kX!fH ?HFK~xP5:Ļg9 q>W[r& j{tZ/Y>x5.esM{iU8Rp9t,۱VZ֝r,\SOWl%@Wr_hXlO[P{~_,NH~]AՈxү \BwmYa "KeG牷[V } P4`gM|Q^^,  SHl-$Rxq,c7(cphKwh"ѓY%{j)B tPwYL1+^Uշ3'8 r_=p׻n#@>|@61B]JPf(~6"eWCVɍ3_O%&^t*T8Aܫ l,[JcX$"A3H!#;\F7[,جիP䬿tG##` o艂q$(191[`΋?sclbVh#/PbEYǮ+TaNoR󧫘帀p5<#OE*а7JP+-W-PWzY2SM8uō+e_͞_ ~9g K;:M:l/|~rEp5qŦ<:Âf;"c7 .ET{e0wA(vފ ib ?B7ZLuzdA1EǁꦴeE<_I 9N:D'k_rdgTn_"ǟ;!2 2RQ^*hSˊ939vcm?u"(Y`JZh^AeIel} 7UϠ*Nf_. bG$joRC{ ed*~\O6}rQj,vkmi gw^CĽ'-ά1NR7퇳{bȹ Ft)j ݝ E  f?Q7"ꞚܦMYkbUMڰΉW+KBQmloҹ[c״ϋ Ua@TWxjfjf@PmQ`TWl7h:a 9 LjHt0LŹO7:@~' rn8Mc+[@bURV[haSj!jrJk`Sֻ֗Gxg0:y]j0{=őAV_-AdZˊ!RԤ0 {ٿ;@/R )WfP%E#W wH[mLJx2O~L)'}@մ&ʚVZӡ`!()y"y"gZ[_|9f,=I H.pW |fԵ SM,t Mx2ep d1P/u# hH<2; ;g昏#gtT8@]$,TzCl1>y#RngBgX C @f c;t!3 hDӐ>z,%Ǝ;qxJB:kIUآ1pkɚᓟ`:Re.po$ yk _1#:'r&_-kև,!Q䚰[0uqB2=LMvem" V5MGSYxXӻLk(S\PSGl`y=%Y u1.RWCȽ=r;E6%fhƖFߺ!^%~GDܲ9ipb'b=`ɲ $vU?3~a:67Ei+[:jadVtGe]s&ݫZhHI8-pWP Z)e8YL8ÃXINA~ }ffKIrfW[ݵfmv\fU2_!ZsSR77.Z̭9{I/_o Kj` TS)Zio D{M{1Pf-6mlth8T-*C$9|w|/b3.Bp U浴"7M;&h 8 FМ861mpg ڵnA:o5 xgğ7蹼{(1Z^U["٘q]mKd骧/`C)z' ET}6\& zRچ ҀvF.<8m׼SWߊvFyL닖X|I\om3->Y<܇!Q:V8b\2)}ukUZb8s?uYy29h߹93b-rhdܦ .F ^lKJgPV4[TE XbוG( 0D,[Z1ҏ#e%6 ԷrAaX \`ޢ^g2;}O7Ku j.* /;/~hTOJ6!UQY`-L.3"p"~  zp^XVtK#yOAq:j FQ1FXŝo 2Xmu l]MN:ڛ:p@c!l1aN^t1A,}D&/gj41.Ȧr" 7nqh!EЋp#ZphYx_׀\Gҟ{11i G/2lBnXC' NNԆx T 5:8-#5?-Z:8hA|?ex|E|K۬#U:,#y"qثdܳѐqg%*ՃB5|=pqA*jPXzDbrG[ä95W`jYsznwHl2u,P6F[;!D*-v&B"UeΝL[ݕ|vفW 8H@lƻ %GBOWkE~olBMi BDso#RӅ^Ŝt) QUaqQx9gUOZ,< J;wV({ՇNbp :d^8άR%bԊq!Xnߋ^3TV62o JYXLqeK~vwA߱?^hij mh"/`7;ڮZoݷ6A"[ێkd9MN LPЎ2+%.7YDA`]PukY 0U&Q hz3*ݳu4"G ¾$d tZv~߇yUMw(q*eTk^Tb8G ׇ^IBɔZgK YEߗً+9F39>kbdssea7ߴVG_i0YY![ӣ+K@rmӈJ0[*J2_OE#gͰ~H-u"lH-)n[w;yinsKz\I5fk2O! ٠CC$qUW&`;1䃾H\Ĵhix g=;w=ߠ{Rlۜ%W`Spj22Њ!=?o+TC;bT2L'ޏ*xGr ) e-%ޞj$F&v&;Bu endstream endobj 314 0 obj << /Type /FontDescriptor /FontName /XORHRC+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/Y/a/at/b/bracketleft/bracketright/c/colon/comma/d/dieresis/dollar/e/eight/endash/f/ff/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 313 0 R >> endobj 315 0 obj << /Length1 1757 /Length2 9811 /Length3 0 /Length 10938 /Filter /FlateDecode >> stream xڍ46]`DC{oQ 03:{'H=:уBD%|rι{[g?=f}nY[5X Erz| )ȏlA:22 */y8)~0(@'$',@8bPA\fy7b/6v0Y0b4AH}E3@f#+*rAR\OF`[o- Oe<O> g pڂ}U +Ɵ\w'@\\APo`q4x^H.j䌀ǃ<@gJн!lW$q-wSV\\P$w 8ؽyY'(@m~uw5B ܛpكA (,*^6x ~\v";/ `p$l _>0/Aq~yM 58T7''r?p DED‚@g[aA OBU aw-(lLs 7&Rrwvf _쎼 Mn@MB]UECj1BJ/i;C`p{?(:wIE @p8x?^_{1^( yqߨ0W$U x5F"o$zxmF"|/?yൃ? x6?{vﻻEwz?0y7!iDܯ?}?}/HOؿru6pǶ_*و:օ$9ɼ;<;:+x~.:hi]Lfݶk$6ܹϏ <6gނکƜ.BOӳW٫|q$|fSwZH|;0yPsu4,$7C/©I;z$N\E+>_#L)iHFY|v(f}K#ӏ:FW]^9lj[0QQ򢓩.$0$c d.-{ X#!wzxW9>;luzZԜzȂM8l !kl%Rm\Ϫ b05:u3鱻Lvxj EغPY276KԴ(q<Ϧu?mcLmyڨ7`i^=zgd߷ur;\,B&QGʟWDE߲ qn#}Õ=i8;˥oc)$6m4~52DKK%&i> f4)1pMhtgVԄ"Oiola8-S WOܻ^0SP;Nfh5ˡ ()bڷ#V2!ۓ9(C jr1#L&r٤{#UݗT'_űү=$7dqnRC 5ltƧ[|  UBES83VjN-OXӨ~daMY7b垬S&C6R>m"Ak<֥s~ć,)#->WN5vnϸSE9^r;:4 !Yh^3xJ״)hNRgWU&Z8׫IXr2%I1^ՠCCNkx 6RP"(wX*#D6r|ja]#SO,(*/ I"L,{*fj'~ 5A\hxX_/~xA|t[T0&;:]ʢD#g2ћU@d-η?y+eB؜s]RG"OcgXթ~e:ha9ue|> 1F:î۞fZW ( q qPAݖ*_c)Gd됈/[弜l,F W%B8瀟Y^o>JF6Tvng('+kukF `"̭P5Ķc/x.Txy3 h37dBD+6W-NjIϨd,CGQ IA܏dV%E)%Yxaz5-Q ^@PkΨ+ L~YQDH93?;%ξyERA=NS#>:̶h,gF43(UXw VzKy_? zɗ2'$ROË:eԺ^]r:_sMaOM(Cȍus"ڥˬJQsVs9>zHo]^OGg茧9 KTq]"+^:A&zKC7/K JFR?&I|HoQ+:.d/S! DrpH׍z ˞ 2:7KKSNHY튃kg1T~vuy[q驖2߀S>$B);&F\pJd)Yԓܺien!j0Ax0^?G#,hhɼN®weךx8f8|RQ"}MN/n;<]T;b\U|{gSk|mӦ7iŋ*l"cZe^U :<{\SZ}OB-pȮ0$4Ky<Q2fP:͘q)g!-S|\r>"*a[j$kew..(M-:iI882*Yd_HúzrAr ,=Qn*MM¹˓4`b|HF~]X.UwZb4l c[j.}ߋv\3:Fd~eRDm=22L թ :p̳e̊: HH!C9,1=쬪B#y֌`P}*/㈛,0{ఱ?{dQ*/ex44CQWS ␑~\kS`]zB׮Mle̻\\ ҁ\[0̦kZr*{}Fcm'ޣl|Q ^ w̨S@Cj(A,].Q4#1d;? ʿ-(!)Rke꽸,pYc'UYԡd&3gNF$lS:۵:aH 䄭6k[,;yFƲ]ʎxi6&#v3i( bL.걹 N`xlkh&Gecզ& ="o-~$ĥ`~z_x?I3gi8XA}s8$0Y\džܱJǃhN9n qAV#~nQ0~zK>ʴoBS憎*fL\hKʯ/q ܬ >5dOYp3{&306vؙ,A؝,2^ 5&fxv2DoKEv']O\<+;]qr0(!4c7|:)%w~>+4%kSO4_C&2/3o{vz(e95Z??[ߩPr5քK$UvɵODZԻ P\N Gf!)BFgΩAh#6/1$tG;tɢ3M1_ŋ<+~Z寳=̡n "0DZ9OR6iCʍT_'-P5)/\xEԍNT "{\c*rpEE6Xz>ڭ3<[+V7VOA8NIYNR,C,PKGwa-c+Q^d15@ؓ12ƐT!QU˫_6MRsDߘlQ,?V'k(JB8gf3CdW `@䛝(ߦ3^ d^l}ծAΡ5 &:QT[n"5CcO?Lgg`qRȰvD'=7ʶ~ǐul6#;9%ޜ%,@I![~HHė.EpIIyKmVm\NB؟g+@?%/An AؼRCeL~_-[1U9.>ߦTȣ3 *hslt&{|_>Gor7qm:JS~[\2&$g̵[mxx5{hdt! o$%.c$HGSU܍Ȅ)~XKq}{[]҉>Rqkc ,-'Jq'dn;+HJ9IRPMƜ_ 7c{ׄNρ_[ټ,*kJ@,KL.(0$^MQ{ҡmlx؜10;n#}kO.Cr Մf c;1S% 3Qu_g@-haz=A#,/|_'F}%~I;rrhڪ[ p//ls ?1RݢnE, ) 4/8#Fg˯׿~ M_+}jJmhUo$>Ҁdܦ2`) f`mBx%$FJjd`cvRS1/v:³dr>^,tJ78'dzi3G?6J@"gZe" bA, bpZ4]rǃu҂kjS%Iʼ^fE$+^)6P0_#y?6sľ&4sY^] <62>kDZt|RU[ˋ xiT"@.H7_㓓AɋY=~NY;T]O^U}$sN\;:_b>G9fHcRww4Zk*_6] ]lV_^[R;?H9d6HmX|,oL*^'Z^ \#,bP#߼wƥ]EqHеK3qQH&ss"JZL(t22@ sqۉ׾+2hϼ᙮a؂˭"@9rw`Cp˔\C}7ҋNT>p-ueJ{<;iג +5'dl-s [YQjBz-hUX\sOVun't8?}LpXqn'L6R$mAL:㝓X$l}MԞ<$#{lb MENn0eBZ+zgzC5ByqEn1MiL(zjTT3 vjkFnZL~$}M~ 3$qz0/Go}0 {sTYCMԗ۴>@(sTg$uhTt"%ݓi%R;0.QS hJdWǕѦ,.Jj 5M?z$ xx쫤Wum |:FQqäR=Sߎ‡:XW4S?\(kz꛹VRN+ߔ¥VOY; UM [8bjes]dt#I-QL5ȹa<{/VG%-~d& ~Xc6NYv?x=Um`SI1͞{w ]ə:,{2843$= @ǟ2̼$)p<!F #o(=oٷA wOuǮvӵ½V R8rvdB9GĴX 5Dk{׍5G-JmEV<da z)TBhR-3!ߞ6?֖W+eS( }/jvf(TmEq{m{GQK;V~~4py|BwZוQ0CF߬OڻU\M_藇 4sZ1^f>wUHZQv#~됼,!Hnu{ub.ߞ5yc`eP(ACLan[>3MNrW<_,h_s%ʴI-!.cJ_"E,OЗ/[f U]yj$\6D% '&6(C@:.ln'bн'Vp <kERdHx6<ʈkp|iyvoGncjՃu ʷ*/17۝vn'@_ ^}o1VxǪS0~KG]Ay&BwDBQ~U:(s;cY#kB_ ]N!$oH fbBߨ1rAQfyv4vu6Ӆ'Jv/ X>r*`k&Ͳ "= "h+%l_*Yt'جic8?!>6s!=˽uhPX[KDPR&v\3LP%*6 ï/STR0<_CcX3⪻ʧQq[1:3?i^a `fW(= ^"m [/]SQ XYVS:v鎩#L,[kߐMn]E}5Tp&]L @ƻ| #_^BpCg7wSI]B 񯢋ILUJ|"ad+%.jۆSK8ƞpKv0&_*tLYz.Ň66xo?tm*-6Lk%r,ċ~-L?;Y}}Tg:Oʦ$nyY5<،KQmҔkoEX]_Z1`$>(|JYE=F(1:%-Ky=^q~ ULu1|7_]c\".Nz<91BG t9jN\zHGΉOuakEj^Ep}"tNxR;k5d^ Z&xM!˙`*x14K :\Ck՟3zW߇ޕN\ηEo*wL+Nؑ_ۄ̎NV옫j?xV`9\ oȍ\Z"ANfl5!\Ăt!RZp3Sgz QEyl`օsdCa%1Q: Trژ%vbÏ/_a;߬y_}|=e\lE:n(B=~)n3`Au324x Éa*2VkB|ȎVʆz/id L<~쵪6^Dq!;cQ2o9].ˏ/K="=9 vZedh lLpuPY .%S*M~CJ,~hBRsNZL^5gv&9HqZO*+Ƚ1\N?mdcY^&]OI6>56$K—H8?Ԉ0O endstream endobj 316 0 obj << /Type /FontDescriptor /FontName /YROTEL+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/C/G/L/V/a/c/colon/e/four/g/h/hyphen/i/n/o/one/p/period/r/s/six/t/two/u/zero) /FontFile 315 0 R >> endobj 317 0 obj << /Length1 1606 /Length2 8606 /Length3 0 /Length 9646 /Filter /FlateDecode >> stream xڍT- 9 14HJ+- RҝR ҡswuOy._hIBPS %aFn (D2n@+ؓM =\<.~a.aNN7'пnY+O-@ e.>n {S00X@7fs:X9t6 J0:`.^^^V`wv8+ sh݁n@[ou+0/fh]_v x28l -  pB V+l\\.wB ȟd+( @@*; rv>[yZ /z"7=w7 ̝"2OS@` | 7}8Y' 7Al~pЃ\=J}[y07`?и hh~|77I{\ߟ2{-?a$/?67'@ +*/VJ;(@/ O ϿU0:I@oiYRdM{ yg?n? r;IP>C m_i; #] lпn᩼3Ԅ~56.N=훍{tW\urXYq>ɋ@?pC 8d AN濑?HaoP? 7a>v|:?S# ә O}@~_Cps{zLi^. h s k"bۛ3Hcb[vzTv)2܃#x!B}c$[;6)Rl_]>R!է]_y,|aOK5 ] X9ʝmv|/qBfKo`x藫dS_v/ZZa\vg8Ɨ=3@Ac1 zx,vwG 6JalhJ(A.Љ%U2g{),pu삼~Q-icd/tk R\1.*9"ůõ_"xr`7x{a}7R Hh©>gtս;Z^|o`AglVyjAu];dr\F %m!8IQ0.ؤ\{c$SBP6S V=6YEs~j9)ϙ㯙#Q_EY+r:q]tv!KXVHYz5ptJC8_Jաy>*gou%ڼY}QR_H/l1e6aL!;W-clp͔6HFv4:]R,&R;w'ɞ]GǙd1Oj%HS`Sy+`nbwg w^Z(yY XyG/gP-aT3yOw:fd"  ͳ$uY`w-CC]4S-޴ {=܇ҵW㯥I]h֐q>mXlD\|R;\ד^O/a?b_>wԸQnNr thIsx`x]r_2я_9Ȃ~6tfQ는puRH)ukqE\nӿ@io4<*Eze G6-n.ZAw8HP+AEWPa ~<{-OQte;JMVy}z>PaΛXe1B~M܁EL-(0k 1˓=%$kbA<6?FPhz޷{v<2 0'li}a.nA Z}-XzGP-|GRѝRf Zh/~EE\Cbг9_׳͓Ys6Y ,38~U"EfAyowz:WfǸ $ * w^ӋD$fc*cfL]6)sn`^Y;5՞eHe0|ddqn2U^YPU5퀾qTq8Z{ޚ5 &vd䶨Gt!pȃƆyYM&wPzhݪ=6i>f"$71,ڻKa'teLd{SXgĉr\Oծ(^F>ʘT\ b\TG֙:-H@`g4ok-ԱkNRM3I_ڜ&ky[})g^<ӺgGRk^,WZFp&J(V3 ~H?6\v,] ⢞^8 6bGl$s-֫4WfQ|Ƚ[r+05:[VR:[yW.$1S{ͬŠ>L8ĨM&角>Dˆv\髊6!|^lq"*gAʲY5,ϰHCZr*Jyzÿ ֚M 0<ٰ/na8OQn :7"])OsȒuxB㳥$"4EBVS=u?Ù#/'Cn*FC_ߢ5HptA̠y+ܯMRӭEY~nzi#Y2ܩVvG@ɶb^,a#ܜ*!Ѡƹ\&{\F+0 tب5S8[~e7"{ǤӨ`l<DK)WGP꽺0Bɼ'//]q_q&=q(a>$9~T iL8JinMg@\] qZegE,,7%uКhoXS#6 ~zL^W!+~/Sef d^] 6~΃vA[0kII]r4wMX }p8:l dĪ&sT4mЌWCBq2:mj]_V R E4xm+me)L5@<©MCyWϸ+j]ߑR]ĞI-m=lQm?\GD]J{=qPB"0uch=uѠ|VbQzҕ8G:r^!b8}vez ;ZQaz6]9u#?.Fὲbfϭ>}U;HQsGl|#.o8IN5j~ ^]3i*W&ͺC 9W-MxlKv7f$1zV4DMWr1j [#v%Ѷ6;ŏG15[ؓG殪d9$ h}duTӏC"a\lO!p?~z6d(#QaJ(R#F*\wF})FDJgѪڛ#On]z37uހ'Jv^846B}̌A8MNRj=KwZN1TSHmT`vY{|1K՟*,h Ynu~zm741_>W\is|,&9̛ӅC9/sooy'C3$s+|g\򬌏h4@ Iuboy^~GInM %Q3KKkKVK`z=VDH^(&-5NU< ZK.pLѫbȵf#H YwjesZ8U溙v?Ft \Ǫ3Ld:٨왑!yĊdH=$LM&ZJ% Vs.@ .,5a?Nץψkzso<un&l%..!s2/#ߧ dž %|oK߉jGI 2㣉w\ދaXqէ嬋l*A*W:P)KS sѫjZ'0WͶ.k>ՉCÙ;Uo٬Tt9L<|&Rl:]$t$cХޜ@Fbh>zٲb[0(;.QAGߕ'8٠&-Kvz)&T bxހYS@G*ᎅp@W= m6d9x ]Y E#wO2};y>?$yPZZX!V @; ?H,Go# )a&>phM5=f|)EYgs 2b u[ v Wy`~_My٥hwpq2]iV/QSUP7trTDW\~V_Q7{І+@3F's/ɛh1`g֟ Ћv s?yne G8~n9ٹ`&W$O%໴b77Wxl`|qԒλ)|WOD$+6䲑[ș&EԴ/_*DcN1¾zad65SMTėk/sU~`AlZ3w']SDaOm'|ȱѰfrQ14&:JLj,Lg׈;օsW=oy6:)KT؍F8ŗ163&M02iG(߮{}ýRӡAI`t&Ό|Αe2B4Gjtu@lFG>τ^4nR{LVY;ս}ge~PEx%뵭7`G|y6A:D!oh~/6Ր^bCgY\/ܣ;Pq0mP^3HltgCQ!jQ6֞mB(E* 37 ځ9ujV y9!_8ӭ[mXϣb2=_7m/KM&S^"CKbd T,BЯ,bטB4H-i"SC{J\~z5"_9 {q2~XkUBp.ᙌ'˹sGݑU{` 9G,`ΰE&hVmk`;eCS n$|vn١Egl ȲBdv7#2,}omѮbڑL*v}tb1LL|\NL *tcs~jS@l*WwWeu.#䂲H I|9onpݯ09 _ZXc^U=,=?bl ]2@$[)?t~B⯷Ezw9Oq #}Ķݤʜ.@=QON)$'´gK6̱{q:D(,׵Q~ KJDT˅,ЛίAwݐ,E'u`B+Cr"_#Of֗oMB۲( .ya3&AV0oToZPF p12PaPe._8u((0O?br(j ~؏gMbk?ټ-և"GpDE8(gEFN 5Bddӷ):f:)+#LX\={-#%gf)D%o=3^4iN +\~mN[ T渊DhҤrR`ۋ7oJ ܝ(Gx2jM@{`b]Lom猷rnsV˯GQ2uۤ8N ̩6sܣD2dc[QD \4;(pye+\꠫ [&0s*\՛•gfKl|gF"P|xdP_%WFnӼ/Dz;+a`+x#eX1^HƝۘTni&XiVK A-Gֹ.FvH5PַVtw`1TgzMpaޗN Ĩ/YhN;UkZU5)3JW%F2$T^H}gL'ʦ7 "Gh+xFԖ^/\5C5 ,6=_3( ?r5։KGe4SPk7z h(xd׸ZLhe[7jh^0ŁoIO@g\]N\3b01FߤΦ+:B,(%gg%1-59W qiTU8~mŒRhC G@q uOxqA,Ril,$\tq 'X ى+!7Ƿ%bX]c$]39̈:oy{p'bDZ6]6pm(~h|Jt2(+dASE›~o"jDay;pXXV̊T?,8"3^,iG',Kxx8uU9\ޠ3Z= rF.4uӾDK坘22oB_0#_@gXbkȆnL y4OȐbcG#!e4X}  t Å'EsA QV?)fTDϰ,9 "/aq KcS`/ 45H6%Q#b* 4'o,ٳ|oDGޏc/,ˑЁ;Юai >^/3^UD`ɥeWLB,j*$< endstream endobj 318 0 obj << /Type /FontDescriptor /FontName /YFAHSK+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/D/P/a/c/e/f/g/i/k/l/m/n/o/r/t/u) /FontFile 317 0 R >> endobj 319 0 obj << /Length1 1906 /Length2 12829 /Length3 0 /Length 14001 /Filter /FlateDecode >> stream xڍTҀ H4]%Xpw9gfkݻz]wn2"e:!##=#7@DVBȌ@Fr%E S;l:D dmN&;77##뿆6QCg @ mc t@ u;G#Ҙ Ardlh 5t4ZG46(nをіŅʁތr4(@ F@P19%V1ut1 c'k==6@Y @h h=G ?XZ K @^ #-CCKΆ KCw?7 ) Ou [Gz2}ŬMDl֎' ßjamb׳)LlTAvN@)Xl\jls7[J?{yLKzL@ߊ%&& `4Y#] 4O f|o<&t{?ASFSDNςV ۸<tl&&.zT(emjo #ټ1@O011n??GO-?.vr|YXhrZ)G6{A WYl@\3:&F{5cTGCYۘ1slC{{C7'6p]k{y^S{?Γ /b0C q&f??Eod0(C,=zCэ?_` ߓ34'a/|_?= [_ly po .6R/|O_|\i rό?&/y@ccum5B\v&fvS<۝Q`37o{VQ.x4&(x|֏Ss g`H3狝d x4Y'B>Kk}jvo3tQ:~%sdyFY0tp箨s79oq4^Q,EZk*]xxZ7c=J6RqǷ,)w.&)p ""7Z%JaXW7\.9ZhAouPDFXOq6v&QXJy$`#ywx,/{䕓򷔩zr'76Sk0r# ?ӽ@?ܻp98h:.4%"I2򏆠 m$cWXkr[Il+bָId|ɾ~ILhq̬}[(𖛛0in8i:/J|٠7 h8jy26/xVHv+*#Z3icU!Nf 0r>bgn{oWsen XR޾Wg?k@ry7bDt2I Ṉ%LlfM觕2]MT|[Y+Igap{iur4>-3o B[i ӰLo5,gO} \D  6D 'C` ᒧCۤL>Է*-ӤE^KX췳c|.R.Ky7]KGh{\tHL,_C4vSJG_8b1ꔡ$rcqԋb< oS"xՆzLwnl%k-nh~5lU] t RQ33WHE%~]7% B4>]XHӄ`]o}l\Hݟw.y%/Y#R %Ŋ ǕA M$toip+;VL59ԚzE~qpGQ5d-g8:7*ߦo= wF>"Q4#ӆaU)(m$a5A>@H\hag(KO-XxVo*t'g 1Rlmy,e7^BM0w7WH.C2ܭ;ZXpIy8ٓ/PΟ$i#g#?Ӳ7$Bӈ4_ٛՅaߕε{| a'ǁ.75A;X뙜R2:יY%^^*ɇwkO\YEg(F!fRxAY.'J!kDu56q-FHr fC$dqIĖgd8DW4^%( SJ:L Un &mvRヨыKUϤ/s"YVU:"NJWRe&^+DJa|OoV=dlxkg&BΘx_7:ԡO7Pi5+^mQ*Q}OK>n,JnaM[cKJ` E6hs7L Sę@pJ< _mRu.笠TyC⧷3̜2{Grε-A^3FBޖ[EQ00ݥH$m+X*>ҝ"*;K^SD!Tb4[+&vX?;RZ\hj0 OG{ Coe}qIJY*eI+ ߐp3.;Ki0)sDZdAMg:7Yڵ07QaI3|QCQ(N_fhEU^#\Hg]]hȰc¨=>L7$ᵩ5RZw@F/8ʆ:l ,JTUh9NVjqMQf`Y ]dFd5^_RqG4Ϥ 㵢 KyΏT \69AFwg8,|`)WHE/ OJQ]X)[徱7WkTVoV] ;T*. CȂ.m)TGl(JN䔧pngW9g]{By'2瞢g*s9NXuдbMpUɳ@6qoQgƩU8 JRyE@r7hN!l@cB+*X,CT]`s?U4fCSjHkkl]J,YEHO:O}:c_͍!PxY;墰ЬrBWq0(,#.B<:a'Ð#F}5*ʱ{sYq4S*a NtUD}PǥʼVS"RRLp;/mcmO %|4L>w)'4`XLhi}p_J.T-nДxIo1‘6+˽=ْ@h$V=2 qsR% }4=ޒU^^MzVAP!0 >Hnp%^sCł~*v [$Y M6r֡gssCF^%g>Vhˀ@:TA}yp2g*F6W(/Dh}lOw;B{WL"  l-l+l"7Ms{_Pl$Vb@҉wNk>Ӕ}8~.yƹLD;B-Ԧ>=bI8YGbe*uucX]!9 W ;qwTW+;ۀk7"3Yn欈S6t=y1ӪY}W;8ʵtq,ڕI!ad ra``}Vش&pJ,6%nSiPFr0]s KV^=] N՛$BĪT*:ZG6^6+9} ~,I]34iz pqiG!OX6BH1%)kE`0^#⠐"=iZμ3 EBefk(P7^@&دwq’ayذ'2+_7±Uꪓu^f4@ˆ2w}9E֖Lʥ~Cbn*ñGS-֘Tˌ"SG^l^u';.7v9K?>oƁgQLORCZٶNɑxej.,E2P}?Cc/ʡF׳$;Ȯ_0uچ>d<)'%EU\6uh1py(-#YUVWw1NCJxN{x˒PaQx\'lŒmLoI)@= WGo؄ىnEb]O!l>j)k7,**o,+/gYQѼG4%oX0G1yv@.kf'HE)^+Og dl*,H0J:y$0XHfq!YP? \_b\Lfv wv#m#үPɂMw\L=S;ʀ! 6"=gϴ 0HbOb> *޴:1oԄMmҡk#xE.[޴@hw Oڼ*:O@r a-&ujMOGDݜ,"Y7 Cn`v䝂s<_sN~r:_h⃦Fnj0B/ecH"ב8 V0io$ 4!X @1O0ygUepd{퉍fO^%[-ɞvU867\4VWCjdF}|kP:zo2%[;[a^.=o7N*IPfWR&_|ཌ ?u bYx'YeU m 6ڵ+6}1YuV !m~W ƔBeǏRÚTYɥĒr-3jHxږ]nFǒ,8[@<`?TF,bE0#W;fhtrf9Eru'HGy0,X$KGvI"!UhP6dKNxLvq)?tym7Qg^f#@Bpp J*1r86|X*1ht$O\Tb5+fRjp׺ab~Hj|3Ij!_Y7(r>32>{%n\ 9b cπ|=2/ϕ{vl\C펱ϗU<ڀ"٘5Fq>;=4oqd[CBV7i&},\9WeEsY/YZ9nzi@_i72 euliq(3=kaOA% q|2,hgäx?ZHopOC0 (,,^Ib*} ŝ+WΟؿpĤ\ekS$|uM,ٻ^QBfշ?s/!\p!-=Ȯ~&Y䂓SIazIZ _y=Ũnw5y,V#ORzj aIM&52LPij5 +VRC9̉xIeτmLb `7ՁP4(1TqwIoޡpf"am7[Ď#YbH{j&_{C}7_b- ONE.H'j:9[D|cqkv%>l!׌~c-Tag7Rbɽ^w|Ml٣mȺHEJmtٷP.M}>|IMilk"}N{r0,׊d~/(4O_2f"ൗ?;'By~ُ%a-]sF] udh0{aXO/FmH\STTV6mj}~#h82!Hvj;3cIH>~J%K!875jҿפRUК )>ڗ}o0q).t#-qg !C&06iX9hkJHl+?-. ,$4w.9QP{Ikpϡ4ȂUY5 XeMQ^==G%?þɋIf>o[[H?RZDl(+Awܱ 71z:"ϒb i1ٕ؟!M/zVi  OJU]Vtiypp6'AFaI0xg!{v(ĭ8\ 38bUHŬSJ؎K1Y2HX@{u+1azDԳ@kxelӲ"1; {q'mbm ksg ܘ@i鯏ZAy s*mAuEC I9ϣ . g[Z"ΫVIEG6 KBk'bu`=SyAx]<GمX쉳S=@o_EୗςU}mcH5z+c>\z-~SI$./hr#{l_mDv]ct38نս>|v}I<#oVڅa͉@g\fGؖoZr9-gBMBĞ7#E<59i*)-qW>>Ip̒ڀAˎ6y% #C63UL_B&D#%Sb$Q|b)Wҷ{uB6C8x~=BqN%aW,O-&5:[w-C~|$eǝ^[9U~8 i=,):,Ñ%5L%DVf;-Wi|qj% Drp 2w4,O6-%Iq>gfJRo5[#X]{ ϓCO8]燆w}LIq _?=ܟwD>B"]{1PfqU4W`Z9mG TU*[F&cZ ?: 0ngO;–^$ 鄛W>X!Owjwvy(g(szBzJ;CH8vIF+6I5.&*{Zh۪=˚^tBCTk iCs~b>Z l~K7&,Y#1p&Q e27sT[#D!zHHW]LA˔86uCѧ䏬K|_СKOb_,fg&3?A3_Gp/HgI%75US԰N_v3FHePE~|&#XW^HP j,^?9&Z9jwtlp+≎Qp.CE2Kdi4_XK7G4)ʢi'Ŧ%~d_'aXJ8x /dʗLa:]7KoQ*~'iG>BxM$q#?lVJm̵1%cU>HJ 9L .OrHmusgT<[K,(FS]N,eԁ'=x$12x05-u]&;=P*'ttIJmƏmI!z՝QD2F( _#E¹ WKgτ1mn j;78-"dT( (y^& a0Bog|;whAҏICZҳy7AQj)G3fwɝRS~R}1(=:JQc%^`bUrXFU1 aZ*0j6eF~Jqr #. k%x,^6ar)!&IZ[dvz&t" T#k4X6/Ѩ$*3+MyZ۳5Ӈ@X />%a(口~ pɚ>ecbaً lm Z"#}">Н=AeRzXP:k9 W|vn#劉C"^ 4~$4,6=%  +oR9b+#ۉ}N`ÁETh-z]D]hmS0m^caE5UP-_GN[uih?r!c -x/?Hp^=f:[\,W WH/c7/v,Ul+*D Y֔PV];ꥰ\Vds=3{?`3 \uO[@jv/8+-1 1D}iDLž%)a.#`fI۹(Z>͛u|$ӷV\oGh(p΁:EN߂<7x#ctN@Uq=5d">&zBּB>(SogON>҆܆IrXw!{D}h)Y,o[3)NT$C+&%np>;ٴ'v*S^Ү5Ht,;íBV#j]v&]J#0 5714ɑ֝Un lDrv~]ޥ ^ͱ$@e9JTay?a/ }U\xS>`e$%8|,mݕ'0)pkvgh蔥賞)yEeY敭J4*a='o0&c\6k :hhzTYHyI8t=*r?SV6VVK|sU)أ0Vr nR܂  !8x2Hˢ*%tYn -Dg%W-8l<+! X]`KGDR$DŽs.{Ç褽2BcPcCe[c% T٬$흏&vTOz5Re.^?b\>\˂?YI\y))W# d67vx3]=.͎]`pm+HMw#yGC݆~t@g܏*_HՏ&z7*+{twd;4@Nڸ))gDȵ o)_qjxRofuXʜ51 ^l׺12쒹wlg &&HxOt&=_遹 [S["5L&l&KxGNjϦ.?BӃuz qħ(,) o%@bb.L5P`8<&guv$JE,HvKv)anDM4tTJGqђm1|>2ysK6I`ro7FYX%Be8,=#RַL凾u@ԯ&u|8`>؜+7cΕ߹NPE/6{rLT>3Qi+n"g%݅Q7)noE ]wj6v]i]m.S:j[| q1Ú'aؿNnʉ_2vC}Ċ^kBs=)Ľ/nYIJ\Q_/pKƲX]3wf\:2]7rP^S'}l ZF8@9 ;{,tɢ+ty Ӽ%`:6qݚ~{m1adr(iFT˔|X眼Gp$<;E`Wavk@F-R]L'!p|i%ÊyJpF,K f@XU ǝ]J"&P墌Dְ j]]J_gf:_+HON#160no(S'9pDc6hQq}X ԍ{`W'QV4m[Cècq`JSpM4-!]i~TgP>ƉD1 J/л= &-hg*Uݬ "^jzBc\ay<2?J)F^S4HW?68QF 맶%E0KAs4_w3J09E__W̋ l$ 6,7GFCv.u=)\.$J8@raM)>uIdžW+:WOluGTfXa U:̱–QokK ,L8Nܝ Y<.!Oo!{ v侪q~ynA޵!AoVi endstream endobj 320 0 obj << /Type /FontDescriptor /FontName /YKYCNH+CMR6 /Flags 4 /FontBBox [-20 -250 1193 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 83 /XHeight 431 /CharSet (/A/B/C/D/E/H/L/M/P/S/X/a/b/c/d/e/f/g/h/i/k/l/m/n/o/one/p/r/s/t/two/u/v/w/x/y/z) /FontFile 319 0 R >> endobj 321 0 obj << /Length1 1379 /Length2 5946 /Length3 0 /Length 6883 /Filter /FlateDecode >> stream xڍVPݳI HG~R*(WMZ$j&*HSAtE҉H"ERyѯ{=gﹻ{'M-$0 ' ( "#H-8V5ĠEpD Gt3Ơ*@啠 J (*Z@`,`&7DTQQAw8B`p0<(bF8\ȿ(DxpJ`pPP /zJAH'`G`n/ -L $ Xz"0[`qA0, |pڟvC`bnB@lP)tF"Bp A=wc$ I0/G? !}`D:fOup,/xh7M @AΧ"[.7vGIp [~}?=&?6@  _! xp/p'J@#pD8ށP $;ьpcO< \ @~}^9{ wqF ih` )-Pii@7j Cy6?hw %#Ϟs\Dg097m  C!}Bĉ]#N18tA17d?Q}8h/鯃 F"qp?}h)$`Y{b~C(;6q5sr '<8n} 1 1XЯz*`c1<%=D0/zy^:ObQI)*MyV vW=ザȎ$1~UlCYaؑsb#h|U* Rر_ oz\K {AUw1cfK iKޱJtQ<"xS'G-Ʋ8;̒3po, _#S?驥+='˻ xtx$c4 WBɗ^v_B[׋ЍLt,Q~—Lni}i?WRR艂ޫg# s++\Lޞ WJ87a0~Ap!od G #XUG4n)Nշx($AxhWy{y] ZiFF}A"eY5ồ89nQM\hvJm~V~>";K i.wզvYӦUS^Q}N]!x`7GVtmC^D5W1"n4Ȋ%ֽ}iJgX>NsҚYݦ]n%ZmEa~m.ڴ2q=Yh 3-7qfԻ\!t+%E s3C&WNr<-8+/7{T_JҘ%e`:ػ=6zd*~@3rdL;J%$X`4p̿͘NڞGف>Igjܠ _?>~hUs׊6iU\O*H""Tnk~=:j˽ ]it|jLٌQ|}/ iĝԍWa{Otymkz~ؼyB}0<^ֲ*7Dy>(oK >xgx`dAjUyZ]*?_[z;;Uy%wؓd0*DٍC&RՑʹ7j y;@b5}QQṔѤW*Έ[i 'OV6_P(q_P?#4V!.S5*Gg#kK !/iepJ򊵓9O /12->wv6ky51,Nx}P1[Fh:K) q|L{aWocrs b,/'1yj4?1~r .S|&[ ۦ:݋xLhi|4)~^n" ܛ؅i{*e/PTa% DAE;hcG4Sٹ2A_=U@:QMydl4HJ/>$riWH퉆tܳS% `';&[˰'W֤C&_-Uhz ri?Nv:+›OLx 6eq썋,b_k.U?/[sYٕ%BڻqkRc(Y%6 z>SyKҜ6IWtBjzn= fQeD/>9gαT#y,hWijԵoz^SےMj6vȹ]WLbQQ4Vp'Ø~E:3jJ()_p wp`?`3N`#,Un}YL^ےxҦ\@5%~q]H:&La뫱P\85݁Ԕreu'MC\_C@car͇fkֶٛiRE:oñ5!v8'GvG55Qkڻ5Cyۈҷ.W3| Wʗ<;7iANIjJ 3Ϝt$ڴ+I^h|֋$"OKPk>/zHrY`ս" m}_ja#}G{YjL󒛵ZEsM1b_K3C؏ seTRdHT8٪ޖq"c OQDQ\|ݯ2 G u/TD5S@yRiV]"wPTo;N.rK̠Okʭ+Am=5?4@em;OḟrNZh#7mRw6 {&6Uo*ܼk"}F'Fut?Kj̺}olZ9ΧAL^Ä$𲄝Z>i3Ql*lmÒ]?J8;eTGyn!X} aYܖQh?_?TmKAy r#|6$F' ɜ7f #ɸ]}i hfK/OZX3LR݉3SpI,׎Df_@ʃ$⋌}/_C|P7EK]qV)d[.{w[FDš8B[gFԡH-,\Yfj6󭀭GNkcn=+-Zh7U]ܴzyGWdxE"+;g=Iۻ%+fv%",5˱)stdgP="em`1WZS:(7-8jLNs8TW`)IIKĤ*YsƕyrUë Pؑgb zKBT^TE|FU?]#ˢ8E4& *nu:(To[%\X'wQ:S*2pf ԣ}LM@:MἵƲ޹\[(8b1\a^h` `,Պؕ|&%!\x+_Bn9*d,Wn-0(3# <~'1oqg&}EeTO"NegHţivK,՟MSZvw92Vl3yTL铋p$F]RdTZq|{pFG¨$뛱KD., ݔcLCJM|_ױS|>SZ:S`y|S31X`%?%0/ÒǜW,5#]7_C.X3JX9d>2ܓR.űAjU6zzK2& Ltd\V1A+3CVzIF/6gfLwي-@T6+ѻ ux̧PZvv6vzDZ  =jGGbI.YگԎA޼NQE/5= ӊ$7;)Տ)G.iڃN Pi;)1s}j`[=I2,lbih짌)5_:矀-c062s5ʄ]DBd:_\ur^Qb6ĉk[.Yֽ5ȑ>N=oߦsZW<'1+U۞S78P=MnP]|+ZO"γ]("?w.]`Po"m+j۰`ԩrՐV L2X§C紐>͟ Zb>[}GM.Xql `B?-Dz ]u+XN}^(xL,]w |vwSUS}˵,ME(|a䰢r]8?_>w7Z,CЗ>1rkzclH$(?(jj=Fyvoney _iN^q}_:;#4tXG6%ie#F^)ESOF*GSV z²Sz丠uN`0(HOװc`x /^:# QsO٫hܳjȋP^Qѝ$0ʒgu&ۤk`%L͡I U ByMUv\{Ew<]a:K{7X{蜢p$4F(җ΃Y-/K2Skx{- ~D|+K'F<]p}oG86tTrD K^Ky{oz4p#Ϋ{LN֤Y@, i-T4绖&_c< ";1VLb8}ܩ:휌린P[͚%UۦomEv[JiC&1S}}$* jWCYaDqbiU|Vo](U e|Rs0pb};2rZ[7IrA#~n{Y2^S^zﰷ1}D^8Ėw>$z H1VLӳ.4M[B$L:?|HCH7mO='THW.9?K&<]xư} );V_p LKoLLIݭcX?ݧvj1 3; SkQz6,fKV3osݵk)B|@ɁH:P,]Nj.2IA>keotՎSs7ɝ`ȓsq TGp}) W/69P*+O^?(yꅠW *NDqltFNc`FLH~Z/`h~}^#_yxi¿xQArb/`ɧt_l*άknj¢褹"W5bL '1&a:4Еۮ) F.Dƚ1.~$9Z`ݶwL &8A\3Y>eaޖ'UWLqsA]XHo yniV3`W?&J _Tf +  c/#=PTc* {ˀlFh7 endstream endobj 322 0 obj << /Type /FontDescriptor /FontName /EJASTL+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/one) /FontFile 321 0 R >> endobj 323 0 obj << /Length1 1379 /Length2 5943 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍTTݛAJ鐔sf`f.i锖nIQw97y>ea瑵[0_ ' `a1?,F`I7< Bm :LA@APD(*+(!M^F]{_K (..; F@l@0&vFwApP( >>^3 z`$ 9%`8@v( @0 Npقto@ #XnW.gBd v(Dq@0_ ( P5:A%Y]OtHEB*dE< C! ~O۠o݋X`pk;[7>C gD`WƁWq/oo3~>.pbF A` @-C`TGvѓG@<fh~,ܲà^.6oA0?/E/]oamA<?Uavpw ?9\8G `6M)U?hQrB{ zG V& >!bM-?(Z0{ߗA*A<:kP GB~=3 ?ZqB?%H~h)"nKs""@{5GShx~;8<|ꗑ_m~oe`isǪͧtfԗZ$_R˘F5KeTdLHH;ʆ^kʛHirIҲѦ[.;TxtNҨK'3CB<)z_Rۑ\*KQ_1>pޓX%9lE+IR`O<ƴ3=ɺv~0B "'#sW8~o*׌ n2hb(kt/h:qœv$^[@Pl.PU~fb'6X0S`f6a.@tSՓjĹ9嬏=F~I#wʃ[JPTgݶ{; sJg%Wک|{4a.K W-B&ÚqhD~ywy ;HrDr?m[0:vCB /4#2t 7F@Ut.Fu~?}j R CԴMJM cG>9^ '~\o4ƸE_<2[@c1,}Kpf9Mxk^j,]K=zwO@2 *Gօq2.z-M-{v}U@$Nd&`ޮRrQxNKvVm3oqf{̎w4 "~G<5lqnm9zƦߩ桛D=^ lH$Da#IaWvWkx-MX߽/҉# t6&4T9zӨNoɧ&.Kcӵabt?Th~1@=J"gt5ƴ1l%8+J:ҌM 2hlwod566B|Df~:]T/'[!YgnH7ݪsgr|˹l,~{MMwgH[AsRQd򱼢Z9ssSaQb Qs[/|vFqK חz1Fe׾'ä2]cȻ"i1'pKl3gUs7X1Y3ra:vL\=ֶl{cbOՅ>Ox].;gb ю Uc}&]7@hy05o8-D`q3#vMF+䍰B9%+G+&nQZ&fuXl(TS +wc#2ŞU=B yG} J֏%Aξm~t8H 4짾V2y)=~L-) PsŬޥpyӝ?-70#'~c'ֽ I&57*n{#k9JQ,a. 5S(t[l]cVHNkS}傁54,N6sl@~_M,URԏXINWM1;r"Inه;gۻtvӬL' S ,S4QGۙCbj> -l睛NٱBeRufNvrzURY T} H^HK|s5cn 錣 7n!dU&9l9XLb'J KX1X[FnM tlj'#@T1m\u(Zyᙒꍁr }Dt֔oR, /Lиr/M3S;yotlB'Ku} Y'mX'grr 9}j7Ks`$^[$Wiw45=A_N45+zJVlmVaq}ʋh \E³Jx@QMz`{ހ|F\䣶Z nU~I7`v7wwYa8-HQ%$u!NJr[zSI7+.וʃEG˜n}Q,ܮ2qY$J+:E;,26'Fhb@+E i:ꎝ}uRGt.sڼh] B6[~ DDץοVRyRZ \j\߳|rm(k$SL`OQmЎOSOcb/Q$Ld*+oc A o*b9o|x4C<,1P:w*qQPz&'ݿ 49y>22+N?(S+ }Ol-lis6Ww<R?z3k-l^|cv/c 6Y:QE|5wva*2Ux([-%0nl_[˾<ܸr14T~g~dq{>Z}oq"|0ȣEz{w]+PC."n}[CsW[s أW,کyG ~'- ~F`(.78wτh:Դ)}Ę}m'ׇF#-VdT 2ʨBi3+wnE0WT(oU?Lx5Q~:.zӒX|Ǚn ETLv3)A|靕OaTl`=uE18o=l*G=!ԑw)ϴVS>7;‹*lXoFh6;\ 9p"ִ/V_dffG|]}.&uNj{쭹Vyz@P?-G2E Kk }QNfV&2և?| ⤟B[H^upGKjQ7➶wfg)i6y»ƴbXebGj^ JMXd=llmcf<.`b(J{NT2|d*S?hI,+useĵ(m a|j2gwL^S%Sԯ`Հ3A8ulDr_`*B5v+Yq>=z, 4խkd:=at8J vfN}?i\'DݣڲC]3+Q}H j璒 Ф"=;=y,|r-°T ;# z An}aF[[~Z7Aiy# I_`\qJA1֨WLږ["K=] i<=2&?!0#g_ʃl4erGH^Eݏs6S$'+m ^/GW$=zonmoi1mW Zj?|opE3`o>zV#}Mςz?Qcsr8:ڶʓf|JmhYxzuv_''(-;;)I:;;Qǖ1agR;iofgw@/FXɤxPw5׮2yq_:vi+r08,ngaoUlJ ?^3]h\ }ĒP?w7r[=.pW:pzɓPNV^̃}d}l(c KKOf'uZeVP[|ճJ⎠5'4'*;o~!M9bQ2Oʹ U)&߃,-ɉ 'fTF7%GTz+t9X&t"yA\~AGC/2eYt2O-)GE6fPo4x2KS:>-fKf?ziT/ +WmEv)oқZ['P_X T/Jq*P6 +?ǻ]|1,t_)k}PȺfN^.Ji$z.Uoz-VRxM澄K8ekS!e42C5Z(S);qsGom&\%=AqJݨ.:o=3 olh֚;wK)bn.X ^ոso7~s8R}C>8-)u\xì۾U ,7S~j8BeeKX%4>#Ҁ] /{W]giKvͥ wO-| *uPp={Z}*d_zX(7C(xkGfN:U.cPavUiL7'IJ}Q#(9 *uFUSZ(QsEh@TZ啵'_ѭ΀m+.LٟevbY'`mO/(FmBr+D{4$U />Z&bVF(X8-U)ȊQaK ű*Lh\24Hr݆`sfȚYNgYgӶQ; wyXRw*.EGRQ"BWw֩t n7f~ǮNsߩ('( hX)+nSzxz1xW[%Uy >/S3@D .w=oZn-yk>mAAYI/nt:O%rr`k8XTe-%Qe{Cup ވNavnIĶ!Zݫq)z59΂3_,DlHdƩK@g96l+%vWpDV&Ŗ^Pe>!`XRݵ(ӶrS)gݔ,ؼLnvgBZ-ug> endobj 325 0 obj << /Length1 1402 /Length2 6034 /Length3 0 /Length 6983 /Filter /FlateDecode >> stream xڍwPֵQzS$H ФwiJ $@ $ M(wH.H M:4?}9{Ȳ H(, $P5  rr0pqRNS( C"d1*"-8@X ,!#,)#$DT`@ I9Un^(7G=@XZZw9 E.uMH{rN-D9*@ PD\ ,," =ϿNo`؟GGM  Mep 8=CC!q!{ܗKH 0N7t8 jкP0# #N@i10: 0NIP$ W<{ܫ)(XGB~9PD\F^8VaU!PoH p@Hݫ@_q@p׿b3H{`A7=C"b=ϏVԘȝOƿ,Row1r.C?St30ZCvk(HƨHi}u"c7˜v E1JI72˕+Ac-wJC,'"=WaK777)ܴ26R;$mc+jg1܁GMvƊ+;5#ѡ':d5\ֈɷڴm+ݱ.z5\l'[4F(}q;X#mRdT!eX7:Wj04:-{K~.8)ȌOPx:B]íD/2 \yGjƊL؟V"P.1J}zϑSTW]U+9 GJâFVB0,uW㷁6#;\{x5wq=P325;Q?vy ?;nCA9A7;2rHH>O32` hn)6QHCdČ],? htGmGt1RKUZeioB[}V7{0=?o lDas k&Z˜G>ekݼD,2c.o_@}*#3Alf7N-|L&KK^0r\k)Xr?{IZeζKRRMȵƏ7Ϣ_yrs 11p&jB敀UKnj괞dJ3i6/MEZz 3ys1kf / ,=%R0k lHhaҧ hb`paV.b/CDUޅs^JSҕ|D $P]A { V&,Ve)/5a9 HMU1J}nQh76hZ~OL [}3,xDP-D,:\j1Ál y%,;vؚ ѩOdd[N~V+ۧ|gj\[]5w ^wy.E;T9Ɨ=v]+X\Cg&2e-.<ޫow~௔?=LczJ`uyjz:@ҵ" 8<_D?Y0^rcÐtËO_>GD*od#,tzv(Q}%O2w> ~Xc~m7pM] H*[gu$Ci~PtshVѨ0 !glqͱD{;|[,yooUۗӴ$%^1hWRNwf_VW˪lL:^3ZN?n*gultFrF{/FSL'֍ИNwi\˵itvQQ<3-@xoag#L%dlZf/05$ oL5^=|폠[Q1ϙ rmpdlۦyKǕx%JȀ瞥J@RJ.' S;*cn9©Q*kۭVrR<"-=|8s|WoWa Ї?307՛l%#)ޔ+%+rk,2mB_g<Ϣ>ߦ{C $RВ6pVdԶ$G[i~ߡKJ{sZQCHgv O6S1h^8Eٶ4únBZt8+r4}D1XW:!oSJ)TküE*W~t|̇7w~ KW8M4p6xT*٣J8~sS4۔jQEU[Q=A rw+L_,t"{_zg<qYk9P(T/w.@R;!R\s9)'9!k© 튧imσ Dnz۬ yjz^m0S ST"#j@p#dܰi-J% *W<%&~O,Ԧ8>u$Uخe/q;L>6-cOW':N/#q4b}LVr[4$s*6Foar6:=B"u h۹a2 OmIΚb\ 4_ zʼ}!u:ԭo2$v-FK<Nc`LoF ^_:YSgf,|[XD2x9mq'ބ3Q<A8+Ѧ?ȗ(5V&Š1u+4 5o? uvzr]㪫l`8&xJƉ9SBsw+8 IGbӣ/)UW6b}PwU*HƐ=LX }_nRĶU')pͦ;PB{+a m4h#Er%nS0wf1֣n-P$i mo>@dyܴ+O`"'m{ .*yho׋\5W$iD%XkJyOI-*kJӾ JȐ\ZrL \+qo,2.[X9qxwArA\) _z[yoMh oxѠ-e)OLdM$~N807=Fqr iZV ]{6rD}'44H~QөbiXd'S-g~H戭K~IJU,vh72M!inL8dJYZ)h]Z,FwXtZ:*wQ;%Sj "!"?S/>Z[U` 5O4l=31Dw4ee>cq??$Gdw*GD;U(\q"m= H`ٽ9瘝iq>!l۞ŶU g\3N& txkb>ookr0lʏEDV@joBAD**fNK֔pJ/n?VhCr&F~rD6Z1 /2(A4YO*pY_V5/zyMy}&0Йqi}524=abhg?F˚IlŇY?N`B_gk{hHcM zr1}Zvo&1a;؉ ߘ9f!Bi%îAѓCe_$zrυ^Y|/otɠKu1RϝOQ!^LmLrcz8wDI0Q?X_]2'\)ժϴl PUeݒ|YaFMz΃=%,]){!Rڼ/ȅm8%*DYܺY3+3 v7hxmFfGVWNZy1zʴ2Z=kY\ 7m{h|K~ʅI2ۥjj"(icfdQõ~C&n%$ӪKp;5cxkXѵUq6Wy{làafחC y\?3y[wV9jVi_5.OTUOd?pih}VL7Hh`>a [;HR\0#l{w2BvdQ ?3'|dzakܢ@RYFwi…&>p61@^̣hiFzb狘i*4c_o J0h"}AXjaӈoqLPN.K1nYAjF+(͋I3*vUBw_=8)Q CN$gdB\ 8L'|ϪSg4lz緷7&_(Q?Evv OK[QfYQ̗YL.;;0v$>>@)0}w;N]صQ8tqwly|X%W_IM>h\mP+$]yF&\Ǧ|`:pYp"(@wɍڲK x2AMȣ SgV vV"Wb};  RYqo]5 sZ_BF-gӳPrUQ>$F26,1C{RT?u2$ZeNC?,M˝(^͞]ε j4¥vV|xM]q1a$oMe&5gOSndYFɧ#W81`X2qCX5l9nZU}=ۂHHh|P"X}Pfsry0n_767hl7!=W!t 9N"[$/}5i;9f 8]6CǯEt{4@ݯk..}]LWfdRi?eEvT8oa_,_Dsݵl<X.ِ]s`Jy-~0 J PIm_MᒩkZ4e%| 9Sh ]SQR\✰9v]zR쪭8/"2*5w9j/ g'keKAWk5{ik%CIN^W|ϟdEkJCWPa'lhD9[o1 P:Q9z> endobj 327 0 obj << /Length1 1775 /Length2 8744 /Length3 0 /Length 9855 /Filter /FlateDecode >> stream xڍ4Vڛ"j؛A#!b(F5[fUJmjOs${]2i­!pW( i @(ʪE:C@P8L7 Fd`$Py8b@ @(= >qc]}P{$*_6 1?]  # .6`g. A*vq#e9y^P@AxBlR<@JuS CzJ QG<`t4VӀWq|/GP66pW0 A!Meu>72;Q`3eeym_ Hw>wAY f @`Hw_S" 6\' 7AavҰpׇA< ٠Dx!H  nz>?Ĩ\;THjXC0?` D7sԄa>b~5y#_)TP{xE"@@LD_7j]70;8@P;Ͽ㯭78j! (A ?GF=siу]>YZ 8jA`kjs5 Pժ";SH2bE89E hݡ8^ tqB=UQCAC*l඿OPDF >x@Ԅ P[j c|08uJ/`Gꩨ(_O%q$W*ʋZ_@Y%TH*ߒ_ P!*oB-.j!*w C5]=`%dsPшmudi?٠Y{f\JMkIa7` K^"KԦ'24eO2 Z\-nq_3NRq-[1L,>c3xRi5z 4T9g4>TwVVDѐ1eLCƦ r*MDپ`yqA}.zc,$\KƚބY=!] ɀp${nA5n9,e|RZb&׊ȃJBK"oJg ysl~bd˭}+k8ؠ|Щ ;5 u Jѡ 1F}B+;CmXX"!4w/ݧR*Y-1w*I/aΦ1mEJXhkoޭK|q)Bl<6T>xXn:0}ƹQRd%D9#%M1dwȪ:] y G90':6xۅmH7 Fa'sZq@pל?6̪3Jhb.Zҕ@Z\R@{5n?q~qjv^ JZ-mjƸr|$^MGpYEmc-O/ϖx[~LM{Ptٚ2,k4Γ<$ЊКB4D9Ԯ;* urs-j݆y(m;uz7o:fXT)zIa7R] :L)f}?ry&#TBWubnWAoeQ"] {6'n IiG"8r "-ߊ z#`" ^|jG) m糴cPIҖbCy+|F-^ҙz͐LV8uZmkMYBӫ @SEty!qsCl#MI~fA8Y`wjT!XWP{YVk s5GEn ;Xεb|kME|9 p.HVTgt冷. pI=I!|]S:ҝ11䕃hFe,ρMxyHDaiQ-t@ҟ7s#0toiME9>Q*HWMz\>^k&<)Amh*@vZ)mrB Do3+l8Cq?eۼgy!<]jSw][AUM]tvCm3[Jp3Q4~CPMz]_d8A\8@s73MvGV;'Ef$ Tw'VzNYxC+GT~JϹ`2T=\D|]efT9 >d7މ@vj7߹`$Uz + uc^3?.] rߞ Hg6+@政$x%4iٰSPo*,S1U<49QTOQ *@{7h>mƳ| z?_l +J-Y8ʓT "~ض>bG^kYC['%Z*]dzF|r!vJCipHShxF7H._倫2{FWu (O$/zoi8T gUե F#j+SdLJ0cנx2$z:1etiCB^vB_,¯i2zUk,Lz*_ҠWZi]eȦNO^]nvut ~Up1DTj&+v n'G0ESQ.TBXxN'w=d%mam.f+ѝ;aX͟wBZ\9uWZf- K LgPV~M}W{HB/xKe+)?Ox i'(=+ʊW<ݯ!(|emoC]H27>])ڦqE'F7#Ko!Sum6uICs,$P1ew+@+~T" r'+".ě} A gyˣ˺[5YqM9q&5,aV0+߰,KIvԘeoE\YU^ ZYFԭ|-MmIP$͋u[Y_4$0e8MOlz#wPoLb'M d(5HMLQ kr M+-fq vÑ8hd WԒ +W-vEP5;hV c+_eV#T˷ *Z_ 0MtWT7/bJZnA??l-TȆTtFzM 2 fzA)-bAcjGRs@9&IVVu!!EG&Ζ~Ԇ<Á{rMWzdz$2BkR-I#8zi vdc\vieWײ!Oe:auR  s䀡lm|e1KOU߹Z}d>C3XN$<0k JZo|ϟANI:7rBӭ6&_mISN:NGjNVyAz>Ru!uEu閦-Nbmu@Dk/T=9Xa le:['Boh/l%ό_XVjy}*X~.` h[DUrG#%.TC)$KCŖ`揟N?˕й*yuD`cpe$sZ*n''3¹^ Mh^*`:bL32F“qs}1{{Lp!1 V#FwXB9޺J>Ìs=O_[ѯpFT";>xѝ>\͵(q4hᓟޝT&n9ITNu )en  T^!(Oy'3t/h kub1wqWy9.g'K%3/?*"JWI]"5рoCb9.xR[jtO2I=3|%`Bd l;تOhuYvV->෤h_svBSÇY,OPYU&R“ߋ~YuFT@Zg֘~J QAڝzH 4 G#d1\|+uZ_X,=g;TѣSM2:w2~` c0Ǧe8 Χ"qoE$>Y*ҤP4:~.l,>S7i@AEUqsKMrq>]wj\Tz"&(`Y>n;IzJWYku[J"Q:Z 9XߎP_'M;{vǾ^+T: $mOٵ}cfuUYjt]OMǞ,?I]h3mT-+RF%HL$IA#Z jdD[J~~yi8d&ƵvF;GBg i?/D陛Y#@+gB['.K^*o]9* "|폅c*Ci;V82!eLf tð>VOBoyA`5b*'C+sŒSKZ]Ǵ<q>6͙K/h 7x)H&x/wP\̥]6۠<`+? Q;IyNf 2"Sj}yl ՗EsA @?fePTlH8Sf"MO/YzW}lOcuQ# >*PݺC<|#H-Q/m„̽L04ԓi1J•bP{P`0pQw WPq/WLpryDzȽmSC-WK Я>4J-^Ļ,7_k %9Y/۪Q|wv6EǞ6^H:R 쩩 P%!R6'-=S[LRx @d3mA%#Ib'.,ny /} KoJI)#Ζ9$Z1=v2 {xuTVʷ[}+ć @)lg^8kFϪ3Ql IXfjs{)UvhQnM m5|= Q'fKI2=h5v:s ZM3SX(Huq]o>⭌j`>m"4mwr#XvqdʈŬ2ԽE=-rz<$9z-u*,UJ;S"8PژjjRO8iT5DE[:[ ehqaXs&a>+5jf Rz>%,2:M%cG(MPwA局)©i~l7vjwJE9ox HY*&*w#Z *Y|vPe; [ehYJc"0crVȴʮcr!LwihO[)w}*_P 9*n[dzG)o];`>Jy!uÊa#05jKtE bV!bo ȝ/e Mʂt#(ƹ|v8atiupV)栾^ZcNZAM6Mش}iÛfa@cQzRqF᭻,lGUJgEšUcD[D:wnҸ KX ,n8OQwTJREBQv{Cۗ: G;m)dϔt}nM^ACptFhs>"˄v+$p$10}>C GV,iO3E3@cbz>|KM}\Yrb\S'n8ݥޜ-/~=Ö%0NtsԪ)=$c7CDnXg<2\@bNQ51k^y-m d. ݚ}CPc谆]ϊ1]qsZ] k/yӏ<:^8 ?¦Ӄغ f q(2G-3 xoT4 =Sa761+氛)3 8]Wyer9i}#7Iɵ%k\F}zGܲy&<^Epg hvx~Yӕgج>XN6"'W Ceuбp9wThqT7UV 3STg ۻқU 86X -S ?0kc¤UT]ыx(q_KsQ+2vKWʷ+9SDoK6W"ppLO4Rʙr#Ip> lbHwL~Nel[iVLKzB'Itތvdzٻ:Y ~W5?- yT HBWVjD: %K .ַ''5`<{o~8YZR^SrIoRlRW<ߦNC?BdLR^M\Y&s5)YNJ^4MWQre.{:t7-YpP­H=[t;Y|}4Gˑ ƺ·7ЄWqͯ8Y2><-E cb}.@WykHK4aO o?3ӟֿJfQ:_.J.`W(f]> #Yi[5/|ݟq6Sy(W7N_uw/>]p>d}0p&pǾ<^Ur I;ї-g ɢ&o?nݩD3,O.0MzǛQ5msiJ9P>jzQ e9aj$DHn- ۺ[IȏFpRS-LPU홼iZ|aDvϹ[ l>1nGFRH )wP?znSr MbOiǽ'lWx6> endobj 329 0 obj << /Length1 1599 /Length2 7305 /Length3 0 /Length 8350 /Filter /FlateDecode >> stream xڍT6t #--9 93twHw  %- !(]*7zo1?W+Y8|[{wp<lA _H13r3>$|ygd- ++p)?,-  ]oǣ d.3 ;4aH>lS>A>y ~q+gK[8B|h @ !Zh ˿Q5rGdHs?{ vD@ƀ8B0{i/ z gG7Fn?*@A0_+( (vwE2y#w^( 4 k q '5 Fޑv_ 0c~$󲵁 #kX'RWl SA_ptEy#DF6 pa pu24^ܟ17cL, /Աrfdlk(G3+"i8' YP.@( lɞp;cQO gl'YDw_\ 4x}g& L ͲBfk\l?HkH{(W/1A+|p)cշӺr%y:TҖ\CyD])m 2* ^K9*ʾl+`$m;?q8uѸImg!I¶Zai&y&q 252:iH]4Kmṙ {. '}` .Xܭt}C[֋ ^K"[zcrtR0WΚFM&O>4d|qnXZ=d[Xd&C=p @ w ;;xL󩝼&9jǜI/ ߦ)4޿^BK_୹G,F(s"xj2* a7CXjS2CQ 6[et! ʷf(! "`pEb]i7r%2?0vy#cTq(]HcUc1"=%?|sC ]v27Fϓ{sbt|ҏ[ }lOȊ(qf OΩ<+9]z;pa_sͿ>WɅȫ똢Cγ.'S&]`~k¸8GQ/a ~rLwh8 SŰvY ܚ?BKk`g"j^:y<' c/v! XO30Z%uTXiq vH‚ %Όb?ݡ-/TzE-%qߺH o,EE}@bG1f^҅?RxZQU~-]kv* {I2f'QKs`,{Wr3Gc|Mu<_4:IΏ/ }jY&žNc/XuŰw|Lnzt90ߙFҟ>N|Bޱ֬D V>S5(0 Mi\KA~ =-OʁKi*UFߩJ@Dn8T8~qFmS"-q^rQ nF{,*#߁P;x{H5 (]WdOf&XCG"DT"Is?/ZK"AUlOٟsdʫot<%z޻6 +>e+m;8\zB[/_%T#EOI¶ &dz@u9ɡ5o{1UɃɻ6FWMziY/K_E%3XҘK:tDzBAhqPNs1\izXa핔w "4KFC^:˨G?и& j+imNc)HJfImRް ?YxyM?M}XwR%g&IaIQWn2۬JYN@cIB_%` {]6Px?6&lK"u;a(1[}^m/hm_)? Y&a"7uF]:39;3?ޯ%G?ٵ~%C7ʐ>=|~S"Ug';f^ ZTnit˻9>{E.j ~,Oz1C\ζ&)OY9(n݌AOhx*\G'.j76}mZ1/U1t׽.ve8ܟ+!hu3 'g+ +3hP94ioda vQ9(PD"tC%֫M5엘wysHھ4ih65 z4׎\ɭj4=)u8T<ˬWjpء6Y9c &bKvQow}sD;)b둸X&t6MC~^aC&9T\/g(/RKaLgi1+Jt Fa^.]*-j;4j6XEaSO/A>Ϯѓr R=a)BFަb (o`%cJʌcKlL_U^#(Q 8,O蠎QFh-&SG'Ԝu?ʂi>qz}tWMw嫷Sdwe-:+FCbq[.sMk]/Wz v+U܅ È{W:?/Γ[)p>vE(b2o+JG7[ {`~\ov4?2*eP;ůWaĞ <עV5]X}:^Sɛz \K_, oFb\˝5[1,/Y[fCϼCkKMY kηKu23VjlYwmu^S_A8 \}N{t/t2]NfѿTr–uĿ?|TpDp<8 Rf"Oa繩d_;0l_ yxQb}v OB~oz uSJ+=5/\hxÒؔ"m?}Fcڻ@rȧ-3T0n_ Typ-Q Y4]21c:Eo`i9WAsɖHb 9?kcA(Va><ܗלx1Uށ׳[ NC (SG@[xj׽gPP_[gөk:cѽw\SZfi NT4~G ?dI;D5MhTmHkRNr/*qơ_MWq~ܽS,B@h"cZh9{vͲp^Ԧ-zp)NӵkK ;gXuZ!n.;_^>>YcŸ`yA:ol\c饟_J^П"QuXH"Yס6ٝބ@k3R[ԃ8v{}9ɍv+ZJהo5? .[0yi\BFj*DJ] {],ﰫ=U"35>`O~"z#0kgOJuõ1)=RY Σ+xҳhބ<ҞdiFDuWC(doĩONwJ[}!y> endobj 331 0 obj << /Length1 2017 /Length2 15466 /Length3 0 /Length 16694 /Filter /FlateDecode >> stream xڍP !xp03Kp{pw =gwb~Ov3SP*2%@L,|1y5V ; %%_9ގ_bN@#лLn(oob`errXXxkh7r43>(<,-@y1r3:Y@@&F6U{K BX@|nnnLFLNB 7K@ tr(`d OiL5 Kf 7#' ]`cis~wq3:޳Te@2`9V&ֿ@v::yXڙ,mEI9&;`dgԍ Sșf ;S1{[[~N@{0p,L(ŁY(#w?2s :&$PpdC^  9}_ 04vDd>~?^?O?14J[;`eep?o;*Yݿ"ؙx*{-?A󟵡oyh]N?OG$]lle7vh3m) cg9=ٮ.Cv;Ssn"8 RT-UwgM &#aqyxؑ ;D3;>֊uP8_L$I> q\)cJ#8:Bv<J=—5RJ>^; gL]J_D˨HmB@mƑo‹fS/VI][^.)( ؿ/9;)][vx:A_99k6a4IIku~42)ƒcѶJطhXEIPzA{4"%)j1yF7e.Vs;5scS>֫~HoFHrdF_KqB}@m["^xTɥSڳ7Y2AޫyӖf/ۄzoaϵ-2dk}!R3@,u7a"RV?{S8jW]Y ERe=EbB^:IƲr1ey;WKx脡Fo~];/7]}%fL?ʷڐgKΑɒ`Vz]zU/d0"OܗDRBM*J"JG*zaa?Pu3*5ݣܜVomOE(D%Ud93\ ݤqCJ2ԯ*k߇ HN},ۺl " oPvխ*N$ a>;w!}]>O,u2/뙝h-ۘ]3>JNx/!ʃɨ5l<Uݶ#fYSHp >yַH'ĺd`N6G1kRr~);ӭ @Nr Mn;Yd45{UǛL A̫VoVnдh[ԓDÒY\?ؓ&q9QxXRNpCeH6խNl׵vd>/Ũ#DOC[s>9Yc:ڍP$h7" #Ns#(w8m왫_2s0JLv̯8+Vrxg٪4' 6 +nTBQylܛx@enE ;0֣D1o|rD2ƼiV8z/5M< 5B,ћbL R@&tM:jA u&ۂn4ȺBC@ͼXxēWLa㹖"vzqޗg@&`ȩJ9ysgƴ7y=&w=Hs;udz5ʑn5xqFrPL nMcF!_6+_Ţ q`i$BBq2.% g9zycPH)rgWr;:x-,3wMCy OmN{QmJhؔfkltŞ7򓷢2g=`-pGŋHOu+)(Ey,yv$K]+bHM0Mlcg]Nô[ӧ6?5x1>mQYtK0;@|?$mJ>@Z.*r$9 hǁ%8wbƔlѲ-6;]+yGZ6TJ(Yd7φc~奉yE0(a"BQ!tfb/}GUGYl-^1{تs.Mtb1.ЊEt DJ%"v_;7u[mY}_ ذ׍x~Y)mr?&%( V1zvU>su^s,b45Fvdq$u.͸YgT0rdy.Oe-[6̡RUx̓XjxxCVU&dzb8noќxWSl=p+mcrjx4K )+sSi \3k8u;n$_bҗw̜wJxalL'KQnfc E`wAuў9"-zBN3/ɨ03,ܾ)b%9 D5?# -μٟڬOرޭ-)3a {09 WTMJ\6TSI2 H6Rqb-\)"JՌ jzSg) ayw"Y|w&nvOS;2Tyr" sDoz+_Hu969n m:qNSOI"F4/747?L_?AʎcU'i3R&[^Y* ^p>ZP pz ԔUQ$*,mb5^Yxc2gػGnLI' ,VM F꣥hF>:lq,7 v-2K_𶹬pM5c ]޹-W3b鈃Я3|OHQyaJ-fnp=wU-AD- [9]^iMM#Ou΃![~GTM e)Lfj !'$,.¯ajf,:5PfFB-LQMnR7є?DT:x[*vedt~ES-G,.ʩ* sJ nІ/ka !Z0osK3WuEbMD pF֫4s6&8=Ag_-_;>-.Yɍn7OX %HT k >ISJO™'` }_畘`Sk'p9~jrA0T\dMcP sB?g_EǦj͡4/NCӭ{uEyToiG@Ş’ۛK*`O@ee93ˏU\B{O~[8@Q&=Z[5lfs&U‰ye,zW.~} 4JP'̓q4 U`wGӞ{W潿3 FO[ m{RݷƠZ%ĚD` @#g!}/. 'EJ|dmㆂnah0s 5'X@_6zkv;&M@iI?bdꚮf%XuѲQڽP:dmU>p:Xb)r Mhr$OjYlNdnAyFr[ÀUt7q B8Cc euSϡGqYaW&ޱ956T1U|c5>_'= piIbu \mF)Acs\fLӭzdV犵_||jwBw)wt .aPU#Y-)ek ufM8}LG..V]@5D} z^~0tNi6xl+0/u 3=-xQTpB9[  B@k݂Z ^j %[3t_w|,7:nΑ8:#YU {Ԭp`LE{_J n_Rf!Bx[_لCqҠNeZ?JBrj1QTu5A~_Tnb}!TnehzdŀyJЇOC!92Dem/~1j-!s)+o!WmʕT4۸h,lh-MA?tP,D3(?.z6_}4b͎ܙ̶LKYuky[u#2Ke`@3;uj06ĜdÆg@K~[8+bI"7,P3C7qXNypa2:B :8جB1DoWr+hk3g` Ep2tX5A'7$Mraz%3IQ5&4bK?ō{n2`$J(OZOzd5_X/372k[D:sx8/`&~ޯi>lH`.c&%}x䔴=W|GgbixMmyo(4Os^+x`;ЅPg$;MWı7 ,IϷq &u0xDdu-JI9h}˹1oq!aPu!Und euf$ y= K:K5eyxN` 8qLۛ;DuEjIJR@14@5ht׭$t*b eX˰Q |`6oᠠXGCfr a?ȧ 8&~آZeX ~na1B4T NQrDTokY J0HycTM f=5'轲`@u;hG? NU{FΪOy= /8o1{sѺbHB6oϋ@f[z^/LAtcwE(>2 ^uLފ?NV~[Im$b ~"EVS3)(L/[Kiq& D6iq&}YZa&Ǭ\&c:[!>˟qAOuS /U`RUL,ihDtW\&vL.f:F/~U%a ܉$;'JCm,26-rf -tQEƟ0M(|D2T2j{`w58$:.9>'`(tOhM'6RQpY4M (pE!l@&C(E#DqCLh~Os=ThRUL"! YBb<8 2%4e :UРNtsO|;ccB0g_D􈠜ad}{\־/f2 c|"`?aeVv<UϏIf)Bff!#!J}#_鉷]E Uhr5\b5zՙ P߈]@#峤/Cmf{LHfQ YjE+RJ("|KbbS!N0lkuWlC2k/=>\²nm 2c{~ maWƾXkW/z~AMIu#dJe1[ l(nVxH)7Xs#kf_lba)K۬ҷ#W|^luLU?!~dk~_j40啭qܹ:Fe4g% uީT4u@+:6*J ~ZE6FqD‚G%ha32!HtLcӍᠻK3 &0[YR m/jJGpE7hћ8=4~&!m>u3[`p\mP kóe4-Oʌ uXJ6#Jloz ciI3ϬstE҇iЩF ~(3 kW:=iT436L5|17銀CDžUCl|Ps".>ɑZrڎQ Kf0%Fݢx܁lqZ[C"FQsRCg`#]㵸)/(Q|Z~fK8bkCrZ `-\*u;}il AB'^ÌeV@t\aNӳBA%bϓq7n}oFUcG Eq*ߦL{_Q@YQFJ0}aN8:G?=AYE v& W9xA%' NJg[JCE("./W˃B#l\7Bw D1㮠7ӶW٘IEXԈN٢Uv悼\RIl=;pQN(+;P!RZ'+STWV }pOY"D[8l> @')t ~k} =-]{DNz @̚}t-y{E罰*`l+ɠںE+OV4 d8WXy  +>Ppm7hT%mJLoDq$8Y''dWNB钕 [zWIRyO/P-Z$~TBԏ6d(~{Dޯ,%["-ùl?¿!;j(xI"\TsOY|(&?dQKoE@Ҍ)\9aK %DX򫅗^eRJ EE XйؚCq29(KH|#Lm(UX&zY5jv0%gQ?~&uWt/rBH>uu+/U^z6lH:TZUvqHؑF[rh)t xWŞRQ*3洌L+O}gQ>,E{޻Ž'(OSU947^NKJTgM} Yݺjԯ= -qrBsdI|o%$-b"̬#)39IْsR,jzҜ %:+|b tVCc@/*GXӔ&eT6a/V !6o=gnMZ,e~0$M}Q|i^vѤ'^a)V}wv`EbFȍ25b&4 [|ضeuq0IcHz;0tEߎ~~Pk78a;Gߢp+"p]g3[e~ZZE>J>=\YGMZ/SB>ڕR"KM^ÛR!H#dٹUiIoFЦȄfe!*%Y| W̴.XyJuJjП*p*mg pbZ4rDp6Z\˺nYWA7P>_RS^KDh`]e͠>衸辍V~ ŸqM?1MmMjzz}7d.U$}҇|(Thy2Aɖ͖1AQI4g‡L#DkGE,ĦNu&)Y q`CU禶@ BI{Y̓=V{;rp@}q/,bpһQN4b~IuV*roU.B,ͼ}"Dʘm"6"j 'obw!f'2%E)EY&wa0`FgߏĻT K#ܤW"wddhX|<~̚ъ& H>IT#C4L(8ұ,3^J C|[wK Y]fD%%T!CjԜy RQFc3LNgu,ʅEM_\lS^VPNl MD7 =bm.S?uQ/lZ=8S?JZVD1fRb$Lt\=fo"W}pɈ>>|/bwK]c3Ħ>SOV* *J{9.C>!ti!1e(Q%tcr⾶P*,a'b9=Ȕ#vx:!bY;N0gˁ!; o9вgFn1Y~&ϬNw%3OG$Ձl&+ יW "14y83¦;etxwJPEci0~5w)?Q> C^Gm&8pn M ~NE# agH/2lCVch6bBmc#LjGC6i R_?Nw2Ĥr)2IF/skӚj1_~/%^f?)2V)E/^C%4'"-UV2q |#uU2Տ[S,c_lPs: Q#=> |qJ1zHDXzVX [/~p@f[@,^vRG#qQӪ-d0Fי%%Gqjx ?m | )|+ZGbn;]ƭ׊L) C / D˫9G| _,];.1;uICjDS G$!Fr)ռ J$p-:L/,Ja'ɟQ䠃}m9E)x tw޵:=lbfʬ9Q*aS[JT໺%a񰫜ҐeZs{k넣iUa5ɻq~s/r0oGټD(ϟ6a\|o!e ]:\|/笵mT$A[U(:qp}"x%eMOHpt0PԚuL53m\WD41,愒z:4Fk;޺2{,^e0J^r :CeFw>%8wxW@My;OfE(NPd:ܮX we1eЇah3 lL1]Sfĭjش"9 2UQذ `j~U-!U~E!B9^( 0  MX|Re@B~CԴ8Pok,9A =mWXrZ.λ olX.u?0V=IuN>>kA32pX*T!Tռvf:r u^!ˆ-2WP7tY[{ sBazƝzr6>˸I k{f1"Vw2aoʄt9w,_l'+7 © d>nrKڸTu~l\@YMtRX&ƋPU&v525^<@w}|+Uڴ3[X1lS>eHz/gO^G \*u" jqdgqpwB x?p}܇ (BߋvؙnJnm*H7K{#k q(";ؼ-|G–Ᏽi4Kx<˷ߖ>^½'\wEYE0 tjӴHNU 3h:.^ϾbDT J!몹+r㐏 "3'T0qM:8>'|EUT ٶPy'Xvw1PzS1˴)?ePF͸j ZK/-bņvCo=xgt Ыo$ʿNy-1 @$G=)(9B/X"G"TlѩynۜZS|c#8U4իI&QN rRΙH'\_3z%ouh#QT>!& Pc^eE;h ށm '@:ϚV3:zW_?|+qOIa>T:׏^Ds2*y߻tyR#`xD0=JGFz?'.OTbKQмD}% ay&*L~.Vtpf&=o(Ͽ6}e%lv{Zecеr?b_[8M첈Pumi"_3M1qtkgRhj{E;RnH|g7-8k6-Y sl|%Ƭ|Q$((cR{f*M;-Gそ__sLE}Z'&нREXкyeFV|vHg~RD_^&%Gohk 1FєGnWV-L>O_H1Kg8{WVin4ժO$;ۏ[Y+|{bқ~[Go_ Nmȩ˒ %_% w$z]V9-% c%rFnoDCJhqim¨*!pO1l/_:=RYVZDم,Ml#?QW%UkP3|%>^SOk%wD`ܭc6xC)eL˻U&Q8g/O;n]JfU7p. - $ >*W}j=?+w !OsPx zG}P*}݁nۉ7u WR(riDU7*,jCA YB,/'&KL."dS<"VҀY .G1+}>]a~l&,eEWO68:yaIS؃FAV ܿ2y?}K7p}73241Y)/Vag-D#יX+(W%Ϳ 6KI`gϛ¤3pn_\(ֈM/ȏJ"D=L=`E@*qeW5;3Ou*R2?%(L%e/F,uFT:Bo,D54Rich3lK0I9.]\j-7]ktdFSJ8(-d_iࡐ: k 0(1]կ@U}t?ik\=eoH 7jQ,AUIiB6O]wF逽)Wݬդ)蔲z*4aϑO?Ӝ5&{BH!KAn(#8b`=#GW JR -f=QsO&łi=k{Wb~abϴ%pV'e' K[؎3gSs"Ltq mԍ-85WcFnG_\wř gzVj|2ȂeQlA(ׇZ{jILQ 8[.3[Q&)ЯVBDH_S#\'tQ۸Y^\YoOO^}U] P5tS8#N=*8GۅI9ٗV\&͵?ƈm4@:swT B <#/xMgͣ9S ҁRaι5*tQo:!k4ؚ@%G*OeD@jjl? , ëx7URVL-ɩKfr֞)?K&s쫲 endstream endobj 332 0 obj << /Type /FontDescriptor /FontName /YMPOOH+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/D/E/F/H/I/L/N/R/T/a/at/b/bracketleft/bracketright/c/d/e/f/fi/g/h/hyphen/i/l/m/n/o/one/p/percent/q/r/s/t/u/v/w/y/z/zero) /FontFile 331 0 R >> endobj 333 0 obj << /Length1 2772 /Length2 19853 /Length3 0 /Length 21427 /Filter /FlateDecode >> stream xڌP cnwww [pN.5ޜs=꽢 fu^m{ s ɍM `cdac@ִusWD ڂ 2)37 ` 8k o:zmLd3@p:j "do!m]eln6O`Tur;ҬU@FoDi' _0ͼ e%8 GV 0_-%JFV߈*XElV߈7FV߈ *A(F.oA \T#E7p \4#Ht]7Ctf"N33GgȆu[-o3G FͿRv;sh6_'Ǟ_9I_ adrL%\\IxΉR!K  o KY@A/X_ja!&ֿ@?M ..66@?, 2? e? ^-T 4P_N]Hh'wGU?(AVo?NCupN.} R[)2[! u} RDw#?w!\;s= 7ĉ+y#va!O Ǹ@ ć=gq!B{^@HT? 1>9C<a?;W_( h 'dޝɠg]wߣ!WoSG0VwVȞ|6 D%?=$#}*!^?HH̬)d -O·sW`]jY8Xày n$ν篮^8|79-UjrR^aJ/n/ѳ@m}&?0Pgs/og GA0ufsDh)JKHM$R#AwokJǕ)1mDmf5%x_{|=~veTvSs^{^CҧhH؅YMԣW\P+2ZX\.N 3|<=Rͱ,Oq+a2y Gjn)Y~i9Pؿ5)/xĤf!| #n^CY@KsqN,ʎ~PAaA`24DI89>ki6V͑U9xc2} eFQ Bs-=/EWF52zzyTEH$Be`5-Rw%ntϘ]-ڱSjcrlY3.rŮLpe; htZe75r[.>Z0pmJ6KQfYɇnQwrxEbxJ*h,bemuksnsqt+:>q;K(*=:uqY@f/pzue~0pK[ې#j+3]Tc-Ƽez_IpevώFS;^b/x#3_4Y]"hN$IO6}CNNX]4C˾bPXvkϛ}.nm^of>G3ćQ,?bhFo#e,8;-pv.x S!-_Y񬱧̦z2C]15ٳOz#S(P kK<6 M?/΃GBP;#o3p;%ȽS(>?˜46)),X )OMMNQeэzvd$q5?/-FaTGbIu%t:{LPoQI xzpL`Ki0&+)/ڗ6LD0gMIRh3IhPiE0s7U|58rm2/~; cquGwlV^9YyĴv-wyYsOtׁ1*XQrۡdӗ28X>Mc>Mx '(IoM֮w2Αhtpz{QZ3*4Mi}CX$m'?v{2c{lK?sypF/=Fg 0-v5b”&{PI9BTVvx{ }yvQ)W%+, @gV[X7K#i?=P.Wʹ(%?!eVJ {GWqrm!GC4zǶ˞?ÿ|Qծʄl#T<  f$fʘ> :Z>Jy 50t9ʌr=Ks$)li`[m`~2 H&/@ [_97 g燯|:.R}WOLpG,=SBQʿ6vSF-Ce~U,+|?1o:f6=56ց*gHq&QɟKYch >J gb½f@qM1O@]"sф}ITQӜECbk88~'#jQ ,g>WcΓ6_{'{J/µ`} ׻EaHb?_P름^Q}7wi1̒$]W1`d8"ωփ2Uj|Ez]}2]*N9dIaEK' I-IRlTʡx>r!jCG3*aarLxѬ$4ɾAC#nk˳DU i)2yLhZ./Ih}`cI~ϾNlBsL~B=PsO9 M)bD4CrD귷Skgm(HNC[^d8[ixnxԭ37֡@<T?`lÆ>^֎>uJ(Ǖ{ayb WК) gM+0~Du*Ƒ_PzTa}UW3KNS1oձe>k{gY&[f@>!fI.tv.%P)b|Ŵk4aa}nol*YtM\|ZNlQx4KDV=MTA;4{7K׏xْ>MY%oM|k8bH-+w]}hGvt3E`7I5/㮝e#qJZ|k;n_纽> ~,O[S'ło;fbIDX721p,Ox3u/Se_Y\KŮ;獕=i2یz_{{-)DFD)KzшϺZ, B4v/~X"E p/Ⱥn?\^nŌkYHy*YD;rsU䡨!-1TsLEǬPA4|ÏJZ79\_Wr6m#L7Z_\~)%24xF&'9-)(OʨˆICBiMF}̅wY&N )I ηP@uziq[tBeG"&y-U?퍅Ą%^VV S#x2P( Ófx.m+⎳YXCg6LHj>TmDˇ;8R^|8 s; b' Icd"2DtF M _R[7ᯡmB6Y3 jgN8D/%OqԂ*p( #n3UTmnt4w P7FMD&e9_k2i"ORH+ԉbKIw&|9yVom7Qn2XK@̶AYd/ zvG Z9Deۢ.vHcd16c ϐL?nNH/:_~?7 UX5hWzo>O߻w&%% GԪ4}%k5IwA>c6fЏ]-LW"X2 i,#v &!IRpŞw@O$ }^WT#3KYͮ!7~>2[z\:_5e2Jr߽P甘tc_ {FlKWq \,s Ckh}p՟#WM{\[NXu,NlDs?w?9zx Â2)Ϋ?b˜ M_t4t7$A^YAS]eJ}W2{T?&JojgZ 29X{QU^{BsP9Iǥq.Hfk,UH7 jnx9kSmG5HI)aapR EsTBN9vakxX@n@We{s|މ5ޫEgz\g#/MKǁe7mڴf^縤(} [xbv%%}r6K"r͞Ԑ#7=`00o,D\NUí),򌷐"w aI%J)FY ~d. XZ*d?i \呵o!jbdϭ|'.ͫ}qOdk㏉H<ʌkQ#i>fQ،fʬ%ۇn_X v%7<; W:-L01PP*xQjQz&՛6%.|(䂣,SD ݊J7g)J f l=PP 5%gRB_z (y}"HnQpᛑHLɆ~ɱ]8O)܅ե|JHc-sge[f^xSz(MQnj'qgge殛."LoHK9btEC_AŸac旼WyvVHI *cBx#fIs#8J_ڣi?q}6ddhf~TJv]~?8{Z~3 vl.8ceQğV}w!m^<=k9-1-)b>~Ñ&FQg\muG7:9(|gDbKdONj C:a _i:Xcv,J9y#m1\7gp4*Sšqkۨ@qo?t`3 18̚ĎЊzoI}A{şfޝyitc_b6R!lo͵LQ!d41yPDƜ4$kQ֎ (Z^YQ ( '[y"^FceZt)HtԉL.S?a}|?f]4gΫe#vfѣ &(ŇIC_Xk翠ҶOgn)Ȥq^ m,bשi~^aai{X}{n*qsgJ !VG~)Ѵ#Xd&:IxQlI=Q08U>ˏ@%U]o8fCYIPo;CuVHtʚ8??25D'WTzWb6IX&;ݒfÛaf Kyqy47(,uWf}dY\9ls_/t+[MjLx_ֺ䵹$pZˊxz(aFavvEږ: hka 1B/'W%poB˲Q^|oTN鬱97=Rv=-)ķ`AÃ>*krCl*&[J. \^IAI`峑Lyc>н'jvexL3qc._R ?O~ZZPbgE@cĠٷvm#ef ,m s9,+Jd({pA}GKB&k_&b4ISjKNmwS ltW_5G}́F=! P}+EEرzNKDWVlD RA:SO"U׶Jk/2M t$ўakPͯP#}pD8sC6,R~] smp~ͯ_c'p;شbYrmmW~B3@405:ͤ}H\{Uڼߎei;Ekf=P9ygߍD}tR^DMsʊZ{^Lm֞A^Uc 'Z7 yo.SMtWa|T3UZػQxZWس'PXkZ埑hlXd$*[D\Lli6?|H*$%"애DAQr:i]T |Wsmggi-#(CZx {^D 7 a/?wX57&E_^MCi)@)0h',,P ~5H$/%WicwcpbELxk>݉)h0װ1Mpk"{BGJoUe~Y2 ͠䮏Ɛg26jhcOsFz'-*vۭ]H()ov輋[K㧯>Ky3=7yq, 'hLIy/l>]|[I)U#p[$RYت@)lJid 5NI{UOZ(8yq䈱޵`ػ{~LIqD$R,Bm?~N].m/Jc,~JN,M;`=Ѻ#oݮהZ;Qpo%d5:t93xѹsjWvx;IS?mDB/"o7?uҺoC;1`Ҫl`z;G\"lg.Z5mͅ+_)Ʌ2=T9+ Vêt&CNiqX|_\+`7?0ch<)"ZEuHoq]o|3HWtW֥)PcriYwV屖UW̓ xf^)iR0->6D$XJ $_QCx(s_ ,lR])zI7yLؕeͯiRm'QF<G^ۮ/b<0ff+Qdp.=T xj]|Hgz^yB'*rpori1 ͧY?8T,LEm#,(Ӈ=Bp!a!2Qw_kCH؂ޑC^i ?峨hV9i'U~VgN:~-pxOE0~K^h)r5wէR=UY&OKW$ίt I/Ŗw0@CX~/‰{pI` -%nܕ3QStSEA(t7Nx [0bЪ 1 اBKGm7/[MUЛEO}l>աcEc L`},}v=bc`XpsbZR\d[RAYzz3[1 d35OvөHڄKM-u^ʃEss٢R˗u?(1wZqLƦ+||$3WA:鳁': [.5*v\qo"pKݭ;b#M]ރʊPG rMjqЈ=(q@>`;&'z_ıCgpB"O-V?$2 5\Ѵ츬I>b!GF\0ANVAo~fw a.6o‘^{d< N ;W\3bXo!v]DqQʼ>X(^5dBj#! isD-m2(ns{yGNMskjWBF\ۯR4"R 0I%*EoGF缗$V1G;SpϨ9NRK#mo1}|]UWUh7e8b #'O ,Z.{s{Y@Rb0cP=x6uQ2*D+9bLܞC$Bʱ%=&^3(VpeQHMB,ͧ\VYhk2\?+:$Œ>Tɼ&7ud5oѭKsGMf Rqg0tb>~Ӿ"=zG>SmQtj׬]d7>ڋRǠ O[0]QZmN>)i?}J(&à MYC\d-Jō-YvĊ铃M1@J  Uغ}mnnYM i4ɥ A} 3%hqJU~wFUPT}u3V3.H$[^CК1fC/^дs30J[YoNJX4o9U(޴;PrIU?Eqmy'ï Ysg,aPǡ)ءH/{Jk)+^q( , [y~_+W?ǣy].ujgS%q]{pDc4SVvoaI&iQ1墾:Ez!VGڮp)Hfn: 0S燎 yʚ2Z(aE8#va1H?`AT-$kF;P3T:p">K۫' ["VkU`UWb\a+,L/|ӢͮvgwDW()9jGhջ4p -MsڱԀoE,}r=G"ˆήD+/2-׎9 9H w-j~Kn,>ST+B|kw\;egAޠGgLJKU}o^i 84J+NG+k1aD1hDR ^HgZMKda {3aozٹq,%`87XԤ]]{;V ~[XHI'vNƅ n(MvD+^_+!gZ}cM٘)B߶͋*]Pc8FmP0Wp[BS Ӏ\d Uo^o}U@|GQ:BJ,a*D⸠Z:iZ|rgYp ɻ矞߳}%ˇiH=u ůU7&=v0[ڞV#Ba-gK-$VNoz:{<ɦN11@AX+lfX۠]r8/-UMO)TE^͇[g \]:v}/1Kdboi7Z)(SO.q\_J*{`ti^Hm?34}ZGү+ʽX5q؈ːTOs>5TZIy]l)-}HG|ҡwXi2æ< 'dVYengSArTP&_ҭ`"3}m ' ckN /*j [bi--SFAJFCMܐ{0z7յo`kCA/m2$Vkoz]ٰ43u}f޸cP~ zkcǏl"ӌ˺$ϞTE'vm_}n?SXQii72t'PD1>ٛuׁ'OQ/g ~Ӱot4>[5>x 0~}x*1Pr<S$plMUŻe(Ce`f6Iݶ&HÄST ?{'7? JZu?]բNj?|yEW!1t:Ť Jm.[-> Iۦ3ʶB@dse_)B~lU™55w)u XJG^J1]<Á3z8§Gl Dq{4hɚ:-[JL[WD'0r)m vĒH g4$ƪJTz[ibH\]/&i 8t9ڗɆTMNssz)*2k8%G t98< fd #⵰Ǟ;aЌswHA/3UdPױ͢ ޿tU iʶ+Cde^VP. غ.{bTD2aOBWhY1!vBkTX)\mt44#e&].>~QW(=f^ ts2Fv΅vN22߿TIB^GqLt0 1}_v(a_Łϳ [h{ctd7)W= V^ e#WG91.#9Bo|} Jd.زXnNI?@Y4{mg 䐨l>gG.is|rA] f4h6:ufp6L+TC)hIxLIOohgd0jW!r2^VŸf$S~t k R!6qܩ/`2]] .hyh\;܌L4a߄lJ,=/Ek#+k_>JYI ~J鮆<3;C5+~$`s]w߇wV33 -5 pŁ]ș]g,>^i!32%2<~}X(kŒ>sP(%$l!\]>cmgo3@pq1G3 u_~**n2e@{/eԍKǭ4mV7wpHٻjqJC Z*(>&TSUڇ.skoUX ;OYv0DOqsᲴUeo^s `bim6{7LP̲G& ^opd$UDBѻ+$Iuu{,@]o:1~k:Q&7x*&fאGl֚iA \5ӧx7v?@-¿ܿ#m epɹLP7{~h?+MݓY};u!3ێ-5(Y?)Hh,q >V3ogR$gw-3Sq"fCtŖe)vp)1FVhUk 7[-Ѕ毱`hŬncɌ^D^O}i￈΂Ww{? (=alN&w#wkBzB=G@dI-.ja'7̳I#<}Pk ȴnN:N~]8k* 7iPpS_`EH!|oQ֫VPc x+OŨljpu>KyȔΤe"<6Gzԇ˓i[[Tspƙ4۩ׂ/?uՋc"0`ț2g7mF7 G.0NQYQg^k:BdVC"govTE*1SKb)K FTps'i]c ﻔϗMfTF_r1oG- $z &QaxNfϡf(Җso=4" wbO\7I^b؃Bw1洇w?\Ρ l^Ed*>kͪ0CYJϏɤ/G1+3qI] h}+M /U9 B\Ǽ峞Dn6RX62ZN`x&&HhcrvsMhc>~8PQK9ZqU ƕE~ u.ٌfwK4!|m&2e?oi>5{̾LOIh-ŊK. J~\/]!=ȸѮ2jWԳodAV*JHrzh3gۋ ¥/$5{ͤF^ew(oG;V!~.x ! \fˣy9ô /r{G\ǸI1u tjW.X@(1Vhpzֲ>?f:Ƽ/I\h53&Ly;MsO^ y#Tm80곚n-)˶Dlʐǁ>ÝQWX0m(p2^-Ky<~ : `Y%L(j~ji֋TXj4|Ҽ/ <Ct [\>NgW7])_LF,P]6@Ja }H̐HhC9E~I疚e“R"13'#?W/L˓䒐hZUj̀1orCFedbg^,esU\ռ\~"h*sFk{^17Ǫo ؿoaz//YeGgw)!vˡYnȕ4ޡ>θz~ʟѕ-T$!,Exl(mG&zUT\1L{D\(4(a׭6?G(j臗/j?Dm4WsbZS>/jPS/2Ƕ3/-?={ mO9s"T.sB@PK/s|(G c2WeWL(ܧ>$E_RH:)uY)E뿈ط iW@ xyV]XoOC-:UX*1Ƌ5F-}a;\|B*JTx[6YSgg#&?~βRhOJ3=Ey}>F6e[_uC\T:?B>6;puN3-x0hF+U$ ~ZUG SŚL;:Hr?j1e}swhгqzV{ 5B.4WЧ0Gի%W;[!{Smq1f^@nhW7܁a{ṃc9w7 hf.WNTlUnI{]pNQ9QCN4O禴ljm~q nsls,ED#>}2lK>}=̃?ɦE]-ߺ WAJ0E%?5PE{9ԟQrEP3Ov,1 7\ŁS'1 (?n(y? xsF%GŗvIժ1v";!/ o)h8S@VPh|7GE_unegs%[1ȥJzlCH0e{;2÷/')GJ +b{,;,2$ 1#d}Pf;ѥ S5`R:^g@[%l-@&yS]+slCⅺb*~]lsUV }ƺ9Ks&kw)C uC['e4@DeQ!q(ei=N!1vHƹJKJTYErܟ7 VeLeaX(P%>㓟CG74c;ʙRRʟ1q;~/:s]iF<[uGӤ;J3s}\qyHfxw|<? 4$猖~$%=.$hyB[/rF#?Б[ O *|OUE5*  ?WQfk J3&Ivs~aj;Cr{d>ڍgsT m)HQks3I֓{+=9M(i8+@rs.>Jv:tdu%P%OJHi^לԳrQM2ӝHB؏2?ќ(lGD﷒ bv\~!b!7;1.ufsZFZP"m3Jg1_vA߰H.`\dPoucƀ(L^34Hl՛`U]/L Rt^jKwfh5I4h򍎤PWKuZvTBzYDS#twY!ZWǨ_51lswkvG j bݩg҅pj&/=#ۋO 飓gt U_qUź }Ə͜ĞɘN<&I1BʙfT/|#_HbDzuh9qx&*uXǧwG&?zf%R,7/ı[Г7)_#_e{[OA/t 'HN֧lc,wW 0M冕껯T&xm8<f_?6뭣1D"4&LX%uH}QԠU_j4m џe}ɚD4TL Q;Ћ_ ITVI6W7oBu%'C1ϰ=܏\_ғ >樕 ޅ,Pp2N@L:g m 55kI",Y&>m&x?1f=:%rPFS;IbqMhmbsmGډ/8_%j$[2Hpcs}\y+la+!O p=.*{pE;88v [x3y xJx)-!yh})_NL7G9v(EKЛ,U?)eujRX[giH $Ťt >ݽBQꜥ +fhPUg}wl3 =VWy9!Ʊ&: &󠬘uT=*K ɉ_07)|lD7\)ne4qp(SdO:. kǧbIz+Lh,r=IY]'G MF?߲{$$R)i7Rz6gF4BpU}9_(wŏ[mx^A\q-^ .A m:Că/m*}6+FjSQEZECwb2`@&[^#t#fBxy7&](uz;`ݭںV碕IDMB2&D`B<kn;GGVfc|0 \%\-?U@_gDkN@#쐚r Aǯ>m6hA%"%'S bTy>(wr`_^d:Fea'A{'\)vcPcE? vӯ~,ۭ -cM 8 с2ñ VjxĝYE\wLR 6i/jcb1)pjMHC0f h-@ ?l |%a}Q#V0''+I W͹e9(a& qlݫ?s!:k0ʬKlu'!q~lz$Iɥs Q.pO}bI3Ƞ3a1~c ԅCy$ Z6T ^b5Vq4@ТBI6ߴ)mQ}G.O< ѿ)q*IهXᑻiޕg0 30t6!B(^t:/W ~nѨfQ!SXhg#`f 8Fݠ'`9I]Cب,gYZ |Ƌ\}/h.+tit endstream endobj 334 0 obj << /Type /FontDescriptor /FontName /PURZWJ+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/V/W/Y/a/ampersand/at/b/backslash/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/q/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 333 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PNTHCM+CMBX10 /FontDescriptor 302 0 R /FirstChar 48 /LastChar 122 /Widths 294 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XBYENY+CMBX12 /FontDescriptor 304 0 R /FirstChar 47 /LastChar 122 /Widths 299 0 R >> endobj 28 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AFIOOE+CMCSC10 /FontDescriptor 306 0 R /FirstChar 98 /LastChar 117 /Widths 291 0 R >> endobj 41 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BYKEND+CMITT10 /FontDescriptor 308 0 R /FirstChar 84 /LastChar 121 /Widths 288 0 R >> endobj 43 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MGPLPB+CMMI10 /FontDescriptor 310 0 R /FirstChar 110 /LastChar 121 /Widths 286 0 R >> endobj 51 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QSQKOE+CMMI8 /FontDescriptor 312 0 R /FirstChar 100 /LastChar 116 /Widths 284 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XORHRC+CMR10 /FontDescriptor 314 0 R /FirstChar 11 /LastChar 127 /Widths 295 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YROTEL+CMR12 /FontDescriptor 316 0 R /FirstChar 45 /LastChar 117 /Widths 298 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YFAHSK+CMR17 /FontDescriptor 318 0 R /FirstChar 68 /LastChar 117 /Widths 300 0 R >> endobj 36 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YKYCNH+CMR6 /FontDescriptor 320 0 R /FirstChar 49 /LastChar 122 /Widths 289 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EJASTL+CMR7 /FontDescriptor 322 0 R /FirstChar 49 /LastChar 49 /Widths 296 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TNKJCO+CMR8 /FontDescriptor 324 0 R /FirstChar 49 /LastChar 49 /Widths 297 0 R >> endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EMDQZB+CMSL10 /FontDescriptor 326 0 R /FirstChar 36 /LastChar 36 /Widths 285 0 R >> endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JAXCFM+CMSS10 /FontDescriptor 328 0 R /FirstChar 58 /LastChar 122 /Widths 293 0 R >> endobj 42 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IXFQDE+CMSY10 /FontDescriptor 330 0 R /FirstChar 2 /LastChar 110 /Widths 287 0 R >> endobj 29 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YMPOOH+CMTI10 /FontDescriptor 332 0 R /FirstChar 12 /LastChar 122 /Widths 290 0 R >> endobj 22 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PURZWJ+CMTT10 /FontDescriptor 334 0 R /FirstChar 33 /LastChar 125 /Widths 292 0 R >> endobj 10 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [2 0 R 12 0 R 16 0 R 20 0 R 26 0 R 31 0 R] >> endobj 37 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [34 0 R 39 0 R 45 0 R 49 0 R 53 0 R 56 0 R] >> endobj 61 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [59 0 R 63 0 R 66 0 R 69 0 R 72 0 R 76 0 R] >> endobj 82 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [80 0 R 84 0 R 89 0 R 93 0 R 96 0 R 99 0 R] >> endobj 105 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [103 0 R 107 0 R 111 0 R 114 0 R 118 0 R 121 0 R] >> endobj 127 0 obj << /Type /Pages /Count 6 /Parent 335 0 R /Kids [125 0 R 129 0 R 133 0 R 137 0 R 141 0 R 145 0 R] >> endobj 150 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [148 0 R 153 0 R 157 0 R 160 0 R 163 0 R 167 0 R] >> endobj 173 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [171 0 R 176 0 R 179 0 R 183 0 R 187 0 R 191 0 R] >> endobj 196 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [194 0 R 199 0 R 203 0 R 207 0 R 211 0 R 215 0 R] >> endobj 220 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [218 0 R 222 0 R 225 0 R 230 0 R 234 0 R 237 0 R] >> endobj 242 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [240 0 R 244 0 R 247 0 R 250 0 R 253 0 R 256 0 R] >> endobj 261 0 obj << /Type /Pages /Count 6 /Parent 336 0 R /Kids [259 0 R 263 0 R 266 0 R 269 0 R 272 0 R 275 0 R] >> endobj 280 0 obj << /Type /Pages /Count 2 /Parent 337 0 R /Kids [278 0 R 282 0 R] >> endobj 335 0 obj << /Type /Pages /Count 36 /Parent 338 0 R /Kids [10 0 R 37 0 R 61 0 R 82 0 R 105 0 R 127 0 R] >> endobj 336 0 obj << /Type /Pages /Count 36 /Parent 338 0 R /Kids [150 0 R 173 0 R 196 0 R 220 0 R 242 0 R 261 0 R] >> endobj 337 0 obj << /Type /Pages /Count 2 /Parent 338 0 R /Kids [280 0 R] >> endobj 338 0 obj << /Type /Pages /Count 74 /Kids [335 0 R 336 0 R 337 0 R] >> endobj 339 0 obj << /Type /Catalog /Pages 338 0 R >> endobj 340 0 obj << /Producer (pdfTeX-1.40.10) /Creator (TeX) /CreationDate (D:20121003192859+02'00') /ModDate (D:20121003192859+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 341 0000000000 65535 f 0000000690 00000 n 0000000585 00000 n 0000000015 00000 n 0000420279 00000 n 0000419280 00000 n 0000420138 00000 n 0000420700 00000 n 0000420561 00000 n 0000419997 00000 n 0000421552 00000 n 0000001402 00000 n 0000001294 00000 n 0000000811 00000 n 0000419137 00000 n 0000002339 00000 n 0000002231 00000 n 0000001493 00000 n 0000420981 00000 n 0000003318 00000 n 0000003210 00000 n 0000002430 00000 n 0000421409 00000 n 0000005449 00000 n 0000012727 00000 n 0000011726 00000 n 0000005341 00000 n 0000003409 00000 n 0000419422 00000 n 0000421266 00000 n 0000019485 00000 n 0000012619 00000 n 0000011865 00000 n 0000030255 00000 n 0000030147 00000 n 0000019612 00000 n 0000420420 00000 n 0000421661 00000 n 0000032567 00000 n 0000032459 00000 n 0000030335 00000 n 0000419566 00000 n 0000421124 00000 n 0000419710 00000 n 0000035202 00000 n 0000035094 00000 n 0000032718 00000 n 0000420839 00000 n 0000037471 00000 n 0000037363 00000 n 0000035354 00000 n 0000419854 00000 n 0000040627 00000 n 0000040519 00000 n 0000037646 00000 n 0000043178 00000 n 0000043070 00000 n 0000040790 00000 n 0000046130 00000 n 0000046022 00000 n 0000043306 00000 n 0000421771 00000 n 0000049546 00000 n 0000049438 00000 n 0000046258 00000 n 0000052359 00000 n 0000052251 00000 n 0000049674 00000 n 0000054956 00000 n 0000054848 00000 n 0000052535 00000 n 0000055815 00000 n 0000055707 00000 n 0000055084 00000 n 0000056782 00000 n 0000061519 00000 n 0000056674 00000 n 0000055919 00000 n 0000061398 00000 n 0000062969 00000 n 0000062861 00000 n 0000061665 00000 n 0000421881 00000 n 0000064111 00000 n 0000064003 00000 n 0000063096 00000 n 0000065525 00000 n 0000069486 00000 n 0000069556 00000 n 0000065403 00000 n 0000064238 00000 n 0000069051 00000 n 0000071418 00000 n 0000071310 00000 n 0000069706 00000 n 0000073904 00000 n 0000073796 00000 n 0000071557 00000 n 0000075795 00000 n 0000075686 00000 n 0000074032 00000 n 0000078880 00000 n 0000077680 00000 n 0000077554 00000 n 0000075911 00000 n 0000421991 00000 n 0000088922 00000 n 0000078754 00000 n 0000077808 00000 n 0000088235 00000 n 0000091461 00000 n 0000091349 00000 n 0000089086 00000 n 0000092160 00000 n 0000092048 00000 n 0000091577 00000 n 0000095256 00000 n 0000094109 00000 n 0000093997 00000 n 0000092253 00000 n 0000097138 00000 n 0000095144 00000 n 0000094237 00000 n 0000097035 00000 n 0000099574 00000 n 0000099462 00000 n 0000097310 00000 n 0000422108 00000 n 0000100226 00000 n 0000100114 00000 n 0000099714 00000 n 0000101270 00000 n 0000103003 00000 n 0000101158 00000 n 0000100331 00000 n 0000102900 00000 n 0000104989 00000 n 0000104877 00000 n 0000103151 00000 n 0000106216 00000 n 0000110253 00000 n 0000106104 00000 n 0000105141 00000 n 0000110139 00000 n 0000111991 00000 n 0000111879 00000 n 0000110401 00000 n 0000113848 00000 n 0000113736 00000 n 0000112131 00000 n 0000422225 00000 n 0000115125 00000 n 0000121137 00000 n 0000115013 00000 n 0000113965 00000 n 0000121030 00000 n 0000122459 00000 n 0000122347 00000 n 0000121285 00000 n 0000124090 00000 n 0000123978 00000 n 0000122587 00000 n 0000126283 00000 n 0000126171 00000 n 0000124230 00000 n 0000127382 00000 n 0000129919 00000 n 0000127270 00000 n 0000126400 00000 n 0000129815 00000 n 0000131525 00000 n 0000131413 00000 n 0000130068 00000 n 0000422342 00000 n 0000134194 00000 n 0000133120 00000 n 0000133008 00000 n 0000131677 00000 n 0000137901 00000 n 0000134082 00000 n 0000133236 00000 n 0000137795 00000 n 0000139240 00000 n 0000139128 00000 n 0000138074 00000 n 0000140345 00000 n 0000143551 00000 n 0000140233 00000 n 0000139368 00000 n 0000143432 00000 n 0000145381 00000 n 0000145269 00000 n 0000143700 00000 n 0000146422 00000 n 0000146310 00000 n 0000145521 00000 n 0000422459 00000 n 0000147670 00000 n 0000149281 00000 n 0000147558 00000 n 0000146527 00000 n 0000149178 00000 n 0000151031 00000 n 0000150919 00000 n 0000149442 00000 n 0000151907 00000 n 0000157640 00000 n 0000151781 00000 n 0000151171 00000 n 0000157204 00000 n 0000159453 00000 n 0000159341 00000 n 0000157770 00000 n 0000164811 00000 n 0000161253 00000 n 0000161141 00000 n 0000159570 00000 n 0000163348 00000 n 0000163236 00000 n 0000161381 00000 n 0000422576 00000 n 0000164318 00000 n 0000164206 00000 n 0000163500 00000 n 0000169257 00000 n 0000164699 00000 n 0000164435 00000 n 0000169155 00000 n 0000170365 00000 n 0000172356 00000 n 0000170253 00000 n 0000169371 00000 n 0000172249 00000 n 0000174190 00000 n 0000174078 00000 n 0000172505 00000 n 0000176120 00000 n 0000176008 00000 n 0000174342 00000 n 0000177782 00000 n 0000177670 00000 n 0000176236 00000 n 0000422693 00000 n 0000180398 00000 n 0000180286 00000 n 0000177851 00000 n 0000183061 00000 n 0000182949 00000 n 0000180467 00000 n 0000185580 00000 n 0000185468 00000 n 0000183130 00000 n 0000188132 00000 n 0000188020 00000 n 0000185649 00000 n 0000190759 00000 n 0000190647 00000 n 0000188201 00000 n 0000193319 00000 n 0000193207 00000 n 0000190828 00000 n 0000422810 00000 n 0000195824 00000 n 0000195712 00000 n 0000193388 00000 n 0000198330 00000 n 0000198218 00000 n 0000195893 00000 n 0000200782 00000 n 0000200670 00000 n 0000198399 00000 n 0000203257 00000 n 0000203145 00000 n 0000200851 00000 n 0000204909 00000 n 0000204797 00000 n 0000203326 00000 n 0000207253 00000 n 0000207141 00000 n 0000204978 00000 n 0000422927 00000 n 0000208842 00000 n 0000208730 00000 n 0000207333 00000 n 0000208911 00000 n 0000209032 00000 n 0000209055 00000 n 0000209146 00000 n 0000209770 00000 n 0000209941 00000 n 0000210403 00000 n 0000211066 00000 n 0000211203 00000 n 0000211594 00000 n 0000211993 00000 n 0000212428 00000 n 0000213072 00000 n 0000213097 00000 n 0000213122 00000 n 0000213524 00000 n 0000213971 00000 n 0000214286 00000 n 0000231590 00000 n 0000231933 00000 n 0000247881 00000 n 0000248238 00000 n 0000258539 00000 n 0000258788 00000 n 0000261942 00000 n 0000262171 00000 n 0000269777 00000 n 0000270003 00000 n 0000278079 00000 n 0000278308 00000 n 0000302740 00000 n 0000303260 00000 n 0000314318 00000 n 0000314610 00000 n 0000324376 00000 n 0000324624 00000 n 0000338746 00000 n 0000339040 00000 n 0000346043 00000 n 0000346263 00000 n 0000353262 00000 n 0000353482 00000 n 0000360585 00000 n 0000360811 00000 n 0000370786 00000 n 0000371061 00000 n 0000379531 00000 n 0000379854 00000 n 0000396669 00000 n 0000397010 00000 n 0000418558 00000 n 0000423012 00000 n 0000423126 00000 n 0000423244 00000 n 0000423321 00000 n 0000423399 00000 n 0000423452 00000 n trailer << /Size 341 /Root 339 0 R /Info 340 0 R /ID [ ] >> startxref 423719 %%EOF Chart-2.4.6/TODO0000755000175000017500000000355311447423127012624 0ustar reinerreinerShort term: ----------- - Composite: When using bars in both, an option is necessary to define whether to put the bars above each other or to put aside. Add an option to start x-ticks at the left (i.e. 0 point) side and end at the right side - Reorganize the relationship between autoscale, y_ticks, min_y_ticks, max_y_ticks, xy_plot, integer_ticks_only, skip_int_ticks, min_val, max_val and document it. (At the moment the autoscale is used as the default) - Include Skyplot (Direction->polar) into the distribution - Add an option to lines, linespoints to start at (0,0) point not only if option xy_plot is active - Add chart type candlestick - Correct pie chart: - Add a flat pie chart where the legend appears on the left of the chart, and the chart itself is about 50% smaller - Base class: - Some labels on the top of each axis not printed: i.e., the graph goes to 100.6 but 100.6 is not printed. - Define an option to force the first point sits at the left border of the graph, and the last point sits at the right border, without any spaces. - Bars chart: - User would like to override the color of specific bars in a Chart::Bars graph. - Program should croak if a color is not defined for a bar. - Within one Bar graph, I have two datasets, but would like to change the width of one of them (it should have a width of 1, to indicate a limit). - Composite chart: - Define different brush_sizes for example with one Lines dataset and one LinesPoints dataset. - Add output for png without header as modperl generates the headers by itsself. - Add output for gif again as the new GD module defines it again. Long term: ---------- - 3-D charts - include TrueType fonts as soon as GD supports it - include logarithmic x- and y-axis - Let plot arbitrary xy-functions in a defined area, like y=sin(1/x)+2*x Chart-2.4.6/README0000644000175000017500000002256612033067404013010 0ustar reinerreiner------------------------------------------------------------------------ Chart version 2.4.6 ------------------------------------------------------------------------ ---------- INSTALLING ---------- The usual. perl Makefile.PL make make test make install This should install to your site_perl directory. The test scripts also put samples of the different charts in the samples/ directory. ------------- PREREQUISITES ------------- Lincoln Stein's GD module version 2.0.36 or higher. ------- CHANGES ------- 2.4.6 Number of named colors extended Documentation.pdf explains the use of colors (Appendix added) Corrections in base.pm, routines _draw_bottom_legends, _draw_x_number_ticks in LinesPoints.pm, routines _draw_data 2.4.5 Typo in _draw_x_ticks corrected Methods scalar_png(), scalar_jpeg() corrected for result. Test routine t/scalarImage.t added Chart.pod corrected 2.4.4 The brush styles to points and linespoints are extended. Not only circles represent the points but a number of different brush styles, linke donut, Star and so on. 2.4.3 Corrections to imagemap production in Composite.pm and Lines.pm 2.4.2 Changes done by R. Dassing, Michael Potter Base.pm: The values for 'true' resp. 'false' may be of the following true: TRUE, true, T, t, 1 and defined false: FALSE, false, F, f, 0 or undefined Base.pm: Added new options xlabel and xrange which is valid for xy_plot and Chart::Lines, Chart::Points, Chart::LinesPoints, Chart::Split, Chart::ErrorBars. In order to use the labels, the chart module needs to have 'xlabels' AND 'xrange' set. Below is some example code for use: @labels = (['Jan', 'Feb','Mar'], ['10','40','70']); $chart->set( xlabels => \@labels, xrange => [0,100] ); This options allow to set and position labels at the x-axis arbitrary. add_dataset() and app_pt() accepts now datasets as lists and as references to list like already mentioned in the docs Pie.pm: Optimized organisation of the placement of the labels. Added flag to avoid plotting of legends at all Using GD Version 2.0.36 as this version supports 'filledArc' Composite.pm: Correction due to Request 23166 write the endmost value of input array in imagemap_data array Lines.pm: Correction due to Request 23166: write the endmost value of input array in imagemap_data array 2.4.1 Changes done by Christine Zilker, Gerhard Stuhlpfarrer, R. Dassing Added new Options: ring Draw a ring instead of a Pie legend_lines Connect Pie and the description with a line stepline Connect Lines and LinesPoints by a stepped line stepline_mode (thanks to Gerhard Stuhlpfarrer) brush_size1 Define Brush Size for Composite 1 brush_size2 and 2 Color problem in Pie fixed Positioning of the description optimized in Pie Division by zero problem fixed in Pie Module 'Bars' checks for numeric data a input on y-axis New Function added to Base: minimum - determine minimal value of an array of numeric values maximum - determine maximal value of an array of numeric values arccos - arccos arcsin - arcsin Some small bugs corrected: Base::_find_y_scale Base::_find_y_range : check for numeric values Base::_find_x_range : check for numeric values Latex sources for documentation included (We hope to get a better documentation be a native english speaking person) 2.3 Changes done by Christine Zilker: Added new Options: in Composite: legend_example_height changes thickness of the lines in the legend, f_y_tick1, f_y_tick2 analog to f_y_tick used for right and left y-axes in Direction: pairs Added the possibility to add more datasets in Chart::Direction Fixed "label space" problem in Pie Fixed dataset order (in the legend) in StackedBars Fixed problem of getting the right values if round2Tick is used Fixed problem of datavalues in _find_y_scale Some minor bugfixes Update of the Documentation (Documentation.pdf) The requested support of TruType fonts was currently dropped due to missing support in GD.pm (even in new versions) The print out of some hints and warnings where deleted not to confuse the user. 2.2: Composite.pm: imagemap_dump() repaired. 2.1: Changes done by Markus Brandl: new Modules added: ErrorBars.pm, HorizontalBars.pm, Pareto.pm, Pie.pm, Split.pm and Direction.pm Subdirectory "doc" contains a Acrobat Reader Documentation.pdf file. Function add_datafile() added. It is now possible to add a complete datafile. Added new Options: precision, xy_plot, min_x_ticks, max_x_ticks, skip_y_ticks, skip_int_ticks, legend_label_value, y_axes, scale, interval, start, interval_ticks, sort, same_error, point, line, arrow, angle_interval, min_circles, max_circles Also added: the 'title' and 'x_label' options in the colors option Documentation (Documentation.pdf) added. _find_x_scale, _find_x_range and _draw_x_number_ticks added to make xy_plots possible. _sort_data has now a body. Fixed integer ticks problem by adding the skip_int_ticks option Fixed f_x_ticks and f_y_ticks problem in Composite Fixed negative value problem in Bars Fixed min_val and max_val problem in draw_data function of all modules: Now, Chart plots the data only if the data is in the area of min_val and max_val! The border of bars in Bars, HorizontalBars and StackedBars will be plotted pink (not misccolor) if the data isn't in the min_val-max_val interval. Fixed custom_x_ticks problem in _draw_x_ticks Some other bugfixes. Updates in _find_y_scale, _round2tick, _calcTickInterval 1.1: Changes done by David Pottage: Plot scales can now have any magnitude. It does not matter if the data covers a range of 100000000000 units or 0.00000000001 units, the scale will be correctly calculated. Ticks on plot scales are now plotted on 'round' numbers. The number & spacing of ticks is chosen based on the data range. False zero graphs are now explicitly supported, and will be generated if the data range merits it. The instance field 'include_zero' should be set to zero to suppress this. Added: include_zero, min_y_ticks, max_y_ticks, integer_ticks_only 1.0.1: Fixed _draw_bottom_legend in Base.pm 0.99c-pre3 - 1.0: Fixed _draw_data in Lines.pm: lines are limited to the frame Added f_x_tick, f_y_tick Added jpeg(), cgi_jpeg() to produce the format jpeg Delete GIF support, added PNG and JPEG instead 0.99b - 0.99c-pre3: James F Miner : Added Mountain chart type Added Patterns. See t/mountain.t for details Bugfix for drifting x tick Improved internal color handling Richard Dice : Added brush shapes for Points, LinesPoints Added scalar_gif 0.99a - 0.99b: Fixed left legend in composite charts Fixed no color problem when using composite charts w/ no legend Fixed color handling for datasets Added option for http header Pragma: no-cache Netscape 4.5 has a bug that breaks it, but it works with other browsers. Any ideas for a workaround? 0.99 - 0.99a: Added use of undef() values to represent 'no data' for line breaks Added ylabel*_color options Added x_grid_lines, y_grid_lines & y2_grid_lines , and color options for each Cache disabling in cgi header: Reiner Nippes Restored grid_lines option: Heinz-Guenter Kontny Fixed a typo that broke imagemap data storage in Lines charts 0.94 - 0.99: Modified the 'title' option to correctly process newlines Deprecated the 'subtitle' option, will remove it in next release Changed the API for specifying colors Added support for printing to file handles Added Chart::Composite Added 'spaced_bars' to make it easy to differentiate the bars Added 'grey_background' to make plot background grey Added support for negative values in the datasets Added methods to remember and dump imagemap pixel information Included rgb.txt with distribution for WinXX users 0.93 - 0.94: Moved the legend down to be flush with the chart Fixed the long decimal y-tick label problem Fixed (for the last time, hopefully) the pre-5.004 compilation problem Fixed handling of undefined data points Added more colors for the default data colors Added the transparent gif option Added the option for user-specified colors Added the grid_lines option 0.92 - 0.93: Fixed the sort problem Fixed the y-axis label centering problem Fixed pre-5.004 compilation problem Added StackedBars charts ------ MAINTAINER ------ Chart-Group (chart@fs.wettzell.de) --------- COPYRIGHT --------- Copyright(c) 1997-1998 David Bonner, 1999 Peter Clark, 2001-2012 Chart-Group at BKG. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Chart-2.4.6/t/0000755000175000017500000000000012033074620012356 5ustar reinerreinerChart-2.4.6/t/direction_1.t0000644000175000017500000000126612033071314014745 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Direction; print "1..1\n"; $g = Chart::Direction->new( 500, 500 ); my @labels = ( 'eins', 'zwei', 'drei', ); $g->add_dataset( 0, 10, 30, 100, 110, 200, 250, 300, 350 ); $g->add_dataset( 10, 4, 11, 40, 20, 35, 5, 45, 20 ); $g->add_dataset( 29, 49, 20, 17, 30, 42, 45, 25, 30 ); $g->add_dataset( 40, 35, 25, 30, 42, 20, 32, 16, 5 ); $g->set( 'title' => 'Direction Demo', 'grey_background' => 'false', 'line' => 'true', 'precision' => 0, 'legend_labels' => \@labels, 'legend' => 'bottom', # 'polar' => 'true', ); $g->png("samples/direction_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints_4.t0000644000175000017500000000265412033071315015342 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::LinesPoints; print "1..1\n"; my $g = Chart::LinesPoints->new( 700, 350 ); my @bezugszeitraum = ( '2005-04-02', '2005-04-03', '2005-04-04', '2005-04-05', '2005-04-06', '2005-04-07', '2005-04-08', '2005-04-09', '2005-04-10', '2005-04-11', '2005-04-12', '2005-04-13', '2005-04-14', '2005-04-15', '2005-04-16', '2005-04-17', '2005-04-18', '2005-04-19', '2005-04-20', '2005-04-21', '2005-04-22', '2005-04-23', '2005-04-24', '2005-04-25' ); my @clock_reset = ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); #my @clock_reset = (10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10); $g->add_dataset(@bezugszeitraum); $g->add_dataset(@clock_reset); $g->set( 'x_ticks' => 'vertical' ); $g->set( 'x_label' => 'Time' ); $g->set( 'y_label' => 'Number of clock resets' ); $g->set( 'legend' => 'none' ); $g->set( 'precision' => 1 ); $g->set( 'title' => 'AURI' ); $g->set( 'sub_title' => '2005-04-01 --- 2005-04-25' ); # $g-> set ('title_font' => 'gdGiantFont'); # $g-> set ('sub_title_font' => 'gdMediumBoldFont'); $g->set( 'grey_background' => 'false' ); # $g-> set ('include_zero' => 'true'); # $g-> set ('min_val' => '0'); $g->set( 'pt_size' => '10' ); $g->set( 'brush_size' => '4' ); # $g-> set ('skip_x_ticks' => $skip_x); # $g-> set ('integer_ticks_only' => 'true'); $g->png("samples/linespoints_4.png"); print "ok 1\n\n"; Chart-2.4.6/t/linespoints_3.t0000644000175000017500000000251512033071315015335 0ustar reinerreiner#!/usr/bin/perl -w use Chart::LinesPoints; use strict; print "1..1\n"; my ( @data1, @data2, @data4, @data3, @labels, %hash, $g, $hits ); @labels = qw(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17); @data1 = qw (-7 -5 -6 -8 -9 -7 -5 -4 -3 -2 -4 -6 -3 -5 -3 -4 -6); @data2 = qw (-1 -1 -1 -1 -2 -2 -3 -3 -4 -4 -6 -3 -2 -2 -2 -1 -1); @data3 = qw (-4 -4 -3 -2 -1 -1 -1 -2 -1 -1 -3 -2 -4 -3 -4 -2 -2); @data4 = qw (-6 -3 -2 -3 -3 -3 -2 -1 -2 -3 -1 -1 -1 -1 -1 -3 -3); $g = Chart::LinesPoints->new( 600, 300 ); $g->add_dataset(@labels); $g->add_dataset(@data1); $g->add_dataset(@data2); $g->add_dataset(@data3); $g->add_dataset(@data4); %hash = ( 'integer_ticks_only' => 'true', 'title' => 'Soccer Season 2002\n ', 'legend_labels' => [ 'NY Soccer Club', 'Denver Tigers', 'Houston Spacecats', 'Washington Presidents' ], 'y_label' => 'position in the table', 'x_label' => 'day of play', 'grid_lines' => 'true', 'f_y_tick' => \&formatter, 'xy_plot' => 'false', ); $g->set(%hash); $g->png("samples/linespoints_3.png"); #just a trick, to let the y scale start at the biggest point: #initiate with negativ values, remove the minus sign! sub formatter { my $label = shift; $label = substr( $label, 1, 2 ); return $label; } print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_3.t0000644000175000017500000000534312033071314014771 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::Composite; #(type is one of: Points, Lines, Bars, LinesPoints, Composite, StackedBars, Mountain) print "1..1\n"; my $obj = Chart::Composite->new( 800, 600 ); #Breite, Hhe my @legend_ary; my ( $legend, @zeile ); my @all_aryref; open( OUT, ">samples/composite_3.png" ) or die "kann Datei nicht schreiben\n"; my $i = 0; my $e = 0; my $max_val = 0; while () { if ( $_ =~ /EOF/i ) { last; } chomp; $i++; ( $legend, @zeile ) = split /\|/, $_; $obj->add_dataset(@zeile); if ( $i != 1 ) { push @legend_ary, $legend; # Erste Zeile ist die x-Achsenbezeichnung und gehrt nicht zur Legende for ( 0 .. $#zeile ) { $zeile[$_] > $max_val ? $max_val = $zeile[$_] : 1; } # den Maximalen Wert ermitteln } $all_aryref[ $e++ ] = [@zeile]; } if ( $max_val =~ /^\d+$/ ) { $max_val = 100 * int( 1 + $max_val / 100 ); } # den Scalenwert die nchste 100er Stellen setzen # Der zweite Charttyp berdeckt immer den ersten $obj->set( 'legend' => "top", 'legend_labels' => \@legend_ary, 'x_ticks' => "vertical", 'composite_info' => [ [ 'StackedBars', [ 8, 7, 6, 5 ] ], [ 'Bars', [ 1, 2, 3, 4, 9 ] ], ], 'same_y_axes' => "true", 'y_label' => "Anzahl", 'max_val1' => $max_val, 'max_val2' => $max_val, 'space_bars' => 1, 'brush_size' => 10, 'legend_example_height' => 'true', 'legend_example_height0..3' => '50', 'legend_example_height4..8' => '4', ); $obj->png( \*OUT ); print "ok 1\n"; close OUT; exit 0; __END__ Datum|01.09.2003|02.09.2003|03.09.2003|04.09.2003|05.09.2003|06.09.2003|07.09.2003|08.09.2003|09.09.2003|10.09.2003|11.09.2003|12.09.2003|13.09.2003|14.09.2003|15.09.2003|16.09.2003|17.09.2003|18.09.2003|19.09.2003|20.09.2003|21.09.2003|22.09.2003 Anzahl gesamt|322|244|227|223|167|216|290|277|206|237|256|214|192|228|218|225|146|172|140|123|174|173 Anzahl Stufe 1 bis 4 gesamt|226|173|159|145|109|148|204|188|133|184|176|137|132|157|139|155|106|115|93|76|107|106 Anzahl JL|77|46|44|61|41|54|69|63|63|38|71|68|54|59|71|61|34|40|42|38|56|57 Anzahl DL|19|25|24|17|17|14|17|26|10|15|9|9|6|12|8|9|6|17|5|9|11|10 Anzahl 1. Stufe|28|22|11|27|15|23|28|23|17|24|24|20|19|24|23|30|20|18|12|10|14|29 Anzahl 2. Stufe|12|11|4|7|8|6|16|12|8|11|10|8|4|8|3|6|7|6|5|7|8|13 Anzahl 3. Stufe|50|39|55|34|16|33|38|40|36|38|48|29|35|42|36|42|28|25|20|19|24|19 Anzahl 4. Stufe|136|101|89|77|70|86|122|113|72|111|94|80|74|83|77|77|51|66|56|40|61|45 Anzahl Formulars|547|352|249|174|138|157|262|180|136|132|94|72|59|129|88|60|61|51|42|44|79|57 EOF Chart-2.4.6/t/hbars_2.t0000644000175000017500000000202212033071315014055 0ustar reinerreiner#!/usr/bin/perl -w use Chart::HorizontalBars; print "1..1\n"; $g = Chart::HorizontalBars->new( 500, 400 ); $g->add_dataset( 'Foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( -4, 3, -4, -5.4, -2 ); $g->add_dataset( 2.2, 10, -3, 8, 3 ); $g->add_dataset( -10, 2, 4, -3, -3 ); $g->add_dataset( 7, -5, -3, 4, 7 ); %hash = ( 'transparent' => 'true', 'y_axes' => 'both', 'title' => 'Hirizontal Bars Demo', 'y_grid_lines' => 'true', 'x_label' => 'x-axis', 'y_label' => 'y-axis', 'y_label2' => 'y-axis', 'tick_len' => '5', 'x_ticks' => 'vertical', 'grid_lines' => 'true', 'colors' => { 'text' => [ 100, 0, 200 ], 'y_label' => [ 2, 255, 2 ], 'y_label2' => [ 2, 255, 2 ], 'y_grid_lines' => [ 255, 255, 255 ], 'x_grid_lines' => [ 255, 255, 255 ], }, ); $g->set(%hash); $g->png("samples/hbars_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints_7.t0000644000175000017500000000207212033071316015340 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::LinesPoints; use Chart::Lines; print "1..1\n"; my @bezugszeitraum = ( '2004-06-13 00:00:00+00', '2004-06-14 00:00:00+00', '2004-06-15 00:00:00+00', '2004-06-16 00:00:00+00', '2004-06-17 00:00:00+00' ); my @obsepoch = ( 81.8670764502497, 42.4188998589563, 100, 0.9652898299202, 12.9652898299202 ); my $g = Chart::LinesPoints->new( 700, 450 ); #my $g = Chart::Lines->new(700,450); $g->add_dataset(@bezugszeitraum); $g->add_dataset(@obsepoch); $g->set( 'x_ticks' => 'staggered' ); $g->set( 'x_label' => ' Time' ); $g->set( 'y_label' => 'actual_nr_of_obsepoch / possible_nr' ); $g->set( 'legend' => 'none' ); $g->set( 'precision' => 0 ); $g->set( 'title' => 'Station Test' ); $g->set( 'grey_background' => 'false' ); $g->set( 'max_val' => '100' ); $g->set( 'min_val' => '0' ); $g->set( 'pt_size' => '10' ); $g->set( 'brush_size' => '3' ); $g->set( 'stepline' => 'true' ); $g->png("samples/linespoints_7.png"); print "ok 1\n\n"; Chart-2.4.6/t/split_1.t0000644000175000017500000000114212033071317014114 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Split; use strict; print "1..1\n"; my ( $x, $y, @x, @y, %hash ); my $g = Chart::Split->new(); for ( my $i = 0 ; $i < 60 ; $i += .05 ) { $y = sin($i); $x = $i; push @x, $x; push @y, $y; } $g->add_dataset(@x); $g->add_dataset(@y); %hash = ( 'start' => 0, 'interval' => 20, 'interval_ticks' => 21, 'brush_size' => 1, 'legend' => 'none', 'title' => 'f(x) = sin x', 'precision' => 0, 'y_grid_lines' => 'true', ); $g->set(%hash); $g->png("samples/split_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_5.t0000644000175000017500000000072512033071314014772 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Composite; print "1..1\n"; $g = Chart::Composite->new( 750, 600 ); $g->add_dataset( 1, 2, 3 ); $g->add_dataset( 10, 20, 30 ); $g->add_dataset( 15, 25, 32 ); $g->add_dataset( 7, 24, 23 ); $g->add_dataset( 0.1, 0.5, 0.9 ); $g->set( 'title' => 'Composite Chart Test 2', 'composite_info' => [ [ 'Bars', [ 1 .. 3 ] ], [ 'LinesPoints', [4] ] ] ); $g->png("samples/composite_5.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/scalarImage.t0000644000175000017500000000373612033071317014764 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; # bytewise comparision of scalar sub imgCompare { my $scalarImage = shift; my $fileName = shift; my $result = 0; # assume error # do a bytewise compare if ( !open( FH, $fileName ) ) { return $result; } my $idx = 0; my $fileChar = ''; my $scalarChar = ''; my $bEqual = 1; while ( read FH, $fileChar, 1, $idx ) { my $length = length $fileChar; if ( $length > 1 ) { my $c = substr $scalarImage, $length - 1, 1; $fileChar = $c; } $scalarChar = substr $scalarImage, $idx, 1; if ( $scalarChar ne $fileChar ) { $bEqual = 0; last; } $idx++, $fileChar = ''; } close FH; $result = $bEqual; return $result; } my $g; print "1..1\n"; $g = Chart::Lines->new( 600, 400 ); $g->add_dataset( 'foo', 'bar', 'whee', 'ding', 'bat', 'bit' ); $g->add_dataset( 3.2, 4.34, 9.456, 10.459, 11.24234, 14.0234 ); $g->add_dataset( -1.3, 8.4, 5.34, 3.234, 4.33, 13.09 ); $g->add_dataset( 5, 7, 2, 10, 12, 2.3445 ); $g->set( 'title' => 'LINES' ); $g->set( 'sub_title' => 'Lines Chart' ); $g->set( 'colors' => { 'y_label' => [ 0, 0, 255 ], y_label2 => [ 0, 255, 0 ], 'y_grid_lines' => [ 127, 127, 0 ], 'dataset0' => [ 127, 0, 0 ], 'dataset1' => [ 0, 127, 0 ], 'dataset2' => [ 0, 0, 127 ] } ); $g->set( 'y_label' => 'y label 1' ); $g->set( 'y_label2' => 'y label 2' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'bottom' ); my $FileName = "samples/scalarImage.png"; $g->png($FileName); my $dataref = $g->get_data(); my $scalarimage = $g->scalar_png($dataref); if ( imgCompare( $scalarimage, $FileName ) ) { unlink $FileName; print "ok 1\n"; exit(0); } unlink $FileName; print "Error 1\n"; exit(1); Chart-2.4.6/t/split_2.t0000644000175000017500000000167012033071317014123 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Split; print "1..1\n"; $g = Chart::Split->new( 500, 500 ); $last = 0; # create arrays of data for ( 1 .. 4000 ) { srand( time() / $_ * 50 ); #intialize the random number generator $y1 = ( rand(10) ); #generate the number push( @x, $_ ); #add the x-values push( @y1, $y1 ); #add the random number push( @y2, abs( $y1 - $last ) ); #add the difference to the last number $last = $y1; } $g->add_dataset(@x); $g->add_dataset(@y1); $g->add_dataset(@y2); %options = ( 'start' => 0, 'interval' => 400, 'brush_size' => 1, 'interval_ticks' => 0, 'title' => "Random Numbers Test", 'legend_labels' => [ 'random numbers', 'difference' ], 'x_label' => "4000 Random Numbers", 'legend' => 'bottom', ); $g->set(%options); $g->png("samples/split_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_2.t0000644000175000017500000000305112033071314013707 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; print "1..1\n"; $g = Chart::Bars->new( 600, 500 ); $g->add_dataset( 'Berlin', 'Paris', 'Rome', 'London', 'Munich' ); $g->add_dataset( 14, 5, 4, 5, 11 ); $g->add_dataset( 12, 4, 6, 7, 12 ); $g->add_dataset( 18, 2, 3, 3, 9 ); $g->add_dataset( 17, 5, 7, 6, 6 ); $g->add_dataset( 15, 3, 4, 5, 11 ); $g->add_dataset( 11, 6, 5, 6, 12 ); $g->add_dataset( 12, 1, 4, 5, 15 ); $g->add_dataset( 10, 4, 6, 8, 10 ); $g->add_dataset( 14, 5, 4, 5, 11 ); $g->add_dataset( 12, 4, 6, 6, 12 ); $g->add_dataset( 18, 2, 3, 3, 9 ); $g->add_dataset( 17, 5, 7, 2, 6 ); %hash = ( 'title' => 'Sold Cars in 2001', 'x_label' => 'City', 'y_label' => 'Number of Cars', 'legend' => 'bottom', 'legend_labels' => [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ], 'grid_lines' => 'true', 'include_zero' => 'true', 'max_val' => '20', 'colors' => { 'title' => 'red', 'x_label' => 'blue', 'y_label' => 'blue', 'background' => 'grey', 'text' => 'blue', }, ); $g->set(%hash); $g->png("samples/bars_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars.t0000644000175000017500000000235012033071314013467 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; print "1..1\n"; $g = Chart::Bars->new( 600, 600 ); $g->add_dataset( 'foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( 30000, 40000, 80000, 50000, 90000 ); $g->add_dataset( 80000, 60000, 30000, 30000, 40000 ); $g->add_dataset( 50000, 70000, 20200, 80000.8, 40000 ); %hash = ( 'transparent' => 'true', 'precision' => 1, 'title' => 'Bars\nChartmodul', 'y_grid_lines' => 'true', 'graph_border' => '4', 'min_val' => '0', 'text_space' => '2', 'sub_title' => 'Untertitel', 'x_label' => 'X-Achse', 'y_label' => 'Y-Achse', 'y_label2' => 'Y-Achse2', 'legend' => 'none', 'tick_len' => '3', 'x_ticks' => 'vertical', 'include_zero' => 'true', 'pt_size' => '7', 'skip_x_ticks' => '1', 'grid_lines' => 'true', 'colors' => { 'text' => [ 100, 0, 200 ], 'y_label' => [ 2, 255, 2 ], 'y_label2' => [ 2, 255, 2 ], 'y_grid_lines' => 'black', 'x_grid_lines' => 'black', 'dataset0' => [ 255, 20, 147 ], }, 'y_ticks' => '20', ); $g->set(%hash); $g->png("samples/bars.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pareto_1.t0000644000175000017500000000162012033071316014253 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pareto; print "1..1\n"; $g = Chart::Pareto->new( 450, 400 ); $g->add_dataset( 'Mo', 'Tue', 'We', 'Th', 'Fr', 'Sa', 'Su' ); $g->add_dataset( 2500, 1000, 250, 700, 100, 610, 20 ); %hash = ( 'colors' => { 'dataset0' => 'green', 'dataset1' => 'red', 'x_label' => 'red', 'y_grid_lines' => 'white', 'title' => 'blue', }, 'title' => 'Sold Tickets for Beethovens 9th\n ', 'integer_ticks_only' => 'true', 'skip_int_ticks' => 250, 'sort' => 'true', 'max_val' => 5500, 'y_grid_lines' => 'true', 'y_label' => 'Sold Tickets', 'x_label' => '! sold out in the first week !', 'spaced_bars' => 'false', 'legend' => 'none', ); $g->set(%hash); $g->png("samples/pareto_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pareto_3.t0000644000175000017500000000143312033071316014257 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pareto; print "1..1\n"; $g = Chart::Pareto->new( 450, 400 ); $g->add_dataset( 'Mo', 'Tue', 'We', 'Th', 'Fr', 'Sa', 'Su' ); $g->add_dataset( 3000, 1600, 1500, 400, 100, 20, 5 ); %hash = ( 'colors' => { 'dataset0' => 'green', 'dataset1' => 'red', 'x_label' => 'red', 'y_grid_lines' => 'white', 'title' => 'blue', }, 'title' => 'Pareto Chart ', 'integer_ticks_only' => 'true', 'precision' => 0, 'skip_int_ticks' => 400, 'sort' => 'true', # 'max_val' => 6800, 'y_grid_lines' => 'true', 'spaced_bars' => 'false', 'legend' => 'none', ); $g->set(%hash); $g->png("samples/pareto_3.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_9.t0000644000175000017500000000115212033071317013547 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; print "1..1\n"; my $g = Chart::Pie->new( 550, 500 ); $g->add_dataset( 'eins', 'zwei', 'drei', 'vier' ); $g->add_dataset( 0, 0, 0, 0 ); $g->set( 'title' => 'Pie Demo Chart' ); $g->set( 'sub_title' => 'Only a circle, as all values are zero' ); $g->set( 'label_values' => 'percent' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'bottom' ); $g->set( 'grey_background' => 'false' ); $g->set( 'legend_lines' => 'false' ); $g->png("samples/pie_9.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_8.t0000644000175000017500000000145712033071317013556 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; print "1..1\n"; my $g = Chart::Pie->new( 550, 500 ); $g->add_dataset( 'eins', 'zwei', 'drei', 'vier' ); $g->add_dataset( 25, 80, 120, 50 ); $g->set( 'title' => 'Pie Demo Chart' ); $g->set( 'label_values' => 'percent' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'bottom' ); $g->set( 'grey_background' => 'false' ); $g->set( 'ring' => 0.9 ); $g->set( 'legend_lines' => 'true' ); $g->set( 'x_label' => '' ); $g->set( 'colors' => { 'misc' => 'light_blue', 'dataset1' => 'red', 'dataset2' => 'blue', 'dataset0' => 'yellow', 'dataset3' => 'green' } ); $g->png("samples/pie_8.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_5.t0000644000175000017500000000126712033071314013721 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; use strict; print "1..1\n"; my ( @data, @labels, %hash, $g, $hits ); # create an array of labels for ( 1 .. 49 ) { push( @labels, $_ ); } # create an array of data for ( 1 .. 49 ) { srand( time() / $_ ); $hits = int( rand(100) + 401 ); push( @data, $hits ); } $g = Chart::Bars->new( 700, 300 ); $g->add_dataset(@labels); $g->add_dataset(@data); %hash = ( 'legend' => 'none', 'precision' => 0, 'x_ticks' => 'vertical', 'title' => 'Lottozahlenverteilung', 'y_label' => 'Hufigkeit', 'y_grid_lines' => 'true', ); $g->set(%hash); $g->png("samples/bars_5.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints_5.t0000644000175000017500000000443312033071315015340 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::Composite; print "1..1\n"; my $g = Chart::Composite->new( 700, 350 ); my @bezugszeitraum = ( '2005-04-02', '2005-04-03', '2005-04-04', '2005-04-05', '2005-04-06', '2005-04-07', '2005-04-08', '2005-04-09', '2005-04-10', '2005-04-18', '2005-04-19', '2005-04-20', '2005-04-21', '2005-04-22', '2005-04-23', '2005-04-24', '2005-04-25' ); my @nr_of_sats = ( 27, 29, 28, 26, 27, 23, 29, 29, 23, 26, 29, 29, 29, 29, 29, 29, 29 ); my @obsinterval_abs = ( 0.555555555555556, 0.999652777777778, 0.673611111111111, 0.607291666666667, 0.638888888888889, 0.361111111111111, 0.999652777777778, 0.999652777777778, 0.377083333333333, 0.51875, 0.84375, 0.977777777777778, 0.999652777777778, 0.999652777777778, 0.999652777777778, 0.999652777777778, 0.999652777777778 ); #my @obsinterval_abs = (0.555555555555556,0.999652777777778, # 0.673611111111111,500, # 0.638888888888889,0.361111111111111, # 0.999652777777778,0.999652777777778, # 0.377083333333333,0.51875, # -500, 0.977777777777778, # 0.999652777777778,0.999652777777778, # 0.999652777777778,0.999652777777778, # 0.999652777777778); # Chart::Composite # $g = Chart::LinesPoints->new (800, 350); # $g = Chart::LinesPoints->new (700, 350); $g = Chart::Composite->new( 700, 350 ); $g->add_dataset(@bezugszeitraum); $g->add_dataset(@nr_of_sats); $g->add_dataset(@obsinterval_abs); $g->set( 'composite_info' => [ [ 'LinesPoints', [1] ], [ 'LinesPoints', [2] ] ] ); $g->set( 'x_ticks' => 'vertical' ); $g->set( 'x_label' => ' Time' ); $g->set( 'y_label' => 'red: Nr_of_sats' ); # $g-> set ('y_axes' => 'both'); $g->set( 'y_label2' => 'green: obs_interval (absolut)' ); $g->set( 'legend' => 'none' ); $g->set( 'precision' => 1 ); $g->set( 'grey_background' => 'false' ); $g->set( 'title' => 'ANKR' ); $g->set( 'sub_title' => '2005-04-02 - 2005-04-25' ); # $g-> set ('title_font' => gdGiantFont); # $g-> set ('sub_title_font' => gdMediumBoldFont); $g->set( 'include_zero' => 'true' ); $g->set( 'pt_size' => '10' ); $g->set( 'brush_size' => '4' ); # $g-> set ('skip_x_ticks' => $skip_x); $g->png("samples/linespoints_5.png"); print "ok 1\n\n"; Chart-2.4.6/t/pie_6.t0000644000175000017500000000120612033071317013544 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; print "1..1\n"; $g = Chart::Pie->new( 500, 400 ); #$g = Chart::Pie->new; $g->add_dataset( 'Free', 'Reserved', 'Deactivated', 'Leased', 'Unavailable' ); $g->add_dataset( 90, 0, 1, 216, 0 ); %opt = ( 'label_values' => 'none', 'legend_label_values' => 'both', 'legend' => 'right', 'text_space' => 10, 'png_border' => 1, 'graph_border' => 0, 'grey_background' => 'false', 'x_label' => 'Total IPs In Scope 253', ); $g->set(%opt); $g->png("samples/pie_6.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_6.t0000644000175000017500000000214612033071314014772 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Composite; use strict; print "1..1\n"; my @labels = qw (06:00-10:00 10:00-14:00 14:00-18:00 18:00-22:00 22:00-02:00 02:00-06:00); my @chart_data = qw (0 140 160 155 150 145); my @chart_lowlimit = qw (120 120 120 120 120 120); my @chart_hilimit = qw (180 180 180 180 180 180); my $chart = Chart::Composite->new( 500, 300 ); $chart->add_dataset(@labels); $chart->add_dataset(@chart_data); $chart->add_dataset(@chart_lowlimit); $chart->add_dataset(@chart_hilimit); my %chart_settings = ( 'precision' => 0, 'legend' => 'none', 'graph_border' => 0, 'png_border' => 1, 'brush_size1' => 2, 'brush_size2' => 10, 'grid_lines' => 'false', 'y_grid_lines' => 'true', 'composite_info' => [ [ 'LinesPoints', [1] ], [ 'Lines', [ 2, 3 ] ] ], 'colors' => { dataset0 => 'black', dataset1 => 'red', dataset2 => 'red' }, 'sub_title' => 'Average Chart', 'min_val' => 0, 'max_val' => 200 ); $chart->set(%chart_settings); $chart->png("samples/composite_6.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/stackedbars.t0000644000175000017500000000100212033071317015022 0ustar reinerreiner#!/usr/bin/perl -w use Chart::StackedBars; print "1..1\n"; $g = Chart::StackedBars->new( 600, 400 ); $g->add_dataset( 'foo', 'bar', 'junk', 'taco', 'kcufasidog' ); $g->add_dataset( 3, 4, 9, 10, 11 ); $g->add_dataset( 8, 6, 1, 12, 1 ); $g->add_dataset( 5, 7, 2, 13, 4 ); $g->set( 'title' => 'Stacked Bar Chart', 'legend' => 'left', 'grey_background' => 'false', ); $g->png("samples/stackedbars.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_6.t0000644000175000017500000000210312033071315014074 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; print "1..1\n"; $g = Chart::Lines->new(); $g->add_dataset( 'foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( -4, 3, -4, -5, -2 ); $g->add_dataset( 2, 10, -3, 8, 3 ); $g->add_dataset( -10, 2, 4, -3, -3 ); $g->add_dataset( 7, -5, -3, 4, 7 ); %hash = ( 'legend_labels' => [ '1st Quarter', '2nd Quarter', '3rd Quarter', '4th Quarter' ], 'y_axes' => 'both', 'title' => 'Lines Demo', 'grid_lines' => 'true', 'grid_lines' => 'true', 'legend' => 'left', 'legend_example_size' => 20, 'colors' => { 'text' => 'blue', 'misc' => 'blue', 'background' => 'grey', 'grid_lines' => 'light_blue', 'dataset0' => [ 220, 0, 0 ], 'dataset1' => [ 200, 0, 100 ], 'dataset2' => [ 150, 50, 175 ], 'dataset3' => [ 170, 0, 255 ], }, ); $g->set(%hash); $g->png("samples/lines_6.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/mountain_2.t0000644000175000017500000000355112033071316014621 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Mountain; use File::Spec; print "1..2\n"; my $a = ( 10**(-6) ); my @data = ( [ "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th" ], [ ( 3 * $a ), ( 7 * $a ), ( 8 * $a ), ( 2 * $a ), ( 4 * $a ), ( 8.5 * $a ), ( 2 * $a ), ( 5 * $a ), ( 9 * $a ) ], [ ( 4 * $a ), ( 2 * $a ), ( 5 * $a ), ( 6 * $a ), ( 3 * $a ), ( 2.5 * $a ), ( 3 * $a ), ( 3 * $a ), ( 4 * $a ) ], [ ( 7 * $a ), ( 3 * $a ), ( 2 * $a ), ( 8 * $a ), ( 8.5 * $a ), ( 2 * $a ), ( 9 * $a ), ( 4 * $a ), ( 5 * $a ) ], ); my @hex_colors = qw(0099FF 00CC00 FFCC33 FF0099 3333FF); my @colors = map { [ map { hex($_) } unpack( "a2 a2 a2", $_ ) ] } @hex_colors; my @patterns = (); foreach ( 1 .. @data - 1 ) { open( PNG, '<' . File::Spec->catfile( File::Spec->curdir, 'patterns', "PATTERN$_.PNG" ) ) || die "Can't load pattern $_"; push( @patterns, GD::Image->newFromPng( \*PNG ) ); close(PNG); } my @opts = ( {}, { 'x_label' => 'X Label', 'y_label' => 'Y label', 'title' => 'Mountain Chart', 'grid_lines' => 'true', 'colors' => { map { ( "dataset$_" => $colors[$_] ) } 0 .. @colors - 1 }, 'precision' => 6, #'integer_ticks_only' => 'true', }, { 'x_label' => 'X Label', 'y_label' => 'Y label', 'title' => 'Mountain Chart with Patterns', 'grid_lines' => 'true', 'colors' => { map { ( "dataset$_" => $colors[$_] ) } 0 .. @colors - 1 }, 'patterns' => \@patterns, 'precision' => 5, }, ); foreach my $i ( 1 .. @opts - 1 ) { my $newpath = File::Spec->catfile( File::Spec->curdir, 'samples', "mountain_2-$i.png" ); my $opts = $opts[$i]; my $g = new Chart::Mountain(); $g->set(%$opts); my $Image = $g->png( $newpath, \@data ); print "ok $i\n"; } exit(0); Chart-2.4.6/t/pie_11.t0000644000175000017500000000113212033071316013615 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; print "1..1\n"; my $g = Chart::Pie->new( 450, 450 ); $g->add_dataset( 'HOST A', 'HOST B', 'HOST C', 'HOST D', 'HOST E', 'HOST F' ); $g->add_dataset( 5, 2, 1, 2, 9, 12 ); $g->set( 'title' => 'Total Access Attempts' ); $g->set( 'label_values' => 'value' ); $g->set( 'legend_label_values' => 'percent' ); $g->set( 'legend' => 'bottom' ); $g->set( 'grey_background' => 'true' ); $g->set( 'legend_lines' => 'true' ); $g->png("samples/pie_11.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_1.t0000644000175000017500000000171512033071315014077 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; my $g; print "1..1\n"; $g = Chart::Lines->new( 600, 400 ); $g->add_dataset( 'foo', 'bar', 'whee', 'ding', 'bat', 'bit' ); $g->add_dataset( 3.2, 4.34, 9.456, 10.459, 11.24234, 14.0234 ); $g->add_dataset( -1.3, 8.4, 5.34, 3.234, 4.33, 13.09 ); $g->add_dataset( 5, 7, 2, 10, 12, 2.3445 ); $g->set( 'title' => 'LINES' ); $g->set( 'sub_title' => 'Lines Chart' ); $g->set( 'colors' => { 'y_label' => [ 0, 0, 255 ], y_label2 => [ 0, 255, 0 ], 'y_grid_lines' => [ 127, 127, 0 ], 'dataset0' => [ 127, 0, 0 ], 'dataset1' => [ 0, 127, 0 ], 'dataset2' => [ 0, 0, 127 ] } ); $g->set( 'y_label' => 'y label 1' ); $g->set( 'y_label2' => 'y label 2' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'bottom' ); $g->png("samples/lines_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_f.t0000644000175000017500000000170612033071314015053 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Composite; use strict; print "1..1\n"; my $g = Chart::Composite->new; $g->add_dataset( 1, 2, 3, 7, 5, 6 ); $g->add_dataset( 0.1, 0.2, 0.3, 0.2, 0.4, 0.1 ); $g->add_dataset( 0.3, 0.5, 0.2, 0.6, 0.7, 0.4 ); $g->add_dataset( 10, 11, 6, 7, 7, 8 ); $g->set( 'title' => 'Composite Chart', 'composite_info' => [ [ 'Bars', [ 1, 2 ] ], [ 'LinesPoints', [3] ] ] ); $g->set( 'include_zero' => 'true' ); $g->set( 'legend' => 'top' ); $g->set( 'legend_example_height' => 'true', ); $g->set( 'legend_example_height0..1' => '10' ); $g->set( 'legend_example_height2' => '3' ); $g->set( 'f_y_tick' => \&multiply ); $g->set( 'f_x_tick' => \&int_quadrat ); $g->png("samples/composite_f.png"); print "ok 1\n"; exit(0); sub multiply { my $y = shift; return ( $y * 10 ); } sub int_quadrat { my $x = shift; return $x * $x; } Chart-2.4.6/t/points.t0000644000175000017500000000074012033071317014060 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Points; print "1..1\n"; $g = Chart::Points->new(); @hash = ( 'title' => 'Points Chart', 'png_border' => 10, 'pt_size' => 18, 'grid_lines' => 'true', 'brush_size' => 10, # 10 points diameter ); $g->set(@hash); $g->add_dataset( 'foo', 'bar', 'junk' ); $g->add_dataset( 3, 4, 9 ); $g->add_dataset( 8, 6, 0 ); $g->add_dataset( 5, 7, 2 ); $g->png("samples/points.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/mapbars.t0000644000175000017500000000277312033071316014200 0ustar reinerreineruse strict; use Chart::Bars; my $png_name = 'samples/mapbars.png'; my @legend_keys = ( "Actual ", "Goal" ); my $Graph = new Chart::Bars( 600, 400 ); print "1..1\n"; $Graph->add_dataset( "Oct 01", "Nov 01", "Dec 01", "Jan 02", "Feb 02", "Mar 02" ); $Graph->add_dataset( 95.1, 84.4, 90.2, 94.4, 93.8, 95.5 ); $Graph->add_dataset( 93.0, 83.0, 94.0, 94.0, 94.0, 94.0 ); $Graph->set( composite_info => [ [ 'Bars', [1] ], [ 'Lines', [2] ] ], colors => { dataset0 => 'green', dataset1 => 'red' }, title_font => GD::Font->Giant, label_font => GD::Font->Small, legend_font => GD::Font->Large, tick_label_font => GD::Font->Large, grid_lines => 'true', graph_border => 0, imagemap => 'true', legend => 'bottom', legend_labels => \@legend_keys, max_val => 100, min_val => 80, png_border => 4, same_y_axes => 'true', spaced_bars => 'true', title => "Yield 2004", text_space => 5, transparent => 'true', x_ticks => 'vertical', integer_ticks_only => 'true', skip_int_ticks => 5, ); $Graph->png("$png_name"); my $imagemap_data = $Graph->imagemap_dump(); foreach my $ds ( 1 .. 1 ) { foreach my $pt ( 0 .. 5 ) { my @i = @{ $imagemap_data->[$ds]->[$pt] }; # ** print "Dataset:$ds - Point: $pt ---- VALUES: @i \n"; } } print "ok 1\n"; exit 0; Chart-2.4.6/t/composite_7.t0000644000175000017500000000272412033071314014775 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Composite; use Chart::Lines; use Chart::Points; use Chart::LinesPoints; use strict; print "1..1\n"; my @y = qw( 2.6593 2.0832 2.0519 2.2257 2.4355 2.4183 3.4088 2.2899 2.4914 2.3217 2.0684 2.1328 1.8168 1.7662 1.7592 1.8624 1.2614 ); my @x = qw(4757 14055 23004 29698 32172 31038 33068 33383 33941 32451 25235 17035 12122 9868 6647 4024 944); my @x2 = qw(1.706 1.756 1.807 1.858 1.909 1.959 2.010 2.061 2.112 2.162 2.213 2.264 2.315 2.365 2.416 2.467 2.518); my %hash = qw(precision 2 title red text blue include_zero true graph_border 0 y_grid_lines true legend bottom y_axes both skip_x_ticks 1 brush_size 4 brush_size1 4 brush_size2 3 no_cache true *xy_plot true*); $hash{title} = "my title"; my $c = 0; $hash{colors} = { 'dataset0' => [ 255, 0, 0 ], 'dataset1' => [ 0, 0, 255 ], 'dataset2' => [ 173, 170, 61 ], 'dataset3' => [ 242, 2, 249 ], 'dataset4' => [ 254, 177, 192 ], 'y_label' => [ 0, 0, 0 ], 'y_label2' => [ 173, 170, 61 ], }; $hash{brushStyle1} = 'fatPlus'; $hash{brushStyle2} = 'hollowSquare'; my $g; if (0) { $g = Chart::Lines->new( 1000, 400 ); } else { $g = Chart::Composite->new( 1000, 400 ); $g->set( 'composite_info' => [ [ 'Points', [1] ], [ 'LinesPoints', [2] ] ] ); } my @s = sort { $x[$a] <=> $x[$b]; } 0 .. $#x; $g->add_dataset( @x[@s] ); $g->add_dataset( @y[@s] ); $g->add_dataset(@x2); $g->set(%hash); $g->jpeg("samples/composite_7.jpg"); print "ok 1\n"; exit(0); Chart-2.4.6/t/mountain_4.t0000644000175000017500000000377012033071316014626 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Mountain; print "1..1\n"; my $obj = new Chart::Mountain( 1000, 500 ); my @data = ( [ '03/05/2010-00.00', '03/05/2010-00.30', '03/05/2010-01.00', '03/05/2010-01.30', '03/05/2010-02.00', '03/05/2010-02.30', '03/05/2010-03.00', '03/05/2010-03.30', '03/05/2010-04.00', '03/05/2010-04.30', '03/05/2010-05.00', '03/05/2010-05.30', '03/05/2010-06.00', '03/05/2010-06.30', '03/05/2010-07.00', '03/05/2010-07.30', '03/05/2010-08.00', '03/05/2010-08.30', '03/05/2010-09.00', '03/05/2010-09.30', '03/05/2010-10.00', '03/05/2010-10.30', '03/05/2010-11.00', '03/05/2010-11.30', '03/05/2010-12.00', '03/05/2010-12.30', '03/05/2010-13.00', '03/05/2010-13.30', '03/05/2010-14.00', '03/05/2010-14.30', '03/05/2010-15.00', '03/05/2010-15.30', '03/05/2010-16.00', '03/05/2010-16.30', '03/05/2010-17.00', '03/05/2010-17.30', '03/05/2010-18.00', '03/05/2010-18.30', '03/05/2010-19.00', '03/05/2010-19.30', '03/05/2010-20.00', '03/05/2010-20.30', '03/05/2010-21.00', '03/05/2010-21.30', '03/05/2010-22.00', '03/05/2010-22.30', '03/05/2010-23.00', '03/05/2010-23.30' ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ); my @labels = ('ROMA_3'); $obj->set( 'title' => 'Video Server Play Daily Hourly Report', 'grid_lines' => 'true', 'include_zero' => 'true', 'misc' => [ 0, 0, 0 ], 'y_label' => 'Numero Streams', 'x_ticks' => 'vertical', 'precision' => '0', 'integer_ticks_only' => 'true', 'min_val' => 0, ); $obj->set( 'colors' => { 'dataset0' => [ 0, 255, 0 ] }, 'legend_labels' => \@labels, 'tick_label_font' => ( GD::Font->Giant ), 'title_font' => ( GD::Font->Giant ) ); $obj->png( 'samples/mountain_4.png', \@data ); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_6.t0000644000175000017500000000217212033071314013716 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; use strict; print "1..1\n"; my $g = Chart::Bars->new( 580, 300 ); my @data = ( 200202, 200203, 200204, 200205, 200206, 200207, 200208, 200209, 200210, 200211, 200212, 200301 ); my @data1 = ( 6626, 7662, 7580, 7671, 8064, 8664, 6343, 5518, 6257, 5391, 5401, 6002 ); $g->add_dataset(@data); $g->add_dataset(@data1); my @legend_keys = ( "Actual ", "Goal" ); $g->set( colors => { dataset0 => [ 25, 220, 147 ], }, graph_border => 0, grey_background => 'false', grid_lines => 'true', # integer_ticks_only => 'true', legend => 'none', # min_val => 0, # include_zero => 'true', png_border => 4, precision => 1, skip_int_ticks => 1000, spaced_bars => 'true', text_space => 3, title => "Tickets", title_font => GD::Font->Giant, transparent => 'false', x_ticks => 'vertical', y_axes => 'both', y_label => '# Tickets', # max_val => 9000, ); $g->png("samples/bars_6.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_5.t0000644000175000017500000000206712033071315014104 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; print "1..1\n"; $g = Chart::Lines->new( 600, 300 ); @x_values = (); @y_values = (); for ( $i = 0 ; $i <= 16 ; $i += 0.05 ) { $j = sin($i); $j2 = cos($i); push( @x_values, $i ); push( @y_values, $j ); push( @y2_values, $j2 ); } $g->add_dataset(@x_values); $g->add_dataset(@y_values); $g->add_dataset(@y2_values); %hash = ( 'title' => 'The trigonometric functions sinus and cosinus', 'grid_lines' => 'true', 'legend' => 'left', 'xy_plot' => 'true', 'skip_x_ticks' => 20, 'legend_labels' => [ 'y = sin x', 'y = cos x' ], 'precision' => 2, 'integer_ticks_only' => 'true', #'custom_x_ticks' => [0,3], 'colors' => { 'title' => 'plum', 'dataset0' => 'mauve', }, 'f_x_tick' => \&formatter, ); $g->set(%hash); $g->png("samples/lines_5.png"); sub formatter { my $d = shift; $d = sprintf "%1.2f", $d; if ( $d =~ /^0.00/ ) { return 0 } return $d; } print "ok 1\n"; exit(0); Chart-2.4.6/t/points_2.t0000644000175000017500000000121612033071317014300 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Points; print "1..1\n"; $g = Chart::Points->new; $g->add_dataset( 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So' ); $g->add_dataset( -3, 0, 8, 4, 2, 1, 0 ); $g->add_dataset( 8, 0.12, 9, 2, 4, -1, 3 ); $g->add_dataset( 5, -7, 12, 5, 7, 5, 8 ); $g->add_dataset( 0, 0, 0, 0, 0, 0, 0 ); @hash = ( 'title' => 'Points Chart', # 'type_style' => 'donut', 'png_border' => 10, 'precision' => 0, 'min_val' => 0, #'max_val' => 0, 'include_zero' => 'true', ); $g->set(@hash); $g->png("samples/points_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_10.t0000644000175000017500000000207312033071316013621 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; print "1..1\n"; my $g = Chart::Pie->new( 1000, 1000 ); my @labels = ( 'Pending - 0 - 0.5 hour', 'Pending - 0.5 - 1 hour', 'Pending - 1 - 2 hours', 'Pending - 2 - 5 hours', 'Pending - 5 - 12 hours', 'Pending - 12 - 24 hours', 'Pending - 1 - 2 days', 'Pending - more than 2 days', 'Queued - 0 - 0.5 hour', 'Queued - 0.5 - 1 hour', 'Queued - 1 - 2 hours', 'Queued - 2 - 5 hours', 'Queued - 5 - 12 hours', 'Queued - 12 - 24 hours', 'Queued - 1 - 2 days', 'Queued - more than 2 days', 'Queued - Future Delivery' ); $g->add_dataset(@labels); $g->add_dataset( 40, 5, 12, 2, 4, 15, 20, 31, 1, 25, 40, 40, 40, 1, 0, 2, 20 ); $g->set( 'title' => 'Pie Demo Chart' ); $g->set( 'label_values' => 'percent' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'right' ); $g->set( 'grey_background' => 'false' ); $g->set( 'legend_lines' => 'true' ); $g->png("samples/pie_10.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/points_100.t0000644000175000017500000000070412033071317014440 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Points; use strict; print "1..1\n"; my $g; my @x; my @y; $x[0] = 0; $y[0] = 0; for ( my $i = 9 ; $i < 100 ; $i++ ) { $x[$i] = $i; $y[$i] = $i * 10; } $g = Chart::Points->new; $g->add_dataset(@x); $g->add_dataset(@y); $g->set( 'title' => 'Points Chart with 100 Points' ); $g->set( 'skip_x_ticks' => 10 ); #$g->set ('skip_int_ticks'=> 10); $g->png("samples/points_100.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_1.t0000644000175000017500000000165112033071316013542 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; print "1..1\n"; my $g = Chart::Pie->new( 550, 500 ); $g->add_dataset( 'The Red', 'The Black', 'The Yellow', 'The Brown', 'The Green' ); $g->add_dataset( 430, 411, 50, 10, 100 ); $g->set( 'title' => 'The Parlament' ); $g->set( 'label_values' => 'percent' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'top' ); $g->set( 'grey_background' => 'false' ); $g->set( 'x_label' => 'seats in the parlament' ); $g->set( 'colors' => { 'misc' => 'light_blue', 'background' => 'lavender', 'dataset0' => 'red', 'dataset1' => 'black', 'dataset2' => [ 210, 210, 0 ], 'dataset3' => 'DarkOrange', 'dataset4' => 'green' } ); $g->set( 'legend_lines' => 'true' ); $g->png("samples/pie_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_4.t0000644000175000017500000000152012033071316013540 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use GD; use strict; print "1..1\n"; my $g = Chart::Pie->new( 500, 450 ); $g->add_dataset( 'eins', 'zwei', 'drei', 'vier', 'fuenf', 'sechs', 'sieben', 'acht', 'neun', 'zehn' ); $g->add_dataset( 120, 50, 100, 80, 40, 45, 150, 60, 110, 50 ); $g->set( 'title' => 'Pie\nDemo Chart' ); $g->set( 'sub_title' => 'True Type Fonts' ); $g->set( 'label_values' => 'percent' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'bottom' ); $g->set( 'grey_background' => 'false' ); $g->set( 'x_label' => '' ); $g->set( 'legend_font' => gdSmallFont ); $g->set( 'title_font' => gdGiantFont ); $g->set( 'legend_lines' => 'false' ); $g->png("samples/pie_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints_1.t0000644000175000017500000000142512033071315015332 0ustar reinerreiner#!/usr/bin/perl -w use Chart::LinesPoints; print "1..1\n"; $g = Chart::LinesPoints->new; $g->add_dataset( 'foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( 3, 4, 9, 3, 4 ); $g->add_dataset( 8, 4, 3, 4, 6 ); $g->add_dataset( 5, 7, 2, 7, 9 ); $g->set( 'title' => 'Lines and Points Chart' ); $g->set( 'sub_title' => 'Change color for grid_lines' ); $g->set( 'colors' => { 'x_grid_lines' => [ 250, 0, 125 ] } ); $g->set( 'colors' => { 'y_grid_lines' => [ 250, 0, 125 ] } ); #$g->set ('colors' => {'y2_grid_lines' => [250, 0, 125]}); $g->set( 'grid_lines' => 'true' ); $g->set( 'grey_background' => 'false' ); $g->set( 'legend' => 'bottom' ); $g->png("samples/linespoints_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_2.t0000644000175000017500000000177412033071315014105 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; my $g; print "1..1\n"; $g = Chart::Lines->new; $g->add_dataset( 'foo', 'bar', 'whee', 'ding', 'bat', 'bit' ); $g->add_dataset( 3.2, 4.34, 9.456, 10.459, 11.24234, 14.0234 ); $g->add_dataset( -1.3, 8.4, 5.34, 3.234, 4.33, 13.09 ); $g->add_dataset( 5, 7, 2, 10, 12, 2.3445 ); $g->add_dataset( 8, 4, 5, 12, 3, 9 ); $g->set( 'title' => 'LINES' ); $g->set( 'sub_title' => 'Lines Chart' ); $g->set( 'colors' => { 'y_label' => [ 0, 0, 255 ], y_label2 => [ 0, 255, 0 ], 'y_grid_lines' => [ 127, 127, 0 ], 'dataset0' => [ 127, 0, 0 ], 'dataset1' => [ 0, 127, 0 ], 'dataset2' => [ 0, 0, 127 ] } ); $g->set( 'y_label' => 'y label 1' ); $g->set( 'y_label2' => 'y label 2' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'left' ); $g->png("samples/lines_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_7.t0000644000175000017500000000137612033071315014110 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; my $g; print "1..1\n"; $g = Chart::Lines->new; $g->add_dataset( 'one', 'two', 'three', 'four', 'five', 'six' ); $g->add_dataset( 3, 11, 5, 10, 12, 4 ); $g->add_dataset( -1, 3, 6, -2, -8, 0 ); $g->add_dataset( 5, 5, 6, 2, 12, 9 ); $g->add_dataset( 0, 0, 0, 0, 0, 0 ); $g->add_dataset( -12, -18, 0, 0, 0, 1 ); $g->set( 'title' => "Lines Chart" ); $g->set( 'sub_title' => 'Lines Chart' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'bottom' ); $g->set( 'precision' => '0' ); $g->set( 'include_zero' => 'true' ); $g->png("samples/lines_7.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/error_2.t0000644000175000017500000000137112033071315014115 0ustar reinerreiner#!usr/bin/perl -w use Chart::ErrorBars; print "1..1\n"; $g = Chart::ErrorBars->new(); $g->add_dataset(qw(1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5)); $g->add_dataset(qw(1 1.1 1.2 1.1 1.14 1.15 1.26 1.2 1.1 1.19 1.2 1.4 1.6 2.0 2.5 3.1)); $g->add_dataset(qw(0.4 0.1 0.2 0.1 0.14 0.15 0.26 0.27 0.1 0.19 0.2 0.1 0.1 0.2 0.1 0.3)); $g->set( 'xy_plot' => 'true', 'precision' => 2, 'same_error' => 'true', 'pt_size' => 12, 'brush_size' => 2, 'legend' => 'none', 'title' => 'Error Bars Demo', 'include_zero' => 'true', 'max_val' => 3, 'custom_x_ticks' => [ 0, 1 ], ); $g->png("samples/error_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints_6.t0000644000175000017500000004115112033071316015340 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::LinesPoints; use Chart::Lines; print "1..1\n"; my @bezugszeitraum = ( '2004-06-13 00:00:00+00', '2004-06-14 00:00:00+00', '2004-06-15 00:00:00+00', '2004-06-16 00:00:00+00', '2004-06-17 00:00:00+00', '2004-06-18 00:00:00+00', '2004-06-19 00:00:00+00', '2004-06-20 00:00:00+00', '2004-06-21 00:00:00+00', '2004-06-22 00:00:00+00', '2004-06-23 00:00:00+00', '2004-06-24 00:00:00+00', '2004-06-25 00:00:00+00', '2004-06-26 00:00:00+00', '2004-06-27 00:00:00+00', '2004-06-28 00:00:00+00', '2004-06-29 00:00:00+00', '2004-06-30 00:00:00+00', '2004-07-01 00:00:00+00', '2004-07-02 00:00:00+00', '2004-07-03 00:00:00+00', '2004-07-04 00:00:00+00', '2004-07-05 00:00:00+00', '2004-07-06 00:00:00+00', '2004-07-07 00:00:00+00', '2004-07-08 00:00:00+00', '2004-07-09 00:00:00+00', '2004-07-10 00:00:00+00', '2004-07-11 00:00:00+00', '2004-07-12 00:00:00+00', '2004-07-13 00:00:00+00', '2004-07-14 00:00:00+00', '2004-07-15 00:00:00+00', '2004-07-16 00:00:00+00', '2004-07-17 00:00:00+00', '2004-07-18 00:00:00+00', '2004-07-19 00:00:00+00', '2004-07-20 00:00:00+00', '2004-07-21 00:00:00+00', '2004-07-22 00:00:00+00', '2004-07-23 00:00:00+00', '2004-07-24 00:00:00+00', '2004-07-25 00:00:00+00', '2004-07-26 00:00:00+00', '2004-07-27 00:00:00+00', '2004-07-28 00:00:00+00', '2004-07-29 00:00:00+00', '2004-07-30 00:00:00+00', '2004-07-31 00:00:00+00', '2004-08-01 00:00:00+00', '2004-08-02 00:00:00+00', '2004-08-03 00:00:00+00', '2004-08-04 00:00:00+00', '2004-08-05 00:00:00+00', '2004-08-06 00:00:00+00', '2004-08-07 00:00:00+00', '2004-08-08 00:00:00+00', '2004-08-09 00:00:00+00', '2004-08-10 00:00:00+00', '2004-08-11 00:00:00+00', '2004-08-12 00:00:00+00', '2004-08-13 00:00:00+00', '2004-08-14 00:00:00+00', '2004-08-15 00:00:00+00', '2004-08-16 00:00:00+00', '2004-08-17 00:00:00+00', '2004-08-18 00:00:00+00', '2004-08-19 00:00:00+00', '2004-08-20 00:00:00+00', '2004-08-21 00:00:00+00', '2004-08-22 00:00:00+00', '2004-08-23 00:00:00+00', '2004-08-24 00:00:00+00', '2004-08-25 00:00:00+00', '2004-08-26 00:00:00+00', '2004-08-27 00:00:00+00', '2004-08-28 00:00:00+00', '2004-08-29 00:00:00+00', '2004-08-30 00:00:00+00', '2004-08-31 00:00:00+00', '2004-09-01 00:00:00+00', '2004-09-02 00:00:00+00', '2004-09-03 00:00:00+00', '2004-09-04 00:00:00+00', '2004-09-05 00:00:00+00', '2004-09-06 00:00:00+00', '2004-09-07 00:00:00+00', '2004-09-08 00:00:00+00', '2004-09-09 00:00:00+00', '2004-09-10 00:00:00+00', '2004-09-11 00:00:00+00', '2004-09-12 00:00:00+00', '2004-09-13 00:00:00+00', '2004-09-14 00:00:00+00', '2004-09-15 00:00:00+00', '2004-09-16 00:00:00+00', '2004-09-17 00:00:00+00', '2004-09-18 00:00:00+00', '2004-09-19 00:00:00+00', '2004-09-20 00:00:00+00', '2004-09-21 00:00:00+00', '2004-09-22 00:00:00+00', '2004-09-23 00:00:00+00', '2004-09-24 00:00:00+00', '2004-09-25 00:00:00+00', '2004-09-26 00:00:00+00', '2004-09-27 00:00:00+00', '2004-09-28 00:00:00+00', '2004-09-29 00:00:00+00', '2004-09-30 00:00:00+00', '2004-10-01 00:00:00+00', '2004-10-02 00:00:00+00', '2004-10-03 00:00:00+00', '2004-10-04 00:00:00+00', '2004-10-05 00:00:00+00', '2004-10-06 00:00:00+00', '2004-10-07 00:00:00+00', '2004-10-08 00:00:00+00', '2004-10-09 00:00:00+00', '2004-10-10 00:00:00+00', '2004-10-11 00:00:00+00', '2004-10-12 00:00:00+00', '2004-10-13 00:00:00+00', '2004-10-14 00:00:00+00', '2004-10-15 00:00:00+00', '2004-10-16 00:00:00+00', '2004-10-17 00:00:00+00', '2004-10-18 00:00:00+00', '2004-10-19 00:00:00+00', '2004-10-20 00:00:00+00', '2004-10-21 00:00:00+00', '2004-10-22 00:00:00+00', '2004-10-23 00:00:00+00', '2004-10-24 00:00:00+00', '2004-10-25 00:00:00+00', '2004-10-26 00:00:00+00', '2004-10-27 00:00:00+00', '2004-10-28 00:00:00+00', '2004-10-29 00:00:00+00', '2004-10-30 00:00:00+00', '2004-10-31 00:00:00+00', '2004-11-01 00:00:00+00', '2004-11-02 00:00:00+00', '2004-11-03 00:00:00+00', '2004-11-04 00:00:00+00', '2004-11-05 00:00:00+00', '2004-11-06 00:00:00+00', '2004-11-07 00:00:00+00', '2004-11-08 00:00:00+00', '2004-11-09 00:00:00+00', '2004-11-10 00:00:00+00', '2004-11-11 00:00:00+00', '2004-11-12 00:00:00+00', '2004-11-13 00:00:00+00', '2004-11-14 00:00:00+00', '2004-11-15 00:00:00+00', '2004-11-16 00:00:00+00', '2004-11-17 00:00:00+00', '2004-11-18 00:00:00+00', '2004-11-19 00:00:00+00', '2004-11-20 00:00:00+00', '2004-11-21 00:00:00+00', '2004-11-22 00:00:00+00', '2004-11-23 00:00:00+00', '2004-11-24 00:00:00+00', '2004-11-25 00:00:00+00', '2004-11-26 00:00:00+00', '2004-11-27 00:00:00+00', '2004-11-28 00:00:00+00', '2004-11-29 00:00:00+00', '2004-11-30 00:00:00+00', '2004-12-01 00:00:00+00', '2004-12-02 00:00:00+00', '2004-12-03 00:00:00+00', '2004-12-04 00:00:00+00', '2004-12-05 00:00:00+00', '2004-12-06 00:00:00+00', '2004-12-07 00:00:00+00', '2004-12-08 00:00:00+00', '2004-12-09 00:00:00+00', '2004-12-10 00:00:00+00', '2004-12-11 00:00:00+00', '2004-12-12 00:00:00+00', '2004-12-13 00:00:00+00', '2004-12-14 00:00:00+00', '2004-12-15 00:00:00+00', '2004-12-16 00:00:00+00', '2004-12-17 00:00:00+00', '2004-12-18 00:00:00+00', '2004-12-19 00:00:00+00', '2004-12-20 00:00:00+00', '2004-12-21 00:00:00+00', '2004-12-22 00:00:00+00', '2004-12-23 00:00:00+00', '2004-12-24 00:00:00+00', '2004-12-25 00:00:00+00', '2004-12-26 00:00:00+00', '2004-12-27 00:00:00+00', '2004-12-28 00:00:00+00', '2004-12-29 00:00:00+00', '2004-12-30 00:00:00+00', '2004-12-31 00:00:00+00', '2005-01-01 00:00:00+00', '2005-01-02 00:00:00+00', '2005-01-03 00:00:00+00', '2005-01-04 00:00:00+00', '2005-01-05 00:00:00+00', '2005-01-06 00:00:00+00', '2005-01-07 00:00:00+00', '2005-01-08 00:00:00+00', '2005-01-09 00:00:00+00', '2005-01-10 00:00:00+00', '2005-01-11 00:00:00+00', '2005-01-12 00:00:00+00', '2005-01-13 00:00:00+00', '2005-01-17 00:00:00+00', '2005-01-18 00:00:00+00', '2005-01-25 00:00:00+00', '2005-01-26 00:00:00+00', '2005-01-28 00:00:00+00', '2005-01-29 00:00:00+00', '2005-01-31 00:00:00+00', '2005-02-08 00:00:00+00', '2005-02-09 00:00:00+00', '2005-02-10 00:00:00+00', '2005-02-11 00:00:00+00', '2005-02-12 00:00:00+00', '2005-02-13 00:00:00+00', '2005-02-14 00:00:00+00', '2005-02-15 00:00:00+00', '2005-02-16 00:00:00+00', '2005-02-17 00:00:00+00', '2005-02-18 00:00:00+00', '2005-02-19 00:00:00+00', '2005-02-20 00:00:00+00', '2005-02-21 00:00:00+00', '2005-02-22 00:00:00+00', '2005-02-23 00:00:00+00', '2005-02-24 00:00:00+00', '2005-02-25 00:00:00+00', '2005-02-26 00:00:00+00', '2005-02-27 00:00:00+00', '2005-02-28 00:00:00+00', '2005-03-01 00:00:00+00', '2005-03-02 00:00:00+00', '2005-03-03 00:00:00+00', '2005-03-04 00:00:00+00', '2005-03-05 00:00:00+00', '2005-03-06 00:00:00+00', '2005-03-07 00:00:00+00', '2005-03-08 00:00:00+00', '2005-03-09 00:00:00+00', '2005-03-10 00:00:00+00', '2005-03-11 00:00:00+00', '2005-03-12 00:00:00+00', '2005-03-13 00:00:00+00', '2005-03-14 00:00:00+00', '2005-03-15 00:00:00+00', '2005-03-16 00:00:00+00', '2005-03-17 00:00:00+00', '2005-03-18 00:00:00+00', '2005-03-19 00:00:00+00', '2005-03-20 00:00:00+00', '2005-03-21 00:00:00+00', '2005-03-22 00:00:00+00', '2005-03-23 00:00:00+00', '2005-03-24 00:00:00+00', '2005-03-25 00:00:00+00', '2005-03-26 00:00:00+00', '2005-03-27 00:00:00+00', '2005-03-28 00:00:00+00', '2005-03-29 00:00:00+00', '2005-03-30 00:00:00+00', '2005-03-31 00:00:00+00', '2005-04-01 00:00:00+00', '2005-04-02 00:00:00+00', '2005-04-03 00:00:00+00', '2005-04-04 00:00:00+00', '2005-04-05 00:00:00+00', '2005-04-06 00:00:00+00', '2005-04-07 00:00:00+00', '2005-04-08 00:00:00+00', '2005-04-09 00:00:00+00', '2005-04-10 00:00:00+00', '2005-04-11 00:00:00+00', '2005-04-12 00:00:00+00', '2005-04-13 00:00:00+00', '2005-04-14 00:00:00+00', '2005-04-15 00:00:00+00', '2005-04-16 00:00:00+00', '2005-04-17 00:00:00+00', '2005-04-18 00:00:00+00', '2005-04-19 00:00:00+00', '2005-04-20 00:00:00+00', '2005-04-21 00:00:00+00', '2005-04-22 00:00:00+00', '2005-04-23 00:00:00+00', '2005-04-24 00:00:00+00', '2005-04-25 00:00:00+00', '2005-04-26 00:00:00+00', '2005-04-27 00:00:00+00', '2005-04-28 00:00:00+00', '2005-04-29 00:00:00+00', '2005-04-30 00:00:00+00', '2005-05-01 00:00:00+00', '2005-05-02 00:00:00+00', '2005-05-03 00:00:00+00', '2005-05-04 00:00:00+00', '2005-05-05 00:00:00+00', '2005-05-06 00:00:00+00', '2005-05-07 00:00:00+00', '2005-05-08 00:00:00+00', '2005-05-09 00:00:00+00', '2005-05-10 00:00:00+00', '2005-05-11 00:00:00+00', '2005-05-12 00:00:00+00', '2005-05-13 00:00:00+00', '2005-05-14 00:00:00+00', '2005-05-15 00:00:00+00', '2005-05-16 00:00:00+00', '2005-05-17 00:00:00+00', '2005-05-18 00:00:00+00', '2005-05-19 00:00:00+00', '2005-05-20 00:00:00+00', '2005-05-21 00:00:00+00', '2005-05-22 00:00:00+00', '2005-05-23 00:00:00+00', '2005-05-24 00:00:00+00', '2005-05-25 00:00:00+00', '2005-05-26 00:00:00+00', '2005-05-27 00:00:00+00', '2005-05-28 00:00:00+00', '2005-05-29 00:00:00+00', '2005-05-30 00:00:00+00', '2005-05-31 00:00:00+00', '2005-06-01 00:00:00+00', '2005-06-02 00:00:00+00', '2005-06-03 00:00:00+00', '2005-06-04 00:00:00+00', '2005-06-05 00:00:00+00', '2005-06-06 00:00:00+00', ); my @obsepoch = ( 81.8670764502497, 42.4188998589563, 100, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 100, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.6528982992017, 100, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99.6180555555556, 100, 100, 100, 100, 100, 100, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652777777778, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.7223186393613, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9306037473976, 99.9306037473976, 99.9652898299202, 99.7570288094412, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9306037473976, 99.9306037473976, 99.9306037473976, 99.9652898299202, 99.9652898299202, 99.9652898299202, 99.9306037473976, 99.9306037473976, 99.9306037473976, 99.9306037473976, 99.9306037473976, 99.9306037473976, 99.9306037473976, 99.9306037473976, 94.5176960444136, 100, 98.125, 100, 100, 100, 100, 100, 99.4444444444444, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99.9652777777778, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99.6180555555556, 100, 100, 100, 100, 100, 100, 100, 100, 99.6527777777778, 100, 100, 100, 100, 100, 100, 94.9494949494949, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99.965241571081, 99.930483142162, 99.860966284324, 99.8262078554049, 99.7914494264859, 99.7566063977747, 99.6870653685674, 99.6175243393602, 99.547983310153, 99.4784422809458, 99.3741307371349, 99.5138888888889, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, ); my $g = Chart::LinesPoints->new( 700, 450 ); #my $g = Chart::Lines->new(700,450); $g->add_dataset(@bezugszeitraum); $g->add_dataset(@obsepoch); $g->set( 'x_ticks' => 'vertical' ); $g->set( 'x_label' => ' Time' ); $g->set( 'y_label' => 'actual_nr_of_obsepoch / possible_nr' ); $g->set( 'legend' => 'none' ); $g->set( 'precision' => 0 ); $g->set( 'title' => 'DRES' ); $g->set( 'grey_background' => 'false' ); $g->set( 'max_val' => '100' ); $g->set( 'min_val' => '80' ); $g->set( 'pt_size' => '20' ); $g->set( 'brush_size' => '4' ); $g->set( 'skip_x_ticks' => '50' ); $g->png("samples/linespoints_6.png"); print "ok 1\n\n"; Chart-2.4.6/t/lines.t0000644000175000017500000000247012033071315013656 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; print "1..1\n"; $g = Chart::Lines->new; $g->add_dataset( 'foo', 'bar', 'whee', 'ding', 'bat', ); $g->add_dataset( 3.2, 4.1, 9.8, 10, 11, ); $g->add_dataset( 8, 5.3, 3, 4, 5.1, ); $g->add_dataset( 5, 7, 2.3, 10, 12, ); %hash = ( 'title' => 'Lines Chart', 'legend_example_size' => 10, 'grid_lines' => 'true', 'grey_background' => 'false', 'colors' => { 'text' => [ 255, 0, 0 ], 'grid_lines' => [ 240, 0, 0 ] } ); $g->set(%hash); $g->png("samples/lines.png"); print "ok 1\n"; # #use Data::Dumper; #my %hopts = $g->getopts(); ## print Dumper(\%hopts); # # ## OO Approach #print "Key\tContents\n"; #foreach (keys %hopts ) #{ # print "$_\t"; # myDumpIt(\$hopts{$_}); # print "\n"; # my $i=1; #} #exit(0); # #sub myPrint #{ # my $val = shift; # if ( ref(\$val) eq 'SCALAR' ) # { # print $val; # } # elsif ( ref($val) eq 'HASH' ) # { # # } #} # #sub myDumpit #{ # my $rsomething = shift; ## Reference # if ( ref $rsomething eq 'REF' ) # { # myDumpIt($$rsomething); # } # if ( ref $rsomething eq 'ARRAY' ) # { # print "["; # foreach my $val (@$rsomething) # { # # } # } #} # Chart-2.4.6/t/lines_9.t0000644000175000017500000000171512033071315014107 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use Chart::LinesPoints; use strict; my $g; print "1..1\n"; my @labels = ( [ 'Jan', 'Feb', 'Mar' ], [ '0', '20', '100' ] ); $g = Chart::Lines->new; $g->add_dataset( 10, 20, 30, 40, 50, 60 ); $g->add_dataset( 10, 40, 70, 100, 130, 10 ); $g->set( 'title' => "Basic example for Option xlabels" ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'none' ); $g->set( 'xy_plot' => 1 ); $g->set( 'x_ticks' => 'vertical' ); $g->png("samples/lines_9.png"); $g = Chart::Lines->new; $g->add_dataset( 10, 20, 30, 40, 50, 60 ); $g->add_dataset( 10, 40, 70, 100, 130, 10 ); $g->set( 'title' => "Example B for Option xlabels" ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'none' ); $g->set( 'xy_plot' => 1 ); $g->set( 'x_ticks' => 'vertical' ); $g->set( xlabels => \@labels, xrange => [ 0, 100 ] ); $g->png("samples/lines_9b.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_7.t0000644000175000017500000000136412033071317013552 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use GD; use strict; print "1..1\n"; my $g = Chart::Pie->new( 500, 450 ); $g->add_dataset( 'eins', 'zwei', 'drei', 'vier', 'fuenf', 'sechs', 'sieben', 'acht', 'neun', 'zehn' ); $g->add_dataset( 40, 1, 12, 37, 8, 50, 19, 23, 5, 90 ); $g->set( 'title' => 'Pie\nDemo Chart' ); $g->set( 'sub_title' => 'Ring_Pie' ); $g->set( 'label_values' => 'value' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'bottom' ); $g->set( 'x_label' => '' ); $g->set( 'ring' => 0.1 ); $g->set( 'colors' => { 'background' => 'grey' } ); $g->png("samples/pie_7.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_2.t0000644000175000017500000000362612033071314014772 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::Composite; print "1..1\n"; my ($g) = Chart::Composite->new( 788, 435 ); # 0 = X-Achse $g->add_dataset( '0:00', '1:00', '2:00', '3:00', '4:00', '5:00', '6:00', '7:00', '8:00', '9:00', '10:00', '11:00' ); # 1 = BZ-Werte - linie $g->add_dataset( 222, 211, 306, 175, 216, 216, 168, 161, 153, 170, 92, 134 ); # 2 = Basas - stacked bar $g->add_dataset( 0.8, 0.8, 0.9, 1.1, 1.8, 2.1, 1.8, 1.4, 1.0, 1.0, 1.0, 1.0 ); # 3 = Bolus - stacked bar $g->add_dataset( 4.4, 1.8, 6.5, 5.6, 2.4, 4.7, 6.0, 5.4, 8.9, 9.5, 8.7, 9.2 ); # 4 = KHE - stacked bar $g->add_dataset( 3.0, 2.8, 2.5, 0.6, 2.4, 4.7, 5.0, 5.4, 1.9, 3.5, 4.7, 3.2 ); $g->set( 'composite_info' => [ [ 'StackedBars', [ 2, 3, 4 ] ], [ 'Lines', [1] ] ] ); $g->set( 'legend_labels' => [ 'BZ', 'KHE', 'Bolus', 'Basal' ], 'legend' => 'bottom', 'title' => '', 'precision' => 0, 'spaced_bars' => 'false', 'include_zero' => 'true', 'legend_example_size' => 100, 'skip_int_ticks' => 3, 'min_val2' => 0, #'max_val2' => 400, 'legend_example_height' => 'true', 'legend_example_height0..2' => 10, # Reihenfolge durch composite info 'legend_example_height3' => 2, 'y_label' => 'IE/KHE', 'y_label2' => 'mg/dl (mmol/l)', 'grey_background' => 'false', ); $g->set( 'colors' => { 'y_label' => [ 51, 255, 0 ], 'y_label2' => [ 255, 0, 0 ], 'dataset2' => [ 0, 0, 244 ], # Reihenfolge durch composite info!!! 'dataset1' => [ 0, 204, 0 ], 'dataset0' => [ 255, 255, 51 ], 'dataset3' => [ 204, 0, 0 ], } ); $g->set( 'f_y_tick' => sub { return ( $_[0] . '(' . sprintf( "%.1f", $_[0] / 18.0182 ) . ')' ) } ); $g->png("samples/composite_2.png"); print "ok 1\n"; exit 0; Chart-2.4.6/t/lines_4.t0000644000175000017500000000167612033071315014110 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; my $g; print "1..1\n"; $g = Chart::Lines->new; $g->add_dataset( 'foo', 'bar', 'whee', 'ding', 'bat', 'bit' ); $g->add_dataset( 3.2, 4.34, 9.456, 10.459, 11.24234, 14.0234 ); $g->add_dataset( -1.3, 8.4, 5.34, 3.234, 4.33, 13.09 ); $g->add_dataset( 5, 7, 2, 10, 12, 2.3445 ); $g->set( 'title' => "LINES" ); $g->set( 'sub_title' => 'Lines Chart' ); $g->set( 'colors' => { 'y_label' => [ 0, 0, 255 ], y_label2 => [ 0, 255, 0 ], 'y_grid_lines' => [ 127, 127, 0 ], 'dataset0' => [ 127, 0, 0 ], 'dataset1' => [ 0, 127, 0 ], 'dataset2' => [ 0, 0, 127 ] } ); $g->set( 'y_label' => 'y label 1' ); $g->set( 'y_label2' => 'y label 2' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'top' ); $g->png("samples/lines_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_5.t0000644000175000017500000000133212033071316013542 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; print "1..1\n"; my $g = Chart::Pie->new( 550, 500 ); $g->add_dataset( 'eins', 'zwei', 'drei', 'vier' ); $g->add_dataset( 25, 30, 250, 50 ); $g->set( 'title' => 'Pie Demo Chart' ); $g->set( 'label_values' => 'percent' ); $g->set( 'legend_label_values' => 'value' ); $g->set( 'legend' => 'bottom' ); $g->set( 'grey_background' => 'false' ); $g->set( 'x_label' => '' ); $g->set( 'colors' => { 'misc' => 'light_blue', 'dataset1' => 'red', 'dataset2' => 'blue', 'dataset0' => 'yellow', 'dataset3' => 'green' } ); $g->png("samples/pie_5.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_8.t0000644000175000017500000000113712033071315014104 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; my $g; print "1..1\n"; $g = Chart::Lines->new; $g->add_dataset( 'one', 'two', 'three', 'four', 'five', 'six' ); $g->add_dataset( 3, 11, 5, 10, 12, 4 ); $g->set( 'title' => "Timing" ); $g->set( 'sub_title' => 'Example for stepline' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'none' ); $g->set( 'precision' => '0' ); $g->set( 'include_zero' => 'true' ); $g->set( 'stepline' => 'true' ); $g->set( 'stepline_mode' => 'begin' ); $g->png("samples/lines_8.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/Math_1_over_x.t0000644000175000017500000000452712033071314015243 0ustar reinerreiner#!/usr/bin/perl -w # # Testprogram for lines # Math expressions 1/x # #====================================================================== use strict; use Chart::Lines; print "1..1\n"; my @x_values = (); # x axis my @y1_values = (); # 1/x for x<0 my @y2_values = (); # 1/x for x>0 my $graphic; my $min_x = -5; my $max_x = 5; my $min_y = -10; my $max_y = 10; my $x; my $y; #------------------------------------------------------------------------------------ # Start #------------------------------------------------------------------------------------ $x = $min_x; for ( my $x_idx = 0 ; $x < $max_x ; $x_idx++ ) { $x = $min_x + $x_idx * 0.1; $x_values[$x_idx] = $x; } for ( my $x_idx = 0 ; $x_idx <= $#x_values ; $x_idx++ ) { if ( $x_values[$x_idx] < 0 ) { $y1_values[$x_idx] = 1 / $x_values[$x_idx]; $y2_values[$x_idx] = $max_y + 10; } elsif ( $x_values[$x_idx] > 0 ) { $y1_values[$x_idx] = $min_y - 10; $y2_values[$x_idx] = 1 / $x_values[$x_idx]; } else { $y2_values[$x_idx] = $max_y + 10; $y1_values[$x_idx] = $min_y - 10; } } #------------------------------------------------------------------------------------ # Make it #------------------------------------------------------------------------------------ $graphic = Chart::Lines->new( 750, 600 ); $graphic->set( 'brush_size' => 2 ); $graphic->add_dataset(@x_values); $graphic->add_dataset(@y1_values); $graphic->add_dataset(@y2_values); $graphic->set( 'min_val' => $min_y ); $graphic->set( 'max_val' => $max_y ); #$graphic -> set ('y_ticks' => 11 ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'skip_x_ticks' => 10 ); $graphic->set( 'grey_background' => 'true' ); $graphic->set( 'graph_border' => 18 ); $graphic->set( 'title' => "1/x" ); $graphic->set( 'y_grid_lines' => 'true' ); $graphic->set( 'x_grid_lines' => 'true' ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'legend' => 'none' ); $graphic->set( 'x_label' => 'x' ); $graphic->set( 'y_label' => 'f = 1/x' ); if ( $graphic->can('gif') ) { my $picture_file = "samples/Math_1_over_x.gif"; $graphic->gif($picture_file); } if ( $graphic->can('png') ) { my $picture_file = "samples/Math_1_over_x.png"; $graphic->png($picture_file); } print "ok 1\n"; exit(0); Chart-2.4.6/t/mountain_3.t0000644000175000017500000000762012033071316014623 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Mountain; print "1..1\n"; my $obj = new Chart::Mountain( 500, 400 ); my @data = ( [ '2006-06-01', '2006-06-02', '2006-06-03', '2006-06-04', '2006-06-05', '2006-06-06', '2006-06-07', '2006-06-08', '2006-06-09', '2006-06-10', '2006-06-11', '2006-06-12', '2006-06-13', '2006-06-14', '2006-06-15', '2006-06-16', '2006-06-17', '2006-06-18', '2006-06-19', '2006-06-20', '2006-06-21', '2006-06-22', '2006-06-23', '2006-06-24', '2006-06-25', '2006-06-26', '2006-06-27', '2006-06-28', '2006-06-29', '2006-06-30', '2006-07-01', '2006-07-02', '2006-07-03', '2006-07-04', '2006-07-05', '2006-07-06', '2006-07-07', '2006-07-08', '2006-07-09', '2006-07-10', '2006-07-11', '2006-07-12', '2006-07-13', '2006-07-14', '2006-07-15', '2006-07-16', '2006-07-17', '2006-07-18', '2006-07-19', '2006-07-20', '2006-07-21', '2006-07-22', '2006-07-23', '2006-07-24', '2006-07-25', '2006-07-26', '2006-07-27', '2006-07-28', '2006-07-29', '2006-07-30', '2006-07-31', '2006-08-01', '2006-08-02', '2006-08-03', '2006-08-04', '2006-08-05', '2006-08-06', '2006-08-07', '2006-08-08', '2006-08-09', '2006-08-10', '2006-08-11', '2006-08-12', '2006-08-13', '2006-08-14', '2006-08-15', '2006-08-16', '2006-08-17', '2006-08-18', '2006-08-19', '2006-08-20', '2006-08-21', '2006-08-22', '2006-08-23', '2006-08-24', '2006-08-25', '2006-08-26', '2006-08-27', '2006-08-28', '2006-08-29', '2006-08-30', '2006-08-31' ], [ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900 ], [ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 230, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 350 ], [ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 37 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 ] ); my @labels = ( 'NOT RUN', 'PASS', 'FAIL', 'OTHER' ); $obj->set( 'precision' => 0, 'max_y_ticks' => 10, 'max_x_ticks' => 10, 'skip_x_ticks' => 5, 'x_ticks' => 'vertical', 'x_label' => 'Date', 'y_label' => 'Cumulative Results', 'colors' => { # not run: f2e5af 'dataset0' => [ 0xf2, 0xe5, 0xaf ], # pass: a6f2a7 'dataset1' => [ 0xa6, 0xf2, 0xa7 ], # fail: e8b2b2 'dataset2' => [ 0xe8, 0xb2, 0xb2 ], # other: bcdaeb 'dataset3' => [ 0xbc, 0xda, 0xeb ] }, 'legend_labels' => \@labels, 'grey_background' => 0, ); $obj->png( 'samples/mountain_3.png', \@data ); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints.t0000644000175000017500000000070412033071315015111 0ustar reinerreiner#!/usr/bin/perl -w use Chart::LinesPoints; print "1..1\n"; $g = Chart::LinesPoints->new; $g->add_dataset( 'foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( 3, 4, 9, 3, 4 ); $g->add_dataset( 8, 4, 3, 4, 6 ); $g->add_dataset( 5, 7, 2, 7, 9 ); $g->set( 'title' => 'Lines and Points Chart' ); $g->set( 'legend' => 'bottom' ); $g->png("samples/linespoints.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/points_3.t0000644000175000017500000000074112033071317014303 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Points; print "1..1\n"; $g = Chart::Points->new; $g->add_dataset( 1, 2, 7, 10, 15, 19, 20 ); $g->add_dataset( -3, 0, 8, 4, 2, 1, 0 ); @hash = ( 'title' => 'Points Chart 3', # 'type_style' => 'donut', 'png_border' => 10, 'precision' => 0, 'min_val' => 0, #'max_val' => 0, 'include_zero' => 'true', 'xy_plot' => 'true', ); $g->set(@hash); $g->png("samples/points_3.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_7.t0000644000175000017500000000221412033071314013714 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; use strict; use POSIX; my $a; $a = 10**(-12); print "1..1\n"; my $g = Chart::Bars->new( 580, 300 ); my @data = ( 200202, 200203, 200204, 200205, 200206, 200207, 200208, 200209, 200210, 200211, 200212, 200301 ); my @data1 = ( 6626 * $a, -790 * $a, 7580 * $a, 7671 * $a, 8764 * $a, 8664 * $a, 6343 * $a, 5518 * $a, 6257 * $a, 5391 * $a, 5401 * $a, 6002 * $a ); #my @data1 =(6626,-790,7580,7671,8764,8664,6343,5518,6257,5391,5401,6002); $g->add_dataset(@data); $g->add_dataset(@data1); $g->set( colors => { dataset0 => [ 25, 220, 147 ], }, graph_border => 0, grey_background => 'false', grid_lines => 'true', include_zero => 'true', legend => 'none', png_border => 4, precision => 9, spaced_bars => 'true', text_space => 3, title => "Tickets", title_font => GD::Font->Giant, transparent => 'false', x_ticks => 'vertical', y_axes => 'both', y_label => '# Tickets', x_label => 'Date', ); $g->png("samples/bars_7.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/f_ticks_1.t0000644000175000017500000000527312033071315014412 0ustar reinerreiner#!/usr/bin/perl -w # # Testprogram for f_x_ticks # #====================================================================== use strict; use Chart::LinesPoints; print "1..1\n"; my @x_values = (); # real x values my @y_values = (); # real y values my @x_plot_values = (); # x values for plot my @y_plot_values = (); # y values for plot my $graphic; my $min_x = -15; # random start my $max_x = 10; # random stop my $min_y; my $max_y; my $x; my $y; #------------------------------------------------------------------------------------ # Start #------------------------------------------------------------------------------------ $x = $min_x; for ( my $idx = 0 ; $x <= $max_x ; $idx += 0.1 ) { $x = $min_x + $idx; $x_values[$idx] = $x; $y_values[$idx] = cos( ( $x - $min_x ) ); } undef $min_y; undef $max_y; for ( my $idx = 0 ; $idx <= $#x_values ; $idx++ ) { $x_plot_values[$idx] = $x_values[$idx] + $min_x; $y_plot_values[$idx] = $y_values[$idx]; if ( !defined($min_y) ) { $min_y = $y_values[$idx]; } else { $min_y = ( $min_y < $y_values[$idx] ) ? $min_y : $y_values[$idx]; } if ( !defined($max_y) ) { $max_y = $y_values[$idx]; } else { $max_y = ( $max_y > $y_values[$idx] ) ? $max_y : $y_values[$idx]; } } #------------------------------------------------------------------------------------ # Make it #------------------------------------------------------------------------------------ $graphic = Chart::LinesPoints->new( 750, 600 ); $graphic->set( 'brush_size' => 2 ); $graphic->add_dataset(@x_plot_values); $graphic->add_dataset(@y_plot_values); $graphic->set( 'min_val' => $min_y ); $graphic->set( 'max_val' => $max_y ); #$graphic -> set ('y_ticks' => 11 ); #$graphic -> set ('skip_x_ticks' => 100); $graphic->set( 'pt_size' => 2 ); $graphic->set( 'grey_background' => 'true' ); $graphic->set( 'graph_border' => 18 ); $graphic->set( 'title' => "f_tick example for x and y values" ); $graphic->set( 'y_grid_lines' => 'false' ); $graphic->set( 'x_grid_lines' => 'false' ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'legend' => 'none' ); $graphic->set( 'x_label' => 'some x-values' ); $graphic->set( 'y_label' => 'f = cos(g(x))' ); # use a special function to convert the x values to HH:MM:SS $graphic->set( 'f_x_tick' => \&convert_to_real_x ); if ( $graphic->can('png') ) { my $picture_file = "samples/f_ticks_1.png"; $graphic->png($picture_file); } print "ok 1\n"; exit(0); sub convert_to_real_x { my $plot_x = shift; my $result = sprintf "%6.1f", $plot_x - $min_x; return ($result); } Chart-2.4.6/t/composite.t0000644000175000017500000000163112033071314014543 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Composite; print "1..1\n"; $g = Chart::Composite->new(); $g->add_dataset( 'foo', 'bar', 'junk', 'whee' ); $g->add_dataset( 3, 4, 9, 10 ); $g->add_dataset( 8, 6, 1, 11 ); $g->add_dataset( 5, 7, 2, 12 ); $g->add_dataset( 2, 5, 7, 2 ); $g->set( 'legend' => 'left' ); $g->set( 'title' => 'Composite Chart', 'composite_info' => [ [ 'Bars', [ 1, 2 ] ], [ 'LinesPoints', [ 3, 4 ] ] ] ); $g->set( 'y_label' => 'y label 1', 'y_label2' => 'y label 2' ); $g->set( 'colors' => { 'y_label' => [ 0, 0, 255 ], y_label2 => [ 0, 255, 0 ], 'dataset0' => [ 0, 127, 0 ], 'dataset1' => [ 0, 0, 127 ], 'dataset8', => [ 0, 255, 0 ], 'dataset9' => [ 255, 0, 0 ] } ); $g->set( 'brush_size2' => 1 ); $g->png("samples/composite.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/stackedbars_3.t0000644000175000017500000000165012033071317015255 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::StackedBars; print "1..1\n"; my ($g) = Chart::StackedBars->new( 580, 400 ); $g->add_dataset( '1', '2', '3', '4', '5', '6', '7' ); $g->add_dataset( 5, 7, 9, 11, 9, 7, 5 ); $g->add_dataset( 15, 11, 8, 5, 8, 11, 15 ); $g->add_dataset( 5, 4, 3, 2, 3, 4, 5 ); $g->set( 'legend' => 'right', 'title' => 'Stacked Bars', 'precision' => 0, 'spaced_bars' => 'true', 'include_zero' => 'true', 'skip_int_ticks' => 3, 'max_val' => 30, 'y_label' => '', 'y_label2' => '', 'grey_background' => 'false', ); $g->set( 'colors' => { 'dataset0' => [ 0, 125, 250 ], 'dataset1' => [ 147, 112, 219 ], 'dataset2' => [ 250, 0, 125 ], 'background' => [ 230, 230, 250 ] } ); $g->png("samples/stackedbars_3.png"); print "ok 1\n"; exit; Chart-2.4.6/t/bars_3.t0000644000175000017500000000147112033071314013714 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; print "1..1\n"; $g = Chart::Bars->new( 500, 500 ); $g->add_dataset( 'Reds', 'Blacks', 'Greens', 'Yellows', 'Browns', 'Others' ); $g->add_dataset( -2.4, 3.4, 1.9, 1.2, -1.1, -2.9 ); %hash = ( 'title' => 'Selection 2002:\nWins and Losses in percent', 'text_space' => 5, 'y_grid_lines' => 'true', 'grey_background' => 'false', 'legend' => 'none', 'min_val' => -4, 'max_val' => 4, 'min_y_ticks' => 10, 'y_axes' => 'both', 'spaced_bars' => 'false', 'colors' => { 'background' => [ 230, 255, 230 ], 'title' => 'plum', 'dataset0' => 'mauve', }, ); $g->set(%hash); $g->png("samples/bars_3.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_4.t0000644000175000017500000000076712033071314014777 0ustar reinerreiner#!usr/bin/perl -w use Chart::Composite; print "1..1\n"; $g = Chart::Composite->new( 750, 600 ); $g->add_dataset( 1, 2, 3 ); $g->add_dataset( 10, 20, 30 ); $g->add_dataset( 15, 25, 32 ); $g->add_dataset( 7, 24, 23 ); $g->add_dataset( 0.1, 0.5, 0.9 ); $g->set( 'title' => 'Composite Chart Test 2', 'composite_info' => [ [ 'Bars', [ 1, 2 ] ], [ 'LinesPoints', [ 3, 4 ] ] ], 'include_zero' => 'true', ); $g->png("samples/composite_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_10.t0000644000175000017500000000156612033071314013777 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; print "1..1\n"; $g = Chart::Bars->new( 600, 500 ); $g->add_dataset( 'Berlin', 'Paris', 'Rome', 'London', 'Munich' ); $g->add_dataset( 0, 0, 0, 0, 0 ); $g->add_dataset( 0, 0, 0, 0, 0 ); $g->add_dataset( 0, 0, 0, 0, 0 ); $g->add_dataset( 0, 0, 0, 0, 0 ); $g->add_dataset( 0, 0, 0, 0, 0 ); $g->add_dataset( 0, 0, 0, 0, 0 ); $g->add_dataset( 0, 0, 0, 0, 0 ); %hash = ( 'title' => 'Only a demo chart with zero data', 'legend' => 'bottom', 'grid_lines' => 'true', 'include_zero' => 'true', 'max_val' => '20', 'min_val' => '-20', 'colors' => { 'title' => 'red', 'x_label' => 'blue', 'y_label' => 'blue', 'background' => 'grey', 'text' => 'blue', }, ); $g->set(%hash); $g->png("samples/bars_10.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/stackedbars_2.t0000644000175000017500000000246612033071317015262 0ustar reinerreiner#!/usr/bin/perl -w use strict; use Chart::StackedBars; print "1..1\n"; my ($g) = Chart::StackedBars->new( 788, 435 ); # 0 = X-Achse $g->add_dataset( '0:00', '1:00', '2:00', '3:00', '4:00', '5:00', '6:00', '7:00', '8:00', '9:00', '10:00', '11:00' ); # 2 = Basas - stacked bar $g->add_dataset( 0.8, 0.8, 0.9, 1.1, 1.8, 2.1, 1.8, 1.4, 1.0, 1.0, 1.0, 1.0 ); # 3 = Bolus - stacked bar $g->add_dataset( 4.4, 1.8, 6.5, 5.6, 2.4, 4.7, 6.0, 5.4, 8.9, 9.5, 8.7, 9.2 ); # 4 = KHE - stacked bar $g->add_dataset( 3.0, 2.8, 2.5, 0.6, 2.4, 4.7, 5.0, 5.4, 1.9, 3.5, 4.7, 3.2 ); $g->set( 'legend' => 'bottom', 'title' => 'Stacked Bars', 'precision' => 0, 'spaced_bars' => 'false', 'include_zero' => 'true', 'legend_example_size' => 100, 'skip_int_ticks' => 3, 'min_val_2' => 0, 'y_label' => 'IE/KHE', 'y_label2' => 'mg/dl (mmol/l)', 'grey_background' => 'false', ); $g->set( 'colors' => { 'y_label' => [ 51, 255, 0 ], 'y_label2' => [ 255, 0, 0 ], 'dataset2' => [ 0, 0, 244 ], 'dataset1' => [ 0, 204, 0 ], 'dataset0' => [ 255, 255, 51 ], 'dataset3' => [ 204, 0, 0 ], } ); $g->png("samples/stackedbars_2.png"); print "ok 1\n"; exit; Chart-2.4.6/t/hbars_3.t0000644000175000017500000000116612033071315014066 0ustar reinerreiner#!/usr/bin/perl -w use Chart::HorizontalBars; print "1..1\n"; $g = Chart::HorizontalBars->new( 500, 400 ); $g->add_dataset( 'Foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( -4, -3, -4, -5, -2 ); $g->add_dataset( -2, -10, -3, -8, -3 ); %hash = ( 'y_axes' => 'right', 'title' => 'Horizontal Bars Demo', 'x_grid_lines' => 'true', 'x_label' => 'x-axis', 'y_label' => 'y-axis', 'x_ticks' => 'staggered', 'include_zero' => 'true', 'spaced_bars' => 'false', ); $g->set(%hash); $g->png("samples/hbars_3.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/error_1.t0000644000175000017500000000150112033071315014107 0ustar reinerreiner#!/usr/bin/perl -w use Chart::ErrorBars; print "1..1\n"; $g = Chart::ErrorBars->new(); $g->add_dataset(qw(1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5)); $g->add_dataset(qw(1 1.1 1.2 1.1 1.14 1.15 1.26 1.2 1.1 1.19 1.2 1.4 1.6 2.0 2.5 3.1)); $g->add_dataset(qw(0.4 0.1 0.2 0.1 0.14 0.15 0.26 0.27 0.1 0.19 0.2 0.1 0.1 0.2 0.1 0.3)); $g->add_dataset(qw(0.2 0.11 0.12 0.11 0.2 0.3 0.12 0.27 0.11 0.3 0.2 0.2 0.2 0.1 0.1 0.2)); $g->set( 'xy_plot' => 'true', 'precision' => 1, 'pt_size' => 12, 'brush_size' => 2, 'legend' => 'none', 'title' => 'Error Bars Demo', 'grid_lines' => 'true', 'y_axes' => 'both', 'custom_x_ticks' => [ 0, 1, 2 ], ); $g->png("samples/error_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/direction_4.t0000644000175000017500000000153312033071315014746 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Direction; print "1..1\n"; $g = Chart::Direction->new( 500, 500 ); $g->add_dataset( 210, 220, 200, 215, 225, 200 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->add_dataset( 120, 130, 110, 125, 135, 110 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->add_dataset( 300, 310, 290, 305, 315, 290 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->set( 'title' => 'Direction Demo', 'angle_interval' => 45, 'precision' => 0, 'arrow' => 'true', 'point' => 'false', 'include_zero' => 'true', 'pairs' => 'true', 'legend' => 'none', 'grey_background' => 'false', ); $g->png("samples/direction_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/direction_3.t0000644000175000017500000000137012033071315014744 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Direction; print "1..1\n"; $g = Chart::Direction->new( 500, 500 ); $g->add_dataset( 0, 100, 50, 200, 280, 310 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->add_dataset( 10, 110, 60, 210, 290, 320 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->add_dataset( 20, 120, 70, 220, 300, 330 ); $g->add_dataset( 30, 40, 20, 35, 45, 20 ); $g->set( 'title' => 'Direction Demo', 'angle_interval' => 45, 'precision' => 0, 'arrow' => 'true', 'point' => 'false', 'include_zero' => 'true', 'pairs' => 'true', 'legend' => 'none', 'grey_background' => 'false', ); $g->png("samples/direction_3.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_8.t0000644000175000017500000000230412033071314013715 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; use strict; use POSIX; my $a; $a = 10**(-30); print "1..1\n"; my $g = Chart::Bars->new( 600, 400 ); my @data = ( 200202, 200203, 200204, 200205, 200206, 200207, 200208, 200209, 200210, 200211, 200212, 200301 ); my @data1 = ( 6626 * $a, -790 * $a, 7580 * $a, 7671 * $a, 8764 * $a, 8664 * $a, 6343 * $a, 5518 * $a, 6257 * $a, 5391 * $a, 5401 * $a, 6002 * $a ); #my @data1 =(6626,-790,7580,7671,8764,8664,6343,5518,6257,5391,5401,6002); $g->add_dataset(@data); $g->add_dataset(@data1); my @legend_keys = ( "Actual ", "Goal" ); $g->set( colors => { dataset0 => [ 25, 220, 147 ], }, graph_border => 0, grey_background => 'false', grid_lines => 'true', include_zero => 'true', # integer_ticks_only => 'true', legend => 'none', png_border => 4, # precision => 27, # skip_int_ticks => 1.0e-27, text_space => 3, title => "Tickets", title_font => GD::Font->Giant, transparent => 'false', x_ticks => 'vertical', y_axes => 'both', y_label => '# Tickets', x_label => 'Date', ); $g->png("samples/bars_8.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/bars_4.t0000644000175000017500000000413612033071314013716 0ustar reinerreiner#!/usr/bin/perl -w # The Integral of the mathematical function 1/x use strict; use Chart::Bars; print "1..1\n"; my @x_values = (); # x axis my @y_values = (); my $graphic; my $picture_file = "samples/bars_4.png"; my $min_y = -5; # max. y-values my $max_y = 5; my $x; my $y; #------------------------------------------------------------------------------------ # Start #------------------------------------------------------------------------------------ #calculate the values for ( my $x = -5 ; $x <= 5 ; ( $x = $x + 0.0005 ) ) { push( @x_values, $x ); if ( $x != 0 ) { # division by zero! $y = 1 / $x; if ( $y > $max_y ) { push( @y_values, $max_y ); } elsif ( $y < $min_y ) { push( @y_values, $min_y ); } else { push( @y_values, $y ); } } else { push( @y_values, 0 ); } } #------------------------------------------------------------------------------------ # Make it #------------------------------------------------------------------------------------ $graphic = Chart::Bars->new( 600, 600 ); $graphic->add_dataset(@x_values); $graphic->add_dataset(@y_values); $graphic->set( 'min_val' => $min_y ); $graphic->set( 'max_val' => $max_y ); $graphic->set( 'min_y_ticks' => 20 ); $graphic->set( 'skip_x_ticks' => 1000 ); $graphic->set( 'graph_border' => 18 ); $graphic->set( 'title' => "The Integral of 1/x" ); $graphic->set( 'grid_lines' => 'true' ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'legend' => 'none' ); $graphic->set( 'y_label' => 'f = 1 / x' ); $graphic->set( 'xy_plot' => 'true' ); # use a special function to convert the y values to something special $graphic->set( 'f_y_tick' => \&formatter ); $graphic->set( 'f_x_tick' => \&formatter ); $graphic->png($picture_file); sub formatter { my $y_value = shift; my $label = sprintf "%1.2f", $y_value; if ( $label == '-0.00' ) { $label = '0'; } return $label; } print "ok 1\n"; exit(0); Chart-2.4.6/t/composite_1.t0000644000175000017500000000411712033071314014765 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Composite; print "1..1\n"; my $obj = Chart::Composite->new( 600, 500 ); my @legend_ary; my ( $legend, @zeile ); my @all_aryref; open( OUT, ">samples/composite_1.png" ) or die "cannot write file samples/composite_1.png\n"; my $i = 0; my $e = 0; my $max_val = 0; while () { if ( $_ =~ /EOF/i ) { last; } chomp; $i++; ( $legend, @zeile ) = split /\|/, $_; $obj->add_dataset(@zeile); if ( $i != 1 ) { push @legend_ary, $legend; # Erste Zeile ist die x-Achsenbezeichnung und gehrt nicht zur Legende for ( 0 .. $#zeile ) { $zeile[$_] > $max_val ? $max_val = $zeile[$_] : 1; } # den Maximalen Wert ermitteln } $all_aryref[ $e++ ] = [@zeile]; } if ( $max_val =~ /^\d+$/ ) { $max_val = 100 * int( 1 + $max_val / 100 ); } # den Scalenwert die nchste 100er Stellen setzen # Der zweite Charttyp berdeckt immer den ersten $obj->set( 'legend' => "top", 'legend_labels' => \@legend_ary, 'x_ticks' => "vertical", 'composite_info' => [ [ 'StackedBars', [ 8, 7, 6, 5 ] ], [ 'Bars', [ 1, 2, 3, 4, 9 ] ], ], 'same_y_axes' => "true", 'y_label' => "Anzahl", 'min_val1' => 0, 'max_val1' => $max_val, 'max_val2' => $max_val, 'space_bars' => 1, 'brush_size' => 10, 'legend' => 'bottom', 'title' => 'Composite Demo Chart', 'legend_example_height' => 'true', 'legend_example_height0..3' => '50', 'legend_example_height4..9' => '4', ); $obj->png( \*OUT ); close OUT; print "ok 1\n"; exit 0; __END__ Datum|01.09.2003|02.09.2003|03.09.2003|04.09.2003 Anzahl gesamt|322|244|227|223 Anzahl Stufe 1 bis 4 gesamt|226|173|159|145 Anzahl JL|77|46|44|61 Anzahl DL|19|25|24|17 Anzahl 1. Stufe|28|22|11|27 Anzahl 2. Stufe|12|11|4|7 Anzahl 3. Stufe|50|39|55|34 Anzahl 4. Stufe|136|101|89|77 Anzahl Formulare|547|352|249|174 EOF Chart-2.4.6/t/direction_2.t0000644000175000017500000000111312033071314014735 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Direction; print "1..1\n"; $g = Chart::Direction->new( 450, 450 ); $g->add_dataset( 0, 10, 30, 100, 110, 200, 250, 300, 350 ); $g->add_dataset( 10, 4, 11, 40, 20, 35, 5, 45, 20 ); $g->add_dataset( 20, 8, 22, 80, 40, 70, 10, 90, 40 ); $g->add_dataset( 30, 18, 32, 85, 45, 60, 20, 50, 25 ); $g->set( 'title' => 'Direction Demo', 'angle_interval' => 15, 'precision' => 0, 'grey_background' => 'false', 'legend' => 'top', ); $g->png("samples/direction_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_2.t0000644000175000017500000000122612033071316013541 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; use strict; my $g; print "1..1\n"; $g = Chart::Pie->new( 530, 330 ); $g->add_dataset( 'Harry', 'Sally', 'Eve', 'Mark', 'John', 'Susan', 'Alex', 'Tony', 'Kimberly', 'Theresa' ); $g->add_dataset( 12, 20, 12, 15, 8, 9, 22, 14, 8, 13 ); $g->set( 'title' => 'Pie Demo' ); $g->set( 'label_values' => 'none' ); $g->set( 'legend_label_values' => 'percent' ); $g->set( 'grey_background' => 'false' ); $g->set( 'colors' => { 'title' => 'red' } ); $g->set( 'legend_lines' => 'true' ); $g->png("samples/pie_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pareto_2.t0000644000175000017500000000160412033071316014256 0ustar reinerreineruse Chart::Pareto; print "1..1\n"; $g = Chart::Pareto->new( 500, 400 ); $g->add_dataset( '1st week', '2nd week', '3rd week', '4th week', '5th week', '6th week', '7th week', '8th week', '9th week', '10th week' ); $g->add_dataset( 37, 15, 9, 4, 3.5, 2.1, 1.2, 1.5, 6.2, 16 ); %hash = ( 'colors' => { 'dataset0' => 'mauve', 'dataset1' => 'light_blue', 'title' => 'orange', }, 'title' => 'Visitors at the Picasso Exhibition', 'integer_ticks_only' => 'true', 'skip_int_ticks' => 5, 'grey_background' => 'false', 'max_val' => 100, 'y_label' => 'Visitors in Thousands', 'x_ticks' => 'vertical', 'spaced_bars' => 'true', 'legend' => 'none', ); $g->set(%hash); $g->png("samples/pareto_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/mapcomp.t0000644000175000017500000000320512033071316014176 0ustar reinerreineruse strict; use Chart::Composite; my $png_name = 'samples/mapcomp.png'; my @legend_keys = ( "Actual ", "Goal" ); # my $Graph = new Chart::Composite( 600, 400 ); print "1..1\n"; # $Graph->add_dataset( "Oct 01", "Nov 01", "Dec 01", "Jan 02", "Feb 02", "Mar 02" ); $Graph->add_dataset( 95.1, 84.4, 90.2, 94.4, 93.8, 95.5 ); $Graph->add_dataset( 93.0, 83.0, 94.0, 94.0, 94.0, 94.0 ); # $Graph->set( composite_info => [ [ 'Bars', [1] ], [ 'Lines', [2] ] ], colors => { dataset0 => 'green', dataset1 => 'red' }, title_font => GD::Font->Giant, label_font => GD::Font->Small, legend_font => GD::Font->Large, tick_label_font => GD::Font->Large, grid_lines => 'true', graph_border => 0, imagemap => 'true', legend => 'bottom', legend_labels => \@legend_keys, max_val => 100, min_val => 80, png_border => 4, same_y_axes => 'true', spaced_bars => 'true', title => "Yield 2004", text_space => 5, transparent => 'true', x_ticks => 'vertical', integer_ticks_only => 'true', skip_int_ticks => 5, ); $Graph->png("$png_name"); # my $imagemap_data = $Graph->imagemap_dump(); # foreach my $ds ( 1 .. 1 ) { foreach my $pt ( 0 .. 5 ) { if ( defined( $imagemap_data->[$ds]->[$pt] ) ) { my @i = @{ $imagemap_data->[$ds]->[$pt] }; # ** print "Dataset:$ds - Point: $pt ---- VALUES: @i \n"; } } } print "ok\n"; exit 0; Chart-2.4.6/t/hbars_1.t0000644000175000017500000000247712033071315014072 0ustar reinerreiner#!/usr/bin/perl -w use Chart::HorizontalBars; print "1..1\n"; $g = Chart::HorizontalBars->new( 600, 500 ); $g->add_dataset( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ); $g->add_dataset( 14, 12, 18, 17, 15, 11, 12, 10, 14, 12, 18, 17 ); $g->add_dataset( 11, 13, 14, 15, 11, 10, 9, 8, 11, 13, 11, 12 ); $g->add_dataset( 4, 8, 7, 4, 5, 4, 6, 4, 6, 10, 7, 4 ); $g->add_dataset( 5, 7, 6, 5, 6, 6, 7, 8, 6, 9, 8, 7 ); $g->add_dataset( 5, 4, 2, 5, 3, 6, 1, 4, 5, 4, 2, 5 ); %hash = ( 'y_axes' => 'both', 'title' => 'Sold Cars in 2001', 'integer_ticks_only' => 'true', 'legend' => 'bottom', 'y_label' => 'month', 'y_label2' => 'month', 'x_label' => 'number of cars', 'legend_labels' => [ 'Berlin', 'Munich', 'Rome', 'London', 'Paris' ], 'min_val' => 0, 'max_val' => 20, 'grid_lines' => 'true', 'colors' => { 'title' => 'red', 'x_label' => 'blue', 'y_label' => 'blue', 'y_label2' => 'blue', 'dataset4' => 'yellow' }, ); $g->set(%hash); $g->png("samples/hbars_1.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/linespoints_2.t0000644000175000017500000000145112033071315015332 0ustar reinerreiner#!/usr/bin/perl -w use Chart::LinesPoints; use strict; print "1..1\n"; my ( @data, @data2, @labels, %hash, $g, $hits ); # create an array of labels for ( 0 .. 30 ) { push( @labels, $_ ); } # create two arrays of data for ( 0 .. 30 ) { #first array $hits = 2 * $_; if ( $_ % 2 == 0 ) { $hits = $_; } push( @data, $hits ); #second array $hits = 40 - $_ + 10 * cos($_); push( @data2, $hits ); } $g = Chart::LinesPoints->new( 600, 300 ); $g->add_dataset(@labels); $g->add_dataset(@data); $g->add_dataset(@data2); %hash = ( 'title' => 'Lines with Points Demo', 'y_axes' => 'both', 'legend' => 'none', 'precision' => 0, 'xy_plot' => 'true', ); $g->set(%hash); $g->png("samples/linespoints_2.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/stackedbars_4.t0000644000175000017500000000165012033071317015256 0ustar reinerreiner#!/usr/bin/perl -w use Chart::StackedBars; print "1..1\n"; $g = Chart::StackedBars->new( 600, 400 ); $g->add_dataset( '2007-10-01', '2007-10-02', '2007-10-03', '2007-10-04', '2007-10-05' ); my @dataset = ( 74, 78, 75, 83, 78 ); my @first_dataset = (); my @second_dataset = (); foreach my $dat (@dataset) { if ( $dat > 75 ) { push( @first_dataset, 75 ); push( @second_dataset, $dat - 75 ); } else { push( @first_dataset, $dat ); push( @second_dataset, 0 ); } } $g->add_dataset(@first_dataset); $g->add_dataset(@second_dataset); $g->set( 'title' => 'Stacked Bar Chart', 'legend' => 'none', 'grey_background' => 'false', 'min_val' => 70, ); $g->set( 'colors' => { 'dataset1' => [ 220, 20, 60 ], 'dataset0' => [ 0, 255, 0 ], } ); $g->png("samples/stackedbars_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/f_ticks.t0000644000175000017500000000513312033071315014165 0ustar reinerreiner#!/usr/bin/perl -w # # Testprogram for lines # converting seconds since 0 o'clock to HH:MM:SS on x # converting -1 .. +1 to -100 ... +100 on y # #====================================================================== use strict; use Chart::Points; print "1..1\n"; my @x_values = (); # x axis my @y_values = (); my $graphic; my $min_x = 600; # random start my $max_x = 86400; # number of seconds of a day my $min_y; my $max_y; my $x; my $y; #------------------------------------------------------------------------------------ # Start #------------------------------------------------------------------------------------ $x = $min_x; for ( my $x_idx = 0 ; $x < $max_x ; $x_idx++ ) { $x = $min_x + $x_idx * 23; $x_values[$x_idx] = $x; $y_values[$x_idx] = cos( ( $x - $min_x ) / 3000 ); } #------------------------------------------------------------------------------------ # Make it #------------------------------------------------------------------------------------ $graphic = Chart::Points->new( 750, 600 ); $graphic->set( 'brush_size' => 2 ); $graphic->add_dataset(@x_values); $graphic->add_dataset(@y_values); $graphic->set( 'min_val' => $min_y ); $graphic->set( 'max_val' => $max_y ); #$graphic -> set ('y_ticks' => 11 ); $graphic->set( 'skip_x_ticks' => 100 ); $graphic->set( 'pt_size' => 2 ); $graphic->set( 'grey_background' => 'true' ); $graphic->set( 'graph_border' => 18 ); $graphic->set( 'title' => "f_tick example for x and y values" ); $graphic->set( 'y_grid_lines' => 'false' ); $graphic->set( 'x_grid_lines' => 'false' ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'legend' => 'none' ); $graphic->set( 'x_label' => 'Time of the day' ); $graphic->set( 'y_label' => 'f = sin(x)' ); # use a special function to convert the x values to HH:MM:SS $graphic->set( 'f_x_tick' => \&seconds_to_hour_minute ); # use a special function to convert the y values to something special $graphic->set( 'f_y_tick' => \&formatter ); if ( $graphic->can('gif') ) { my $picture_file = "samples/f_ticks.gif"; $graphic->gif($picture_file); } if ( $graphic->can('png') ) { my $picture_file = "samples/f_ticks.png"; $graphic->png($picture_file); } print "ok 1\n"; exit(0); sub seconds_to_hour_minute { my $seconds = shift; my $hour = int( $seconds / 3600 ); my $minute = int( ( $seconds - $hour * 3600 ) / 60 ); my $sec = $seconds - $hour * 3600 - $minute * 60; sprintf "%02d:%02d:%02d", $hour, $minute, $sec; } sub formatter { my $y_value = shift; sprintf "%02d", int( $y_value * 10 ); } Chart-2.4.6/t/bars_9.t0000644000175000017500000000204512033071314013720 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Bars; use strict; use POSIX; print "1..1\n"; my $g = Chart::Bars->new( 600, 400 ); my @data = ( 200202, 200203, 200204, 200205, 200206, 200207, 200208, 200209, 200210, 200211, 200212, 200301 ); my @data1 = ( 6626, 7090, 7580, 7671, 8764, 8664, 6343, 5518, 6257, 5391, 5401, 6002 ); $g->add_dataset(@data); $g->add_dataset(@data1); my @legend_keys = ( "Actual ", "Goal" ); $g->set( colors => { dataset0 => [ 25, 220, 147 ], }, graph_border => 0, grey_background => 'false', grid_lines => 'true', include_zero => 'true', # integer_ticks_only => 'true', legend => 'none', png_border => 4, precision => 1, skip_int_ticks => 1000, text_space => 3, title => "Tickets", title_font => GD::Font->Giant, transparent => 'false', x_ticks => 'vertical', y_axes => 'both', y_label => '# Tickets', x_label => 'Date', ); $g->png("samples/bars_9.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/hbars_4.t0000644000175000017500000000100612033071315014060 0ustar reinerreiner#!usr/bin/perl -w use Chart::HorizontalBars; print "1..1\n"; $g = Chart::HorizontalBars->new(); $g->add_dataset( 'Foo', 'bar', 'junk', 'ding', 'bat' ); $g->add_dataset( 4, 3, 4, 2, 8 ); $g->add_dataset( 2, 10, 3, 8, 3 ); %hash = ( 'title' => 'Horizontal Bars Demo', 'grid_lines' => 'true', 'x_label' => 'x-axis', 'y_label' => 'y-axis', 'include_zero' => 'true', ); $g->set(%hash); $g->png("samples/hbars_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/points_4.t0000644000175000017500000000231112033071317014277 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Points; print "1..1\n"; $g = Chart::Points->new(); @hash = ( 'title' => 'Points Chart with different brushes', 'png_border' => 10, 'pt_size' => 18, 'grid_lines' => 'true', 'brush_size' => 10, # 10 points diameter # 'brushStyle' => 'FilledCircle', # 'brushStyle' => 'circle', # 'brushStyle' => 'donut', # 'brushStyle' => 'OpenCircle', # 'brushStyle' => 'fatPlus', # 'brushStyle' => 'triangle', # 'brushStyle' => 'upsidedownTriangle', # 'brushStyle' => 'square', # 'brushStyle' => 'hollowSquare', # 'brushStyle' => 'OpenRectangle', # 'brushStyle' => 'FilledDiamond', # 'brushStyle' => 'OpenDiamond', # 'brushStyle' => 'Star', 'brushStyle' => 'OpenStar', ); $g->set( colors => { dataset0 => [ 25, 220, 147 ], } ); $g->set( brushStyles => { dataset0 => 'fatPlus', dataset1 => 'hollowSquare' } ); $g->set(@hash); $g->add_dataset( 'foo', 'bar', 'junk' ); $g->add_dataset( 3, 4, 9 ); $g->add_dataset( 8, 6, 0 ); $g->add_dataset( 5, 7, 2 ); $g->png("samples/points_4.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/lines_3.t0000644000175000017500000000167712033071315014110 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Lines; use strict; my $g; print "1..1\n"; $g = Chart::Lines->new; $g->add_dataset( 'foo', 'bar', 'whee', 'ding', 'bat', 'bit' ); $g->add_dataset( 3.2, 4.34, 9.456, 10.459, 11.24234, 14.0234 ); $g->add_dataset( -1.3, 8.4, 5.34, 3.234, 4.33, 13.09 ); $g->add_dataset( 5, 7, 2, 10, 12, 2.3445 ); $g->set( 'title' => 'LINES' ); $g->set( 'sub_title' => 'Lines Chart' ); $g->set( 'colors' => { 'y_label' => [ 0, 0, 255 ], y_label2 => [ 0, 255, 0 ], 'y_grid_lines' => [ 127, 127, 0 ], 'dataset0' => [ 127, 0, 0 ], 'dataset1' => [ 0, 127, 0 ], 'dataset2' => [ 0, 0, 127 ] } ); $g->set( 'y_label' => 'y label 1' ); $g->set( 'y_label2' => 'y label 2' ); $g->set( 'y_grid_lines' => 'true' ); $g->set( 'legend' => 'right' ); $g->png("samples/lines_3.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/Humidity.t0000644000175000017500000004162312033071314014342 0ustar reinerreiner#!/usr/bin/perl -w # # Testprogram for lines # #====================================================================== use strict; use Chart::Lines; print "1..1\n"; my @messwerte = (); my @zeit = (); my $graphic; my $gif_name; my $titel_name; my $einheit; my $min_y; my $max_y; #------------------------------------------------------------------------------------ # Start #------------------------------------------------------------------------------------ $gif_name = "Humidity"; $titel_name = "Examples of Humidity"; $einheit = "% rH"; @zeit = ( '12:00', '12:01', '12:02', '12:03', '12:04', '12:05', '12:06', '12:07', '12:08', '12:09', #1 '12:10', '12:11', '12:12', '12:13', '12:14', '12:15', '12:16', '12:17', '12:18', '12:19', #2 '12:20', '12:21', '12:22', '12:23', '12:24', '12:25', '12:26', '12:27', '12:28', '12:29', #3 '12:30', '12:31', '12:32', '12:33', '12:34', '12:35', '12:36', '12:37', '12:38', '12:39', #4 '12:40', '12:41', '12:42', '12:43', '12:44', '12:45', '12:46', '12:47', '12:48', '12:49', #5 '12:50', '12:51', '12:52', '12:53', '12:54', '12:55', '12:56', '12:57', '12:58', '12:59', #6 '13:00', '13:01', '13:02', '13:03', '13:04', '13:05', '13:06', '13:07', '13:08', '13:09', #7 '13:10', '13:11', '13:12', '13:13', '13:14', '13:15', '13:16', '13:17', '13:18', '13:19', #8 '13:20', '13:21', '13:22', '13:23', '13:24', '13:25', '13:26', '13:27', '13:28', '13:29', #9 '13:30', '13:31', '13:32', '13:33', '13:34', '13:35', '13:36', '13:37', '13:38', '13:39', #10 '13:40', '13:41', '13:42', '13:43', '13:44', '13:45', '13:46', '13:47', '13:48', '13:49', #11 '13:50', '13:51', '13:52', '13:53', '13:54', '13:55', '13:56', '13:57', '13:58', '13:59', #12 '14:00', '14:01', '14:02', '14:03', '14:04', '14:05', '14:06', '14:07', '14:08', '14:09', #13 '14:10', '14:11', '14:12', '14:13', '14:14', '14:15', '14:16', '14:17', '14:18', '14:19', #14 '14:20', '14:21', '14:22', '14:23', '14:24', '14:25', '14:26', '14:27', '14:28', '14:29', #15 '14:30', '14:31', '14:32', '14:33', '14:34', '14:35', '14:36', '14:37', '14:38', '14:39', #16 '14:40', '14:41', '14:42', '14:43', '14:44', '14:45', '14:46', '14:47', '14:48', '14:49', #17 '14:50', '14:51', '14:52', '14:53', '14:54', '14:55', '14:56', '14:57', '14:58', '14:59', #18 '15:00', '15:01', '15:02', '15:03', '15:04', '15:05', '15:06', '15:07', '15:08', '15:09', #19 '15:10', '15:11', '15:12', '15:13', '15:14', '15:15', '15:16', '15:17', '15:18', '15:19', #20 '15:20', '15:21', '15:22', '15:23', '15:24', '15:25', '15:26', '15:27', '15:28', '15:29', #21 '15:30', '15:31', '15:32', '15:33', '15:34', '15:35', '15:36', '15:37', '15:38', '15:39', #22 '15:40', '15:41', '15:42', '15:43', '15:44', '15:45', '15:46', '15:47', '15:48', '15:49', #23 '15:50', '15:51', '15:52', '15:53', '15:54', '15:55', '15:56', '15:57', '15:58', '15:59', #24 '16:00', '16:01', '16:02', '16:03', '16:04', '16:05', '16:06', '16:07', '16:08', '16:09', #25 '16:10', '16:11', '16:12', '16:13', '16:14', '16:15', '16:16', '16:17', '16:18', '16:19', #26 '16:20', '16:21', '16:22', '16:23', '16:24', '16:25', '16:26', '16:27', '16:28', '16:29', #27 '16:30', '16:31', '16:32', '16:33', '16:34', '16:35', '16:36', '16:37', '16:38', '16:39', #28 '16:40', '16:41', '16:42', '16:43', '16:44', '16:45', '16:46', '16:47', '16:48', '16:49', #29 '16:50', '16:51', '16:52', '16:53', '16:54', '16:55', '16:56', '16:57', '16:58', '16:59', #30 '17:00', '17:01', '17:02', '17:03', '17:04', '17:05', '17:06', '17:07', '17:08', '17:09', #31 '17:10', '17:11', '17:12', '17:13', '17:14', '17:15', '17:16', '17:17', '17:18', '17:19', #32 '17:20', '17:21', '17:22', '17:23', '17:24', '17:25', '17:26', '17:27', '17:28', '17:29', #33 '17:30', '17:31', '17:32', '17:33', '17:34', '17:35', '17:36', '17:37', '17:38', '17:39', #34 '17:40', '17:41', '17:42', '17:43', '17:44', '17:45', '17:46', '17:47', '17:48', '17:49', #35 '17:50', '17:51', '17:52', '17:53', '17:54', '17:55', '17:56', '17:57', '17:58', '17:59', #36 '18:00', '18:01', '18:02', '18:03', '18:04', '18:05', '18:06', '18:07', '18:08', '18:09', #37 '18:10', '18:11', '18:12', '18:13', '18:14', '18:15', '18:16', '18:17', '18:18', '18:19', #38 '18:20', '18:21', '18:22', '18:23', '18:24', '18:25', '18:26', '18:27', '18:28', '18:29', #39 '18:30', '18:31', '18:32', '18:33', '18:34', '18:35', '18:36', '18:37', '18:38', '18:39', #40 '18:41', '18:42', '18:43', '18:44', '18:45', '18:46', '18:47', '18:48', '18:49', '18:50', #41 '18:51', '18:52', '18:53', '18:54', '18:55', '18:56', '18:57', '18:58', '18:59', '19:00', #42 '19:01', '19:02', '19:03', '19:04', '19:05', '19:06', '19:07', '19:08', '19:09', '19:10', #43 '19:11', '19:12', '19:13', '19:14', '19:15', '19:16', '19:17', '19:18', '19:19', '19:20', #44 '19:21', '19:22', '19:23', '19:24', '19:25', '19:26', '19:27', '19:28', '19:29', '19:30', #45 '19:31', '19:32', '19:33', '19:34', '19:35', '19:36', '19:37', '19:38', '19:39', '19:40', #46 '19:41', '19:42', '19:43', '19:44', '19:45', '19:46', '19:47', '19:48', '19:49', '19:50', #47 '19:51', '19:52', '19:53', '19:54', '19:55', '19:56', '19:57', '19:58', '19:59', '20:00', #48 '20:01', '20:02', '20:03', '20:04', '20:05', '20:06', '20:07', '20:08', '20:09', '20:10', #49 '20:11', '20:12', '20:13', '20:14', '20:15', '20:16', '20:17', '20:18', '20:19', '20:20', #50 '20:21', '20:22', '20:23', '20:24', '20:25', '20:26', '20:27', '20:28', '20:29', '20:30', #51 '20:31', '20:32', '20:33', '20:34', '20:35', '20:36', '20:37', '20:38', '20:39', '20:40', #52 '20:41', '20:42', '20:43', '20:44', '20:45', '20:46', '20:47', '20:48', '20:49', '20:50', #53 '20:51', '20:52', '20:53', '20:54', '20:55', '20:56', '20:57', '20:58', '20:59', '21:00', #54 '21:01', '21:02', '21:03', '21:04', '21:05', '21:06', '21:07', '21:08', '21:09', '21:10', #55 '21:11', '21:12', '21:13', '21:14', '21:15', '21:16', '21:17', '21:18', '21:19', '21:20', #56 '21:21', '21:22', '21:23', '21:24', '21:25', '21:26', '21:27', '21:28', '21:29', '21:30', #57 '21:31', '21:32', '21:33', '21:34', '21:35', '21:36', '21:37', '21:38', '21:39', '21:40', #58 '21:41', '21:42', '21:43', '21:44', '21:45', '21:46', '21:47', '21:48', '21:49', '21:50', #59 '21:51', '21:52', '21:53', '21:54', '21:55', '21:56', '21:57', '21:58', '21:59', '22:00', #60 '22:01', '22:02', '22:03', '22:04', '22:05', '22:06', '22:07', '22:08', '22:09', '22:10', #61 '22:11', '22:12', '22:13', '22:14', '22:15', '22:16', '22:17', '22:18', '22:19', '22:20', #62 '22:21', '22:22', '22:23', '22:24', '22:25', '22:26', '22:27', '22:28', '22:29', '22:30', #63 '22:31', '22:32', '22:33', '22:34', '22:35', '22:36', '22:37', '22:38', '22:39', '22:40', #64 '22:41', '22:42', '22:43', '22:44', '22:45', '22:46', '22:47', '22:48', '22:49', '22:50', #65 '22:51', '22:52', '22:53', '22:54', '22:55', '22:56', '22:57', '22:58', '22:59', '23:00', #66 '23:01', '23:02', '23:03', '23:04', '23:05', '23:06', '23:07', '23:08', '23:09', '23:10', #67 '23:11', '23:12', '23:13', '23:14', '23:15', '23:16', '23:17', '23:18', '23:19', '23:20', #68 '23:21', '23:22', '23:23', '23:24', '23:25', '23:26', '23:27', '23:28', '23:29', '23:30', #69 '23:31', '23:32', '23:33', '23:34', '23:35', '23:36', '23:37', '23:38', '23:39', '23:40', #70 '23:41', '23:42', '23:43', '23:44', '23:45', '23:46', '23:47', '23:48', '23:49', '23:50', #71 '23:51', '23:52', '23:53', '23:54', '23:55', '23:56', '23:57', '23:58', '23:59' ); #72 @messwerte = ( 36.3, 36.2, 36.2, 36.3, 36.4, 36.4, 36.3, 36.4, 36.4, 36.3, #1 36.1, 36.3, 36.2, 36.3, 36.4, 36.3, 36.3, 36.1, 36.2, 36.2, #2 36.3, 36.2, 36.2, 36.2, 36.1, 36.3, 36.3, 36.2, 36.2, 36.2, #3 36.2, 36.1, 36.5, 36.4, 36.3, 36.2, 36.2, 36.3, 36.4, 36.4, #4 36.3, 36.3, 36.3, 36.4, 36.5, 36.4, 36.4, 36.5, 36.5, 36.5, #5 36.3, 36.4, 36.3, 36.2, 36.2, 36.3, 36.2, 36.3, 36.4, 36.2, #6 36.2, 36.4, 36.3, 36.2, 36.4, 36.4, 36.4, 36.2, 36.4, 36.3, #7 36.3, 36.4, 36.4, 36.5, 36.3, 36.5, 36.5, 36.4, 36.5, 36.4, #8 36.5, 36.3, 36.4, 36.4, 36.4, 36.4, 36.5, 36.5, 36.3, 36.3, #9 36.3, 36.4, 36.4, 36.3, 36.3, 36.2, 36.3, 36.3, 36.2, 36.2, #10 36.2, 36.2, 36.2, 36.2, 36.3, 36.3, 36.2, 36.2, 36.2, 36.3, #11 36.1, 36.2, 36.2, 36.2, 36.2, 36.4, 36.2, 36.1, 36.2, 36.2, #12 36.3, 36.2, 36.3, 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, #13 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, 36.3, 36.2, 36.2, #14 36.3, 36.2, 36.3, 36.2, 36.3, 36.1, 36.2, 36.2, 36.2, 36.2, #15 36.2, 36.2, 36.2, 36.2, 36.2, 36.3, 36.2, 36.2, 36.2, 36.2, #16 36.2, 36.2, 36.3, 36.2, 36.3, 36.2, 36.3, 36.2, 36.2, 36.2, #17 36.2, 36.2, 36.2, 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, #18 36.3, 36.1, 36.2, 36.2, 36.3, 36.2, 36.3, 36.3, 36.2, 36.2, #19 36.2, 36.3, 36.2, 36.3, 36.2, 36.2, 36.2, 36.3, 36.2, 36.2, #20 36.2, 36.2, 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, 36.2, #21 36.1, 36.2, 36.2, 36.2, 36.3, 36.2, 36.2, 36.1, 36.2, 36.2, #22 36.2, 36.2, 36.2, 36.2, 36.1, 36.3, 36.2, 36.3, 36.2, 36.3, #23 36.2, 36.2, 36.3, 36.2, 36.2, 36.3, 36.2, 36.2, 36.2, 36.2, #24 36.2, 36.2, 36.2, 36.2, 36.1, 36.2, 36.36, 36.36, 36.2, 36.1, #25 36.2, 36.2, 36.2, 36.3, 36.2, 36.3, 36.2, 36.3, 36.1, 36.1, #26 36.2, 36.2, 36.2, 36.1, 36.2, 36.2, 36.1, 36.1, 36.2, 36.2, #27 36.2, 36.2, 36.2, 36.2, 36.1, 36.1, 36.0, 36.2, 36.2, 36.2, #28 36.2, 36.2, 36.2, 36.1, 36.1, 36.1, 36.1, 36.1, 36.2, 36.2, #29 36.1, 36.2, 36.1, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, 36.2, #30 36.2, 36.2, 36.3, 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, #31 36.2, 36.3, 36.3, 36.2, 36.1, 36.2, 36.2, 36.2, 36.1, 36.3, #32 36.3, 36.2, 36.3, 36.2, 36.2, 36.4, 36.3, 36.3, 36.2, 36.1, #33 36.1, 36.1, 36.1, 36.1, 36.1, 36.0, 36.1, 36.2, 36.1, 36.1, #34 36.1, 35.9, 36.2, 36.3, 36.5, 36.5, 36.5, 36.4, 36.1, 36.3, #35 36.4, 36.1, 36.2, 36.4, 36.0, 36.2, 36.1, 36.0, 36.1, 36.1, #36 36.2, 36.3, 36.4, 36.4, 36.5, 36.5, 36.5, 36.3, 36.0, 36.2, #37 36.4, 36.4, 36.3, 36.4, 36.2, 36.3, 36.2, 36.3, 36.4, 36.2, #38 36.4, 36.5, 36.4, 36.2, 36.2, 36.3, 36.1, 36.1, 36.3, 36.2, #39 36.3, 36.3, 36.2, 36.2, 36.3, 36.4, 36.3, 36.3, 36.3, 36.4, #40 36.3, 36.2, 36.3, 36.3, 36.3, 36.4, 36.3, 36.2, 36.1, 36.2, #41 36.2, 36.1, 36.2, 36.1, 36.1, 36.2, 36.2, 36.1, 36.0, 36.1, #42 36.1, 36.2, 36.2, 36.1, 36.2, 36.1, 36.1, 36.1, 36.1, 36.2, #43 36.1, 36.1, 36.2, 36.0, 36.0, 36.1, 36.1, 35.9, 35.9, 35.8, #44 36.1, 36.2, 36.2, 36.2, 36.1, 36.1, 35.9, 35.9, 35.9, 36.1, #45 36.1, 35.9, 36.1, 36.2, 36.1, 36.1, 36.1, 36.1, 36.0, 36.1, #46 36.2, 36.2, 36.1, 36.2, 36.0, 36.0, 35.9, 36.0, 36.0, 36.1, #47 36.2, 36.0, 36.0, 36.0, 36.1, 36.0, 36.0, 35.9, 36.0, 35.8, #48 35.9, 35.9, 35.9, 35.9, 35.8, 35.9, 35.7, 35.9, 35.9, 35.8, #49 35.9, 35.9, 35.7, 35.8, 36.0, 36.1, 36.2, 36.2, 36.0, 36.1, #50 36.2, 36.1, 36.2, 36.2, 36.1, 36.1, 36.0, 36.0, 35.9, 36.0, #51 36.2, 36.1, 36.1, 36.2, 36.2, 36.1, 36.1, 36.3, 36.2, 36.2, #52 36.1, 36.1, 36.1, 36.1, 36.1, 36.3, 36.4, 36.3, 36.2, 36.3, #53 36.2, 36.2, 36.2, 36.3, 36.3, 36.3, 36.2, 36.3, 36.3, 36.4, #54 36.3, 36.3, 36.4, 36.3, 36.3, 36.4, 36.4, 36.4, 36.4, 36.4, #55 36.3, 36.3, 36.4, 36.3, 36.3, 36.2, 36.3, 36.1, 36.1, 36.1, #56 36.2, 36.2, 36.2, 36.1, 36.1, 36.2, 36.2, 36.1, 36.2, 36.2, #57 36.2, 36.2, 36.2, 36.1, 36.1, 36.2, 36.1, 36.2, 36.2, 36.2, #58 36.1, 36.2, 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, 36.2, #59 36.1, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, 36.1, 36.2, 36.2, #60 36.2, 36.2, 36.1, 36.2, 36.1, 36.1, 36.2, 36.2, 36.2, 36.2, #61 36.3, 36.1, 36.2, 36.2, 36.2, 36.3, 36.2, 36.2, 36.1, 36.2, #62 36.3, 36.2, 36.3, 36.3, 36.3, 36.3, 36.3, 36.5, 36.3, 36.4, #63 36.3, 36.3, 36.3, 36.2, 36.3, 36.3, 36.3, 36.3, 36.3, 36.2, #64 36.2, 36.2, 36.2, 36.2, 36.2, 36.2, 36.2, 36.1, 36.1, 36.2, #65 36.2, 36.2, 36.2, 36.2, 36.1, 36.1, 36.2, 36.1, 36.1, 36.1, #66 36.2, 36.1, 36.2, 36.2, 36.2, 36.5, 36.3, 36.2, 36.3, 36.4, #67 36.4, 36.4, 36.4, 36.4, 36.3, 36.3, 36.4, 36.4, 36.4, 36.4, #68 36.4, 36.4, 36.3, 36.4, 36.4, 36.4, 36.3, 36.4, 36.3, 36.2, #69 36.2, 36.2, 36.3, 36.1, 36.2, 36.1, 36.1, 36.1, 36.1, 36.2, #70 36.1, 36.2, 36.1, 36.1, 36.1, 36.1, 36.1, 36.1, 36.2, 36.2, #71 36.2, 36.1, 36.2, 36.2, 36.2, 36.2, 36.2, 36.2, 36.2 ); #72 #------------------------------------------------------------------------------------ # Zeitarray aufbauen , Minimal- und Maximalwert bestimmen und X - Achse berechnen #------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------ # Graphic_objekt erstellen #------------------------------------------------------------------------------------ $min_y = $max_y = $messwerte[0]; foreach (@messwerte) { if ( $_ < $min_y ) { $min_y = $_; } if ( $_ > $max_y ) { $max_y = $_; } } $min_y = int($min_y) - 1; $max_y = int($max_y) + 1; $graphic = Chart::Lines->new( 750, 400 ); $graphic->set( 'brush_size' => 2 ); $graphic->add_dataset(@zeit); $graphic->add_dataset(@messwerte); #------------------------------------------------------------------------------------ # Diagramm Y-Achse berechnen #------------------------------------------------------------------------------------ $graphic->set( 'min_val' => $min_y ); $graphic->set( 'max_val' => $max_y ); #$graphic -> set ('y_ticks' => 11 ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'skip_x_ticks' => 30 ); $graphic->set( 'grey_background' => 'false' ); $graphic->set( 'graph_border' => 18 ); $graphic->set( 'title' => $titel_name ); $graphic->set( 'sub_title' => "over Time" ); $graphic->set( 'y_grid_lines' => 'true' ); $graphic->set( 'x_grid_lines' => 'true' ); $graphic->set( 'x_ticks' => 'vertical' ); $graphic->set( 'colors' => { 'y_grid_lines' => [ 127, 127, 0 ], 'x_grid_lines' => [ 127, 127, 0 ], 'dataset0' => [ 0, 0, 200 ] } ); $graphic->set( 'legend' => 'none' ); $graphic->set( 'x_label' => 'Time (UTC)' ); $graphic->set( 'y_label' => $einheit ); if ( $graphic->can('gif') ) { my $wettgif = "samples/" . $gif_name . ".gif"; $graphic->gif($wettgif); } elsif ( $graphic->can('png') ) { my $wettgif = "samples/" . $gif_name . ".png"; $graphic->png($wettgif); } print "ok 1\n"; exit(0); Chart-2.4.6/t/mountain.t0000644000175000017500000000311412033071316014373 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Mountain; use File::Spec; print "1..2\n"; my @data = ( [ "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th" ], [ 3, 7, 8, 2, 4, 8.5, 2, 5, 9 ], [ 4, 2, 5, 6, 3, 2.5, 3, 3, 4 ], [ 7, 3, 2, 8, 8.5, 2, 9, 4, 5 ], ); my @hex_colors = qw(0099FF 00CC00 FFCC33 FF0099 3333FF); my @colors = map { [ map { hex($_) } unpack( "a2 a2 a2", $_ ) ] } @hex_colors; my @patterns = (); foreach ( 1 .. @data - 1 ) { open( PNG, '<' . File::Spec->catfile( File::Spec->curdir, 'patterns', "PATTERN$_.PNG" ) ) || die "Can't load pattern $_"; push( @patterns, GD::Image->newFromPng( \*PNG ) ); close(PNG); } my @opts = ( {}, { 'x_label' => 'X Label', 'y_label' => 'Y label', 'title' => 'Mountain Chart', 'grid_lines' => 'true', 'colors' => { map { ( "dataset$_" => $colors[$_] ) } 0 .. @colors - 1 }, }, { 'x_label' => 'X Label', 'y_label' => 'Y label', 'title' => 'Mountain Chart with Patterns', 'grid_lines' => 'true', 'colors' => { map { ( "dataset$_" => $colors[$_] ) } 0 .. @colors - 1 }, 'patterns' => \@patterns, }, ); foreach my $i ( 1 .. @opts - 1 ) { my $newpath = File::Spec->catfile( File::Spec->curdir, 'samples', "mountain-$i.png" ); my $opts = $opts[$i]; my $g = new Chart::Mountain(); $g->set(%$opts); my $Image = $g->png( $newpath, \@data ); print "ok $i\n"; } exit(0); Chart-2.4.6/t/points_5.t0000644000175000017500000000437212033071317014311 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Points; print "1..1\n"; $g = Chart::Points->new(); @hash = ( 'title' => 'Points Chart with different brushes', 'png_border' => 10, 'pt_size' => 20, 'grid_lines' => 'false', 'brush_size' => 18, # 10 points diameter # 'brushStyle' => 'FilledCircle', # 'brushStyle' => 'circle', # 'brushStyle' => 'donut', # 'brushStyle' => 'OpenCircle', # 'brushStyle' => 'fatPlus', # 'brushStyle' => 'triangle', # 'brushStyle' => 'upsidedownTriangle', # 'brushStyle' => 'square', # 'brushStyle' => 'hollowSquare', # 'brushStyle' => 'OpenRectangle', # 'brushStyle' => 'FilledDiamond', # 'brushStyle' => 'OpenDiamond', # 'brushStyle' => 'Star', 'brushStyle' => 'OpenStar', ); my @labels = ( 'FilledCircle', 'circle', 'donut', 'OpenCircle', 'fatPlus', 'triangle', 'upsidedownTriangle', 'square', 'hollowSquare', 'OpenRectangle', 'FilledDiamond', 'OpenDiamond', 'Star', 'OpenStar' ); $g->set( brushStyles => { dataset0 => 'FilledCircle', dataset1 => 'circle', dataset2 => 'donut', dataset3 => 'OpenCircle', dataset4 => 'fatPlus', dataset5 => 'triangle', dataset6 => 'upsidedownTriangle', dataset7 => 'square', dataset8 => 'hollowSquare', dataset9 => 'OpenRectangle', dataset10 => 'FilledDiamond', dataset11 => 'OpenDiamond', dataset12 => 'Star', dataset13 => 'OpenStar', } ); $g->set(@hash); $g->add_dataset( 'foo', 'bar', 'junk' ); $g->add_dataset( 1, 1, 1 ); $g->add_dataset( 2, 2, 2 ); $g->add_dataset( 3, 3, 3 ); $g->add_dataset( 4, 4, 4 ); $g->add_dataset( 5, 5, 5 ); $g->add_dataset( 6, 6, 6 ); $g->add_dataset( 7, 7, 7 ); $g->add_dataset( 8, 8, 8 ); $g->add_dataset( 9, 9, 9 ); $g->add_dataset( 10, 10, 10 ); $g->add_dataset( 11, 11, 11 ); $g->add_dataset( 12, 12, 12 ); $g->add_dataset( 13, 13, 13 ); $g->add_dataset( 14, 14, 14 ); $g->set( 'legend_labels' => \@labels ); $g->png("samples/points_5.png"); print "ok 1\n"; exit(0); Chart-2.4.6/t/pie_3.t0000644000175000017500000000160412033071316013542 0ustar reinerreiner#!/usr/bin/perl -w use Chart::Pie; print "1..1\n"; $g = Chart::Pie->new( 500, 500 ); $g->add_dataset( 'Har', 'Sug', 'Ert', 'Her', 'Tar', 'Kure' ); $g->add_dataset( 12000, 20000, 13000, 15000, 9000, 11000 ); %opt = ( 'title' => 'Another Pie Demo Chart', 'label_values' => 'both', 'legend' => 'none', 'text_space' => 10, 'png_border' => 1, 'graph_border' => 0, 'colors' => { 'x_label' => 'red', 'misc' => 'plum', 'background' => 'grey', 'dataset0' => [ 120, 0, 255 ], 'dataset1' => [ 120, 100, 255 ], 'dataset2' => [ 120, 200, 255 ], 'dataset3' => [ 255, 100, 0 ], 'dataset4' => [ 255, 50, 0 ], 'dataset5' => [ 255, 0, 0 ], }, 'x_label' => 'The Winner is Team Blue!', ); $g->set(%opt); $g->png("samples/pie_3.png"); print "ok 1\n"; exit(0);